Prepare for git repository
[spider.git] / perl / BadWords.pm
index 81e7ec90eee67c57a93bb52cb08b4079dea100c3..59f516e8fe480293841a354291655277b78df64d 100644 (file)
@@ -13,24 +13,26 @@ use strict;
 use DXUtil;
 use DXVars;
 use DXHash;
+use DXDebug;
+
 use IO::File;
 
-use vars qw($badword);
+use vars qw($badword $regexcode);
 
 my $oldfn = "$main::data/badwords";
-$badword = new DXHash "badword";
+my $regex = "$main::data/badw_regex";
+my $bwfn = "$main::data/badword";
 
-use vars qw($VERSION $BRANCH);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
-$main::build += $VERSION;
-$main::branch += $BRANCH;
+# copy issue ones across
+filecopy("$regex.gb.issue", $regex) unless -e $regex;
+filecopy("$bwfn.issue", $bwfn) unless -e $bwfn;
+
+$badword = new DXHash "badword";
 
 # load the badwords file
 sub load
 {
        my @out;
-       return unless -e $oldfn;
        my $fh = new IO::File $oldfn;
        
        if ($fh) {
@@ -45,11 +47,46 @@ sub load
                $fh->close;
                $badword->put;
                unlink $oldfn;
+       }
+       push @out, create_regex(); 
+       return @out;
+}
+
+sub create_regex
+{
+       my @out;
+       my $fh = new IO::File $regex;
+       
+       if ($fh) {
+               my $s = "sub { my \$str = shift; my \@out; \n";
+               while (<$fh>) {
+                       chomp;
+                       next if /^\s*\#/;
+                       my @list = split " ";
+                       for (@list) {
+                               # create a closure for each word so that it matches stuff with spaces/punctuation
+                               # and repeated characters in it
+                               my $w = uc $_;
+                               my @l = split //, $w;
+                               my $e = join '+[\s\W]*', @l;
+                               $s .= "push \@out, \$1 if \$str =~ /\\b($e)/;\n";
+                       }
+               }
+               $s .= "return \@out;\n}";
+               $regexcode = eval $s;
+               dbg($s) if isdbg('badword');
+               if ($@) {
+                       @out = ($@);
+                       dbg($@);
+                       return @out;
+               }
+               $fh->close;
        } else {
-               my $l = "can't open $oldfn $!";
+               my $l = "can't open $regex $!";
                dbg($l);
                push @out, $l;
        }
+       
        return @out;
 }
 
@@ -57,28 +94,17 @@ sub load
 sub check
 {
        my $s = uc shift;
+       my @out;
+
+       push @out, &$regexcode($s) if $regexcode;
        
-       for (split(/\s+/, $s)) {
-               s/[^\w]//g;
-               return $_ if $badword->in($_);
-               s/\'?S$//;
-               return $_ if $badword->in($_);
-       }
+       return @out if @out;
        
-       # look for a few of the common ones with spaces and stuff
-       if ($s =~ /F[\s\W]*U[\s\W]*C[\s\W]*K/) {
-               return "FUCK";
-       } elsif ($s =~ /C[\s\W]*U[\s\W]*N[\s\W]*T/) {
-               return "CUNT";
-       } elsif ($s =~ /W[\s\W]*A[\s\W]*N[\s\W]*K/) {
-               return "WANK";
-       } elsif ($s =~ /C[\s\W]*[0O][\s\W]*C[\s\W]*K/) {
-               return "COCK";
-       } elsif ($s =~ /S[\s\W]*H[\s\W]*[I1][\s\W]*T/) {
-               return "SHIT";
+       for (split(/\b/, $s)) {
+               push @out, $_ if $badword->in($_);
        }
-       
-       return undef;
+
+       return @out;
 }
 
 1;