* Put categories in rss feeds for tagged items.
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Sat, 29 Jul 2006 07:25:17 +0000 (07:25 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Sat, 29 Jul 2006 07:25:17 +0000 (07:25 +0000)
IkiWiki/Plugin/inline.pm
IkiWiki/Plugin/tag.pm
debian/changelog
doc/features.mdwn
doc/plugins/tag.mdwn
doc/plugins/write.mdwn
doc/todo/tags.mdwn
templates/rsspage.tmpl

index 06c4a37..1ea347b 100644 (file)
@@ -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;
 } #}}}
 
index 289b48b..2aa70d4 100644 (file)
@@ -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
index 2edb343..015c16f 100644 (file)
@@ -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
 
index 1b09a32..a43cd1c 100644 (file)
@@ -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
 
index 517bbaa..de89bf4 100644 (file)
@@ -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"
index 32a5ce5..93c6d1d 100644 (file)
@@ -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,
index af85027..7309ee6 100644 (file)
@@ -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.
index 4fe15d4..55b1222 100644 (file)
@@ -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>