diff options
author | Eric Wong <e@80x24.org> | 2016-06-21 02:58:55 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-06-21 03:06:55 +0000 |
commit | 2da0edea03166ba0f90d3168aadfbb78659fbe78 (patch) | |
tree | afdc4857c2bd5aa9a681031bcbc979458650dc06 /lib | |
parent | 1714e84586b23265cc7814158cb75a51f74b726c (diff) | |
download | public-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')
-rw-r--r-- | lib/PublicInbox/View.pm | 15 |
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 { |