]> Sergey Matveev's repositories - public-inbox.git/commitdiff
view: inline message reply into message view
authorEric Wong <e@80x24.org>
Sun, 5 Jun 2016 21:24:17 +0000 (21:24 +0000)
committerEric Wong <e@80x24.org>
Sun, 5 Jun 2016 21:39:27 +0000 (21:39 +0000)
This should reduce link following for replies and improve
visibility.  This should also reduce cache overhead/footprint
for crawlers.

lib/PublicInbox/View.pm
lib/PublicInbox/WWW.pm
t/view.t

index ed4053014edd1a994449a762458c58ee9722fa73..2b40bcdd37f31c7e0a715d130a59cd3fd0b4b675 100644 (file)
@@ -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 {
index d26b69c00050879d3fb41949669c310c4417b510..5fa4e3804e8e596a6500c1e397fa1dfbf810a055 100644 (file)
@@ -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);
 }
 
index a70c52d8d0549e49cb50f86f7efb22484e986eb1..3332fb48b14bb82eaf01220a98b79743479c1668 100644 (file)
--- 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");
 }