]> Sergey Matveev's repositories - public-inbox.git/commitdiff
favor /t/ to /s/, since subjects may change mid-thread
authorEric Wong <e@80x24.org>
Mon, 17 Aug 2015 02:41:10 +0000 (02:41 +0000)
committerEric Wong <e@80x24.org>
Mon, 17 Aug 2015 03:13:31 +0000 (03:13 +0000)
/t/ always falls back to subject path searching anyways,
so there's little lost besides perhaps more readable URLs.
Unfortunately people still use non-compliant mail clients which fail
to set In-Reply-To or References headers :<

lib/PublicInbox/Feed.pm
lib/PublicInbox/View.pm
lib/PublicInbox/WWW.pm

index 1a89fbad076b94e99d9dcc6517474e0a3a9e079d..5a41beaa48cbdcf15a7cb98ac6463e855a22896a 100644 (file)
@@ -76,7 +76,7 @@ sub generate_html_index {
        $th->order(*PublicInbox::Thread::sort_ts);
 
        # except we sort top-level messages reverse chronologically
-       my $state = [ undef, {}, $first, 0 ];
+       my $state = [ $args->{srch}, {}, $first, 0 ];
        for (PublicInbox::Thread::rsort_ts($th->rootset)) {
                dump_msg($_, 0, \$html, $state)
        }
index 47082431ec8fa375580c7b85afa95117ea0496a9..496093510659c19eb52c35484700013d38a3691b 100644 (file)
@@ -48,7 +48,7 @@ sub feed_entry {
 # state = [ time, seen = {}, first_commit, page_nr = 0 ]
 sub index_entry {
        my (undef, $mime, $level, $state) = @_;
-       my (undef, $seen, $first_commit) = @$state;
+       my ($srch, $seen, $first_commit) = @$state;
        my $midx = $state->[3]++;
        my ($prev, $next) = ($midx - 1, $midx + 1);
        my $rv = '';
@@ -75,10 +75,26 @@ sub index_entry {
        my $more = 'permalink';
        if ($root_anchor) {
                $path = '../';
-               $subj = "<u\nid=\"u\">$subj</u>" if $root_anchor eq $id;
        } else {
                $path = '';
        }
+       my $href = $mid->as_href;
+       my $irt = $header_obj->header_raw('In-Reply-To');
+       my ($anchor_idx, $anchor, $t_anchor);
+       if (defined $irt) {
+               $anchor_idx = anchor_for($irt);
+               $anchor = $seen->{$anchor_idx};
+               $t_anchor = T_ANCHOR;
+       } else {
+               $t_anchor = '';
+       }
+
+       if (defined $srch) {
+               $subj = "<a\nhref=\"${path}t/$href.html#u\">$subj</a>";
+       }
+       if ($root_anchor && $root_anchor eq $id) {
+               $subj = "<u\nid=\"u\">$subj</u>";
+       }
 
        my $ts = $mime->header('X-PI-TS');
        my $fmt = '%Y-%m-%d %H:%M UTC';
@@ -92,16 +108,6 @@ sub index_entry {
        }
        $rv .= "\n\n";
 
-       my $irt = $header_obj->header_raw('In-Reply-To');
-       my ($anchor_idx, $anchor, $t_anchor);
-       if (defined $irt) {
-               $anchor_idx = anchor_for($irt);
-               $anchor = $seen->{$anchor_idx};
-               $t_anchor = T_ANCHOR;
-       } else {
-               $t_anchor = '';
-       }
-       my $href = $mid->as_href;
        my $mhref = "${path}m/$href.html";
        my $fhref = "${path}f/$href.html";
        # scan through all parts, looking for displayable text
@@ -126,8 +132,8 @@ sub index_entry {
                $rv .= " <a\nhref=\"$anchor\">parent</a>";
        }
 
-       if ($first_commit) {
-               $rv .= " <a\nhref=\"t/$href.html$t_anchor\">thread</a>";
+       if ($srch) {
+               $rv .= " <a\nhref=\"${path}t/$href.html$t_anchor\">thread</a>";
        }
 
        $rv . "\n\n";
@@ -145,7 +151,7 @@ sub thread_html {
        my $th = PublicInbox::Thread->new(@$msgs);
        $th->thread;
        $th->order(*PublicInbox::Thread::sort_ts);
-       my $state = [ undef, { root_anchor => anchor_for($mid) }, undef, 0 ];
+       my $state = [ $srch, { root_anchor => anchor_for($mid) }, undef, 0 ];
        thread_entry(\$rv, $state, $_, 0) for $th->rootset;
        my $final_anchor = $state->[3];
        my $next = "<a\nid=\"s$final_anchor\">end of thread</a>\n";
@@ -165,7 +171,7 @@ sub subject_path_html {
        my $th = PublicInbox::Thread->new(@$msgs);
        $th->thread;
        $th->order(*PublicInbox::Thread::sort_ts);
-       my $state = [ undef, { root_anchor => 'dummy' }, undef, 0 ];
+       my $state = [ $srch, { root_anchor => 'dummy' }, undef, 0 ];
        thread_entry(\$rv, $state, $_, 0) for $th->rootset;
        my $final_anchor = $state->[3];
        my $next = "<a\nid=\"s$final_anchor\">end of thread</a>\n";
@@ -340,6 +346,10 @@ sub headers_to_html_header {
 
        my $rv = "";
        my @title;
+       my $header_obj = $mime->header_obj;
+       my $mid = $header_obj->header_raw('Message-ID');
+       $mid = PublicInbox::Hval->new_msgid($mid);
+       my $mid_href = $mid->as_href;
        foreach my $h (qw(From To Cc Subject Date)) {
                my $v = $mime->header($h);
                defined($v) && length($v) or next;
@@ -351,8 +361,7 @@ sub headers_to_html_header {
                } elsif ($h eq 'Subject') {
                        $title[0] = $v->as_html;
                        if ($srch) {
-                               my $path = $srch->subject_path($v->raw);
-                               $rv .= "$h: <a\nhref=\"../s/$path.html\">";
+                               $rv .= "$h: <a\nhref=\"../t/$mid_href.html\">";
                                $rv .= $v->as_html . "</a>\n";
                                next;
                        }
@@ -361,13 +370,9 @@ sub headers_to_html_header {
 
        }
 
-       my $header_obj = $mime->header_obj;
-       my $mid = $header_obj->header_raw('Message-ID');
-       $mid = PublicInbox::Hval->new_msgid($mid);
        $rv .= 'Message-ID: &lt;' . $mid->as_html . '&gt; ';
-       my $href = $mid->as_href;
-       $href = "../m/$href" unless $full_pfx;
-       $rv .= "(<a\nhref=\"$href.txt\">raw</a>)\n";
+       $mid_href = "../m/$mid_href" unless $full_pfx;
+       $rv .= "(<a\nhref=\"$mid_href.txt\">raw</a>)\n";
 
        my $irt = $header_obj->header_raw('In-Reply-To');
        if (defined $irt) {
index bbd438a2d939bc1d42d9fbbcc83b1634ec74d0e8..5021509572efdecdca3b62981ce5e3bf9d97fca7 100644 (file)
@@ -126,8 +126,10 @@ sub get_atom {
 sub get_index {
        my ($ctx, $cgi, $top) = @_;
        require PublicInbox::Feed;
+       my $srch = searcher($ctx);
        [ 200, [ 'Content-Type' => 'text/html; charset=UTF-8' ],
          [ PublicInbox::Feed->generate_html_index({
+                       srch => $srch,
                        git_dir => $ctx->{git_dir},
                        listname => $ctx->{listname},
                        pi_config => $pi_config,