X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FView.pm;h=0d85581dfd966eed4a0e4e0db2f2817c2f0e1713;hb=92afb41e15dfdcda291b432173bd49ddfc49614a;hp=39ca959c98e99875ab6656908d6ac428f53c3393;hpb=f083ef6b36fcfe5bea35427636fc8aff4e729ef6;p=public-inbox.git diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 39ca959c..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_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; } @@ -201,7 +201,10 @@ sub _th_index_lite { 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; @@ -299,7 +302,7 @@ sub stream_thread ($$) { } 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 { @@ -311,7 +314,7 @@ sub stream_thread ($$) { 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); @@ -362,7 +365,7 @@ sub thread_html { $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} = '
'.index_entry($mime, $ctx, scalar @$msgs);
 	$mime = undef;
@@ -372,7 +375,7 @@ sub thread_html {
 			$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;
@@ -435,6 +438,7 @@ sub attach_link ($$$$;$) {
 	}
 	$ret .= "[-- Attachment #$idx: ";
 	my $ts = "Type: $ct, Size: $size bytes";
+	$desc = ascii_html($desc);
 	$ret .= ($desc eq '') ? "$ts --]" : "$desc --]\n[-- $ts --]";
 	$ret .= "\n";
 }
@@ -482,9 +486,8 @@ sub add_text_body {
 			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;
 		}
@@ -615,49 +618,6 @@ sub _parent_headers {
 	$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) = @_;