-
- if ($ct =~ m!\btext/x?html\b!i) {
- return attach_link($upfx, $ct, $p, $fn);
- }
-
- my $s = eval { $part->body_str };
-
- # badly-encoded message? tell the world about it!
- my $err = $@;
- if ($err) {
- if ($ct =~ m!\btext/plain\b!i) {
- # Try to assume UTF-8 because Alpine seems to
- # do wacky things and set charset=X-UNKNOWN
- $part->charset_set('UTF-8');
- $s = eval { $part->body_str };
-
- # If forcing charset=UTF-8 failed,
- # attach_link will warn further down...
- $s = $part->body if $@;
- } else {
- return attach_link($upfx, $ct, $p, $fn);
+ my ($s, $err) = msg_part_text($part, $ct);
+ return attach_link($ctx, $ct, $p, $fn) unless defined $s;
+
+ # makes no difference to browsers, and don't screw up filename
+ # link generation in diffs with the extra '%0D'
+ $s =~ s/\r\n/\n/sg;
+
+ # will be escaped to `•' in HTML
+ obfuscate_addrs($ibx, $s, "\x{2022}") if $ibx->{obfuscate};
+
+ # always support diff-highlighting, but we can't linkify hunk
+ # headers for solver unless some coderepo are configured:
+ my $diff;
+ if ($s =~ /^(?:diff|---|\+{3}) /ms) {
+ # diffstat anchors do not link across attachments or messages:
+ $idx[0] = $upfx . $idx[0] if $upfx ne '';
+ $ctx->{-apfx} = join('/', @idx);
+ $ctx->{-anchors} = {}; # attr => filename
+ $diff = 1;
+ delete $ctx->{-long_path};
+ my $spfx;
+ if ($ibx->{-repo_objs}) {
+ if (index($upfx, '//') >= 0) { # absolute URL (Atom feeds)
+ $spfx = $upfx;
+ $spfx =~ s!/([^/]*)/\z!/!;
+ } else {
+ my $n_slash = $upfx =~ tr!/!/!;
+ if ($n_slash == 0) {
+ $spfx = '../';
+ } elsif ($n_slash == 1) {
+ $spfx = '';
+ } else { # nslash == 2
+ $spfx = '../../';
+ }
+ }