X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=IkiWiki%2FPlugin%2Ftag.pm;h=90833fd9c4315cbb7887f9e19c3f3851d76276df;hb=a8d313aba1094fc6d976c9ba3d09f58b768435c5;hp=d439109104a8fd10dfd8ea329d083b4241c42fd0;hpb=678d467a4080dd549f2b6f276f963eac384e1b4f;p=ikiwiki.git diff --git a/IkiWiki/Plugin/tag.pm b/IkiWiki/Plugin/tag.pm index d43910910..90833fd9c 100644 --- a/IkiWiki/Plugin/tag.pm +++ b/IkiWiki/Plugin/tag.pm @@ -36,6 +36,13 @@ sub getsetup () { safe => 1, rebuild => 1, }, + tag_autocreate => { + type => "boolean", + example => 0, + description => "Autocreate new tag pages", + safe => 1, + rebuild => 1, + }, } sub tagpage ($) { @@ -59,6 +66,23 @@ sub taglink ($$$;@) { return htmllink($page, $destpage, tagpage($tag), %opts); } +sub gentag ($) { + my $tag=shift; + if (defined $config{tag_autocreate} && $config{tag_autocreate}) { + my $tagfile = newpagefile(tagpage($tag), $config{default_pageext}); + $tagfile=~s/^\///; + return if (srcfile($tagfile,1)); + + debug(sprintf(gettext("creating tag page %s"), $tag)); + + my $template=template("autotag.tmpl"); + $template->param(tag => $tag); + writefile($tagfile, $config{srcdir}, $template->output); + + IkiWiki::add_autofile("$config{srcdir}/$tagfile"); + } +} + sub preprocess_tag (@) { if (! @_) { return ""; @@ -72,8 +96,12 @@ sub preprocess_tag (@) { foreach my $tag (keys %params) { $tag=linkpage($tag); $tags{$page}{$tag}=1; + + # add tagpage if necessary + gentag($tag); + # hidden WikiLink - push @{$links{$page}}, tagpage($tag); + add_link($page, tagpage($tag)); } return ""; @@ -88,14 +116,14 @@ sub preprocess_taglink (@) { if (/(.*)\|(.*)/) { my $tag=linkpage($2); $tags{$params{page}}{$tag}=1; - push @{$links{$params{page}}}, tagpage($tag); + add_link($params{page}, tagpage($tag)); return taglink($params{page}, $params{destpage}, $tag, linktext => pagetitle($1)); } else { my $tag=linkpage($_); $tags{$params{page}}{$tag}=1; - push @{$links{$params{page}}}, tagpage($tag); + add_link($params{page}, tagpage($tag)); return taglink($params{page}, $params{destpage}, $tag); } } @@ -125,4 +153,12 @@ sub pagetemplate (@) { } } +package IkiWiki::PageSpec; + +sub match_tagged ($$;@) { + my $page = shift; + my $glob = shift; + return match_link($page, IkiWiki::Plugin::tag::tagpage($glob)); +} + 1