- push @args, atom => $params{atom} if defined $params{atom};
- push @args, rss => $params{rss} if defined $params{rss};
- push @args, feeds => $params{feeds} if defined $params{feeds};
- push @args, feedshow => $params{feedshow} if defined $params{feedshow};
- push @args, timeformat => $params{timeformat} if defined $params{timeformat};
- push @args, feedonly => $params{feedonly} if defined $params{feedonly};
- $posts = IkiWiki::preprocess_inline(@args);
- $formtemplate->param("comments" => $posts);
- }
-
- return $formtemplate->output;
-} # }}}
-
-# FIXME: logic taken from editpage, should be common code?
-sub getcgiuser ($) { # {{{
- my $session = shift;
- my $user = $session->param('name');
- $user = $ENV{REMOTE_ADDR} unless defined $user;
- debug("getcgiuser() -> $user");
- return $user;
-} # }}}
-
-# FIXME: logic adapted from recentchanges, should be common code?
+ });
+
+ # set metadata, possibly overriding [[!meta]] directives from the
+ # comment itself
+
+ my $commentuser;
+ my $commentip;
+ my $commentauthor;
+ my $commentauthorurl;
+
+ if (defined $params{username}) {
+ $commentuser = $params{username};
+ ($commentauthorurl, $commentauthor) =
+ linkuser($params{username});
+ }
+ else {
+ if (defined $params{ip}) {
+ $commentip = $params{ip};
+ }
+ $commentauthor = gettext("Anonymous");
+ }
+
+ $pagestate{$page}{comments}{commentuser} = $commentuser;
+ $pagestate{$page}{comments}{commentip} = $commentip;
+ $pagestate{$page}{comments}{commentauthor} = $commentauthor;
+ $pagestate{$page}{comments}{commentauthorurl} = $commentauthorurl;
+ if (! defined $pagestate{$page}{meta}{author}) {
+ $pagestate{$page}{meta}{author} = $commentauthor;
+ }
+ if (! defined $pagestate{$page}{meta}{authorurl}) {
+ $pagestate{$page}{meta}{authorurl} = $commentauthorurl;
+ }
+
+ if ($config{comments_allowauthor}) {
+ if (defined $params{claimedauthor}) {
+ $pagestate{$page}{meta}{author} = $params{claimedauthor};
+ }
+
+ if (defined $params{url} and safeurl($params{url})) {
+ $pagestate{$page}{meta}{authorurl} = $params{url};
+ }
+ }
+ else {
+ $pagestate{$page}{meta}{author} = $commentauthor;
+ $pagestate{$page}{meta}{authorurl} = $commentauthorurl;
+ }
+
+ if (defined $params{subject}) {
+ $pagestate{$page}{meta}{title} = $params{subject};
+ }
+
+ my $baseurl = urlto($params{destpage}, undef, 1);
+ my $anchor = "";
+ if ($params{page} =~ m/\/(\Q$config{comments_pagename}\E\d+)$/) {
+ $anchor = $1;
+ }
+ $pagestate{$page}{meta}{permalink} = "${baseurl}#${anchor}";
+
+ eval q{use Date::Parse};
+ if (! $@) {
+ my $time = str2time($params{date});
+ $IkiWiki::pagectime{$page} = $time if defined $time;
+ }
+
+ # FIXME: hard-coded HTML (although it's just to set an ID)
+ return "<div id=\"$anchor\">$content</div>" if $anchor;
+ return $content;
+}
+
+# This is exactly the same as recentchanges_link :-(
+sub linkcgi ($) {
+ my $cgi=shift;
+ if (defined $cgi->param('do') && $cgi->param('do') eq "commenter") {
+
+ my $page=decode_utf8($cgi->param("page"));
+ if (! defined $page) {
+ error("missing page parameter");
+ }
+
+ IkiWiki::loadindex();
+
+ my $link=bestlink("", $page);
+ if (! length $link) {
+ print "Content-type: text/html\n\n";
+ print IkiWiki::misctemplate(gettext(gettext("missing page")),
+ "<p>".
+ sprintf(gettext("The page %s does not exist."),
+ htmllink("", "", $page)).
+ "</p>");
+ }
+ else {
+ IkiWiki::redirect($cgi, urlto($link, undef, 1));
+ }
+
+ exit;
+ }
+}
+
+# FIXME: basically the same logic as recentchanges