about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-06-21 02:58:55 +0000
committerEric Wong <e@80x24.org>2016-06-21 03:06:55 +0000
commit2da0edea03166ba0f90d3168aadfbb78659fbe78 (patch)
treeafdc4857c2bd5aa9a681031bcbc979458650dc06 /lib/PublicInbox
parent1714e84586b23265cc7814158cb75a51f74b726c (diff)
downloadpublic-inbox-2da0edea03166ba0f90d3168aadfbb78659fbe78.tar.gz
This should let us generate HTML for arbitrarily deep
threads without blowing the stack.

How it renders on the client side is another matter...
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/View.pm15
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index e09fbd51..bc4a4432 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -177,8 +177,13 @@ sub emit_thread_html {
                 pre_anchor_entry($seen, $_) for (@$msgs);
                 __thread_entry($state, $_, 0) for (@$msgs);
         } else {
-                my $th = thread_results($msgs);
-                thread_entry($state, $_, 0) for $th->rootset;
+                my @q = map { (0, $_) } thread_results($msgs)->rootset;
+                while (@q) {
+                        my $level = shift @q;
+                        my $node = shift @q or next;
+                        thread_entry($state, $level, $node);
+                        unshift @q, $level+1, $node->child, $level, $node->next;
+                }
                 if (my $max = $state->{cur_level}) {
                         $state->{fh}->write(
                                 ('</ul></li>' x ($max - 1)) . '</ul>');
@@ -618,8 +623,7 @@ sub __ghost_prepare {
 }
 
 sub thread_entry {
-        my ($state, $node, $level) = @_;
-        return unless $node;
+        my ($state, $level, $node) = @_;
         if (my $mime = $node->message) {
                 unless (__thread_entry($state, $mime, $level)) {
                         __ghost_prepare($state, $node, $level);
@@ -627,9 +631,6 @@ sub thread_entry {
         } else {
                 __ghost_prepare($state, $node, $level);
         }
-
-        thread_entry($state, $node->child, $level + 1);
-        thread_entry($state, $node->next, $level);
 }
 
 sub load_results {