X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FView.pm;h=81e83d97738256511a530bc4093bfd2793267eb8;hb=956ede734d7c2e8d0a3003c6e2d554114586643e;hp=b39c820338993801e511a63e6291baf4443e4fc0;hpb=2aa29ee6a35f5be2d76c39ccc50bf7a34075e2bd;p=public-inbox.git diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index b39c8203..81e83d97 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -186,17 +186,17 @@ sub index_entry { $rv .= "\t[relevance $pct->{$mid_raw}%]"; $hr = 1; } elsif ($mapping) { - my $threaded = 'threaded'; + my $nested = 'nested'; my $flat = 'flat'; my $end = ''; if ($ctx->{flat}) { $hr = 1; $flat = "$flat"; } else { - $threaded = "$threaded"; + $nested = "$nested"; } $rv .= "\t[$flat"; - $rv .= "|$threaded]"; + $rv .= "|$nested]"; $rv .= " $ctx->{s_nr}"; } else { $hr = $ctx->{-hr}; @@ -370,7 +370,7 @@ sub thread_html { $ctx->{mapping} = {}; $ctx->{s_nr} = "$nr+ messages in thread"; - my $rootset = thread_results($msgs); + my $rootset = thread_results($msgs, $srch); # reduce hash lookups in pre_thread->skel_dump my $inbox = $ctx->{-inbox}; @@ -607,7 +607,7 @@ sub thread_skel { # reduce hash lookups in skel_dump my $ibx = $ctx->{-inbox}; $ctx->{-obfs_ibx} = $ibx->{obfuscate} ? $ibx : undef; - walk_thread(thread_results($sres), $ctx, *skel_dump); + walk_thread(thread_results($sres, $srch), $ctx, *skel_dump); $ctx->{parent_msg} = $parent; } @@ -720,7 +720,7 @@ sub ghost_parent { sub indent_for { my ($level) = @_; - INDENT x ($level - 1); + $level ? INDENT x ($level - 1) : ''; } sub load_results { @@ -736,9 +736,9 @@ sub msg_timestamp { } sub thread_results { - my ($msgs) = @_; + my ($msgs, $srch) = @_; require PublicInbox::SearchThread; - PublicInbox::SearchThread::thread($msgs, *sort_ts); + PublicInbox::SearchThread::thread($msgs, *sort_ts, $srch); } sub missing_thread { @@ -755,6 +755,25 @@ sub _msg_date { sub fmt_ts { POSIX::strftime('%Y-%m-%d %k:%M', gmtime($_[0])) } +sub dedupe_subject { + my ($prev_subj, $subj, $val) = @_; + + my $omit = ''; # '"' denotes identical text omitted + my (@prev_pop, @curr_pop); + while (@$prev_subj && @$subj && $subj->[-1] eq $prev_subj->[-1]) { + push(@prev_pop, pop(@$prev_subj)); + push(@curr_pop, pop(@$subj)); + $omit ||= $val; + } + pop @$subj if @$subj && $subj->[-1] =~ /^re:\s*/i; + if (scalar(@curr_pop) == 1) { + $omit = ''; + push @$prev_subj, @prev_pop; + push @$subj, @curr_pop; + } + $omit; +} + sub skel_dump { my ($ctx, $level, $node) = @_; my $smsg = $node->{smsg} or return _skel_ghost($ctx, $level, $node); @@ -798,13 +817,7 @@ sub skel_dump { # so we do not show redundant text at the end. my $prev_subj = $ctx->{prev_subj} || []; $ctx->{prev_subj} = [ @subj ]; - my $omit = ''; # '"' denotes identical text omitted - while (@$prev_subj && @subj && $subj[-1] eq $prev_subj->[-1]) { - pop @$prev_subj; - pop @subj; - $omit ||= '" '; - } - pop @subj if @subj && $subj[-1] =~ /^re:\s*/i; + my $omit = dedupe_subject($prev_subj, \@subj, '" '); my $end; if (@subj) { my $subj = join(' ', @subj); @@ -944,14 +957,7 @@ sub dump_topics { $mid = delete $seen->{$subj}; my @subj = split(/ /, $srch->subject_normalized($subj)); my @next_prev = @subj; # full copy - my $omit = ''; # '"' denotes identical text omitted - while (@$prev_subj && @subj && - $subj[-1] eq $prev_subj->[-1]) { - pop @$prev_subj; - pop @subj; - $omit ||= ' "'; - } - pop @subj if @subj && $subj[-1] =~ /^re:\s*/i; + my $omit = dedupe_subject($prev_subj, \@subj, ' "'); $prev_subj = \@next_prev; $subj = ascii_html(join(' ', @subj)); obfuscate_addrs($obfs_ibx, $subj) if $obfs_ibx; @@ -1000,7 +1006,7 @@ sub index_topics { my $nr = scalar @{$sres->{msgs}}; if ($nr) { $sres = load_results($srch, $sres); - walk_thread(thread_results($sres), $ctx, *acc_topic); + walk_thread(thread_results($sres, $srch), $ctx, *acc_topic); } $ctx->{-next_o} = $off+ $nr; $ctx->{-cur_o} = $off;