48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
import regex as re
|
|
|
|
from app.db.systemconfig_oper import SystemConfigOper
|
|
from app.schemas.types import SystemConfigKey
|
|
from app.utils.singleton import Singleton
|
|
|
|
|
|
class CustomizationMatcher(metaclass=Singleton):
|
|
"""
|
|
识别自定义占位符
|
|
"""
|
|
customization = None
|
|
custom_separator = None
|
|
|
|
def __init__(self):
|
|
self.systemconfig = SystemConfigOper()
|
|
self.customization = None
|
|
self.custom_separator = None
|
|
|
|
def match(self, title=None):
|
|
"""
|
|
:param title: 资源标题或文件名
|
|
:return: 匹配结果
|
|
"""
|
|
if not title:
|
|
return ""
|
|
if not self.customization:
|
|
# 自定义占位符
|
|
customization = self.systemconfig.get(SystemConfigKey.Customization)
|
|
if not customization:
|
|
return ""
|
|
if isinstance(customization, str):
|
|
customization = customization.replace("\n", ";").replace("|", ";").strip(";").split(";")
|
|
self.customization = "|".join([f"({item})" for item in customization])
|
|
|
|
customization_re = re.compile(r"%s" % self.customization)
|
|
# 处理重复多次的情况,保留先后顺序(按添加自定义占位符的顺序)
|
|
unique_customization = {}
|
|
for item in re.findall(customization_re, title):
|
|
if not isinstance(item, tuple):
|
|
item = (item,)
|
|
for i in range(len(item)):
|
|
if item[i] and unique_customization.get(item[i]) is None:
|
|
unique_customization[item[i]] = i
|
|
unique_customization = list(dict(sorted(unique_customization.items(), key=lambda x: x[1])).keys())
|
|
separator = self.custom_separator or "@"
|
|
return separator.join(unique_customization)
|