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:
2026-07-02 23:40:05 +08:00
parent 45a1b883a6
commit 7a62f839f1
10 changed files with 86 additions and 74 deletions
+18 -18
View File
@@ -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;