X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/cddc335b2bd98a302b261200c12d61b05476d727..a2463a812bf33bb22114a5fa1b12519e33fa01b0:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 016c664b5..bd804269d 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -37,21 +37,6 @@ sub defaultconfig () { #{{{ qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//, qr/(^|\/)_MTN\//, qr/\.dpkg-tmp$/], - wiki_link_regexp => qr{ - \[\[ # beginning of link - (?: - ([^\]\|\n\s]+) # 1: link text - \| # followed by '|' - )? # optional - - ([^\s\]#]+) # 2: page to link to - (?: - \# # '#', beginning of anchor - ([^\s\]]+) # 3: anchor text - )? # optional - - \]\] # end of link - }x, wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/, web_commit_regexp => qr/^web commit (by (.*?(?=: |$))|from (\d+\.\d+\.\d+\.\d+)):?(.*)/, verbose => 0, @@ -68,6 +53,8 @@ sub defaultconfig () { #{{{ diffurl => '', rss => 0, atom => 0, + allowrss => 0, + allowatom => 0, discussion => 1, rebuild => 0, refresh => 0, @@ -87,8 +74,8 @@ sub defaultconfig () { #{{{ setup => undef, adminuser => undef, adminemail => undef, - plugin => [qw{mdwn inline htmlscrubber passwordauth openid signinedit - lockedit conditional recentchanges}], + plugin => [qw{mdwn link inline htmlscrubber passwordauth openid + signinedit lockedit conditional recentchanges}], libdir => undef, timeformat => '%c', locale => undef, @@ -98,6 +85,7 @@ sub defaultconfig () { #{{{ usedirs => 1, numbacklinks => 10, account_creation_password => "", + prefix_directives => 0, } #}}} sub checkconfig () { #{{{ @@ -613,33 +601,10 @@ sub htmllink ($$$;@) { #{{{ return "$linktext"; } #}}} -sub openiduser ($) { #{{{ - my $user=shift; - - if ($user =~ m!^https?://! && - eval q{use Net::OpenID::VerifiedIdentity; 1} && !$@) { - my $oid=Net::OpenID::VerifiedIdentity->new(identity => $user); - my $display=$oid->display; - # Convert "user.somehost.com" to "user [somehost.com]". - if ($display !~ /\[/) { - $display=~s/^(.*?)\.([^.]+\.[a-z]+)$/$1 [$2]/; - } - # Convert "http://somehost.com/user" to "user [somehost.com]". - if ($display !~ /\[/) { - $display=~s/^https?:\/\/(.+)\/([^\/]+)$/$2 [$1]/; - } - $display=~s!^https?://!!; # make sure this is removed - eval q{use CGI 'escapeHTML'}; - error($@) if $@; - return escapeHTML($display); - } - return; -} - sub userlink ($) { #{{{ my $user=shift; - my $oiduser=openiduser($user); + my $oiduser=eval { openiduser($user) }; if (defined $oiduser) { return "$oiduser"; } @@ -686,21 +651,17 @@ sub htmlize ($$$) { #{{{ } #}}} sub linkify ($$$) { #{{{ - my $lpage=shift; # the page containing the links - my $page=shift; # the page the link will end up on (different for inline) + my $page=shift; + my $destpage=shift; my $content=shift; - $content =~ s{(\\?)$config{wiki_link_regexp}}{ - defined $2 - ? ( $1 - ? "[[$2|$3".($4 ? "#$4" : "")."]]" - : htmllink($lpage, $page, linkpage($3), - anchor => $4, linktext => pagetitle($2))) - : ( $1 - ? "[[$3".($4 ? "#$4" : "")."]]" - : htmllink($lpage, $page, linkpage($3), - anchor => $4)) - }eg; + run_hooks(linkify => sub { + $content=shift->( + page => $page, + destpage => $destpage, + content => $content, + ); + }); return $content; } #}}} @@ -720,10 +681,11 @@ sub preprocess ($$$;$$) { #{{{ my $handle=sub { my $escape=shift; + my $prefix=shift; my $command=shift; my $params=shift; if (length $escape) { - return "[[$command $params]]"; + return "[[$prefix$command $params]]"; } elsif (exists $hooks{preprocess}{$command}) { return "" if $scan && ! $hooks{preprocess}{$command}{scan}; @@ -797,31 +759,58 @@ sub preprocess ($$$;$$) { #{{{ return $ret; } else { - return "[[$command $params]]"; + return "[[$prefix$command $params]]"; } }; - $content =~ s{ - (\\?) # 1: escape? - \[\[ # directive open - ([-\w]+) # 2: command - \s+ - ( # 3: the parameters.. - (?: - (?:[-\w]+=)? # named parameter key? + my $regex; + if ($config{prefix_directives}) { + $regex = qr{ + (\\?) # 1: escape? + \[\[(!) # directive open; 2: prefix + ([-\w]+) # 3: command + ( # 4: the parameters.. + \s+ # Must have space if parameters present (?: - """.*?""" # triple-quoted value - | - "[^"]+" # single-quoted value - | - [^\s\]]+ # unquoted value + (?:[-\w]+=)? # named parameter key? + (?: + """.*?""" # triple-quoted value + | + "[^"]+" # single-quoted value + | + [^\s\]]+ # unquoted value + ) + \s* # whitespace or end + # of directive ) - \s* # whitespace or end - # of directive - ) - *) # 0 or more parameters - \]\] # directive closed - }{$handle->($1, $2, $3)}sexg; + *)? # 0 or more parameters + \]\] # directive closed + }sx; + } else { + $regex = qr{ + (\\?) # 1: escape? + \[\[(!?) # directive open; 2: optional prefix + ([-\w]+) # 3: command + \s+ + ( # 4: the parameters.. + (?: + (?:[-\w]+=)? # named parameter key? + (?: + """.*?""" # triple-quoted value + | + "[^"]+" # single-quoted value + | + [^\s\]]+ # unquoted value + ) + \s* # whitespace or end + # of directive + ) + *) # 0 or more parameters + \]\] # directive closed + }sx; + } + + $content =~ s{$regex}{$handle->($1, $2, $3, $4)}eg; return $content; } #}}} @@ -907,7 +896,7 @@ sub loadindex () { #{{{ %oldrenderedfiles=%pagectime=(); if (! $config{rebuild}) { %pagesources=%pagemtime=%oldlinks=%links=%depends= - %destsources=%renderedfiles=%pagecase=(); + %destsources=%renderedfiles=%pagecase=%pagestate=(); } open (my $in, "<", "$config{wikistatedir}/index") || return; while (<$in>) { @@ -973,7 +962,7 @@ sub saveindex () { #{{{ if (exists $pagestate{$page}) { foreach my $id (@hookids) { foreach my $key (keys %{$pagestate{$page}{$id}}) { - $line.=' '.$id.'_'.encode_entities($key)."=".encode_entities($pagestate{$page}{$id}{$key}, " \t\n"); + $line.=' '.$id.'_'.encode_entities($key, " \t\n")."=".encode_entities($pagestate{$page}{$id}{$key}, " \t\n"); } } } @@ -1117,6 +1106,8 @@ sub add_depends ($$) { #{{{ my $page=shift; my $pagespec=shift; + return unless pagespec_valid($pagespec); + if (! exists $depends{$page}) { $depends{$page}=$pagespec; } @@ -1245,6 +1236,17 @@ sub pagespec_match ($$;@) { #{{{ return $ret; } #}}} +sub pagespec_valid ($) { #{{{ + my $spec=shift; + + # used by generated code + my $page=""; + my @params; + + eval pagespec_translate($spec); + return ! $@; +} #}}} + package IkiWiki::FailReason; use overload ( #{{{