- my $order = $ctx->{order};
- my $subjs = $ctx->{subjs};
- my $latest = $ctx->{latest};
- my $fh = $ctx->{fh};
- return $fh->write("\n[No topics in range]</pre>") unless scalar @$order;
- my $pfx;
- my $prev = 0;
- my $prev_attr = '';
- my $cur;
- my @recent;
- while (defined(my $info = shift @$order)) {
- my ($level, $subj) = @$info;
- my $n = delete $subjs->{$subj};
- my ($mid, $ts) = @{delete $latest->{$subj}};
- $mid = PublicInbox::Hval->new_msgid($mid)->as_href;
- $pfx = indent_for($level);
- my $nl = $level == $prev ? "\n" : '';
- if ($nl && $cur) {
- push @recent, $cur;
- $cur = undef;
- }
- $cur ||= [ $ts, '' ];
- $cur->[0] = $ts if $ts > $cur->[0];
- $cur->[1] .= $nl . $pfx . th_pfx($level);
- if ($ts == -666) { # ghost
- $cur->[1] .= ghost_parent('', $mid) . "\n";
- next; # child will have mbox / atom link
- }
-
- $subj = PublicInbox::Hval->new($subj)->as_html;
- $cur->[1] .= "<a\nhref=\"$mid/T/#u\"><b>$subj</b></a>\n";
+ my $order = delete $ctx->{order}; # [ ts, subj1, subj2, subj3, ... ]
+ if (!@$order) {
+ $ctx->{-html_tip} = '<pre>[No topics in range]</pre>';
+ return 404;
+ }
+
+ my @out;
+
+ # sort by recency, this allows new posts to "bump" old topics...
+ foreach my $topic (sort { $b->[0] <=> $a->[0] } @$order) {
+ my ($ts, $n, $seen, $top, @ex) = @$topic;
+ @$topic = ();
+ next unless defined $top; # ghost topic
+ my $mid = delete $seen->{$top};
+ my $href = mid_escape($mid);
+ $top = PublicInbox::Hval->new($top)->as_html;