summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin
diff options
context:
space:
mode:
Diffstat (limited to 'IkiWiki/Plugin')
-rw-r--r--IkiWiki/Plugin/pagestats.pm64
1 files changed, 64 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/pagestats.pm b/IkiWiki/Plugin/pagestats.pm
new file mode 100644
index 000000000..34fd11715
--- /dev/null
+++ b/IkiWiki/Plugin/pagestats.pm
@@ -0,0 +1,64 @@
+#!/usr/bin/perl
+#
+# Produce page statistics in various forms.
+#
+# Currently supported:
+# cloud: produces statistics in the form of a del.icio.us-style tag cloud
+# (default)
+# table: produces a table with the number of backlinks for each page
+#
+# By Enrico Zini.
+package IkiWiki::Plugin::pagestats;
+
+use warnings;
+use strict;
+use IkiWiki;
+
+# Names of the HTML classes to use for the tag cloud
+our @classes = ('smallestPC', 'smallPC', 'normalPC', 'bigPC', 'biggestPC' );
+
+sub import { #{{{
+ IkiWiki::hook(type => "preprocess", id => "pagestats",
+ call => \&preprocess);
+} # }}}
+
+sub preprocess (@) { #{{{
+ my %params=@_;
+ $params{pages}="*" unless defined $params{pages};
+ my $style = ($params{style} or 'cloud');
+
+ # Needs to update whenever a page is added or removed, so
+ # register a dependency.
+ IkiWiki::add_depends($params{page}, $params{pages});
+
+ my %counts;
+ my $max = 0;
+ foreach my $page (%IkiWiki::links) {
+ if (IkiWiki::globlist_match($page, $params{pages})) {
+ my @bl = IkiWiki::backlinks($page);
+ $counts{$page} = scalar(@bl);
+ $max = $counts{$page} if $counts{$page} > $max;
+ }
+ }
+
+ if ($style eq 'table') {
+ return "<table class='pageStats'>\n".join("\n", map { "<tr><td>$_</td><td>".$counts{$_}."</td></tr>" }
+ sort { $counts{$b} <=> $counts{$a} } keys %counts)."\n</table>\n" ;
+ } else {
+ # In case of misspelling, default to a page cloud
+
+ my $res = "<div class='pagecloud'>\n";
+ foreach my $page (sort keys %counts) {
+ my $class = $classes[$counts{$page} * scalar(@classes) / ($max + 1)];
+ my $link = IkiWiki::abs2rel(IkiWiki::htmlpage($page), IkiWiki::dirname($params{page}));
+ $res .= sprintf("<span class='%s'><a href='%s'>%s</a></span>\n",
+ $class, $link, $page);
+
+ }
+ $res .= "</div>\n";
+
+ return $res;
+ }
+} # }}}
+
+1