* [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: <" . $mid->as_html . ">\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).