about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-02-15 09:46:36 +0000
committerEric Wong <e@yhbt.net>2020-02-16 00:06:40 +0000
commit6f3e8ec25faa1fc71c0bc13bb2615b8fa45a44a1 (patch)
treeaeffb373369e7f3c44ab5afb558055820a691adb
parentb2666c45f6ce539cbe64367675230b13e613b1fb (diff)
downloadpublic-inbox-6f3e8ec25faa1fc71c0bc13bb2615b8fa45a44a1.tar.gz
Avoid needlessly normalizing the subject when dumping, since
it's pushed into the @$topic array during accumulation in
normalized form.

We can also safely treat $smsg as a hashref and avoid
calling "->ds" as a method since we know we've got that
loaded via Over||Search and won't have to use Email::MIME
header lookup methods.
-rw-r--r--lib/PublicInbox/View.pm41
1 files changed, 19 insertions, 22 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index f0446723..e586b068 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -1039,35 +1039,32 @@ sub sort_ds {
 sub acc_topic { # walk_thread callback
         my ($ctx, $level, $node) = @_;
         my $mid = $node->{id};
-        my $x = $node->{smsg} || $ctx->{-inbox}->smsg_by_mid($mid);
-        my ($subj, $ds);
-        my $topic;
-        if ($x) {
-                $subj = $x->subject;
-                $subj = subject_normalized($subj);
+        my $smsg = $node->{smsg} // $ctx->{-inbox}->smsg_by_mid($mid);
+        if ($smsg) {
+                my $subj = subject_normalized($smsg->subject);
                 $subj = '(no subject)' if $subj eq '';
-                $ds = $x->ds;
-                if ($level == 0) {
-                        $topic = [ $ds, 1, { $subj => $mid }, $subj ];
+                my $ds = $smsg->{ds};
+                if ($level == 0) { # new, top-level topic
+                        my $topic = [ $ds, 1, { $subj => $mid }, $subj ];
                         $ctx->{-cur_topic} = $topic;
                         push @{$ctx->{order}}, $topic;
                         return 1;
                 }
 
-                $topic = $ctx->{-cur_topic}; # should never be undef
+                # continue existing topic
+                my $topic = $ctx->{-cur_topic}; # should never be undef
                 $topic->[0] = $ds if $ds > $topic->[0];
-                $topic->[1]++;
+                $topic->[1]++; # bump N+ message counter
                 my $seen = $topic->[2];
                 if (scalar(@$topic) == 3) { # parent was a ghost
                         push @$topic, $subj;
-                } elsif (!$seen->{$subj}) {
-                        push @$topic, $level, $subj;
+                } elsif (!defined($seen->{$subj})) {
+                        push @$topic, $level, $subj; # @extra messages
                 }
                 $seen->{$subj} = $mid; # latest for subject
         } else { # ghost message
                 return 1 if $level != 0; # ignore child ghosts
-                $topic = [ -666, 0, {} ];
-                $ctx->{-cur_topic} = $topic;
+                my $topic = $ctx->{-cur_topic} = [ -666, 0, {} ];
                 push @{$ctx->{order}}, $topic;
         }
         1;
@@ -1087,7 +1084,7 @@ sub dump_topics {
 
         # sort by recency, this allows new posts to "bump" old topics...
         foreach my $topic (sort { $b->[0] <=> $a->[0] } @$order) {
-                my ($ds, $n, $seen, $top_subj, @ex) = @$topic;
+                my ($ds, $n, $seen, $top_subj, @extra) = @$topic;
                 @$topic = ();
                 next unless defined $top_subj;  # ghost topic
                 my $mid = delete $seen->{$top_subj};
@@ -1111,19 +1108,19 @@ sub dump_topics {
                 my $atom = qq(<a\nhref="$href/t.atom">Atom</a>);
                 my $s = "<a\nhref=\"$href/T/$anchor\">$top_subj</a>\n" .
                         " $ds UTC $n - $mbox / $atom\n";
-                for (my $i = 0; $i < scalar(@ex); $i += 2) {
-                        my $level = $ex[$i];
-                        my $subj = $ex[$i + 1];
+                for (my $i = 0; $i < scalar(@extra); $i += 2) {
+                        my $level = $extra[$i];
+                        my $subj = $extra[$i + 1]; # already normalized
                         $mid = delete $seen->{$subj};
-                        my @subj = split(/ /, subject_normalized($subj));
+                        my @subj = split(/ /, $subj);
                         my @next_prev = @subj; # full copy
                         my $omit = dedupe_subject($prev_subj, \@subj, ' &#34;');
                         $prev_subj = \@next_prev;
-                        $subj = ascii_html(join(' ', @subj));
+                        $subj = ascii_html($subj);
                         obfuscate_addrs($obfs_ibx, $subj) if $obfs_ibx;
                         $href = mid_escape($mid);
                         $s .= indent_for($level) . TCHILD;
-                        $s .= "<a\nhref=\"$href/T/#u\">$subj</a>$omit\n";
+                        $s .= qq(<a\nhref="$href/T/#u">$subj</a>$omit\n);
                 }
                 push @out, $s;
         }