]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/inline.pm
inline: Use caching of inlined pages to speed up builds of inlines that include feeds.
[ikiwiki.git] / IkiWiki / Plugin / inline.pm
index 553fd350c15dd173305d52da5e9b9c2e85be332a..29729a4147412a3a6d423d0403e6b21f9f80f1b1 100644 (file)
@@ -159,7 +159,7 @@ sub preprocess_inline (@) {
        my $rss=(($config{rss} || $config{allowrss}) && exists $params{rss}) ? yesno($params{rss}) : $config{rss};
        my $atom=(($config{atom} || $config{allowatom}) && exists $params{atom}) ? yesno($params{atom}) : $config{atom};
        my $quick=exists $params{quick} ? yesno($params{quick}) : 0;
-       my $feeds=exists $params{feeds} ? yesno($params{feeds}) : !$quick;
+       my $feeds=! $nested && (exists $params{feeds} ? yesno($params{feeds}) : !$quick);
        my $emptyfeeds=exists $params{emptyfeeds} ? yesno($params{emptyfeeds}) : 1;
        my $feedonly=yesno($params{feedonly});
        if (! exists $params{show} && ! $archive) {
@@ -212,7 +212,7 @@ sub preprocess_inline (@) {
                if ($params{feedshow} && $num < $params{feedshow}) {
                        $num=$params{feedshow};
                }
-               if ($params{skip}) {
+               if ($params{skip} && $num) {
                        $num+=$params{skip};
                }
 
@@ -221,7 +221,7 @@ sub preprocess_inline (@) {
                        filter => sub { $_[0] eq $params{page} },
                        sort => exists $params{sort} ? $params{sort} : "age",
                        reverse => yesno($params{reverse}),
-                       num => $num,
+                       ($num ? (num => $num) : ()),
                );
        }
 
@@ -332,13 +332,13 @@ sub preprocess_inline (@) {
                        error sprintf(gettext("nonexistant template %s"), $params{template});
                }
                my $template=HTML::Template->new(@params) unless $raw;
+               my $needcontent=$raw || (!($archive && $quick) && $template->query(name => 'content'));
        
                foreach my $page (@list) {
                        my $file = $pagesources{$page};
                        my $type = pagetype($file);
-                       if (! $raw || ($raw && ! defined $type)) {
-                               if (!($archive && $quick) &&
-                                   $template->query(name => 'content')) {
+                       if (! $raw) {
+                               if ($needcontent) {
                                        # Get the content before populating the
                                        # template, since getting the content uses
                                        # the same template if inlines are nested.
@@ -391,6 +391,10 @@ sub preprocess_inline (@) {
                                              filter($page, $params{destpage},
                                              readfile(srcfile($file)))));
                                }
+                               else {
+                                       $ret.="\n".
+                                             readfile(srcfile($file));
+                               }
                        }
                }
        }
@@ -419,6 +423,8 @@ sub preprocess_inline (@) {
                }
        }
        
+       clear_inline_content_cache();
+
        return $ret if $raw || $nested;
        push @inline, $ret;
        return "<div class=\"inline\" id=\"$#inline\"></div>\n\n";
@@ -433,25 +439,42 @@ sub pagetemplate_inline (@) {
                if exists $feedlinks{$page} && $template->query(name => "feedlinks");
 }
 
+{
+my %inline_content;
+my $cached_destpage="";
+
 sub get_inline_content ($$) {
        my $page=shift;
        my $destpage=shift;
        
+       if (exists $inline_content{$page} && $cached_destpage eq $destpage) {
+               return $inline_content{$page};
+       }
+
        my $file=$pagesources{$page};
        my $type=pagetype($file);
+       my $ret="";
        if (defined $type) {
                $nested++;
-               my $ret=htmlize($page, $destpage, $type,
+               $ret=htmlize($page, $destpage, $type,
                       linkify($page, $destpage,
                       preprocess($page, $destpage,
                       filter($page, $destpage,
                       readfile(srcfile($file))))));
                $nested--;
-               return $ret;
        }
-       else {
-               return "";
+       
+       if ($cached_destpage ne $destpage) {
+               clear_inline_content_cache();
+               $cached_destpage=$destpage;
        }
+       return $inline_content{$page}=$ret;
+}
+
+sub clear_inline_content_cache () {
+       %inline_content=();
+}
+
 }
 
 sub date_822 ($) {