MANIFEST | 1 +
lib/PublicInbox/Reply.pm | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++
lib/PublicInbox/View.pm | 47 ++---------------------------------------------
t/view.t | 2 +-
diff --git a/MANIFEST b/MANIFEST
index 3bfd9a4080b9847900b15a4de40088204905c44b..0475cdd62ce77612c316f5c9f1d6094131ee17f9 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -76,6 +76,7 @@ lib/PublicInbox/NewsWWW.pm
lib/PublicInbox/ParentPipe.pm
lib/PublicInbox/ProcessPipe.pm
lib/PublicInbox/Qspawn.pm
+lib/PublicInbox/Reply.pm
lib/PublicInbox/SaPlugin/ListMirror.pm
lib/PublicInbox/Search.pm
lib/PublicInbox/SearchIdx.pm
diff --git a/lib/PublicInbox/Reply.pm b/lib/PublicInbox/Reply.pm
new file mode 100644
index 0000000000000000000000000000000000000000..73a4df119bdabe9dcb55fa5bb250df911cab8b66
--- /dev/null
+++ b/lib/PublicInbox/Reply.pm
@@ -0,0 +1,54 @@
+# Copyright (C) 2014-2017 all contributors
+# License: AGPL-3.0+
+package PublicInbox::Reply;
+use strict;
+use warnings;
+use URI::Escape qw/uri_escape_utf8/;
+use PublicInbox::Hval qw/ascii_html/;
+use PublicInbox::Address;
+use PublicInbox::MID qw/mid_clean mid_escape/;
+
+sub squote_maybe ($) {
+ my ($val) = @_;
+ if ($val =~ m{([^\w@\./,\%\+\-])}) {
+ $val =~ s/(['!])/'\\$1'/g; # '!' for csh
+ return "'$val'";
+ }
+ $val;
+}
+
+sub mailto_arg_link {
+ my ($hdr) = @_;
+ my %cc; # everyone else
+ my $to; # this is the From address
+
+ foreach my $h (qw(From To Cc)) {
+ my $v = $hdr->header($h);
+ defined($v) && ($v ne '') or next;
+ my @addrs = PublicInbox::Address::emails($v);
+ foreach my $address (@addrs) {
+ my $dst = lc($address);
+ $cc{$dst} ||= $address;
+ $to ||= $dst;
+ }
+ }
+ my @arg;
+
+ my $subj = $hdr->header('Subject') || '';
+ $subj = "Re: $subj" unless $subj =~ /\bRe:/i;
+ my $mid = $hdr->header_raw('Message-ID');
+ push @arg, '--in-reply-to='.squote_maybe(mid_clean($mid));
+ my $irt = mid_escape($mid);
+ delete $cc{$to};
+ push @arg, "--to=$to";
+ $to = uri_escape_utf8($to);
+ $subj = uri_escape_utf8($subj);
+ my @cc = sort values %cc;
+ push(@arg, map { "--cc=$_" } @cc);
+ my $cc = uri_escape_utf8(join(',', @cc));
+ my $href = "mailto:$to?In-Reply-To=$irt&Cc=${cc}&Subject=$subj";
+
+ (\@arg, ascii_html($href));
+}
+
+1;
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 9ef4712f313cc0bf59f21cbbf38fcbb8beeb0bac..0d85581dfd966eed4a0e4e0db2f2817c2f0e1713 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -6,7 +6,6 @@ # See Documentation/design_www.txt for this.
package PublicInbox::View;
use strict;
use warnings;
-use URI::Escape qw/uri_escape_utf8/;
use Date::Parse qw/str2time/;
use PublicInbox::Hval qw/ascii_html/;
use PublicInbox::Linkify;
@@ -14,6 +13,7 @@ use PublicInbox::MID qw/mid_clean id_compress mid_mime mid_escape/;
use PublicInbox::MsgIter;
use PublicInbox::Address;
use PublicInbox::WwwStream;
+use PublicInbox::Reply;
require POSIX;
use constant INDENT => ' ';
@@ -57,7 +57,7 @@ $url = PublicInbox::Hval::prurl($ctx->{env}, $url);
$info = qq(\n List information: $url\n);
}
- my ($arg, $link) = mailto_arg_link($hdr);
+ my ($arg, $link) = PublicInbox::Reply::mailto_arg_link($hdr);
push @$arg, '/path/to/YOUR_REPLY';
$arg = ascii_html(join(" \\\n ", '', @$arg));
<header($h);
- defined($v) && ($v ne '') or next;
- my @addrs = PublicInbox::Address::emails($v);
- foreach my $address (@addrs) {
- my $dst = lc($address);
- $cc{$dst} ||= $address;
- $to ||= $dst;
- }
- }
- my @arg;
-
- my $subj = $hdr->header('Subject') || '';
- $subj = "Re: $subj" unless $subj =~ /\bRe:/i;
- my $mid = $hdr->header_raw('Message-ID');
- push @arg, '--in-reply-to='.squote_maybe(mid_clean($mid));
- my $irt = mid_escape($mid);
- delete $cc{$to};
- push @arg, "--to=$to";
- $to = uri_escape_utf8($to);
- $subj = uri_escape_utf8($subj);
- my @cc = sort values %cc;
- push(@arg, map { "--cc=$_" } @cc);
- my $cc = uri_escape_utf8(join(',', @cc));
- my $href = "mailto:$to?In-Reply-To=$irt&Cc=${cc}&Subject=$subj";
-
- (\@arg, ascii_html($href));
}
sub html_footer {
diff --git a/t/view.t b/t/view.t
index 2181b5efb34184a1a97bcfae8fa08d9ca0dff431..abd00018e73381f84f4573a342502d24cfbce5a7 100644
--- a/t/view.t
+++ b/t/view.t
@@ -15,7 +15,7 @@ );
while (@q) {
my $input = shift @q;
my $expect = shift @q;
- my $res = PublicInbox::View::squote_maybe($input);
+ my $res = PublicInbox::Reply::squote_maybe($input);
is($res, $expect, "quote $input => $res");
}