diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3859d9b --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,68 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## 專案性質 + +單一檔案 UserScript(ScriptCat / Tampermonkey),把 GitHub 介面翻成台灣繁體中文。全部邏輯在 `github-zh-tw.user.js`,**沒有** package.json、建置腳本、測試套件、lint 設定、相依套件。 + +## 開發流程 + +改 `github-zh-tw.user.js` 後: + +1. **驗證只能手動**:在瀏覽器裝 ScriptCat/Tampermonkey,把整份檔案貼進「新增腳本」,存檔後強制重載 `https://github.com/*` 驗結果。沒有自動化測試可跑。 +2. **發版**:改內容時同時修腳本檔開頭 `@version`(UserScript header 用這個判斷更新)。`DEVELOPMENT.md` 記錄了每個版本的改動脈絡,重大改動順手補一段。 +3. **不要**建立 `package.json` / 加 build 工具 / 加 npm 相依。檔案必須保持能直接貼進 Tampermonkey 就跑。 + +## 核心架構(動一行詞庫前先讀完) + +所有邏輯在 IIFE 內,四個關鍵結構: + +1. **`TRANSLATION_MAP`**(`Map`)— 英→中詞庫,按語意分類排列。建構時會依字串長度排序成 `WORD_BOUNDARY_REGEX`,**長詞優先**匹配。 +2. **`LOWER_MAP`** — 小寫鍵的查表。regex 用 `gi` 旗標(大小寫不敏感)匹配後,以小寫查譯文。 +3. **`SKIP_CONTEXT_SELECTOR`** — 使用者內容脈絡白名單(檔名、commit 訊息、repo 描述、Topics、README、程式碼、Issue/PR 標題、使用者名稱、搜尋框語法…)。`shouldSkipTextAncestor` 用 `el.closest(...)` 判斷祖先是否落在這些 selector。 +4. **`SKIP_TAGS`** — `SCRIPT/STYLE/CODE/PRE/INPUT/TEXTAREA/NOSCRIPT`。文字節點跳過,但**屬性仍會翻**(`` 會翻,輸入內容不動)。 + +### 替換流程(`replaceText` 三層,順序不可交換) + +``` +TIME_AGO_REGEX "3 days ago" → "3 天前" ← 先跑,避免 days 被當詞庫吃掉 +WORD_BOUNDARY_REGEX 詞庫整批替換 ← 長詞優先 +ABBREV_REGEX "62.8k" → "6.3 萬" ← 最後,避開 k/M 在詞庫中撞到 +``` + +### 掃描策略 + +- 文字節點:`TreeWalker(SHOW_TEXT)` 走全部,靠 `shouldSkipTextAncestor` 剔除。**不用** SCAN 白名單(v0.12 拿掉了,白名單會漏 `