From e307eeda3d55446f4bdeb2ac48f4fef0c24b1f3d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 18 Nov 2008 02:48:24 -0500 Subject: html escaping complication Can't escape things to entities if the template then escapes the entities. (aggregate doesn't have this problem.) --- templates/change.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'templates') diff --git a/templates/change.tmpl b/templates/change.tmpl index 0aebae61e..0e61a80f4 100644 --- a/templates/change.tmpl +++ b/templates/change.tmpl @@ -32,14 +32,14 @@
-
+
-
+
 
-- cgit v1.2.3 From f77f7a02a6f235e02c4729f6f56e7c43bd8a33fb Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sun, 21 Sep 2008 19:33:45 +0100 Subject: Add initial version of a postcomment plugin (temporarily namespaced as smcvpostcomment) --- IkiWiki/Plugin/smcvpostcomment.pm | 299 +++++++++++++++++++++++++++++++++ templates/smcvpostcomment_comment.tmpl | 10 ++ templates/smcvpostcomment_display.tmpl | 24 +++ templates/smcvpostcomment_embed.tmpl | 11 ++ templates/smcvpostcomment_form.tmpl | 20 +++ 5 files changed, 364 insertions(+) create mode 100644 IkiWiki/Plugin/smcvpostcomment.pm create mode 100644 templates/smcvpostcomment_comment.tmpl create mode 100644 templates/smcvpostcomment_display.tmpl create mode 100644 templates/smcvpostcomment_embed.tmpl create mode 100644 templates/smcvpostcomment_form.tmpl (limited to 'templates') diff --git a/IkiWiki/Plugin/smcvpostcomment.pm b/IkiWiki/Plugin/smcvpostcomment.pm new file mode 100644 index 000000000..cb55ff94f --- /dev/null +++ b/IkiWiki/Plugin/smcvpostcomment.pm @@ -0,0 +1,299 @@ +#!/usr/bin/perl +# Copyright © 2006-2008 Joey Hess +# Copyright © 2008 Simon McVittie +# Licensed under the GNU GPL, version 2, or any later version published by the +# Free Software Foundation +package IkiWiki::Plugin::smcvpostcomment; + +use warnings; +use strict; +use IkiWiki 2.00; +use IkiWiki::Plugin::mdwn; +use CGI 'escapeHTML'; + +use constant PLUGIN => "smcvpostcomment"; +use constant PREVIEW => "Preview"; +use constant POST_COMMENT => "Post comment"; +use constant CANCEL => "Cancel"; + +sub import { #{{{ + hook(type => "getsetup", id => PLUGIN, call => \&getsetup); + hook(type => "preprocess", id => PLUGIN, call => \&preprocess); + hook(type => "sessioncgi", id => PLUGIN, call => \&sessioncgi); + hook(type => "htmlize", id => "_".PLUGIN, + call => \&IkiWiki::Plugin::mdwn::htmlize); + IkiWiki::loadplugin("inline"); +} # }}} + +sub getsetup () { #{{{ + return + plugin => { + safe => 1, + rebuild => undef, + }, +} #}}} + +# Somewhat based on IkiWiki::Plugin::inline blog posting support +sub preprocess (@) { #{{{ + my %params=@_; + + unless (length $config{cgiurl}) { + error("this plugin makes no sense if you have no CGI"); + } + + my $formtemplate = IkiWiki::template(PLUGIN . "_embed.tmpl", + blind_cache => 1); + $formtemplate->param(cgiurl => $config{cgiurl}); + $formtemplate->param(page => $params{page}); + + if ($params{preview}) { + $formtemplate->param("disabled" => + 'not available during Preview'); + } + + debug("page $params{page} => destpage $params{page}"); + + # I'm reasonably sure that this counts as abuse of [[!inline]] + return $formtemplate->output . "\n" . + IkiWiki::preprocess_inline( + pages => "internal(/$params{page}/comment_*)", + template => PLUGIN . "_display", + show => 0, + reverse => "yes", + page => $params{page}, + destpage => $params{destpage}, + preview => $params{preview}); +} # }}} + +# 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? +sub linkuser ($) { # {{{ + my $user = shift; + my $oiduser = eval { IkiWiki::openiduser($user) }; + + if (defined $oiduser) { + return ($user, $oiduser); + } + else { + my $page = bestlink('', (length $config{userdir} + ? "$config{userdir}/" + : "").$user); + return (urlto($page, undef, 1), $user); + } +} # }}} + +# FIXME: taken from IkiWiki::Plugin::editpage, should be common? +sub checksessionexpiry ($$) { # {{{ + my $session = shift; + my $sid = shift; + + if (defined $session->param("name")) { + if (! defined $sid || $sid ne $session->id) { + error(gettext("Your login session has expired.")); + } + } +} # }}} + +# Mostly cargo-culted from IkiWiki::plugin::editpage +sub sessioncgi ($$) { #{{{ + my $cgi=shift; + my $session=shift; + + my $do = $cgi->param('do'); + return unless $do eq PLUGIN; + + # These are theoretically configurable, but currently hard-coded + my $allow_wikilinks = 0; + my $allow_directives = 0; + my $commit_comments = 1; + + IkiWiki::decode_cgi_utf8($cgi); + + eval q{use CGI::FormBuilder}; + error($@) if $@; + + my @buttons = (POST_COMMENT, PREVIEW, CANCEL); + my $form = CGI::FormBuilder->new( + fields => [qw{do sid page subject body}], + charset => 'utf-8', + method => 'POST', + required => [qw{body}], + javascript => 0, + params => $cgi, + action => $config{cgiurl}, + header => 0, + table => 0, + template => scalar IkiWiki::template_params(PLUGIN . '_form.tmpl'), + # wtf does this do in editpage? + wikiname => $config{wikiname}, + ); + + IkiWiki::decode_form_utf8($form); + IkiWiki::run_hooks(formbuilder_setup => sub { + shift->(title => PLUGIN, form => $form, cgi => $cgi, + session => $session, buttons => \@buttons); + }); + IkiWiki::decode_form_utf8($form); + + $form->field(name => 'do', type => 'hidden'); + $form->field(name => 'sid', type => 'hidden', value => $session->id, + force => 1); + $form->field(name => 'page', type => 'hidden'); + $form->field(name => 'subject', type => 'text', size => 80); + $form->field(name => 'body', type => 'textarea', rows => 5, + cols => 80); + + # The untaint is OK (as in editpage) because we're about to pass + # it to file_pruned anyway + my $page = $form->field('page'); + $page = IkiWiki::possibly_foolish_untaint($page); + if (!defined $page || !length $page || + IkiWiki::file_pruned($page, $config{srcdir})) { + error ("bad page name"); + } + + # FIXME: is this right? Or should we be using the candidate subpage + # (whatever that might mean) as the base URL? + my $baseurl = urlto($page, undef, 1); + + $form->title(sprintf(gettext("commenting on %s"), + IkiWiki::pagetitle($page))); + + $form->tmpl_param('helponformattinglink', + htmllink($page, $page, 'ikiwiki/formatting', + noimageinline => 1, + linktext => 'FormattingHelp')); + + if (not exists $pagesources{$page}) { + error ("page '$page' doesn't exist, so you can't comment"); + } + + 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)); + exit; + } + + my ($authorurl, $author) = linkuser(getcgiuser($session)); + + my $body = $form->field('body'); + $body =~ s/\r\n/\n/g; + $body =~ s/\r/\n/g; + $body .= "\n" if $body !~ /\n$/; + + $body =~ s/\[\[([^!])/[[$1/g unless $allow_wikilinks; + $body =~ s/\[\[!/[[!/g unless $allow_directives; + + # In this template, the [[!meta]] directives should stay at the end, + # so that they will override anything the user specifies. (For + # instance, [[!meta author="I can fake the author"]]...) + my $content_tmpl = template(PLUGIN . '_comment.tmpl'); + $content_tmpl->param(author => $author); + $content_tmpl->param(authorurl => $authorurl); + $content_tmpl->param(subject => $form->field('subject')); + $content_tmpl->param(body => $body); + + my $content = $content_tmpl->output; + + # 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 + # - this means that conflicts should never happen + # - this means that if they do, rocks fall and everyone dies + + if ($form->submitted eq PREVIEW) { + my $fake = "$page/_" . PLUGIN . "hypothetical"; + my $preview = IkiWiki::htmlize($fake, $page, 'mdwn', + IkiWiki::linkify($page, $page, + IkiWiki::preprocess($page, $page, + IkiWiki::filter($fake, $page, + $content), + 0, 1))); + IkiWiki::run_hooks(format => sub { + $preview = shift->(page => $page, + content => $preview); + }); + + my $template = template(PLUGIN . "_display.tmpl"); + $template->param(content => $preview); + $template->param(title => $form->field('subject')); + $template->param(ctime => displaytime(time)); + $template->param(author => $author); + $template->param(authorurl => $authorurl); + + $form->tmpl_param(page_preview => $template->output); + } + else { + $form->tmpl_param(page_preview => ""); + } + + if ($form->submitted eq POST_COMMENT && $form->validate) { + # Let's get posting. We don't check_canedit here because + # that somewhat defeats the point of this plugin. + + checksessionexpiry($session, $cgi->param('sid')); + + # FIXME: check that the wiki is locked right now, because + # if it's not, there are mad race conditions! + + # FIXME: rather a simplistic way to make the comments... + my $i = 0; + my $file; + do { + $i++; + $file = "$page/comment_${i}._" . PLUGIN; + } while (-e "$config{srcdir}/$file"); + + # FIXME: could probably do some sort of graceful retry + # if I could be bothered + writefile($file, $config{srcdir}, $content); + + my $conflict; + + if ($config{rcs} and $commit_comments) { + my $message = "Added a comment"; + if (defined $form->field('subject') && + length $form->field('subject')) { + $message = "Added a comment: " . + $form->field('subject'); + } + + IkiWiki::rcs_add($file); + IkiWiki::disable_commit_hook(); + $conflict = IkiWiki::rcs_commit_staged($message, + $session->param('name'), $ENV{REMOTE_ADDR}); + IkiWiki::enable_commit_hook(); + IkiWiki::rcs_update(); + } + + # Now we need a refresh + require IkiWiki::Render; + IkiWiki::refresh(); + IkiWiki::saveindex(); + + # this should never happen, unless a committer deliberately + # breaks it or something + error($conflict) if defined $conflict; + + # Bounce back to where we were, but defeat broken caches + my $anticache = "?updated=$page/comment_$i"; + IkiWiki::redirect($cgi, urlto($page, undef, 1).$anticache); + } + else { + IkiWiki::showform ($form, \@buttons, $session, $cgi, + forcebaseurl => $baseurl); + } + + exit; +} #}}} + +1 diff --git a/templates/smcvpostcomment_comment.tmpl b/templates/smcvpostcomment_comment.tmpl new file mode 100644 index 000000000..8c89458f3 --- /dev/null +++ b/templates/smcvpostcomment_comment.tmpl @@ -0,0 +1,10 @@ + + +[[!meta title=""]] + + +[[!meta author=""]] + + +[[!meta authorurl=""]] + diff --git a/templates/smcvpostcomment_display.tmpl b/templates/smcvpostcomment_display.tmpl new file mode 100644 index 000000000..32618d94d --- /dev/null +++ b/templates/smcvpostcomment_display.tmpl @@ -0,0 +1,24 @@ +
+ +
+Posted by + + + + + + + + + + +() +
+ +
+ +
+ +
+ +
diff --git a/templates/smcvpostcomment_embed.tmpl b/templates/smcvpostcomment_embed.tmpl new file mode 100644 index 000000000..2db055d51 --- /dev/null +++ b/templates/smcvpostcomment_embed.tmpl @@ -0,0 +1,11 @@ +
+
+ + +disabled="disabled" /> + + + +
+
diff --git a/templates/smcvpostcomment_form.tmpl b/templates/smcvpostcomment_form.tmpl new file mode 100644 index 000000000..9bce62396 --- /dev/null +++ b/templates/smcvpostcomment_form.tmpl @@ -0,0 +1,20 @@ + + + + + +Subject:
+
+
+ + + + +
+
+Page preview: +
+
+ +
+
-- cgit v1.2.3 From 7be3a15244d367713903ba2394d95e423fd8e89f Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 15 Nov 2008 14:08:31 +0000 Subject: Use a link rather than a button for "post comments" --- templates/smcvpostcomment_embed.tmpl | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'templates') diff --git a/templates/smcvpostcomment_embed.tmpl b/templates/smcvpostcomment_embed.tmpl index 2db055d51..c1826638b 100644 --- a/templates/smcvpostcomment_embed.tmpl +++ b/templates/smcvpostcomment_embed.tmpl @@ -1,11 +1,7 @@ -
-
- - -disabled="disabled" /> +
- +Posting comments disabled: + +Post a comment
- -- cgit v1.2.3 From d18adfb1adedff996dfea9b20a3f1765addbec04 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 17 Nov 2008 09:08:54 +0000 Subject: smcvpostcomment: indicate in form whether HTML and directives are allowed --- IkiWiki/Plugin/smcvpostcomment.pm | 4 +++- templates/smcvpostcomment_form.tmpl | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'templates') diff --git a/IkiWiki/Plugin/smcvpostcomment.pm b/IkiWiki/Plugin/smcvpostcomment.pm index 07f008e5e..2b9f1e5dc 100644 --- a/IkiWiki/Plugin/smcvpostcomment.pm +++ b/IkiWiki/Plugin/smcvpostcomment.pm @@ -171,7 +171,9 @@ sub sessioncgi ($$) { #{{{ $form->tmpl_param('helponformattinglink', htmllink($page, $page, 'ikiwiki/formatting', noimageinline => 1, - linktext => 'FormattingHelp')); + linktext => 'FormattingHelp'), + allowhtml => $allow_html, + allowdirectives => $allow_directives); if (not exists $pagesources{$page}) { error(sprintf(gettext( diff --git a/templates/smcvpostcomment_form.tmpl b/templates/smcvpostcomment_form.tmpl index 9bce62396..7f138a450 100644 --- a/templates/smcvpostcomment_form.tmpl +++ b/templates/smcvpostcomment_form.tmpl @@ -6,8 +6,10 @@ Subject:


- - +
+HTML is not allowed.
+IkiWiki directives ([[!directive]]) are not allowed.
+
-- cgit v1.2.3 From 2857b301e76dba92f550ac3f5077dcad068d2686 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 17 Nov 2008 10:40:49 +0000 Subject: smcvpostcomment_*.tmpl: make class names match template names Also put "posting comments disabled" in [], and change "Page preview" to "Comment preview". --- doc/style.css | 4 ++-- templates/smcvpostcomment_display.tmpl | 4 ++-- templates/smcvpostcomment_embed.tmpl | 4 ++-- templates/smcvpostcomment_form.tmpl | 9 ++++++--- 4 files changed, 12 insertions(+), 9 deletions(-) (limited to 'templates') diff --git a/doc/style.css b/doc/style.css index a30c5556f..896ac2b01 100644 --- a/doc/style.css +++ b/doc/style.css @@ -373,7 +373,7 @@ span.color { padding: 2px; } -.smcvpostcomment-page .author { font-weight: bold; } -.smcvpostcomment-page { border: 1px inset #999; margin: 3px; padding: 3px; } +.smcvpostcomment-display .author { font-weight: bold; } +.smcvpostcomment-display { border: 1px inset #999; margin: 3px; padding: 3px; } .smcvpostcomment-header { font-style: italic; } .smcvpostcomment-subject { font-weight: bold; border-bottom: 1px solid #999; } diff --git a/templates/smcvpostcomment_display.tmpl b/templates/smcvpostcomment_display.tmpl index 32618d94d..1b67f9094 100644 --- a/templates/smcvpostcomment_display.tmpl +++ b/templates/smcvpostcomment_display.tmpl @@ -1,4 +1,4 @@ -
+
Posted by @@ -21,4 +21,4 @@ Posted by
-
+
diff --git a/templates/smcvpostcomment_embed.tmpl b/templates/smcvpostcomment_embed.tmpl index c1826638b..db35e4da7 100644 --- a/templates/smcvpostcomment_embed.tmpl +++ b/templates/smcvpostcomment_embed.tmpl @@ -1,6 +1,6 @@ -
+
-Posting comments disabled: +[Posting comments disabled: ] Post a comment diff --git a/templates/smcvpostcomment_form.tmpl b/templates/smcvpostcomment_form.tmpl index 7f138a450..43fc9b65a 100644 --- a/templates/smcvpostcomment_form.tmpl +++ b/templates/smcvpostcomment_form.tmpl @@ -1,3 +1,4 @@ +
@@ -14,9 +15,11 @@ IkiWiki directives ([[!directive]]) are not
-Page preview: -
+Comment preview: +
-
+
+ +
-- cgit v1.2.3 From 3c9ccb406b2260c149be387508a097fe6fdb3c93 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 17 Nov 2008 11:16:31 +0000 Subject: Rename smcvpostcomment plugin to postcomment to propose for inclusion --- IkiWiki/Plugin/postcomment.pm | 371 +++++++++++++++++++++++++++++++++ IkiWiki/Plugin/smcvpostcomment.pm | 371 --------------------------------- doc/style.css | 8 +- templates/postcomment_comment.tmpl | 10 + templates/postcomment_display.tmpl | 24 +++ templates/postcomment_embed.tmpl | 7 + templates/postcomment_form.tmpl | 25 +++ templates/smcvpostcomment_comment.tmpl | 10 - templates/smcvpostcomment_display.tmpl | 24 --- templates/smcvpostcomment_embed.tmpl | 7 - templates/smcvpostcomment_form.tmpl | 25 --- 11 files changed, 441 insertions(+), 441 deletions(-) create mode 100644 IkiWiki/Plugin/postcomment.pm delete mode 100644 IkiWiki/Plugin/smcvpostcomment.pm create mode 100644 templates/postcomment_comment.tmpl create mode 100644 templates/postcomment_display.tmpl create mode 100644 templates/postcomment_embed.tmpl create mode 100644 templates/postcomment_form.tmpl delete mode 100644 templates/smcvpostcomment_comment.tmpl delete mode 100644 templates/smcvpostcomment_display.tmpl delete mode 100644 templates/smcvpostcomment_embed.tmpl delete mode 100644 templates/smcvpostcomment_form.tmpl (limited to 'templates') diff --git a/IkiWiki/Plugin/postcomment.pm b/IkiWiki/Plugin/postcomment.pm new file mode 100644 index 000000000..480ca58a5 --- /dev/null +++ b/IkiWiki/Plugin/postcomment.pm @@ -0,0 +1,371 @@ +#!/usr/bin/perl +# Copyright © 2006-2008 Joey Hess +# Copyright © 2008 Simon McVittie +# Licensed under the GNU GPL, version 2, or any later version published by the +# Free Software Foundation +package IkiWiki::Plugin::postcomment; + +use warnings; +use strict; +use IkiWiki 2.00; + +use constant PLUGIN => "postcomment"; +use constant PREVIEW => "Preview"; +use constant POST_COMMENT => "Post comment"; +use constant CANCEL => "Cancel"; + +sub import { #{{{ + hook(type => "getsetup", id => PLUGIN, call => \&getsetup); + hook(type => "preprocess", id => PLUGIN, call => \&preprocess); + hook(type => "sessioncgi", id => PLUGIN, call => \&sessioncgi); + hook(type => "htmlize", id => "_".PLUGIN, + call => \&IkiWiki::Plugin::mdwn::htmlize); + IkiWiki::loadplugin("inline"); + IkiWiki::loadplugin("mdwn"); +} # }}} + +sub htmlize { # {{{ + eval { use IkiWiki::Plugin::mdwn; }; + error($@) if ($@); + return IkiWiki::Plugin::mdwn::htmlize(@_) +} # }}} + +sub getsetup () { #{{{ + return + plugin => { + safe => 1, + rebuild => undef, + }, +} #}}} + +# Somewhat based on IkiWiki::Plugin::inline blog posting support +sub preprocess (@) { #{{{ + my %params=@_; + + unless (length $config{cgiurl}) { + error(sprintf (gettext("[[!%s plugin requires CGI enabled]]"), + PLUGIN)); + } + + my $page = $params{page}; + $pagestate{$page}{PLUGIN()}{comments} = defined $params{closed} + ? (not IkiWiki::yesno($params{closed})) + : 1; + $pagestate{$page}{PLUGIN()}{allowhtml} = IkiWiki::yesno($params{allowhtml}); + $pagestate{$page}{PLUGIN()}{allowdirectives} = IkiWiki::yesno($params{allowdirectives}); + $pagestate{$page}{PLUGIN()}{commit} = defined $params{commit} + ? IkiWiki::yesno($params{commit}) + : 1; + + my $formtemplate = IkiWiki::template(PLUGIN . "_embed.tmpl", + blind_cache => 1); + $formtemplate->param(cgiurl => $config{cgiurl}); + $formtemplate->param(page => $params{page}); + + if (not $pagestate{$page}{PLUGIN()}{comments}) { + $formtemplate->param("disabled" => + gettext('comments are closed')); + } + elsif ($params{preview}) { + $formtemplate->param("disabled" => + gettext('not available during Preview')); + } + + debug("page $params{page} => destpage $params{destpage}"); + + my $posts = ''; + unless (defined $params{inline} && !IkiWiki::yesno($params{inline})) { + eval { use IkiWiki::Plugin::inline; }; + error($@) if ($@); + my @args = ( + pages => "internal($params{page}/_comment_*)", + template => PLUGIN . "_display", + show => 0, + reverse => "yes", + # special stuff passed through + page => $params{page}, + destpage => $params{destpage}, + preview => $params{preview}, + ); + 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 = "\n" . IkiWiki::preprocess_inline(@args); + } + + return $formtemplate->output . $posts; +} # }}} + +# 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? +sub linkuser ($) { # {{{ + my $user = shift; + my $oiduser = eval { IkiWiki::openiduser($user) }; + + if (defined $oiduser) { + return ($user, $oiduser); + } + else { + my $page = bestlink('', (length $config{userdir} + ? "$config{userdir}/" + : "").$user); + return (urlto($page, undef, 1), $user); + } +} # }}} + +# FIXME: taken from IkiWiki::Plugin::editpage, should be common? +sub checksessionexpiry ($$) { # {{{ + my $session = shift; + my $sid = shift; + + if (defined $session->param("name")) { + if (! defined $sid || $sid ne $session->id) { + error(gettext("Your login session has expired.")); + } + } +} # }}} + +# Mostly cargo-culted from IkiWiki::plugin::editpage +sub sessioncgi ($$) { #{{{ + my $cgi=shift; + my $session=shift; + + my $do = $cgi->param('do'); + return unless $do eq PLUGIN; + + IkiWiki::decode_cgi_utf8($cgi); + + eval q{use CGI::FormBuilder}; + error($@) if $@; + + my @buttons = (POST_COMMENT, PREVIEW, CANCEL); + my $form = CGI::FormBuilder->new( + fields => [qw{do sid page subject body}], + charset => 'utf-8', + method => 'POST', + required => [qw{body}], + javascript => 0, + params => $cgi, + action => $config{cgiurl}, + header => 0, + table => 0, + template => scalar IkiWiki::template_params(PLUGIN . '_form.tmpl'), + # wtf does this do in editpage? + wikiname => $config{wikiname}, + ); + + IkiWiki::decode_form_utf8($form); + IkiWiki::run_hooks(formbuilder_setup => sub { + shift->(title => PLUGIN, form => $form, cgi => $cgi, + session => $session, buttons => \@buttons); + }); + IkiWiki::decode_form_utf8($form); + + $form->field(name => 'do', type => 'hidden'); + $form->field(name => 'sid', type => 'hidden', value => $session->id, + force => 1); + $form->field(name => 'page', type => 'hidden'); + $form->field(name => 'subject', type => 'text', size => 72); + $form->field(name => 'body', type => 'textarea', rows => 5, + cols => 80); + + # The untaint is OK (as in editpage) because we're about to pass + # it to file_pruned anyway + my $page = $form->field('page'); + $page = IkiWiki::possibly_foolish_untaint($page); + if (!defined $page || !length $page || + IkiWiki::file_pruned($page, $config{srcdir})) { + error(gettext("bad page name")); + } + + my $allow_directives = $pagestate{$page}{PLUGIN()}{allowdirectives}; + my $allow_html = $pagestate{$page}{PLUGIN()}{allowdirectives}; + my $commit_comments = defined $pagestate{$page}{PLUGIN()}{commit} + ? $pagestate{$page}{PLUGIN()}{commit} + : 1; + + # FIXME: is this right? Or should we be using the candidate subpage + # (whatever that might mean) as the base URL? + my $baseurl = urlto($page, undef, 1); + + $form->title(sprintf(gettext("commenting on %s"), + IkiWiki::pagetitle($page))); + + $form->tmpl_param('helponformattinglink', + htmllink($page, $page, 'ikiwiki/formatting', + noimageinline => 1, + linktext => 'FormattingHelp'), + allowhtml => $allow_html, + allowdirectives => $allow_directives); + + if (not exists $pagesources{$page}) { + error(sprintf(gettext( + "page '%s' doesn't exist, so you can't comment"), + $page)); + } + if (not $pagestate{$page}{PLUGIN()}{comments}) { + error(sprintf(gettext( + "comments are not enabled on page '%s'"), + $page)); + } + + 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)); + exit; + } + + IkiWiki::check_canedit($page . "[" . PLUGIN . "]", $cgi, $session); + + my ($authorurl, $author) = linkuser(getcgiuser($session)); + + my $body = $form->field('body') || ''; + $body =~ s/\r\n/\n/g; + $body =~ s/\r/\n/g; + $body = "\n" if $body !~ /\n$/; + + unless ($allow_directives) { + # don't allow new-style directives at all + $body =~ s/(^|[^\\])\[\[!/$1\\[[!/g; + + # don't allow [[ unless it begins an old-style + # wikilink, if prefix_directives is off + $body =~ s/(^|[^\\])\[\[(?![^\n\s\]+]\]\])/$1\\[[!/g + unless $config{prefix_directives}; + } + + unless ($allow_html) { + $body =~ s/&(\w|#)/&$1/g; + $body =~ s//>/g; + } + + # In this template, the [[!meta]] directives should stay at the end, + # so that they will override anything the user specifies. (For + # instance, [[!meta author="I can fake the author"]]...) + my $content_tmpl = template(PLUGIN . '_comment.tmpl'); + $content_tmpl->param(author => $author); + $content_tmpl->param(authorurl => $authorurl); + $content_tmpl->param(subject => $form->field('subject')); + $content_tmpl->param(body => $body); + + my $content = $content_tmpl->output; + + # 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 + # - this means that conflicts should never happen + # - this means that if they do, rocks fall and everyone dies + + if ($form->submitted eq PREVIEW) { + # $fake is a location that has the same number of slashes + # as the eventual location of this comment. + my $fake = "$page/_" . PLUGIN . "hypothetical"; + my $preview = IkiWiki::htmlize($fake, $page, 'mdwn', + IkiWiki::linkify($page, $page, + IkiWiki::preprocess($page, $page, + IkiWiki::filter($fake, $page, + $content), + 0, 1))); + IkiWiki::run_hooks(format => sub { + $preview = shift->(page => $page, + content => $preview); + }); + + my $template = template(PLUGIN . "_display.tmpl"); + $template->param(content => $preview); + $template->param(title => $form->field('subject')); + $template->param(ctime => displaytime(time)); + $template->param(author => $author); + $template->param(authorurl => $authorurl); + + $form->tmpl_param(page_preview => $template->output); + } + else { + $form->tmpl_param(page_preview => ""); + } + + if ($form->submitted eq POST_COMMENT && $form->validate) { + # Let's get posting. We don't check_canedit here because + # that somewhat defeats the point of this plugin. + + checksessionexpiry($session, $cgi->param('sid')); + + # FIXME: check that the wiki is locked right now, because + # if it's not, there are mad race conditions! + + # FIXME: rather a simplistic way to make the comments... + my $i = 0; + my $file; + do { + $i++; + $file = "$page/_comment_${i}._" . PLUGIN; + } while (-e "$config{srcdir}/$file"); + + # FIXME: could probably do some sort of graceful retry + # if I could be bothered + writefile($file, $config{srcdir}, $content); + + my $conflict; + + if ($config{rcs} and $commit_comments) { + my $message = gettext("Added a comment"); + if (defined $form->field('subject') && + length $form->field('subject')) { + $message .= ": ".$form->field('subject'); + } + + IkiWiki::rcs_add($file); + IkiWiki::disable_commit_hook(); + $conflict = IkiWiki::rcs_commit_staged($message, + $session->param('name'), $ENV{REMOTE_ADDR}); + IkiWiki::enable_commit_hook(); + IkiWiki::rcs_update(); + } + + # Now we need a refresh + require IkiWiki::Render; + IkiWiki::refresh(); + IkiWiki::saveindex(); + + # this should never happen, unless a committer deliberately + # breaks it or something + error($conflict) if defined $conflict; + + # Bounce back to where we were, but defeat broken caches + my $anticache = "?updated=$page/_comment_$i"; + IkiWiki::redirect($cgi, urlto($page, undef, 1).$anticache); + } + else { + IkiWiki::showform ($form, \@buttons, $session, $cgi, + forcebaseurl => $baseurl); + } + + exit; +} #}}} + +package IkiWiki::PageSpec; + +sub match_postcomment ($$;@) { + my $page = shift; + my $glob = shift; + + unless ($page =~ s/\[postcomment\]$//) { + return IkiWiki::FailReason->new("not posting a comment"); + } + return match_glob($page, $glob); +} + +1 diff --git a/IkiWiki/Plugin/smcvpostcomment.pm b/IkiWiki/Plugin/smcvpostcomment.pm deleted file mode 100644 index 22958c84a..000000000 --- a/IkiWiki/Plugin/smcvpostcomment.pm +++ /dev/null @@ -1,371 +0,0 @@ -#!/usr/bin/perl -# Copyright © 2006-2008 Joey Hess -# Copyright © 2008 Simon McVittie -# Licensed under the GNU GPL, version 2, or any later version published by the -# Free Software Foundation -package IkiWiki::Plugin::smcvpostcomment; - -use warnings; -use strict; -use IkiWiki 2.00; - -use constant PLUGIN => "smcvpostcomment"; -use constant PREVIEW => "Preview"; -use constant POST_COMMENT => "Post comment"; -use constant CANCEL => "Cancel"; - -sub import { #{{{ - hook(type => "getsetup", id => PLUGIN, call => \&getsetup); - hook(type => "preprocess", id => PLUGIN, call => \&preprocess); - hook(type => "sessioncgi", id => PLUGIN, call => \&sessioncgi); - hook(type => "htmlize", id => "_".PLUGIN, - call => \&IkiWiki::Plugin::mdwn::htmlize); - IkiWiki::loadplugin("inline"); - IkiWiki::loadplugin("mdwn"); -} # }}} - -sub htmlize { # {{{ - eval { use IkiWiki::Plugin::mdwn; }; - error($@) if ($@); - return IkiWiki::Plugin::mdwn::htmlize(@_) -} # }}} - -sub getsetup () { #{{{ - return - plugin => { - safe => 1, - rebuild => undef, - }, -} #}}} - -# Somewhat based on IkiWiki::Plugin::inline blog posting support -sub preprocess (@) { #{{{ - my %params=@_; - - unless (length $config{cgiurl}) { - error(sprintf (gettext("[[!%s plugin requires CGI enabled]]"), - PLUGIN)); - } - - my $page = $params{page}; - $pagestate{$page}{PLUGIN()}{comments} = defined $params{closed} - ? (not IkiWiki::yesno($params{closed})) - : 1; - $pagestate{$page}{PLUGIN()}{allowhtml} = IkiWiki::yesno($params{allowhtml}); - $pagestate{$page}{PLUGIN()}{allowdirectives} = IkiWiki::yesno($params{allowdirectives}); - $pagestate{$page}{PLUGIN()}{commit} = defined $params{commit} - ? IkiWiki::yesno($params{commit}) - : 1; - - my $formtemplate = IkiWiki::template(PLUGIN . "_embed.tmpl", - blind_cache => 1); - $formtemplate->param(cgiurl => $config{cgiurl}); - $formtemplate->param(page => $params{page}); - - if (not $pagestate{$page}{PLUGIN()}{comments}) { - $formtemplate->param("disabled" => - gettext('comments are closed')); - } - elsif ($params{preview}) { - $formtemplate->param("disabled" => - gettext('not available during Preview')); - } - - debug("page $params{page} => destpage $params{destpage}"); - - my $posts = ''; - unless (defined $params{inline} && !IkiWiki::yesno($params{inline})) { - eval { use IkiWiki::Plugin::inline; }; - error($@) if ($@); - my @args = ( - pages => "internal($params{page}/_comment_*)", - template => PLUGIN . "_display", - show => 0, - reverse => "yes", - # special stuff passed through - page => $params{page}, - destpage => $params{destpage}, - preview => $params{preview}, - ); - 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 = "\n" . IkiWiki::preprocess_inline(@args); - } - - return $formtemplate->output . $posts; -} # }}} - -# 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? -sub linkuser ($) { # {{{ - my $user = shift; - my $oiduser = eval { IkiWiki::openiduser($user) }; - - if (defined $oiduser) { - return ($user, $oiduser); - } - else { - my $page = bestlink('', (length $config{userdir} - ? "$config{userdir}/" - : "").$user); - return (urlto($page, undef, 1), $user); - } -} # }}} - -# FIXME: taken from IkiWiki::Plugin::editpage, should be common? -sub checksessionexpiry ($$) { # {{{ - my $session = shift; - my $sid = shift; - - if (defined $session->param("name")) { - if (! defined $sid || $sid ne $session->id) { - error(gettext("Your login session has expired.")); - } - } -} # }}} - -# Mostly cargo-culted from IkiWiki::plugin::editpage -sub sessioncgi ($$) { #{{{ - my $cgi=shift; - my $session=shift; - - my $do = $cgi->param('do'); - return unless $do eq PLUGIN; - - IkiWiki::decode_cgi_utf8($cgi); - - eval q{use CGI::FormBuilder}; - error($@) if $@; - - my @buttons = (POST_COMMENT, PREVIEW, CANCEL); - my $form = CGI::FormBuilder->new( - fields => [qw{do sid page subject body}], - charset => 'utf-8', - method => 'POST', - required => [qw{body}], - javascript => 0, - params => $cgi, - action => $config{cgiurl}, - header => 0, - table => 0, - template => scalar IkiWiki::template_params(PLUGIN . '_form.tmpl'), - # wtf does this do in editpage? - wikiname => $config{wikiname}, - ); - - IkiWiki::decode_form_utf8($form); - IkiWiki::run_hooks(formbuilder_setup => sub { - shift->(title => PLUGIN, form => $form, cgi => $cgi, - session => $session, buttons => \@buttons); - }); - IkiWiki::decode_form_utf8($form); - - $form->field(name => 'do', type => 'hidden'); - $form->field(name => 'sid', type => 'hidden', value => $session->id, - force => 1); - $form->field(name => 'page', type => 'hidden'); - $form->field(name => 'subject', type => 'text', size => 72); - $form->field(name => 'body', type => 'textarea', rows => 5, - cols => 80); - - # The untaint is OK (as in editpage) because we're about to pass - # it to file_pruned anyway - my $page = $form->field('page'); - $page = IkiWiki::possibly_foolish_untaint($page); - if (!defined $page || !length $page || - IkiWiki::file_pruned($page, $config{srcdir})) { - error(gettext("bad page name")); - } - - my $allow_directives = $pagestate{$page}{PLUGIN()}{allowdirectives}; - my $allow_html = $pagestate{$page}{PLUGIN()}{allowdirectives}; - my $commit_comments = defined $pagestate{$page}{PLUGIN()}{commit} - ? $pagestate{$page}{PLUGIN()}{commit} - : 1; - - # FIXME: is this right? Or should we be using the candidate subpage - # (whatever that might mean) as the base URL? - my $baseurl = urlto($page, undef, 1); - - $form->title(sprintf(gettext("commenting on %s"), - IkiWiki::pagetitle($page))); - - $form->tmpl_param('helponformattinglink', - htmllink($page, $page, 'ikiwiki/formatting', - noimageinline => 1, - linktext => 'FormattingHelp'), - allowhtml => $allow_html, - allowdirectives => $allow_directives); - - if (not exists $pagesources{$page}) { - error(sprintf(gettext( - "page '%s' doesn't exist, so you can't comment"), - $page)); - } - if (not $pagestate{$page}{PLUGIN()}{comments}) { - error(sprintf(gettext( - "comments are not enabled on page '%s'"), - $page)); - } - - 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)); - exit; - } - - IkiWiki::check_canedit($page . "[" . PLUGIN . "]", $cgi, $session); - - my ($authorurl, $author) = linkuser(getcgiuser($session)); - - my $body = $form->field('body') || ''; - $body =~ s/\r\n/\n/g; - $body =~ s/\r/\n/g; - $body = "\n" if $body !~ /\n$/; - - unless ($allow_directives) { - # don't allow new-style directives at all - $body =~ s/(^|[^\\])\[\[!/$1\\[[!/g; - - # don't allow [[ unless it begins an old-style - # wikilink, if prefix_directives is off - $body =~ s/(^|[^\\])\[\[(?![^\n\s\]+]\]\])/$1\\[[!/g - unless $config{prefix_directives}; - } - - unless ($allow_html) { - $body =~ s/&(\w|#)/&$1/g; - $body =~ s//>/g; - } - - # In this template, the [[!meta]] directives should stay at the end, - # so that they will override anything the user specifies. (For - # instance, [[!meta author="I can fake the author"]]...) - my $content_tmpl = template(PLUGIN . '_comment.tmpl'); - $content_tmpl->param(author => $author); - $content_tmpl->param(authorurl => $authorurl); - $content_tmpl->param(subject => $form->field('subject')); - $content_tmpl->param(body => $body); - - my $content = $content_tmpl->output; - - # 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 - # - this means that conflicts should never happen - # - this means that if they do, rocks fall and everyone dies - - if ($form->submitted eq PREVIEW) { - # $fake is a location that has the same number of slashes - # as the eventual location of this comment. - my $fake = "$page/_" . PLUGIN . "hypothetical"; - my $preview = IkiWiki::htmlize($fake, $page, 'mdwn', - IkiWiki::linkify($page, $page, - IkiWiki::preprocess($page, $page, - IkiWiki::filter($fake, $page, - $content), - 0, 1))); - IkiWiki::run_hooks(format => sub { - $preview = shift->(page => $page, - content => $preview); - }); - - my $template = template(PLUGIN . "_display.tmpl"); - $template->param(content => $preview); - $template->param(title => $form->field('subject')); - $template->param(ctime => displaytime(time)); - $template->param(author => $author); - $template->param(authorurl => $authorurl); - - $form->tmpl_param(page_preview => $template->output); - } - else { - $form->tmpl_param(page_preview => ""); - } - - if ($form->submitted eq POST_COMMENT && $form->validate) { - # Let's get posting. We don't check_canedit here because - # that somewhat defeats the point of this plugin. - - checksessionexpiry($session, $cgi->param('sid')); - - # FIXME: check that the wiki is locked right now, because - # if it's not, there are mad race conditions! - - # FIXME: rather a simplistic way to make the comments... - my $i = 0; - my $file; - do { - $i++; - $file = "$page/_comment_${i}._" . PLUGIN; - } while (-e "$config{srcdir}/$file"); - - # FIXME: could probably do some sort of graceful retry - # if I could be bothered - writefile($file, $config{srcdir}, $content); - - my $conflict; - - if ($config{rcs} and $commit_comments) { - my $message = gettext("Added a comment"); - if (defined $form->field('subject') && - length $form->field('subject')) { - $message .= ": ".$form->field('subject'); - } - - IkiWiki::rcs_add($file); - IkiWiki::disable_commit_hook(); - $conflict = IkiWiki::rcs_commit_staged($message, - $session->param('name'), $ENV{REMOTE_ADDR}); - IkiWiki::enable_commit_hook(); - IkiWiki::rcs_update(); - } - - # Now we need a refresh - require IkiWiki::Render; - IkiWiki::refresh(); - IkiWiki::saveindex(); - - # this should never happen, unless a committer deliberately - # breaks it or something - error($conflict) if defined $conflict; - - # Bounce back to where we were, but defeat broken caches - my $anticache = "?updated=$page/_comment_$i"; - IkiWiki::redirect($cgi, urlto($page, undef, 1).$anticache); - } - else { - IkiWiki::showform ($form, \@buttons, $session, $cgi, - forcebaseurl => $baseurl); - } - - exit; -} #}}} - -package IkiWiki::PageSpec; - -sub match_smcvpostcomment ($$;@) { - my $page = shift; - my $glob = shift; - - unless ($page =~ s/\[smcvpostcomment\]$//) { - return IkiWiki::FailReason->new("not posting a comment"); - } - return match_glob($page, $glob); -} - -1 diff --git a/doc/style.css b/doc/style.css index 896ac2b01..21ea9492c 100644 --- a/doc/style.css +++ b/doc/style.css @@ -373,7 +373,7 @@ span.color { padding: 2px; } -.smcvpostcomment-display .author { font-weight: bold; } -.smcvpostcomment-display { border: 1px inset #999; margin: 3px; padding: 3px; } -.smcvpostcomment-header { font-style: italic; } -.smcvpostcomment-subject { font-weight: bold; border-bottom: 1px solid #999; } +.postcomment-display .author { font-weight: bold; } +.postcomment-display { border: 1px inset #999; margin: 3px; padding: 3px; } +.postcomment-header { font-style: italic; } +.postcomment-subject { font-weight: bold; border-bottom: 1px solid #999; } diff --git a/templates/postcomment_comment.tmpl b/templates/postcomment_comment.tmpl new file mode 100644 index 000000000..8c89458f3 --- /dev/null +++ b/templates/postcomment_comment.tmpl @@ -0,0 +1,10 @@ + + +[[!meta title=""]] + + +[[!meta author=""]] + + +[[!meta authorurl=""]] + diff --git a/templates/postcomment_display.tmpl b/templates/postcomment_display.tmpl new file mode 100644 index 000000000..d3eabb3a1 --- /dev/null +++ b/templates/postcomment_display.tmpl @@ -0,0 +1,24 @@ +
+ +
+Posted by + + + + + + + + + + +() +
+ +
+ +
+ +
+ +
diff --git a/templates/postcomment_embed.tmpl b/templates/postcomment_embed.tmpl new file mode 100644 index 000000000..eae741214 --- /dev/null +++ b/templates/postcomment_embed.tmpl @@ -0,0 +1,7 @@ +
+ +[Posting comments disabled: ] + +Post a comment + +
diff --git a/templates/postcomment_form.tmpl b/templates/postcomment_form.tmpl new file mode 100644 index 000000000..293f0f17e --- /dev/null +++ b/templates/postcomment_form.tmpl @@ -0,0 +1,25 @@ +
+ + + + + +Subject:
+
+
+
+HTML is not allowed.
+IkiWiki directives ([[!directive]]) are not allowed.
+ + + +
+
+Comment preview: +
+
+ +
+
+ +
diff --git a/templates/smcvpostcomment_comment.tmpl b/templates/smcvpostcomment_comment.tmpl deleted file mode 100644 index 8c89458f3..000000000 --- a/templates/smcvpostcomment_comment.tmpl +++ /dev/null @@ -1,10 +0,0 @@ - - -[[!meta title=""]] - - -[[!meta author=""]] - - -[[!meta authorurl=""]] - diff --git a/templates/smcvpostcomment_display.tmpl b/templates/smcvpostcomment_display.tmpl deleted file mode 100644 index 1b67f9094..000000000 --- a/templates/smcvpostcomment_display.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -
- -
-Posted by - - - - - - - - - - -() -
- -
- -
- -
- -
diff --git a/templates/smcvpostcomment_embed.tmpl b/templates/smcvpostcomment_embed.tmpl deleted file mode 100644 index db35e4da7..000000000 --- a/templates/smcvpostcomment_embed.tmpl +++ /dev/null @@ -1,7 +0,0 @@ -
- -[Posting comments disabled: ] - -Post a comment - -
diff --git a/templates/smcvpostcomment_form.tmpl b/templates/smcvpostcomment_form.tmpl deleted file mode 100644 index 43fc9b65a..000000000 --- a/templates/smcvpostcomment_form.tmpl +++ /dev/null @@ -1,25 +0,0 @@ -
- - - - - -Subject:
-
-
-
-HTML is not allowed.
-IkiWiki directives ([[!directive]]) are not allowed.
- - - -
-
-Comment preview: -
-
- -
-
- -
-- cgit v1.2.3 From 3d4aa065d6a689a017c98e7ea8b80da0b65ae361 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 18 Nov 2008 10:17:18 +0000 Subject: postcomment: Rename plugin to comments, use *._comment files The PageSpec is still called "postcomment" since that's what it means. --- IkiWiki/Plugin/comments.pm | 369 ++++++++++++++++++++++++++++++++++++ IkiWiki/Plugin/postcomment.pm | 371 ------------------------------------- doc/style.css | 8 +- templates/comments_comment.tmpl | 10 + templates/comments_display.tmpl | 24 +++ templates/comments_embed.tmpl | 7 + templates/comments_form.tmpl | 25 +++ templates/postcomment_comment.tmpl | 10 - templates/postcomment_display.tmpl | 24 --- templates/postcomment_embed.tmpl | 7 - templates/postcomment_form.tmpl | 25 --- 11 files changed, 439 insertions(+), 441 deletions(-) create mode 100644 IkiWiki/Plugin/comments.pm delete mode 100644 IkiWiki/Plugin/postcomment.pm create mode 100644 templates/comments_comment.tmpl create mode 100644 templates/comments_display.tmpl create mode 100644 templates/comments_embed.tmpl create mode 100644 templates/comments_form.tmpl delete mode 100644 templates/postcomment_comment.tmpl delete mode 100644 templates/postcomment_display.tmpl delete mode 100644 templates/postcomment_embed.tmpl delete mode 100644 templates/postcomment_form.tmpl (limited to 'templates') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm new file mode 100644 index 000000000..b57735545 --- /dev/null +++ b/IkiWiki/Plugin/comments.pm @@ -0,0 +1,369 @@ +#!/usr/bin/perl +# Copyright © 2006-2008 Joey Hess +# Copyright © 2008 Simon McVittie +# Licensed under the GNU GPL, version 2, or any later version published by the +# Free Software Foundation +package IkiWiki::Plugin::comments; + +use warnings; +use strict; +use IkiWiki 2.00; + +use constant PREVIEW => "Preview"; +use constant POST_COMMENT => "Post comment"; +use constant CANCEL => "Cancel"; + +sub import { #{{{ + hook(type => "getsetup", id => 'comments', call => \&getsetup); + hook(type => "preprocess", id => 'comments', call => \&preprocess); + hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi); + hook(type => "htmlize", id => "_comment", + call => \&IkiWiki::Plugin::mdwn::htmlize); + IkiWiki::loadplugin("inline"); + IkiWiki::loadplugin("mdwn"); +} # }}} + +sub htmlize { # {{{ + eval { use IkiWiki::Plugin::mdwn; }; + error($@) if ($@); + return IkiWiki::Plugin::mdwn::htmlize(@_) +} # }}} + +sub getsetup () { #{{{ + return + plugin => { + safe => 1, + rebuild => undef, + }, +} #}}} + +# Somewhat based on IkiWiki::Plugin::inline blog posting support +sub preprocess (@) { #{{{ + my %params=@_; + + unless (length $config{cgiurl}) { + error(gettext("[[!comments plugin requires CGI enabled]]")); + } + + my $page = $params{page}; + $pagestate{$page}{comments}{comments} = defined $params{closed} + ? (not IkiWiki::yesno($params{closed})) + : 1; + $pagestate{$page}{comments}{allowhtml} = IkiWiki::yesno($params{allowhtml}); + $pagestate{$page}{comments}{allowdirectives} = IkiWiki::yesno($params{allowdirectives}); + $pagestate{$page}{comments}{commit} = defined $params{commit} + ? IkiWiki::yesno($params{commit}) + : 1; + + my $formtemplate = IkiWiki::template("comments_embed.tmpl", + blind_cache => 1); + $formtemplate->param(cgiurl => $config{cgiurl}); + $formtemplate->param(page => $params{page}); + + if (not $pagestate{$page}{comments}{comments}) { + $formtemplate->param("disabled" => + gettext('comments are closed')); + } + elsif ($params{preview}) { + $formtemplate->param("disabled" => + gettext('not available during Preview')); + } + + debug("page $params{page} => destpage $params{destpage}"); + + my $posts = ''; + unless (defined $params{inline} && !IkiWiki::yesno($params{inline})) { + eval { use IkiWiki::Plugin::inline; }; + error($@) if ($@); + my @args = ( + pages => "internal($params{page}/_comment_*)", + template => "comments_display", + show => 0, + reverse => "yes", + # special stuff passed through + page => $params{page}, + destpage => $params{destpage}, + preview => $params{preview}, + ); + 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 = "\n" . IkiWiki::preprocess_inline(@args); + } + + return $formtemplate->output . $posts; +} # }}} + +# 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? +sub linkuser ($) { # {{{ + my $user = shift; + my $oiduser = eval { IkiWiki::openiduser($user) }; + + if (defined $oiduser) { + return ($user, $oiduser); + } + else { + my $page = bestlink('', (length $config{userdir} + ? "$config{userdir}/" + : "").$user); + return (urlto($page, undef, 1), $user); + } +} # }}} + +# FIXME: taken from IkiWiki::Plugin::editpage, should be common? +sub checksessionexpiry ($$) { # {{{ + my $session = shift; + my $sid = shift; + + if (defined $session->param("name")) { + if (! defined $sid || $sid ne $session->id) { + error(gettext("Your login session has expired.")); + } + } +} # }}} + +# Mostly cargo-culted from IkiWiki::plugin::editpage +sub sessioncgi ($$) { #{{{ + my $cgi=shift; + my $session=shift; + + my $do = $cgi->param('do'); + return unless $do eq 'comment'; + + IkiWiki::decode_cgi_utf8($cgi); + + eval q{use CGI::FormBuilder}; + error($@) if $@; + + my @buttons = (POST_COMMENT, PREVIEW, CANCEL); + my $form = CGI::FormBuilder->new( + fields => [qw{do sid page subject body}], + charset => 'utf-8', + method => 'POST', + required => [qw{body}], + javascript => 0, + params => $cgi, + action => $config{cgiurl}, + header => 0, + table => 0, + template => scalar IkiWiki::template_params('comments_form.tmpl'), + # wtf does this do in editpage? + wikiname => $config{wikiname}, + ); + + IkiWiki::decode_form_utf8($form); + IkiWiki::run_hooks(formbuilder_setup => sub { + shift->(title => "comment", form => $form, cgi => $cgi, + session => $session, buttons => \@buttons); + }); + IkiWiki::decode_form_utf8($form); + + $form->field(name => 'do', type => 'hidden'); + $form->field(name => 'sid', type => 'hidden', value => $session->id, + force => 1); + $form->field(name => 'page', type => 'hidden'); + $form->field(name => 'subject', type => 'text', size => 72); + $form->field(name => 'body', type => 'textarea', rows => 5, + cols => 80); + + # The untaint is OK (as in editpage) because we're about to pass + # it to file_pruned anyway + my $page = $form->field('page'); + $page = IkiWiki::possibly_foolish_untaint($page); + if (!defined $page || !length $page || + IkiWiki::file_pruned($page, $config{srcdir})) { + error(gettext("bad page name")); + } + + my $allow_directives = $pagestate{$page}{comments}{allowdirectives}; + my $allow_html = $pagestate{$page}{comments}{allowdirectives}; + my $commit_comments = defined $pagestate{$page}{comments}{commit} + ? $pagestate{$page}{comments}{commit} + : 1; + + # FIXME: is this right? Or should we be using the candidate subpage + # (whatever that might mean) as the base URL? + my $baseurl = urlto($page, undef, 1); + + $form->title(sprintf(gettext("commenting on %s"), + IkiWiki::pagetitle($page))); + + $form->tmpl_param('helponformattinglink', + htmllink($page, $page, 'ikiwiki/formatting', + noimageinline => 1, + linktext => 'FormattingHelp'), + allowhtml => $allow_html, + allowdirectives => $allow_directives); + + if (not exists $pagesources{$page}) { + error(sprintf(gettext( + "page '%s' doesn't exist, so you can't comment"), + $page)); + } + if (not $pagestate{$page}{comments}{comments}) { + error(sprintf(gettext( + "comments are not enabled on page '%s'"), + $page)); + } + + 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)); + exit; + } + + IkiWiki::check_canedit($page . "[postcomment]", $cgi, $session); + + my ($authorurl, $author) = linkuser(getcgiuser($session)); + + my $body = $form->field('body') || ''; + $body =~ s/\r\n/\n/g; + $body =~ s/\r/\n/g; + $body = "\n" if $body !~ /\n$/; + + unless ($allow_directives) { + # don't allow new-style directives at all + $body =~ s/(^|[^\\])\[\[!/$1\\[[!/g; + + # don't allow [[ unless it begins an old-style + # wikilink, if prefix_directives is off + $body =~ s/(^|[^\\])\[\[(?![^\n\s\]+]\]\])/$1\\[[!/g + unless $config{prefix_directives}; + } + + unless ($allow_html) { + $body =~ s/&(\w|#)/&$1/g; + $body =~ s//>/g; + } + + # In this template, the [[!meta]] directives should stay at the end, + # so that they will override anything the user specifies. (For + # instance, [[!meta author="I can fake the author"]]...) + my $content_tmpl = template('comments_comment.tmpl'); + $content_tmpl->param(author => $author); + $content_tmpl->param(authorurl => $authorurl); + $content_tmpl->param(subject => $form->field('subject')); + $content_tmpl->param(body => $body); + + my $content = $content_tmpl->output; + + # 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 + # - this means that conflicts should never happen + # - this means that if they do, rocks fall and everyone dies + + if ($form->submitted eq PREVIEW) { + # $fake is a location that has the same number of slashes + # as the eventual location of this comment. + my $fake = "$page/_comments_hypothetical"; + my $preview = IkiWiki::htmlize($fake, $page, 'mdwn', + IkiWiki::linkify($page, $page, + IkiWiki::preprocess($page, $page, + IkiWiki::filter($fake, $page, + $content), + 0, 1))); + IkiWiki::run_hooks(format => sub { + $preview = shift->(page => $page, + content => $preview); + }); + + my $template = template("comments_display.tmpl"); + $template->param(content => $preview); + $template->param(title => $form->field('subject')); + $template->param(ctime => displaytime(time)); + $template->param(author => $author); + $template->param(authorurl => $authorurl); + + $form->tmpl_param(page_preview => $template->output); + } + else { + $form->tmpl_param(page_preview => ""); + } + + if ($form->submitted eq POST_COMMENT && $form->validate) { + # Let's get posting. We don't check_canedit here because + # that somewhat defeats the point of this plugin. + + checksessionexpiry($session, $cgi->param('sid')); + + # FIXME: check that the wiki is locked right now, because + # if it's not, there are mad race conditions! + + # FIXME: rather a simplistic way to make the comments... + my $i = 0; + my $file; + do { + $i++; + $file = "$page/_comment_${i}._comment"; + } while (-e "$config{srcdir}/$file"); + + # FIXME: could probably do some sort of graceful retry + # if I could be bothered + writefile($file, $config{srcdir}, $content); + + my $conflict; + + if ($config{rcs} and $commit_comments) { + my $message = gettext("Added a comment"); + if (defined $form->field('subject') && + length $form->field('subject')) { + $message .= ": ".$form->field('subject'); + } + + IkiWiki::rcs_add($file); + IkiWiki::disable_commit_hook(); + $conflict = IkiWiki::rcs_commit_staged($message, + $session->param('name'), $ENV{REMOTE_ADDR}); + IkiWiki::enable_commit_hook(); + IkiWiki::rcs_update(); + } + + # Now we need a refresh + require IkiWiki::Render; + IkiWiki::refresh(); + IkiWiki::saveindex(); + + # this should never happen, unless a committer deliberately + # breaks it or something + error($conflict) if defined $conflict; + + # Bounce back to where we were, but defeat broken caches + my $anticache = "?updated=$page/_comment_$i"; + IkiWiki::redirect($cgi, urlto($page, undef, 1).$anticache); + } + else { + IkiWiki::showform ($form, \@buttons, $session, $cgi, + forcebaseurl => $baseurl); + } + + exit; +} #}}} + +package IkiWiki::PageSpec; + +sub match_postcomment ($$;@) { + my $page = shift; + my $glob = shift; + + unless ($page =~ s/\[postcomment\]$//) { + return IkiWiki::FailReason->new("not posting a comment"); + } + return match_glob($page, $glob); +} + +1 diff --git a/IkiWiki/Plugin/postcomment.pm b/IkiWiki/Plugin/postcomment.pm deleted file mode 100644 index 480ca58a5..000000000 --- a/IkiWiki/Plugin/postcomment.pm +++ /dev/null @@ -1,371 +0,0 @@ -#!/usr/bin/perl -# Copyright © 2006-2008 Joey Hess -# Copyright © 2008 Simon McVittie -# Licensed under the GNU GPL, version 2, or any later version published by the -# Free Software Foundation -package IkiWiki::Plugin::postcomment; - -use warnings; -use strict; -use IkiWiki 2.00; - -use constant PLUGIN => "postcomment"; -use constant PREVIEW => "Preview"; -use constant POST_COMMENT => "Post comment"; -use constant CANCEL => "Cancel"; - -sub import { #{{{ - hook(type => "getsetup", id => PLUGIN, call => \&getsetup); - hook(type => "preprocess", id => PLUGIN, call => \&preprocess); - hook(type => "sessioncgi", id => PLUGIN, call => \&sessioncgi); - hook(type => "htmlize", id => "_".PLUGIN, - call => \&IkiWiki::Plugin::mdwn::htmlize); - IkiWiki::loadplugin("inline"); - IkiWiki::loadplugin("mdwn"); -} # }}} - -sub htmlize { # {{{ - eval { use IkiWiki::Plugin::mdwn; }; - error($@) if ($@); - return IkiWiki::Plugin::mdwn::htmlize(@_) -} # }}} - -sub getsetup () { #{{{ - return - plugin => { - safe => 1, - rebuild => undef, - }, -} #}}} - -# Somewhat based on IkiWiki::Plugin::inline blog posting support -sub preprocess (@) { #{{{ - my %params=@_; - - unless (length $config{cgiurl}) { - error(sprintf (gettext("[[!%s plugin requires CGI enabled]]"), - PLUGIN)); - } - - my $page = $params{page}; - $pagestate{$page}{PLUGIN()}{comments} = defined $params{closed} - ? (not IkiWiki::yesno($params{closed})) - : 1; - $pagestate{$page}{PLUGIN()}{allowhtml} = IkiWiki::yesno($params{allowhtml}); - $pagestate{$page}{PLUGIN()}{allowdirectives} = IkiWiki::yesno($params{allowdirectives}); - $pagestate{$page}{PLUGIN()}{commit} = defined $params{commit} - ? IkiWiki::yesno($params{commit}) - : 1; - - my $formtemplate = IkiWiki::template(PLUGIN . "_embed.tmpl", - blind_cache => 1); - $formtemplate->param(cgiurl => $config{cgiurl}); - $formtemplate->param(page => $params{page}); - - if (not $pagestate{$page}{PLUGIN()}{comments}) { - $formtemplate->param("disabled" => - gettext('comments are closed')); - } - elsif ($params{preview}) { - $formtemplate->param("disabled" => - gettext('not available during Preview')); - } - - debug("page $params{page} => destpage $params{destpage}"); - - my $posts = ''; - unless (defined $params{inline} && !IkiWiki::yesno($params{inline})) { - eval { use IkiWiki::Plugin::inline; }; - error($@) if ($@); - my @args = ( - pages => "internal($params{page}/_comment_*)", - template => PLUGIN . "_display", - show => 0, - reverse => "yes", - # special stuff passed through - page => $params{page}, - destpage => $params{destpage}, - preview => $params{preview}, - ); - 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 = "\n" . IkiWiki::preprocess_inline(@args); - } - - return $formtemplate->output . $posts; -} # }}} - -# 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? -sub linkuser ($) { # {{{ - my $user = shift; - my $oiduser = eval { IkiWiki::openiduser($user) }; - - if (defined $oiduser) { - return ($user, $oiduser); - } - else { - my $page = bestlink('', (length $config{userdir} - ? "$config{userdir}/" - : "").$user); - return (urlto($page, undef, 1), $user); - } -} # }}} - -# FIXME: taken from IkiWiki::Plugin::editpage, should be common? -sub checksessionexpiry ($$) { # {{{ - my $session = shift; - my $sid = shift; - - if (defined $session->param("name")) { - if (! defined $sid || $sid ne $session->id) { - error(gettext("Your login session has expired.")); - } - } -} # }}} - -# Mostly cargo-culted from IkiWiki::plugin::editpage -sub sessioncgi ($$) { #{{{ - my $cgi=shift; - my $session=shift; - - my $do = $cgi->param('do'); - return unless $do eq PLUGIN; - - IkiWiki::decode_cgi_utf8($cgi); - - eval q{use CGI::FormBuilder}; - error($@) if $@; - - my @buttons = (POST_COMMENT, PREVIEW, CANCEL); - my $form = CGI::FormBuilder->new( - fields => [qw{do sid page subject body}], - charset => 'utf-8', - method => 'POST', - required => [qw{body}], - javascript => 0, - params => $cgi, - action => $config{cgiurl}, - header => 0, - table => 0, - template => scalar IkiWiki::template_params(PLUGIN . '_form.tmpl'), - # wtf does this do in editpage? - wikiname => $config{wikiname}, - ); - - IkiWiki::decode_form_utf8($form); - IkiWiki::run_hooks(formbuilder_setup => sub { - shift->(title => PLUGIN, form => $form, cgi => $cgi, - session => $session, buttons => \@buttons); - }); - IkiWiki::decode_form_utf8($form); - - $form->field(name => 'do', type => 'hidden'); - $form->field(name => 'sid', type => 'hidden', value => $session->id, - force => 1); - $form->field(name => 'page', type => 'hidden'); - $form->field(name => 'subject', type => 'text', size => 72); - $form->field(name => 'body', type => 'textarea', rows => 5, - cols => 80); - - # The untaint is OK (as in editpage) because we're about to pass - # it to file_pruned anyway - my $page = $form->field('page'); - $page = IkiWiki::possibly_foolish_untaint($page); - if (!defined $page || !length $page || - IkiWiki::file_pruned($page, $config{srcdir})) { - error(gettext("bad page name")); - } - - my $allow_directives = $pagestate{$page}{PLUGIN()}{allowdirectives}; - my $allow_html = $pagestate{$page}{PLUGIN()}{allowdirectives}; - my $commit_comments = defined $pagestate{$page}{PLUGIN()}{commit} - ? $pagestate{$page}{PLUGIN()}{commit} - : 1; - - # FIXME: is this right? Or should we be using the candidate subpage - # (whatever that might mean) as the base URL? - my $baseurl = urlto($page, undef, 1); - - $form->title(sprintf(gettext("commenting on %s"), - IkiWiki::pagetitle($page))); - - $form->tmpl_param('helponformattinglink', - htmllink($page, $page, 'ikiwiki/formatting', - noimageinline => 1, - linktext => 'FormattingHelp'), - allowhtml => $allow_html, - allowdirectives => $allow_directives); - - if (not exists $pagesources{$page}) { - error(sprintf(gettext( - "page '%s' doesn't exist, so you can't comment"), - $page)); - } - if (not $pagestate{$page}{PLUGIN()}{comments}) { - error(sprintf(gettext( - "comments are not enabled on page '%s'"), - $page)); - } - - 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)); - exit; - } - - IkiWiki::check_canedit($page . "[" . PLUGIN . "]", $cgi, $session); - - my ($authorurl, $author) = linkuser(getcgiuser($session)); - - my $body = $form->field('body') || ''; - $body =~ s/\r\n/\n/g; - $body =~ s/\r/\n/g; - $body = "\n" if $body !~ /\n$/; - - unless ($allow_directives) { - # don't allow new-style directives at all - $body =~ s/(^|[^\\])\[\[!/$1\\[[!/g; - - # don't allow [[ unless it begins an old-style - # wikilink, if prefix_directives is off - $body =~ s/(^|[^\\])\[\[(?![^\n\s\]+]\]\])/$1\\[[!/g - unless $config{prefix_directives}; - } - - unless ($allow_html) { - $body =~ s/&(\w|#)/&$1/g; - $body =~ s//>/g; - } - - # In this template, the [[!meta]] directives should stay at the end, - # so that they will override anything the user specifies. (For - # instance, [[!meta author="I can fake the author"]]...) - my $content_tmpl = template(PLUGIN . '_comment.tmpl'); - $content_tmpl->param(author => $author); - $content_tmpl->param(authorurl => $authorurl); - $content_tmpl->param(subject => $form->field('subject')); - $content_tmpl->param(body => $body); - - my $content = $content_tmpl->output; - - # 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 - # - this means that conflicts should never happen - # - this means that if they do, rocks fall and everyone dies - - if ($form->submitted eq PREVIEW) { - # $fake is a location that has the same number of slashes - # as the eventual location of this comment. - my $fake = "$page/_" . PLUGIN . "hypothetical"; - my $preview = IkiWiki::htmlize($fake, $page, 'mdwn', - IkiWiki::linkify($page, $page, - IkiWiki::preprocess($page, $page, - IkiWiki::filter($fake, $page, - $content), - 0, 1))); - IkiWiki::run_hooks(format => sub { - $preview = shift->(page => $page, - content => $preview); - }); - - my $template = template(PLUGIN . "_display.tmpl"); - $template->param(content => $preview); - $template->param(title => $form->field('subject')); - $template->param(ctime => displaytime(time)); - $template->param(author => $author); - $template->param(authorurl => $authorurl); - - $form->tmpl_param(page_preview => $template->output); - } - else { - $form->tmpl_param(page_preview => ""); - } - - if ($form->submitted eq POST_COMMENT && $form->validate) { - # Let's get posting. We don't check_canedit here because - # that somewhat defeats the point of this plugin. - - checksessionexpiry($session, $cgi->param('sid')); - - # FIXME: check that the wiki is locked right now, because - # if it's not, there are mad race conditions! - - # FIXME: rather a simplistic way to make the comments... - my $i = 0; - my $file; - do { - $i++; - $file = "$page/_comment_${i}._" . PLUGIN; - } while (-e "$config{srcdir}/$file"); - - # FIXME: could probably do some sort of graceful retry - # if I could be bothered - writefile($file, $config{srcdir}, $content); - - my $conflict; - - if ($config{rcs} and $commit_comments) { - my $message = gettext("Added a comment"); - if (defined $form->field('subject') && - length $form->field('subject')) { - $message .= ": ".$form->field('subject'); - } - - IkiWiki::rcs_add($file); - IkiWiki::disable_commit_hook(); - $conflict = IkiWiki::rcs_commit_staged($message, - $session->param('name'), $ENV{REMOTE_ADDR}); - IkiWiki::enable_commit_hook(); - IkiWiki::rcs_update(); - } - - # Now we need a refresh - require IkiWiki::Render; - IkiWiki::refresh(); - IkiWiki::saveindex(); - - # this should never happen, unless a committer deliberately - # breaks it or something - error($conflict) if defined $conflict; - - # Bounce back to where we were, but defeat broken caches - my $anticache = "?updated=$page/_comment_$i"; - IkiWiki::redirect($cgi, urlto($page, undef, 1).$anticache); - } - else { - IkiWiki::showform ($form, \@buttons, $session, $cgi, - forcebaseurl => $baseurl); - } - - exit; -} #}}} - -package IkiWiki::PageSpec; - -sub match_postcomment ($$;@) { - my $page = shift; - my $glob = shift; - - unless ($page =~ s/\[postcomment\]$//) { - return IkiWiki::FailReason->new("not posting a comment"); - } - return match_glob($page, $glob); -} - -1 diff --git a/doc/style.css b/doc/style.css index 21ea9492c..70f31d325 100644 --- a/doc/style.css +++ b/doc/style.css @@ -373,7 +373,7 @@ span.color { padding: 2px; } -.postcomment-display .author { font-weight: bold; } -.postcomment-display { border: 1px inset #999; margin: 3px; padding: 3px; } -.postcomment-header { font-style: italic; } -.postcomment-subject { font-weight: bold; border-bottom: 1px solid #999; } +.comments-display .author { font-weight: bold; } +.comments-display { border: 1px inset #999; margin: 3px; padding: 3px; } +.comments-header { font-style: italic; } +.comments-subject { font-weight: bold; border-bottom: 1px solid #999; } diff --git a/templates/comments_comment.tmpl b/templates/comments_comment.tmpl new file mode 100644 index 000000000..8c89458f3 --- /dev/null +++ b/templates/comments_comment.tmpl @@ -0,0 +1,10 @@ + + +[[!meta title=""]] + + +[[!meta author=""]] + + +[[!meta authorurl=""]] + diff --git a/templates/comments_display.tmpl b/templates/comments_display.tmpl new file mode 100644 index 000000000..04e0613e0 --- /dev/null +++ b/templates/comments_display.tmpl @@ -0,0 +1,24 @@ +
+ +
+Posted by + + + + + + + + + + +() +
+ +
+ +
+ +
+ +
diff --git a/templates/comments_embed.tmpl b/templates/comments_embed.tmpl new file mode 100644 index 000000000..cbb9247f2 --- /dev/null +++ b/templates/comments_embed.tmpl @@ -0,0 +1,7 @@ +
+ +[Posting comments disabled: ] + +Post a comment + +
diff --git a/templates/comments_form.tmpl b/templates/comments_form.tmpl new file mode 100644 index 000000000..fbf49be34 --- /dev/null +++ b/templates/comments_form.tmpl @@ -0,0 +1,25 @@ +
+ + + + + +Subject:
+
+
+
+HTML is not allowed.
+IkiWiki directives ([[!directive]]) are not allowed.
+ + + +
+
+Comment preview: +
+
+ +
+
+ +
diff --git a/templates/postcomment_comment.tmpl b/templates/postcomment_comment.tmpl deleted file mode 100644 index 8c89458f3..000000000 --- a/templates/postcomment_comment.tmpl +++ /dev/null @@ -1,10 +0,0 @@ - - -[[!meta title=""]] - - -[[!meta author=""]] - - -[[!meta authorurl=""]] - diff --git a/templates/postcomment_display.tmpl b/templates/postcomment_display.tmpl deleted file mode 100644 index d3eabb3a1..000000000 --- a/templates/postcomment_display.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -
- -
-Posted by - - - - - - - - - - -() -
- -
- -
- -
- -
diff --git a/templates/postcomment_embed.tmpl b/templates/postcomment_embed.tmpl deleted file mode 100644 index eae741214..000000000 --- a/templates/postcomment_embed.tmpl +++ /dev/null @@ -1,7 +0,0 @@ -
- -[Posting comments disabled: ] - -Post a comment - -
diff --git a/templates/postcomment_form.tmpl b/templates/postcomment_form.tmpl deleted file mode 100644 index 293f0f17e..000000000 --- a/templates/postcomment_form.tmpl +++ /dev/null @@ -1,25 +0,0 @@ -
- - - - - -Subject:
-
-
-
-HTML is not allowed.
-IkiWiki directives ([[!directive]]) are not allowed.
- - - -
-
-Comment preview: -
-
- -
-
- -
-- cgit v1.2.3 From 249ea2ed7557e34614ef9f1f863cee9489798510 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 18 Nov 2008 10:44:34 +0000 Subject: comments: remove allowhtml option, just switch it on all the time Now that posts are individually sanitized, that should be safe. --- IkiWiki/Plugin/comments.pm | 9 --------- templates/comments_form.tmpl | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) (limited to 'templates') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index 8122f9d51..f10400db1 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -48,7 +48,6 @@ sub preprocess (@) { #{{{ $pagestate{$page}{comments}{comments} = defined $params{closed} ? (not IkiWiki::yesno($params{closed})) : 1; - $pagestate{$page}{comments}{allowhtml} = IkiWiki::yesno($params{allowhtml}); $pagestate{$page}{comments}{allowdirectives} = IkiWiki::yesno($params{allowdirectives}); $pagestate{$page}{comments}{commit} = defined $params{commit} ? IkiWiki::yesno($params{commit}) @@ -187,7 +186,6 @@ sub sessioncgi ($$) { #{{{ } my $allow_directives = $pagestate{$page}{comments}{allowdirectives}; - my $allow_html = $pagestate{$page}{comments}{allowdirectives}; my $commit_comments = defined $pagestate{$page}{comments}{commit} ? $pagestate{$page}{comments}{commit} : 1; @@ -203,7 +201,6 @@ sub sessioncgi ($$) { #{{{ htmllink($page, $page, 'ikiwiki/formatting', noimageinline => 1, linktext => 'FormattingHelp'), - allowhtml => $allow_html, allowdirectives => $allow_directives); if (not exists $pagesources{$page}) { @@ -243,12 +240,6 @@ sub sessioncgi ($$) { #{{{ unless $config{prefix_directives}; } - unless ($allow_html) { - $body =~ s/&(\w|#)/&$1/g; - $body =~ s//>/g; - } - IkiWiki::run_hooks(sanitize => sub { # $fake is a possible location for this comment. We don't # know yet what the comment number *actually* is. diff --git a/templates/comments_form.tmpl b/templates/comments_form.tmpl index fbf49be34..59c03b4f0 100644 --- a/templates/comments_form.tmpl +++ b/templates/comments_form.tmpl @@ -8,7 +8,7 @@ Subject:



-HTML is not allowed.
+Formatting with Markdown and HTML are allowed.
IkiWiki directives ([[!directive]]) are not allowed.
-- cgit v1.2.3 From 0df983c5a7a4292224e7f7c279fc7dbe9a79fba6 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 22 Nov 2008 19:01:28 +0000 Subject: Add comments to page.tmpl --- templates/page.tmpl | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'templates') diff --git a/templates/page.tmpl b/templates/page.tmpl index 8c2ca668f..94412078a 100644 --- a/templates/page.tmpl +++ b/templates/page.tmpl @@ -67,6 +67,12 @@
+ +
+ +
+
+