]> sipb.mit.edu Git - ikiwiki.git/commitdiff
plugin by willu
authorJoey Hess <joey@kodama.kitenet.net>
Mon, 25 Aug 2008 17:28:25 +0000 (13:28 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Mon, 25 Aug 2008 17:28:25 +0000 (13:28 -0400)
IkiWiki/Plugin/listpreprocessors.pm [new file with mode: 0644]

diff --git a/IkiWiki/Plugin/listpreprocessors.pm b/IkiWiki/Plugin/listpreprocessors.pm
new file mode 100644 (file)
index 0000000..ae5e1a7
--- /dev/null
@@ -0,0 +1,90 @@
+#!/usr/bin/perl
+# Ikiwiki listpreprocessors plugin.
+package IkiWiki::Plugin::listpreprocessors;
+
+use warnings;
+use strict;
+use IkiWiki 2.00;
+
+sub import { #{{{
+       hook(type => "getsetup", id => "listpreprocessors", call => \&getsetup);
+       hook(type => "checkconfig", id => "listpreprocessors", call => \&checkconfig);
+       hook(type => "needsbuild", id => "listpreprocessors", call => \&needsbuild);
+       hook(type => "preprocess", id => "listpreprocessors", call => \&preprocess);
+} # }}}
+
+sub getsetup () { #{{{
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => undef,
+               },
+               preprocessor_description_dir => {
+                       type => "string",
+                       description => "The ikiwiki directory that contains plugin descriptions.",
+                       safe => 1,
+                       rebuild => 1,
+               },
+} #}}}
+
+my @fullPluginList;
+my @earlyPluginList;
+my $pluginString;
+
+sub checkconfig () { #{{{
+    if (!defined $config{plugin_description_dir}) {
+        $config{plugin_description_dir} = "ikiwiki/plugin/";
+    }
+
+    @earlyPluginList = sort( keys %{ $IkiWiki::hooks{preprocess} } );
+} #}}}
+
+sub needsbuild (@) { #{{{
+       my $needsbuild=shift;
+
+       @fullPluginList = sort( keys %{ $IkiWiki::hooks{preprocess} } );
+       $pluginString = join (' ', @earlyPluginList) . " : ". join (' ', @fullPluginList);
+
+       foreach my $page (keys %pagestate) {
+               if (exists $pagestate{$page}{listpreprocessors}{shown}) {
+                       if ($pagestate{$page}{listpreprocessors}{shown} ne $pluginString) {
+                               push @$needsbuild, $pagesources{$page};
+                       }
+                       if (exists $pagesources{$page} &&
+                                       grep { $_ eq $pagesources{$page} } @$needsbuild) {
+                               # remove state, will be re-added if
+                               # the [[!listpreprocessors]] is still there during the
+                               # rebuild
+                               delete $pagestate{$page}{listpreprocessors}{shown};
+                       }
+               }
+       }
+} # }}}
+
+sub preprocess (@) { #{{{
+       my %params=@_;
+       
+       $pagestate{$params{destpage}}{listpreprocessors}{shown}=$pluginString;
+       
+       my @pluginlist;
+       
+       if (defined $params{generated}) {
+               @pluginlist = @fullPluginList;
+       } else {
+               @pluginlist = @earlyPluginList;
+       }
+       
+       my $result = '<ul class="listpreprocessors">';
+       
+       foreach my $plugin (@pluginlist) {
+               $result .= '<li class="listpreprocessors">';
+               $result .= htmllink($params{page}, $params{destpage}, IkiWiki::linkpage($config{plugin_description_dir} . $plugin));
+               $result .= '</li>';
+       }
+       
+       $result .= "</ul>";
+
+       return $result;
+} # }}}
+
+1