comments: Fix anchor ids to be legal xhtml. Closes: #521339
authorJoey Hess <joey@gnu.kitenet.net>
Thu, 26 Mar 2009 20:45:53 +0000 (16:45 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Thu, 26 Mar 2009 20:45:53 +0000 (16:45 -0400)
Well, that was a PITA.

Luckily, this doesn't break guids to comments in rss feeds,
though it does change the links.

I haven't put in a warning about needing to rebuild to get
this fix. It's probably good enough for new comments to get the
fix, without a lot of mass rebuilding.

IkiWiki/Plugin/comments.pm
debian/changelog
templates/comment.tmpl

index 5782d90834c70546f0c19cc40c400a2bc5e799ff..2ad422f5f678028c83bfe3a9fbc68e7528135414 100644 (file)
@@ -224,7 +224,7 @@ sub preprocess {
 
        if ($params{page} =~ m/\/(\Q$config{comments_pagename}\E\d+)$/) {
                $pagestate{$page}{meta}{permalink} = urlto(IkiWiki::dirname($params{page}), undef, 1).
-                       "#".$params{page};
+                       "#".page_to_id($params{page});
        }
 
        eval q{use Date::Parse};
@@ -490,7 +490,8 @@ sub editcomment ($$) {
                # Jump to the new comment on the page.
                # The trailing question mark tries to avoid broken
                # caches and get the most recent version of the page.
-               IkiWiki::redirect($cgi, urlto($page, undef, 1)."?updated#$location");
+               IkiWiki::redirect($cgi, urlto($page, undef, 1).
+                       "?updated#".page_to_id($location));
 
        }
        else {
@@ -759,6 +760,10 @@ sub pagetemplate (@) {
        if (!exists $commentstate{$page}) {
                return;
        }
+       
+       if ($template->query(name => 'commentid')) {
+               $template->param(commentid => page_to_id($page));
+       }
 
        if ($template->query(name => 'commentuser')) {
                $template->param(commentuser =>
@@ -808,6 +813,21 @@ sub unique_comment_location ($) {
        return $location;
 }
 
+sub page_to_id ($) {
+       # Converts a comment page name into a unique, legal html id
+       # addtibute value, that can be used as an anchor to link to the
+       # comment.
+       my $page=shift;
+
+       # It needs to start with a letter.
+       $page="comment_".$page;
+
+       # Encode any illegal characters.
+       $page=~s/([^A-Za-z0-9-_:.])/"__".ord($1)."__"/eg;
+
+       return $page;
+}
+       
 package IkiWiki::PageSpec;
 
 sub match_postcomment ($$;@) {
index 4ba32c8d628bbbcf49e3c78d8b9446b588e69e13..158db9a4d89f81163d80df37625908fee9b35ff6 100644 (file)
@@ -9,6 +9,7 @@ ikiwiki (3.09) UNRELEASED; urgency=low
   * css: Add clear: both to inlinefooter.
   * comments: Fix too loose test for comments pages that matched
     normal pages with "comment_" in their name. Closes: #521322
+  * comments: Fix anchor ids to be legal xhtml. Closes: #521339
 
  -- Joey Hess <joeyh@debian.org>  Thu, 19 Mar 2009 15:32:49 -0400
 
index 1b9064ea0d006c48d2a54af0e5afd62ee4743ee0..fb76ea00494880863a8973b1942ae11a2e4e5a87 100644 (file)
@@ -1,4 +1,4 @@
-<div class="comment" id="<TMPL_VAR NAME=INLINEPAGE>">
+<div class="comment" id="<TMPL_VAR NAME=COMMENTID>">
 
 <div class="comment-subject">
 <TMPL_IF PERMALINK>