From: joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Date: Sat, 29 Jul 2006 07:25:17 +0000 (+0000)
Subject: * Put categories in rss feeds for tagged items.
X-Git-Tag: 1.12~22
X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=267f98e2e116739872cafc6bb712280c31376705;p=ikiwiki.git

* Put categories in rss feeds for tagged items.
---

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 <joeyh@debian.org>  Fri, 28 Jul 2006 13:47:34 -0400
+ -- Joey Hess <joeyh@debian.org>  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_LOOP NAME="ITEMS">
 		<item>
 			<title><TMPL_VAR ITEMTITLE ESCAPE=HTML></title>
-			<TMPL_IF NAME="ITEMGUID">
-			<guid isPermaLink="false"><TMPL_VAR ITEMGUID></guid>
-			<TMPL_ELSE>
 			<guid><TMPL_VAR ITEMURL></guid>
-			</TMPL_IF>
 			<link><TMPL_VAR ITEMURL></link>
+			<TMPL_IF NAME="CATEGORIES">
+			<TMPL_LOOP NAME="CATEGORIES">
+			<category><TMPL_VAR NAME=CATEGORY></category>
+			</TMPL_LOOP>
+			</TMPL_IF>
 			<pubDate><TMPL_VAR ITEMPUBDATE></pubDate>
 			<description><![CDATA[<TMPL_VAR ITEMCONTENT>]]></description>
 		</item>