unofficial mirror of meta@public-inbox.org
 help / color / mirror / Atom feed
* [PATCH] view: inline message reply into message view
@ 2016-06-05 21:39 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2016-06-05 21:39 UTC (permalink / raw)
  To: meta

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 ed40530..2b40bcd 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, '') .
 		'</pre><hr /><pre>' .
-		html_footer($hdr, 1, $ctx, 'R/') .
-		$footer .
-		'</pre></body></html>';
+		html_footer($hdr, 1, $ctx) .
+		'</pre>' . msg_reply($ctx, $hdr) .
+		'<hr /><pre>'.  $footer . '</pre></body></html>';
 }
 
-# /$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';
 
-	"<html><head><title>replying to \"$t\"</title></head><body><pre>" .
-	"replying to message:\n\n" .
-	"Subject: <b>$t</b>\n" .
-	"From: ". ascii_html($f) .
-	"\nDate: " .  ascii_html($hdr->header('Date')) .
-	"\nMessage-ID: &lt;" . $mid->as_html . "&gt;\n\n" .
-	"There are multiple ways to reply:\n\n" .
+	"<hr /><pre\nid=R>".
+	"You may reply publically to <a\nhref=#t>this message</a> 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: <a\nhref=../raw>mbox</a>\n\n" .
+	"  and reply-to-all from there: <a\nhref=raw>mbox</a>\n\n" .
 	"* Reply to all the recipients using the <b>--to</b>, <b>--cc</b>,\n" .
 	"  and <b>--in-reply-to</b> 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 <b>In-Reply-To</b>" .
 	" header\n  via mailto: links, try the " .
 	qq(<a\nhref="$link">mailto: link</a>\n) .
-	"\nFor context, the original <a\nhref=../>message</a> or " .
-	qq(<a\nhref="../t/#u">thread</a>) .
-	'</pre><hr /><pre>' . $footer .  '</pre></body></html>';
+	'</pre>';
 }
 
 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(<a\nhref="$rhref">reply</a>) . $idx;
+	$rhref ||= '#R';
+	$irt .= qq(<a\nhref="$rhref">reply</a>);
+	$irt .= $idx;
 }
 
 sub linkify_ref_nosrch {
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index d26b69c..5fa4e38 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 a70c52d..3332fb4 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 = <<EOF;
@@ -41,7 +47,7 @@ EOF
 		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!<a\nhref="raw"!s, "raw link present");
@@ -71,7 +77,7 @@ EOF
 		parts => $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");
 }

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2016-06-05 21:39 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-06-05 21:39 [PATCH] view: inline message reply into message view Eric Wong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).