summaryrefslogtreecommitdiff
path: root/perl/IkiWiki/Plugin/farbar.pm
blob: 37f10139f2ebea3815e182494b6ac17602b850a9 (plain)
  1. #!/usr/bin/perl
  2. # Farbar plugin.
  3. # by Jonas Smedegaard <dr@jones.dk>
  4. # Heavily based on Sidebar by Tuomo Valkonen <tuomov at iki dot fi> 
  5. package IkiWiki::Plugin::farbar;
  6. use warnings;
  7. use strict;
  8. use IkiWiki 3.00;
  9. sub import {
  10.     hook(type => "getsetup"id => "farbar"call => \&getsetup);
  11.     hook(type => "preprocess"id => "farbar"call => \&preprocess);
  12.     hook(type => "pagetemplate"id => "farbar"call => \&pagetemplate);
  13. }
  14. sub getsetup () {
  15.     return
  16.         plugin => {
  17.             safe => 1,
  18.             rebuild => 1,
  19.         },
  20.         global_farbars => {
  21.             type => "boolean",
  22.             example => 1,
  23.             description => "show farbar page on all pages?",
  24.             safe => 1,
  25.             rebuild => 1,
  26.         },
  27. }
  28. my %pagefarbar;
  29. sub preprocess (@) {
  30.     my %params=@_;
  31.     my $page=$params{page};
  32.     return "" unless $page eq $params{destpage};
  33.     
  34.     if (! defined $params{content}) {
  35.         $pagefarbar{$page}=undef;
  36.     }
  37.     else {
  38.         my $file $pagesources{$page};
  39.         my $type pagetype($file);
  40.         $pagefarbar{$page}=
  41.             IkiWiki::htmlize($page$page$type,
  42.             IkiWiki::linkify($page$page,
  43.             IkiWiki::preprocess($page$page$params{content})));
  44.     }
  45.     return "";
  46. }
  47. my $oldfile;
  48. my $oldcontent;
  49. sub farbar_content ($) {
  50.     my $page=shift;
  51.     
  52.     return delete $pagefarbar{$pageif defined $pagefarbar{$page};
  53.     return if exists $pagefarbar{$page} && 
  54.         defined $config{global_farbars} && ! $config{global_farbars};
  55.     my $farbar_page=bestlink($page"farbar") || return;
  56.     my $farbar_file=$pagesources{$farbar_page} || return;
  57.     my $farbar_type=pagetype($farbar_file);
  58.     
  59.     if (defined $farbar_type) {
  60.         # FIXME: This isn't quite right; it won't take into account
  61.         # adding a new farbar page. So adding such a page
  62.         # currently requires a wiki rebuild.
  63.         add_depends($page$farbar_page);
  64.         my $content;
  65.         if (defined $oldfile && $farbar_file eq $oldfile) {
  66.             $content=$oldcontent;
  67.         }
  68.         else {
  69.             $content=readfile(srcfile($farbar_file));
  70.             $oldcontent=$content;
  71.             $oldfile=$farbar_file;
  72.         }
  73.         return unless length $content;
  74.         return IkiWiki::htmlize($farbar_page$page$farbar_type,
  75.                IkiWiki::linkify($farbar_page$page,
  76.                IkiWiki::preprocess($farbar_page$page,
  77.                IkiWiki::filter($farbar_page$page$content))));
  78.     }
  79. }
  80. sub pagetemplate (@) {
  81.     my %params=@_;
  82.     my $template=$params{template};
  83.     if ($params{destpageeq $params{page} &&
  84.         $template->query(name => "farbar")) {
  85.         my $content=farbar_content($params{destpage});
  86.         if (defined $content && length $content) {
  87.                 $template->param(farbar => $content);
  88.         }
  89.     }
  90. }
  91. 1