]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/comments.pm
Fix permalinks to recentchanges items and comments, broken by last release.
[ikiwiki.git] / IkiWiki / Plugin / comments.pm
index d34951570da77d1f9a423b874d362bd1b800aec8..cdb9262710bd4f86ef4ded3e36833331dcce9d82 100644 (file)
@@ -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);
@@ -251,6 +250,22 @@ sub preprocess {
        return $content;
 }
 
+sub preprocess_moderation {
+       my %params = @_;
+
+       $params{desc}=gettext("Comment Moderation")
+               unless defined $params{desc};
+
+       if (length $config{cgiurl}) {
+               return '<a href="'.
+                       IkiWiki::cgiurl(do => 'commentmoderation').
+                       '">'.$params{desc}.'</a>';
+       }
+       else {
+               return $params{desc};
+       }
+}
+
 sub sessioncgi ($$) {
        my $cgi=shift;
        my $session=shift;
@@ -286,7 +301,7 @@ sub editcomment ($$) {
                required => [qw{editcontent}],
                javascript => 0,
                params => $cgi,
-               action => $config{cgiurl},
+               action => IkiWiki::cgiurl(),
                header => 0,
                table => 0,
                template => { template('editcomment.tmpl') },
@@ -357,10 +372,8 @@ sub editcomment ($$) {
                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 +383,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;
        }
 
@@ -537,13 +549,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_preview($form, \@buttons, $session, $cgi,
+                       page => $page);
        }
 
        exit;
@@ -569,6 +581,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,6 +653,7 @@ sub commentmoderation ($$) {
        $template->param(
                sid => $session->id,
                comments => \@comments,
+               cgiurl => IkiWiki::cgiurl(),
        );
        IkiWiki::printheader($session);
        my $out=$template->output;
@@ -711,6 +725,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,6 +747,8 @@ sub previewcomment ($$$) {
 
        $template->param(have_actions => 0);
 
+       $postcomment=$oldpostcomment;
+
        return $template->output;
 }
 
@@ -788,14 +808,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')) {
@@ -925,14 +945,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, @_);