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;
use PublicInbox::MsgIter;
use PublicInbox::Address;
use PublicInbox::WwwStream;
+use PublicInbox::Reply;
require POSIX;
use constant INDENT => ' ';
$info = qq(\n List information: <a\nhref="$url">$url</a>\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));
<<EOF
sub in_reply_to {
my ($hdr) = @_;
- my $irt = $hdr->header_raw('In-Reply-To');
-
- return mid_clean($irt) if defined $irt && $irt ne '';
-
- my $refs = $hdr->header_raw('References');
- if ($refs && $refs =~ /<([^>]+)>\s*\z/s) {
- return $1;
+ my %mid = map { $_ => 1 } $hdr->header_raw('Message-ID');
+ my @refs = ($hdr->header_raw('References'),
+ $hdr->header_raw('In-Reply-To'));
+ @refs = ((join(' ', @refs)) =~ /<([^>]+)>/g);
+ while (defined(my $irt = pop @refs)) {
+ next if $mid{"<$irt>"};
+ return $irt;
}
undef;
}
my $rv = '';
my $mapping = $ctx->{mapping} or return $rv;
my $pad = ' ';
- my ($attr, $node, $idx, $level) = @{$mapping->{$mid_raw}};
+ my $mid_map = $mapping->{$mid_raw};
+ defined $mid_map or
+ return 'public-inbox BUG: '.ascii_html($mid_raw).' not mapped';
+ my ($attr, $node, $idx, $level) = @$mid_map;
my $children = $node->{children};
my $nr_c = scalar @$children;
my $nr_s = 0;
}
return missing_thread($ctx) unless $mime;
- $mime = Email::MIME->new($mime);
+ $mime = PublicInbox::MIME->new($mime);
$ctx->{-title_html} = ascii_html($mime->header('Subject'));
$ctx->{-html_tip} = thread_index_entry($ctx, $level, $mime);
PublicInbox::WwwStream->response($ctx, 200, sub {
unshift @q, map { ($cl, $_) } @{$node->{children}};
my $mid = $node->{id};
if ($mime = $inbox->msg_by_smsg($node->{smsg})) {
- $mime = Email::MIME->new($mime);
+ $mime = PublicInbox::MIME->new($mime);
return thread_index_entry($ctx, $level, $mime);
} else {
return ghost_index_entry($ctx, $level, $node);
$mime = $inbox->msg_by_smsg($mime) and last;
}
return missing_thread($ctx) unless $mime;
- $mime = Email::MIME->new($mime);
+ $mime = PublicInbox::MIME->new($mime);
$ctx->{-title_html} = ascii_html($mime->header('Subject'));
$ctx->{-html_tip} = '<pre>'.index_entry($mime, $ctx, scalar @$msgs);
$mime = undef;
$mime = $inbox->msg_by_smsg($mime) and last;
}
if ($mime) {
- $mime = Email::MIME->new($mime);
+ $mime = PublicInbox::MIME->new($mime);
return index_entry($mime, $ctx, scalar @$msgs);
}
$msgs = undef;
}
$ret .= "[-- Attachment #$idx: ";
my $ts = "Type: $ct, Size: $size bytes";
+ $desc = ascii_html($desc);
$ret .= ($desc eq '') ? "$ts --]" : "$desc --]\n[-- $ts --]";
$ret .= "</a>\n";
}
flush_quote(\$s, $l, \@quot) if @quot;
# regular line, OK
- $cur = $l->linkify_1($cur);
- $cur = ascii_html($cur);
- $s .= $l->linkify_2($cur);
+ $l->linkify_1($cur);
+ $s .= $l->linkify_2(ascii_html($cur));
} else {
push @quot, $cur;
}
$rv;
}
-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));
-}
-
sub html_footer {
my ($hdr, $standalone, $ctx, $rhref) = @_;