]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/SearchMsg.pm
run update-copyrights from gnulib for 2019
[public-inbox.git] / lib / PublicInbox / SearchMsg.pm
index 722a1b9428fba760591452f67a044a1af8ba812d..adadf92ed097e8a1b23d11068faa8cebf0237783 100644 (file)
@@ -1,11 +1,15 @@
-# Copyright (C) 2015-2018 all contributors <meta@public-inbox.org>
+# Copyright (C) 2015-2019 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 # based on notmuch, but with no concept of folders, files or flags
 #
 # Wraps a document inside our Xapian search index.
+# There may be many of these objects loaded in memory at once
+# for large threads in our WWW UI.
 package PublicInbox::SearchMsg;
 use strict;
 use warnings;
+use base qw(Exporter);
+our @EXPORT_OK = qw(subject_normalized);
 use PublicInbox::MID qw/mid_clean mid_mime/;
 use PublicInbox::Address;
 use PublicInbox::MsgTime qw(msg_timestamp msg_datestamp);
@@ -21,12 +25,6 @@ sub wrap {
        bless { mid => $mid }, $class;
 }
 
-sub get {
-       my ($class, $head, $db, $mid) = @_;
-       my $doc_id = $head->get_docid;
-       load_expand(wrap($class, $mid), $db->get_document($doc_id));
-}
-
 sub get_val ($$) {
        my ($doc, $col) = @_;
        Search::Xapian::sortable_unserialise($doc->get_value($col));
@@ -183,4 +181,16 @@ sub mid ($;$) {
 
 sub _extract_mid { mid_clean(mid_mime($_[0]->{mime})) }
 
+our $REPLY_RE = qr/^re:\s+/i;
+
+sub subject_normalized ($) {
+       my ($subj) = @_;
+       $subj =~ s/\A\s+//s; # no leading space
+       $subj =~ s/\s+\z//s; # no trailing space
+       $subj =~ s/\s+/ /gs; # no redundant spaces
+       $subj =~ s/\.+\z//; # no trailing '.'
+       $subj =~ s/$REPLY_RE//igo; # remove reply prefix
+       $subj;
+}
+
 1;