* Put categories in rss feeds for tagged items.

master
joey 2006-07-29 07:25:17 +00:00
parent a0653933d3
commit 267f98e2e1
8 changed files with 72 additions and 28 deletions

View 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;
} #}}}

View 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

3
debian/changelog vendored
View 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

View 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

View 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"

View 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,

View 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.

View 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>