]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/View.pm
www: add rel=next and rel=prev navigation hints
[public-inbox.git] / lib / PublicInbox / View.pm
index f07979e9c1dac4d04d5ef83cc9b36266850c206e..63810dcbcaca74d81e45dedb1ab4c4e112381c4f 100644 (file)
@@ -17,6 +17,8 @@ use PublicInbox::MID qw/mid_clean id_compress mid2path mid_mime/;
 require POSIX;
 
 use constant INDENT => '  ';
+use constant TCHILD => '` ';
+sub th_pfx ($) { $_[0] == 0 ? '' : TCHILD };
 
 my $enc_utf8 = find_encoding('UTF-8');
 
@@ -28,7 +30,7 @@ sub msg_html {
        headers_to_html_header($hdr, $ctx) .
                multipart_text_as_html($mime) .
                '</pre><hr /><pre>' .
-               html_footer($hdr, 1, $ctx) .
+               html_footer($hdr, 1, $ctx, 'R/') .
                $footer .
                '</pre></body></html>';
 }
@@ -137,7 +139,7 @@ sub index_entry {
                index_walk($fh, $_[0], $enc, \$part_nr);
        });
        $mime->body_set('');
-       $rv = "\n" . html_footer($hdr, 0, $ctx, $mhref);
+       $rv = "\n" . html_footer($hdr, 0, $ctx, "$path$href/R");
 
        if (defined $irt) {
                unless (defined $parent_anchor) {
@@ -152,13 +154,15 @@ sub index_entry {
        } elsif ($srch) {
                my $threaded = 'threaded';
                my $flat = 'flat';
+               my $end = '';
                if ($ctx->{flat}) {
                        $flat = "<b>$flat</b>";
+                       $end = "\n"; # for lynx
                } else {
                        $threaded = "<b>$threaded</b>";
                }
                $rv .= " [<a\nhref=\"${path}$href/t/#u\">$threaded</a>";
-               $rv .= "|<a\nhref=\"${path}$href/T/#u\">$flat</a>]";
+               $rv .= "|<a\nhref=\"${path}$href/T/#u\">$flat</a>]$end";
        }
        $fh->write($rv .= '</pre>');
 }
@@ -174,10 +178,10 @@ sub thread_html {
 sub emit_thread_html {
        my ($res, $ctx, $foot, $srch) = @_;
        my $mid = $ctx->{mid};
-       my $msgs = load_results($srch->get_thread($mid));
+       my $flat = $ctx->{flat};
+       my $msgs = load_results($srch->get_thread($mid, { asc => $flat }));
        my $nr = scalar @$msgs;
        return missing_thread($res, $ctx) if $nr == 0;
-       my $flat = $ctx->{flat};
        my $seen = {};
        my $state = {
                res => $res,
@@ -494,7 +498,7 @@ sub mailto_arg_link {
 }
 
 sub html_footer {
-       my ($hdr, $standalone, $ctx, $mhref) = @_;
+       my ($hdr, $standalone, $ctx, $rhref) = @_;
 
        my $srch = $ctx->{srch} if $ctx;
        my $upfx = '../';
@@ -509,12 +513,12 @@ sub html_footer {
                if ($p) {
                        $p = PublicInbox::Hval->new_msgid($p);
                        $p = $p->as_href;
-                       $irt = "<a\nhref=\"$upfx$p/\">parent</a> ";
+                       $irt = "<a\nhref=\"$upfx$p/\"rel=prev>parent</a> ";
                } else {
                        $irt = ' ' x length('parent ');
                }
                if ($next) {
-                       $irt .= "<a\nhref=\"$upfx$next/\">next</a> ";
+                       $irt .= "<a\nhref=\"$upfx$next/\"\nrel=next>next</a> ";
                } else {
                        $irt .= ' ' x length('next ');
                }
@@ -522,7 +526,7 @@ sub html_footer {
                $irt = '';
        }
 
-       $irt . qq(<a\nhref="${tpfx}R/">reply</a>) . $idx;
+       $irt . qq(<a\nhref="$rhref">reply</a>) . $idx;
 }
 
 sub linkify_ref_nosrch {
@@ -701,13 +705,12 @@ sub fmt_ts { POSIX::strftime('%Y-%m-%d %k:%M', gmtime($_[0])) }
 
 sub _skel_header {
        my ($dst, $state, $upfx, $hdr, $level) = @_;
-       my $dot = $level == 0 ? '' : '` ';
 
        my $cur = $state->{cur};
        my $mid = mid_clean($hdr->header_raw('Message-ID'));
        my $f = ascii_html($hdr->header('X-PI-From'));
        my $d = _msg_date($hdr);
-       my $pfx = $d . ' ' . indent_for($level);
+       my $pfx = "$d " . indent_for($level) . th_pfx($level);
        my $attr = $f;
        $state->{first_level} ||= $level;
 
@@ -721,7 +724,7 @@ sub _skel_header {
        if ($cur) {
                if ($cur eq $mid) {
                        delete $state->{cur};
-                       $$dst .= "$pfx$dot<b><a\nid=r\nhref=\"#t\">".
+                       $$dst .= "$pfx<b><a\nid=r\nhref=\"#t\">".
                                 "$attr [this message]</a></b>\n";
 
                        return;
@@ -744,7 +747,7 @@ sub _skel_header {
        }
        my $m = PublicInbox::Hval->new_msgid($mid);
        $m = $upfx . '../' . $m->as_href . '/';
-       $$dst .= "$pfx$dot<a\nhref=\"$m\">";
+       $$dst .= "$pfx<a\nhref=\"$m\">";
        $$dst .= defined($s) ? "$s</a> $f\n" : "$f</a>\n";
 }
 
@@ -761,8 +764,7 @@ sub skel_dump {
                        $$dst .= "\t[no common parent]\n";
                } else {
                        $$dst .= '     [not found] ';
-                       my $dot = $level == 0 ? '' : '` ';
-                       $$dst .= indent_for($level) . $dot;
+                       $$dst .= indent_for($level) . th_pfx($level);
                        $mid = PublicInbox::Hval->new_msgid($mid);
                        my $href = "$upfx../" . $mid->as_href . '/';
                        my $html = $mid->as_html;
@@ -839,11 +841,10 @@ sub emit_topics {
                        $cur = undef;
                }
                $cur ||= [ $ts, '' ];
-               my $dot = $level == 0 ? '' : '` ';
                $cur->[0] = $ts if $ts > $cur->[0];
-               $cur->[1] .= "$nl$pfx$dot<a\nhref=\"$mid/t/#u\"><b>";
-               $cur->[1] .= $subj;
-               $cur->[1] .= "</b></a>\n";
+               $cur->[1] .= $nl . $pfx . th_pfx($level) .
+                               "<a\nhref=\"$mid/t/#u\"><b>" .
+                               $subj . "</b></a>\n";
 
                $ts = fmt_ts($ts);
                my $attr = " $ts UTC";