X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FFeed.pm;h=81895dbf1d67289644007844cdf3853b47b15f3a;hb=23a4e44bedabe5b8b651346cabc2a870c5377a30;hp=e4831f6a66a68d85691579eda43f6a6046e8fec5;hpb=476fc666c223f0fbe98ee1f66f7e282abf8adb56;p=public-inbox.git diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm index e4831f6a..81895dbf 100644 --- a/lib/PublicInbox/Feed.pm +++ b/lib/PublicInbox/Feed.pm @@ -5,13 +5,13 @@ package PublicInbox::Feed; use strict; use warnings; -use Email::Address; use Email::MIME; use Date::Parse qw(strptime); use PublicInbox::Hval qw/ascii_html/; use PublicInbox::Git; use PublicInbox::View; use PublicInbox::MID qw/mid_clean mid2path/; +use PublicInbox::Address; use POSIX qw/strftime/; use constant { DATEFMT => '%Y-%m-%dT%H:%M:%SZ', # Atom standard @@ -40,7 +40,7 @@ sub title_tag { my ($title) = @_; $title =~ tr/\t\n / /s; # squeeze spaces # try to avoid the type attribute in title: - $title =~ ascii_html($title); + $title = ascii_html($title); my $type = index($title, '&') >= 0 ? "\ntype=\"html\"" : ''; "$title"; } @@ -61,9 +61,9 @@ sub atom_header { sub emit_atom { my ($cb, $ctx) = @_; + my $feed_opts = get_feedopts($ctx); my $fh = $cb->([ 200, ['Content-Type' => 'application/atom+xml']]); my $max = $ctx->{max} || MAX_PER_PAGE; - my $feed_opts = get_feedopts($ctx); my $x = atom_header($feed_opts); my $git = $ctx->{git} ||= PublicInbox::Git->new($ctx->{git_dir}); each_recent_blob($ctx, sub { @@ -86,7 +86,6 @@ sub _no_thread { sub end_feed { my ($fh) = @_; - Email::Address->purge_cache; $fh->write(''); $fh->close; } @@ -95,8 +94,8 @@ sub emit_atom_thread { my ($cb, $ctx) = @_; my $res = $ctx->{srch}->get_thread($ctx->{mid}); return _no_thread($cb) unless $res->{total}; - my $fh = $cb->([200, ['Content-Type' => 'application/atom+xml']]); my $feed_opts = get_feedopts($ctx); + my $fh = $cb->([200, ['Content-Type' => 'application/atom+xml']]); my $html_url = $feed_opts->{atomurl} = $ctx->{self_url}; $html_url =~ s!/t\.atom\z!/!; @@ -111,15 +110,15 @@ sub emit_atom_thread { } sub emit_html_index { - my ($cb, $ctx) = @_; - my $fh = $cb->([200,['Content-Type'=>'text/html; charset=UTF-8']]); + my ($res, $ctx) = @_; + my $feed_opts = get_feedopts($ctx); + my $fh = $res->([200,['Content-Type'=>'text/html; charset=UTF-8']]); my $max = $ctx->{max} || MAX_PER_PAGE; - my $feed_opts = get_feedopts($ctx); - my $title = $feed_opts->{description} || ''; + my $title = ascii_html($feed_opts->{description} || ''); my ($footer, $param, $last); - my $state = { ctx => $ctx, seen => {}, anchor_idx => 0 }; + my $state = { ctx => $ctx, seen => {}, anchor_idx => 0, fh => $fh }; my $srch = $ctx->{srch}; my $top = "$title (Atom feed)"; @@ -144,10 +143,10 @@ sub emit_html_index { my $cgi = $ctx->{cgi}; if ($cgi && !$cgi->param('r') && $srch) { $state->{srch} = $srch; - $last = PublicInbox::View::emit_index_topics($state, $fh); + $last = PublicInbox::View::emit_index_topics($state); $param = 'o'; } else { - $last = emit_index_nosrch($ctx, $state, $fh); + $last = emit_index_nosrch($ctx, $state); $param = 'r'; } $footer = nav_footer($cgi, $last, $feed_opts, $state, $param); @@ -161,17 +160,16 @@ sub emit_html_index { } sub emit_index_nosrch { - my ($ctx, $state, $fh) = @_; + my ($ctx, $state) = @_; my $git = $ctx->{git} ||= PublicInbox::Git->new($ctx->{git_dir}); my (undef, $last) = each_recent_blob($ctx, sub { my ($path, $commit, $ts, $u, $subj) = @_; $state->{first} ||= $commit; my $mime = do_cat_mail($git, $path) or return 0; - PublicInbox::View::index_entry($fh, $mime, 0, $state); + PublicInbox::View::index_entry($mime, 0, $state); 1; }); - Email::Address->purge_cache; $last; } @@ -185,7 +183,7 @@ sub nav_footer { my $anchor = $state->{anchor_idx}; if ($last) { - $next = qq!next!; + $next = qq!next!; } if ($old_r) { $head = $cgi->path_info; @@ -224,6 +222,7 @@ sub each_recent_blob { my $nr = 0; my ($cur_commit, $first_commit, $last_commit); my ($ts, $subj, $u); + local $/ = "\n"; while (defined(my $line = <$log>)) { if ($line =~ /$addmsg/o) { my $add = $1; @@ -244,6 +243,7 @@ sub each_recent_blob { } if ($last) { + local $/ = "\n"; while (my $line = <$log>) { if ($line =~ /^(${hex}{7,40})/o) { $last_commit = $1; @@ -260,17 +260,17 @@ sub each_recent_blob { sub get_feedopts { my ($ctx) = @_; my $pi_config = $ctx->{pi_config}; - my $listname = $ctx->{listname}; + my $inbox = $ctx->{inbox}; + my $obj = $ctx->{-inbox}; my $cgi = $ctx->{cgi}; - my %rv; - if (open my $fh, '<', "$ctx->{git_dir}/description") { - chomp($rv{description} = <$fh>); - } else { - $rv{description} = '($GIT_DIR/description missing)'; - } - - if ($pi_config && defined $listname && $listname ne '') { - my $addr = $pi_config->get($listname, 'address') || ""; + my %rv = ( description => $obj ? $obj->description : 'FIXME' ); + + if ($obj) { + $rv{address} = $obj->{address}; + $rv{id_addr} = $obj->{-primary_address}; + } elsif ($pi_config && defined $inbox && $inbox ne '') { + # TODO: remove + my $addr = $pi_config->get($inbox, 'address') || ""; $rv{address} = $addr; $addr = $addr->[0] if ref($addr); $rv{id_addr} = $addr; @@ -278,19 +278,19 @@ sub get_feedopts { $rv{id_addr} ||= 'public-inbox@example.com'; my $url_base; - if ($cgi) { - $url_base = $cgi->base->as_string . $listname; + if ($obj) { + $url_base = $obj->base_url($cgi); # CGI may be undef if (my $mid = $ctx->{mid}) { # per-thread feed: - $rv{atomurl} = "$url_base/$mid/t.atom"; + $rv{atomurl} = "$url_base$mid/t.atom"; } else { - $rv{atomurl} = "$url_base/new.atom"; + $rv{atomurl} = $url_base."new.atom"; } } else { - $url_base = "http://example.com"; - $rv{atomurl} = "$url_base/new.atom"; + $url_base = 'http://example.com/'; + $rv{atomurl} = $url_base.'new.atom'; } - $rv{url} ||= "$url_base/"; - $rv{midurl} = "$url_base/"; + $rv{url} ||= $url_base; + $rv{midurl} = $url_base; \%rv; } @@ -315,11 +315,11 @@ sub add_to_feed { my $mid = $header_obj->header_raw('Message-ID'); defined $mid or return 0; $mid = PublicInbox::Hval->new_msgid($mid); - my $href = $mid->as_href; - my $content = PublicInbox::View->feed_entry($mime, "$midurl$href/f/"); - defined($content) or return 0; - $mime = undef; + my $href = $midurl.$mid->as_href; + my $content = qq() . + PublicInbox::View::multipart_text_as_html($mime, $href) . + ''; my $date = $header_obj->header('Date'); my $updated = feed_updated($date); @@ -328,9 +328,9 @@ sub add_to_feed { $title = title_tag($title); my $from = $header_obj->header('From') or return 0; - my @from = Email::Address->parse($from) or return 0; - my $name = ascii_html($from[0]->name); - my $email = $from[0]->address; + my ($email) = PublicInbox::Address::emails($from); + my $name = PublicInbox::Address::from_name($from); + $name = ascii_html($name); $email = ascii_html($email); if (delete $feed_opts->{emit_header}) { @@ -346,7 +346,7 @@ sub add_to_feed { my $h = '[a-f0-9]'; my (@uuid5) = ($add =~ m!\A($h{8})($h{4})($h{4})($h{4})($h{12})!o); my $id = 'urn:uuid:' . join('-', @uuid5); - $fh->write(qq!!. + $fh->write(qq!!. "$id"); 1; }