about summary refs log tree commit homepage
path: root/lib/PublicInbox/View.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-08-29 09:26:40 +0000
committerEric Wong <e@80x24.org>2022-08-29 19:05:50 +0000
commit94a70f57bf1b449192c9d68637cf985b8d5cfaca (patch)
tree604e2453755d9317f1e9a58c6b723ad4869a2ed8 /lib/PublicInbox/View.pm
parent0093503cf22570012b3bafcc0130bfac1ea157bf (diff)
downloadpublic-inbox-94a70f57bf1b449192c9d68637cf985b8d5cfaca.tar.gz
{obuf} will eventually go away and we'll write directly to
{zbuf}, but as an intermediate step we'll make some changes
to rely less on return values.

While we're in the area, reuse Linkify objects in more places
where possible to save some allocations.
Diffstat (limited to 'lib/PublicInbox/View.pm')
-rw-r--r--lib/PublicInbox/View.pm49
1 files changed, 24 insertions, 25 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 11ed2d76..354cdd93 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -38,7 +38,7 @@ sub msg_page_i {
                                 : $ctx->gone('over');
                 $ctx->{mhref} = ($ctx->{nr} || $ctx->{smsg}) ?
                                 "../${\mid_href($smsg->{mid})}/" : '';
-                my $obuf = $ctx->{obuf} = _msg_page_prepare_obuf($eml, $ctx);
+                my $obuf = _msg_page_prepare_obuf($eml, $ctx);
                 if (length($$obuf)) {
                         multipart_text_as_html($eml, $ctx);
                         $$obuf .= '</pre><hr>';
@@ -58,7 +58,7 @@ sub no_over_html ($) {
         my $eml = PublicInbox::Eml->new($bref);
         $ctx->{mhref} = '';
         PublicInbox::WwwStream::init($ctx);
-        my $obuf = $ctx->{obuf} = _msg_page_prepare_obuf($eml, $ctx);
+        my $obuf = _msg_page_prepare_obuf($eml, $ctx);
         if (length($$obuf)) {
                 multipart_text_as_html($eml, $ctx);
                 $$obuf .= '</pre><hr>';
@@ -661,9 +661,9 @@ sub add_text_body { # callback for each_part
 
 sub _msg_page_prepare_obuf {
         my ($eml, $ctx) = @_;
-        my $over = $ctx->{ibx}->over;
+        my $have_over = !!$ctx->{ibx}->over;
         my $obfs_ibx = $ctx->{-obfs_ibx};
-        my $rv = '';
+        $ctx->{obuf} = \(my $rv = '');
         my $mids = mids_for_index($eml);
         my $nr = $ctx->{nr}++;
         if ($nr) { # unlikely
@@ -672,14 +672,13 @@ sub _msg_page_prepare_obuf {
                         return \$rv;
                 }
                 $rv .=
-"<pre>WARNING: multiple messages have this Message-ID\n</pre>";
-                $rv .= '<pre>';
+"<pre>WARNING: multiple messages have this Message-ID\n</pre><pre>";
         } else {
                 $ctx->{first_hdr} = $eml->header_obj;
                 $ctx->{chash} = content_hash($eml) if $ctx->{smsg}; # reused MID
                 $rv .= "<pre\nid=b>"; # anchor for body start
         }
-        $ctx->{-upfx} = '../' if $over;
+        $ctx->{-upfx} = '../' if $have_over;
         my @title; # (Subject[0], From[0])
         for my $v ($eml->header('From')) {
                 my @n = PublicInbox::Address::names($v);
@@ -704,7 +703,7 @@ sub _msg_page_prepare_obuf {
                 my $v = ascii_html(shift @subj);
                 obfuscate_addrs($obfs_ibx, $v) if $obfs_ibx;
                 $rv .= 'Subject: ';
-                $rv .= $over ? qq(<a\nhref="#r"\nid=t>$v</a>\n) : "$v\n";
+                $rv .= $have_over ? qq(<a\nhref="#r"\nid=t>$v</a>\n) : "$v\n";
                 $title[0] = $v;
                 for $v (@subj) { # multi-Subject message :<
                         $v = ascii_html($v);
@@ -712,7 +711,7 @@ sub _msg_page_prepare_obuf {
                         $rv .= "Subject: $v\n";
                 }
         } else { # dummy anchor for thread skeleton at bottom of page
-                $rv .= qq(<a\nhref="#r"\nid=t></a>) if $over;
+                $rv .= qq(<a\nhref="#r"\nid=t></a>) if $have_over;
                 $title[0] = '(no subject)';
         }
         for my $v ($eml->header('Date')) {
@@ -724,22 +723,22 @@ sub _msg_page_prepare_obuf {
                 $ctx->{-title_html} = join(' - ', @title);
                 $rv = $ctx->html_top . $rv;
         }
+
+        $ctx->{-linkify} //= PublicInbox::Linkify->new;
         if (scalar(@$mids) == 1) { # common case
                 my $mhtml = ascii_html($mids->[0]);
-                $rv .= "Message-ID: &lt;$mhtml&gt; ";
-                $rv .= "(<a\nhref=\"raw\">raw</a>)\n";
+                $rv .= qq[Message-ID: &lt;$mhtml&gt; (<a href="raw">raw</a>)\n];
         } else {
                 # X-Alt-Message-ID can happen if a message is injected from
                 # public-inbox-nntpd because of multiple Message-ID headers.
-                my $lnk = PublicInbox::Linkify->new;
                 my $s = '';
                 for my $h (qw(Message-ID X-Alt-Message-ID)) {
                         $s .= "$h: $_\n" for ($eml->header_raw($h));
                 }
-                $lnk->linkify_mids('..', \$s, 1);
+                $ctx->{-linkify}->linkify_mids('..', \$s, 1);
                 $rv .= $s;
         }
-        $rv .= _parent_headers($eml, $over);
+        _parent_headers($ctx, $eml);
         $rv .= "\n";
         \$rv;
 }
@@ -792,35 +791,35 @@ sub thread_skel ($$$) {
 }
 
 sub _parent_headers {
-        my ($hdr, $over) = @_;
-        my $rv = '';
+        my ($ctx, $hdr) = @_;
         my @irt = $hdr->header_raw('In-Reply-To');
         my $refs;
         if (@irt) {
-                my $lnk = PublicInbox::Linkify->new;
-                $rv .= "In-Reply-To: $_\n" for @irt;
-                $lnk->linkify_mids('..', \$rv);
+                my $s = '';
+                $s .= "In-Reply-To: $_\n" for @irt;
+                $ctx->{-linkify}->linkify_mids('..', \$s);
+                ${$ctx->{obuf}} .= $s;
         } else {
                 $refs = references($hdr);
                 my $irt = pop @$refs;
                 if (defined $irt) {
                         my $html = ascii_html($irt);
                         my $href = mid_href($irt);
-                        $rv .= "In-Reply-To: &lt;";
-                        $rv .= "<a\nhref=\"../$href/\">$html</a>&gt;\n";
+                        ${$ctx->{obuf}} .= <<EOM;
+In-Reply-To: &lt;<a\nhref="../$href/">$html</a>&gt;
+EOM
                 }
         }
 
         # do not display References: if search is present,
         # we show the thread skeleton at the bottom, instead.
-        return $rv if $over;
+        return if $ctx->{ibx}->over;
 
         $refs //= references($hdr);
         if (@$refs) {
-                @$refs = map { linkify_ref_no_over($_) } @$refs;
-                $rv .= 'References: '. join("\n\t", @$refs) . "\n";
+                $_ = linkify_ref_no_over($_) for @$refs;
+                ${$ctx->{obuf}} .= 'References: '. join("\n\t", @$refs) . "\n";
         }
-        $rv;
 }
 
 # returns a string buffer