X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/9f401d6617a11efcedda1c956b2ccea061a7540f..f4262696ad9250ca14ba89849270dfeb3518c38d:/IkiWiki/Plugin/comments.pm diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm old mode 100644 new mode 100755 index d34951570..fcce6c5a6 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -22,6 +22,7 @@ sub import { hook(type => "checkconfig", id => 'comments', call => \&checkconfig); hook(type => "getsetup", id => 'comments', call => \&getsetup); hook(type => "preprocess", id => 'comment', call => \&preprocess); + hook(type => "preprocess", id => 'commentmoderation', call => \&preprocess_moderation); # here for backwards compatability with old comments hook(type => "preprocess", id => '_comment', call => \&preprocess); hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi); @@ -142,8 +143,6 @@ sub preprocess { } $content =~ s/\\"/"/g; - $content = IkiWiki::filter($page, $params{destpage}, $content); - if ($config{comments_allowdirectives}) { $content = IkiWiki::preprocess($page, $params{destpage}, $content); @@ -168,6 +167,7 @@ sub preprocess { my $commentip; my $commentauthor; my $commentauthorurl; + my $commentauthoravatar; my $commentopenid; if (defined $params{username}) { $commentuser = $params{username}; @@ -188,6 +188,21 @@ sub preprocess { $commentauthor = $commentuser; } + + eval q{use Libravatar::URL}; + if (! $@) { + if (defined $commentopenid) { + eval { + $commentauthoravatar = libravatar_url(openid => $commentopenid, https => $ENV{HTTPS}); + } + } + if (! defined $commentauthoravatar && + (my $email = IkiWiki::userinfo_get($commentuser, 'email'))) { + eval { + $commentauthoravatar = libravatar_url(email => $email, https => $ENV{HTTPS}); + } + } + } } else { if (defined $params{ip}) { @@ -201,6 +216,7 @@ sub preprocess { $commentstate{$page}{commentip} = $commentip; $commentstate{$page}{commentauthor} = $commentauthor; $commentstate{$page}{commentauthorurl} = $commentauthorurl; + $commentstate{$page}{commentauthoravatar} = $commentauthoravatar; if (! defined $pagestate{$page}{meta}{author}) { $pagestate{$page}{meta}{author} = $commentauthor; } @@ -217,7 +233,7 @@ sub preprocess { my $url=$params{url}; eval q{use URI::Heuristic}; - if (! $@) { + if (! $@) { $url=URI::Heuristic::uf_uristr($url); } @@ -238,7 +254,7 @@ sub preprocess { } if ($params{page} =~ m/\/\Q$config{comments_pagename}\E\d+_/) { - $pagestate{$page}{meta}{permalink} = urlto(IkiWiki::dirname($params{page}), undef, 1). + $pagestate{$page}{meta}{permalink} = urlto(IkiWiki::dirname($params{page})). "#".page_to_id($params{page}); } @@ -251,6 +267,22 @@ sub preprocess { return $content; } +sub preprocess_moderation { + my %params = @_; + + $params{desc}=gettext("Comment Moderation") + unless defined $params{desc}; + + if (length $config{cgiurl}) { + return ''.$params{desc}.''; + } + else { + return $params{desc}; + } +} + sub sessioncgi ($$) { my $cgi=shift; my $session=shift; @@ -286,7 +318,7 @@ sub editcomment ($$) { required => [qw{editcontent}], javascript => 0, params => $cgi, - action => $config{cgiurl}, + action => IkiWiki::cgiurl(), header => 0, table => 0, template => { template('editcomment.tmpl') }, @@ -349,18 +381,16 @@ sub editcomment ($$) { } # The untaint is OK (as in editpage) because we're about to pass - # it to file_pruned anyway - my $page = $form->field('page'); + # it to file_pruned and wiki_file_regexp anyway. + my ($page) = $form->field('page')=~/$config{wiki_file_regexp}/; $page = IkiWiki::possibly_foolish_untaint($page); if (! defined $page || ! length $page || IkiWiki::file_pruned($page)) { error(gettext("bad page name")); } - my $baseurl = urlto($page, undef, 1); - $form->title(sprintf(gettext("commenting on %s"), - IkiWiki::pagetitle($page))); + IkiWiki::pagetitle(IkiWiki::basename($page)))); $form->tmpl_param('helponformattinglink', htmllink($page, $page, 'ikiwiki/formatting', @@ -370,8 +400,7 @@ sub editcomment ($$) { if ($form->submitted eq CANCEL) { # bounce back to the page they wanted to comment on, and exit. - # CANCEL need not be considered in future - IkiWiki::redirect($cgi, urlto($page, undef, 1)); + IkiWiki::redirect($cgi, urlto($page)); exit; } @@ -492,7 +521,7 @@ sub editcomment ($$) { IkiWiki::saveindex(); IkiWiki::printheader($session); - print IkiWiki::misctemplate(gettext(gettext("comment stored for moderation")), + print IkiWiki::cgitemplate($cgi, gettext(gettext("comment stored for moderation")), "

". gettext("Your comment will be posted after moderator review"). "

"); @@ -537,13 +566,13 @@ 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). + IkiWiki::redirect($cgi, urlto($page). "?updated#".page_to_id($location)); } else { - IkiWiki::showform ($form, \@buttons, $session, $cgi, - forcebaseurl => $baseurl, page => $page); + IkiWiki::showform($form, \@buttons, $session, $cgi, + page => $page); } exit; @@ -569,6 +598,7 @@ sub commentmoderation ($$) { my $added=0; foreach my $id (keys %vars) { if ($id =~ /(.*)\._comment(?:_pending)?$/) { + $id=decode_utf8($id); my $action=$cgi->param($id); next if $action eq 'Defer' && ! $rejectalldefer; @@ -640,13 +670,14 @@ sub commentmoderation ($$) { $template->param( sid => $session->id, comments => \@comments, + cgiurl => IkiWiki::cgiurl(), ); IkiWiki::printheader($session); my $out=$template->output; IkiWiki::run_hooks(format => sub { $out = shift->(page => "", content => $out); }); - print IkiWiki::misctemplate(gettext("comment moderation"), $out); + print IkiWiki::cgitemplate($cgi, gettext("comment moderation"), $out); exit; } @@ -711,6 +742,10 @@ sub previewcomment ($$$) { my $page=shift; my $time=shift; + # Previewing a comment should implicitly enable comment posting mode. + my $oldpostcomment=$postcomment; + $postcomment=1; + my $preview = IkiWiki::htmlize($location, $page, '_comment', IkiWiki::linkify($location, $page, IkiWiki::preprocess($location, $page, @@ -729,16 +764,16 @@ sub previewcomment ($$$) { $template->param(have_actions => 0); + $postcomment=$oldpostcomment; + return $template->output; } sub commentsshown ($) { my $page=shift; - return ! pagespec_match($page, "comment(*)", - location => $page) && - pagespec_match($page, $config{comments_pagespec}, - location => $page); + return pagespec_match($page, $config{comments_pagespec}, + location => $page); } sub commentsopen ($) { @@ -765,7 +800,7 @@ sub pagetemplate (@) { my $comments = undef; if ($shown) { $comments = IkiWiki::preprocess_inline( - pages => "comment($page)", + pages => "comment($page) and !comment($page/*)", template => 'comment', show => 0, reverse => 'yes', @@ -788,14 +823,14 @@ sub pagetemplate (@) { if ($shown) { if ($template->query(name => 'commentsurl')) { $template->param(commentsurl => - urlto($page, undef, 1).'#comments'); + urlto($page).'#comments'); } 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'); + urlto($page).'comments.atom'); } if ($template->query(name => 'commentslink')) { @@ -856,6 +891,11 @@ sub pagetemplate (@) { $commentstate{$page}{commentauthorurl}); } + if ($template->query(name => 'commentauthoravatar')) { + $template->param(commentauthoravatar => + $commentstate{$page}{commentauthoravatar}); + } + if ($template->query(name => 'removeurl') && IkiWiki::Plugin::remove->can("check_canremove") && length $config{cgiurl}) { @@ -925,14 +965,16 @@ sub match_comment ($$;@) { my $page = shift; my $glob = shift; - # To see if it's a comment, check the source file type. - # Deal with comments that were just deleted. - my $source=exists $IkiWiki::pagesources{$page} ? - $IkiWiki::pagesources{$page} : - $IkiWiki::delpagesources{$page}; - my $type=defined $source ? IkiWiki::pagetype($source) : undef; - if (! defined $type || $type ne "_comment") { - return IkiWiki::FailReason->new("$page is not a comment"); + if (! $postcomment) { + # To see if it's a comment, check the source file type. + # Deal with comments that were just deleted. + my $source=exists $IkiWiki::pagesources{$page} ? + $IkiWiki::pagesources{$page} : + $IkiWiki::delpagesources{$page}; + my $type=defined $source ? IkiWiki::pagetype($source) : undef; + if (! defined $type || $type ne "_comment") { + return IkiWiki::FailReason->new("$page is not a comment"); + } } return match_glob($page, "$glob/*", internal => 1, @_);