lib/PublicInbox/View.pm | 52 ++++++++++++++++++++++++++++++++++------------------ diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index ad90eb3d09e593e3cbe73b7cee6b9b6e652408c4..bcd2ebc4cc8d0fd0df24e99a6c922d06de835536 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -103,11 +103,7 @@ $subj = "$subj"; } my $ts = _msg_date($mime); - my $rv = ""; - if ($level) { - $rv .= '
' . (INDENT x $level) . '
'; - } - $rv .= "
";
+	my $rv = "";
 	$rv .= "$subj\n";
 	$rv .= "- $from @ $ts UTC - ";
 	$rv .= "next";
@@ -155,8 +151,7 @@ 			$rv .= " [threaded|" .
 				"flat]";
 		}
 	}
-
-	$fh->write($rv .= '
'); + $fh->write($rv .= ''); } sub thread_html { @@ -181,6 +176,7 @@ ctx => $ctx, seen => $seen, root_anchor => anchor_for($mid), anchor_idx => 0, + max_level => 0, }; require PublicInbox::Git; @@ -191,6 +187,10 @@ __thread_entry(\$cb, $git, $state, $_, 0) for (@$msgs); } else { my $th = thread_results($msgs); thread_entry(\$cb, $git, $state, $_, 0) for $th->rootset; + if (my $max = $state->{max_level}) { + my $x = $max > 1 ? ('' x ($max-1)) : ''; + $cb->write($x . ''); + } } $git = undef; Email::Address->purge_cache; @@ -637,12 +637,25 @@ my $html = $mid->as_html; qq{[parent not found: <$html>]}; } -sub ghost_table { - my ($upfx, $mid, $level) = @_; - "" . - (INDENT x $level) . '
' .
-		ghost_parent($upfx, $mid) .
-		'
'; +sub __thread_adj_level { + my ($cb, $state, $level) = @_; + + return if $level <= 0; # flat output + my $max = $state->{max_level}; + if ($level > $max) { + $state->{max_level} = $level; + $$cb->write(($max ? '
  • ' : ''). '
    • '); + } else { + $$cb->write('
    • '); + } +} + +sub __ghost_flush { + my ($cb, $state, $upfx, $mid, $level) = @_; + + __thread_adj_level($cb, $state, $level); + $$cb->write('
      '. ghost_parent($upfx, $mid) .  '
      ' . + ($level > 0 ? '
    • ' : '')); } sub __thread_entry { @@ -655,20 +668,23 @@ Email::MIME->new($git->cat_file('HEAD:'.$path)); } or return; if ($state->{anchor_idx} == 0) { - thread_html_head($cb, $mime, $state); + thread_html_head($cb, $mime, $state, $level); } if (my $ghost = delete $state->{ghost}) { # n.b. ghost messages may only be parents, not children foreach my $g (@$ghost) { - $$cb->write(ghost_table('../../', @$g)); + __ghost_flush($cb, $state, '../../', @$g); } } + __thread_adj_level($cb, $state, $level); index_entry($$cb, $mime, $level, $state); + $$cb->write('') if $level > 0; + 1; } -sub __ghost_entry { +sub __ghost_prepare { my ($state, $node, $level) = @_; my $ghost = $state->{ghost} ||= []; push @$ghost, [ $node->messageid, $level ]; @@ -679,10 +695,10 @@ my ($cb, $git, $state, $node, $level) = @_; return unless $node; if (my $mime = $node->message) { unless (__thread_entry($cb, $git, $state, $mime, $level)) { - __ghost_entry($state, $node, $level); + __ghost_prepare($state, $node, $level); } } else { - __ghost_entry($state, $node, $level); + __ghost_prepare($state, $node, $level); } thread_entry($cb, $git, $state, $node->child, $level + 1);