]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/View.pm
view: indentation adjustments for collapsed headers
[public-inbox.git] / lib / PublicInbox / View.pm
index 5c536228efb85271d0a8a82b5da91db68cb880d4..4e800c685b7724fa6e76a47b55d8af280b1aa4c4 100644 (file)
@@ -465,6 +465,8 @@ sub thread_inline {
                cur => $mid,
                parent_cmp => defined $parent ? $parent : '',
                parent => $parent,
+               prev_attr => '',
+               prev_level => 0,
        };
        for (thread_results(load_results($res))->rootset) {
                inline_dump($dst, $state, $upfx, $_, 0);
@@ -685,21 +687,31 @@ sub _msg_date {
 
 sub _inline_header {
        my ($dst, $state, $upfx, $mime, $level) = @_;
-       my $pfx = INDENT x $level;
+       my $pfx = INDENT x ($level - 1);
+       my $dot = $level == 0 ? '' : '` ';
 
        my $cur = $state->{cur};
        my $mid = mid_clean($mime->header('Message-ID'));
        my $f = $mime->header('X-PI-From');
        my $d = _msg_date($mime);
-       $f = PublicInbox::Hval->new($f);
-       $d = PublicInbox::Hval->new($d);
-       $f = $f->as_html;
-       $d = $d->as_html . ' UTC';
+       $f = PublicInbox::Hval->new($f)->as_html;
+       $d = PublicInbox::Hval->new($d)->as_html;
+       my $attr = "$f @ $d";
+       $state->{first_level} ||= $level;
+       if ($attr ne $state->{prev_attr} || $state->{prev_level} > $level) {
+               $state->{prev_attr} = $attr;
+               $attr = ' - ' . $attr;
+               $attr .= ' UTC' if $level >= $state->{first_level};
+       } else {
+               $attr = '';
+       }
+       $state->{prev_level} = $level;
+
        if ($cur) {
                if ($cur eq $mid) {
                        delete $state->{cur};
-                       $$dst .= "$pfx<b><a\nid=\"r\"\nhref=\"#t\">".
-                                "[this message]</a></b> by $f @ $d\n";
+                       $$dst .= "$pfx$dot<b><a\nid=\"r\"\nhref=\"#t\">".
+                                "[this message]</a></b>$attr\n";
 
                        return;
                }
@@ -722,9 +734,9 @@ sub _inline_header {
        my $m = PublicInbox::Hval->new_msgid($mid);
        $m = $upfx . '../' . $m->as_href . '/';
        if (defined $s) {
-               $$dst .= "$pfx` <a\nhref=\"$m\">$s</a> by $f @ $d\n";
+               $$dst .= "$pfx$dot<a\nhref=\"$m\">$s</a>$attr\n";
        } else {
-               $$dst .= "$pfx<a\nhref=\"$m\">$f @ $d</a>\n";
+               $$dst .= "$pfx$dot<a\nhref=\"$m\">$f @ $d</a>\n";
        }
 }
 
@@ -738,8 +750,9 @@ sub inline_dump {
                }
                _inline_header($dst, $state, $upfx, $mime, $level);
        } else {
-               my $pfx = INDENT x $level;
-               $$dst .= $pfx . '` ' . ghost_parent($upfx, $node->messageid);
+               my $dot = $level == 0 ? '' : '` ';
+               my $pfx = (INDENT x $level) . $dot;
+               $$dst .= $pfx . ghost_parent($upfx, $node->messageid) . "\n";
        }
        inline_dump($dst, $state, $upfx, $node->child, $level+1);
        inline_dump($dst, $state, $upfx, $node->next, $level);
@@ -764,6 +777,7 @@ sub rsort_ts {
 sub add_topic {
        my ($state, $node, $level) = @_;
        return unless $node;
+       my $child_adjust = 1;
 
        if (my $x = $node->message) {
                $x = $x->header_obj;
@@ -786,9 +800,12 @@ sub add_topic {
                my $u = $x->header('X-PI-From');
                my $ts = $x->header('X-PI-TS');
                $state->{latest}->{$topic} = [ $mid, $u, $ts ];
-       } # else { } # ghost ignored...
+       } else {
+               # ghost message, do not bump level
+               $child_adjust = 0;
+       }
 
-       add_topic($state, $node->child, $level + 1);
+       add_topic($state, $node->child, $level + $child_adjust);
        add_topic($state, $node->next, $level);
 }
 
@@ -809,9 +826,9 @@ sub dump_topics {
                $mid = PublicInbox::Hval->new($mid)->as_href;
                $subj = PublicInbox::Hval->new($subj)->as_html;
                $u = PublicInbox::Hval->new($u)->as_html;
-               $pfx = INDENT x $level;
+               $pfx = INDENT x ($level - 1);
                my $nl = $level == $prev ? "\n" : '';
-               my $dot = $level == 0 ? '' : '`';
+               my $dot = $level == 0 ? '' : '` ';
                $dst .= "$nl$pfx$dot<a\nhref=\"$mid/t/#u\"><b>$subj</b></a>\n";
 
                my $attr;
@@ -827,7 +844,8 @@ sub dump_topics {
                        $n = " ($n)\n";
                }
                if ($level == 0 || $attr ne $prev_attr) {
-                       $dst .= "$pfx - ". $attr . $n;
+                       $pfx .= INDENT if $level > 0;
+                       $dst .= "$pfx- ". $attr . $n;
                        $prev_attr = $attr;
                }
        }