user/dev discussion of public-inbox itself
 help / color / Atom feed
From: Eric Wong <e@yhbt.net>
To: meta@public-inbox.org
Subject: [PATCH 4/8] view: cleanup topic accumulation and dumping
Date: Sat, 15 Feb 2020 09:46:36 +0000
Message-ID: <20200215094640.19425-5-e@yhbt.net> (raw)
In-Reply-To: <20200215094640.19425-1-e@yhbt.net>

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.
---
 lib/PublicInbox/View.pm | 41 +++++++++++++++++++----------------------
 1 file 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;
 	}

  parent reply index

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-15  9:46 [PATCH 0/8] some view cleanups and minor bugfixes Eric Wong
2020-02-15  9:46 ` [PATCH 1/8] view: remove mhref arg from multipart_text_as_html Eric Wong
2020-02-15  9:46 ` [PATCH 2/8] view: single id="t" for multi-Subject messages Eric Wong
2020-02-15  9:46 ` [PATCH 3/8] view: dump_topics: better naming of top Subject Eric Wong
2020-02-15  9:46 ` Eric Wong [this message]
2020-02-15  9:46 ` [PATCH 5/8] view,searchview: avoid smsg method calls when using SQLite/Xapian Eric Wong
2020-02-15  9:46 ` [PATCH 6/8] view: escape Subject HTML directly Eric Wong
2020-02-15  9:46 ` [PATCH 7/8] view: escape ampersand in Message-IDs Eric Wong
2020-02-15  9:46 ` [PATCH 8/8] view: remove last Hval->new caller Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://public-inbox.org/README

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200215094640.19425-5-e@yhbt.net \
    --to=e@yhbt.net \
    --cc=meta@public-inbox.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

user/dev discussion of public-inbox itself

Archives are clonable:
	git clone --mirror http://public-inbox.org/meta
	git clone --mirror http://czquwvybam4bgbro.onion/meta
	git clone --mirror http://hjrcffqmbrq6wope.onion/meta
	git clone --mirror http://ou63pmih66umazou.onion/meta

Example config snippet for mirrors

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
	nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta
	nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta
	nntp://news.gmane.io/gmane.mail.public-inbox.general

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git