File Coverage

blib/lib/Mail/Message/Body/Construct.pm
Criterion Covered Total %
statement 57 65 87.6
branch 33 48 68.7
condition 1 6 16.6
subroutine 9 10 90.0
pod 4 4 100.0
total 104 133 78.2


line stmt bran cond sub pod time code
1             # Copyrights 2001-2023 by [Mark Overmeer ].
2             # For other contributors see ChangeLog.
3             # See the manual pages for details on the licensing terms.
4             # Pod stripped from pm file by OODoc 2.03.
5             # This code is part of distribution Mail-Message. Meta-POD processed with
6             # OODoc into POD and HTML manual-pages. See README.md
7             # Copyright Mark Overmeer. Licensed under the same terms as Perl itself.
8              
9             package Mail::Message::Body;
10 5     5   1859 use vars '$VERSION';
  5         11  
  5         338  
11             $VERSION = '3.013';
12              
13             # Mail::Message::Body::Construct adds functionality to Mail::Message::Body
14              
15 5     5   33 use strict;
  5         12  
  5         125  
16 5     5   25 use warnings;
  5         11  
  5         127  
17              
18 5     5   25 use Carp;
  5         10  
  5         366  
19 5     5   1793 use Mail::Message::Body::String;
  5         21  
  5         208  
20 5     5   34 use Mail::Message::Body::Lines;
  5         11  
  5         3412  
21              
22              
23             sub foreachLine($)
24 4     4 1 11 { my ($self, $code) = @_;
25 4         8 my $changes = 0;
26 4         7 my @result;
27              
28 4         46 foreach ($self->lines)
29 8         21 { my $becomes = $code->();
30 8 50       48 if(defined $becomes)
31 8         17 { push @result, $becomes;
32 8 50       21 $changes++ if $becomes ne $_;
33             }
34 0         0 else {$changes++}
35             }
36            
37             $changes
38 4 50       12 or return $self;
39              
40 4         19 ref($self)->new
41             ( based_on => $self
42             , data => \@result
43             );
44             }
45              
46             #------------------------------------------
47              
48              
49             sub concatenate(@)
50 9     9 1 20 { my $self = shift;
51              
52 9 50       28 return $self
53             if @_==1;
54              
55 9         16 my @unified;
56 9         22 foreach (@_)
57 39 100       95 { next unless defined $_;
58 21 50       213 push @unified
    50          
    100          
    100          
59             , !ref $_ ? $_
60             : ref $_ eq 'ARRAY' ? @$_
61             : $_->isa('Mail::Message') ? $_->body->decoded
62             : $_->isa('Mail::Message::Body') ? $_->decoded
63             : carp "Cannot concatenate element ".$_;
64             }
65              
66 9         71 ref($self)->new
67             ( based_on => $self
68             , mime_type => 'text/plain'
69             , data => join('', @unified)
70             );
71             }
72              
73             #------------------------------------------
74              
75              
76             sub attach(@)
77 0     0 1 0 { my $self = shift;
78              
79 0         0 my @parts;
80 0   0     0 push @parts, shift while @_ && ref $_[0];
81              
82 0 0       0 return $self unless @parts;
83 0 0       0 unshift @parts,
    0          
84             ( $self->isNested ? $self->nested
85             : $self->isMultipart ? $self->parts
86             : $self
87             );
88              
89 0 0       0 return $parts[0] if @parts==1;
90 0         0 Mail::Message::Body::Multipart->new(parts => \@parts, @_);
91             }
92              
93             #------------------------------------------
94              
95              
96             # tests in t/51stripsig.t
97              
98             sub stripSignature($@)
99 14     14 1 93 { my ($self, %args) = @_;
100              
101 14 50       60 return $self if $self->mimeType->isBinary;
102              
103             my $pattern = !defined $args{pattern} ? qr/^--\s?$/
104             : !ref $args{pattern} ? qr/^\Q${args{pattern}}/
105 14 100       478 : $args{pattern};
    100          
106            
107 14         49 my $lines = $self->lines; # no copy!
108             my $stop = defined $args{max_lines}? @$lines - $args{max_lines}
109 14 100       47 : exists $args{max_lines} ? 0
    100          
110             : @$lines-10;
111              
112 14 100       36 $stop = 0 if $stop < 0;
113 14         25 my ($sigstart, $found);
114            
115 14 100       32 if(ref $pattern eq 'CODE')
116 1         15 { for($sigstart = $#$lines; $sigstart >= $stop; $sigstart--)
117 4 100       19 { next unless $pattern->($lines->[$sigstart]);
118 1         8 $found = 1;
119 1         3 last;
120             }
121             }
122             else
123 13         43 { for($sigstart = $#$lines; $sigstart >= $stop; $sigstart--)
124 76 100       338 { next unless $lines->[$sigstart] =~ $pattern;
125 9         21 $found = 1;
126 9         16 last;
127             }
128             }
129            
130 14 100       47 return $self unless $found;
131            
132 10   33     49 my $bodytype = $args{result_type} || ref $self;
133              
134 10         56 my $stripped = $bodytype->new
135             ( based_on => $self
136             , data => [ @$lines[0..$sigstart-1] ]
137             );
138              
139 10 100       45 return $stripped unless wantarray;
140              
141 6         31 my $sig = $bodytype->new
142             ( based_on => $self
143             , data => [ @$lines[$sigstart..$#$lines] ]
144             );
145            
146 6         36 ($stripped, $sig);
147             }
148              
149             #------------------------------------------
150              
151             1;