]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/View.pm
introduce PublicInbox::MIME wrapper class
[public-inbox.git] / lib / PublicInbox / View.pm
index c2e1ae76a400aef4395fc77641c23fe37668e3a1..2c37cd424e38026ad48f8b3b52ec87382d5d1b1b 100644 (file)
@@ -260,8 +260,8 @@ sub _th_index_lite {
 }
 
 sub walk_thread {
-       my ($th, $ctx, $cb) = @_;
-       my @q = map { (0, $_, -1) } @{$th->{rootset}};
+       my ($rootset, $ctx, $cb) = @_;
+       my @q = map { (0, $_, -1) } @$rootset;
        while (@q) {
                my ($level, $node, $i) = splice(@q, 0, 3);
                defined $node or next;
@@ -285,10 +285,10 @@ sub thread_index_entry {
 }
 
 sub stream_thread ($$) {
-       my ($th, $ctx) = @_;
+       my ($rootset, $ctx) = @_;
        my $inbox = $ctx->{-inbox};
        my $mime;
-       my @q = map { (0, $_) } @{$th->{rootset}};
+       my @q = map { (0, $_) } @$rootset;
        my $level;
        while (@q) {
                $level = shift @q;
@@ -299,7 +299,7 @@ sub stream_thread ($$) {
        }
        return missing_thread($ctx) unless $mime;
 
-       $mime = Email::MIME->new($mime);
+       $mime = PublicInbox::MIME->new($mime);
        $ctx->{-title_html} = ascii_html($mime->header('Subject'));
        $ctx->{-html_tip} = thread_index_entry($ctx, $level, $mime);
        PublicInbox::WwwStream->response($ctx, 200, sub {
@@ -311,7 +311,7 @@ sub stream_thread ($$) {
                        unshift @q, map { ($cl, $_) } @{$node->{children}};
                        my $mid = $node->{id};
                        if ($mime = $inbox->msg_by_smsg($node->{smsg})) {
-                               $mime = Email::MIME->new($mime);
+                               $mime = PublicInbox::MIME->new($mime);
                                return thread_index_entry($ctx, $level, $mime);
                        } else {
                                return ghost_index_entry($ctx, $level, $node);
@@ -327,8 +327,9 @@ sub stream_thread ($$) {
 sub thread_html {
        my ($ctx) = @_;
        my $mid = $ctx->{mid};
-       my $sres = $ctx->{srch}->get_thread($mid, { asc => 1 });
-       my $msgs = load_results($sres);
+       my $srch = $ctx->{srch};
+       my $sres = $srch->get_thread($mid);
+       my $msgs = load_results($srch, $sres);
        my $nr = $sres->{total};
        return missing_thread($ctx) if $nr == 0;
        my $skel = '<hr><pre>';
@@ -349,10 +350,10 @@ sub thread_html {
        $ctx->{mapping} = {};
        $ctx->{s_nr} = "$nr+ messages in thread";
 
-       my $th = thread_results($msgs);
-       walk_thread($th, $ctx, *pre_thread);
+       my $rootset = thread_results($msgs);
+       walk_thread($rootset, $ctx, *pre_thread);
        $skel .= '</pre>';
-       return stream_thread($th, $ctx) unless $ctx->{flat};
+       return stream_thread($rootset, $ctx) unless $ctx->{flat};
 
        # flat display: lazy load the full message from smsg
        my $inbox = $ctx->{-inbox};
@@ -361,7 +362,7 @@ sub thread_html {
                $mime = $inbox->msg_by_smsg($mime) and last;
        }
        return missing_thread($ctx) unless $mime;
-       $mime = Email::MIME->new($mime);
+       $mime = PublicInbox::MIME->new($mime);
        $ctx->{-title_html} = ascii_html($mime->header('Subject'));
        $ctx->{-html_tip} = '<pre>'.index_entry($mime, $ctx, scalar @$msgs);
        $mime = undef;
@@ -371,7 +372,7 @@ sub thread_html {
                        $mime = $inbox->msg_by_smsg($mime) and last;
                }
                if ($mime) {
-                       $mime = Email::MIME->new($mime);
+                       $mime = PublicInbox::MIME->new($mime);
                        return index_entry($mime, $ctx, scalar @$msgs);
                }
                $msgs = undef;
@@ -440,7 +441,7 @@ sub attach_link ($$$$;$) {
 
 sub add_text_body {
        my ($upfx, $p) = @_; # from msg_iter: [ Email::MIME, depth, @idx ]
-       my ($part, $depth, @idx) = @$p;
+       my ($part, $depth) = @$p; # attachment @idx is unused
        my $ct = $part->content_type || 'text/plain';
        my $fn = $part->filename;
 
@@ -475,29 +476,26 @@ sub add_text_body {
        }
        my @quot;
        my $l = PublicInbox::Linkify->new;
-       while (defined(my $cur = shift @lines)) {
+       foreach my $cur (@lines) {
                if ($cur !~ /^>/) {
                        # show the previously buffered quote inline
                        flush_quote(\$s, $l, \@quot) if @quot;
 
                        # regular line, OK
-                       $cur = $l->linkify_1($cur);
-                       $cur = ascii_html($cur);
-                       $s .= $l->linkify_2($cur);
+                       $l->linkify_1($cur);
+                       $s .= $l->linkify_2(ascii_html($cur));
                } else {
                        push @quot, $cur;
                }
        }
 
-       my $end = "\n";
-       if (@quot) {
-               $end = '';
+       if (@quot) { # ugh, top posted
                flush_quote(\$s, $l, \@quot);
+       } elsif ($s =~ /\n\z/s) { # common, last line ends with a newline
+               $s;
+       } else { # some editors don't do newlines...
+               $s .= "\n";
        }
-       $s =~ s/[ \t]+$//sgm; # kill per-line trailing whitespace
-       $s =~ s/\A\n+//s; # kill leading blank lines
-       $s =~ s/\s+\z//s; # kill all trailing spaces
-       $s .= $end;
 }
 
 sub _msg_html_prepare {
@@ -574,7 +572,8 @@ sub thread_skel {
        $ctx->{prev_attr} = '';
        $ctx->{prev_level} = 0;
        $ctx->{dst} = $dst;
-       walk_thread(thread_results(load_results($sres)), $ctx, *skel_dump);
+       $sres = load_results($srch, $sres);
+       walk_thread(thread_results($sres), $ctx, *skel_dump);
        $ctx->{parent_msg} = $parent;
 }
 
@@ -733,9 +732,9 @@ sub indent_for {
 }
 
 sub load_results {
-       my ($sres) = @_;
-
-       [ map { $_->ensure_metadata; $_ } @{delete $sres->{msgs}} ];
+       my ($srch, $sres) = @_;
+       my $msgs = delete $sres->{msgs};
+       $srch->retry_reopen(sub { [ map { $_->mid; $_ } @$msgs ] });
 }
 
 sub msg_timestamp {
@@ -747,10 +746,7 @@ sub msg_timestamp {
 sub thread_results {
        my ($msgs) = @_;
        require PublicInbox::SearchThread;
-       my $th = PublicInbox::SearchThread->new($msgs);
-       $th->thread;
-       $th->order(*sort_ts);
-       $th
+       PublicInbox::SearchThread::thread($msgs, *sort_ts);
 }
 
 sub missing_thread {
@@ -975,10 +971,11 @@ sub index_topics {
        my $opts = { offset => $off, limit => 200 };
 
        $ctx->{order} = [];
-       my $sres = $ctx->{srch}->query('', $opts);
+       my $srch = $ctx->{srch};
+       my $sres = $srch->query('', $opts);
        my $nr = scalar @{$sres->{msgs}};
        if ($nr) {
-               $sres = load_results($sres);
+               $sres = load_results($srch, $sres);
                walk_thread(thread_results($sres), $ctx, *acc_topic);
        }
        $ctx->{-next_o} = $off+ $nr;