about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-09-03 01:57:10 +0000
committerEric Wong <e@80x24.org>2015-09-03 02:04:33 +0000
commitfd138a0197450d30677441afb014584f34a661da (patch)
treedcdaf73760b513bebcd7a1908e6baadf16436e5a /lib
parentb872759b28cd4726b9f16f5214d042fdc50b1e93 (diff)
downloadpublic-inbox-fd138a0197450d30677441afb014584f34a661da.tar.gz
We'll be expanding our ghost message lookup facilities, so
it makes sense to generate links to them even if they are
currently unknown.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/View.pm55
1 files changed, 46 insertions, 9 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index e18895f1..c572198a 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -19,6 +19,7 @@ use constant MAX_INLINE_QUOTED => 12; # half an 80x24 terminal
 use constant MAX_TRUNC_LEN => 72;
 use constant PRE_WRAP => "<pre\nstyle=\"white-space:pre-wrap\">";
 use constant T_ANCHOR => '#u';
+use constant INDENT => '  ';
 
 *ascii_html = *PublicInbox::Hval::ascii_html;
 
@@ -101,7 +102,7 @@ sub index_entry {
         my $ts = _msg_date($mime);
         my $rv = "<table\nsummary=l$level><tr>";
         if ($level) {
-                $rv .= '<td><pre>' . ('  ' x $level) . '</pre></td>';
+                $rv .= '<td><pre>' . (INDENT x $level) . '</pre></td>';
         }
         $rv .= "<td\nid=s$midx>" . PRE_WRAP;
         $rv .= "<b\nid=\"$id\">$subj</b>\n";
@@ -594,22 +595,50 @@ sub __thread_entry {
         my ($cb, $git, $state, $mime, $level) = @_;
 
         # lazy load the full message from mini_mime:
-        my $path = mid2path(mid_clean($mime->header('Message-ID')));
-        $mime = eval { Email::MIME->new($git->cat_file("HEAD:$path")) };
-        if ($mime) {
-                if ($state->{anchor_idx} == 0) {
-                        thread_html_head($cb, $mime);
+        $mime = eval {
+                my $path = mid2path(mid_clean($mime->header('Message-ID')));
+                Email::MIME->new($git->cat_file('HEAD:'.$path));
+        } or return;
+
+        if ($state->{anchor_idx} == 0) {
+                thread_html_head($cb, $mime, $state);
+        }
+
+        if (my $ghost = delete $state->{ghost}) {
+                # n.b. ghost messages may only be parents, not children
+                foreach my $g (@$ghost) {
+                        my $mid = PublicInbox::Hval->new_msgid($g->[0]);
+                        my $pfx = INDENT x $g->[1];
+                        my $href = $mid->as_href;
+                        my $html = $mid->as_html;
+                        $$cb->write("<table><tr><td>$pfx</td><td>" .
+                                        PRE_WRAP .
+                                        '[parent not found: &lt;' .
+                                        qq{<a\nhref="../../$href/">}.
+                                        "$html</a>&gt;]</pre></td></table>");
                 }
-                index_entry($$cb, $mime, $level, $state);
         }
+        index_entry($$cb, $mime, $level, $state);
+        1;
+}
+
+sub __ghost_entry {
+        my ($state, $node, $level) = @_;
+        my $ghost = $state->{ghost} ||= [];
+        push @$ghost, [ $node->messageid, $level ];
 }
 
 sub thread_entry {
         my ($cb, $git, $state, $node, $level) = @_;
         return unless $node;
         if (my $mime = $node->message) {
-                __thread_entry($cb, $git, $state, $mime, $level);
+                unless (__thread_entry($cb, $git, $state, $mime, $level)) {
+                        __ghost_entry($state, $node, $level);
+                }
+        } else {
+                __ghost_entry($state, $node, $level);
         }
+
         thread_entry($cb, $git, $state, $node->child, $level + 1);
         thread_entry($cb, $git, $state, $node->next, $level);
 }
@@ -651,7 +680,7 @@ sub _msg_date {
 
 sub _inline_header {
         my ($dst, $state, $upfx, $mime, $level) = @_;
-        my $pfx = '  ' x $level;
+        my $pfx = INDENT x $level;
 
         my $cur = $state->{cur};
         my $mid = $mime->header('Message-ID');
@@ -705,6 +734,14 @@ sub inline_dump {
                         $state->{parent} = $mid;
                 }
                 _inline_header($dst, $state, $upfx, $mime, $level);
+        } else {
+                my $pfx = INDENT x $level;
+                my $v = PublicInbox::Hval->new_msgid($node->messageid, 1);
+                my $html = $v->as_html;
+                my $href = $v->as_href;
+                $$dst .= $pfx . '` [parent not found: &lt;' .
+                                qq{<a\nhref="$upfx../$href/">}.
+                                "$html</a>&gt;]\n";
         }
         inline_dump($dst, $state, $upfx, $node->child, $level+1);
         inline_dump($dst, $state, $upfx, $node->next, $level);