From 92afb41e15dfdcda291b432173bd49ddfc49614a Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 14 Jun 2017 00:10:51 +0000 Subject: [PATCH] view: split out reply logic into its own module We'll be adding more reply options for centralized mailing lists. So split out the logic so it's easy-to-find. Organizing code is hard :< --- MANIFEST | 1 + lib/PublicInbox/Reply.pm | 54 ++++++++++++++++++++++++++++++++++++++++ lib/PublicInbox/View.pm | 47 ++-------------------------------- t/view.t | 2 +- 4 files changed, 58 insertions(+), 46 deletions(-) create mode 100644 lib/PublicInbox/Reply.pm diff --git a/MANIFEST b/MANIFEST index 3bfd9a40..0475cdd6 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 00000000..73a4df11 --- /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 9ef4712f..0d85581d 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -6,7 +6,6 @@ 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 @@ sub msg_reply { $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 { my ($hdr, $standalone, $ctx, $rhref) = @_; diff --git a/t/view.t b/t/view.t index 2181b5ef..abd00018 100644 --- a/t/view.t +++ b/t/view.t @@ -15,7 +15,7 @@ my @q = ( 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"); } -- 2.44.0