From a380c9b55b39a4db6a21131332a2a5629428dded Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 7 Jul 2016 01:39:37 +0000 Subject: www: remove old footer generation code and normalize new.html We now generate all of our HTML using WwwStream which forces us to have consistent headers and footers in the HTML itself. This also makes the search-capable vs search-less installs go to the new.html endpoint to maintain consistency (in case an admin decides to enable Xapian). --- lib/PublicInbox/Feed.pm | 86 +++++++++++++------------------------------------ lib/PublicInbox/View.pm | 47 +++++++++++++++++++++------ lib/PublicInbox/WWW.pm | 42 +----------------------- 3 files changed, 60 insertions(+), 115 deletions(-) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm index 026a069e..65adf373 100644 --- a/lib/PublicInbox/Feed.pm +++ b/lib/PublicInbox/Feed.pm @@ -31,7 +31,19 @@ sub generate_thread_atom { sub generate_html_index { my ($ctx) = @_; - sub { emit_html_index($_[0], $ctx) }; + # if the 'r' query parameter is given, it is a legacy permalink + # which we must continue supporting: + my $qp = $ctx->{qp}; + if ($qp && !$qp->{r} && $ctx->{srch}) { + return PublicInbox::View::index_topics($ctx); + } + + my $env = $ctx->{env}; + my $url = $ctx->{-inbox}->base_url($env) . 'new.html'; + my $qs = $env->{QUERY_STRING}; + $url .= "?$qs" if $qs ne ''; + [302, [ 'Location', $url, 'Content-Type', 'text/plain'], + [ "Redirecting to $url\n" ] ]; } sub new_html { @@ -56,7 +68,7 @@ sub new_html { $s .= '' unless $more; return $s; } - undef; + new_html_footer($ctx, $last); }); } @@ -159,74 +171,20 @@ sub _html_index_top { "$top"; } -sub emit_html_index { - 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; - $ctx->{-upfx} = ''; - - my ($footer, $param, $last); - $ctx->{seen} = {}; - $ctx->{anchor_idx} = 0; - $ctx->{fh} = $fh; - my $srch = $ctx->{srch}; - $fh->write(_html_index_top($feed_opts, $srch)); - - # if the 'r' query parameter is given, it is a legacy permalink - # which we must continue supporting: - my $qp = $ctx->{qp}; - if ($qp && !$qp->{r} && $srch) { - $last = PublicInbox::View::emit_index_topics($ctx); - $param = 'o'; - } else { - $last = emit_index_nosrch($ctx); - $param = 'r'; - } - $footer = nav_footer($ctx, $last, $feed_opts, $param); - if ($footer) { - my $list_footer = $ctx->{footer}; - $footer .= "\n\n" . $list_footer if $list_footer; - $footer = "
$footer
"; - } - $fh->write("$footer"); - $fh->close; -} - -sub emit_index_nosrch { - my ($ctx) = @_; - my $ibx = $ctx->{-inbox}; - my $fh = $ctx->{fh}; - my (undef, $last) = each_recent_blob($ctx, sub { - my ($path, $commit, $ts, $u, $subj) = @_; - $ctx->{first} ||= $commit; - - my $mime = do_cat_mail($ibx, $path) or return 0; - $fh->write(PublicInbox::View::index_entry($mime, $ctx, 1)); - 1; - }); - $last; -} - -sub nav_footer { - my ($ctx, $last, $feed_opts, $param) = @_; - my $qp = $ctx->{qp} or return ''; - my $old_r = $qp->{$param}; - my $head = ' '; +sub new_html_footer { + my ($ctx, $last) = @_; + my $qp = delete $ctx->{qp} or return; + my $old_r = $qp->{r}; + my $latest = ''; my $next = ' '; - my $first = $ctx->{first}; - my $anchor = $ctx->{anchor_idx}; if ($last) { - $next = qq!next!; + $next = qq!next!; } if ($old_r) { - $head = $ctx->{env}->{PATH_INFO}; - $head = qq!head!; + $latest = qq! latest!; } - my $atom = "{atomurl}\">Atom feed"; - "page: $next $head $atom"; + "
page: $next$latest
"; } sub each_recent_blob { diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 7ff3b403..09035507 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -24,7 +24,7 @@ sub th_pfx ($) { $_[0] == 0 ? '' : TCHILD }; # public functions: (unstable) sub msg_html { - my ($ctx, $mime, $footer) = @_; + my ($ctx, $mime) = @_; my $hdr = $mime->header_obj; my $tip = _msg_html_prepare($hdr, $ctx); PublicInbox::WwwStream->response($ctx, 200, sub { @@ -853,13 +853,15 @@ sub add_topic { } } -sub emit_topics { +sub topics { my ($ctx) = @_; my $order = $ctx->{order}; my $subjs = $ctx->{subjs}; my $latest = $ctx->{latest}; - my $fh = $ctx->{fh}; - return $fh->write("\n[No topics in range]") unless scalar @$order; + if (!@$order) { + $ctx->{-html_tip} = '
[No topics in range]
'; + return 404; + } my $pfx; my $prev = 0; my $prev_attr = ''; @@ -903,13 +905,38 @@ sub emit_topics { } push @recent, $cur if $cur; @recent = map { $_->[1] } sort { $b->[0] <=> $a->[0] } @recent; - $fh->write(join('', @recent) . ''); + $ctx->{-html_tip} = join('', '
', @recent, '
'); + 200; } -sub emit_index_topics { +sub index_nav { # callback for WwwStream + my (undef, $ctx) = @_; + delete $ctx->{qp} or return; + my ($next, $prev); + $next = $prev = ' '; + my $latest = ''; + + my $next_o = $ctx->{-next_o}; + if ($next_o) { + $next = qq!next!; + } + if (my $cur_o = $ctx->{-cur_o}) { + $latest = qq! latest!; + + my $o = $cur_o - ($next_o - $cur_o); + if ($o > 0) { + $prev = qq!prev!; + } elsif ($o == 0) { + $prev = qq!prev!; + } + } + "
page: $next $prev$latest
"; +} + +sub index_topics { my ($ctx) = @_; my ($off) = (($ctx->{qp}->{o} || '0') =~ /(\d+)/); - $ctx->{order} = []; + my $order = $ctx->{order} = []; $ctx->{subjs} = {}; $ctx->{latest} = {}; my $max = 25; @@ -921,9 +948,9 @@ sub emit_index_topics { walk_thread(thread_results($sres), $ctx, *add_topic); $opts{offset} += $nr; } - - emit_topics($ctx); - $opts{offset}; + $ctx->{-next_o} = $opts{offset}; + $ctx->{-cur_o} = $off; + PublicInbox::WwwStream->response($ctx, topics($ctx), *index_nav); } sub thread_adj_level { diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 5de5ffee..2c60d596 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -198,7 +198,6 @@ sub get_index { my ($ctx) = @_; require PublicInbox::Feed; my $srch = searcher($ctx); - footer($ctx); if ($ctx->{env}->{QUERY_STRING} =~ /(?:\A|[&;])q=/) { require PublicInbox::SearchView; PublicInbox::SearchView::sres_top_html($ctx); @@ -227,11 +226,10 @@ sub get_mid_html { my $x = mid2blob($ctx) or return r404($ctx); require PublicInbox::View; - my $foot = footer($ctx); require Email::MIME; my $mime = Email::MIME->new($x); searcher($ctx); - PublicInbox::View::msg_html($ctx, $mime, $foot); + PublicInbox::View::msg_html($ctx, $mime); } # /$INBOX/$MESSAGE_ID/t/ @@ -250,44 +248,6 @@ sub ctx_get { $val; } -sub footer { - my ($ctx) = @_; - return '' unless $ctx; - my $obj = $ctx->{-inbox} or return ''; - - # auto-generate a footer - chomp(my $desc = $obj->description); - $desc = PublicInbox::Hval::ascii_html($desc); - - my $urls; - my @urls = @{$obj->cloneurl}; - my %seen = map { $_ => 1 } @urls; - my $env = $ctx->{env}; - my $http = $obj->base_url($env); - chop $http; - $seen{$http} or unshift @urls, $http; - my $ssoma_url = PublicInbox::Hval::prurl($env, SSOMA_URL); - if (scalar(@urls) == 1) { - $urls = "URL for ssoma or git clone --mirror $urls[0]); - } else { - $urls = "URLs for ssoma or git clone --mirror\n) . - join("\n", map { "\tgit clone --mirror $_" } @urls); - } - - my $addr = $obj->{-primary_address}; - $ctx->{footer} = join("\n", - '- ' . $desc, - "A {env}, PI_URL) . - '">public-inbox, ' . - 'anybody may post in plain-text (not HTML):', - $addr, - $urls - ); -} - # search support is optional, returns undef if Xapian is not installed # or not configured for the given GIT_DIR sub searcher { -- cgit v1.2.3-24-ge0c7