X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FFeed.pm;h=e4831f6a66a68d85691579eda43f6a6046e8fec5;hb=476fc666c223f0fb;hp=150bea038241b57addb71cd34866d71cac3f7c7f;hpb=4c2c2325d2948ec5340e2fcafbee798cf568f5fd;p=public-inbox.git diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm index 150bea03..e4831f6a 100644 --- a/lib/PublicInbox/Feed.pm +++ b/lib/PublicInbox/Feed.pm @@ -8,7 +8,7 @@ use warnings; use Email::Address; use Email::MIME; use Date::Parse qw(strptime); -use PublicInbox::Hval; +use PublicInbox::Hval qw/ascii_html/; use PublicInbox::Git; use PublicInbox::View; use PublicInbox::MID qw/mid_clean mid2path/; @@ -18,9 +18,6 @@ use constant { MAX_PER_PAGE => 25, # this needs to be tunable }; -use Encode qw/find_encoding/; -my $enc_utf8 = find_encoding('UTF-8'); - # main function sub generate { my ($ctx) = @_; @@ -41,8 +38,9 @@ sub generate_html_index { sub title_tag { my ($title) = @_; + $title =~ tr/\t\n / /s; # squeeze spaces # try to avoid the type attribute in title: - $title = PublicInbox::Hval->new_oneline($title)->as_html; + $title =~ ascii_html($title); my $type = index($title, '&') >= 0 ? "\ntype=\"html\"" : ''; "$title"; } @@ -55,7 +53,8 @@ sub atom_header { qq(\n) . qq{} . qq{$title} . - qq({url}"/>) . + qq() . qq({atomurl}"/>) . qq(mailto:$feed_opts->{id_addr}); } @@ -119,27 +118,25 @@ sub emit_html_index { my $feed_opts = get_feedopts($ctx); my $title = $feed_opts->{description} || ''; - $title = PublicInbox::Hval->new_oneline($title)->as_html; - my $atom_url = $feed_opts->{atomurl}; my ($footer, $param, $last); my $state = { ctx => $ctx, seen => {}, anchor_idx => 0 }; my $srch = $ctx->{srch}; - my $top = "$title (Atom feed)"; + my $top = "$title (Atom feed)"; if ($srch) { - $top = qq{$top} . + $top = qq{
$top} .
 			  qq{ } .
 			  qq{} .
-			  qq{} .
-			  PublicInbox::Hval::PRE;
+			  q{
}
 	} else {
-		$top = PublicInbox::Hval::PRE . $top . "\n";
+		$top = '
' . $top . "\n";
 	}
 
 	$fh->write("$title" .
 		   "" .
+		   "href=\"new.atom\"\ntype=\"application/atom+xml\"/>" .
+		   PublicInbox::Hval::STYLE .
 		   "$top");
 
 	# if the 'r' query parameter is given, it is a legacy permalink
@@ -194,7 +191,7 @@ sub nav_footer {
 		$head = $cgi->path_info;
 		$head = qq!head!;
 	}
-	my $atom = "{atomurl}\">Atom";
+	my $atom = "{atomurl}\">Atom feed";
 	"page: $next $head $atom";
 }
 
@@ -255,7 +252,6 @@ sub each_recent_blob {
 		}
 	}
 
-	close $log; # we may EPIPE here
 	# for pagination
 	($first_commit, $last_commit);
 }
@@ -269,7 +265,6 @@ sub get_feedopts {
 	my %rv;
 	if (open my $fh, '<', "$ctx->{git_dir}/description") {
 		chomp($rv{description} = <$fh>);
-		close $fh;
 	} else {
 		$rv{description} = '($GIT_DIR/description missing)';
 	}
@@ -284,14 +279,7 @@ sub get_feedopts {
 
 	my $url_base;
 	if ($cgi) {
-		my $base;
-		if (ref($cgi) eq 'CGI') {
-			$base = $cgi->url(-base);
-		} else {
-			$base = $cgi->base->as_string;
-			$base =~ s!/\z!!;
-		}
-		$url_base = "$base/$listname";
+		$url_base = $cgi->base->as_string . $listname;
 		if (my $mid = $ctx->{mid}) { # per-thread feed:
 			$rv{atomurl} = "$url_base/$mid/t.atom";
 		} else {
@@ -307,11 +295,6 @@ sub get_feedopts {
 	\%rv;
 }
 
-sub mime_header {
-	my ($mime, $name) = @_;
-	PublicInbox::Hval->new_oneline($mime->header($name))->raw;
-}
-
 sub feed_updated {
 	my ($date, $ts) = @_;
 	my @t = eval { strptime($date) } if defined $date;
@@ -329,7 +312,7 @@ sub add_to_feed {
 	my $midurl = $feed_opts->{midurl};
 
 	my $header_obj = $mime->header_obj;
-	my $mid = $header_obj->header('Message-ID');
+	my $mid = $header_obj->header_raw('Message-ID');
 	defined $mid or return 0;
 	$mid = PublicInbox::Hval->new_msgid($mid);
 	my $href = $mid->as_href;
@@ -340,14 +323,15 @@ sub add_to_feed {
 	my $date = $header_obj->header('Date');
 	my $updated = feed_updated($date);
 
-	my $title = mime_header($header_obj, 'Subject') or return 0;
+	my $title = $header_obj->header('Subject');
+	defined $title or return 0;
 	$title = title_tag($title);
 
-	my $from = mime_header($header_obj, 'From') or return 0;
+	my $from = $header_obj->header('From') or return 0;
 	my @from = Email::Address->parse($from) or return 0;
-	my $name = PublicInbox::Hval->new_oneline($from[0]->name)->as_html;
+	my $name = ascii_html($from[0]->name);
 	my $email = $from[0]->address;
-	$email = PublicInbox::Hval->new_oneline($email)->as_html;
+	$email = ascii_html($email);
 
 	if (delete $feed_opts->{emit_header}) {
 		$fh->write(atom_header($feed_opts, $title) . $updated);