diff --git a/img/config.png b/img/config.png new file mode 100644 index 0000000..6ae7cc1 Binary files /dev/null and b/img/config.png differ diff --git a/img/edit.png b/img/edit.png new file mode 100644 index 0000000..4752b0f Binary files /dev/null and b/img/edit.png differ diff --git a/readme.md b/readme.md index 208e274..e307204 100644 --- a/readme.md +++ b/readme.md @@ -1,2 +1,14 @@ # 支語寶 將所有網頁中的指定詞語替換為其他詞語 + +## 設定畫面 +提供新增刪除,以及匯出匯入功能 + +## 使用方式 +1. 可進入設定畫面新增詞彙 +![設定畫面](./img/config.png) +2. 反白想替換的文字,並選擇「替換詞語」 +![替換詞語](./img/edit.png) + +## 其他 +所有程式碼皆為Chatgpt撰寫,並手動修改部分用詞 \ No newline at end of file diff --git a/src/background.js b/src/background.js index 357f3e3..f80b965 100644 --- a/src/background.js +++ b/src/background.js @@ -8,4 +8,39 @@ chrome.runtime.onInstalled.addListener(() => { }); } }); - }); \ No newline at end of file + }); + // 創建右鍵選單 +chrome.runtime.onInstalled.addListener(() => { + chrome.contextMenus.create({ + id: "replaceWord", + title: "替換詞語", + contexts: ["selection"] // 僅在選取文字時顯示 + }); +}); + +// 處理選單點擊事件 +chrome.contextMenus.onClicked.addListener((info, tab) => { + if (info.menuItemId === "replaceWord" && info.selectionText) { + const selectedText = info.selectionText; + // 提示用戶輸入替換詞語 + chrome.scripting.executeScript({ + target: { tabId: tab.id }, + func: (selectedText) => { + const newWord = prompt(`將「${selectedText}」替換為:`, ""); + return { selectedText, newWord }; + }, + args: [selectedText] + }, (results) => { + const { selectedText, newWord } = results[0].result; + if (newWord && newWord !== selectedText) { + // 儲存到 replacements 中 + chrome.storage.local.get("replacements", (data) => { + const replacements = data.replacements || {}; + replacements[selectedText] = newWord; + chrome.storage.local.set({ replacements }); + alert(`已將「${selectedText}」替換為「${newWord}」`); + }); + } + }); + } +}); \ No newline at end of file diff --git a/src/content.js b/src/content.js index b21f6ad..fb390be 100644 --- a/src/content.js +++ b/src/content.js @@ -1,35 +1,42 @@ // 替換文字的函數 function replaceText(node, replacements) { - if (node.nodeType === Node.TEXT_NODE) { - let text = node.nodeValue; - for (let [key, value] of Object.entries(replacements)) { - const regex = new RegExp(key, "g"); - text = text.replace(regex, value); - } - node.nodeValue = text; - } else if (node.nodeType === Node.ELEMENT_NODE) { - node.childNodes.forEach((child) => replaceText(child, replacements)); + if (node.nodeType === Node.TEXT_NODE) { + let text = node.nodeValue; + for (let [key, value] of Object.entries(replacements)) { + const regex = new RegExp(key, "g"); + text = text.replace(regex, value); } + node.nodeValue = text; + } else if (node.nodeType === Node.ELEMENT_NODE) { + node.childNodes.forEach((child) => replaceText(child, replacements)); } - - // 初始化替換 - function initializeReplacements() { - chrome.storage.local.get("replacements", (data) => { - const replacements = data.replacements || {}; - replaceText(document.body, replacements); - - // 監控動態內容 - const observer = new MutationObserver((mutations) => { - mutations.forEach((mutation) => { - mutation.addedNodes.forEach((node) => { - if (node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.TEXT_NODE) { - replaceText(node, replacements); - } - }); +} + +// 初始化替換 +function initializeReplacements() { + chrome.storage.local.get("replacements", (data) => { + const replacements = data.replacements || {}; + replaceText(document.body, replacements); + + // 監控動態內容 + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + mutation.addedNodes.forEach((node) => { + if (node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.TEXT_NODE) { + replaceText(node, replacements); + } }); }); - observer.observe(document.body, { childList: true, subtree: true }); }); + observer.observe(document.body, { childList: true, subtree: true }); + }); +} + +// 監聽 storage 更新,動態更新替換內容 +chrome.storage.onChanged.addListener((changes) => { + if (changes.replacements) { + initializeReplacements(); } - - initializeReplacements(); \ No newline at end of file +}); + +initializeReplacements(); diff --git a/src/manifest.json b/src/manifest.json index c7da974..c84b3a1 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 3, "name": "支語寶", - "version": "0.1.0 alpha", + "version": "0.1.0", "description": "將所有網頁中的指定詞語替換為其他詞語。", - "permissions": ["storage", "activeTab", "scripting"], + "permissions": ["storage", "activeTab", "scripting", "contextMenus"], "host_permissions": [""], "background": { "service_worker": "background.js" diff --git a/src/options.html b/src/options.html index 77b5791..2877138 100644 --- a/src/options.html +++ b/src/options.html @@ -6,7 +6,7 @@ 支語寶