+
+ my $mbox = qq(<a\nhref="$href/t.mbox.gz">mbox.gz</a>);
+ my $atom = qq(<a\nhref="$href/t.atom">Atom</a>);
+ my $s = "<a\nhref=\"$href/T/$anchor\"><b>$top</b></a>\n" .
+ " $ts UTC $n - $mbox / $atom\n";
+ for (my $i = 0; $i < scalar(@ex); $i += 2) {
+ my $level = $ex[$i];
+ my $subj = $ex[$i + 1];
+ $mid = delete $seen->{$subj};
+ $subj = ascii_html($subj);
+ obfuscate_addrs($subj) if $obfs;
+ $href = mid_escape($mid);
+ $s .= indent_for($level) . TCHILD;
+ $s .= "<a\nhref=\"$href/T/#u\">$subj</a>\n";
+ }
+ push @out, $s;
+ }
+ $ctx->{-html_tip} = '<pre>' . join("\n", @out) . '</pre>';
+ 200;
+}
+
+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!<a\nhref="?o=$next_o"\nrel=next>next</a>!;
+ }
+ if (my $cur_o = $ctx->{-cur_o}) {
+ $latest = qq! <a\nhref=.>latest</a>!;
+
+ my $o = $cur_o - ($next_o - $cur_o);
+ if ($o > 0) {
+ $prev = qq!<a\nhref="?o=$o"\nrel=prev>prev</a>!;
+ } elsif ($o == 0) {
+ $prev = qq!<a\nhref=.\nrel=prev>prev</a>!;
+ }
+ }
+ "<hr><pre>page: $next $prev$latest</pre>";
+}
+
+sub index_topics {
+ my ($ctx) = @_;
+ my ($off) = (($ctx->{qp}->{o} || '0') =~ /(\d+)/);
+ my $opts = { offset => $off, limit => 200 };
+
+ $ctx->{order} = [];
+ my $srch = $ctx->{srch};
+ my $sres = $srch->query('', $opts);
+ my $nr = scalar @{$sres->{msgs}};
+ if ($nr) {
+ $sres = load_results($srch, $sres);
+ walk_thread(thread_results($sres), $ctx, *acc_topic);
+ }
+ $ctx->{-next_o} = $off+ $nr;
+ $ctx->{-cur_o} = $off;
+ PublicInbox::WwwStream->response($ctx, dump_topics($ctx), *index_nav);
+}
+
+sub thread_adj_level {
+ my ($ctx, $level) = @_;
+
+ my $max = $ctx->{cur_level};
+ if ($level <= 0) {
+ return ('', '') if $max == 0; # flat output
+
+ # reset existing lists
+ my $beg = $max > 1 ? ('</ul></li>' x ($max - 1)) : '';
+ $ctx->{cur_level} = 0;
+ ("$beg</ul>", '');
+ } elsif ($level == $max) { # continue existing list
+ qw(<li> </li>);
+ } elsif ($level < $max) {
+ my $beg = $max > 1 ? ('</ul></li>' x ($max - $level)) : '';
+ $ctx->{cur_level} = $level;
+ ("$beg<li>", '</li>');
+ } else { # ($level > $max) # start a new level
+ $ctx->{cur_level} = $level;
+ my $beg = ($max ? '<li>' : '') . '<ul><li>';
+ ($beg, '</li>');