]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/sidebar.pm
sidebar: Now a sidebar directive can be used to override the sidebar shown on a page.
[ikiwiki.git] / IkiWiki / Plugin / sidebar.pm
index 41812e1c1f671da84be1a06a5821695fc5dc6f11..d63cb524671210186a4380f7d829716640f7fc52 100644 (file)
@@ -10,6 +10,7 @@ use IkiWiki 3.00;
 
 sub import {
        hook(type => "getsetup", id => "sidebar", call => \&getsetup);
+       hook(type => "preprocess", id => "sidebar", call => \&preprocess);
        hook(type => "pagetemplate", id => "sidebar", call => \&pagetemplate);
 }
 
@@ -21,9 +22,39 @@ sub getsetup () {
                },
 }
 
+my %pagesidebar;
+
+sub preprocess (@) {
+       my %params=@_;
+       my $content=shift;
+       shift;
+
+       if (! defined $content) {
+               error(gettext("sidebar content not specified"));
+       }
+
+       my $page=$params{page};
+       return "" unless $page eq $params{destpage};
+       my $file = $pagesources{$page};
+       my $type = pagetype($file);
+
+       $pagesidebar{$page}=
+               IkiWiki::htmlize($page, $page, $type,
+               IkiWiki::linkify($page, $page,
+               IkiWiki::preprocess($page, $page,
+               IkiWiki::filter($page, $page, $content))));
+
+       return "";
+}
+
+my $oldfile;
+my $oldcontent;
+
 sub sidebar_content ($) {
        my $page=shift;
        
+       return $pagesidebar{$page} if exists $pagesidebar{$page};
+
        my $sidebar_page=bestlink($page, "sidebar") || return;
        my $sidebar_file=$pagesources{$sidebar_page} || return;
        my $sidebar_type=pagetype($sidebar_file);
@@ -34,7 +65,16 @@ sub sidebar_content ($) {
                # currently requires a wiki rebuild.
                add_depends($page, $sidebar_page);
 
-               my $content=readfile(srcfile($sidebar_file));
+               my $content;
+               if (defined $oldfile && $sidebar_file eq $oldfile) {
+                       $content=$oldcontent;
+               }
+               else {
+                       $content=readfile(srcfile($sidebar_file));
+                       $oldcontent=$content;
+                       $oldfile=$sidebar_file;
+               }
+
                return unless length $content;
                return IkiWiki::htmlize($sidebar_page, $page, $sidebar_type,
                       IkiWiki::linkify($sidebar_page, $page,