--- Config.py +++ Config.py @@ -115,6 +115,8 @@ # List of filters _filters = [] _filters_re = None +_filters_except = [] +_filters_except_re = None def addFilter(s): global _filters @@ -137,8 +139,14 @@ _scoring = {} def setBadness(s, score): + global _scoring _scoring[s] = score +def setFilterException(s): + global _filters_except + + _filters_except.append(s) + def badness(s): return _scoring.get(s, 0) @@ -146,6 +154,8 @@ def isFiltered(s): global _filters global _filters_re + global _filters_except + global _filters_except_re if _filters_re == None: # no filter @@ -162,7 +172,21 @@ _filters_re = _filters_re + '|(?:' + _filters[idx] +')' _filters_re = re.compile(_filters_re) + if _filters_except_re == None and len(_filters_except): + _filters_except_re = '(?:' + _filters_except[0] + ')' + + for idx in range(1, len(_filters_except)): + # to prevent named group overflow that happen when there is too + # many () in a single regexp: AssertionError: sorry, but this + # version only supports 100 named groups + if '(' in _filters_except[idx]: + _non_named_group_re.subn('(:?', _filters_except[idx]) + _filters_except_re = _filters_except_re + '|(?:' + _filters_except[idx] +')' + _filters_except_re = re.compile(_filters_except_re) + if not no_exception: + if _filters_except_re and _filters_except_re.search(s): + return False if _filters_re.search(s): return True return False