lib/PublicInbox/Search.pm | 6 +++++- lib/PublicInbox/View.pm | 19 +++++++------------ diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm index db86301d8794e8bee3e83930724448983bc6247e..6a05ce7a4e72e5ff2303caf04bdb1c6eb7354869 100644 --- a/lib/PublicInbox/Search.pm +++ b/lib/PublicInbox/Search.pm @@ -10,6 +10,10 @@ require PublicInbox::View; use Email::MIME; use PublicInbox::MID qw/mid_clean mid_compressed/; +# This is English-only, everything else is non-standard and may be confused as +# a prefix common in patch emails +our $REPLY_RE = qr/^re:\s+/i; + use constant { TS => 0, # SCHEMA_VERSION history @@ -490,7 +494,7 @@ my $subj = pop; $subj =~ s/\A\s+//; $subj =~ s/\s+\z//; - $subj =~ s/^(?:re|aw):\s*//i; # remove reply prefix (aw: German) + $subj =~ s/$REPLY_RE//igo; # remove reply prefix $subj =~ s![^a-zA-Z0-9_\.~/\-]+!_!g; lc($subj); } diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index b0b8e140ee8111aad289296ce7f8c0d4160f1ce4..7122a38ded651c2e8e12979ffe1231ae8bf471bc 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -457,6 +457,7 @@ my $res = $srch->get_followups($mid); if (my $c = $res->{count}) { $c = $c == 1 ? '1 followup' : "$c followups"; $idx .= "\n$c:\n"; + $res->{srch} = $srch; thread_followups(\$idx, $mime, $res); } else { $idx .= "\n(no followups, yet)\n"; @@ -493,13 +494,14 @@ } sub simple_dump { my ($dst, $root, $node, $level) = @_; + # $root = [ Root Message-ID, \%seen, $srch ]; my $pfx = ' ' x $level; $$dst .= $pfx; if (my $x = $node->message) { my $mid = $x->header('Message-ID'); if ($root->[0] ne $mid) { my $s = $x->header('Subject'); - my $h = hash_subj($s); + my $h = $root->[2]->subject_path($s); if ($root->[1]->{$h}) { $s = ''; } else { @@ -525,15 +527,6 @@ simple_dump($dst, $root, $node->child, $level + 1) if $node->child; simple_dump($dst, $root, $node->next, $level) if $node->next; } -sub hash_subj { - my ($subj) = @_; - $subj =~ s/\A\s+//; - $subj =~ s/\s+\z//; - $subj =~ s/^(?:re|aw):\s*//i; # remove reply prefix (aw: German) - $subj =~ s/\s+/ /; - Digest::SHA::sha1($subj); -} - sub thread_followups { my ($dst, $root, $res) = @_; my @msgs = map { $_->mini_mime } @{$res->{msgs}}; @@ -542,8 +535,10 @@ $root->header_set('X-PI-TS', '0'); my $th = PublicInbox::Thread->new($root, @msgs); $th->thread; $th->order(*PublicInbox::Thread::sort_ts); - $root = [ $root->header('Message-ID'), - { hash_subj($root->header('Subject')) => 1 } ]; + my $srch = $res->{srch}; + my $subj = $srch->subject_path($root->header('Subject')); + my %seen = ($subj => 1); + $root = [ $root->header('Message-ID'), \%seen, $srch ]; simple_dump($dst, $root, $_, 0) for $th->rootset; }