refactor(substore): 将通用工具函数迁移至公共库
- 从各个重命名脚本中移除重复的工具函数实现 - 将 multiplierOf、multiplierValueOf、stripSubscriptionSuffix 等函数统一到 common.js - 使用 utils.multiplierOf、utils.multiplierValueOf 替代本地实现 - 引入 utils.createSequenceCounter 替代手动计数逻辑 - 更新版本号从 20260608-1 到 20260702-1 - 移除重复的正则表达式匹配逻辑 - 标准化序列计数器实现方式 - 优化 yinyun-rename.js 中的信息节点过滤逻辑
This commit is contained in:
+18
-18
@@ -5,7 +5,7 @@
|
||||
* - 按地区出现顺序连续编号,方便全局 rename.js 再追加订阅后缀
|
||||
*/
|
||||
// noinspection JSUnusedGlobalSymbols
|
||||
const COMMON_SCRIPT_VERSION = '20260608-1';
|
||||
const COMMON_SCRIPT_VERSION = '20260702-1';
|
||||
const COMMON_SCRIPT_URL = `https://git.orionc.me/orion/script/raw/branch/main/substore/common.js?v=${COMMON_SCRIPT_VERSION}`;
|
||||
const hasCurrentRenameUtils = utils => Boolean(
|
||||
utils && utils.version === COMMON_SCRIPT_VERSION
|
||||
@@ -49,7 +49,6 @@ async function operator(proxies) {
|
||||
['葡萄牙', 'PT'],
|
||||
['拉脱维亚', 'LV'],
|
||||
['加拿大', 'CA'],
|
||||
['加拿大 01', 'CA'],
|
||||
['澳洲', 'AU'],
|
||||
['捷克', 'CZ'],
|
||||
['南非', 'ZA'],
|
||||
@@ -68,6 +67,11 @@ async function operator(proxies) {
|
||||
['以色列', 'IL'],
|
||||
['意大利', 'IT'],
|
||||
['西班牙', 'ES'],
|
||||
['乌克兰', 'UA'],
|
||||
['德国', 'DE'],
|
||||
['英国', 'UK'],
|
||||
['印度', 'IN'],
|
||||
['泰国', 'TH'],
|
||||
['香港', 'HK'],
|
||||
['美国', 'US'],
|
||||
['日本', 'JP'],
|
||||
@@ -76,49 +80,45 @@ async function operator(proxies) {
|
||||
];
|
||||
const regionResolver = utils.createRegionResolver(regionAliases);
|
||||
|
||||
const stripExistingSuffix = name => String(name)
|
||||
.replace(/\s+-\s*YinYun(?:\s+\d{2})?\s*$/i, '')
|
||||
const isInfoNode = name => /(?:永久官网|TG频道|YinYun\.Ltd|YINYUNLTD)/i.test(name);
|
||||
|
||||
const stripBackupLabel = name => String(name)
|
||||
.replace(/\s*(?:ᴮᴬᴷ|BAK|BACKUP)\s*$/iu, '')
|
||||
.trim();
|
||||
|
||||
const stripLineType = name => String(name)
|
||||
.replace(/\s*[((]\s*[TR]\s*[))]\s*$/i, '')
|
||||
.trim();
|
||||
|
||||
const leadingRegionPrefixOf = name => {
|
||||
const match = String(name).match(/^([A-Z]{2})(?:\s+([A-Z]{3}))?(?=\s|$|-|\d|\|)/);
|
||||
if (!match) return '';
|
||||
return match[2] ? `${match[1]} ${match[2]}` : match[1];
|
||||
};
|
||||
|
||||
const regionPrefixOf = name => {
|
||||
if (/魔法节点/i.test(name)) return 'MAGIC';
|
||||
return regionResolver.aliasRegionPrefixOf(name) || leadingRegionPrefixOf(name);
|
||||
return regionResolver.aliasRegionPrefixOf(name) || utils.leadingRegionPrefixOf(name);
|
||||
};
|
||||
|
||||
const regionCount = Object.create(null);
|
||||
const nextSequence = utils.createSequenceCounter();
|
||||
|
||||
return proxies.map(proxy => {
|
||||
return proxies.filter(proxy => (
|
||||
typeof proxy.name !== 'string' || !isInfoNode(proxy.name)
|
||||
)).map(proxy => {
|
||||
if (typeof proxy.name !== 'string') {
|
||||
return proxy;
|
||||
}
|
||||
|
||||
const cleanName = stripExistingSuffix(proxy.name);
|
||||
const cleanName = utils.stripSubscriptionSuffix(proxy.name, 'YinYun');
|
||||
const { text } = utils.splitLeadingOrInlineFlag(cleanName);
|
||||
const coreName = stripLineType(text);
|
||||
const coreName = stripLineType(stripBackupLabel(text));
|
||||
const regionPrefix = regionPrefixOf(coreName);
|
||||
if (!regionPrefix) {
|
||||
proxy.name = coreName;
|
||||
return proxy;
|
||||
}
|
||||
|
||||
regionCount[regionPrefix] = (regionCount[regionPrefix] || 0) + 1;
|
||||
const sequence = String(regionCount[regionPrefix]).padStart(2, '0');
|
||||
const regionCode = regionPrefix.split(/\s+/)[0];
|
||||
const flag = regionPrefix === 'MAGIC' ? '' : utils.regionCodeToFlag(regionCode);
|
||||
proxy.name = [
|
||||
flag,
|
||||
regionPrefix,
|
||||
sequence
|
||||
nextSequence(regionPrefix)
|
||||
].filter(Boolean).join(' ').trim();
|
||||
|
||||
return proxy;
|
||||
|
||||
Reference in New Issue
Block a user