]> sipb.mit.edu Git - ikiwiki.git/blob - IkiWiki/Plugin/progress.pm
wishlist
[ikiwiki.git] / IkiWiki / Plugin / progress.pm
1 #!/usr/bin/perl
2 package IkiWiki::Plugin::progress;
3
4 use warnings;
5 use strict;
6 use IkiWiki 2.00;
7
8 my $percentage_pattern = qr/[0-9]+\%/; # pattern to validate percentages
9
10 sub import { #{{{
11         hook(type => "getsetup", id => "progress", call => \&getsetup);
12         hook(type => "preprocess", id => "progress", call => \&preprocess);
13         hook(type => "format",     id => "progress", call => \&format);
14 } # }}}
15
16 sub getsetup () { #{{{
17         return 
18                 plugin => {
19                         safe => 1,
20                         rebuild => undef,
21                 },
22 } #}}}
23
24 sub preprocess (@) { #{{{
25         my %params=@_;
26         
27         my $fill;
28         
29         if (defined $params{percent}) {
30                 $fill = $params{percent};
31                 ($fill) = $fill =~ m/($percentage_pattern)/; # fill is untainted now
32         }
33         elsif (defined $params{totalpages} and defined $params{donepages}) {
34                 add_depends($params{page}, $params{totalpages});
35                 add_depends($params{page}, $params{donepages});
36
37                 my @pages=keys %pagesources;
38                 my $totalcount=0;
39                 my $donecount=0;
40                 foreach my $page (@pages) {
41                         $totalcount++ if pagespec_match($page, $params{totalpages}, location => $params{page});
42                         $donecount++ if pagespec_match($page, $params{donepages}, location => $params{page});
43                 }
44                 
45                 if ($totalcount == 0) {
46                         $fill = "100%";
47                 }
48                 else {
49                         my $number = $donecount/$totalcount*100;
50                         $fill = sprintf("%u%%", $number);
51                 }
52         }
53         else {
54                 error("need either `percent` or `totalpages` and `donepages` parameters");
55         }
56
57         return <<EODIV
58 <div class="progress">
59   <div class="progress-done" style="width: $fill">$fill</div>
60 </div>
61 EODIV
62 } # }}}
63
64 sub format(@) { #{{{
65         my %params = @_;
66
67         # If HTMLScrubber has removed the style attribute, then bring it back
68
69         $params{content} =~ s!<div class="progress-done">($percentage_pattern)</div>!<div class="progress-done" style="width: $1">$1</div>!g;
70
71         return $params{content};    
72 } #}}}
73
74 1