diff options
author | Eric Wong <e@80x24.org> | 2015-08-15 09:28:33 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2015-08-15 19:15:40 +0000 |
commit | 7edf30e5349ab5566815e5050e9ba0f53e1d0bb9 (patch) | |
tree | aa46cb0560f187e197614a4530efbe23969f27d1 /lib/PublicInbox/SearchMsg.pm | |
parent | d7fcdec712accc212bcfa35e50ade1233eb9beb3 (diff) | |
download | public-inbox-7edf30e5349ab5566815e5050e9ba0f53e1d0bb9.tar.gz |
This will relieve callers of the need to decode the data we store internally in Xapian
Diffstat (limited to 'lib/PublicInbox/SearchMsg.pm')
-rw-r--r-- | lib/PublicInbox/SearchMsg.pm | 81 |
1 files changed, 77 insertions, 4 deletions
diff --git a/lib/PublicInbox/SearchMsg.pm b/lib/PublicInbox/SearchMsg.pm index 920804ac..619a19d4 100644 --- a/lib/PublicInbox/SearchMsg.pm +++ b/lib/PublicInbox/SearchMsg.pm @@ -5,6 +5,10 @@ package PublicInbox::SearchMsg; use strict; use warnings; use Search::Xapian; +use Email::Address qw//; +use POSIX qw//; +use Date::Parse qw/str2time/; +use PublicInbox::MID qw/mid_clean mid_compressed/; our $PFX2TERM_RE = undef; sub new { @@ -20,6 +24,78 @@ sub wrap { bless { doc => $doc, mime => undef, mid => $mid }, $class; } +sub load_doc { + my ($class, $doc) = @_; + my ($mid, $subj, $from, $date) = split(/\n/, $doc->get_data); + bless { + doc => $doc, + mid => $mid, + subject => $subj, + date => $date, + from_name => $from, + }, $class; +} + +sub subject { + my ($self) = @_; + my $subj = $self->{subject}; + return $subj if defined $subj; + $subj = $self->{mime}->header('Subject'); + $subj = '' unless defined $subj; + $subj =~ tr/\n/ /; + $self->{subject} = $subj; +} + +sub from { + my ($self) = @_; + my $from = $self->mime->header('From') || ''; + my @from; + + if ($from) { + @from = Email::Address->parse($from); + $self->{from} = $from[0]; + $from = $from[0]->name; + } + $from =~ tr/\n/ /; + $self->{from_name} = $from; + $self->{from}; +} + +sub from_name { + my ($self) = @_; + my $from_name = $self->{from_name}; + return $from_name if defined $from_name; + $self->from; + $self->{from_name}; +} + +sub ts { + my ($self) = @_; + my $ts = $self->{ts}; + return $ts if $ts; + $self->{date} = undef; + $self->date; + $self->{ts}; +} + +sub date { + my ($self) = @_; + my $date = $self->{date}; + return $date if $date; + my $ts = eval { str2time($self->mime->header('Date')) } || 0; + $self->{ts} = $ts; + $self->{date} = POSIX::strftime('%Y-%m-%d %H:%M', gmtime($ts)); +} + +sub to_doc_data { + my ($self) = @_; + + $self->mid . "\n" . + $self->subject . "\n" . + $self->from_name . "\n". + $self->date; +} + sub ensure_metadata { my ($self) = @_; my $doc = $self->{doc}; @@ -60,10 +136,7 @@ sub _extract_mid { my ($self) = @_; my $mid = $self->mime->header('Message-ID'); - if ($mid && $mid =~ /<([^>]+)>/) { - return $1; - } - return $mid; + $mid ? mid_compressed(mid_clean($mid)) : $mid; } sub mime { |