You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jh...@apache.org on 2009/06/21 19:22:31 UTC
svn commit: r787054 -
/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm
Author: jhardin
Date: Sun Jun 21 17:22:31 2009
New Revision: 787054
URL: http://svn.apache.org/viewvc?rev=787054&view=rev
Log:
Add multipass to ReplaceTags.pm - hardcoded limit of 5 passes.
Modified:
spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm?rev=787054&r1=787053&r2=787054&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm Sun Jun 21 17:22:31 2009
@@ -87,71 +87,80 @@
for my $type (qw|body_tests rawbody_tests head_tests full_tests uri_tests|) {
for my $priority (keys %{$conf->{$type}}) {
while (my ($rule, $re) = each %{$conf->{$type}->{$priority}}) {
- # skip if not listed by replace_rules
- next unless $conf->{rules_to_replace}{$rule};
+ # skip if not listed by replace_rules
+ next unless $conf->{rules_to_replace}{$rule};
- if (would_log('dbg', 'replacetags') > 1) {
- dbg("replacetags: replacing $rule: $re");
- }
-
- my $pre_name;
- my $post_name;
- my $inter_name;
-
- # get modifier tags
- if ($re =~ s/${start}pre (.+?)${end}//) {
- $pre_name = $1;
- }
- if ($re =~ s/${start}post (.+?)${end}//) {
- $post_name = $1;
- }
- if ($re =~ s/${start}inter (.+?)${end}//) {
- $inter_name = $1;
- }
-
- # this will produce an array of tags to be replaced
- # for two adjacent tags, an element of "" will be between the two
- my @re = split(/(<.+?>)/, $re);
-
- if ($pre_name) {
- my $pre = $conf->{replace_pre}->{$pre_name};
- if ($pre) {
- @re = map { s|($start.+?$end)|$pre$1|; $_; } @re;
- }
- }
- if ($post_name) {
- my $post = $conf->{replace_post}->{$post_name};
- if ($post) {
- @re = map { s|($start.+?$end)|$1$post|g; $_; } @re;
- }
- }
- if ($inter_name) {
- my $inter = $conf->{replace_inter}->{$inter_name};
- if ($inter) {
- @re = map { s|^$|$inter|; $_; } @re;
- }
- }
- for (my $i = 0; $i < @re; $i++) {
- if ($re[$i] =~ m|$start(.+?)$end|g) {
- my $tag_name = $1;
- # if the tag exists, replace it with the corresponding phrase
- if ($tag_name) {
- my $replacement = $conf->{replace_tag}->{$tag_name};
- if ($replacement) {
- $re[$i] =~ s|$start$tag_name$end|$replacement|g;
- }
- }
- }
+ if (would_log('dbg', 'replacetags') > 1) {
+ dbg("replacetags: replacing $rule: $re");
}
- $re = join('', @re);
+ my $passes = 0;
+ my $doagain;
- # do the actual replacement
- $conf->{$type}->{$priority}->{$rule} = $re;
+ do {
+ my $pre_name;
+ my $post_name;
+ my $inter_name;
+ $doagain = 0;
+
+ # get modifier tags
+ if ($re =~ s/${start}pre (.+?)${end}//) {
+ $pre_name = $1;
+ }
+ if ($re =~ s/${start}post (.+?)${end}//) {
+ $post_name = $1;
+ }
+ if ($re =~ s/${start}inter (.+?)${end}//) {
+ $inter_name = $1;
+ }
+
+ # this will produce an array of tags to be replaced
+ # for two adjacent tags, an element of "" will be between the two
+ my @re = split(/(<.+?>)/, $re);
+
+ if ($pre_name) {
+ my $pre = $conf->{replace_pre}->{$pre_name};
+ if ($pre) {
+ @re = map { s|($start.+?$end)|$pre$1|; $_; } @re;
+ }
+ }
+ if ($post_name) {
+ my $post = $conf->{replace_post}->{$post_name};
+ if ($post) {
+ @re = map { s|($start.+?$end)|$1$post|g; $_; } @re;
+ }
+ }
+ if ($inter_name) {
+ my $inter = $conf->{replace_inter}->{$inter_name};
+ if ($inter) {
+ @re = map { s|^$|$inter|; $_; } @re;
+ }
+ }
+ for (my $i = 0; $i < @re; $i++) {
+ if ($re[$i] =~ m|$start(.+?)$end|g) {
+ my $tag_name = $1;
+ # if the tag exists, replace it with the corresponding phrase
+ if ($tag_name) {
+ my $replacement = $conf->{replace_tag}->{$tag_name};
+ if ($replacement) {
+ $re[$i] =~ s|$start$tag_name$end|$replacement|g;
+ $doagain = 1 if !$doagain && $replacement =~ /<[^>]+>/;
+ }
+ }
+ }
+ }
+
+ $re = join('', @re);
+
+ # do the actual replacement
+ $conf->{$type}->{$priority}->{$rule} = $re;
+
+ if (would_log('dbg', 'replacetags') > 1) {
+ dbg("replacetags: replaced $rule: $re");
+ }
- if (would_log('dbg', 'replacetags') > 1) {
- dbg("replacetags: replaced $rule: $re");
- }
+ $passes++;
+ } while $doagain && $passes <= 5;
}
}
}
@@ -245,13 +254,13 @@
code => sub {
my ($self, $key, $value, $line) = @_;
unless (defined $value && $value !~ /^$/) {
- return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
+ return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
unless ($value =~ /\S+/) {
- return $Mail::SpamAssassin::Conf::INVALID_VALUE;
+ return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
foreach my $rule (split(' ', $value)) {
- $conf->{rules_to_replace}->{$rule} = 1;
+ $conf->{rules_to_replace}->{$rule} = 1;
}
}
});