]> sipb.mit.edu Git - ikiwiki.git/blob - IkiWiki/Plugin/listdirectives.pm
add pesco's darcs plugin
[ikiwiki.git] / IkiWiki / Plugin / listdirectives.pm
1 #!/usr/bin/perl
2 # Ikiwiki listdirectives plugin.
3 package IkiWiki::Plugin::listdirectives;
4
5 use warnings;
6 use strict;
7 use IkiWiki 2.00;
8
9 sub import { #{{{
10         add_underlay("directives");
11         hook(type => "getsetup", id => "listdirectives", call => \&getsetup);
12         hook(type => "checkconfig", id => "listdirectives", call => \&checkconfig);
13         hook(type => "needsbuild", id => "listdirectives", call => \&needsbuild);
14         hook(type => "preprocess", id => "listdirectives", call => \&preprocess);
15 } # }}}
16
17 sub getsetup () { #{{{
18         return
19                 plugin => {
20                         safe => 1,
21                         rebuild => undef,
22                 },
23                 directive_description_dir => {
24                         type => "string",
25                         description => "directory in srcdir that contains directive descriptions",
26                         example => "ikiwiki/directive",
27                         safe => 1,
28                         rebuild => 1,
29                 },
30 } #}}}
31
32 my @fulllist;
33 my @earlylist;
34 my $pluginstring;
35
36 sub checkconfig () { #{{{
37         if (! defined $config{directive_description_dir}) {
38                 $config{directive_description_dir} = "ikiwiki/directive";
39         }
40         else {
41                 $config{directive_description_dir} =~ s/\/+$//;
42         }
43
44         @earlylist = sort keys %{$IkiWiki::hooks{preprocess}};
45 } #}}}
46
47 sub needsbuild (@) { #{{{
48         my $needsbuild=shift;
49
50         @fulllist = sort keys %{$IkiWiki::hooks{preprocess}};
51         $pluginstring = join(' ', @earlylist) . " : " . join(' ', @fulllist);
52
53         foreach my $page (keys %pagestate) {
54                 if (exists $pagestate{$page}{listdirectives}{shown}) {
55                         if ($pagestate{$page}{listdirectives}{shown} ne $pluginstring) {
56                                 push @$needsbuild, $pagesources{$page};
57                         }
58                         if (exists $pagesources{$page} &&
59                             grep { $_ eq $pagesources{$page} } @$needsbuild) {
60                                 # remove state, will be re-added if
61                                 # the [[!listdirectives]] is still there during the
62                                 # rebuild
63                                 delete $pagestate{$page}{listdirectives}{shown};
64                         }
65                 }
66         }
67 } # }}}
68
69 sub preprocess (@) { #{{{
70         my %params=@_;
71         
72         $pagestate{$params{destpage}}{listdirectives}{shown}=$pluginstring;
73         
74         my @pluginlist;
75         
76         if (defined $params{generated}) {
77                 @pluginlist = @fulllist;
78         }
79         else {
80                 @pluginlist = @earlylist;
81         }
82         
83         my $result = '<ul class="listdirectives">';
84         
85         foreach my $plugin (@pluginlist) {
86                 $result .= '<li class="listdirectives">';
87                 my $link=linkpage($config{directive_description_dir}."/".$plugin);
88                 add_depends($params{page}, $link);
89                 $result .= htmllink($params{page}, $params{destpage}, $link);
90                 $result .= '</li>';
91         }
92         
93         $result .= "</ul>";
94
95         return $result;
96 } # }}}
97
98 1