Merge branch 'master' of ssh://git.ikiwiki.info/srv/git/ikiwiki.info
[ikiwiki] / 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 3.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                         section => "widget",
23                 },
24                 directive_description_dir => {
25                         type => "string",
26                         description => "directory in srcdir that contains directive descriptions",
27                         example => "ikiwiki/directive",
28                         safe => 1,
29                         rebuild => 1,
30                 },
31 }
32
33 my @fulllist;
34 my @shortlist;
35 my $pluginstring;
36
37 sub checkconfig () {
38         if (! defined $config{directive_description_dir}) {
39                 $config{directive_description_dir} = "ikiwiki/directive";
40         }
41         else {
42                 $config{directive_description_dir} =~ s/\/+$//;
43         }
44 }
45
46 sub needsbuild (@) {
47         my $needsbuild=shift;
48
49         @fulllist = grep { ! /^_/ } sort keys %{$IkiWiki::hooks{preprocess}};
50         @shortlist = grep { ! $IkiWiki::hooks{preprocess}{$_}{shortcut} } @fulllist;
51         $pluginstring = join(' ', @shortlist) . " : " . 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         return $needsbuild;
69 }
70
71 sub preprocess (@) {
72         my %params=@_;
73         
74         $pagestate{$params{destpage}}{listdirectives}{shown}=$pluginstring;
75         
76         my @pluginlist;
77         
78         if (defined $params{generated}) {
79                 @pluginlist = @fulllist;
80         }
81         else {
82                 @pluginlist = @shortlist;
83         }
84         
85         my $result = '<ul class="listdirectives">';
86         
87         foreach my $plugin (@pluginlist) {
88                 $result .= '<li class="listdirectives">';
89                 my $link=linkpage($config{directive_description_dir}."/".$plugin);
90                 add_depends($params{page}, $link, deptype("presence"));
91                 $result .= htmllink($params{page}, $params{destpage}, $link);
92                 $result .= '</li>';
93         }
94         
95         $result .= "</ul>";
96
97         return $result;
98 }
99
100 1