]> sipb.mit.edu Git - ikiwiki.git/blob - doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn
4ec9107e3aef2f653290d580b5b6b7f9e12d909e
[ikiwiki.git] / doc / todo / Add_a_plugin_to_list_available_pre-processor_commands.mdwn
1 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]]
2
3     #!/usr/bin/perl
4     # Ikiwiki listplugins plugin.
5     package IkiWiki::Plugin::listplugins;
6     
7     use warnings;
8     use strict;
9     use IkiWiki 2.00;
10     
11     sub import { #{{{
12         hook(type => "getsetup", id => "listplugins", call => \&getsetup);
13         hook(type => "needsbuild", id => "listplugins", call => \&needsbuild);
14         hook(type => "preprocess", id => "listplugins", call => \&preprocess);
15     } # }}}
16     
17     sub getsetup () { #{{{
18         return
19                 plugin => {
20                         safe => 1,
21                         rebuild => undef,
22                 },
23     } #}}}
24     
25     my @pluginlist;
26     my $pluginString;
27     
28     sub needsbuild (@) { #{{{
29         my $needsbuild=shift;
30     
31         my @rawpluginlist = sort(IkiWiki::listplugins());
32         @pluginlist = ();
33         
34         foreach my $plugin (@rawpluginlist) {
35                 if ( exists $IkiWiki::hooks{preprocess}{$plugin} ) {
36                         push(@pluginlist,$plugin);
37                 }
38         }
39     
40         $pluginString = join (' ', @pluginlist);
41     
42         foreach my $page (keys %pagestate) {
43                 if (exists $pagestate{$page}{listplugins}{shown}) {
44                         if ($pagestate{$page}{listplugins}{shown} ne $pluginString) {
45                                 push @$needsbuild, $pagesources{$page};
46                         }
47                         if (exists $pagesources{$page} &&
48                             grep { $_ eq $pagesources{$page} } @$needsbuild) {
49                                 # remove state, will be re-added if
50                                 # the version is still shown during the
51                                 # rebuild
52                                 delete $pagestate{$page}{listplugins}{shown};
53                         }
54                 }
55         }
56     } # }}}
57     
58     sub preprocess (@) { #{{{
59         my %params=@_;
60         
61         $pagestate{$params{destpage}}{listplugins}{shown}=$pluginString;
62         
63         my $result = "<ul class=\"pluginlist\">";
64         my $thisPlugin;
65         foreach $thisPlugin (@pluginlist) {
66                 $result .= "<li class=\"pluginlist\">$thisPlugin</li>";
67         }
68         $result .= "</ul>";
69         
70         return $result;
71     } # }}}
72     
73     1