aboutsummaryrefslogtreecommitdiff
path: root/doc/todo/auto-create_tag_pages_according_to_a_template.mdwn
blob: f1d33114ff7518b6e0eab6af2601cbfa8930da99 (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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 plugins/tag patch]]

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.