diff options
author | Eric Wong <e@80x24.org> | 2015-09-13 22:35:46 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2015-09-13 22:36:15 +0000 |
commit | d6089bc6728e6dc03640b312f097fe8328e8992e (patch) | |
tree | 6014ad89356b8c196ef437e1d1c31f7bda93f23f /lib/PublicInbox | |
parent | 22fd855b498909bec6ca7112ace99ea392741992 (diff) | |
download | public-inbox-d6089bc6728e6dc03640b312f097fe8328e8992e.tar.gz |
This can be helpful for folks who want to subscribe to a particular topic or keyword.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r-- | lib/PublicInbox/Feed.pm | 6 | ||||
-rw-r--r-- | lib/PublicInbox/SearchView.pm | 42 |
2 files changed, 36 insertions, 12 deletions
diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm index 5a2f62b1..85c598e5 100644 --- a/lib/PublicInbox/Feed.pm +++ b/lib/PublicInbox/Feed.pm @@ -74,7 +74,7 @@ sub emit_atom { add_to_feed($feed_opts, $fh, $path, $git); }); $git = undef; # destroy pipes - _end_feed($fh); + end_feed($fh); } sub _no_thread { @@ -84,7 +84,7 @@ sub _no_thread { $fh->close; } -sub _end_feed { +sub end_feed { my ($fh) = @_; Email::Address->purge_cache; $fh->write('</feed>'); @@ -108,7 +108,7 @@ sub emit_atom_thread { add_to_feed($feed_opts, $fh, mid2path($msg->mid), $git); } $git = undef; # destroy pipes - _end_feed($fh); + end_feed($fh); } sub emit_html_index { diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm index c15a0463..b65351aa 100644 --- a/lib/PublicInbox/SearchView.pm +++ b/lib/PublicInbox/SearchView.pm @@ -30,7 +30,7 @@ sub sres_top_html { $total = $mset->get_matches_estimated; }; my $err = $@; - my $res = html_start($q) . PublicInbox::View::PRE_WRAP; + my $res = html_start($q, $ctx) . PublicInbox::View::PRE_WRAP; if ($err) { $code = 400; $res .= err_txt($err) . "</pre><hr /><pre>" . foot($ctx); @@ -39,8 +39,7 @@ sub sres_top_html { $res .= "\n\n[No results found]</pre><hr /><pre>".foot($ctx); } else { my $x = $q->{x}; - # TODO - #return sub { adump($_[0], $mset, $q, $ctx) } if ($x eq 'A'); + return sub { adump($_[0], $mset, $q, $ctx) } if ($x eq 'A'); $res .= search_nav_top($mset, $q); if ($x eq 't') { @@ -109,8 +108,8 @@ sub search_nav_top { $rv .= qq{<a\nhref="?$s">summary</a>|}; $rv .= qq{<b>threaded</b>}; } - # my $A = $q->qs_html(x => 'a'); - # $rv .= qq{|<a\nhref="?$A">Atom</a>}; # TODO + my $A = $q->qs_html(x => 'A'); + $rv .= qq{|<a\nhref="?$A">Atom</a>}; $rv .= ']'; } @@ -213,13 +212,16 @@ sub foot { } sub html_start { - my ($q) = @_; + my ($q, $ctx) = @_; my $query = PublicInbox::Hval->new_oneline($q->{q}); my $qh = $query->as_html; - my $res = "<html><head><title>$qh - search results</title></head>" . - qq{<body><form\naction="">} . - qq{<input\nname=q\nvalue="$qh"\ntype=text />}; + my $A = $q->qs_html(x => 'A'); + my $res = "<html><head><title>$qh - search results</title>" . + qq{<link\nrel=alternate\ntitle="Atom feed"\n} . + qq!href="?$A"\ntype="application/atom+xml"/></head>! . + qq{<body><form\naction="">} . + qq{<input\nname=q\nvalue="$qh"\ntype=text />}; $res .= qq{<input\ntype=hidden\nname=r />} if $q->{r}; if (my $x = $q->{x}) { @@ -230,6 +232,28 @@ sub html_start { $res .= qq{<input\ntype=submit\nvalue=search /></form>}; } +sub adump { + my ($cb, $mset, $q, $ctx) = @_; + my $fh = $cb->([ 200, ['Content-Type' => 'application/atom+xml']]); + require PublicInbox::GitCatFile; + my $git = PublicInbox::GitCatFile->new($ctx->{git_dir}); + my $feed_opts = PublicInbox::Feed::get_feedopts($ctx); + my $x = PublicInbox::Hval->new_oneline($q->{q})->as_html; + $x = qq{$x - search results}; + $feed_opts->{atomurl} = $feed_opts->{url} . '?'. $q->qs_html; + $feed_opts->{url} .= '?'. $q->qs_html(x => undef); + $x = PublicInbox::Feed::atom_header($feed_opts, $x); + $fh->write($x. PublicInbox::Feed::feed_updated()); + + for ($mset->items) { + $x = PublicInbox::SearchMsg->load_doc($_->get_document)->mid; + $x = mid2path($x); + PublicInbox::Feed::add_to_feed($feed_opts, $fh, $x, $git); + } + $git = undef; + PublicInbox::Feed::end_feed($fh); +} + package PublicInbox::SearchQuery; use strict; use warnings; |