+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 = "<hr /><pre>$footer</pre>";
+ }
+ $fh->write("$footer</body></html>");
+ $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;
+}