You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by mm...@apache.org on 2014/12/29 16:59:27 UTC
svn commit: r1648381 - /spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
Author: mmartinec
Date: Mon Dec 29 15:59:27 2014
New Revision: 1648381
URL: http://svn.apache.org/r1648381
Log:
Bug 7115, factoring out common code in Message.pm
Modified:
spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm?rev=1648381&r1=1648380&r2=1648381&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm Mon Dec 29 15:59:27 2014
@@ -1081,30 +1081,36 @@ sub get_mimepart_digests {
# ---------------------------------------------------------------------------
-sub get_rendered_body_text_array {
- my ($self) = @_;
+# common code for get_rendered_body_text_array,
+# get_visible_rendered_body_text_array, get_invisible_rendered_body_text_array
+#
+sub get_body_text_array_common {
+ my ($self, $method_name) = @_;
- if (exists $self->{text_rendered}) { return $self->{text_rendered}; }
+ my $key = 'text_' . $method_name;
+ if (exists $self->{$key}) { return $self->{$key} }
- $self->{text_rendered} = [];
+ $self->{$key} = [];
# Find all parts which are leaves
my @parts = $self->find_parts(qr/./,1);
- return $self->{text_rendered} unless @parts;
+ return $self->{$key} unless @parts;
# the html metadata may have already been set, so let's not bother if it's
# already been done.
my $html_needs_setting = !exists $self->{metadata}->{html};
+ my $text = $method_name eq 'invisible_rendered' ? ''
+ : ($self->get_header('subject') || "\n");
+
# Go through each part
- my $text = $self->get_header ('subject') || "\n";
- for(my $pt = 0 ; $pt <= $#parts ; $pt++ ) {
+ for (my $pt = 0 ; $pt <= $#parts ; $pt++ ) {
my $p = $parts[$pt];
# put a blank line between parts ...
- $text .= "\n";
+ $text .= "\n" if $text ne '';
- my($type, $rnd) = $p->rendered(); # decode this part
+ my($type, $rnd) = $p->$method_name(); # decode this part
if ( defined $rnd ) {
# Only text/* types are rendered ...
$text .= $rnd;
@@ -1121,121 +1127,30 @@ sub get_rendered_body_text_array {
# whitespace handling (warning: small changes have large effects!)
$text =~ s/\n+\s*\n+/\f/gs; # double newlines => form feed
- $text =~ tr/ \t\n\r\x0b\xa0/ /s; # whitespace => space
+ $text =~ tr/ \t\n\r\x0b\xa0/ /s; # whitespace (incl. VT, NBSP) => space
$text =~ tr/\f/\n/; # form feeds => newline
-
- # warn "message: $text";
- my @textary = split_into_array_of_short_lines ($text);
- $self->{text_rendered} = \@textary;
+ my @textary = split_into_array_of_short_lines($text);
+ $self->{$key} = \@textary;
- return $self->{text_rendered};
+ return $self->{$key};
}
# ---------------------------------------------------------------------------
-# TODO: possibly this should just replace get_rendered_body_text_array().
-# (although watch out, this one doesn't copy {html} to metadata)
-sub get_visible_rendered_body_text_array {
+sub get_rendered_body_text_array {
my ($self) = @_;
+ return $self->get_body_text_array_common('rendered');
+}
- if (exists $self->{text_visible_rendered}) {
- return $self->{text_visible_rendered};
- }
-
- $self->{text_visible_rendered} = [];
-
- # Find all parts which are leaves
- my @parts = $self->find_parts(qr/./,1);
- return $self->{text_visible_rendered} unless @parts;
-
- # the html metadata may have already been set, so let's not bother if it's
- # already been done.
- my $html_needs_setting = !exists $self->{metadata}->{html};
-
- # Go through each part
- my $text = $self->get_header ('subject') || "\n";
- for(my $pt = 0 ; $pt <= $#parts ; $pt++ ) {
- my $p = $parts[$pt];
-
- # put a blank line between parts ...
- $text .= "\n";
-
- my($type, $rnd) = $p->visible_rendered(); # decode this part
- if ( defined $rnd ) {
- # Only text/* types are rendered ...
- $text .= $rnd;
-
- # TVD - if there are multiple parts, what should we do?
- # right now, just use the last one. we may need to give some priority
- # at some point, ie: use text/html rendered if it exists, or
- # text/plain rendered as html otherwise.
- if ($html_needs_setting && $type eq 'text/html') {
- $self->{metadata}->{html} = $p->{html_results};
- }
- }
- }
-
- # whitespace handling (warning: small changes have large effects!)
- $text =~ s/\n+\s*\n+/\f/gs; # double newlines => form feed
- $text =~ tr/ \t\n\r\x0b\xa0/ /s; # whitespace => space
- $text =~ tr/\f/\n/; # form feeds => newline
-
- my @textary = split_into_array_of_short_lines ($text);
- $self->{text_visible_rendered} = \@textary;
-
- return $self->{text_visible_rendered};
+sub get_visible_rendered_body_text_array {
+ my ($self) = @_;
+ return $self->get_body_text_array_common('visible_rendered');
}
sub get_invisible_rendered_body_text_array {
my ($self) = @_;
-
- if (exists $self->{text_invisible_rendered}) {
- return $self->{text_invisible_rendered};
- }
-
- $self->{text_invisible_rendered} = [];
-
- # Find all parts which are leaves
- my @parts = $self->find_parts(qr/./,1);
- return $self->{text_invisible_rendered} unless @parts;
-
- # the html metadata may have already been set, so let's not bother if it's
- # already been done.
- my $html_needs_setting = !exists $self->{metadata}->{html};
-
- # Go through each part
- my $text = '';
- for(my $pt = 0 ; $pt <= $#parts ; $pt++ ) {
- my $p = $parts[$pt];
-
- # put a blank line between parts ...
- $text .= "\n" if ( $text );
-
- my($type, $rnd) = $p->invisible_rendered(); # decode this part
- if ( defined $rnd ) {
- # Only text/* types are rendered ...
- $text .= $rnd;
-
- # TVD - if there are multiple parts, what should we do?
- # right now, just use the last one. we may need to give some priority
- # at some point, ie: use text/html rendered if it exists, or
- # text/plain rendered as html otherwise.
- if ($html_needs_setting && $type eq 'text/html') {
- $self->{metadata}->{html} = $p->{html_results};
- }
- }
- }
-
- # whitespace handling (warning: small changes have large effects!)
- $text =~ s/\n+\s*\n+/\f/gs; # double newlines => form feed
- $text =~ tr/ \t\n\r\x0b\xa0/ /s; # whitespace => space
- $text =~ tr/\f/\n/; # form feeds => newline
-
- my @textary = split_into_array_of_short_lines ($text);
- $self->{text_invisible_rendered} = \@textary;
-
- return $self->{text_invisible_rendered};
+ return $self->get_body_text_array_common('invisible_rendered');
}
# ---------------------------------------------------------------------------