summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/sidebar.pm
blob: d63cb524671210186a4380f7d829716640f7fc52 (plain)
  1. #!/usr/bin/perl
  2. # Sidebar plugin.
  3. # by Tuomo Valkonen <tuomov at iki dot fi>
  4. package IkiWiki::Plugin::sidebar;
  5. use warnings;
  6. use strict;
  7. use IkiWiki 3.00;
  8. sub import {
  9. hook(type => "getsetup", id => "sidebar", call => \&getsetup);
  10. hook(type => "preprocess", id => "sidebar", call => \&preprocess);
  11. hook(type => "pagetemplate", id => "sidebar", call => \&pagetemplate);
  12. }
  13. sub getsetup () {
  14. return
  15. plugin => {
  16. safe => 1,
  17. rebuild => 1,
  18. },
  19. }
  20. my %pagesidebar;
  21. sub preprocess (@) {
  22. my %params=@_;
  23. my $content=shift;
  24. shift;
  25. if (! defined $content) {
  26. error(gettext("sidebar content not specified"));
  27. }
  28. my $page=$params{page};
  29. return "" unless $page eq $params{destpage};
  30. my $file = $pagesources{$page};
  31. my $type = pagetype($file);
  32. $pagesidebar{$page}=
  33. IkiWiki::htmlize($page, $page, $type,
  34. IkiWiki::linkify($page, $page,
  35. IkiWiki::preprocess($page, $page,
  36. IkiWiki::filter($page, $page, $content))));
  37. return "";
  38. }
  39. my $oldfile;
  40. my $oldcontent;
  41. sub sidebar_content ($) {
  42. my $page=shift;
  43. return $pagesidebar{$page} if exists $pagesidebar{$page};
  44. my $sidebar_page=bestlink($page, "sidebar") || return;
  45. my $sidebar_file=$pagesources{$sidebar_page} || return;
  46. my $sidebar_type=pagetype($sidebar_file);
  47. if (defined $sidebar_type) {
  48. # FIXME: This isn't quite right; it won't take into account
  49. # adding a new sidebar page. So adding such a page
  50. # currently requires a wiki rebuild.
  51. add_depends($page, $sidebar_page);
  52. my $content;
  53. if (defined $oldfile && $sidebar_file eq $oldfile) {
  54. $content=$oldcontent;
  55. }
  56. else {
  57. $content=readfile(srcfile($sidebar_file));
  58. $oldcontent=$content;
  59. $oldfile=$sidebar_file;
  60. }
  61. return unless length $content;
  62. return IkiWiki::htmlize($sidebar_page, $page, $sidebar_type,
  63. IkiWiki::linkify($sidebar_page, $page,
  64. IkiWiki::preprocess($sidebar_page, $page,
  65. IkiWiki::filter($sidebar_page, $page, $content))));
  66. }
  67. }
  68. sub pagetemplate (@) {
  69. my %params=@_;
  70. my $page=$params{page};
  71. my $template=$params{template};
  72. if ($template->query(name => "sidebar")) {
  73. my $content=sidebar_content($page);
  74. if (defined $content && length $content) {
  75. $template->param(sidebar => $content);
  76. }
  77. }
  78. }
  79. 1