From 267f98e2e116739872cafc6bb712280c31376705 Mon Sep 17 00:00:00 2001 From: joey Date: Sat, 29 Jul 2006 07:25:17 +0000 Subject: [PATCH] * Put categories in rss feeds for tagged items. --- IkiWiki/Plugin/inline.pm | 12 +++++++++++- IkiWiki/Plugin/tag.pm | 38 +++++++++++++++++++++++++++++++------- debian/changelog | 3 ++- doc/features.mdwn | 4 +++- doc/plugins/tag.mdwn | 10 +++++----- doc/plugins/write.mdwn | 13 +++++++------ doc/todo/tags.mdwn | 11 ++++++++--- templates/rsspage.tmpl | 9 +++++---- 8 files changed, 72 insertions(+), 28 deletions(-) diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm index 06c4a3737..1ea347b08 100644 --- a/IkiWiki/Plugin/inline.pm +++ b/IkiWiki/Plugin/inline.pm @@ -152,7 +152,8 @@ sub genrss ($@) { #{{{ my $url="$config{url}/".htmlpage($page); - my $template=template("rsspage.tmpl", blind_cache => 1); + my $template=template("rsspage.tmpl", blind_cache => 1, + die_on_bad_params => 0); my @items; foreach my $p (@pages) { @@ -161,6 +162,7 @@ sub genrss ($@) { #{{{ itemurl => "$config{url}/$renderedfiles{$p}", itempubdate => date_822($pagectime{$p}), itemcontent => absolute_urls(get_inline_content($p, $page), $url), + page => $p, # used by category adding code in tag plugin } if exists $renderedfiles{$p}; } @@ -170,6 +172,14 @@ sub genrss ($@) { #{{{ items => \@items, ); + foreach my $id (keys %{$hooks{pagetemplate}}) { + $hooks{pagetemplate}{$id}{call}->( + page => $page, + destpage => $page, + template => $template, + ); + } + return $template->output; } #}}} diff --git a/IkiWiki/Plugin/tag.pm b/IkiWiki/Plugin/tag.pm index 289b48b87..2aa70d406 100644 --- a/IkiWiki/Plugin/tag.pm +++ b/IkiWiki/Plugin/tag.pm @@ -23,6 +23,17 @@ sub getopt () { #{{{ GetOptions("tagbase=s" => \$IkiWiki::config{tagbase}); } #}}} +sub tagpage ($) { #{{{ + my $tag=shift; + + if (exists $IkiWiki::config{tagbase} && + defined $IkiWiki::config{tagbase}) { + $tag=$IkiWiki::config{tagbase}."/".$tag; + } + + return $tag; +} #}}} + sub preprocess (@) { #{{{ if (! @_) { return ""; @@ -34,13 +45,9 @@ sub preprocess (@) { #{{{ $tags{$page} = []; foreach my $tag (keys %params) { - if (exists $IkiWiki::config{tagbase} && - defined $IkiWiki::config{tagbase}) { - $tag=$IkiWiki::config{tagbase}."/".$tag; - } push @{$tags{$page}}, $tag; # hidden WikiLink - push @{$IkiWiki::links{$page}}, $tag; + push @{$IkiWiki::links{$page}}, tagpage($tag); } return ""; @@ -53,9 +60,26 @@ sub pagetemplate (@) { #{{{ my $template=$params{template}; $template->param(tags => [ - map { link => IkiWiki::htmllink($page, $destpage, $_) }, - @{$tags{$page}} + map { + link => IkiWiki::htmllink($page, $destpage, tagpage($_)) + }, @{$tags{$page}} ]) if exists $tags{$page} && @{$tags{$page}} && $template->query(name => "tags"); + + if ($template->query(name => "items")) { + # It's an rss template. Modify each item in the feed, + # adding any categories based on the page for that item. + foreach my $item (@{$template->param("items")}) { + my $p=$item->{page}; + if (exists $tags{$p} && @{$tags{$p}}) { + $item->{categories}=[]; + foreach my $tag (@{$tags{$p}}) { + push @{$item->{categories}}, { + category => $tag, + }; + } + } + } + } } # }}} 1 diff --git a/debian/changelog b/debian/changelog index 2edb343e3..015c16ff1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,8 +3,9 @@ ikiwiki (1.12) UNRELEASED; urgency=low * Add getopt hook type, this allows plugins to add new command-line options. * Add --tagbase option to tag plugin. * Add exclude option in setup files, works same as --exclude. + * Put categories in rss feeds for tagged items. - -- Joey Hess Fri, 28 Jul 2006 13:47:34 -0400 + -- Joey Hess Sat, 29 Jul 2006 02:58:23 -0400 ikiwiki (1.11) unstable; urgency=low diff --git a/doc/features.mdwn b/doc/features.mdwn index 1b09a3274..a43cd1c9a 100644 --- a/doc/features.mdwn +++ b/doc/features.mdwn @@ -54,7 +54,9 @@ Some of ikiwiki's features: * [[tags]] - You can tag pages and use these tags in various ways. + You can tag pages and use these tags in various ways. Tags will show + up in the ways you'd expect, like at the bottom of pages, in blogs, and + in rss feeds. * Fast compiler diff --git a/doc/plugins/tag.mdwn b/doc/plugins/tag.mdwn index 517bbaa37..de89bf4e7 100644 --- a/doc/plugins/tag.mdwn +++ b/doc/plugins/tag.mdwn @@ -4,13 +4,13 @@ This plugin allows tagging pages. List tags as follows: The tags work the same as if you had put a (hidden) [[WikiLink]] on the page for each tag, so you can use a [[GlobList]] to link to all pages that are -tagged with a given tag, for example. +tagged with a given tag, for example. The tags will also show up on blog +entries and at the bottom of the tagged pages, as well as in rss feeds. This plugin has a configuration option. Set --tagbase=tag and all tags will -be located inside a "tag" subdirectory, so in the above example, the tags -are really set to tag/tech, tag/life, and tag/linux. This is a useful way -to avoid having to write the full path to tags, if you want to keep them -grouped together out of the way. +be located inside a "tag" subdirectory, This is a useful way to avoid having +to write the full path to tags, if you want to keep them grouped together out +of the way. This plugin is included in ikiwiki, but is not enabled by default. If it is enabled, you'll see a note below that this page is tagged with the "tags" diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 32a5ce51b..93c6d1d5c 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -107,12 +107,13 @@ languages to ikiwiki. IkiWiki::hook(type => "pagetemplate", id => "foo", call => \&pagetemplate); -Each time a page is rendered, a [[template|templates]] is filled out. -This hook allows modifying that template. The function is passed named -parameters. The "page" and "destpage" parameters are the same as for a -preprocess hook. The "template" parameter is a `HTML::Template` object that -is the template that will be used to generate the page. The function -can manipulate that template object. +Each time a page (or part of a blog page, or an rss feed) is rendered, a +[[template|templates]] is filled out. This hook allows modifying that +template. The function is passed named parameters. The "page" and +"destpage" parameters are the same as for a preprocess hook. The "template" +parameter is a `HTML::Template` object that is the template that will be +used to generate the page. The function can manipulate that template +object. The most common thing to do is probably to call $template->param() to add a new custom parameter to the template. Note that in order to be robust, diff --git a/doc/todo/tags.mdwn b/doc/todo/tags.mdwn index af8502738..7309ee614 100644 --- a/doc/todo/tags.mdwn +++ b/doc/todo/tags.mdwn @@ -1,5 +1,10 @@ Stuff still needing to be done with tags: -* Move the pages they link to into an automatic tag/ namespace? -* Include tag info in the RSS feed. -* Technorati tag support? +* It's unfortunate that the rss category (tag) support doesn't include + a domain="" attribute in the category elements. That would let readers + know how to follow back to the tag page in the wiki. However, the domain + attribute is specified to be the base url, to which the category is just + appended. So there's no way to add ".html", so the url won't be right. + + This is one good argument for changing ikiwiki so that pages are all + dir/index.html, then a link to just "dir" works. diff --git a/templates/rsspage.tmpl b/templates/rsspage.tmpl index 4fe15d491..55b1222ac 100644 --- a/templates/rsspage.tmpl +++ b/templates/rsspage.tmpl @@ -7,12 +7,13 @@ <TMPL_VAR ITEMTITLE ESCAPE=HTML> - - - - + + + + + ]]> -- 2.26.2