summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@gnu.kitenet.net>2009-01-25 22:30:28 -0500
committerJoey Hess <joey@gnu.kitenet.net>2009-01-25 22:30:28 -0500
commit42b3e13739ccf67e3867c8e6864a2afdafa61c4a (patch)
tree27708b07636825d4601f65fb12b35062d21a32c6
parent9d4f396b1353d58c6b526818b69ada459b1be24c (diff)
format moderation queue only at end, avoid O(N^3) bug
It was calling format hooks for each comment on the page. When relativedate is enabled, that made it insert <script> tags for each comment. And the browser loaded the same script over and over, which was slow on its own. But that was nothing compared to running the onload even over and over.. especially since the hook system added a new call to the hook each time it loaded. For a page with 10 comments, that caused the relativedate DOM parsing code to run 1000 times, I think. Anyway, it was sloow. Now it runs once.
-rw-r--r--IkiWiki/Plugin/comments.pm23
1 files changed, 14 insertions, 9 deletions
diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index 32f3712f2..b2243ce4c 100644
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -442,8 +442,12 @@ sub editcomment ($$) {
# - this means that if they do, rocks fall and everyone dies
if ($form->submitted eq PREVIEW) {
- $form->tmpl_param(page_preview =>
- previewcomment($content, $location, $page, time));
+ my $preview=previewcomment($content, $location, $page, time);
+ IkiWiki::run_hooks(format => sub {
+ $preview = shift->(page => $page,
+ content => $preview);
+ });
+ $form->tmpl_param(page_preview => $preview);
}
else {
$form->tmpl_param(page_preview => "");
@@ -603,10 +607,11 @@ sub commentmoderation ($$) {
my ($id, $ctime)=@{$_};
my $file="$config{wikistatedir}/comments_pending/$id";
my $content=readfile($file);
+ my $preview=previewcomment($content, $id,
+ IkiWiki::dirname($_), $ctime);
{
id => $id,
- view => previewcomment($content, $id,
- IkiWiki::dirname($_), $ctime),
+ view => $preview,
}
} sort { $b->[1] <=> $a->[1] } comments_pending();
@@ -616,7 +621,11 @@ sub commentmoderation ($$) {
comments => \@comments,
);
IkiWiki::printheader($session);
- print IkiWiki::misctemplate(gettext("comment moderation"), $template->output);
+ my $out=$template->output;
+ IkiWiki::run_hooks(format => sub {
+ $out = shift->(page => "", content => $out);
+ });
+ print IkiWiki::misctemplate(gettext("comment moderation"), $out);
exit;
}
@@ -671,10 +680,6 @@ sub previewcomment ($$$) {
IkiWiki::linkify($location, $page,
IkiWiki::preprocess($location, $page,
IkiWiki::filter($location, $page, $content), 0, 1)));
- IkiWiki::run_hooks(format => sub {
- $preview = shift->(page => $page,
- content => $preview);
- });
my $template = template("comment.tmpl");
$template->param(content => $preview);