summaryrefslogtreecommitdiff
path: root/perl/IkiWiki/Plugin/topbar.pm
blob: 2705161e53550246a9766685f9a6cfb52dce8d12 (plain)
  1. #!/usr/bin/perl
  2. # Topbar 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::topbar;
  6. use warnings;
  7. use strict;
  8. use IkiWiki 3.00;
  9. sub import {
  10.     hook(type => "getsetup"id => "topbar"call => \&getsetup);
  11.     hook(type => "preprocess"id => "topbar"call => \&preprocess);
  12.     hook(type => "pagetemplate"id => "topbar"call => \&pagetemplate);
  13. }
  14. sub getsetup () {
  15.     return
  16.         plugin => {
  17.             safe => 1,
  18.             rebuild => 1,
  19.         },
  20.         global_topbars => {
  21.             type => "boolean",
  22.             example => 1,
  23.             description => "show topbar page on all pages?",
  24.             safe => 1,
  25.             rebuild => 1,
  26.         },
  27. }
  28. my %pagetopbar;
  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.         $pagetopbar{$page}=undef;
  36.     }
  37.     else {
  38.         my $file $pagesources{$page};
  39.         my $type pagetype($file);
  40.         $pagetopbar{$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 topbar_content ($) {
  50.     my $page=shift;
  51.     
  52.     return delete $pagetopbar{$pageif defined $pagetopbar{$page};
  53.     return if exists $pagetopbar{$page} && 
  54.         defined $config{global_topbars} && ! $config{global_topbars};
  55.     my $topbar_page=bestlink($page"topbar") || return;
  56.     my $topbar_file=$pagesources{$topbar_page} || return;
  57.     my $topbar_type=pagetype($topbar_file);
  58.     
  59.     if (defined $topbar_type) {
  60.         # FIXME: This isn't quite right; it won't take into account
  61.         # adding a new topbar page. So adding such a page
  62.         # currently requires a wiki rebuild.
  63.         add_depends($page$topbar_page);
  64.         my $content;
  65.         if (defined $oldfile && $topbar_file eq $oldfile) {
  66.             $content=$oldcontent;
  67.         }
  68.         else {
  69.             $content=readfile(srcfile($topbar_file));
  70.             $oldcontent=$content;
  71.             $oldfile=$topbar_file;
  72.         }
  73.         return unless length $content;
  74.         return IkiWiki::htmlize($topbar_page$page$topbar_type,
  75.                IkiWiki::linkify($topbar_page$page,
  76.                IkiWiki::preprocess($topbar_page$page,
  77.                IkiWiki::filter($topbar_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 => "topbar")) {
  85.         my $content=topbar_content($params{destpage});
  86.         if (defined $content && length $content) {
  87.                 $template->param(topbar => $content);
  88.         }
  89.     }
  90. }
  91. 1