@ $attr";
if ($nr_c) {
- my $cmid = $children->[0]->{mid};
- $rv .= $pad . $mapping->{$cmid}->[0];
+ my $cmid = $children->[0] ? $children->[0]->{mid} : undef;
+ $rv .= $pad . _skel_hdr($mapping, $cmid);
if ($nr_c > 2) {
my $s = ($nr_c - 1). ' more replies';
$rv .= pad_link($cmid, $level + 1, $s);
} elsif (my $cn = $children->[1]) {
- $rv .= $pad . $mapping->{$cn->{mid}}->[0];
+ $rv .= $pad . _skel_hdr($mapping, $cn->{mid});
}
}
my $next = $siblings->[$idx+1] if $siblings && $idx >= 0;
if ($next) {
my $nmid = $next->{mid};
- $rv .= $pad . $mapping->{$nmid}->[0];
+ $rv .= $pad . _skel_hdr($mapping, $nmid);
my $nnext = $nr_s - $idx;
if ($nnext > 2) {
my $s = ($nnext - 1).' subsequent siblings';
$rv .= pad_link($nmid, $level, $s);
} elsif (my $nn = $siblings->[$idx + 2]) {
- $rv .= $pad . $mapping->{$nn->{mid}}->[0];
+ $rv .= $pad . _skel_hdr($mapping, $nn->{mid});
}
}
$rv .= $pad ."$s_s, $s_c; $ctx->{s_nr}\n";
@@ -448,8 +460,8 @@ EOF
$ctx->{skel} = \$skel;
$ctx->{prev_attr} = '';
$ctx->{prev_level} = 0;
- $ctx->{root_anchor} = anchor_for($mid);
- $ctx->{mapping} = {};
+ $ctx->{root_anchor} = 'm' . id_compress($mid, 1);
+ $ctx->{mapping} = {}; # mid -> [ header_summary, node, idx, level ]
$ctx->{s_nr} = ($nr > 1 ? "$nr+ messages" : 'only message')
.' in thread';
@@ -518,7 +530,7 @@ sub attach_link ($$$$;$) {
return unless $part->{bdy};
my $nl = $idx eq '1' ? '' : "\n"; # like join("\n", ...)
- my $size = bytes::length($part->body);
+ my $size = length($part->body);
# hide attributes normally, unless we want to aid users in
# spotting MUA problems:
@@ -591,8 +603,9 @@ sub add_text_body { # callback for each_part
$diff = 1;
delete $ctx->{-long_path};
my $spfx;
- if ($ibx->{-repo_objs}) {
- if (index($upfx, '//') >= 0) { # absolute URL (Atom feeds)
+ # absolute URL (Atom feeds)
+ if ($ibx->{coderepo}) {
+ if (index($upfx, '//') >= 0) {
$spfx = $upfx;
$spfx =~ s!/([^/]*)/\z!/!;
} else {
@@ -645,13 +658,16 @@ sub _msg_page_prepare_obuf {
my $mids = mids_for_index($eml);
my $nr = $ctx->{nr}++;
if ($nr) { # unlikely
+ if ($ctx->{chash} eq content_hash($eml)) {
+ warn "W: BUG? @$mids not deduplicated properly\n";
+ return \$rv;
+ }
+ $rv .=
+"WARNING: multiple messages have this Message-ID\n
";
$rv .= '';
} else {
$ctx->{first_hdr} = $eml->header_obj;
- if ($ctx->{smsg}) {
- $rv .=
-"WARNING: multiple messages have this Message-ID\n
";
- }
+ $ctx->{chash} = content_hash($eml) if $ctx->{smsg}; # reused MID
$rv .= ""; # anchor for body start
}
$ctx->{-upfx} = '../' if $over;
@@ -693,7 +709,7 @@ sub _msg_page_prepare_obuf {
for my $v ($eml->header('Date')) {
$v = ascii_html($v);
obfuscate_addrs($obfs_ibx, $v) if $obfs_ibx; # possible :P
- $rv .= "Date: $v\n";
+ $rv .= qq{Date: $v\t[thread overview]\n};
}
if (!$nr) { # first (and only) message, common case
$ctx->{-title_html} = join(' - ', @title);
@@ -738,7 +754,8 @@ sub thread_skel ($$$) {
$$skel .= SKEL_EXPAND."\n ";
$$skel .= ghost_parent('../', $parent) . "\n";
} else {
- $$skel .= '[no followups] '.SKEL_EXPAND."\n";
+ $$skel .= "[no followups] ".
+ SKEL_EXPAND."\n";
}
$ctx->{next_msg} = undef;
$ctx->{parent_msg} = $parent;
@@ -859,11 +876,6 @@ sub linkify_ref_no_over {
"<$html>";
}
-sub anchor_for {
- my ($msgid) = @_;
- 'm' . id_compress($msgid, 1);
-}
-
sub ghost_parent {
my ($upfx, $mid) = @_;
@@ -1141,10 +1153,8 @@ sub dump_topics {
$anchor = '#t'; # thread skeleton
}
- my $mbox = qq(mbox.gz);
- my $atom = qq(Atom);
my $s = "$top_subj\n" .
- " $ds UTC $n - $mbox / $atom\n";
+ " $ds UTC $n\n";
for (my $i = 0; $i < scalar(@extra); $i += 2) {
my $level = $extra[$i];
my $subj = $extra[$i + 1]; # already normalized
@@ -1264,7 +1274,7 @@ sub thread_adj_level {
sub ghost_index_entry {
my ($ctx, $level, $node) = @_;
my ($beg, $end) = thread_adj_level($ctx, $level);
- $beg . ''. ghost_parent($ctx->{-upfx}, $node->{mid})
+ $beg . ''. ghost_parent($ctx->{-upfx}, $node->{mid} // '?')
. '
' . $end;
}