Files
script/substore/yinyun-rename.js
T
orion 7a62f839f1 refactor(substore): 将通用工具函数迁移至公共库
- 从各个重命名脚本中移除重复的工具函数实现
- 将 multiplierOf、multiplierValueOf、stripSubscriptionSuffix 等函数统一到 common.js
- 使用 utils.multiplierOf、utils.multiplierValueOf 替代本地实现
- 引入 utils.createSequenceCounter 替代手动计数逻辑
- 更新版本号从 20260608-1 到 20260702-1
- 移除重复的正则表达式匹配逻辑
- 标准化序列计数器实现方式
- 优化 yinyun-rename.js 中的信息节点过滤逻辑
2026-07-02 23:40:05 +08:00

127 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* YinYun 专用节点清理脚本
* - 将中文地区名压成国家短码并补齐国旗
* - 忽略 YinYun 原始的 优选、数字编号和 (T)/(R) 线路标记
* - 按地区出现顺序连续编号,方便全局 rename.js 再追加订阅后缀
*/
// noinspection JSUnusedGlobalSymbols
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
);
async function loadRenameUtils() {
if (typeof globalThis !== 'undefined' && hasCurrentRenameUtils(globalThis.SubStoreRenameUtils)) {
return globalThis.SubStoreRenameUtils;
}
const cache = typeof scriptResourceCache !== 'undefined' ? scriptResourceCache : null;
let script = cache && cache.get(COMMON_SCRIPT_URL);
if (!script) {
const response = await $substore.http.get({ url: COMMON_SCRIPT_URL });
script = response && (response.body || response.data || response);
if (cache) cache.set(COMMON_SCRIPT_URL, script);
}
new Function(String(script))();
if (!hasCurrentRenameUtils(globalThis.SubStoreRenameUtils)) {
throw new Error('Loaded common.js is missing current rename utilities');
}
return globalThis.SubStoreRenameUtils;
}
async function operator(proxies) {
const utils = await loadRenameUtils();
const regionAliases = [
['哈萨克斯坦', 'KZ'],
['印度尼西亚', 'ID'],
['孟加拉国', 'BD'],
['澳大利亚', 'AU'],
['保加利亚', 'BG'],
['格鲁吉亚', 'GE'],
['立陶宛', 'LT'],
['俄罗斯', 'RU'],
['新加坡', 'SG'],
['马来西亚', 'MY'],
['罗马尼亚', 'RO'],
['亚美尼亚', 'AM'],
['葡萄牙', 'PT'],
['拉脱维亚', 'LV'],
['加拿大', 'CA'],
['澳洲', 'AU'],
['捷克', 'CZ'],
['南非', 'ZA'],
['芬兰', 'FI'],
['瑞士', 'CH'],
['墨西哥', 'MX'],
['瑞典', 'SE'],
['比利时', 'BE'],
['阿联酋', 'AE'],
['法国', 'FR'],
['波兰', 'PL'],
['荷兰', 'NL'],
['奥地利', 'AT'],
['巴西', 'BR'],
['土耳其', 'TR'],
['以色列', 'IL'],
['意大利', 'IT'],
['西班牙', 'ES'],
['乌克兰', 'UA'],
['德国', 'DE'],
['英国', 'UK'],
['印度', 'IN'],
['泰国', 'TH'],
['香港', 'HK'],
['美国', 'US'],
['日本', 'JP'],
['韩国', 'KR'],
['台湾', 'TW']
];
const regionResolver = utils.createRegionResolver(regionAliases);
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 regionPrefixOf = name => {
if (/魔法节点/i.test(name)) return 'MAGIC';
return regionResolver.aliasRegionPrefixOf(name) || utils.leadingRegionPrefixOf(name);
};
const nextSequence = utils.createSequenceCounter();
return proxies.filter(proxy => (
typeof proxy.name !== 'string' || !isInfoNode(proxy.name)
)).map(proxy => {
if (typeof proxy.name !== 'string') {
return proxy;
}
const cleanName = utils.stripSubscriptionSuffix(proxy.name, 'YinYun');
const { text } = utils.splitLeadingOrInlineFlag(cleanName);
const coreName = stripLineType(stripBackupLabel(text));
const regionPrefix = regionPrefixOf(coreName);
if (!regionPrefix) {
proxy.name = coreName;
return proxy;
}
const regionCode = regionPrefix.split(/\s+/)[0];
const flag = regionPrefix === 'MAGIC' ? '' : utils.regionCodeToFlag(regionCode);
proxy.name = [
flag,
regionPrefix,
nextSequence(regionPrefix)
].filter(Boolean).join(' ').trim();
return proxy;
});
}