-# Copyright (C) 2013-2015, all contributors <meta@public-inbox.org>
+# Copyright (C) 2013-2015 all contributors <meta@public-inbox.org>
# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
package PublicInbox::Feed;
use strict;
use PublicInbox::MID qw/mid_clean mid2path/;
use POSIX qw/strftime/;
use constant {
- DATEFMT => '%Y-%m-%dT%H:%M:%SZ', # atom standard
+ DATEFMT => '%Y-%m-%dT%H:%M:%SZ', # Atom standard
MAX_PER_PAGE => 25, # this needs to be tunable
};
each_recent_blob($ctx, sub {
my ($path, undef, $ts) = @_;
if (defined $x) {
- $fh->write($x . '<updated>' .
- strftime(DATEFMT, gmtime($ts)) .
- '</updated>');
+ $fh->write($x . feed_updated(undef, $ts));
$x = undef;
}
add_to_feed($feed_opts, $fh, $path, $git);
});
$git = undef; # destroy pipes
- _end_feed($fh);
+ end_feed($fh);
}
sub _no_thread {
$fh->close;
}
-sub _end_feed {
+sub end_feed {
my ($fh) = @_;
Email::Address->purge_cache;
$fh->write('</feed>');
add_to_feed($feed_opts, $fh, mid2path($msg->mid), $git);
}
$git = undef; # destroy pipes
- _end_feed($fh);
+ end_feed($fh);
}
sub emit_html_index {
my $title = $feed_opts->{description} || '';
$title = PublicInbox::Hval->new_oneline($title)->as_html;
my $atom_url = $feed_opts->{atomurl};
- my ($footer, $param, $last, $srch);
+ my ($footer, $param, $last);
my $state = { ctx => $ctx, seen => {}, anchor_idx => 0 };
+ my $srch = $ctx->{srch};
+
+ my $top = "<b>$title</b> (<a\nhref=\"$atom_url\">Atom feed</a>)";
+
+ if ($srch) {
+ $top = qq{<form\naction=""><tt>$top} .
+ qq{ <input\nname=q\ntype=text />} .
+ qq{<input\ntype=submit\nvalue=search />} .
+ qq{</tt></form>} .
+ PublicInbox::View::PRE_WRAP;
+ } else {
+ $top = PublicInbox::View::PRE_WRAP . $top . "\n";
+ }
$fh->write("<html><head><title>$title</title>" .
"<link\nrel=alternate\ntitle=\"Atom feed\"\n".
"href=\"$atom_url\"\ntype=\"application/atom+xml\"/>" .
- '</head><body>' . PublicInbox::View::PRE_WRAP .
- "<b>$title</b> (<a\nhref=\"$atom_url\">Atom feed</a>)\n");
+ "</head><body>$top");
# if the 'r' query parameter is given, it is a legacy permalink
# which we must continue supporting:
my $cgi = $ctx->{cgi};
- if ($cgi && !$cgi->param('r') && ($srch = $ctx->{srch})) {
+ if ($cgi && !$cgi->param('r') && $srch) {
$state->{srch} = $srch;
$last = PublicInbox::View::emit_index_topics($state, $fh);
$param = 'o';
$head = $cgi->path_info;
$head = qq!<a\nhref="$head">head</a>!;
}
- my $atom = "<a\nhref=\"$feed_opts->{atomurl}\">atom</a>";
+ my $atom = "<a\nhref=\"$feed_opts->{atomurl}\">Atom</a>";
"<a\nname=\"s$anchor\">page:</a> $next $head $atom";
}
PublicInbox::Hval->new_oneline($mime->header($name))->raw;
}
-sub feed_date {
- my ($date) = @_;
- my @t = eval { strptime($date) };
+sub feed_updated {
+ my ($date, $ts) = @_;
+ my @t = eval { strptime($date) } if defined $date;
+ @t = gmtime($ts || time) unless scalar @t;
- scalar(@t) ? strftime(DATEFMT, @t) : 0;
+ '<updated>' . strftime(DATEFMT, @t) . '</updated>';
}
# returns 0 (skipped) or 1 (added)
$mime = undef;
my $date = $header_obj->header('Date');
- $date = PublicInbox::Hval->new_oneline($date);
- $date = feed_date($date->raw) or return 0;
- $date = "<updated>$date</updated>";
+ my $updated = feed_updated($date);
my $title = mime_header($header_obj, 'Subject') or return 0;
$title = title_tag($title);
$email = PublicInbox::Hval->new_oneline($email)->as_html;
if (delete $feed_opts->{emit_header}) {
- $fh->write(atom_header($feed_opts, $title) . $date);
+ $fh->write(atom_header($feed_opts, $title) . $updated);
}
$fh->write("<entry><author><name>$name</name><email>$email</email>" .
- "</author>$title$date" .
+ "</author>$title$updated" .
qq{<content\ntype="xhtml">} .
qq{<div\nxmlns="http://www.w3.org/1999/xhtml">});
$fh->write($content);