lib/PublicInbox/Hval.pm | 4 ++-- lib/PublicInbox/View.pm | 33 +++++++++++++++++++-------------- diff --git a/lib/PublicInbox/Hval.pm b/lib/PublicInbox/Hval.pm index 21efe40ef87771668b204836076e438886f1fb0f..0445e5759cb045df3778bb40c915a201c748111f 100644 --- a/lib/PublicInbox/Hval.pm +++ b/lib/PublicInbox/Hval.pm @@ -25,9 +25,9 @@ $self; } sub new_msgid { - my ($class, $msgid) = @_; + my ($class, $msgid, $no_compress) = @_; $msgid = mid_clean($msgid); - $class->new($msgid, mid_compress($msgid)); + $class->new($msgid, $no_compress ? $msgid : mid_compress($msgid)); } sub new_oneline { diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 98fc133db9b4ed28f16ac8e8ade6c0cd3b236b31..1528a874ada4f5c1256700de5e71e501cd000fda 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -132,7 +132,7 @@ $rv .= html_footer($mime, 0, undef, $ctx); if (defined $irt) { unless (defined $parent_anchor) { - my $v = PublicInbox::Hval->new_msgid($irt); + my $v = PublicInbox::Hval->new_msgid($irt, 1); $v = $v->as_href; $parent_anchor = "${path}$v/"; } @@ -452,22 +452,25 @@ my $nr = $res->{total}; if ($nr <= 1) { $$dst .= "\n[no followups, yet]\n"; - return; + return (undef, in_reply_to($cur)); } my $upfx = $full_pfx ? '' : '../'; $$dst .= "\n\n~$nr messages in thread: ". "(expand)\n"; my $subj = $srch->subject_path($cur->header('Subject')); + my $parent = in_reply_to($cur); my $state = { seen => { $subj => 1 }, srch => $srch, cur => $mid, + parent_cmp => $parent ? mid_compress($parent) : '', + parent => $parent, }; for (thread_results(load_results($res))->rootset) { inline_dump($dst, $state, $upfx, $_, 0); } - $state->{next_msg}; + ($state->{next_msg}, $state->{parent}); } sub _parent_headers_nosrch { @@ -476,7 +479,7 @@ my $rv = ''; my $irt = in_reply_to($header_obj); if (defined $irt) { - my $v = PublicInbox::Hval->new_msgid($irt); + my $v = PublicInbox::Hval->new_msgid($irt, 1); my $html = $v->as_html; my $href = $v->as_href; $rv .= "In-Reply-To: <"; @@ -493,7 +496,7 @@ my @raw_refs = ($refs =~ /<([^>]+)>/g); foreach my $ref (@raw_refs) { next if $seen{$ref}; $seen{$ref} = 1; - push @refs, linkify_ref($ref); + push @refs, linkify_ref_nosrch($ref); } if (@refs) { @@ -536,12 +539,11 @@ my $srch = $ctx->{srch} if $ctx; my $upfx = $full_pfx ? '../' : '../../'; my $idx = $standalone ? " index" : ''; if ($idx && $srch) { - my $next = thread_inline(\$idx, $ctx, $mime, $full_pfx); - $irt = in_reply_to($mime->header_obj); - if (defined $irt) { - $irt = PublicInbox::Hval->new_msgid($irt); - $irt = $irt->as_href; - $irt = "parent "; + my ($next, $p) = thread_inline(\$idx, $ctx, $mime, $full_pfx); + if (defined $p) { + $p = PublicInbox::Hval->new_oneline($p); + $p = $p->as_href; + $irt = "parent "; } else { $irt = ' ' x length('parent '); } @@ -557,8 +559,8 @@ "$irtreply' . $idx; } -sub linkify_ref { - my $v = PublicInbox::Hval->new_msgid($_[0]); +sub linkify_ref_nosrch { + my $v = PublicInbox::Hval->new_msgid($_[0], 1); my $html = $v->as_html; my $href = $v->as_href; "<$html>"; @@ -699,8 +701,11 @@ sub inline_dump { my ($dst, $state, $upfx, $node, $level) = @_; return unless $node; - return if $state->{stopped}; if (my $mime = $node->message) { + my $mid = mid_clean($mime->header('Message-ID')); + if ($mid eq $state->{parent_cmp}) { + $state->{parent} = $mid; + } _inline_header($dst, $state, $upfx, $mime, $level); } inline_dump($dst, $state, $upfx, $node->child, $level+1);