]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Render.pm
* Generalised preprocesser loop protection code.
[ikiwiki.git] / IkiWiki / Render.pm
index b4b95e8d4897562b695fe7d5bac5029e1e311fc3..8e998e8b2fdfd248ef118fdcf3b3cf0e8262891b 100644 (file)
@@ -84,11 +84,11 @@ sub parentlinks ($) { #{{{
        return @ret;
 } #}}}
 
-sub preprocess ($$$;$) { #{{{
+my @preprocessing;
+sub preprocess ($$$) { #{{{
        my $page=shift; # the page the data comes from
        my $destpage=shift; # the page the data will appear in (different for inline)
        my $content=shift;
-       my $onlystrip=shift || 0; # strip directives without processing
 
        my $handle=sub {
                my $escape=shift;
@@ -97,33 +97,53 @@ sub preprocess ($$$;$) { #{{{
                if (length $escape) {
                        return "[[$command $params]]";
                }
-               elsif ($onlystrip) {
-                       return "";
+               elsif (grep { $_ eq $page } @preprocessing) {
+                       # Avoid loops of preprocessed pages preprocessing
+                       # other pages that preprocess them, etc.
+                       return "[[$command would cause preprocessing loop]]";
                }
                elsif (exists $hooks{preprocess}{$command}) {
                        # Note: preserve order of params, some plugins may
                        # consider it significant.
                        my @params;
-                       while ($params =~ /(?:(\w+)=)?(?:"([^"]+)"|(\S+))(?:\s+|$)/g) {
-                               if (defined $1) {
-                                       push @params, $1, (defined $2 ? $2 : $3);
+                       while ($params =~ /(?:(\w+)=)?(?:"""(.*?)"""|"([^"]+)"|(\S+))(?:\s+|$)/sg) {
+                               my $key=$1;
+                               my $val;
+                               if (defined $2) {
+                                       $val=$2;
+                                       $val=~s/\r\n/\n/mg;
+                                       $val=~s/^\n+//g;
+                                       $val=~s/\n+$//g;
+                               }
+                               elsif (defined $3) {
+                                       $val=$3;
+                               }
+                               elsif (defined $4) {
+                                       $val=$4;
+                               }
+
+                               if (defined $key) {
+                                       push @params, $key, $val;
                                }
                                else {
-                                       push @params, (defined $2 ? $2 : $3), '';
+                                       push @params, $val, '';
                                }
                        }
-                       return $hooks{preprocess}{$command}{call}->(
+                       push @preprocessing, $page;
+                       my $ret=$hooks{preprocess}{$command}{call}->(
                                @params,
                                page => $page,
                                destpage => $destpage,
                        );
+                       pop @preprocessing;
+                       return $ret;
                }
                else {
                        return "[[$command not processed]]";
                }
        };
        
-       $content =~ s{(\\?)$config{wiki_processor_regexp}}{$handle->($1, $2, $3)}eg;
+       $content =~ s{(\\?)\[\[(\w+)\s+((?:(?:\w+=)?(?:""".*?"""|"[^"]+"|[^\s\]]+)\s*)*)\]\]}{$handle->($1, $2, $3)}seg;
        return $content;
 } #}}}
 
@@ -180,7 +200,7 @@ sub genpage ($$$) { #{{{
                content => $content,
                backlinks => [backlinks($page)],
                mtime => displaytime($mtime),
-               styleurl => styleurl($page),
+               baseurl => baseurl($page),
        );
 
        run_hooks(pagetemplate => sub {
@@ -266,8 +286,8 @@ sub render ($) { #{{{
                
                $links{$page}=[findlinks($page, $content)];
                
-               $content=linkify($page, $page, $content);
                $content=preprocess($page, $page, $content);
+               $content=linkify($page, $page, $content);
                $content=htmlize($type, $content);
                
                check_overwrite("$config{destdir}/".htmlpage($page), $page);