]> Sergey Matveev's repositories - public-inbox.git/commitdiff
feed: extract subroutines for threading
authorEric Wong <e@80x24.org>
Mon, 20 Jul 2015 21:53:14 +0000 (21:53 +0000)
committerEric Wong <e@80x24.org>
Mon, 20 Jul 2015 21:53:26 +0000 (21:53 +0000)
We'll be using this in the future for displaying per-thread
views.

lib/PublicInbox/Feed.pm

index 3c0ec86d4188d393f8cc734affb0dee5f86775bc..f7c2f3293067f2e60d6c72be0921084d8dd7eda7 100644 (file)
@@ -61,13 +61,7 @@ sub generate_html_index {
        my $git_dir = $args->{git_dir};
        my $git = PublicInbox::GitCatFile->new($git_dir);
        my ($first, $last) = each_recent_blob($args, sub {
-               my $mime = do_cat_mail($git, $_[0]) or return 0;
-
-               my $t = eval { str2time($mime->header('Date')) };
-               defined($t) or $t = 0;
-               $mime->header_set('X-PI-Date', $t);
-               push @messages, $mime;
-               1;
+               mime_load_for_sort($git, $_[0], \@messages);
        });
        $git = undef; # destroy pipes.
 
@@ -79,20 +73,11 @@ sub generate_html_index {
                '</head><body>' . PRE_WRAP;
 
        # sort child messages in chronological order
-       $th->order(sub {
-               sort {
-                       $a->topmost->message->header('X-PI-Date') <=>
-                       $b->topmost->message->header('X-PI-Date')
-               } @_;
-       });
+       $th->order(sub { mime_sort_children(@_) });
 
        # except we sort top-level messages reverse chronologically
        my $state = [ time, {}, $first, 0 ];
-       for (sort { (eval { $b->message->header('X-PI-Date') } || 0) <=>
-                   (eval { $a->message->header('X-PI-Date') } || 0)
-                 } $th->rootset) {
-               dump_msg($_, 0, \$html, $state);
-       }
+       for (mime_sort_roots($th)) { dump_msg($_, 0, \$html, $state) }
        Email::Address->purge_cache;
 
        my $footer = nav_footer($args->{cgi}, $last, $feed_opts, $state);
@@ -308,4 +293,32 @@ sub do_cat_mail {
        $@ ? undef : $mime;
 }
 
+sub mime_load_for_sort {
+       my ($git, $path, $messages) = @_;
+       my $mime = do_cat_mail($git, $path) or return 0;
+
+       my $t = eval { str2time($mime->header('Date')) };
+       defined($t) or $t = 0;
+       $mime->header_set('X-PI-Date', $t);
+       push @$messages, $mime;
+       1;
+}
+
+# children are chronological
+sub mime_sort_children {
+       sort {
+               $a->topmost->message->header('X-PI-Date') <=>
+               $b->topmost->message->header('X-PI-Date')
+       } @_;
+}
+
+# parents are reverse chronological
+sub mime_sort_roots {
+       my ($th) = @_;
+       sort {
+               (eval { $b->message->header('X-PI-Date') } || 0) <=>
+               (eval { $a->message->header('X-PI-Date') } || 0)
+       } $th->rootset;
+}
+
 1;