New plugin to list available pre-processor commands
authorhttp://www.cse.unsw.edu.au/~willu/ <http://www.cse.unsw.edu.au/~willu/@web>
Thu, 21 Aug 2008 13:58:25 +0000 (09:58 -0400)
committerJoey Hess <joey@kitenet.net>
Thu, 21 Aug 2008 13:58:25 +0000 (09:58 -0400)
doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn [new file with mode: 0644]

diff --git a/doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn b/doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn
new file mode 100644 (file)
index 0000000..4ec9107
--- /dev/null
@@ -0,0 +1,73 @@
+I've found myself wanting to know which [[plugins]] are switched on so I know which pre-processor commands I can use.  The attached [[patch]] adds a new plugin that generates the list of available plugins. -- [[Will]]
+
+    #!/usr/bin/perl
+    # Ikiwiki listplugins plugin.
+    package IkiWiki::Plugin::listplugins;
+    
+    use warnings;
+    use strict;
+    use IkiWiki 2.00;
+    
+    sub import { #{{{
+       hook(type => "getsetup", id => "listplugins", call => \&getsetup);
+       hook(type => "needsbuild", id => "listplugins", call => \&needsbuild);
+       hook(type => "preprocess", id => "listplugins", call => \&preprocess);
+    } # }}}
+    
+    sub getsetup () { #{{{
+       return
+               plugin => {
+                       safe => 1,
+                       rebuild => undef,
+               },
+    } #}}}
+    
+    my @pluginlist;
+    my $pluginString;
+    
+    sub needsbuild (@) { #{{{
+       my $needsbuild=shift;
+    
+       my @rawpluginlist = sort(IkiWiki::listplugins());
+       @pluginlist = ();
+       
+       foreach my $plugin (@rawpluginlist) {
+               if ( exists $IkiWiki::hooks{preprocess}{$plugin} ) {
+                       push(@pluginlist,$plugin);
+               }
+       }
+    
+       $pluginString = join (' ', @pluginlist);
+    
+       foreach my $page (keys %pagestate) {
+               if (exists $pagestate{$page}{listplugins}{shown}) {
+                       if ($pagestate{$page}{listplugins}{shown} ne $pluginString) {
+                               push @$needsbuild, $pagesources{$page};
+                       }
+                       if (exists $pagesources{$page} &&
+                           grep { $_ eq $pagesources{$page} } @$needsbuild) {
+                               # remove state, will be re-added if
+                               # the version is still shown during the
+                               # rebuild
+                               delete $pagestate{$page}{listplugins}{shown};
+                       }
+               }
+       }
+    } # }}}
+    
+    sub preprocess (@) { #{{{
+       my %params=@_;
+       
+       $pagestate{$params{destpage}}{listplugins}{shown}=$pluginString;
+       
+       my $result = "<ul class=\"pluginlist\">";
+       my $thisPlugin;
+       foreach $thisPlugin (@pluginlist) {
+               $result .= "<li class=\"pluginlist\">$thisPlugin</li>";
+       }
+       $result .= "</ul>";
+       
+       return $result;
+    } # }}}
+    
+    1