]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/postsparkline.pm
comments: add regression test for sorting by date
[git.ikiwiki.info.git] / IkiWiki / Plugin / postsparkline.pm
index 2bc93088d960a527cef001a7912398b533c1e048..2fae9c5fee90ab266aa0be0d0b2fb4a5267afbb3 100644 (file)
@@ -3,14 +3,24 @@ package IkiWiki::Plugin::postsparkline;
 
 use warnings;
 use strict;
-use IkiWiki;
+use IkiWiki 3.00;
 
-sub import { #{{{
+sub import {
        IkiWiki::loadplugin('sparkline');
+       hook(type => "getsetup", id => "postsparkline", call => \&getsetup);
        hook(type => "preprocess", id => "postsparkline", call => \&preprocess);
-} # }}}
+}
+
+sub getsetup () {
+       return 
+               plugin => {
+                       safe => 1,
+                       rebuild => undef,
+                       section => "widget",
+               },
+}
 
-sub preprocess (@) { #{{{
+sub preprocess (@) {
        my %params=@_;
 
        if (! exists $params{max}) {
@@ -21,38 +31,54 @@ sub preprocess (@) { #{{{
                return "";
        }
 
+       my $deptype;
+       if (! exists $params{time} || $params{time} ne 'mtime') {
+               $params{timehash} = \%IkiWiki::pagectime;
+               # need to update when pages are added or removed
+               $deptype = deptype("presence");
+       }
+       else {
+               $params{timehash} = \%IkiWiki::pagemtime;
+               # need to update when pages are changed
+               $deptype = deptype("content");
+       }
+
        if (! exists $params{formula}) {
-               return "[[postsparkline ".gettext("missing formula")."]]";
+               error gettext("missing formula")
        }
        my $formula=$params{formula};
        $formula=~s/[^a-zA-Z0-9]*//g;
        $formula=IkiWiki::possibly_foolish_untaint($formula);
        if (! length $formula ||
            ! IkiWiki::Plugin::postsparkline::formula->can($formula)) {
-               return "[[postsparkline ".gettext("unknown formula")."]]";
+               error gettext("unknown formula");
        }
 
-       add_depends($params{page}, $params{pages});
+       my @list=sort { $params{timehash}->{$b} <=> $params{timehash}->{$a} } 
+               pagespec_match_list($params{page}, $params{pages},
+                       deptype => $deptype,
+                       filter => sub { $_[0] eq $params{page} },
+               );
 
-       my @list;
-       foreach my $page (keys %pagesources) {
-               next if $page eq $params{page};
-               if (pagespec_match($page, $params{pages}, $params{page})) {
-                       push @list, $page;
-               }
+       my @data=eval qq{IkiWiki::Plugin::postsparkline::formula::$formula(\\\%params, \@list)};
+       if ($@) {
+               error $@;
        }
-       
-       @list = sort { $IkiWiki::pagectime{$b} <=> $IkiWiki::pagectime{$a} } @list;
+
+       if (! @data) {
+               # generate an empty graph
+               push @data, 0 foreach 1..($params{max} / 2);
+       }
+
+       my $color=exists $params{color} ? "($params{color})" : "";
 
        delete $params{pages};
        delete $params{formula};
-       my @data=eval qq{IkiWiki::Plugin::postsparkline::formula::$formula(\\\%params, \@list)};
-       if ($@) {
-               return "[[postsparkline error $@]]";
-       }
+       delete $params{ftime};
+       delete $params{color};
        return IkiWiki::Plugin::sparkline::preprocess(%params, 
-               map { $_ => "" } reverse @data);
-} # }}}
+               map { $_.$color => "" } reverse @data);
+}
 
 sub perfoo ($@) {
        my $sub=shift;
@@ -63,7 +89,7 @@ sub perfoo ($@) {
        my $count=0;
        my @data;
        foreach (@_) {
-               $cur=$sub->($IkiWiki::pagectime{$_});
+               $cur=$sub->($params->{timehash}->{$_});
                if (defined $prev) {
                        if ($prev != $cur) {
                                push @data, "$prev,$count";
@@ -114,7 +140,7 @@ sub interval ($@) {
        my $max=$params->{max};
        my @data;
        for (my $i=1; $i < @_; $i++) {
-               push @data, $IkiWiki::pagectime{$_[$i-1]} - $IkiWiki::pagectime{$_[$i]};
+               push @data, $params->{timehash}->{$_[$i-1]} - $params->{timehash}->{$_[$i]};
                last if --$max <= 0;
        }
        return @data;