X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/4895955ceaf264c5f17b10c4009e1ab1afcc55ee..adc196a8b53c0b0b4f9ec4cbcea85ba37e421b59:/IkiWiki/Plugin/sidebar.pm diff --git a/IkiWiki/Plugin/sidebar.pm b/IkiWiki/Plugin/sidebar.pm index 0b006f110..0350f2b71 100644 --- a/IkiWiki/Plugin/sidebar.pm +++ b/IkiWiki/Plugin/sidebar.pm @@ -6,48 +6,105 @@ package IkiWiki::Plugin::sidebar; use warnings; use strict; -use IkiWiki; +use IkiWiki 3.00; -sub import { #{{{ - IkiWiki::hook(type => "pagetemplate", id => "sidebar", - call => \&pagetemplate); -} # }}} +sub import { + hook(type => "getsetup", id => "sidebar", call => \&getsetup); + hook(type => "preprocess", id => "sidebar", call => \&preprocess); + hook(type => "pagetemplate", id => "sidebar", call => \&pagetemplate); +} -sub sidebar_content ($) { #{{{ +sub getsetup () { + return + plugin => { + safe => 1, + rebuild => 1, + }, + global_sidebars => { + type => "boolean", + examples => 1, + description => "show sidebar page on all pages?", + safe => 1, + rebuild => 1, + }, +} + +my %pagesidebar; + +sub preprocess (@) { + my %params=@_; + + my $page=$params{page}; + return "" unless $page eq $params{destpage}; + + if (! defined $params{content}) { + $pagesidebar{$page}=undef; + } + else { + 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, $params{content})))); + } + + return ""; +} + +my $oldfile; +my $oldcontent; + +sub sidebar_content ($) { my $page=shift; - my $sidebar_page=IkiWiki::bestlink($page, "sidebar") || return; - my $sidebar_file=$IkiWiki::pagesources{$sidebar_page} || return; - my $sidebar_type=IkiWiki::pagetype($sidebar_file); + return delete $pagesidebar{$page} if defined $pagesidebar{$page}; + + return if ! exists $pagesidebar{$page} && + defined $config{global_sidebars} && ! $config{global_sidebars}; + + my $sidebar_page=bestlink($page, "sidebar") || return; + my $sidebar_file=$pagesources{$sidebar_page} || return; + my $sidebar_type=pagetype($sidebar_file); if (defined $sidebar_type) { # FIXME: This isn't quite right; it won't take into account # adding a new sidebar page. So adding such a page # currently requires a wiki rebuild. - IkiWiki::add_depends($page, $sidebar_page); + add_depends($page, $sidebar_page); + + my $content; + if (defined $oldfile && $sidebar_file eq $oldfile) { + $content=$oldcontent; + } + else { + $content=readfile(srcfile($sidebar_file)); + $oldcontent=$content; + $oldfile=$sidebar_file; + } - my $content=IkiWiki::readfile(IkiWiki::srcfile($sidebar_file)); return unless length $content; - return IkiWiki::htmlize($page, $sidebar_type, + return IkiWiki::htmlize($sidebar_page, $page, $sidebar_type, IkiWiki::linkify($sidebar_page, $page, IkiWiki::preprocess($sidebar_page, $page, - IkiWiki::filter($sidebar_page, $content)))); + IkiWiki::filter($sidebar_page, $page, $content)))); } -} # }}} +} -sub pagetemplate (@) { #{{{ +sub pagetemplate (@) { my %params=@_; - my $page=$params{page}; my $template=$params{template}; - - if ($template->query(name => "sidebar")) { - my $content=sidebar_content($page); + if ($params{destpage} eq $params{page} && + $template->query(name => "sidebar")) { + my $content=sidebar_content($params{destpage}); if (defined $content && length $content) { $template->param(sidebar => $content); } } -} # }}} +} 1