-#!/usr/bin/perl
+#!/usr/bin/perl -w
+use strict;
-# * Copyright 2001 Paul Mangan <claws@thewildbeast.co.uk>
+# * Copyright 2002 Paul Mangan <claws@thewildbeast.co.uk>
+# *
+# * Reimplemented by Torsten Schoenfeld <kaffeetisch@web.de>
# *
# * This file is free software; you can redistribute it and/or modify it
# * under the terms of the GNU General Public License as published by
# * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# *
+chdir($ENV{ HOME } . "/.sylpheed") or die("You don't appear to have Sylpheed installed\n");
+
+###############################################################################
+
+my $normal_headers = qr/^(?:Subject|From|To|Cc)$/;
+
+my @new_filters = ("[global]\n");
+
+###############################################################################
+
+my $mailbox;
+
+open(FOLDERLIST, "<folderlist.xml") or die("Can't find 'folderlist.xml'\n");
+ while (<FOLDERLIST>) {
+ if (m/<folder type="mh" name="([^"]+)" path="[^"]+"/) {
+ $mailbox = $1;
+ last;
+ }
+ }
+close FOLDERLIST;
+
+###############################################################################
+
+open(FILTERRC, "<filterrc") or die("Can't find your old filter rules ('filterrc')\n");
+ while (<FILTERRC>) {
+ chomp();
+
+ my ($header_one,
+ $value_one,
+ $op,
+ $header_two,
+ $value_two,
+ $destination,
+ $mode_one,
+ $mode_two,
+ $action) = split(/\t/);
+
+ $action = $action eq "m" ? "move" : "delete";
+ $destination = $destination =~ m!^\#mh/! ?
+ $destination :
+ "#mh/$mailbox/$destination";
+
+ my ($predicate_one,
+ $predicate_two,
+ $match_type_one,
+ $match_type_two,
+ $new_filter);
+
+ ###########################################################################
+
+ if ($mode_one % 2 == 0) {
+ $predicate_one = "~";
+ }
+ else {
+ $predicate_one = "";
+ }
+
+ if ($mode_one <= 1) {
+ $match_type_one = "matchcase";
+ }
+ else {
+ $match_type_one = "regexpcase";
+ }
+
+ ###########################################################################
+
+ if ($mode_two % 2 == 0) {
+ $predicate_two = "~";
+ }
+ else {
+ $predicate_two = "";
+ }
+
+ if ($mode_two <= 1) {
+ $match_type_two = "matchcase";
+ }
+ else {
+ $match_type_two = "regexpcase";
+ }
+
+ ###########################################################################
+
+ if ($header_one eq "To" && $header_two eq "Cc" ||
+ $header_one eq "Cc" && $header_two eq "To" and
+ $value_one eq $value_two and
+ $mode_one eq $mode_two and
+ $op eq "|") {
+ if ($action eq "move") {
+ $new_filter = $predicate_one . qq(to_or_cc $match_type_one "$value_one" move "$destination"\n);
+ }
+ else {
+ $new_filter = $predicate_one . qq(to_or_cc $match_type_one "$value_one" delete\n);
+ }
+ }
+ else {
+ if ($header_one =~ m/$normal_headers/) {
+ $new_filter .= $predicate_one . lc($header_one) . qq( $match_type_one "$value_one");
+ }
+ else {
+ $new_filter .= $predicate_one . qq(header "$header_one" $match_type_one "$value_one");
+ }
+
+ if ($op ne " ") {
+ if ($header_two =~ m/$normal_headers/) {
+ $new_filter .= qq( $op ) . $predicate_two . lc($header_two) . qq( $match_type_two "$value_two");
+ }
+ else {
+ $new_filter .= qq( $op ) . $predicate_two . qq(header "$header_two" $match_type_two "$value_two");
+ }
+ }
+
+ if (defined($new_filter)) {
+ if ($action eq "move") {
+ $new_filter .= qq( move "$destination"\n);
+ }
+ else {
+ $new_filter .= qq(delete\n);
+ }
+ }
+ }
+
+ ###########################################################################
+
+ push(@new_filters, $new_filter) if (defined($new_filter));
+ }
+close(FILTERRC);
+
+###############################################################################
+
+open(MATCHERRC, ">>matcherrc");
+ print MATCHERRC @new_filters;
+close(MATCHERRC);
+
+rename("filterrc", "filterrc.old");
-$INPUT = open (FILTERRC, "<filterrc");
-@input_file = <FILTERRC>;
-$WRITE_THIS = "";
-close FILTERRC;
-
-foreach $input_file (@input_file) {
-@split_lines = split("\t", $input_file);
-if (($split_lines[3]) && ($split_lines[0] eq "To")) {
-$WRITE_THIS .= "to_or_cc match \"$split_lines[1]\"";
-} elsif ($split_lines[0] eq "To") {
-$WRITE_THIS .= "to match \"$split_lines[1]\"";
-} elsif ($split_lines[0] eq "Reply-To") {
-$WRITE_THIS .= "inreplyto match \"$split_lines[1]\"";
-} elsif ($split_lines[0] eq "Subject") {
-$WRITE_THIS .= "subject match \"$split_lines[1]\"";
-} elsif (($split_lines[0] eq "From") || ($split_lines[0] eq "Sender")){
-$WRITE_THIS .= "from match \"$split_lines[1]\"";
-}
-if (!$split_lines[5]) {
-$WRITE_THIS .= " delete";
-} elsif ($split_lines[8] == "m"){
-$WRITE_THIS .= " move \"\#mh/Mailbox/$split_lines[5]\"";
-}
-$WRITE_THIS .= "\n";
-
-@split_lines = "";
-}
-
-open (FILTERINGRC, ">filteringrc");
-
-print FILTERINGRC $WRITE_THIS;
-close FILTERINGRC;
-
-exit;
+###############################################################################
+print "Converted $#new_filters filters\n";
+print "Renamed your old filter rules ('filterrc' to 'filterrc.old')\n";