You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
5.3 KiB
141 lines
5.3 KiB
14 years ago
|
""" *==LICENSE==*
|
||
|
|
||
|
CyanWorlds.com Engine - MMOG client, server and tools
|
||
|
Copyright (C) 2011 Cyan Worlds, Inc.
|
||
|
|
||
|
This program is free software: you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation, either version 3 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||
|
or by snail mail at:
|
||
|
Cyan Worlds, Inc.
|
||
|
14617 N Newport Hwy
|
||
|
Mead, WA 99021
|
||
|
|
||
|
*==LICENSE==* """
|
||
|
"""
|
||
|
This module is the word filter to be used...
|
||
|
"""
|
||
|
import string
|
||
|
import re
|
||
|
|
||
|
# Rating levels
|
||
|
xRatedG = 0
|
||
|
xRatedPG = 1
|
||
|
xRatedPG13 = 2
|
||
|
xRatedR = 3
|
||
|
xRatedX = 4
|
||
|
|
||
|
class LanguageFilter:
|
||
|
def __init__(self):
|
||
|
pass
|
||
|
def test(self,sentence):
|
||
|
"returns censored sentence"
|
||
|
return xRatedG
|
||
|
def censor(self,sentence,censorLevel):
|
||
|
"returns censored sentence"
|
||
|
return sentence
|
||
|
|
||
|
class ExactMatchListFilter(LanguageFilter):
|
||
|
def __init__(self,wordlist):
|
||
|
self.wordlist = wordlist
|
||
|
def test(self,sentence):
|
||
|
"return the rating of sentence in question"
|
||
|
rated = xRatedG # assume rated lowest level
|
||
|
startidx = 0
|
||
|
for endidx in range(len(sentence)):
|
||
|
if sentence[endidx] in string.whitespace or sentence[endidx] in string.punctuation:
|
||
|
if startidx != endidx:
|
||
|
try:
|
||
|
# find and get rating and substitute
|
||
|
rating = self.wordlist[string.lower(sentence[startidx:endidx])]
|
||
|
except LookupError:
|
||
|
# couldn't find word
|
||
|
rating = None
|
||
|
if rating != None and rating.rating > rated:
|
||
|
# substitute into string
|
||
|
rated = rating.rating
|
||
|
startidx = endidx + 1
|
||
|
if startidx < len(sentence):
|
||
|
try:
|
||
|
# find and get rating and substitute
|
||
|
rating = self.wordlist[string.lower(sentence[startidx:])]
|
||
|
except LookupError:
|
||
|
# couldn't find word
|
||
|
rating = None
|
||
|
if rating != None and rating.rating > rated:
|
||
|
# substitute into string
|
||
|
rated = rating.rating
|
||
|
return rated
|
||
|
|
||
|
def censor(self,sentence,censorLevel):
|
||
|
"censors a sentence to a rating"
|
||
|
# break into words, but perserve original punctuation
|
||
|
censored = ""
|
||
|
startidx = 0
|
||
|
for endidx in range(len(sentence)):
|
||
|
if sentence[endidx] in string.whitespace or sentence[endidx] in string.punctuation:
|
||
|
if startidx != endidx:
|
||
|
try:
|
||
|
# find and get rating and substitute
|
||
|
rating = self.wordlist[string.lower(sentence[startidx:endidx])]
|
||
|
except LookupError:
|
||
|
# couldn't find word
|
||
|
rating = None
|
||
|
if rating != None and rating.rating > censorLevel:
|
||
|
# substitute into string
|
||
|
censored += rating.substitute + sentence[endidx]
|
||
|
else:
|
||
|
censored += sentence[startidx:endidx] + sentence[endidx]
|
||
|
else:
|
||
|
censored += sentence[startidx]
|
||
|
startidx = endidx + 1
|
||
|
if startidx < len(sentence):
|
||
|
# Special after loop processing!
|
||
|
try:
|
||
|
# find and get rating and substitute
|
||
|
rating = self.wordlist[string.lower(sentence[startidx:])]
|
||
|
except LookupError:
|
||
|
# couldn't find word
|
||
|
rating = None
|
||
|
if rating != None and rating.rating > censorLevel:
|
||
|
# substitute into string
|
||
|
censored += rating.substitute
|
||
|
else:
|
||
|
censored += sentence[startidx:]
|
||
|
return censored
|
||
|
|
||
|
class REFilter(LanguageFilter):
|
||
|
def __init__(self,regexp,rating):
|
||
|
self.compiledRE = re.compile(regexp, re.IGNORECASE | re.MULTILINE )
|
||
|
if not isinstance(rating,Rating):
|
||
|
PtDebugPrint("ptWordFilter: rating for %s not of type Rating" % (regexp))
|
||
|
self.rating = rating
|
||
|
def test(self,sentence):
|
||
|
"return the rating of sentence in question"
|
||
|
if self.compiledRE.search(sentence) != None:
|
||
|
return self.rating.rating
|
||
|
return xRatedG
|
||
|
def censor(self,sentence,censorLevel):
|
||
|
"censors a sentence to a rating"
|
||
|
if self.rating.rating > censorLevel:
|
||
|
if self.compiledRE.search(sentence) != None:
|
||
|
return self.compiledRE.sub(self.rating.substitute,sentence)
|
||
|
return sentence
|
||
|
|
||
|
class Rating:
|
||
|
"substitute can be string for exact substitute or number of splat replacement"
|
||
|
def __init__(self,rating,subtitute="*****"):
|
||
|
self.rating = rating
|
||
|
self.substitute = subtitute
|