aboutsummaryrefslogtreecommitdiff
path: root/doc/todo/auto-create_tag_pages_according_to_a_template.mdwn
blob: ab92635565a9b8c303455f3d624e1f8d5c032523 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
It would be great if I could tell ikiwiki to automatically instantiate pages for each tag, 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 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 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>