I'd like to modify this plugin such that the tag pages are automatically created and populated with a list of relevant posts. The content of the tag page is simply `"\[[!inline pages="link(tag/$tag)"]]`. The tag plugin will have to determine whether a page for the given tag already exists, and if not use that Markdown fragment to generate it. There are clearly many ways to do this, but any opinions on which is the cleanest? --Ben It might work to use the 'change' hook, since that's called at the very end of `refresh()`. The hook could add the tag pages and re-run `refresh()`, taking appropriate care to avoid looping forever. --[[Joey]] Thanks. That works fine. --Ben @Ben: could you publish the code for that? --David Riebenbauer AOLMODE=true echo "I too would really like this feature, which would make cgi free life much better" --[[DavidBremner]] Please make the actual text used a template some way or another. I may want `map` instead of `inline`. --[[madduck]] --- I have create a patch to tag.pm for add the option for auto create tag pages. A new setting is used to enable or disable auto-create tag pages, `tag_autocreate`. The new tag file is created during the preprocess phase. The new tag file is then complied during the change phase. --- tag.pm 2009-02-06 10:26:03.000000000 -0700 +++ tag_new.pm 2009-02-06 12:17:19.000000000 -0700 @@ -14,6 +14,7 @@ hook(type => "preprocess", id => "tag", call => \&preprocess_tag, scan => 1); hook(type => "preprocess", id => "taglink", call => \&preprocess_taglink, scan => 1); hook(type => "pagetemplate", id => "tag", call => \&pagetemplate); + hook(type => "change", id => "tag", call => \&change); } sub getopt () { @@ -36,6 +37,36 @@ safe => 1, rebuild => 1, }, + tag_autocreate => { + type => "boolean", + example => 0, + description => "Auto-create the new tag pages, uses autotagpage.tmpl ", + safe => 1, + rebulid => 1, + }, +} + +my $autocreated_page = 0; + +sub gen_tag_page($) { + my $tag=shift; + + my $tag_file=$tag.'.'.$config{default_pageext}; + return if (-f $config{srcdir}.$tag_file); + + my $template=template("autotagpage.tmpl"); + $template->param(tag => $tag); + writefile($tag_file, $config{srcdir}, $template->output); + $autocreated_page = 1; + + if ($config{rcs}) { + IkiWiki::disable_commit_hook(); + IkiWiki::rcs_add($tag_file); + IkiWiki::rcs_commit_staged( + gettext("Automatic tag page generation"), + undef, undef); + IkiWiki::enable_commit_hook(); + } } sub tagpage ($) { @@ -47,6 +78,10 @@ $tag=~y#/#/#s; # squash dups } + if (defined $config{tag_autocreate} && $config{tag_autocreate} ) { + gen_tag_page($tag); + } + return $tag; } @@ -125,4 +160,18 @@ } } +sub change(@) { + return unless($autocreated_page); + $autocreated_page = 0; + + # This refresh/saveindex is to complie the autocreated tag pages + IkiWiki::refresh(); + IkiWiki::saveindex(); + + # This refresh/saveindex is to fix the Tags link + # With out this additional refresh/saveindex the tag link displays ?tag + IkiWiki::refresh(); + IkiWiki::saveindex(); +} + This uses a template called `autotagpage.tmpl`, here is my template file: \[[!inline pages="link()" archive="yes"]] A quirk I have not figured out is during the `sub change`, see my comments in the code. I am not sure if that is the best way to handle it. [[!tag patch]] -- Jeremy Schultz