Skip to content

Commit 779db92

Browse files
authored
Merge pull request #1668 from ikedas/extend_subject_prefixes
Additional localised "Re:" prefixes in subject
2 parents 933f436 + d81d695 commit 779db92

File tree

6 files changed

+135
-10
lines changed

6 files changed

+135
-10
lines changed

Makefile.am

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ check_SCRIPTS = \
3838
t/Request_Handler_add+del.t \
3939
t/Request_Handler_set.t \
4040
t/Scenario.t \
41+
t/Spindle_TransformIncoming.t \
4142
t/Tools_Data.t \
4243
t/Tools_File.t \
4344
t/Tools_Password.t \

src/lib/Sympa/Regexps.pm

+25-3
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,31 @@ use constant time => qr'[012]?[0-9](?:\:[0-5][0-9])?';
8383
use constant time_range => __PACKAGE__->time . '-' . __PACKAGE__->time;
8484
use constant time_ranges => time_range() . '(?:\s+' . time_range() . ')*';
8585

86-
use constant re =>
87-
qr'(?i)(?:AW|(?:\xD0\x9D|\xD0\xBD)(?:\xD0\x90|\xD0\xB0)|Re(?:\^\d+|\*\d+|\*\*\d+|\[\d+\])?|Rif|SV|VS|Antw|\xCE\x91(?:\xCE\xA0|\xCF\x80)|\xCE\xA3(?:\xCE\xA7\xCE\x95\xCE\xA4|\xCF\x87\xCE\xB5\xCF\x84)|Odp|YNT)\s*:';
88-
# (de | ru etc. | en, la etc. | it | da, sv | fi | nl | el | el | pl | tr).
86+
use constant re => qr{
87+
(?:
88+
Antw # Dutch
89+
| ATB # Welsh
90+
| ATB \. # Latvian
91+
| AW # German
92+
| Odp # Polish
93+
| R # Italian
94+
| Re (?: \s* \( \d+ \) | \s* \[ \d+ \] | \*{1,2} \d+ | \^ \d+ )?
95+
| REF # French
96+
| RES # Portuguese
97+
| Rif # Italian
98+
| SV # Scandinavian
99+
| V\x{00E1} # Magyar, "VA"
100+
| VS # Finnish
101+
| YNT # Turkish
102+
| \x{05D4}\x{05E9}\x{05D1} # Hebrew, "hashev"
103+
| \x{0391}\x{03A0} # Greek, "AP"
104+
| \x{03A3}\x{03A7}\x{0395}\x{03A4} # Greek, "SChET"
105+
| \x{041D}\x{0410} # some Slavic in Cyrillic, "na"
106+
| \x{56DE}\x{590D} # Simp. Chinese, "huifu"
107+
| \x{56DE}\x{8986} # Trad. Chinese, "huifu"
108+
)
109+
\s* [:\x{FF1A}]
110+
}ix;
89111

90112
1;
91113

src/lib/Sympa/Request/Message.pm

+8-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ package Sympa::Request::Message;
2626

2727
use strict;
2828
use warnings;
29+
use Encode qw();
2930

3031
use Sympa::List;
3132
use Sympa::Log;
@@ -95,8 +96,14 @@ sub _load {
9596
my $subject_field = $message->{'decoded_subject'};
9697
$subject_field = '' unless defined $subject_field;
9798
$subject_field =~ s/\n//mg; ## multiline subjects
99+
# Remove leading "Re:" and equivalents.
100+
# Note that Unicode case-ignore match is performed.
98101
my $re_regexp = Sympa::Regexps::re();
99-
$subject_field =~ s/^\s*(?:$re_regexp)?\s*(.*)\s*$/$1/i;
102+
$subject_field = Encode::decode_utf8($subject_field);
103+
$subject_field =~ s/\A\s*$re_regexp\s*//i;
104+
$subject_field =~ s/\s+\z//;
105+
$subject_field = Encode::encode_utf8($subject_field);
106+
100107
if ($subject_field =~ /\S/) {
101108
my $request = $self->_parse($subject_field, $message);
102109
return [$request] unless $request->{action} eq 'unknown';

src/lib/Sympa/Spindle/DoMessage.pm

+7-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ package Sympa::Spindle::DoMessage;
2626

2727
use strict;
2828
use warnings;
29+
use Encode qw();
2930

3031
use Sympa;
3132
use Conf;
@@ -149,8 +150,13 @@ sub _check_command {
149150
my $subject_field = $message->{'decoded_subject'};
150151
$subject_field = '' unless defined $subject_field;
151152
$subject_field =~ s/\n//mg; # multiline subjects
153+
# Remove leading "Re:" and equivalents.
154+
# Note that Unicode case-ignore match is performed.
152155
my $re_regexp = Sympa::Regexps::re();
153-
$subject_field =~ s/^\s*(?:$re_regexp)?\s*(.*)\s*$/$1/i;
156+
$subject_field = Encode::decode_utf8($subject_field);
157+
$subject_field =~ s/\A\s*$re_regexp\s*//i;
158+
$subject_field =~ s/\s+\z//;
159+
$subject_field = Encode::encode_utf8($subject_field);
154160

155161
if ($subject_field =~ /^($commands_re)$/im) {
156162
return $1;

src/lib/Sympa/Spindle/TransformIncoming.pm

+8-5
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ package Sympa::Spindle::TransformIncoming;
3030
use strict;
3131
use warnings;
3232
use Encode qw();
33-
use English; # FIXME: drop $POSTMATCH usage
33+
use English qw(-no_match_vars);
3434
use MIME::EncWords;
3535

3636
use Conf;
@@ -158,13 +158,16 @@ sub _twist {
158158
}
159159
$subject_field =~ s/\s+$//;
160160

161-
# truncate multiple "Re:" and equivalents.
161+
# Truncate multiple "Re:" and equivalents.
162+
# Note that Unicode case-ignore match is performed.
162163
my $re_regexp = Sympa::Regexps::re();
163-
if ($subject_field =~ /^\s*($re_regexp\s*)($re_regexp\s*)*/) {
164-
($before_tag, $after_tag) = ($1, $POSTMATCH);
164+
$subject_field = Encode::decode_utf8($subject_field);
165+
if ($subject_field =~ s/\A\s*($re_regexp\s*)($re_regexp\s*)*//i) {
166+
$before_tag = Encode::encode_utf8($1);
165167
} else {
166-
($before_tag, $after_tag) = ('', $subject_field);
168+
$before_tag = '';
167169
}
170+
$after_tag = Encode::encode_utf8($subject_field);
168171

169172
## Encode subject using initial charset
170173

t/Spindle_TransformIncoming.t

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# -*- indent-tabs-mode: nil; -*-
2+
# vim:ft=perl:et:sw=4
3+
4+
use strict;
5+
use warnings;
6+
use Test::More;
7+
8+
use Conf;
9+
use Sympa::ConfDef;
10+
use Sympa::List;
11+
use Sympa::Message;
12+
use Sympa::Spindle::TransformIncoming;
13+
14+
do {
15+
no warnings;
16+
*Sympa::List::update_stats = sub { (1) };
17+
};
18+
19+
%Conf::Conf = (
20+
domain => 'mail.example.org', # mandatory
21+
listmaster => 'jade@example.com', # mandatory
22+
);
23+
# Apply defaults.
24+
foreach my $pinfo (grep { $_->{name} and exists $_->{default} }
25+
@Sympa::ConfDef::params) {
26+
$Conf::Conf{$pinfo->{name}} = $pinfo->{default}
27+
unless exists $Conf::Conf{$pinfo->{name}};
28+
}
29+
30+
my $list = bless {
31+
name => 'list',
32+
domain => $Conf::Conf{'domain'},
33+
admin => {custom_subject => '[%list.name%]:[%list.sequence%]',},
34+
} => 'Sympa::List';
35+
36+
my $spindle = Sympa::Spindle::TransformIncoming->new(
37+
context => $list,
38+
splicing_to => 'Sympa::Spindle',
39+
);
40+
41+
my $message;
42+
43+
# custom_subject and subject prefixes
44+
45+
$message = Sympa::Message->new("Subject: Re: Re: Test\n\n", context => $list);
46+
$spindle->{distaff} = Sympa::Spool::Mock->new(message => $message);
47+
$spindle->spin;
48+
is $message->as_string, "Subject: Re: [list:1] Test\n\n", 'Re: Re:';
49+
50+
$message = Sympa::Message->new("Subject: Re:[list:979] Re: Test\n\n",
51+
context => $list);
52+
$spindle->{distaff} = Sympa::Spool::Mock->new(message => $message);
53+
$spindle->spin;
54+
is $message->as_string, "Subject: Re: [list:1] Test\n\n", 'Re:[tag] Re:';
55+
56+
$message = Sympa::Message->new(<<'EOF', context => $list);
57+
Subject: =?UTF-8?B?U1Y6IEFudHc6IFZTOiBSRUYgOiBSRTogUkVbMl06IEFXOiDOkc6gOiA=?=
58+
=?UTF-8?B?zpHPgDogzqPOp86VzqQ6IM6jz4fOtc+EOiDQndCwOiDQvdCwOiBWw6E6IFI6IFJJ?=
59+
=?UTF-8?B?RjogQXRiLjogUkVTOiBPZHA6IFludDogQVRCOiDlm57lpI06IOWbnuimhu+8mlZT?=
60+
=?UTF-8?Q?=3a_Fwd=3a_Re=3a_Something?=
61+
62+
EOF
63+
$spindle->{distaff} = Sympa::Spool::Mock->new(message => $message);
64+
$spindle->spin;
65+
is $message->as_string, "Subject: SV: [list:1] Fwd: Re: Something\n\n",
66+
'Multilingual "Re:"';
67+
68+
done_testing;
69+
70+
package Sympa::Spool::Mock;
71+
use parent qw(Sympa::Spool);
72+
73+
use constant _generator => 'Sympa::Message';
74+
use constant _directories => {};
75+
use constant _no_glob_pattern => 1;
76+
use constant remove => 1;
77+
78+
sub next {
79+
my $self = shift;
80+
81+
return unless $self->{message};
82+
return (delete $self->{message}, 1);
83+
}
84+
85+
1;
86+

0 commit comments

Comments
 (0)