From 4935abcf333ebddf1f4ba8285b932cbbd2617b4b Mon Sep 17 00:00:00 2001 From: Gabe Date: Fri, 26 Sep 2025 12:40:19 +0800 Subject: [PATCH] feat: Merge default items when saving rule --- src/content.js | 4 +++- src/libs/rules.js | 27 ++++++++++++++++++++------- src/libs/utils.js | 16 ++++++++++++++++ src/views/Popup/index.js | 25 ++++++++++++++++++------- 4 files changed, 57 insertions(+), 15 deletions(-) diff --git a/src/content.js b/src/content.js index 3dc1433..ba58646 100644 --- a/src/content.js +++ b/src/content.js @@ -1,3 +1,5 @@ import { run } from "./common"; -run(); +if (document.documentElement && document.documentElement.tagName === "HTML") { + run(); +} diff --git a/src/libs/rules.js b/src/libs/rules.js index 953b01e..b95264d 100644 --- a/src/libs/rules.js +++ b/src/libs/rules.js @@ -6,6 +6,7 @@ import { OPT_LANGS_FROM, OPT_LANGS_TO, // OPT_TIMING_ALL, + DEFAULT_RULE, GLOBLA_RULE, DEFAULT_API_TYPE, } from "../config"; @@ -222,16 +223,28 @@ export const checkRules = (rules) => { /** * 保存或更新rule - * @param {*} newRule + * @param {*} curRule */ -export const saveRule = async (newRule) => { +export const saveRule = async (curRule) => { const rules = await getRulesWithDefault(); - const rule = rules.find((item) => isMatch(newRule.pattern, item.pattern)); - if (rule && rule.pattern !== GLOBAL_KEY) { - Object.assign(rule, { ...newRule, pattern: rule.pattern }); - } else { - rules.unshift(newRule); + + const index = rules.findIndex( + (item) => + item.pattern !== GLOBAL_KEY && isMatch(curRule.pattern, item.pattern) + ); + if (index !== -1) { + const rule = rules.splice(index, 1)[0]; + curRule = { ...rule, ...curRule, pattern: rule.pattern }; } + + const newRule = {}; + Object.entries(GLOBLA_RULE).forEach(([key, val]) => { + newRule[key] = + !curRule[key] || curRule[key] === val ? DEFAULT_RULE[key] : curRule[key]; + }); + + rules.unshift(newRule); await setRules(rules); + trySyncRules(); }; diff --git a/src/libs/utils.js b/src/libs/utils.js index 89a1b2c..5b325f3 100644 --- a/src/libs/utils.js +++ b/src/libs/utils.js @@ -317,3 +317,19 @@ export const scheduleIdle = (cb, timeout = 200) => { } return setTimeout(cb, timeout); }; + +/** + * 截取url部分 + * @param {*} href + * @returns + */ +export const parseUrlPattern = (href) => { + if (href.startsWith("file")) { + const filename = href.substring(href.lastIndexOf("/") + 1); + return filename; + } else if (href.startsWith("http")) { + const url = new URL(href); + return url.host; + } + return href; +}; diff --git a/src/views/Popup/index.js b/src/views/Popup/index.js index d55c79e..9b3204d 100644 --- a/src/views/Popup/index.js +++ b/src/views/Popup/index.js @@ -28,13 +28,16 @@ import { sendIframeMsg } from "../../libs/iframe"; import { saveRule } from "../../libs/rules"; import { tryClearCaches } from "../../libs"; import { kissLog } from "../../libs/log"; +import { parseUrlPattern } from "../../libs/utils"; // 插件popup没有参数 // 网页弹框有 export default function Popup({ setShowPopup, translator }) { const i18n = useI18n(); const [rule, setRule] = useState(translator?.rule); - const [transApis, setTransApis] = useState(translator?.setting?.transApis || []); + const [transApis, setTransApis] = useState( + translator?.setting?.transApis || [] + ); const [commands, setCommands] = useState({}); const handleOpenSetting = () => { @@ -85,16 +88,24 @@ export default function Popup({ setShowPopup, translator }) { const handleSaveRule = async () => { try { - let href = window.location.href; + let href = ""; if (!translator) { const tab = await getCurTab(); href = tab.url; - } - const newRule = { ...rule, pattern: href.split("/")[2] }; - if (isExt && translator) { - sendBgMsg(MSG_SAVE_RULE, newRule); } else { - saveRule(newRule); + href = window.location?.href; + } + + if (!href || typeof href !== "string") { + return; + } + + const pattern = parseUrlPattern(href); + const curRule = { ...rule, pattern }; + if (isExt && translator) { + sendBgMsg(MSG_SAVE_RULE, curRule); + } else { + saveRule(curRule); } } catch (err) { kissLog("save rule", err);