tag name sanitation
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Tue, 4 Jan 2011 18:26:21 +0000 (19:26 +0100)
committerJoey Hess <joey@kitenet.net>
Tue, 4 Jan 2011 19:58:42 +0000 (15:58 -0400)
The use of typed links for tags and some of the consequent changes
introduced some unwanted functionality variations in the tag system. Two
problems in particular could be observed, when compared to the use of
tags in older versions of IkiWiki:

* tags in feeds (both rss and atom) would use the file path as their
  name (e.g. you would have <category term="tags/sometag" /> in an atom
  item for a page tagged sometag with a tagbase of tags), whereas they
  appeared pure before
* tags containing a slash character would appear without the slash
  character but be used with the slash character in other circumstances
  (effect visible by tagging a page with a name such as "with/slash")

Both of these issues are fixed by introducing a tagname() function that
takes a tag link and effectively reverses (as well as possible) the
effects of taglink().

A possible alternative route would have been the reintroduction of the
global %tags hash, but the new approach as the (arguable) benefit of
introducing a small layer of sanitation for tag names.

IkiWiki/Plugin/tag.pm

index 55064a9a3cef72c92f3ebc3cb43fa9ef7646d256..9897efc08027c958afc89dbd9789c531b09b6ec1 100644 (file)
@@ -55,6 +55,17 @@ sub taglink ($) {
        return $tag;
 }
 
+# Returns a tag name from a tag link
+sub tagname ($) {
+       my $tag=shift;
+       if (defined $config{tagbase}) {
+               $tag =~ s!^/$config{tagbase}/!!;
+       } else {
+               $tag =~ s!^\.?/?!!;
+       }
+       return $tag;
+}
+
 sub htmllink_tag ($$$;@) {
        my $page=shift;
        my $destpage=shift;
@@ -84,7 +95,7 @@ sub gentag ($) {
                        debug($message);
 
                        my $template=template("autotag.tmpl");
-                       $template->param(tagname => IkiWiki::basename($tag));
+                       $template->param(tagname => tagname($tag));
                        $template->param(tag => $tag);
                        writefile($tagfile, $config{srcdir}, $template->output);
                        if ($config{rcs}) {
@@ -154,14 +165,15 @@ sub pagetemplate (@) {
 
        $template->param(tags => [
                map { 
-                       link => htmllink_tag($page, $destpage, $_, rel => "tag")
+                       link => htmllink_tag($page, $destpage, $_,
+                                       rel => "tag", linktext => tagname($_))
                }, sort keys %$tags
        ]) if defined $tags && %$tags && $template->query(name => "tags");
 
        if ($template->query(name => "categories")) {
                # It's an rss/atom template. Add any categories.
                if (defined $tags && %$tags) {
-                       $template->param(categories => [map { category => $_ },
+                       $template->param(categories => [map { category => tagname($_) },
                                sort keys %$tags]);
                }
        }