about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-02-01 03:06:47 +0000
committerEric Wong <e@80x24.org>2019-02-01 04:24:54 +0000
commit7475739ec4e426004619f95f6e48fa07d940a5c0 (patch)
treec0248cd8d85ac9de0415091b3382e2958b4e1973 /lib
parent1e03323d76eb6c029ab6749fe783f25d5d109e1f (diff)
downloadpublic-inbox-7475739ec4e426004619f95f6e48fa07d940a5c0.tar.gz
Perl "split" can capture and group in the regexp itself,
so rely on that to shorten our code.

Comparing the /T/ HTML output of a thread from hell (on LKML with
1356 messages) reveals no difference in the rendered result.
Only the HTML source differs in newline placement before/after
the closing </span>

This allows a minor speedup on my X32 Thinkpad @ 1.6GHz with
the aforementioned LKML thread from hell:

before: 3.67s
 after: 3.55s
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/View.pm52
1 files changed, 20 insertions, 32 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 782e6686..69aca3d7 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -503,12 +503,12 @@ sub flush_quote {
 
         # show everything in the full version with anchor from
         # short version (see above)
-        my $rv = $l->linkify_1(join('', @$quot));
-        @$quot = ();
+        my $rv = $l->linkify_1($$quot);
 
         # we use a <span> here to allow users to specify their own
         # color for quoted text
         $rv = $l->linkify_2(ascii_html($rv));
+        $$quot = undef;
         $$s .= qq(<span\nclass="q">) . $rv . '</span>'
 }
 
@@ -590,47 +590,35 @@ sub add_text_body {
                 $ctx->{-spfx} = $spfx;
         };
 
-        my @lines = split(/^/m, $s);
+        # some editors don't put trailing newlines at the end:
+        $s .= "\n" unless $s =~ /\n\z/s;
+
+        # split off quoted and unquoted blocks:
+        my @sections = split(/((?:^>[^\n]*\n)+)/sm, $s);
         $s = '';
         if (defined($fn) || $depth > 0 || $err) {
                 # badly-encoded message with $err? tell the world about it!
                 $s .= attach_link($upfx, $ct, $p, $fn, $err);
                 $s .= "\n";
         }
-        my @quot;
         my $l = PublicInbox::Linkify->new;
-        foreach my $cur (@lines) {
-                if ($cur !~ /^>/) {
-                        # show the previously buffered quote inline
-                        flush_quote(\$s, $l, \@quot) if @quot;
-
-                        if ($diff) {
-                                push @$diff, $cur;
-                        } else {
-                                # regular line, OK
-                                $l->linkify_1($cur);
-                                $s .= $l->linkify_2(ascii_html($cur));
-                        }
+        foreach my $cur (@sections) {
+                if ($cur =~ /\A>/) {
+                        flush_quote(\$s, $l, \$cur);
+                } elsif ($diff) {
+                        @$diff = split(/^/m, $cur);
+                        $cur = undef;
+                        flush_diff(\$s, $ctx, $l);
                 } else {
-                        flush_diff(\$s, $ctx, $l) if $diff && @$diff;
-                        push @quot, $cur;
+                        # regular lines, OK
+                        $l->linkify_1($cur);
+                        $s .= $l->linkify_2(ascii_html($cur));
+                        $cur = undef;
                 }
         }
 
-        if (@quot) { # ugh, top posted
-                flush_quote(\$s, $l, \@quot);
-                flush_diff(\$s, $ctx, $l) if $diff && @$diff;
-                obfuscate_addrs($obfs_ibx, $s) if $obfs_ibx;
-                $s;
-        } else {
-                flush_diff(\$s, $ctx, $l) if $diff && @$diff;
-                obfuscate_addrs($obfs_ibx, $s) if $obfs_ibx;
-                if ($s =~ /\n\z/s) { # common, last line ends with a newline
-                        $s;
-                } else { # some editors don't do newlines...
-                        $s .= "\n";
-                }
-        }
+        obfuscate_addrs($obfs_ibx, $s) if $obfs_ibx;
+        $s;
 }
 
 sub _msg_html_prepare {