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.
60 lines
1.2 KiB
60 lines
1.2 KiB
6 years ago
|
from plex.lib import six
|
||
|
|
||
|
import re
|
||
|
import unicodedata
|
||
|
|
||
|
def flatten(text):
|
||
|
if text is None:
|
||
|
return None
|
||
|
|
||
|
# Normalize `text` to ascii
|
||
|
text = normalize(text)
|
||
|
|
||
|
# Remove special characters
|
||
|
text = re.sub('[^A-Za-z0-9\s]+', '', text)
|
||
|
|
||
|
# Merge duplicate spaces
|
||
|
text = ' '.join(text.split())
|
||
|
|
||
|
# Convert to lower-case
|
||
|
return text.lower()
|
||
|
|
||
|
def normalize(text):
|
||
|
if text is None:
|
||
|
return None
|
||
|
|
||
|
# Normalize unicode characters
|
||
|
if type(text) is six.text_type:
|
||
|
text = unicodedata.normalize('NFKD', text)
|
||
|
|
||
|
# Ensure text is ASCII, ignore unknown characters
|
||
|
text = text.encode('ascii', 'ignore')
|
||
|
|
||
|
# Return decoded `text`
|
||
|
return text.decode('ascii')
|
||
|
|
||
|
def to_iterable(value):
|
||
|
if value is None:
|
||
|
return None
|
||
|
|
||
|
if isinstance(value, (list, tuple)):
|
||
|
return value
|
||
|
|
||
|
return [value]
|
||
|
|
||
|
|
||
|
def synchronized(func):
|
||
|
def wrapper(self, *__args, **__kw):
|
||
|
self._lock.acquire()
|
||
|
|
||
|
try:
|
||
|
return func(self, *__args, **__kw)
|
||
|
finally:
|
||
|
self._lock.release()
|
||
|
|
||
|
wrapper.__name__ = func.__name__
|
||
|
wrapper.__dict__ = func.__dict__
|
||
|
wrapper.__doc__ = func.__doc__
|
||
|
|
||
|
return wrapper
|