diff --git a/substore/yuetong-rename.js b/substore/yuetong-rename.js index 4f007e5..bbef1e0 100644 --- a/substore/yuetong-rename.js +++ b/substore/yuetong-rename.js @@ -1,7 +1,7 @@ /** * YueTong 专用节点清理脚本 * 负责去掉“悦·”品牌前缀、钻石、专属/家宽等线路标识,以及压短 AI 解锁文案。 - * 保留线路标识后面的序号,并按地区稳定归并。 + * 按地区稳定归并后重新连续编号,避免专属/普通节点撞号。 */ // noinspection JSUnusedGlobalSymbols function operator(proxies) { @@ -86,6 +86,41 @@ function operator(proxies) { return ''; }; + const splitLeadingFlag = name => { + const leadingFlagMatch = name.match(leadingFlagRegex); + if (!leadingFlagMatch) return { flag: '', text: name.trim() }; + + return { + flag: leadingFlagMatch[1], + text: name.slice(leadingFlagMatch[0].length).trim() + }; + }; + + const withFreshRegionSequence = (name, sequenceNumber) => { + const { flag, text } = splitLeadingFlag(name); + const sequenceText = String(sequenceNumber); + let core = text.trim(); + let feature = ''; + + core = core.replace(/\s*AI\s*\d+(?!\d)(?!\s*(?:[xX倍]|\.\d))/, () => { + feature = 'AI'; + return ''; + }); + if (!feature) { + core = core.replace(/\s+AI\b|AI$/, () => { + feature = 'AI'; + return ''; + }); + } + + core = core + .replace(/\s*\d+(?!\d)(?!\s*(?:[xX倍]|\.\d))(?=\s|$)/, '') + .replace(/\s{2,}/g, ' ') + .trim(); + + return `${flag}${core}${sequenceText}${feature ? ` ${feature}` : ''}`.trim(); + }; + const normalizedItems = proxies.map((proxy, originalIndex) => { if (typeof proxy.name !== 'string') { return { @@ -127,5 +162,12 @@ function operator(proxies) { return firstItem.originalIndex - secondItem.originalIndex; }); - return normalizedItems.map(item => item.proxy); + const regionCount = Object.create(null); + return normalizedItems.map(item => { + if (!item.regionCode) return item.proxy; + + regionCount[item.regionCode] = (regionCount[item.regionCode] || 0) + 1; + item.proxy.name = withFreshRegionSequence(item.proxy.name, regionCount[item.regionCode]); + return item.proxy; + }); }