From d0755b0e3693b8497e7232cb31a53686a3181eb8 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 5 Apr 2014 01:11:08 +0000 Subject: view: implement quote folding and flesh out tests Unfortunately, quoting is often excessive, so hide multi-line quotes by default and provide anchored links to full messages instead. --- lib/PublicInbox/View.pm | 61 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 08849a92..3d3b6b5e 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -9,17 +9,17 @@ use Encode::MIME::Header; # only one public function: sub as_html { - my ($class, $mime) = @_; + my ($class, $mime, $full_pfx) = @_; headers_to_html_header($mime) . - multipart_text_as_html($mime) . + multipart_text_as_html($mime, $full_pfx) . "\n"; } # only private functions below. sub multipart_text_as_html { - my ($mime) = @_; + my ($mime, $full_pfx) = @_; my $rv = ""; my $part_nr = 0; @@ -33,15 +33,19 @@ sub multipart_text_as_html { my $fn = $part->filename; if ($part_nr > 0) { - defined($fn) or $fn = "part #$part_nr"; + defined($fn) or $fn = "part #" . ($part_nr + 1); $rv .= add_filename_line($fn); } - # n.b. $part->body should already be decoded if text - $rv .= escapeHTML($part->body); + if (defined $full_pfx) { + $rv .= add_text_body_short($part, $part_nr, + $full_pfx); + } else { + $rv .= add_text_body_full($part, $part_nr); + } $rv .= "\n" unless $rv =~ /\n\z/s; } else { - $rv .= "-- part #$part_nr "; + $rv .= "-- part #" . ($part_nr + 1) . " "; $rv .= escapeHTML($part_type); $rv .= " skipped\n"; } @@ -60,6 +64,49 @@ sub add_filename_line { "$pad " . escapeHTML($fn) . " $pad\n"; } +sub add_text_body_short { + my ($part, $part_nr, $full_pfx) = @_; + my $n = 0; + my $s = escapeHTML($part->body); + $s =~ s!^((?:(?:>[^\n]+)\n)+)! + my $cur = $1; + my @lines = split(/\n/, $cur); + if (@lines > 1) { + # show a short snippet of quoted text + $cur = join(' ', @lines); + $cur =~ s/> ?//g; + + my @sum = split(/\s+/, $cur); + $cur = ''; + do { + $cur .= shift(@sum) . ' '; + } while (@sum && length($cur) < 68); + $cur=~ s/ \z/ .../; + "> <$cur<\/a>>"; + } else { + $cur; + } + !emg; + $s; +} + +sub add_text_body_full { + my ($part, $part_nr) = @_; + my $n = 0; + my $s = escapeHTML($part->body); + $s =~ s!^((?:(?:>[^\n]+)\n)+)! + my $cur = $1; + my @lines = split(/\n/, $cur); + if (@lines > 1) { + "$cur"; + } else { + $cur; + } + !emg; + $s; +} + sub trim_message_id { my ($mid) = @_; $mid =~ tr/<>//d; -- cgit v1.2.3-24-ge0c7