use URI::Escape qw/uri_escape_utf8/;
use Date::Parse qw/str2time/;
use Encode::MIME::Header;
+use Plack::Util;
use PublicInbox::Hval qw/ascii_html/;
use PublicInbox::Linkify;
use PublicInbox::MID qw/mid_clean id_compress mid2path mid_mime/;
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" : '';
my $hdr = $mime->header_obj;
- headers_to_html_header($hdr, $ctx) .
- multipart_text_as_html($mime, '') .
- '</pre><hr /><pre>' .
- html_footer($hdr, 1, $ctx, 'R/') .
- $footer .
- '</pre></body></html>';
+ my $n = 0;
+ Plack::Util::inline_object(
+ close => sub {}, # noop
+ getline => sub {
+ my $nr = $n++;
+ if ($nr == 0) {
+ headers_to_html_header($hdr, $ctx) .
+ multipart_text_as_html($mime, '') .
+ '</pre><hr />'
+ } elsif ($nr == 1) {
+ '<pre>' .
+ html_footer($hdr, 1, $ctx) .
+ '</pre>' . msg_reply($ctx, $hdr) .
+ '<hr /><pre>'. $footer .
+ '</pre></body></html>'
+ } else {
+ undef
+ }
+ }
+ )
}
-# /$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\n".
+ "plain-text email 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" .
- join(" \\ \n\t\t", @$arg ). "\n\n" .
+ join(" \\\n\t\t", @$arg ). "\n\n" .
qq( <a\nhref="$se_url">$se_url</a>\n\n) .
"* 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 {
# 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) {
$v = PublicInbox::Hval->new($v);
if ($h eq 'From') {
- $title[1] = PublicInbox::Address::from_name($v->raw);
+ my $n = PublicInbox::Address::from_name($v->raw);
+ $title[1] = ascii_html($n);
} elsif ($h eq 'Subject') {
$title[0] = $v->as_html;
if ($srch) {
} 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 {