From 1365e185d817cdc2de04968c37f597d92226a13b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 5 Jun 2016 21:24:17 +0000 Subject: view: inline message reply into message view This should reduce link following for replies and improve visibility. This should also reduce cache overhead/footprint for crawlers. --- lib/PublicInbox/View.pm | 43 ++++++++++++++++--------------------------- lib/PublicInbox/WWW.pm | 23 ++++++----------------- t/view.t | 14 ++++++++++---- 3 files changed, 32 insertions(+), 48 deletions(-) diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index ed405301..2b40bcdd 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -20,7 +20,8 @@ use constant INDENT => ' '; use constant TCHILD => '` '; sub th_pfx ($) { $_[0] == 0 ? '' : TCHILD }; -# public functions: +# public functions: (unstable) +# TODO: stream this, since threading is expensive but also oh-so-important sub msg_html { my ($ctx, $mime, $footer) = @_; $footer = defined($footer) ? "\n$footer" : ''; @@ -28,36 +29,25 @@ sub msg_html { headers_to_html_header($hdr, $ctx) . multipart_text_as_html($mime, '') . '
' .
-		html_footer($hdr, 1, $ctx, 'R/') .
-		$footer .
-		'
'; + html_footer($hdr, 1, $ctx) . + '' . msg_reply($ctx, $hdr) . + '
'.  $footer . '
'; } -# /$INBOX/$MESSAGE_ID/R/ +# /$INBOX/$MESSAGE_ID/#R sub msg_reply { - my ($ctx, $hdr, $footer) = @_; - my $s = $hdr->header('Subject'); - $s = '(no subject)' if (!defined $s) || ($s eq ''); - my $f = $hdr->header('From'); - $f = '' unless defined $f; - my $mid = $hdr->header_raw('Message-ID'); - $mid = PublicInbox::Hval->new_msgid($mid); - my $t = ascii_html($s); + my ($ctx, $hdr) = @_; my $se_url = 'https://kernel.org/pub/software/scm/git/docs/git-send-email.html'; my ($arg, $link) = mailto_arg_link($hdr); push @$arg, '/path/to/YOUR_REPLY'; - "replying to \"$t\"
" .
-	"replying to message:\n\n" .
-	"Subject: $t\n" .
-	"From: ". ascii_html($f) .
-	"\nDate: " .  ascii_html($hdr->header('Date')) .
-	"\nMessage-ID: <" . $mid->as_html . ">\n\n" .
-	"There are multiple ways to reply:\n\n" .
+	"
". + "You may reply publically to this message via email\n". + "using any one of the following methods:\n\n" . "* Save the following mbox file, import it into your mail client,\n" . - " and reply-to-all from there: mbox\n\n" . + " and reply-to-all from there: mbox\n\n" . "* Reply to all the recipients using the --to, --cc,\n" . " and --in-reply-to switches of git-send-email(1):\n\n" . "\tgit send-email \\\n\t\t" . @@ -66,9 +56,7 @@ sub msg_reply { "* If your mail client supports setting the In-Reply-To" . " header\n via mailto: links, try the " . qq(mailto: link\n) . - "\nFor context, the original message or " . - qq(thread) . - '

' . $footer .  '
'; + ''; } sub in_reply_to { @@ -123,7 +111,7 @@ sub index_entry { # scan through all parts, looking for displayable text msg_iter($mime, sub { index_walk($fh, $mhref, $_[0]) }); - $rv = "\n" . html_footer($hdr, 0, $ctx, "$path$href/R/"); + $rv = "\n" . html_footer($hdr, 0, $ctx, "$path$href/#R"); if (defined $irt) { unless (defined $parent_anchor) { @@ -501,8 +489,9 @@ sub html_footer { } else { $irt = ''; } - - $irt . qq(reply) . $idx; + $rhref ||= '#R'; + $irt .= qq(reply); + $irt .= $idx; } sub linkify_ref_nosrch { diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index d26b69c0..5fa4e380 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -22,7 +22,7 @@ require PublicInbox::Git; use PublicInbox::GitHTTPBackend; our $INBOX_RE = qr!\A/([\w\.\-]+)!; our $MID_RE = qr!([^/]+)!; -our $END_RE = qr!(T/|t/|R/|t\.mbox(?:\.gz)?|t\.atom|raw|)!; +our $END_RE = qr!(T/|t/|t\.mbox(?:\.gz)?|t\.atom|raw|)!; our $ATTACH_RE = qr!(\d[\.\d]*)-([[:alnum:]][\w\.-]+[[:alnum:]])!i; sub new { @@ -88,11 +88,15 @@ sub call { invalid_inbox_mid($self, $ctx, $1, $2) || get_attach($ctx, $idx, $fn); # in case people leave off the trailing slash: - } elsif ($path_info =~ m!$INBOX_RE/$MID_RE/(T|t|R)\z!o) { + } elsif ($path_info =~ m!$INBOX_RE/$MID_RE/(T|t)\z!o) { my ($inbox, $mid, $suffix) = ($1, $2, $3); $suffix .= $suffix =~ /\A[tT]\z/ ? '/#u' : '/'; r301($ctx, $inbox, $mid, $suffix); + } elsif ($path_info =~ m!$INBOX_RE/$MID_RE/R/?\z!o) { + my ($inbox, $mid) = ($1, $2); + r301($ctx, $inbox, $mid, '#R'); + } elsif ($path_info =~ m!$INBOX_RE/$MID_RE/f/?\z!o) { r301($ctx, $1, $2); @@ -227,19 +231,6 @@ sub get_mid_html { [ PublicInbox::View::msg_html($ctx, $mime, $foot) ] ]; } -# /$INBOX/$MESSAGE_ID/R/ -> HTML content (fullquotes) -sub get_reply_html { - my ($ctx) = @_; - my $x = mid2blob($ctx) or return r404($ctx); - - require PublicInbox::View; - my $foot = footer($ctx); - require Email::MIME; - my $hdr = Email::MIME->new($x)->header_obj; - [ 200, [ 'Content-Type' => 'text/html; charset=UTF-8' ], - [ PublicInbox::View::msg_reply($ctx, $hdr, $foot)] ]; -} - # /$INBOX/$MESSAGE_ID/t/ sub get_thread { my ($ctx, $flat) = @_; @@ -427,8 +418,6 @@ sub msg_page { # legacy, but no redirect for compatibility: 'f/' eq $e and return get_mid_html($ctx); - - 'R/' eq $e and return get_reply_html($ctx); r404($ctx); } diff --git a/t/view.t b/t/view.t index a70c52d8..3332fb48 100644 --- a/t/view.t +++ b/t/view.t @@ -6,6 +6,12 @@ use Test::More; use Email::MIME; use PublicInbox::View; +sub msg_html ($) { + my ($mime) = @_; + + PublicInbox::View::msg_html(undef, $mime); +} + # plain text { my $body = < $body, )->as_string; my $mime = Email::MIME->new($s); - my $html = PublicInbox::View::msg_html(undef, $mime); + my $html = msg_html($mime); # ghetto tests like($html, qr! $parts, ); - my $html = PublicInbox::View::msg_html(undef, $mime); + my $html = msg_html($mime); like($html, qr/hi\n.*-- Attachment #2.*\nbye\n/s, "multipart split"); } @@ -100,7 +106,7 @@ EOF parts => $parts, ); - my $html = PublicInbox::View::msg_html(undef, $mime); + my $html = msg_html($mime); like($html, qr!.*Attachment #2: foo\.patch --!, "parts split with filename"); } @@ -126,7 +132,7 @@ EOF ); my $orig = $mime->body_raw; - my $html = PublicInbox::View::msg_html(undef, $mime); + my $html = msg_html($mime); like($orig, qr/hi =3D bye=/, "our test used QP correctly"); like($html, qr/\bhi = bye\b/, "HTML output decoded QP"); } -- cgit v1.2.3-24-ge0c7