* [PATCH] www: linkify inbox addresses in To/Cc headers
@ 2024-01-06 2:32 Eric Wong
0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2024-01-06 2:32 UTC (permalink / raw)
To: spew
---
lib/PublicInbox/SearchView.pm | 2 +-
lib/PublicInbox/View.pm | 64 +++++++++++++++++++++++++++++++----
2 files changed, 58 insertions(+), 8 deletions(-)
diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index 8f851738..2d3e942c 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -322,7 +322,7 @@ EOM
# link $INBOX_DIR/description text to "recent" view around
# the newest message in this result set:
- $ctx->{-t_max} = max(map { delete $_->{ts} } @$msgs);
+ $ctx->{-t_max} = max(map { $_->{ts} } @$msgs);
@$msgs = reverse @$msgs if $r;
$ctx->{msgs} = $msgs;
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index b5047222..108cc563 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -38,7 +38,7 @@ sub msg_page_i {
: $ctx->gone('over');
$ctx->{mhref} = ($ctx->{nr} || $ctx->{smsg}) ?
"../${\mid_href($smsg->{mid})}/" : '';
- if (_msg_page_prepare($eml, $ctx)) {
+ if (_msg_page_prepare($eml, $ctx, $smsg->{ts})) {
$eml->each_part(\&add_text_body, $ctx, 1);
print { $ctx->{zfh} } '</pre><hr>';
}
@@ -183,6 +183,53 @@ sub nr_to_s ($$$) {
$nr == 1 ? "$nr $singular" : "$nr $plural";
}
+sub addr2urlmap ($) {
+ my ($ctx) = @_;
+ my $env = $ctx->{env};
+ my $key = PublicInbox::Git::host_prefix_url($env, '');
+ @{$ctx->{www}->{pi_cfg}->{"-addr2urlmap.$key"} //= do {
+ my $by_addr = $ctx->{www}->{pi_cfg}->{-by_addr};
+ my (%addr2url, $url);
+ while (my ($addr, $ibx) = each %$by_addr) {
+ $url = $ibx->base_url // $ibx->base_url($env);
+ $addr2url{$addr} = ascii_html($url) if defined $url;
+ }
+ my $re = join('|', map { quotemeta } keys %addr2url);
+ [ qr/\b($re)\b/i, \%addr2url ];
+ }}
+}
+
+sub to_cc_html ($$$$) {
+ my ($ctx, $eml, $field, $t) = @_;
+ my @vals = $eml->header($field) or return ('', 0);
+ my (undef, $addr2url) = addr2urlmap($ctx);
+ my $pairs = PublicInbox::Address::pairs(join(', ', @vals));
+ my ($len, $line_len, $html) = (0, 0, '');
+ my ($pair, $url);
+ my ($cur_ibx, $env) = @$ctx{qw(ibx env)};
+ # avoid excessive ascii_html calls (already hot in profiles):
+ my @html = split /\n/, ascii_html(join("\n", map {
+ $_->[0] // (split(/\@/, $_->[1]))[0]; # addr user if no name
+ } @$pairs));
+ for my $n (@html) {
+ $pair = shift @$pairs;
+ if ($line_len) { # 9 = display width of ",\t":
+ if ($line_len + length($n) > COLS - 9) {
+ $html .= ",\n\t";
+ $len += $line_len;
+ $line_len = 0;
+ } else {
+ $html .= ', ';
+ $line_len += 2;
+ }
+ }
+ $line_len += length($n);
+ $url = $addr2url->{lc $pair->[1]};
+ $html .= $url ? qq(<a\nhref="$url$t">$n</a>) : $n;
+ }
+ ($html, $len + $line_len);
+}
+
# Displays the text of of the message for /$INBOX/$MSGID/[Tt]/ endpoint
# this is already inside a <pre>
sub eml_entry {
@@ -207,7 +254,7 @@ sub eml_entry {
my $ds = delete $smsg->{ds}; # for v1 non-Xapian/SQLite users
# Deleting these fields saves about 400K as we iterate across 1K msgs
- delete @$smsg{qw(ts blob)};
+ my ($t) = delete @$smsg{qw(ts blob)};
my $from = _hdr_names_html($eml, 'From');
obfuscate_addrs($obfs_ibx, $from) if $obfs_ibx;
@@ -216,9 +263,9 @@ sub eml_entry {
my $mhref = $upfx . mid_href($mid_raw) . '/';
$rv .= qq{ (<a\nhref="$mhref">permalink</a> / };
$rv .= qq{<a\nhref="${mhref}raw">raw</a>)\n};
- my $to = fold_addresses(_hdr_names_html($eml, 'To'));
- my $cc = fold_addresses(_hdr_names_html($eml, 'Cc'));
- my ($tlen, $clen) = (length($to), length($cc));
+ $t = $t ? '?t='.ts2str($t) : '';
+ my ($to, $tlen) = to_cc_html($ctx, $eml, 'To', $t);
+ my ($cc, $clen) = to_cc_html($ctx, $eml, 'Cc', $t);
my $to_cc = '';
if (($tlen + $clen) > COLS) {
$to_cc .= ' To: '.$to."\n" if $tlen;
@@ -447,7 +494,7 @@ sub thread_html {
# link $INBOX_DIR/description text to "index_topics" view around
# the newest message in this thread
- my $t = ts2str($ctx->{-t_max} = max(map { delete $_->{ts} } @$msgs));
+ my $t = ts2str($ctx->{-t_max} = max(map { $_->{ts} } @$msgs));
my $t_fmt = fmt_ts($ctx->{-t_max});
my $skel = '<hr><pre>';
@@ -613,7 +660,7 @@ sub add_text_body { # callback for each_part
}
sub _msg_page_prepare {
- my ($eml, $ctx) = @_;
+ my ($eml, $ctx, $ts) = @_;
my $have_over = !!$ctx->{ibx}->over;
my $mids = mids_for_index($eml);
my $nr = $ctx->{nr}++;
@@ -651,6 +698,9 @@ href="d/">diff</a>)</pre><pre>];
$title[0] = $subj[0] // '(no subject)';
$hbuf .= "Date: $_\n" for $eml->header('Date');
$hbuf = ascii_html($hbuf);
+ my $t = $ts ? '?t='.ts2str($ts) : '';
+ my ($re, $addr2url) = addr2urlmap($ctx);
+ $hbuf =~ s!$re!qq(<a\nhref=").$addr2url->{lc $1}.qq($t">$1</a>)!sge;
$ctx->{-title_html} = ascii_html(join(' - ', @title));
if (my $obfs_ibx = $ctx->{-obfs_ibx}) {
obfuscate_addrs($obfs_ibx, $hbuf);
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2024-01-06 2:32 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-06 2:32 [PATCH] www: linkify inbox addresses in To/Cc headers Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).