X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FView.pm;h=0753c06ee4f81b4a4494ab05210b6bc60e71073a;hb=ab9c03ff4aa369b397dc1a8c8936153c8565fd05;hp=c6fd05cce3a59e8327c4959db3f7480ff759b0b7;hpb=0ff8c4f7e0815a0aa2e9935dd07ae446ce83c906;p=public-inbox.git diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index c6fd05cc..0753c06e 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -38,12 +38,12 @@ sub msg_page_i { : $ctx->gone('over'); $ctx->{mhref} = ($ctx->{nr} || $ctx->{smsg}) ? "../${\mid_href($smsg->{mid})}/" : ''; - if (_msg_page_prepare_obuf($eml, $ctx)) { - multipart_text_as_html($eml, $ctx); - ${$ctx->{obuf}} .= '
' . eml_entry($ctx, $eml) . '' . $end; + print { $ctx->zfh } $beg, '
'; + print { $ctx->{zfh} } eml_entry($ctx, $eml), '', $end; } sub next_in_queue ($$) { @@ -415,15 +413,15 @@ sub stream_thread_i { # PublicInbox::WwwStream::getline callback if (!$ghost_ok) { # first non-ghost $ctx->{-title_html} = ascii_html($smsg->{subject}); - $ctx->zmore($ctx->html_top); + print { $ctx->zfh } $ctx->html_top; } return $smsg; } # buffer the ghost entry and loop - $ctx->zmore(ghost_index_entry($ctx, $lvl, $smsg)); + print { $ctx->zfh } ghost_index_entry($ctx, $lvl, $smsg) } else { # all done - $ctx->zmore(join('', thread_adj_level($ctx, 0))); - $ctx->zmore(${delete($ctx->{skel})}); + print { $ctx->zfh } thread_adj_level($ctx, 0), + ${delete($ctx->{skel})}; return; } } @@ -492,7 +490,7 @@ sub thread_html_i { # PublicInbox::WwwStream::getline callback my $smsg = $ctx->{smsg}; if (exists $ctx->{-html_tip}) { $ctx->{-title_html} = ascii_html($smsg->{subject}); - $ctx->zmore($ctx->html_top); + print { $ctx->zfh } $ctx->html_top; } return eml_entry($ctx, $eml); } else { @@ -500,31 +498,19 @@ sub thread_html_i { # PublicInbox::WwwStream::getline callback return $smsg if exists($smsg->{blob}); } my $skel = delete($ctx->{skel}) or return; # all done - $ctx->zmore($$skel); + print { $ctx->zfh } $$skel; undef; } } -sub multipart_text_as_html { - # ($mime, $ctx) = @_; # each_part may do "$_[0] = undef" - - # scan through all parts, looking for displayable text - $_[0]->each_part(\&add_text_body, $_[1], 1); -} - sub submsg_hdr ($$) { my ($ctx, $eml) = @_; - my $obfs_ibx = $ctx->{-obfs_ibx}; - my $rv = $ctx->{obuf}; - $$rv .= "\n"; + my $s = "\n"; for my $h (qw(From To Cc Subject Date Message-ID X-Alt-Message-ID)) { - my @v = $eml->header($h); - for my $v (@v) { - obfuscate_addrs($obfs_ibx, $v) if $obfs_ibx; - $v = ascii_html($v); - $$rv .= "$h: $v\n"; - } + $s .= "$h: $_\n" for $eml->header($h); } + obfuscate_addrs($ctx->{-obfs_ibx}, $s) if $ctx->{-obfs_ibx}; + ascii_html($s); } sub attach_link ($$$$;$) { @@ -535,7 +521,6 @@ sub attach_link ($$$$;$) { # downloads for 0-byte multipart attachments return unless $part->{bdy}; - my $nl = $idx eq '1' ? '' : "\n"; # like join("\n", ...) my $size = length($part->body); delete $part->{bdy}; # save memory @@ -551,23 +536,17 @@ sub attach_link ($$$$;$) { } else { $sfn = 'a.bin'; } - my $rv = $ctx->{obuf}; - $$rv .= qq($nl{mhref}$idx-$sfn">); - if ($err) { - $$rv .= <
WARNING: multiple messages have this Message-ID\n
"; } else { $ctx->{first_hdr} = $eml->header_obj; $ctx->{chash} = content_hash($eml) if $ctx->{smsg}; # reused MID - $rv .= ""; # anchor for body start + $ctx->{-html_tip} = ""; # anchor for body start } $ctx->{-upfx} = '../'; my @title; # (Subject[0], From[0]) + my $hbuf = ''; for my $v ($eml->header('From')) { my @n = PublicInbox::Address::names($v); - $v = ascii_html($v); - $title[1] //= ascii_html(join(', ', @n)); - if ($obfs_ibx) { - obfuscate_addrs($obfs_ibx, $v); - obfuscate_addrs($obfs_ibx, $title[1]); - } - $rv .= "From: $v\n" if $v ne ''; + $title[1] //= join(', ', @n); + $hbuf .= "From: $v\n" if $v ne ''; } - foreach my $h (qw(To Cc)) { + for my $h (qw(To Cc)) { for my $v ($eml->header($h)) { fold_addresses($v); - $v = ascii_html($v); - obfuscate_addrs($obfs_ibx, $v) if $obfs_ibx; - $rv .= "$h: $v\n" if $v ne ''; + $hbuf .= "$h: $v\n" if $v ne ''; } } my @subj = $eml->header('Subject'); - if (@subj) { - my $v = ascii_html(shift @subj); - obfuscate_addrs($obfs_ibx, $v) if $obfs_ibx; - $rv .= 'Subject: '; - $rv .= $have_over ? qq($v\n) : "$v\n"; - $title[0] = $v; - for $v (@subj) { # multi-Subject message :< - $v = ascii_html($v); - obfuscate_addrs($obfs_ibx, $v) if $obfs_ibx; - $rv .= "Subject: $v\n"; - } - } else { # dummy anchor for thread skeleton at bottom of page - $rv .= qq() if $have_over; - $title[0] = '(no subject)'; - } - for my $v ($eml->header('Date')) { - $v = ascii_html($v); - obfuscate_addrs($obfs_ibx, $v) if $obfs_ibx; # possible :P - $rv .= qq{Date: $v\n}; + $hbuf .= "Subject: $_\n" for @subj; + $title[0] = $subj[0] // '(no subject)'; + $hbuf .= "Date: $_\n" for $eml->header('Date'); + $hbuf = ascii_html($hbuf); + $ctx->{-title_html} = ascii_html(join(' - ', @title)); + if (my $obfs_ibx = $ctx->{-obfs_ibx}) { + obfuscate_addrs($obfs_ibx, $hbuf); + obfuscate_addrs($obfs_ibx, $ctx->{-title_html}); } + # [thread overview] link is typically added after Date, # but added after Subject, or even nothing. if ($have_over) { - chop $rv; # drop "\n", or noop if $rv eq '' - $rv .= qq{\t[thread overview]\n}; + chop $hbuf; # drop "\n", or noop if $rv eq '' + $hbuf .= qq{\t[thread overview]\n}; + $hbuf =~ s!^Subject:\x20(.*?)(\n[A-Z]|\z) + !Subject: $1$2!msx or + $hbuf .= qq(); + } + if (scalar(@$mids) == 1) { # common case + my $x = ascii_html($mids->[0]); + $hbuf .= qq[Message-ID: <$x> (raw)\n]; } if (!$nr) { # first (and only) message, common case - $ctx->{-title_html} = join(' - ', @title); - $rv = $ctx->html_top . $rv; + print { $ctx->zfh } $ctx->html_top, $hbuf; + } else { + delete $ctx->{-title_html}; + print { $ctx->zfh } $ctx->{-html_tip}, $hbuf; } - $ctx->{-linkify} //= PublicInbox::Linkify->new; - if (scalar(@$mids) == 1) { # common case - my $mhtml = ascii_html($mids->[0]); - $rv .= qq[Message-ID: <$mhtml> (raw)\n]; - } else { + $hbuf = ''; + if (scalar(@$mids) != 1) { # unlikely, but it happens :< # X-Alt-Message-ID can happen if a message is injected from # public-inbox-nntpd because of multiple Message-ID headers. - my $s = ''; for my $h (qw(Message-ID X-Alt-Message-ID)) { - $s .= "$h: $_\n" for ($eml->header_raw($h)); + $hbuf .= "$h: $_\n" for ($eml->header_raw($h)); } - $ctx->{-linkify}->linkify_mids('..', \$s, 1); - $rv .= $s; + $ctx->{-linkify}->linkify_mids('..', \$hbuf, 1); # escapes HTML + print { $ctx->{zfh} } $hbuf; + $hbuf = ''; } - _parent_headers($ctx, $eml); - $rv .= "\n"; + my @irt = $eml->header_raw('In-Reply-To'); + my $refs; + if (!@irt) { + $refs = references($eml); + $irt[0] = pop(@$refs) if scalar @$refs; + } + $hbuf .= "In-Reply-To: $_\n" for @irt; + + # do not display References: if search is present, + # we show the thread skeleton at the bottom, instead. + if (!$have_over) { + $refs //= references($eml); + $hbuf .= 'References: <'.join(">\n\t<", @$refs).">\n" if @$refs; + } + $ctx->{-linkify}->linkify_mids('..', \$hbuf); # escapes HTML + say { $ctx->{zfh} } $hbuf; 1; } @@ -791,43 +765,12 @@ sub thread_skel ($$$) { $ctx->{parent_msg} = $parent; } -sub _parent_headers { - my ($ctx, $hdr) = @_; - my @irt = $hdr->header_raw('In-Reply-To'); - my $refs; - if (@irt) { - my $s = ''; - $s .= "In-Reply-To: $_\n" for @irt; - $ctx->{-linkify}->linkify_mids('..', \$s); - ${$ctx->{obuf}} .= $s; - } else { - $refs = references($hdr); - my $irt = pop @$refs; - if (defined $irt) { - my $html = ascii_html($irt); - my $href = mid_href($irt); - ${$ctx->{obuf}} .= <$html> -EOM - } - } - - # do not display References: if search is present, - # we show the thread skeleton at the bottom, instead. - return if $ctx->{ibx}->over; - - $refs //= references($hdr); - if (@$refs) { - $_ = linkify_ref_no_over($_) for @$refs; - ${$ctx->{obuf}} .= 'References: '. join("\n\t", @$refs) . "\n"; - } -} - -# appends to obuf +# writes to zbuf sub html_footer { my ($ctx, $hdr) = @_; my $upfx = '../'; - my ($related, $skel); + my (@related, $skel); + my $foot = ' '; my $qry = delete $ctx->{-qry}; if ($qry && $ctx->{ibx}->isrch) { my $q = ''; # search for either ancestor or descendent patches @@ -841,7 +784,7 @@ sub html_footer { $q = wrap('', '', $q); my $rows = ($q =~ tr/\n/\n/) + 1; $q = ascii_html($q); - $related = < find likely ancestor, descendant, or conflicting patches for {ibx}->over) { my $t = ts2str($ctx->{-t_max}); my $t_fmt = fmt_ts($ctx->{-t_max}); - my $fallback = $related ? "\t" : "\t"; + my $fallback = @related ? "\t" : "\t"; $skel = <~$t_fmt UTC|newest] EOF - thread_skel(\$skel, $ctx, $hdr); my ($next, $prev); my $parent = ' '; @@ -868,44 +810,32 @@ EOF if (my $n = $ctx->{next_msg}) { $n = mid_href($n); - $next = "next"; + $next = qq(next); } - my $u; my $par = $ctx->{parent_msg}; - if ($par) { - $u = mid_href($par); - $u = "$upfx$u/"; - } + my $u = $par ? $upfx.mid_href($par).'/' : undef; if (my $p = $ctx->{prev_msg}) { $prev = mid_href($p); if ($p && $par && $p eq $par) { - $prev = "prev parent'; $parent = ''; } else { - $prev = "prev'; - $parent = " parent" if $u; + $parent = qq( parent) if $u; } } elsif ($u) { # unlikely - $parent = " parent"; + $parent = qq( parent); } - ${$ctx->{obuf}} .= " $next $prev$parent "; + $foot .= "$next $prev$parent "; } else { # unindexed inboxes w/o over - ${$ctx->{obuf}} .= '', @related, + msg_reply($ctx, $hdr); } sub ghost_parent {'; $skel = qq( latest); } - ${$ctx->{obuf}} .= qq(reply); - # $skel may be big for big threads, don't append it to obuf - $skel .= '' . ($related // ''); - $ctx->zmore($skel .= msg_reply($ctx, $hdr)); # flushes obuf -} - -sub linkify_ref_no_over { - my ($mid) = @_; - my $href = mid_href($mid); - my $html = ascii_html($mid); - "<$html>"; + # $skel may be big for big threads, don't append it to $foot + print { $ctx->zfh } $foot, qq(reply), + $skel, '