]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/View.pm
view: avoid deduping a single word in subject skeletons
[public-inbox.git] / lib / PublicInbox / View.pm
index 7454acbba153bc80f86ae09f4c931c36bb007a5b..81e83d97738256511a530bc4093bfd2793267eb8 100644 (file)
@@ -104,9 +104,8 @@ EOF
 sub in_reply_to {
        my ($hdr) = @_;
        my %mid = map { $_ => 1 } $hdr->header_raw('Message-ID');
-       my @refs = ($hdr->header_raw('References'),
-                       $hdr->header_raw('In-Reply-To'));
-       @refs = ((join(' ', @refs)) =~ /<([^>]+)>/g);
+       my @refs = (($hdr->header_raw('References') || '') =~ /<([^>]+)>/g);
+       push(@refs, (($hdr->header_raw('In-Reply-To') || '') =~ /<([^>]+)>/g));
        while (defined(my $irt = pop @refs)) {
                next if $mid{"<$irt>"};
                return $irt;
@@ -187,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 = "<b>$flat</b>";
                } else {
-                       $threaded = "<b>$threaded</b>";
+                       $nested = "<b>$nested</b>";
                }
                $rv .= "\t[<a\nhref=\"${mhref}T/#u\">$flat</a>";
-               $rv .= "|<a\nhref=\"${mhref}t/#u\">$threaded</a>]";
+               $rv .= "|<a\nhref=\"${mhref}t/#u\">$nested</a>]";
                $rv .= " <a\nhref=#r$id>$ctx->{s_nr}</a>";
        } else {
                $hr = $ctx->{-hr};
@@ -371,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};
@@ -608,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;
 }
@@ -721,7 +720,7 @@ sub ghost_parent {
 
 sub indent_for {
        my ($level) = @_;
-       INDENT x ($level - 1);
+       $level ? INDENT x ($level - 1) : '';
 }
 
 sub load_results {
@@ -737,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 {
@@ -756,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);
@@ -799,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 ||= '&#34; ';
-       }
-       pop @subj if @subj && $subj[-1] =~ /^re:\s*/i;
+       my $omit = dedupe_subject($prev_subj, \@subj, '&#34; ');
        my $end;
        if (@subj) {
                my $subj = join(' ', @subj);
@@ -945,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 ||= ' &#34;';
-                       }
-                       pop @subj if @subj && $subj[-1] =~ /^re:\s*/i;
+                       my $omit = dedupe_subject($prev_subj, \@subj, ' &#34;');
                        $prev_subj = \@next_prev;
                        $subj = ascii_html(join(' ', @subj));
                        obfuscate_addrs($obfs_ibx, $subj) if $obfs_ibx;
@@ -1001,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;