refactor(core): ♻️ 重构节点重命名脚本以支持字典驱动架构
采用字典配置化匹配逻辑,通过特征码映射实现灵活的属性注入,并引入中缀插入机制与幂等性校验,提升脚本的可维护性与扩展性。
This commit is contained in:
@@ -1,56 +1,61 @@
|
|||||||
/**
|
/**
|
||||||
* 节点名称追加 ISP 信息脚本
|
* Sub-Store 节点名称属性注入脚本 (字典驱动架构版)
|
||||||
* 逻辑:保留原名,在末尾添加 " [中文简称]"
|
* 核心逻辑:基于规则字典匹配节点特征,自动提取并注入网络属性至后缀前。
|
||||||
* 优先级:先匹配具体的线路标识(S1-S4, E1-E2),最后匹配 GTM 或 TEST
|
* 包含机制:前瞻正则匹配、幂等性校验、中缀注入。
|
||||||
|
* * 参考文档 (MDN RegExp): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp
|
||||||
*/
|
*/
|
||||||
function operator(proxies) {
|
function operator(proxies) {
|
||||||
|
// 1. 定义映射规则字典 (Rule Dictionary)
|
||||||
|
// 采用数组形式以严格控制匹配优先级 (特例优先,通用兜底)
|
||||||
|
// pattern: 匹配特征的正则表达式 (\b 用于确保单词边界,防止错配)
|
||||||
|
// payload: 需要注入的属性内容
|
||||||
|
const rules = [
|
||||||
|
{ pattern: /GTM\s*0\.5x/i, payload: "三网" }, // 匹配截图中的 GTM 0.5x
|
||||||
|
{ pattern: /GTM/i, payload: "三网" }, // 匹配截图中的 通用 GTM
|
||||||
|
{ pattern: /\bS1\b/i, payload: "广移" }, // 匹配截图中的 S1
|
||||||
|
{ pattern: /\bS2\b/i, payload: "广电信" },
|
||||||
|
{ pattern: /\bS3\b/i, payload: "广移" },
|
||||||
|
{ pattern: /\bS4\b/i, payload: "广联通" },
|
||||||
|
{ pattern: /\bBGP\b/i, payload: "cn2|5x" } // 新增:匹配 BGP 节点
|
||||||
|
];
|
||||||
|
|
||||||
return proxies.map(p => {
|
return proxies.map(p => {
|
||||||
let suffix = "";
|
let name = p.name;
|
||||||
const name = p.name;
|
let injectPayload = "";
|
||||||
|
|
||||||
// 1. 广东系列线路 (S1-S4)
|
// 2. 遍历规则字典,执行特征匹配
|
||||||
// 使用正则匹配连字符或空格后的标识符,确保不会误触 (例如防止 US1 误匹配 S1)
|
for (const rule of rules) {
|
||||||
if (/(?:^|[- ])S1\b/i.test(name) || /(?:^|[- ])S3\b/i.test(name)) {
|
if (rule.pattern.test(name)) {
|
||||||
suffix = "广移";
|
injectPayload = rule.payload;
|
||||||
}
|
break; // 命中最高优先级规则后立即熔断跳出
|
||||||
else if (/(?:^|[- ])S2\b/i.test(name)) {
|
|
||||||
suffix = "广电";
|
|
||||||
}
|
|
||||||
else if (/(?:^|[- ])S4\b/i.test(name)) {
|
|
||||||
suffix = "广联";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 江苏/浙江系列线路 (E1-E2)
|
|
||||||
else if (/(?:^|[- ])E1\b/i.test(name)) {
|
|
||||||
suffix = "苏移";
|
|
||||||
}
|
|
||||||
else if (/(?:^|[- ])E2\b/i.test(name)) {
|
|
||||||
suffix = "浙移";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 动态解析线路 (GTM)
|
|
||||||
else if (/GTM/i.test(name)) {
|
|
||||||
suffix = "三网";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. 测试线路 (TEST)
|
|
||||||
else if (/TEST/i.test(name)) {
|
|
||||||
suffix = "测试";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 5. Anytls 直连线路
|
|
||||||
else if (/Anytls/i.test(name)) {
|
|
||||||
suffix = "直连";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 执行名称追加
|
|
||||||
if (suffix) {
|
|
||||||
// 检查是否已经存在该后缀,避免重复添加
|
|
||||||
if (!name.includes(`[${suffix}]`)) {
|
|
||||||
p.name = `${name} [${suffix}]`;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return p;
|
// 3. 边界处理:未命中任何规则,返回原节点以保证零副作用
|
||||||
|
if (!injectPayload) return p;
|
||||||
|
|
||||||
|
// 4. 构建标准化注入片段 (例如: " [cn2|5x]")
|
||||||
|
const formatStr = ` [${injectPayload}]`;
|
||||||
|
|
||||||
|
// 5. 幂等性校验 (防 Bug 机制)
|
||||||
|
// 如果节点名中已经包含了当前要注入的格式化字符串,则直接跳过,防止多次执行产生重复后缀
|
||||||
|
if (name.includes(formatStr)) {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 执行中缀注入 (Infix Injection)
|
||||||
|
// 匹配节点末尾的品牌标识 (允许前后有任意数量的空格,忽略大小写)
|
||||||
|
// (.*)$ 用于捕获 SNTP 后面的所有内容(如果有的话)
|
||||||
|
const suffixRegex = /(\s*-\s*SNTP.*)$/i;
|
||||||
|
|
||||||
|
if (suffixRegex.test(name)) {
|
||||||
|
// 命中后缀:使用 replace 方法,将注入片段放置在后缀 ($1) 之前
|
||||||
|
p.name = name.replace(suffixRegex, `${formatStr}$1`);
|
||||||
|
} else {
|
||||||
|
// 未命中后缀:作为纯净节点 (如 🇭🇰 HK-BGP-1),直接在字符串最末尾追加
|
||||||
|
p.name = name + formatStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p; // 返回处理后的节点对象
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user