sidebar: Now a sidebar directive can be used to override the sidebar shown on a page.
authorJoey Hess <joey@gnu.kitenet.net>
Thu, 15 Apr 2010 20:40:01 +0000 (16:40 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Thu, 15 Apr 2010 20:51:27 +0000 (16:51 -0400)
IkiWiki/Plugin/sidebar.pm
debian/changelog
doc/ikiwiki/directive/sidebar.mdwn [new file with mode: 0644]
doc/plugins/sidebar.mdwn

index 41812e1c1f671da84be1a06a5821695fc5dc6f11..d63cb524671210186a4380f7d829716640f7fc52 100644 (file)
@@ -10,6 +10,7 @@ use IkiWiki 3.00;
 
 sub import {
        hook(type => "getsetup", id => "sidebar", call => \&getsetup);
+       hook(type => "preprocess", id => "sidebar", call => \&preprocess);
        hook(type => "pagetemplate", id => "sidebar", call => \&pagetemplate);
 }
 
@@ -21,9 +22,39 @@ sub getsetup () {
                },
 }
 
+my %pagesidebar;
+
+sub preprocess (@) {
+       my %params=@_;
+       my $content=shift;
+       shift;
+
+       if (! defined $content) {
+               error(gettext("sidebar content not specified"));
+       }
+
+       my $page=$params{page};
+       return "" unless $page eq $params{destpage};
+       my $file = $pagesources{$page};
+       my $type = pagetype($file);
+
+       $pagesidebar{$page}=
+               IkiWiki::htmlize($page, $page, $type,
+               IkiWiki::linkify($page, $page,
+               IkiWiki::preprocess($page, $page,
+               IkiWiki::filter($page, $page, $content))));
+
+       return "";
+}
+
+my $oldfile;
+my $oldcontent;
+
 sub sidebar_content ($) {
        my $page=shift;
        
+       return $pagesidebar{$page} if exists $pagesidebar{$page};
+
        my $sidebar_page=bestlink($page, "sidebar") || return;
        my $sidebar_file=$pagesources{$sidebar_page} || return;
        my $sidebar_type=pagetype($sidebar_file);
@@ -34,7 +65,16 @@ sub sidebar_content ($) {
                # currently requires a wiki rebuild.
                add_depends($page, $sidebar_page);
 
-               my $content=readfile(srcfile($sidebar_file));
+               my $content;
+               if (defined $oldfile && $sidebar_file eq $oldfile) {
+                       $content=$oldcontent;
+               }
+               else {
+                       $content=readfile(srcfile($sidebar_file));
+                       $oldcontent=$content;
+                       $oldfile=$sidebar_file;
+               }
+
                return unless length $content;
                return IkiWiki::htmlize($sidebar_page, $page, $sidebar_type,
                       IkiWiki::linkify($sidebar_page, $page,
index 03361e6a086293f6d942f9c3ef83f345d4d51f7b..267a2fd7aa5b604479d2c6ffd0adfaccb6142d93 100644 (file)
@@ -37,6 +37,8 @@ ikiwiki (3.20100415) UNRELEASED; urgency=low
     in a tag cloud. This is useful to put in a sidebar.
   * Rework example blog front page.
   * CSS and templates for sidebar changed to use a class, not an id.
+  * sidebar: Now a sidebar directive can be used to override the sidebar
+    shown on a page.
 
  -- Joey Hess <joeyh@debian.org>  Sun, 04 Apr 2010 12:17:11 -0400
 
diff --git a/doc/ikiwiki/directive/sidebar.mdwn b/doc/ikiwiki/directive/sidebar.mdwn
new file mode 100644 (file)
index 0000000..46f0167
--- /dev/null
@@ -0,0 +1,14 @@
+The `sidebar` directive is supplied by the [[!iki plugins/sidebar desc=sidebar]] plugin.
+
+This directive specifies a custom sidebar to display on the page, instead
+of any sidebar that is displayed globally.
+
+## examples
+
+       \[[!sidebar """
+       This is my custom sidebar for this page.
+
+       \[[!calendar pages="posts/*"]]
+       """]]
+
+[[!meta robots="noindex, follow"]]
index 4e356d65a8984885a256788f82f1f2173ffeaa67..cd0f0ecf12b43e991c7abcf90ae4da32273198df 100644 (file)
@@ -10,15 +10,16 @@ Typically this will be a page in the root of the wiki, but it can also be a
 [[plugins/sidebar|plugins/sidebar]], will be treated as a sidebar for the
 [[plugins]] page, and of all of its SubPages, if the plugin is enabled.
 
-Note that to disable a sidebar for a [[ikiwiki/SubPage]] of a page that has
-a sidebar, you can create a sidebar page that is completely empty. This
-will turn off the sidebar altogether.
+There is also a [[ikiwiki/directive/sidebar]] directive that can be used
+to provide a custom sidebar content for a page.
 
-Warning: Any change to the sidebar will cause a rebuild of the whole wiki,
-since every page includes a copy that has to be updated. This can
-especially be a problem if the sidebar includes an [[ikiwiki/directive/inline]]
-directive, since any changes to pages inlined into the sidebar
-will change the sidebar and cause a full wiki rebuild.
+----
+
+Warning: Any change to the sidebar page will cause a rebuild of the whole
+wiki, since every page includes a copy that has to be updated. This can
+especially be a problem if the sidebar includes an
+[[ikiwiki/directive/inline]] directive, since any changes to pages inlined
+into the sidebar will change the sidebar and cause a full wiki rebuild.
 
 Instead, if you include a [[ikiwiki/directive/map]] directive on the sidebar,
 and it does not use the `show` parameter, only adding or removing pages