diff options
-rw-r--r-- | MANIFEST | 2 | ||||
-rw-r--r-- | lib/PublicInbox/Filter/SubjectTag.pm | 33 | ||||
-rw-r--r-- | t/filter_subjecttag.t | 27 |
3 files changed, 62 insertions, 0 deletions
@@ -51,6 +51,7 @@ lib/PublicInbox/ExtMsg.pm lib/PublicInbox/Feed.pm lib/PublicInbox/Filter/Base.pm lib/PublicInbox/Filter/Mirror.pm +lib/PublicInbox/Filter/SubjectTag.pm lib/PublicInbox/Filter/Vger.pm lib/PublicInbox/GetlineBody.pm lib/PublicInbox/Git.pm @@ -127,6 +128,7 @@ t/fail-bin/spamc t/feed.t t/filter_base.t t/filter_mirror.t +t/filter_subjecttag.t t/filter_vger.t t/git-http-backend.psgi t/git-http-backend.t diff --git a/lib/PublicInbox/Filter/SubjectTag.pm b/lib/PublicInbox/Filter/SubjectTag.pm new file mode 100644 index 00000000..1d281425 --- /dev/null +++ b/lib/PublicInbox/Filter/SubjectTag.pm @@ -0,0 +1,33 @@ +# Copyright (C) 2017 all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> + +# Filter for various [tags] in subjects +package PublicInbox::Filter::SubjectTag; +use strict; +use warnings; +use base qw(PublicInbox::Filter::Base); + +sub new { + my ($class, %opts) = @_; + my $tag = delete $opts{-tag}; + die "tag not defined!\n" unless defined $tag && $tag ne ''; + my $self = $class->SUPER::new(%opts); + $self->{tag_re} = qr/\A\s*(re:\s+|)\Q$tag\E\s*/i; + $self; +} + +sub scrub { + my ($self, $mime) = @_; + my $subj = $mime->header('Subject'); + $subj =~ s/$self->{tag_re}/$1/; # $1 is "Re: " + $mime->header_str_set('Subject', $subj); + $self->ACCEPT($mime); +} + +# no suffix/article rejection for mirrors +sub delivery { + my ($self, $mime) = @_; + $self->scrub($mime); +} + +1; diff --git a/t/filter_subjecttag.t b/t/filter_subjecttag.t new file mode 100644 index 00000000..54a219e7 --- /dev/null +++ b/t/filter_subjecttag.t @@ -0,0 +1,27 @@ +# Copyright (C) 2017 all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> +use strict; +use warnings; +use Test::More; +use Email::MIME; +use_ok 'PublicInbox::Filter::SubjectTag'; + +my $f = eval { PublicInbox::Filter::SubjectTag->new }; +like($@, qr/tag not defined/, 'error without args'); +$f = PublicInbox::Filter::SubjectTag->new('-tag', '[foo]'); +is(ref $f, 'PublicInbox::Filter::SubjectTag', 'new object created'); + +my $mime = Email::MIME->new(<<EOF); +To: you <you\@example.com> +Subject: =?UTF-8?B?UmU6IFtmb29dIEVsw4PCqWFub3I=?= + +EOF + +$mime = $f->delivery($mime); +is($mime->header('Subject'), "Re: El\xc3\xa9anor", 'filtered with Re:'); + +$mime->header_str_set('Subject', '[FOO] bar'); +$mime = $f->delivery($mime); +is($mime->header('Subject'), 'bar', 'filtered non-reply'); + +done_testing(); |