X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/8e92468eae9ac0ab8161a0c71ff6c6a0a8aef07a..628a52a6c49f5d2fc5af251f2d718c8dff5e8ed5:/IkiWiki/Plugin/comments.pm?ds=inline

diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index 98f9f8b3d..5586cca52 100644
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -21,6 +21,8 @@ my %commentstate;
 sub import {
 	hook(type => "checkconfig", id => 'comments',  call => \&checkconfig);
 	hook(type => "getsetup", id => 'comments',  call => \&getsetup);
+	hook(type => "preprocess", id => 'comment', call => \&preprocess);
+	# here for backwards compatability with old comments
 	hook(type => "preprocess", id => '_comment', call => \&preprocess);
 	hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi);
 	hook(type => "htmlize", id => "_comment", call => \&htmlize);
@@ -222,7 +224,7 @@ sub preprocess {
 		$pagestate{$page}{meta}{title} = $params{subject};
 	}
 
-	if ($params{page} =~ m/\/(\Q$config{comments_pagename}\E\d+)$/) {
+	if ($params{page} =~ m/\/\Q$config{comments_pagename}\E\d+_/) {
 		$pagestate{$page}{meta}{permalink} = urlto(IkiWiki::dirname($params{page}), undef, 1).
 			"#".page_to_id($params{page});
 	}
@@ -287,10 +289,15 @@ sub editcomment ($$) {
 	else {
 		$type = $config{default_pageext};
 	}
+
+
 	my @page_types;
 	if (exists $IkiWiki::hooks{htmlize}) {
-		@page_types = grep { ! /^_/ } keys %{$IkiWiki::hooks{htmlize}};
+		foreach my $key (grep { !/^_/ } keys %{$IkiWiki::hooks{htmlize}}) {
+			push @page_types, [$key, $IkiWiki::hooks{htmlize}{$key}{longname} || $key];
+		}
 	}
+	@page_types=sort @page_types;
 
 	$form->field(name => 'do', type => 'hidden');
 	$form->field(name => 'sid', type => 'hidden', value => $session->id,
@@ -317,6 +324,13 @@ sub editcomment ($$) {
 			force => 1);
 	}
 
+	if (! defined $session->param('name')) {
+		# Make signinurl work and return here.
+		$form->tmpl_param(signinurl => IkiWiki::cgiurl(do => 'signin'));
+		$session->param(postsignin => $ENV{QUERY_STRING});
+		IkiWiki::cgi_savesession($session);
+	}
+
 	# The untaint is OK (as in editpage) because we're about to pass
 	# it to file_pruned anyway
 	my $page = $form->field('page');
@@ -363,9 +377,7 @@ sub editcomment ($$) {
 	IkiWiki::check_canedit($page, $cgi, $session);
 	$postcomment=0;
 
-	my $location=unique_comment_location($page, $config{srcdir});
-
-	my $content = "[[!_comment format=$type\n";
+	my $content = "[[!comment format=$type\n";
 
 	# FIXME: handling of double quotes probably wrong?
 	if (defined $session->param('name')) {
@@ -396,8 +408,11 @@ sub editcomment ($$) {
 	my $subject = $form->field('subject');
 	if (defined $subject && length $subject) {
 		$subject =~ s/"/"/g;
-		$content .= " subject=\"$subject\"\n";
 	}
+	else {
+		$subject = "comment ".(num_comments($page, $config{srcdir}) + 1);
+	}
+	$content .= " subject=\"$subject\"\n";
 
 	$content .= " date=\"" . decode_utf8(strftime('%Y-%m-%dT%H:%M:%SZ', gmtime)) . "\"\n";
 
@@ -407,6 +422,8 @@ sub editcomment ($$) {
 	$editcontent =~ s/"/\\"/g;
 	$content .= " content=\"\"\"\n$editcontent\n\"\"\"]]\n";
 
+	my $location=unique_comment_location($page, $content, $config{srcdir});
+
 	# This is essentially a simplified version of editpage:
 	# - the user does not control the page that's created, only the parent
 	# - it's always a create operation, never an edit
@@ -444,7 +461,7 @@ sub editcomment ($$) {
 
 		if (! $ok) {
 			my $penddir=$config{wikistatedir}."/comments_pending";
-			$location=unique_comment_location($page, $penddir);
+			$location=unique_comment_location($page, $content, $penddir);
 			writefile("$location._comment", $penddir, $content);
 			IkiWiki::printheader($session);
 			print IkiWiki::misctemplate(gettext(gettext("comment stored for moderation")),
@@ -540,7 +557,7 @@ sub commentmoderation ($$) {
 				if ($action eq 'Accept') {
 					my $content=eval { readfile($file) };
 					next if $@; # file vanished since form was displayed
-					my $dest=unique_comment_location($page, $config{srcdir})."._comment";
+					my $dest=unique_comment_location($page, $content, $config{srcdir})."._comment";
 					writefile($dest, $config{srcdir}, $content);
 					if ($config{rcs} and $config{comments_commit}) {
 						IkiWiki::rcs_add($dest);
@@ -799,15 +816,28 @@ sub pagetemplate (@) {
 	}
 }
 
-sub unique_comment_location ($) {
+sub num_comments ($$) {
 	my $page=shift;
 	my $dir=shift;
 
+	my @comments=glob("$dir/$page/$config{comments_pagename}*._comment");
+	return @comments;
+}
+
+sub unique_comment_location ($$$) {
+	my $page=shift;
+
+	eval q{use Digest::MD5 'md5_hex'};
+	error($@) if $@;
+	my $content_md5=md5_hex(shift);
+
+	my $dir=shift;
+
 	my $location;
-	my $i = 0;
+	my $i = num_comments($page, $dir);
 	do {
 		$i++;
-		$location = "$page/$config{comments_pagename}$i";
+		$location = "$page/$config{comments_pagename}${i}_${content_md5}";
 	} while (-e "$dir/$location._comment");
 
 	return $location;