summaryrefslogtreecommitdiff
path: root/doc/todo/auto-create_tag_pages_according_to_a_template.mdwn
blob: f60fc3d6e31a934dd70af9452aa40683d79b3457 (plain)

It would be great if I could tell ikiwiki to automatically instantiate pages for each [[tag|/tags]], according to a template, especially when $tagbase is set.

Tags are mainly specific to the object to which they’re stuck. However, I often use them the other way around, too: as concepts. And sometimes I’d like to see all pages related to a given concept (“tagged with a given tag”). The only way to do this with ikiwiki is to instantiate a page for each tag and slap a map on it. This is quite tedious and I’d really love to see Ikiwiki do so by default for all tags.

Also see: http://madduck.net/blog/2008.01.06:new-blog/ and http://users.itk.ppke.hu/~cstamas/code/ikiwiki/autocreatetagpage/

[[!tag wishlist]]

I would love to see this as well. -- dato


I have create a patch to [[tag.pm|plugins/tag]] 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 from version 3.01

--- 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|wikitemplates]] called autotagpage.tmpl, here is my template file:

\[[!inline pages="link(<TMPL_VAR TAG>)" 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 jeremy.schultz@uleth.ca

No, this doesn't help:

+       # This refresh/saveindex is to fix the Tags link
+       # With out this additional refresh/saveindex the tag link displays ?tag
+       IkiWiki::refresh();
+       IkiWiki::saveindex();

On the second extra pass, it doesn't notice that it has to update the "?"-link. If I run ikiwiki once more, it is updated. I don't know yet how this should be fixed, because I don't know the internals of ikiwiki well enough. Something inhibits detecting the need to update in refresh() in Render.pm; perhaps, this condition:

	if (! $pagemtime{$page}) {
               ...
			push @add, $file;
               ...
            }

is not satisfied for the newly created tag page. I shall put debug msgs into Render.pm to find out better how it works. --Ivan Z.