format moderation queue only at end, avoid O(N^3) bug
authorJoey Hess <joey@gnu.kitenet.net>
Mon, 26 Jan 2009 03:30:28 +0000 (22:30 -0500)
committerJoey Hess <joey@gnu.kitenet.net>
Mon, 26 Jan 2009 03:30:28 +0000 (22:30 -0500)
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.

IkiWiki/Plugin/comments.pm

index 32f3712f2423a05b04f91cd43da77af8adfa89b8..b2243ce4c85e3938483e4656746cf93d0b2f6821 100644 (file)
@@ -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);