]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/comments.pm
update
[git.ikiwiki.info.git] / IkiWiki / Plugin / comments.pm
index caed0d58c5e05fedc70a7a480a5247e728c83b69..58bd4b851d9434ea142e21e9d8262d9ceb72b444 100644 (file)
@@ -38,6 +38,7 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => 1,
                plugin => {
                        safe => 1,
                        rebuild => 1,
+                       section => "web",
                },
                comments_pagespec => {
                        type => 'pagespec',
                },
                comments_pagespec => {
                        type => 'pagespec',
@@ -220,7 +221,9 @@ sub preprocess {
        }
 
        if (defined $params{subject}) {
        }
 
        if (defined $params{subject}) {
-               $pagestate{$page}{meta}{title} = $params{subject};
+               # decode title the same way meta does
+               eval q{use HTML::Entities};
+               $pagestate{$page}{meta}{title} = decode_entities($params{subject});
        }
 
        if ($params{page} =~ m/\/\Q$config{comments_pagename}\E\d+_/) {
        }
 
        if ($params{page} =~ m/\/\Q$config{comments_pagename}\E\d+_/) {
@@ -335,7 +338,7 @@ sub editcomment ($$) {
        my $page = $form->field('page');
        $page = IkiWiki::possibly_foolish_untaint($page);
        if (! defined $page || ! length $page ||
        my $page = $form->field('page');
        $page = IkiWiki::possibly_foolish_untaint($page);
        if (! defined $page || ! length $page ||
-               IkiWiki::file_pruned($page, $config{srcdir})) {
+               IkiWiki::file_pruned($page)) {
                error(gettext("bad page name"));
        }
 
                error(gettext("bad page name"));
        }
 
@@ -545,7 +548,7 @@ sub commentmoderation ($$) {
                                # pending comment before untainting.
                                my ($f)= $id =~ /$config{wiki_file_regexp}/;
                                if (! defined $f || ! length $f ||
                                # pending comment before untainting.
                                my ($f)= $id =~ /$config{wiki_file_regexp}/;
                                if (! defined $f || ! length $f ||
-                                   IkiWiki::file_pruned($f, $config{srcdir})) {
+                                   IkiWiki::file_pruned($f)) {
                                        error("illegal file");
                                }
 
                                        error("illegal file");
                                }
 
@@ -641,18 +644,14 @@ sub comments_pending () {
        find({
                no_chdir => 1,
                wanted => sub {
        find({
                no_chdir => 1,
                wanted => sub {
-                       $_=decode_utf8($_);
-                       if (IkiWiki::file_pruned($_, $dir)) {
-                               $File::Find::prune=1;
-                       }
-                       elsif (! -l $_ && ! -d _) {
-                               $File::Find::prune=0;
-                               my ($f)=/$config{wiki_file_regexp}/; # untaint
-                               if (defined $f && $f =~ /\Q._comment\E$/) {
-                                       my $ctime=(stat($f))[10];
-                                       $f=~s/^\Q$dir\E\/?//;
-                                        push @ret, [$f, $ctime];
-                               }
+                       my $file=decode_utf8($_);
+                       $file=~s/^\Q$dir\E\/?//;
+                       return if ! length $file || IkiWiki::file_pruned($file)
+                               || -l $_ || -d _ || $file !~ /\Q._comment\E$/;
+                       my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
+                       if (defined $f) {
+                               my $ctime=(stat($_))[10];
+                               push @ret, [$f, $ctime];
                        }
                }
        }, $dir);
                        }
                }
        }, $dir);
@@ -735,39 +734,43 @@ sub pagetemplate (@) {
                }
 
                if ($shown && commentsopen($page)) {
                }
 
                if ($shown && commentsopen($page)) {
-                       my $addcommenturl = IkiWiki::cgiurl(do => 'comment',
-                               page => $page);
-                       $template->param(addcommenturl => $addcommenturl);
+                       $template->param(addcommenturl => addcommenturl($page));
                }
        }
 
                }
        }
 
-       if ($template->query(name => 'commentsurl')) {
-               if ($shown) {
+       if ($shown) {
+               if ($template->query(name => 'commentsurl')) {
                        $template->param(commentsurl =>
                                urlto($page, undef, 1).'#comments');
                }
                        $template->param(commentsurl =>
                                urlto($page, undef, 1).'#comments');
                }
-       }
 
 
-       if ($template->query(name => 'atomcommentsurl') && $config{usedirs}) {
-               if ($shown) {
+               if ($template->query(name => 'atomcommentsurl') && $config{usedirs}) {
                        # This will 404 until there are some comments, but I
                        # think that's probably OK...
                        $template->param(atomcommentsurl =>
                                urlto($page, undef, 1).'comments.atom');
                }
                        # This will 404 until there are some comments, but I
                        # think that's probably OK...
                        $template->param(atomcommentsurl =>
                                urlto($page, undef, 1).'comments.atom');
                }
-       }
 
 
-       if ($template->query(name => 'commentslink')) {
-               # XXX Would be nice to say how many comments there are in
-               # the link. But, to update the number, blog pages
-               # would have to update whenever comments of any inlines
-               # page are added, which is not currently done.
-               if ($shown) {
-                       $template->param(commentslink =>
-                               htmllink($page, $params{destpage}, $page,
-                                       linktext => gettext("Comments"),
+               if ($template->query(name => 'commentslink')) {
+                       my $num=num_comments($page, $config{srcdir});
+                       my $link;
+                       if ($num > 0) {
+                               $link = htmllink($page, $params{destpage}, $page,
+                                       linktext => sprintf(ngettext("%i comment", "%i comments", $num), $num),
                                        anchor => "comments",
                                        anchor => "comments",
-                                       noimageinline => 1));
+                                       noimageinline => 1
+                               );
+                       }
+                       elsif (commentsopen($page)) {
+                               $link = "<a href=\"".addcommenturl($page)."\">".
+                                       #translators: Here "Comment" is a verb;
+                                       #translators: the user clicks on it to
+                                       #translators: post a comment.
+                                       gettext("Comment").
+                                       "</a>";
+                       }
+                       $template->param(commentslink => $link)
+                               if defined $link;
                }
        }
 
                }
        }
 
@@ -815,6 +818,12 @@ sub pagetemplate (@) {
        }
 }
 
        }
 }
 
+sub addcommenturl ($) {
+       my $page=shift;
+
+       return IkiWiki::cgiurl(do => 'comment', page => $page);
+}
+
 sub num_comments ($$) {
        my $page=shift;
        my $dir=shift;
 sub num_comments ($$) {
        my $page=shift;
        my $dir=shift;
@@ -828,7 +837,7 @@ sub unique_comment_location ($$$) {
 
        eval q{use Digest::MD5 'md5_hex'};
        error($@) if $@;
 
        eval q{use Digest::MD5 'md5_hex'};
        error($@) if $@;
-       my $content_md5=md5_hex(shift);
+       my $content_md5=md5_hex(Encode::encode_utf8(shift));
 
        my $dir=shift;
 
 
        my $dir=shift;
 
@@ -844,14 +853,14 @@ sub unique_comment_location ($$$) {
 
 sub page_to_id ($) {
        # Converts a comment page name into a unique, legal html id
 
 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
+       # attribute value, that can be used as an anchor to link to the
        # comment.
        my $page=shift;
 
        eval q{use Digest::MD5 'md5_hex'};
        error($@) if $@;
 
        # comment.
        my $page=shift;
 
        eval q{use Digest::MD5 'md5_hex'};
        error($@) if $@;
 
-       return "comment-".md5_hex($page);
+       return "comment-".md5_hex(Encode::encode_utf8(($page)));
 }
        
 package IkiWiki::PageSpec;
 }
        
 package IkiWiki::PageSpec;