✨ feat(substore): 新增 peiqian 和 yuetong 重命名脚本并优化现有脚本注释
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
* - 按地区内“普通 -> 倍率 -> 高级”排序并连续编号
|
* - 按地区内“普通 -> 倍率 -> 高级”排序并连续编号
|
||||||
* - 不追加订阅后缀,整合订阅最后仍交给 rename.js 处理
|
* - 不追加订阅后缀,整合订阅最后仍交给 rename.js 处理
|
||||||
*/
|
*/
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
function operator(proxies) {
|
function operator(proxies) {
|
||||||
const regionAliases = [
|
const regionAliases = [
|
||||||
['美国夏威夷', 'US HNL'],
|
['美国夏威夷', 'US HNL'],
|
||||||
@@ -97,7 +98,7 @@ function operator(proxies) {
|
|||||||
const providerOf = name => {
|
const providerOf = name => {
|
||||||
if (/SkyStroll/i.test(name)) return 'SkyStroll';
|
if (/SkyStroll/i.test(name)) return 'SkyStroll';
|
||||||
if (/isif/i.test(name)) return 'ISIF';
|
if (/isif/i.test(name)) return 'ISIF';
|
||||||
if (/(?:搬瓦工|Bandwagon|BWH|BWG)/i.test(name)) return 'BWH';
|
if (/搬瓦工|Bandwagon|BWH|BWG/i.test(name)) return 'BWH';
|
||||||
return '';
|
return '';
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -109,7 +110,7 @@ function operator(proxies) {
|
|||||||
|
|
||||||
const aliasRegionPrefixOf = name => {
|
const aliasRegionPrefixOf = name => {
|
||||||
const cleanNameLower = name.toLowerCase();
|
const cleanNameLower = name.toLowerCase();
|
||||||
for (const [alias, replacement, aliasLower] of sortedRegionAliases) {
|
for (const [, replacement, aliasLower] of sortedRegionAliases) {
|
||||||
if (cleanNameLower.includes(aliasLower)) return replacement;
|
if (cleanNameLower.includes(aliasLower)) return replacement;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,7 +124,7 @@ function operator(proxies) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const regionPrefixOf = (name, flagRegionCode) => {
|
const regionPrefixOf = (name, flagRegionCode) => {
|
||||||
if (/(?:Hinet|Seednet)/i.test(name)) return 'TW';
|
if (/Hinet|Seednet/i.test(name)) return 'TW';
|
||||||
|
|
||||||
return aliasRegionPrefixOf(name) ||
|
return aliasRegionPrefixOf(name) ||
|
||||||
leadingRegionPrefixOf(name) ||
|
leadingRegionPrefixOf(name) ||
|
||||||
@@ -168,6 +169,10 @@ function operator(proxies) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
normalizedItems.sort((firstItem, secondItem) => {
|
normalizedItems.sort((firstItem, secondItem) => {
|
||||||
|
if (!firstItem.countryCode || !secondItem.countryCode) {
|
||||||
|
return firstItem.originalIndex - secondItem.originalIndex;
|
||||||
|
}
|
||||||
|
|
||||||
const firstOrder = countryOrder[firstItem.countryCode];
|
const firstOrder = countryOrder[firstItem.countryCode];
|
||||||
const secondOrder = countryOrder[secondItem.countryCode];
|
const secondOrder = countryOrder[secondItem.countryCode];
|
||||||
if (firstOrder !== secondOrder) return firstOrder - secondOrder;
|
if (firstOrder !== secondOrder) return firstOrder - secondOrder;
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
* PeiQian 专用节点清理脚本
|
||||||
|
* 负责清理推荐、用途、hy2、倍率等 PeiQian 节点文案。
|
||||||
|
*/
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
|
function operator(proxies) {
|
||||||
|
return proxies.map(proxy => {
|
||||||
|
if (typeof proxy.name !== 'string') {
|
||||||
|
return proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy.name = proxy.name
|
||||||
|
.replace(/^AWS\s*新加坡\s*/i, '新加坡 AWS ')
|
||||||
|
.replace(/\s*\|\s*合适下载使用\s*-\s*(\d+(?:\.\d+)?)倍/gi, ' $1x')
|
||||||
|
.replace(/\s*\|\s*合适下载使用/gi, '')
|
||||||
|
.replace(/\s*\|\s*避免晚高峰使用/gi, '')
|
||||||
|
.replace(/\s*\|\s*电信联通移动推荐\s*-\s*hy2/gi, ' [三网 HY2]')
|
||||||
|
.replace(/\s*\|\s*电信联通移动推荐/gi, ' [三网]')
|
||||||
|
.replace(/\s*\|\s*电信联通推荐\s*-\s*hy2/gi, ' [电联 HY2]')
|
||||||
|
.replace(/\s*\|\s*电信联通推荐/gi, ' [电联]')
|
||||||
|
.replace(/\s*\|\s*移动联通推荐\s*-\s*hy2/gi, ' [移联 HY2]')
|
||||||
|
.replace(/\s*\|\s*移动联通推荐/gi, ' [移联]')
|
||||||
|
.replace(/\s*\|\s*高速专线(?:推荐)?\s*-\s*hy2/gi, ' [HY2]')
|
||||||
|
.replace(/\s*\|\s*高速专线推荐/gi, ' [专线]')
|
||||||
|
.replace(/\s*\|\s*三网推荐/gi, ' [三网]')
|
||||||
|
.replace(/-\s*(\d+(?:\.\d+)?)倍/gi, ' $1x')
|
||||||
|
.replace(/(\d+(?:\.\d+)?)倍/gi, '$1x')
|
||||||
|
.replace(/\s+\[/g, ' [')
|
||||||
|
.replace(/\s{2,}/g, ' ')
|
||||||
|
.trim();
|
||||||
|
|
||||||
|
return proxy;
|
||||||
|
});
|
||||||
|
}
|
||||||
+10
-5
@@ -4,6 +4,7 @@
|
|||||||
* - 清理常见冗余线路描述,例如 DIP 地区说明、IEPL 专线
|
* - 清理常见冗余线路描述,例如 DIP 地区说明、IEPL 专线
|
||||||
* - 基于归一化后的完整名称做精准去重
|
* - 基于归一化后的完整名称做精准去重
|
||||||
*/
|
*/
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
function operator(proxies) {
|
function operator(proxies) {
|
||||||
const globalCount = Object.create(null);
|
const globalCount = Object.create(null);
|
||||||
const currentCount = Object.create(null);
|
const currentCount = Object.create(null);
|
||||||
@@ -552,7 +553,10 @@ function operator(proxies) {
|
|||||||
);
|
);
|
||||||
Object.values(flagCodeOverrides).forEach(code => knownRegionCodes.add(code));
|
Object.values(flagCodeOverrides).forEach(code => knownRegionCodes.add(code));
|
||||||
|
|
||||||
const escapeRegex = value => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
const regexSpecialChars = new Set(['.', '*', '+', '?', '^', '$', '{', '}', '(', ')', '|', '[', ']', '\\']);
|
||||||
|
const escapeRegex = value => [...value]
|
||||||
|
.map(char => regexSpecialChars.has(char) ? `\\${char}` : char)
|
||||||
|
.join('');
|
||||||
const leadingFlagRegex = /^([\u{1F1E6}-\u{1F1FF}]{2}|🏴☠️)\s*/u;
|
const leadingFlagRegex = /^([\u{1F1E6}-\u{1F1FF}]{2}|🏴☠️)\s*/u;
|
||||||
const inlineFlagRegex = /^(.{1,24}?)([\u{1F1E6}-\u{1F1FF}]{2}|🏴☠️)\s*(.*)$/u;
|
const inlineFlagRegex = /^(.{1,24}?)([\u{1F1E6}-\u{1F1FF}]{2}|🏴☠️)\s*(.*)$/u;
|
||||||
|
|
||||||
@@ -692,15 +696,16 @@ function operator(proxies) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
core = core
|
core = core
|
||||||
.replace(/\[DIP[^\]]*\]/gi, '[DIP]');
|
.replace(/\[DIP.*?]/gi, '[DIP]');
|
||||||
|
|
||||||
core = normalizeBilingualName(core);
|
core = normalizeBilingualName(core);
|
||||||
core = normalizeLeadingRegion(core);
|
core = normalizeLeadingRegion(core);
|
||||||
|
|
||||||
if (/^Pro-\s*/i.test(core)) {
|
if (/^Pro-\s*/i.test(core)) {
|
||||||
core = core.replace(/^(Pro-\s*)(.+)$/i, (fullMatch, proPrefix, restName) => {
|
const proMatch = core.match(/^(Pro-\s*)(.+)$/i);
|
||||||
return `${proPrefix}${normalizeLeadingRegion(restName)}`;
|
if (proMatch) {
|
||||||
});
|
core = `${proMatch[1]}${normalizeLeadingRegion(proMatch[2])}`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
core = core
|
core = core
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
* 核心架构:动态按长度排序编译正则 + 智能边界识别 + O(1) 映射提取
|
* 核心架构:动态按长度排序编译正则 + 智能边界识别 + O(1) 映射提取
|
||||||
* 维护说明:仅需修改 featureMap 字典即可,底部逻辑永远无需改动。
|
* 维护说明:仅需修改 featureMap 字典即可,底部逻辑永远无需改动。
|
||||||
*/
|
*/
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
function operator(proxies) {
|
function operator(proxies) {
|
||||||
// ================= 唯一配置区 =================
|
// ================= 唯一配置区 =================
|
||||||
// 在这里新增或修改关键词。格式:"节点关键词": "想要注入的标签"
|
// 在这里新增或修改关键词。格式:"节点关键词": "想要注入的标签"
|
||||||
@@ -29,7 +30,10 @@ function operator(proxies) {
|
|||||||
const normalizedFeatureMap = {};
|
const normalizedFeatureMap = {};
|
||||||
const featureKeywords = Object.keys(featureMap);
|
const featureKeywords = Object.keys(featureMap);
|
||||||
const normalizeFeatureKeyword = keyword => keyword.toUpperCase().replace(/\s+/g, '');
|
const normalizeFeatureKeyword = keyword => keyword.toUpperCase().replace(/\s+/g, '');
|
||||||
const escapeRegexKeyword = keyword => keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
const regexSpecialChars = new Set(['.', '*', '+', '?', '^', '$', '{', '}', '(', ')', '|', '[', ']', '\\']);
|
||||||
|
const escapeRegexKeyword = keyword => [...keyword]
|
||||||
|
.map(char => regexSpecialChars.has(char) ? `\\${char}` : char)
|
||||||
|
.join('');
|
||||||
for (const featureKeyword of featureKeywords) {
|
for (const featureKeyword of featureKeywords) {
|
||||||
normalizedFeatureMap[normalizeFeatureKeyword(featureKeyword)] = featureMap[featureKeyword];
|
normalizedFeatureMap[normalizeFeatureKeyword(featureKeyword)] = featureMap[featureKeyword];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* YueTong 专用节点清理脚本
|
||||||
|
* 负责去掉“悦·”品牌前缀、钻石等装饰,以及压短 AI 解锁文案。
|
||||||
|
*/
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
|
function operator(proxies) {
|
||||||
|
return proxies.map(proxy => {
|
||||||
|
if (typeof proxy.name !== 'string') {
|
||||||
|
return proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy.name = proxy.name
|
||||||
|
.replace(/悦[·・]\s*/g, '')
|
||||||
|
.replace(/AI解锁/g, 'AI')
|
||||||
|
.replace(/💎/gu, '')
|
||||||
|
.replace(/\s{2,}/g, ' ')
|
||||||
|
.trim();
|
||||||
|
|
||||||
|
return proxy;
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user