From 41a777cd1eaba23181b0b0aa04ba89fc14876f0f Mon Sep 17 00:00:00 2001 From: may05 Date: Thu, 23 Jul 2026 05:55:58 +0800 Subject: [PATCH] =?UTF-8?q?release:=20=E6=9B=B4=E6=96=B0=E6=99=BA=E6=85=A7?= =?UTF-8?q?=E5=84=AA=E5=85=88=E6=B3=A8=E9=9F=B3=E7=A9=A9=E5=AE=9A=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/windows.yml | 5 +- AGENTS.md | 91 ++- AI_MAINTENANCE.md | 44 +- README.md | 46 +- THIRD_PARTY_NOTICES.txt | 8 +- bopomofo_core/autocorrect.py | 115 ++++ bopomofo_core/data/common_typos.json | 67 ++ bopomofo_core/frequency_lexicon.py | 13 + bopomofo_core/libchewing_provider.py | 63 +- bopomofo_core/phonetic_corrector.py | 187 ++++++ bopomofo_core/session.py | 43 +- bopomofo_core/taiwan_frequency.py | 37 +- build_pime_overlay.ps1 | 14 + build_release.ps1 | 2 +- install.ps1 | 21 +- installer/SmartPriorityBopomofo.nsi | 5 +- installer/install.ps1 | 237 ++++++- installer/native_ui_preference.ps1 | 115 ++++ installer/uninstall.ps1 | 92 +++ native_ui/LGPL-2.0.txt | 502 +++++++++++++++ native_ui/README.md | 27 + native_ui/bin/x64/PIMETextService.dll | Bin 0 -> 486912 bytes native_ui/bin/x86/PIMETextService.dll | Bin 0 -> 414720 bytes native_ui/build_native_ui.ps1 | 54 ++ native_ui/src/CMakeLists.txt | 43 ++ native_ui/src/CandidateWindow.cpp | 439 +++++++++++++ pime_module/ime.json | 2 +- pime_module/pinned_bopomofo_ime.py | 474 +++++++++++--- pime_runtime/libchewing/data/swkb.dat | 52 +- pime_runtime/libchewing/data/symbols.dat | 44 +- tests/native_ui_preference_smoke.ps1 | 69 ++ tests/pime_adapter_smoke.py | 783 ++++++++++++++++++++++- tests/pime_all_readings_audit.py | 140 ++++ tests/test_autocorrect.py | 84 +++ tests/test_common_usage.py | 60 +- tests/test_frequency_lexicon.py | 5 + tests/test_phonetic_corrector.py | 161 +++++ tests/test_session.py | 36 +- tests/test_taiwan_frequency.py | 14 + 39 files changed, 3989 insertions(+), 205 deletions(-) create mode 100644 bopomofo_core/autocorrect.py create mode 100644 bopomofo_core/data/common_typos.json create mode 100644 bopomofo_core/phonetic_corrector.py create mode 100644 installer/native_ui_preference.ps1 create mode 100644 native_ui/LGPL-2.0.txt create mode 100644 native_ui/README.md create mode 100644 native_ui/bin/x64/PIMETextService.dll create mode 100644 native_ui/bin/x86/PIMETextService.dll create mode 100644 native_ui/build_native_ui.ps1 create mode 100644 native_ui/src/CMakeLists.txt create mode 100644 native_ui/src/CandidateWindow.cpp create mode 100644 tests/native_ui_preference_smoke.ps1 create mode 100644 tests/pime_all_readings_audit.py create mode 100644 tests/test_autocorrect.py create mode 100644 tests/test_phonetic_corrector.py diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 54999a9..5f994cb 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -22,6 +22,9 @@ jobs: - name: Run unit tests shell: pwsh run: python -m unittest discover -s tests -v + - name: Test native UI preference persistence + shell: powershell + run: .\tests\native_ui_preference_smoke.ps1 - name: Build PIME overlay shell: powershell run: .\build_pime_overlay.ps1 @@ -43,5 +46,5 @@ jobs: uses: softprops/action-gh-release@v2 with: files: | - release/Smart-Priority-Bopomofo-Setup-0.4.2.exe + release/Smart-Priority-Bopomofo-Setup-0.6.0.exe release/SHA256SUMS.txt diff --git a/AGENTS.md b/AGENTS.md index ad673a5..4972e65 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -23,6 +23,7 @@ When PIME is installed, also run: ```powershell & 'C:\Program Files (x86)\PIME\python\python3\python.exe' ./tests/pime_adapter_smoke.py +& 'C:\Program Files (x86)\PIME\python\python3\python.exe' ./tests/pime_all_readings_audit.py ``` ## Protected interaction contracts @@ -30,24 +31,78 @@ When PIME is installed, also run: - Tapping Shift toggles persistent Chinese/English mode. - Holding Shift and pressing A-Z emits one temporary uppercase English letter without changing modes. Pending Chinese must be committed before the letter. -- Shift punctuation, the five-item candidate menu, candidate expansion, and - right-side character editing are core behaviors. Do not replace or remove - them without an explicit user request. +- Shift punctuation, ten-item two-column candidate pages, Right/Down pagination, + and right-side character editing are core behaviors. The left column must + contain 1-5 from top to bottom and the right column 6-0; never bind A-J as + candidate labels. Do not replace or + remove these behaviors without an explicit user request. - Candidate editing must offer and atomically apply common/personal phrases - spanning 2-12 syllables while keeping single-character choices available in - the compact five-row menu. + spanning 2-12 syllables while keeping high-frequency single-character and + literal-Zhuyin choices available on the first ten-item page. At the end of + the composition, phrase/sentence choices lead. After the caret moves inside + the composition, the single character to its right must lead, so candidate + 1 locks only that syllable and advances instead of confirming the sentence. +- Automatic composition and the candidate editor share + `_ranked_phrase_options()`. Conservative fuzzy-reading and exact typo + corrections must enter that function as visible whole-sentence candidates; + Enter must never perform a hidden final rewrite. Before opening Down or + committing through any path, `_apply_phrase_ranking()` must synchronize the + editable buffer. A better whole-buffer candidate must never be hidden behind + Down; arrows are for overriding the default, not obtaining a default the + engine already knew. - Ranking order is a core contract: an explicit user candidate selection is first. Bundled candidates compare exact reading-span coverage before source weight, so a shorter suffix cannot overwrite a longer complete conversion; equal spans prefer Taiwan character/word frequencies, then engine/Rime. + A stored single-character pin stays candidate zero for isolated input but + is not a context lock; a reliable word or whole-buffer conversion may + override it. Only a choice made explicitly in the current composition or a + learned personal phrase locks its covered segments. Automatic commits must not silently teach the personal stores. -- Activation, a Windows keyboard-close status, and forced focus termination - restore the profile to keyboard-open Bopomofo mode. Password fields and apps - that explicitly disable IMEs remain under Windows control. -- Numpad 0-9 and VK_DECIMAL always emit digits/dot and never Bopomofo or - candidate numbers. +- Single-character ranking preserves libchewing's reading-aware dictionary + default, then uses global Taiwan frequency for the remaining tail. Global + frequency has no pronunciation information and must never promote a common + alternate-reading character such as 員 over 運 for ㄩㄣˋ. +- Text/weight-only frequency indexes are search aids, not pronunciation + evidence. Before a corpus phrase or fuzzy-reading correction changes live + text, validate the complete span through `phrase_candidates(readings)`. + Character-column membership alone must never let an alternate reading + borrow an unrelated word (for example 貝殼 for ㄅㄟˋ ㄑㄩㄝˋ). +- Autocorrection is conservative, offline, and visible before commit. Apply + only exact, same-length high-confidence rules from `data/common_typos.json` + as whole-sentence candidates. A currently selected candidate or a learned + personal phrase is protected and must outrank every autocorrection rule; a + stored single-character pin alone is not a context lock. Do not add + context-dependent pairs such as 的/得/地 or + 在/再 as unconditional replacements, and never upload text for correction. +- Unlocked spans are re-ranked live from their retained Bopomofo readings + through `phonetic_corrector.py` and the bundled phrase indexes. Reviewed + fuzzy phonetic-slot confusions and fallback typo rules must become visible + whole-sentence candidates before Enter. Surface variants such as 音該/英該 + must not be enumerated as separate rules, and a valid exact-reading phrase + must be preserved as an alternate candidate. +- Activation and forced focus termination reset only the profile's internal + Shift toggle. Respect the TSF keyboard-open state supplied by the host; + never reopen a compartment after an app closes it. This prevents games and + secure/custom controls from entering an open/close feedback loop. +- Numpad 0-9, decimal, divide, multiply, subtract, and add always emit their + literal ASCII characters and never Bopomofo or candidate numbers. Shift+A-Z and Shift punctuation replace only an unfinished active syllable, preserve completed Chinese, and emit at the active caret. +- Literal Bopomofo is a core behavior. For any lone initial, medial, or rime, + Space first asks the dictionary for the corresponding first-tone Chinese + syllable; do not classify every initial as invalid because ㄙ and ㄓ, + and similar syllabic initials are real readings. When candidate zero is + Chinese, it is auto-selected and raw Zhuyin stays within the first four + candidates. When candidate zero is literal Zhuyin, open the literal-first + menu even if libchewing appended obscure Han characters to the tail. + Completed readings also offer their literal spelling within the + first four candidates, including sentence editing. With no active syllable, + bare DaQian tone keys emit their + tone marks (3=ˇ, 6=ˊ, 4=ˋ, 7=˙), while Shift+Space emits ˉ. Numpad digits + and operators remain literal text. When completed segments already exist, + raw Zhuyin and bare tone marks stay as protected segments in the editable + composition; they must not commit the surrounding text like Enter. - Feedback collection records only explicit conversion corrections. Never add surrounding text, application identity, automatic upload, or a network call to the IME runtime. The user must review records before opening a report. @@ -57,8 +112,24 @@ When PIME is installed, also run: - `bopomofo_core/data/taiwan_frequency.json` is generated from the Ministry of Education's official open-data character and word tables. Never hand-edit it; preserve attribution, source hashes, generator, and data notice. +- `bopomofo_core/data/common_typos.json` is a reviewed source-attributed rule + list. Keep source identifiers and URLs, require equal-length replacements, + and add regression tests for every policy change. - Add a regression assertion to `tests/pime_adapter_smoke.py` whenever a core interaction is fixed. +- Single-character ranking changes must also pass + `tests/pime_all_readings_audit.py`, which enumerates every Bopomofo slot and + tone combination accepted by libchewing. Never replace this with a handful + of reported syllable examples. +- Candidate font, grid width, labels, and navigation can be changed through + PIME's Python protocol. The authorized native style lives under `native_ui/` + and is built from the exact bundled PIME `v1.3.0-stable` source. Install it + only through the explicit `-EnableUnsignedNativeUi` opt-in, only when PIME + has no unrelated modules, preserve the original DLLs, and restore them only + when the installed hashes still match our build. Fresh installs keep the + signed DLLs for game compatibility. Once opted in, persist that preference + across normal and EXE updates; never silently restore the signed UI during + a Python-layer update. `-DisableUnsignedNativeUi` is the explicit rollback. Run `./build_release.ps1` for a distributable installer. Update all version locations together when cutting a new version. diff --git a/AI_MAINTENANCE.md b/AI_MAINTENANCE.md index 99c43a4..4b7a68b 100644 --- a/AI_MAINTENANCE.md +++ b/AI_MAINTENANCE.md @@ -19,9 +19,46 @@ - `bopomofo_core/pinned_store.py`:單一讀音的個人優先字。 - `bopomofo_core/phrase_store.py`:使用者確認過的 2–12 字詞語。 - `bopomofo_core/frequency_lexicon.py`:離線高頻詞索引查詢;資料位於 `bopomofo_core/data/`。 +- `bopomofo_core/autocorrect.py`:產生可見完整句候選的離線高可信錯字修正;規則位於 `bopomofo_core/data/common_typos.json`。 +- `bopomofo_core/phonetic_corrector.py`:以每個字保留的注音、候選欄與常用詞庫重新解碼;同一讀音或保守的注音槽位混淆不應展開成大量表面錯字規則。 - `tools/build_frequency_lexicon.py`:從固定版本 Rime Essay 重建臺灣正體高頻詞索引。生成的 JSON 不應手工修改。 - `tests/`:核心與 PIME 整合測試。 - `installer/`:正式安裝與解除安裝流程。 +- `native_ui/`:候選框的完整 LGPL 原始碼、可重現建置腳本及 x86/x64 產物。 + +候選視窗的字型、每列數量、選擇標籤與方向鍵行為由 Python 模組控制;圓角、顏色、 +邊框與選取樣式位於 `native_ui/src/CandidateWindow.cpp`。原生元件固定從隨附的 +PIME `v1.3.0-stable` 重建,但它沒有正式程式碼簽章,可能與遊戲反作弊衝突。 +全新安裝與尚未選擇介面的使用者保留 PIME 原廠簽章 DLL;只有使用者明確傳入 +`-EnableUnsignedNativeUi` 且沒有其他 PIME 模組時才首次套用自訂 DLL。這項選擇必須 +跨一般更新、EXE 與 AI 維護持久保存,除非明確傳入 `-DisableUnsignedNativeUi`,不得在 +更新 Python 層時恢復舊簽章介面。安裝器須備份與還原原始 DLL;被 TSF 鎖定時以 +`MoveFileEx` 排程至重開機,不能把這些限制拿掉。 + +候選窗每頁固定 10 個、分成兩個直欄:左欄由上而下 `1–5`,右欄由上而下 `6–0`;`→` 直接翻到下一頁,`↓` 依數字順序逐項移動並在 +本頁末端翻頁。完整讀音的原始注音須留在前四個候選。單獨注音按空白時一律先向 +字典查詢補上一聲後的候選,不可單靠 initial/medial/rime 分類判定,因為 `ㄙ`、 +`ㄓ` 等聲母本身也是完整音節。字典候選零是中文字時直接採用;候選零仍是原注音 +時必須開啟原符號第一的選單,不可讓尾端生僻字自動勝出。原注音仍須保留在前四項。 +沒有作用中的音節時,大千聲調鍵直接輸出符號(3=ˇ、6=ˊ、4=ˋ、7=˙);已有未提交 +文字時,聲調與候選中的原始注音須以受保護片段插入同一組字區,不得提交其他片段。 +右側數字鍵盤的數字、小數點與 `/ * - +` 必須直接輸出原字元,不可進入注音映射。 + +精確注音、保守模糊讀音與補充錯字規則都必須先產生可見的完整句候選,並即時更新 +未鎖定的組字內容;Enter 不得在送出瞬間暗中改字。原始精確讀音句要保留為後續候選。 +規則必須等長、精確、高可信且附來源。當次親自選字與個人詞彙所涵蓋的字元須設為保護範圍; +已儲存的單字優先只控制單一讀音排序,不得鎖死整句脈絡。`的/得/地`、`在/再`、合法異形詞等需要語境的 +項目不可加入無條件規則。執行期間不得傳送文字到網路,也不得把自動修正當成個人學習。 + +完整句預設與候選視窗必須共用 `_ranked_phrase_options()`;開啟候選及任何送出動作前 +都要先執行 `_apply_phrase_ranking()`。禁止新增只在候選視窗可見、但不會同步到組字區 +的另一套第一候選邏輯,也禁止在 Enter 路徑另外做不可見修正。方向鍵是改選功能, +不是取得系統已知正解的必要步驟。 + +Rime Essay 與台灣字頻只有文字/權重,沒有完整詞語讀音;其逐字候選交集只能用來搜尋, +不可直接更改組字。任何高頻詞或模糊音修正都必須再經 `phrase_candidates(readings)` +驗證整段讀音。游標在句中時,候選零必須是游標右側的單字候選,選擇後只鎖定涵蓋的 +音節並前進;詞語與完整句候選保留在同一頁。游標在句尾時才可把完整句/詞語排在前面。 ## 修改後必須驗證 @@ -29,6 +66,8 @@ python -m unittest discover -s tests -v .\build_pime_overlay.ps1 & 'C:\Program Files (x86)\PIME\python\python3\python.exe' .\tests\pime_adapter_smoke.py +& 'C:\Program Files (x86)\PIME\python\python3\python.exe' .\tests\pime_all_readings_audit.py +.\native_ui\build_native_ui.ps1 .\build_release.ps1 ``` @@ -63,7 +102,10 @@ Git Bash 使用: - `tools/build_taiwan_frequency.py` 從教育部字頻/詞頻 CSV 重建台灣預設排序; `bopomofo_core/data/taiwan_frequency.json` 是產物,不可手改。 -- 使用者明確選擇永遠最高;內建候選先比較詞彙涵蓋的音節數,較短後綴不可 +- 單字候選必須保留 libchewing 讀音字典的第一項,再用全域台灣字頻整理其餘候選; + 全域字頻不含讀音資訊,不得讓多音字(例如 `員`)覆蓋 `ㄩㄣˋ→運` 等讀音首選。 +- 當次使用者明確選擇永遠最高;儲存的單字優先在孤立讀音中列為候選零,但可靠的 + 整詞/整句脈絡可覆蓋它。內建候選先比較詞彙涵蓋的音節數,較短後綴不可 覆蓋較長完整轉換,涵蓋相同時再依台灣官方字詞頻、其他內建詞庫排序。 一般送出文字不可自動強化個人權重。 - `bopomofo_core/feedback_store.py` 與 `feedback-report.ps1` 只保存明確改選 diff --git a/README.md b/README.md index fb79464..3786728 100644 --- a/README.md +++ b/README.md @@ -18,25 +18,30 @@ Git Bash 使用者可把最後一行改為 `./install.sh`。 ## 主要功能 - 注音聲母、介音、韻母與聲調可用任意順序輸入;同類按鍵會取代舊值,不會誤接成下一句。 -- 完成一個注音後自動採用第一候選,不必每字按空白鍵。 -- `↓` 開啟前 5 個候選;繼續向下超過第 5 個時,展開最多 20 個實用候選,不列出整條生僻字尾。 -- 編輯選字時會優先列出游標附近的 2–12 字常用/個人詞彙,選擇後整個詞一次更新;前五項仍保留單字候選,不會犧牲逐字編輯。 -- 選過的單字會記成該讀音的第一優先,之後先出現。 -- 會參考 libchewing 詞庫、Rime Essay 轉製的 113,738 條臺灣正體高頻詞,以及使用者確認過的 2–12 字詞,改善「優化、樹葉、人工智慧」一類上下文選字。 +- 完成一個注音後自動採用第一候選,不必每字按空白鍵。單字先保留讀音字典的首選,再以台灣字頻整理後續候選,避免全域高頻的多音字誤蓋正確讀音,例如 `ㄩㄣˋ` 固定先出「運」而不是通常讀作 `ㄩㄢˊ` 的「員」。 +- `↓` 開啟候選,每頁像微軟注音一樣顯示兩個直欄:左欄由上而下為 `1–5`,右欄為 `6–0`,不以英文字母選字。按 `→` 前往下一頁,或用 `↓` 依數字順序移動並在第 10 項後翻頁,最多保留 20 個實用候選。 +- 在句尾開啟選字時,會先列完整句修正及游標附近的 2–12 字個人/常用詞彙;把游標移進句中後,則先列游標右側的單字候選,並在同一頁保留詞語/整句候選。這樣按 `1` 只會鎖定正在編輯的音節並自動前往下一字,不會意外確認整句;選擇詞語時仍會一次更新整個詞。 +- 選過的單字會記成該讀音的第一優先,單獨輸入時先出現;可靠的整詞/整句脈絡仍可調整它,避免舊的「仙/不」偏好阻止「你先開始下一步吧」。當次在組字區親自選定的字仍會鎖定。 +- `ㄉㄜ˙`、`ㄗㄨㄛˋ`、`ㄕˋ` 的台灣預設第一候選分別固定為「的、做、是」;只有使用者親自改選其他字時,個人學習才會暫時排在它前面。 +- 會參考 libchewing 詞庫、Rime Essay 轉製的 113,738 條臺灣正體高頻詞,以及使用者確認過的 2–12 字詞,改善「優化、樹葉、人工智慧」一類上下文選字。文字型高頻詞必須再通過整段注音驗證,避免把罕見破音字拼成讀音不符的詞,例如不會把 `ㄅㄟˋ ㄑㄩㄝˋ` 誤判成「貝殼」。 - 「不」在 `ㄅㄨˋ` 中優先,並內建「不要、不是」及「再見、現在、跟在」等保守的繁體中文常用規則;有歧義的「在做/再做」仍由上下文判斷。 +- 組字時會持續以精確注音、保守近音判斷與離線常用詞庫更新整段第一候選,讓「優仙→優先」「部合理→不合理」以及把 `ㄣ/ㄥ` 混淆成 `ㄧㄣ ㄍㄞ` 的「音該→應該」直接成為可見的整句首選,不必等到按 `Enter` 才暗中變字,也不必逐一列舉錯字表面形式。另有 46 條高可信用字規則處理「以經→已經」「迫不急待→迫不及待」等錯字;當次親自選定或個人詞彙鎖定的字不會被覆蓋。 +- 自動組字與候選視窗共用同一份詞彙排序;若候選系統已把完整句修正排在第一,組字區會先直接採用,不必按 `↓` 才取得正確答案,原始精確讀音句則保留在後續候選供明確改選。按 `↓`、空白、Enter、標點、Shift 或切換輸入框前都會再次同步第一候選;Enter 只提交畫面上已採用的文字,方向鍵只用來改選其他答案。 - 整段尚未送出的文字均可編輯;候選目標位於游標右邊,選完會前往下一字。 - 在段落中間按 Backspace 刪除後,下一個注音會補進原位置,不會跳到最右邊。 - 短按 `Shift` 切換中英文;按住 `Shift` 再按字母則暫時輸入大寫英文且不切換模式。兩種操作都會正確處理尚未完成或尚未送出的注音,不會讓英文跳到中文字前方。 -- 啟用輸入法、切換輸入框或 Windows 關閉中文鍵盤狀態時會恢復注音模式;密碼欄位或明確停用輸入法的應用程式仍由 Windows 決定。 -- 常用 `Shift` 標點包括 `?`、`:`、`+`、`——`、`,`、`。`、`『』` 與 `"`。 +- 啟用輸入法、切換輸入框或組字被強制終止時只重設內部的中英文切換,不會強制改寫應用程式的 TSF 開關;遊戲、密碼欄位或明確停用輸入法的控制項可保持關閉,避免反覆開關造成凍結。 +- 完整盤點標準鍵盤的 `Shift` 組合:數字列、`?`、`:`、`+`、`——`、`,`、`。`、`『』`、`「」`、`~` 與 `|` 都有明確輸出;`Shift+Tab`、`Shift+F1–F12`、`Ctrl+Shift` 與 `Alt+Shift` 仍交給應用程式或 Windows。 +- 單獨注音按空白時會先依字典補上一聲:字典第一候選是中文字就直接採用,例如 `ㄧ→一`、`ㄚ→啊/阿`,而 `ㄙ`、`ㄓ` 也會進入司/思、之/知等中文字候選;第一候選仍是原注音時則開啟候選單,不讓尾端生僻字冒充常用字。原始注音仍保留在第一頁前四項。完整的 `ㄢˊ` 等讀音同樣保留原注音候選。沒有正在組字時,直接按大千聲調鍵 `3`、`6`、`4`、`7` 會輸出 `ˇ`、`ˊ`、`ˋ`、`˙`;已有未提交文字時,原始注音與聲調會插入同一個可編輯組字區,不會產生 Enter 式提交。`Shift+Space` 輸出 `ˉ`。 - 快速重疊按鍵有實體鍵碼備援,降低漏掉前一個注音符號的機率。 +- 候選依微軟注音習慣先排滿左欄 `1–5`,再排右欄 `6–0`。一般安裝保留 PIME 原廠簽章 DLL,以降低遊戲與反作弊程式的載入風險;未簽章的日式原生候選外觀只提供開發者明確選用。 ## 安裝與移除 一般使用者只需要執行發佈資料夾中的: ```text -Smart-Priority-Bopomofo-Setup-0.4.2.exe +Smart-Priority-Bopomofo-Setup-0.6.0.exe ``` 從 GitHub clone 原始碼後,可在 PowerShell 執行一鍵安裝: @@ -60,11 +65,22 @@ PIME 1.3.0;若已經有 PIME,則保留現有版本,不做降版。完成 安裝程式會把智慧優先注音排在繁體中文鍵盤清單第一順位,並設成預設輸入法,讓 Alt+Shift 切回繁體中文時優先選到它。 +全新安裝預設保留 PIME 原廠簽章 DLL。只有使用者明確接受遊戲/反作弊相容性風險時, +才可從原始碼執行 `.\install.ps1 -EnableUnsignedNativeUi` 啟用日式原生外觀。這項選擇會 +保存在本機,後續一般更新及新版 EXE 都會沿用,不會默默恢復舊簽章介面;若要主動切回 +原廠簽章版,執行 `.\install.ps1 -DisableUnsignedNativeUi`。檔案正被 TSF 使用時,切換 +介面會安全排程至下次重新啟動 Windows。 + 若安裝程式在新電腦上首次安裝 PIME,會隱藏隨附的「新酷音」,只留下智慧優先 注音;若電腦原本已有 PIME,則不會擅自刪除使用者既有的新酷音。 解除安裝請到 Windows「設定 → 應用程式 → 已安裝的應用程式」。它只會移除 -「智慧優先注音」,不移除共用的 PIME,也不刪除個人學習資料。 +「智慧優先注音」,不移除共用的 PIME,也不刪除個人學習資料。新版候選框只會在 +PIME 沒有其他輸入法模組時套用;安裝前會備份原始 PIME DLL,解除安裝時安全還原。 +若 Windows 正在使用候選框 DLL,安裝仍會完成,並在下一次重新啟動 Windows 後 +自動套用新介面。備份與待更新狀態統一存放於 +`%ProgramData%\SmartPriorityBopomofo\native-state`,所以從 EXE 或 Git clone +安裝都能由解除安裝程式正確辨識。 ## 使用者資料與維護 @@ -93,6 +109,13 @@ python -m unittest discover -s tests -v .\build_pime_overlay.ps1 ``` +已安裝 PIME 時,再執行實際鍵盤事件與全讀音稽核: + +```powershell +& 'C:\Program Files (x86)\PIME\python\python3\python.exe' .\tests\pime_adapter_smoke.py +& 'C:\Program Files (x86)\PIME\python\python3\python.exe' .\tests\pime_all_readings_audit.py +``` + 建立正式安裝包(需要 NSIS 3.12): ```powershell @@ -116,4 +139,7 @@ python -m unittest discover -s tests -v 候選排序固定先保留使用者明確選擇;內建來源先比較完整涵蓋的音節數,避免 「對話框」被較短的「畫框」覆蓋;涵蓋相同時才依教育部台灣字詞頻資料、 內建詞庫的順序決定。 -右側數字鍵盤的 0–9 與小數點永遠輸出數字或 `.`;Shift+英文字母或符號會取代當前未完成音節。 +完整句的自動組字與候選欄必須呼叫同一個排序來源;保守近音與高可信錯字修正也必須先成為可見的完整句候選,不可等到 Enter 才暗中修改。所有送出路徑只會先同步該可見預設,再提交畫面上的文字。 +右側數字鍵盤的 `0–9`、小數點及 `/ * - +` 永遠直接輸出對應字元,不會被解讀成注音或候選鍵;Shift+英文字母或符號會取代當前未完成音節。 + +Enter 修正會先由 `bopomofo_core/phonetic_corrector.py` 使用每個字保留下來的注音、候選字與離線常用詞庫重新解碼,並保守處理 `ㄣ/ㄥ`、`ㄓ/ㄗ`、`ㄔ/ㄘ`、`ㄕ/ㄙ` 等常見發音混淆。補充規則位於 `bopomofo_core/data/common_typos.json`,只保存錯字、正字及公開來源識別,不保存使用者輸入。規則參考國家教育研究院用字分析,並以教育部國語辭典核對正詞;不把「的/得/地、在/再」或合法異形詞放進無條件自動替換。 diff --git a/THIRD_PARTY_NOTICES.txt b/THIRD_PARTY_NOTICES.txt index ffe71d7..75dfbf4 100644 --- a/THIRD_PARTY_NOTICES.txt +++ b/THIRD_PARTY_NOTICES.txt @@ -1,4 +1,4 @@ -智慧優先注音 0.4.2 — 第三方軟體聲明 +智慧優先注音 0.6.0 — 第三方軟體聲明 ======================================== 本安裝包包含或搭配下列開放原始碼元件: @@ -6,10 +6,14 @@ 1. PIME 專案:https://github.com/EasyIME/PIME 本安裝包附帶版本:1.3.0 stable - 原始碼版本(開發驗證):571759f471c93e288682305148df751a12f5415e + 隨附安裝程式來源版本:571759f471c93e288682305148df751a12f5415e + 修改候選框來源版本:26fcf6ac8874e76b8f75f6826811b03bfdfc2e89 + (PIME v1.3.0-stable;libIME2 8ad3c9b433d930ce5614c483461dfa78cedb5efd) 授權:GNU Lesser General Public License 2.0(各附帶元件依 PIME LICENSE.txt 所列授權) 官方安裝檔保留原作者有效的數位簽章;若電腦已有 PIME,安裝程式不會降版。 + `native_ui` 內附修改後的完整來源、LGPL 條款與可重現建置腳本;候選框 DLL + 僅在沒有其他 PIME 輸入法模組時套用,解除安裝時還原備份。 2. libchewing 專案:https://github.com/chewing/libchewing diff --git a/bopomofo_core/autocorrect.py b/bopomofo_core/autocorrect.py new file mode 100644 index 0000000..2ca98be --- /dev/null +++ b/bopomofo_core/autocorrect.py @@ -0,0 +1,115 @@ +"""Conservative, offline correction of high-confidence Traditional Chinese typos.""" + +from __future__ import annotations + +import json +from dataclasses import dataclass +from pathlib import Path +from typing import Sequence + + +DEFAULT_RULES = Path(__file__).with_name("data") / "common_typos.json" + + +@dataclass(frozen=True) +class AutocorrectRule: + wrong: str + correct: str + source: str + + +@dataclass(frozen=True) +class Autocorrection: + start: int + wrong: str + correct: str + source: str + + +class Autocorrector: + """Apply exact, same-length rules without touching protected characters.""" + + def __init__(self, path: str | Path = DEFAULT_RULES) -> None: + self.path = Path(path) + self.rules: tuple[AutocorrectRule, ...] = () + self.sources: dict[str, dict[str, str]] = {} + if not self.path.exists(): + return + try: + raw = json.loads(self.path.read_text(encoding="utf-8")) + if not isinstance(raw, dict): + return + sources = raw.get("meta", {}).get("sources", []) + if isinstance(sources, list): + self.sources = { + str(source["id"]): { + str(key): str(value) for key, value in source.items() + } + for source in sources + if isinstance(source, dict) and source.get("id") + } + + unique: dict[str, AutocorrectRule] = {} + rows = raw.get("rules", []) + if not isinstance(rows, list): + return + for row in rows: + if not isinstance(row, dict): + continue + wrong = row.get("wrong") + correct = row.get("correct") + source = row.get("source") + if not all(isinstance(value, str) for value in (wrong, correct, source)): + continue + # The first release deliberately keeps one character aligned + # with one completed syllable. This makes user-selected spans + # safe to protect and avoids surprising insertion/deletion. + if not wrong or wrong == correct or len(wrong) != len(correct): + continue + if source not in self.sources: + continue + unique.setdefault(wrong, AutocorrectRule(wrong, correct, source)) + self.rules = tuple( + sorted(unique.values(), key=lambda rule: (-len(rule.wrong), rule.wrong)) + ) + except (OSError, ValueError, TypeError, KeyError): + # Autocorrection is optional. A missing or damaged rule file must + # never stop the input method from starting. + self.rules = () + self.sources = {} + + @property + def rule_count(self) -> int: + return len(self.rules) + + def correct( + self, text: str, protected: Sequence[bool] | None = None + ) -> tuple[str, list[Autocorrection]]: + """Return corrected text and an audit trail of applied exact rules.""" + if protected is None: + protected = (False,) * len(text) + if len(protected) != len(text): + raise ValueError("protected character mask must match text length") + + characters = list(text) + changes: list[Autocorrection] = [] + index = 0 + while index < len(characters): + current = "".join(characters) + matched = False + for rule in self.rules: + end = index + len(rule.wrong) + if end > len(characters) or current[index:end] != rule.wrong: + continue + if any(protected[index:end]): + continue + characters[index:end] = rule.correct + changes.append( + Autocorrection(index, rule.wrong, rule.correct, rule.source) + ) + index = end + matched = True + break + if not matched: + index += 1 + return "".join(characters), changes diff --git a/bopomofo_core/data/common_typos.json b/bopomofo_core/data/common_typos.json new file mode 100644 index 0000000..8491132 --- /dev/null +++ b/bopomofo_core/data/common_typos.json @@ -0,0 +1,67 @@ +{ + "meta": { + "name": "智慧優先注音高可信常見錯字規則", + "version": 3, + "policy": "只收錄可作精確字串替換、字數相同且不依賴歧義語境的臺灣正體中文錯字。教育部資料僅用於正詞與用例核對,不重製辭典釋義。", + "sources": [ + { + "id": "naer_usage_analysis", + "title": "國家教育研究院《國語文非選擇題怎麼寫》附錄一:用字分析", + "url": "https://teric.naer.edu.tw/wSite/PDFReader?fileName=1421184541220&format=pdf&xmlId=1820524" + }, + { + "id": "moe_dictionary_validation", + "title": "教育部國語辭典公眾授權網(簡編本、小字典與成語典)", + "url": "https://language.moe.gov.tw/001/Upload/Files/site_content/M0001/respub/index.html" + } + ] + }, + "rules": [ + {"wrong": "以經", "correct": "已經", "source": "naer_usage_analysis"}, + {"wrong": "由其", "correct": "尤其", "source": "naer_usage_analysis"}, + {"wrong": "而以", "correct": "而已", "source": "naer_usage_analysis"}, + {"wrong": "即然", "correct": "既然", "source": "moe_dictionary_validation"}, + {"wrong": "必竟", "correct": "畢竟", "source": "moe_dictionary_validation"}, + {"wrong": "一但", "correct": "一旦", "source": "naer_usage_analysis"}, + {"wrong": "致於", "correct": "至於", "source": "naer_usage_analysis"}, + {"wrong": "難勉", "correct": "難免", "source": "naer_usage_analysis"}, + {"wrong": "份內", "correct": "分內", "source": "naer_usage_analysis"}, + {"wrong": "本份", "correct": "本分", "source": "naer_usage_analysis"}, + {"wrong": "迴饋", "correct": "回饋", "source": "naer_usage_analysis"}, + {"wrong": "分折", "correct": "分析", "source": "naer_usage_analysis"}, + {"wrong": "家庭煮婦", "correct": "家庭主婦", "source": "naer_usage_analysis"}, + {"wrong": "不同凡想", "correct": "不同凡響", "source": "naer_usage_analysis"}, + {"wrong": "迫不急待", "correct": "迫不及待", "source": "moe_dictionary_validation"}, + {"wrong": "按步就班", "correct": "按部就班", "source": "moe_dictionary_validation"}, + {"wrong": "一股作氣", "correct": "一鼓作氣", "source": "moe_dictionary_validation"}, + {"wrong": "再接再勵", "correct": "再接再厲", "source": "moe_dictionary_validation"}, + {"wrong": "不徑而走", "correct": "不脛而走", "source": "moe_dictionary_validation"}, + {"wrong": "默守成規", "correct": "墨守成規", "source": "moe_dictionary_validation"}, + {"wrong": "談笑風聲", "correct": "談笑風生", "source": "moe_dictionary_validation"}, + {"wrong": "走頭無路", "correct": "走投無路", "source": "moe_dictionary_validation"}, + {"wrong": "一愁莫展", "correct": "一籌莫展", "source": "moe_dictionary_validation"}, + {"wrong": "針貶時事", "correct": "針砭時事", "source": "moe_dictionary_validation"}, + {"wrong": "出奇不意", "correct": "出其不意", "source": "moe_dictionary_validation"}, + {"wrong": "名列前矛", "correct": "名列前茅", "source": "moe_dictionary_validation"}, + {"wrong": "一如即往", "correct": "一如既往", "source": "moe_dictionary_validation"}, + {"wrong": "天翻地復", "correct": "天翻地覆", "source": "moe_dictionary_validation"}, + {"wrong": "食不裹腹", "correct": "食不果腹", "source": "moe_dictionary_validation"}, + {"wrong": "有侍無恐", "correct": "有恃無恐", "source": "moe_dictionary_validation"}, + {"wrong": "甘敗下風", "correct": "甘拜下風", "source": "moe_dictionary_validation"}, + {"wrong": "蛛絲螞跡", "correct": "蛛絲馬跡", "source": "moe_dictionary_validation"}, + {"wrong": "聲名雀起", "correct": "聲名鵲起", "source": "moe_dictionary_validation"}, + {"wrong": "鬼鬼崇崇", "correct": "鬼鬼祟祟", "source": "moe_dictionary_validation"}, + {"wrong": "金榜提名", "correct": "金榜題名", "source": "moe_dictionary_validation"}, + {"wrong": "脈博", "correct": "脈搏", "source": "moe_dictionary_validation"}, + {"wrong": "松馳", "correct": "鬆弛", "source": "moe_dictionary_validation"}, + {"wrong": "修茸", "correct": "修葺", "source": "moe_dictionary_validation"}, + {"wrong": "編篡", "correct": "編纂", "source": "moe_dictionary_validation"}, + {"wrong": "親睞", "correct": "青睞", "source": "moe_dictionary_validation"}, + {"wrong": "冒然", "correct": "貿然", "source": "moe_dictionary_validation"}, + {"wrong": "不醒人事", "correct": "不省人事", "source": "moe_dictionary_validation"}, + {"wrong": "一泄千里", "correct": "一瀉千里", "source": "moe_dictionary_validation"}, + {"wrong": "一諾千斤", "correct": "一諾千金", "source": "moe_dictionary_validation"}, + {"wrong": "老生長談", "correct": "老生常談", "source": "moe_dictionary_validation"}, + {"wrong": "相形見拙", "correct": "相形見絀", "source": "moe_dictionary_validation"} + ] +} diff --git a/bopomofo_core/frequency_lexicon.py b/bopomofo_core/frequency_lexicon.py index 5ebbc05..e2542b6 100644 --- a/bopomofo_core/frequency_lexicon.py +++ b/bopomofo_core/frequency_lexicon.py @@ -64,3 +64,16 @@ def candidates( ranked.items(), key=lambda row: (-row[1], row[0]) )[:limit] ] + + def contains(self, phrase: str) -> bool: + """Return whether the complete phrase exists beyond the result limit.""" + if len(phrase) < 2: + return False + bucket = self._buckets.get(str(len(phrase)), {}) + if not isinstance(bucket, dict): + return False + rows = bucket.get(phrase[0], []) + return isinstance(rows, list) and any( + isinstance(row, list) and len(row) == 2 and row[0] == phrase + for row in rows + ) diff --git a/bopomofo_core/libchewing_provider.py b/bopomofo_core/libchewing_provider.py index f61cb80..4dc2903 100644 --- a/bopomofo_core/libchewing_provider.py +++ b/bopomofo_core/libchewing_provider.py @@ -31,7 +31,7 @@ (("ㄗˋ", "ㄐㄧˇ"), "自己"), (("ㄗˋ", "ㄨㄛˇ"), "自我"), (("ㄨㄛˇ", "ㄅㄨˋ", "ㄧㄠˋ"), "我不要"), - (("ㄅㄨˋ", "ㄓ", "ㄉㄠˋ"), "不知道"), + (("ㄅㄨˋ", "ㄓˉ", "ㄉㄠˋ"), "不知道"), (("ㄅㄨˋ", "ㄧㄠˋ"), "不要"), (("ㄅㄨˋ", "ㄕˋ"), "不是"), (("ㄅㄨˋ", "ㄏㄨㄟˋ"), "不會"), @@ -39,14 +39,14 @@ (("ㄅㄨˋ", "ㄩㄥˋ"), "不用"), (("ㄅㄨˋ", "ㄒㄧㄤˇ"), "不想"), (("ㄗㄞˋ", "ㄐㄧㄢˋ"), "再見"), - (("ㄗㄞˋ", "ㄧ", "ㄘˋ"), "再一次"), + (("ㄗㄞˋ", "ㄧˉ", "ㄘˋ"), "再一次"), (("ㄗㄞˋ", "ㄧㄝˇ"), "再也"), (("ㄗㄞˋ", "ㄌㄞˊ"), "再來"), (("ㄒㄧㄢˋ", "ㄗㄞˋ"), "現在"), (("ㄙㄨㄛˇ", "ㄗㄞˋ"), "所在"), - (("ㄍㄣ", "ㄗㄞˋ"), "跟在"), + (("ㄍㄣˉ", "ㄗㄞˋ"), "跟在"), (("ㄓㄥˋ", "ㄗㄞˋ"), "正在"), - (("ㄗㄞˋ", "ㄐㄧㄚ"), "在家"), + (("ㄗㄞˋ", "ㄐㄧㄚˉ"), "在家"), (("ㄗㄞˋ", "ㄓㄜˋ"), "在這"), (("ㄗㄞˋ", "ㄋㄚˋ"), "在那"), (("ㄗㄞˋ", "ㄋㄚˇ"), "在哪"), @@ -57,12 +57,47 @@ def prioritize_common_character(reading: str, candidates: list[str]) -> list[str """Put a small set of overwhelmingly common characters first.""" # These defaults only control an isolated syllable. Contextual word rules # below may still turn ㄗˋ into 自 in words such as 自己 and 自我. - preferred = {"ㄅㄨˋ": "不", "ㄗˋ": "字"}.get(reading) + preferred = { + "ㄅㄨˋ": "不", + "ㄉㄜ˙": "的", + "ㄋㄚˋ": "那", + "ㄕˋ": "是", + "ㄗˋ": "字", + "ㄗㄨㄛˋ": "做", + }.get(reading) if preferred is None or preferred not in candidates: return candidates return [preferred] + [candidate for candidate in candidates if candidate != preferred] +def add_literal_bopomofo_candidate( + reading: str, candidates: list[str] +) -> list[str]: + """Expose the typed Zhuyin itself near the front of complete readings. + + Microsoft Bopomofo offers the literal phonetic spelling as a candidate. + First tone is conventionally unmarked in displayed Zhuyin. Keeping this at + position two preserves the normal Chinese default while keeping the + phonetic spelling visible in a compact Microsoft-style five-item page. + """ + if not reading: + return candidates + literal = reading[:-1] if reading.endswith("ˉ") else reading + if literal in candidates: + current_index = candidates.index(literal) + if current_index <= 1: + return candidates + # Some dictionary rows already contain the raw spelling deep in the + # tail. Presence alone is not enough: the UI contract requires it in + # the first four, so normalize an existing literal to position two. + without_literal = [ + candidate for candidate in candidates if candidate != literal + ] + return without_literal[:1] + [literal] + without_literal[1:] + insert_at = min(1, len(candidates)) + return candidates[:insert_at] + [literal] + candidates[insert_at:] + + def apply_common_usage_overrides(readings: list[str], phrase: str) -> str: """Correct unambiguous high-frequency phrases in an engine result.""" if len(readings) != len(phrase): @@ -116,14 +151,19 @@ def candidates(self, reading: str) -> list[str]: total = self.context.cand_TotalChoice() if total <= 0: - return [] + return add_literal_bopomofo_candidate(reading, []) self.context.cand_Enumerate() results: list[str] = [] limit = min(total, MAX_CANDIDATES) while self.context.cand_hasNext() and len(results) < limit: results.append(self.context.cand_String().decode("utf-8")) - results = TAIWAN_FREQUENCY.rank_characters(results) - return prioritize_common_character(reading, results) + # Dictionary order is reading-aware; global character frequency is + # not. Preserve the exact-reading default so a common alternate + # pronunciation cannot promote 員 over 運 for ㄩㄣˋ, then use Taiwan + # frequency to organize the remaining candidates. + results = TAIWAN_FREQUENCY.rank_characters(results, preserve_first=True) + results = prioritize_common_character(reading, results) + return add_literal_bopomofo_candidate(reading, results)[:MAX_CANDIDATES] def best_phrase(self, readings: list[str]) -> str: """Return the phrase dictionary's best text for complete readings.""" @@ -193,3 +233,10 @@ def frequent_phrase_candidates( candidate_columns, limit=MAX_CANDIDATES ) return list(dict.fromkeys(taiwan + expanded))[:MAX_CANDIDATES] + + @staticmethod + def is_frequent_phrase(phrase: str) -> bool: + """Recognize valid bundled words even outside the top-20 result tail.""" + return TAIWAN_FREQUENCY.contains_phrase(phrase) or FREQUENCY_LEXICON.contains( + phrase + ) diff --git a/bopomofo_core/phonetic_corrector.py b/bopomofo_core/phonetic_corrector.py new file mode 100644 index 0000000..1d05b9c --- /dev/null +++ b/bopomofo_core/phonetic_corrector.py @@ -0,0 +1,187 @@ +"""Reading-aware phrase correction for an uncommitted Bopomofo buffer.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Callable, List, Sequence + + +CandidateLookup = Callable[[str], List[str]] +PhraseLookup = Callable[[List[List[str]]], List[str]] +KnownPhraseLookup = Callable[[List[str]], List[str]] +PhraseValidator = Callable[[str], bool] + +_INITIAL_CONFUSIONS = { + "ㄓ": "ㄗ", + "ㄗ": "ㄓ", + "ㄔ": "ㄘ", + "ㄘ": "ㄔ", + "ㄕ": "ㄙ", + "ㄙ": "ㄕ", +} +_RIME_CONFUSIONS = {"ㄣ": "ㄥ", "ㄥ": "ㄣ"} +_TONES = frozenset("ˉˊˇˋ˙") + + +def reading_variants(reading: str) -> tuple[str, ...]: + """Return conservative Taiwanese Bopomofo confusions for one syllable. + + The original reading is always first. Variants change one phonetic slot at + a time, so the language model—not a list of wrong output characters—decides + whether a common word exists for the nearby pronunciation. + """ + if not reading: + return () + tone = reading[-1] if reading[-1] in _TONES else "" + body = reading[:-1] if tone else reading + variants = [reading] + + if body[:1] in _INITIAL_CONFUSIONS: + variants.append(_INITIAL_CONFUSIONS[body[0]] + body[1:] + tone) + if body[-1:] in _RIME_CONFUSIONS: + variants.append(body[:-1] + _RIME_CONFUSIONS[body[-1]] + tone) + return tuple(dict.fromkeys(variants)) + + +@dataclass(frozen=True) +class PhoneticCorrection: + start: int + original: str + corrected: str + used_fuzzy_reading: bool + + +class PhoneticCorrector: + """Re-decode words from readings and the bundled phrase indexes.""" + + def __init__(self, max_phrase_length: int = 12) -> None: + self.max_phrase_length = max(2, max_phrase_length) + + @staticmethod + def _single_character_candidates( + current: str, readings: Sequence[str], candidate_lookup: CandidateLookup + ) -> tuple[list[str], list[str]]: + exact = [current] + for candidate in candidate_lookup(readings[0]): + if len(candidate) == 1 and candidate not in exact: + exact.append(candidate) + + expanded = list(exact) + for variant in readings[1:]: + for candidate in candidate_lookup(variant): + if len(candidate) == 1 and candidate not in expanded: + expanded.append(candidate) + return exact, expanded + + def correct( + self, + readings: Sequence[str], + text: str, + protected: Sequence[bool], + candidate_lookup: CandidateLookup, + phrase_lookup: PhraseLookup, + known_phrase_lookup: KnownPhraseLookup | None = None, + phrase_validator: PhraseValidator | None = None, + allow_fuzzy: bool = True, + replacement_phrase_lookup: KnownPhraseLookup | None = None, + ) -> tuple[str, list[PhoneticCorrection]]: + if len(readings) != len(text) or len(protected) != len(text): + raise ValueError("readings, text, and protection mask must align") + if len(text) < 2: + return text, [] + + exact_columns: list[list[str]] = [] + expanded_columns: list[list[str]] = [] + for current, reading in zip(text, readings): + variants = reading_variants(reading) + if not variants: + exact_columns.append([current]) + expanded_columns.append([current]) + continue + exact, expanded = self._single_character_candidates( + current, variants, candidate_lookup + ) + exact_columns.append(exact) + expanded_columns.append(expanded if allow_fuzzy else exact) + + characters = list(text) + changes: list[PhoneticCorrection] = [] + start = 0 + while start < len(characters) - 1: + remaining = len(characters) - start + matched = False + for width in range(min(self.max_phrase_length, remaining), 1, -1): + end = start + width + if any(protected[start:end]): + continue + current = "".join(characters[start:end]) + + if phrase_validator is not None and phrase_validator(current): + start = end + matched = True + break + if known_phrase_lookup is not None and current in known_phrase_lookup( + list(readings[start:end]) + ): + start = end + matched = True + break + + span_readings = list(readings[start:end]) + exact_phrases = phrase_lookup(exact_columns[start:end]) + evidence_lookup = ( + replacement_phrase_lookup or known_phrase_lookup + ) + if evidence_lookup is not None: + known_exact = set(evidence_lookup(span_readings)) + exact_phrases = [ + phrase for phrase in exact_phrases if phrase in known_exact + ] + # A known phrase matching the user's current text is valid, + # even if another phrase has a higher raw corpus frequency. + if current in exact_phrases: + start = end + matched = True + break + if exact_phrases: + replacement = exact_phrases[0] + fuzzy = False + elif allow_fuzzy: + fuzzy_phrases = phrase_lookup(expanded_columns[start:end]) + if evidence_lookup is not None: + # Fuzzy correction is deliberately limited to one + # changed phonetic slot. Validate every proposed word + # against the exact phrase engine for that nearby + # reading, rather than trusting text-only corpus data. + known_fuzzy: set[str] = set() + for offset, reading in enumerate(span_readings): + for variant in reading_variants(reading)[1:]: + variant_readings = list(span_readings) + variant_readings[offset] = variant + known_fuzzy.update( + evidence_lookup(variant_readings) + ) + fuzzy_phrases = [ + phrase + for phrase in fuzzy_phrases + if phrase in known_fuzzy + ] + if not fuzzy_phrases: + continue + replacement = fuzzy_phrases[0] + fuzzy = True + else: + continue + + if len(replacement) != width or replacement == current: + continue + characters[start:end] = replacement + changes.append( + PhoneticCorrection(start, current, replacement, fuzzy) + ) + start = end + matched = True + break + if not matched: + start += 1 + return "".join(characters), changes diff --git a/bopomofo_core/session.py b/bopomofo_core/session.py index 0a06cfc..01a515a 100644 --- a/bopomofo_core/session.py +++ b/bopomofo_core/session.py @@ -35,6 +35,10 @@ def _is_complete(self, reading: str) -> bool: def _engine_candidates(self, reading: str) -> list[str]: return list(dict.fromkeys(self.provider.candidates(reading))) + def candidates_for_reading(self, reading: str) -> list[str]: + """Return ranked candidates without mutating the active editor.""" + return self._prioritize(reading, self._engine_candidates(reading)) + def best_phrase(self, readings: list[str]) -> str: converter = getattr(self.provider, "best_phrase", None) return converter(readings) if converter is not None else "" @@ -63,15 +67,50 @@ def frequent_phrase_candidates( : self.max_candidates ] + def validated_frequent_phrase_candidates( + self, readings: list[str], candidate_columns: list[list[str]] + ) -> list[str]: + """Return corpus phrases proven to match the complete readings. + + The expanded frequency index stores text and weights, but not a + phrase's pronunciation. A character-by-character membership check is + therefore only a broad search and can confuse alternate readings + (for example, matching 貝殼 to ㄅㄟˋ ㄑㄩㄝˋ). Require the phrase engine's + exact-reading evidence before a corpus match may affect live text. + """ + exact_phrases = set(self.phrase_candidates(readings)) + if not exact_phrases: + return [] + return [ + phrase + for phrase in self.frequent_phrase_candidates(candidate_columns) + if phrase in exact_phrases + ] + + def is_frequent_phrase(self, phrase: str) -> bool: + validator = getattr(self.provider, "is_frequent_phrase", None) + return bool(validator(phrase)) if validator is not None else False + + def _valid_pins(self, reading: str) -> list[str]: + return [ + candidate + for candidate in self.pins.phrases_for(reading) + if len(candidate) == 1 + ] + def _prioritize(self, reading: str, engine_candidates: list[str]) -> list[str]: - pinned = self.pins.phrases_for(reading) + # A per-reading pin normally represents exactly one output character. + # Ignore malformed/manual multi-character values so one damaged + # preference cannot break the one-syllable/one-segment alignment used + # by editing and Enter correction. + pinned = self._valid_pins(reading) # Explicit user choices always outrank every bundled language model. return list(dict.fromkeys(pinned + engine_candidates))[: self.max_candidates] def _validate(self, reading: str) -> bool: if not self._is_complete(reading): return True - return bool(self._engine_candidates(reading) or self.pins.phrases_for(reading)) + return bool(self._engine_candidates(reading) or self._valid_pins(reading)) def _refresh(self) -> None: if not self._is_complete(self.preedit): diff --git a/bopomofo_core/taiwan_frequency.py b/bopomofo_core/taiwan_frequency.py index ca7f505..6bc69ab 100644 --- a/bopomofo_core/taiwan_frequency.py +++ b/bopomofo_core/taiwan_frequency.py @@ -42,16 +42,32 @@ def __init__(self, path: str | Path = DEFAULT_INDEX) -> None: self._characters = {} self._buckets = {} - def rank_characters(self, candidates: list[str]) -> list[str]: - """Rank known characters by Taiwan frequency, preserving unknown order.""" + def rank_characters( + self, candidates: list[str], *, preserve_first: bool = False + ) -> list[str]: + """Rank by Taiwan frequency without losing reading-specific evidence. + + ``candidates`` normally comes from a pronunciation-aware dictionary. + Its first entry is therefore stronger evidence than a character's + global frequency, which cannot distinguish polyphonic readings such + as 員 (usually ㄩㄢˊ, but also present under ㄩㄣˋ). Callers may keep + that dictionary default while frequency-sorting the remaining tail. + """ + unique = list(dict.fromkeys(candidates)) + if not unique: + return [] positions = {candidate: index for index, candidate in enumerate(candidates)} - return sorted( - dict.fromkeys(candidates), + ranked = sorted( + unique, key=lambda candidate: ( -self._characters.get(candidate, 0), positions[candidate], ), ) + if not preserve_first: + return ranked + first = unique[0] + return [first] + [candidate for candidate in ranked if candidate != first] def phrase_candidates( self, candidate_columns: list[list[str]], limit: int = 20 @@ -84,3 +100,16 @@ def phrase_candidates( ranked.items(), key=lambda item: (-item[1], item[0]) )[:limit] ] + + def contains_phrase(self, phrase: str) -> bool: + """Return whether the official word table contains the whole phrase.""" + if len(phrase) < 2: + return False + bucket = self._buckets.get(str(len(phrase)), {}) + if not isinstance(bucket, dict): + return False + rows = bucket.get(phrase[0], []) + return isinstance(rows, list) and any( + isinstance(row, list) and len(row) == 2 and row[0] == phrase + for row in rows + ) diff --git a/build_pime_overlay.ps1 b/build_pime_overlay.ps1 index be116ee..0892c5f 100644 --- a/build_pime_overlay.ps1 +++ b/build_pime_overlay.ps1 @@ -44,4 +44,18 @@ foreach ($name in "word.dat", "tsi.dat", "swkb.dat", "symbols.dat") { Copy-Item -LiteralPath (Join-Path $runtimeChewing "data\$name") -Destination (Join-Path $chewingDest "data") -Force } +$nativeUiSource = Join-Path $projectRoot "native_ui" +$nativeUiDest = Join-Path $distRoot "native_ui" +foreach ($required in @( + (Join-Path $nativeUiSource "bin\x86\PIMETextService.dll"), + (Join-Path $nativeUiSource "bin\x64\PIMETextService.dll"), + (Join-Path $nativeUiSource "src\CandidateWindow.cpp"), + (Join-Path $nativeUiSource "LGPL-2.0.txt") +)) { + if (-not (Test-Path -LiteralPath $required)) { + throw "The native candidate UI payload is missing: $required" + } +} +Copy-Item -LiteralPath $nativeUiSource -Destination $nativeUiDest -Recurse -Force + Write-Output $distRoot diff --git a/build_release.ps1 b/build_release.ps1 index dc6b076..5a6f797 100644 --- a/build_release.ps1 +++ b/build_release.ps1 @@ -89,7 +89,7 @@ if (-not $MakensisPath -or -not (Test-Path -LiteralPath $MakensisPath)) { & $MakensisPath "/INPUTCHARSET" "UTF8" (Join-Path $projectRoot "installer\SmartPriorityBopomofo.nsi") if ($LASTEXITCODE -ne 0) { throw "NSIS build failed with exit code $LASTEXITCODE." } -$artifact = Join-Path $releaseRoot "Smart-Priority-Bopomofo-Setup-0.4.2.exe" +$artifact = Join-Path $releaseRoot "Smart-Priority-Bopomofo-Setup-0.6.0.exe" if (-not (Test-Path -LiteralPath $artifact)) { throw "The installer artifact was not created." } diff --git a/install.ps1 b/install.ps1 index 3457888..e26e335 100644 --- a/install.ps1 +++ b/install.ps1 @@ -1,20 +1,33 @@ param( - [switch]$Elevated + [switch]$Elevated, + [switch]$EnableUnsignedNativeUi, + [switch]$DisableUnsignedNativeUi ) $ErrorActionPreference = "Stop" $projectRoot = $PSScriptRoot $scriptPath = $MyInvocation.MyCommand.Path +if ($EnableUnsignedNativeUi -and $DisableUnsignedNativeUi) { + throw "EnableUnsignedNativeUi and DisableUnsignedNativeUi cannot be used together." +} + $identity = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = [Security.Principal.WindowsPrincipal]::new($identity) if (-not $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { - $process = Start-Process -FilePath "powershell.exe" -Verb RunAs -Wait -PassThru -ArgumentList @( + $elevatedArguments = @( "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ('"' + $scriptPath + '"'), "-Elevated" ) + if ($EnableUnsignedNativeUi) { + $elevatedArguments += "-EnableUnsignedNativeUi" + } + if ($DisableUnsignedNativeUi) { + $elevatedArguments += "-DisableUnsignedNativeUi" + } + $process = Start-Process -FilePath "powershell.exe" -Verb RunAs -Wait -PassThru -ArgumentList $elevatedArguments if ($process.ExitCode -ne 0) { throw "Installation failed with exit code $($process.ExitCode)." } @@ -47,7 +60,9 @@ try { New-Item -ItemType Directory -Path $resolvedStaging -Force | Out-Null Copy-Item -LiteralPath $overlayRoot -Destination (Join-Path $resolvedStaging "overlay") -Recurse -Force Copy-Item -LiteralPath $pimeInstaller -Destination $resolvedStaging -Force - & $formalInstaller -PayloadRoot $resolvedStaging + & $formalInstaller -PayloadRoot $resolvedStaging ` + -EnableUnsignedNativeUi:$EnableUnsignedNativeUi ` + -DisableUnsignedNativeUi:$DisableUnsignedNativeUi } finally { Set-Location -LiteralPath $env:TEMP diff --git a/installer/SmartPriorityBopomofo.nsi b/installer/SmartPriorityBopomofo.nsi index 8eb2966..4784464 100644 --- a/installer/SmartPriorityBopomofo.nsi +++ b/installer/SmartPriorityBopomofo.nsi @@ -3,7 +3,7 @@ RequestExecutionLevel admin SetCompressor /SOLID lzma !define PRODUCT_NAME "智慧優先注音" -!define PRODUCT_VERSION "0.4.2" +!define PRODUCT_VERSION "0.6.0" !define PRODUCT_PUBLISHER "Smart Priority Bopomofo contributors" !define PRODUCT_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\SmartPriorityBopomofo" @@ -14,7 +14,7 @@ InstallDirRegKey HKLM "${PRODUCT_KEY}" "InstallLocation" ShowInstDetails show ShowUninstDetails show -VIProductVersion "0.4.2.0" +VIProductVersion "0.6.0.0" VIAddVersionKey /LANG=1028 "ProductName" "${PRODUCT_NAME}" VIAddVersionKey /LANG=1028 "CompanyName" "${PRODUCT_PUBLISHER}" VIAddVersionKey /LANG=1028 "FileDescription" "${PRODUCT_NAME} 安裝程式" @@ -44,6 +44,7 @@ Section "安裝智慧優先注音" SEC_MAIN SetShellVarContext current SetOutPath "$INSTDIR" File "install.ps1" + File "native_ui_preference.ps1" File "uninstall.ps1" File "..\release-staging\THIRD_PARTY_NOTICES.txt" File "..\release-staging\PIME-LICENSE.txt" diff --git a/installer/install.ps1 b/installer/install.ps1 index 7d99bc0..7fc297f 100644 --- a/installer/install.ps1 +++ b/installer/install.ps1 @@ -1,17 +1,133 @@ param( [Parameter(Mandatory = $true)] - [string]$PayloadRoot + [string]$PayloadRoot, + [switch]$EnableUnsignedNativeUi, + [switch]$DisableUnsignedNativeUi ) $ErrorActionPreference = "Stop" +. (Join-Path $PSScriptRoot "native_ui_preference.ps1") $tip = "0404:{35F67E9D-A54D-4177-9697-8B0AB71A9E04}{26EA5CF3-D515-40BE-9535-E7E98D5EE554}" $moduleName = "pinned_bopomofo" $logRoot = Join-Path $env:ProgramData "SmartPriorityBopomofo" $logPath = Join-Path $logRoot "install.log" +$nativeStateRoot = Join-Path $logRoot "native-state" +$nativePreferencePath = Join-Path $logRoot "native-ui-preference.json" $installedPimeThisRun = $false New-Item -ItemType Directory -Path $logRoot -Force | Out-Null Start-Transcript -LiteralPath $logPath -Force | Out-Null +function Restore-OriginalPimeTextService { + param( + [Parameter(Mandatory = $true)] + [string]$PimeRoot, + [Parameter(Mandatory = $true)] + [string]$StateRoot + ) + + $nativeMarker = Join-Path $StateRoot "native-ui.json" + $backupRoot = Join-Path $StateRoot "backup" + $pendingRoot = Join-Path $StateRoot "pending" + if (-not (Test-Path -LiteralPath $nativeMarker) -or + -not (Test-Path -LiteralPath $backupRoot)) { + return + } + + $nativeHashes = Get-Content -LiteralPath $nativeMarker -Raw -Encoding UTF8 | + ConvertFrom-Json + $nativeStateCanBeRemoved = $true + $restoreScheduled = $false + if (-not ("SmartPriorityNativeMethods" -as [type])) { + Add-Type @" +using System; +using System.Runtime.InteropServices; + +public static class SmartPriorityNativeMethods { + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool MoveFileEx( + string existingFile, + string newFile, + int flags + ); +} +"@ + } + + foreach ($architecture in @("x86", "x64")) { + $targetDll = Join-Path $PimeRoot "$architecture\PIMETextService.dll" + $backupDll = Join-Path $backupRoot "$architecture\PIMETextService.dll" + $pendingDll = Join-Path $pendingRoot "$architecture\PIMETextService.dll" + $expectedCustomHash = $nativeHashes.$architecture + if (-not (Test-Path -LiteralPath $targetDll) -or + -not (Test-Path -LiteralPath $backupDll)) { + $nativeStateCanBeRemoved = $false + continue + } + + $backupSignature = Get-AuthenticodeSignature -LiteralPath $backupDll + if ($backupSignature.Status -ne [System.Management.Automation.SignatureStatus]::Valid) { + throw "Refusing to restore an unsigned or invalid $architecture PIME backup." + } + $targetHash = (Get-FileHash -Algorithm SHA256 -LiteralPath $targetDll).Hash + $backupHash = (Get-FileHash -Algorithm SHA256 -LiteralPath $backupDll).Hash + if ($targetHash -eq $backupHash) { + continue + } + + if ($expectedCustomHash -and $targetHash -eq $expectedCustomHash) { + try { + Copy-Item -LiteralPath $backupDll -Destination $targetDll -Force + } + catch [System.IO.IOException], [System.UnauthorizedAccessException] { + # The TSF DLL is normally loaded by desktop and game clients. + # Keep a persistent signed source and replace it at reboot. + $restoreDll = Join-Path $StateRoot "restore\$architecture\PIMETextService.dll" + New-Item -ItemType Directory -Path (Split-Path -Parent $restoreDll) -Force | Out-Null + Copy-Item -LiteralPath $backupDll -Destination $restoreDll -Force + $scheduled = [SmartPriorityNativeMethods]::MoveFileEx( + $restoreDll, + $targetDll, + 0x4 -bor 0x1 + ) + if (-not $scheduled) { + $win32Error = [Runtime.InteropServices.Marshal]::GetLastWin32Error() + throw "Unable to schedule the $architecture signed PIME DLL restore (Win32 $win32Error)." + } + $nativeStateCanBeRemoved = $false + $restoreScheduled = $true + } + continue + } + + if ($nativeHashes.($architecture + "Pending") -and + (Test-Path -LiteralPath $pendingDll)) { + # Removing the source cancels an unsigned replacement that Windows + # has not performed yet. + Remove-Item -LiteralPath $pendingDll -Force + if ($targetHash -ne $backupHash) { + $nativeStateCanBeRemoved = $false + } + continue + } + + # Another product changed the shared DLL. Preserve every backup and + # avoid overwriting an unknown installation. + $nativeStateCanBeRemoved = $false + } + + if ($nativeStateCanBeRemoved -and (Test-Path -LiteralPath $StateRoot)) { + Remove-Item -LiteralPath $StateRoot -Recurse -Force + Write-Output "Restored the signed PIME text-service DLLs." + } + elseif ($restoreScheduled) { + Write-Output "The signed PIME text-service DLL restore will finish after Windows restarts." + } + else { + Write-Output "Preserved the native UI backup because the shared PIME DLL was changed by another product." + } +} + try { $identity = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = [Security.Principal.WindowsPrincipal]::new($identity) @@ -129,6 +245,125 @@ try { if ($LASTEXITCODE -ne 0) { throw "The module compile check failed." } } + # A fresh installation keeps PIME's signed DLL. Once a user explicitly + # enables the custom UI, remember that choice across source, EXE, and AI- + # assisted updates so a routine Python-layer update cannot silently revert + # the appearance. The signed UI remains explicitly recoverable. + $useUnsignedNativeUi = Resolve-SmartPriorityNativeUiPreference ` + -PreferencePath $nativePreferencePath ` + -PimeRoot $resolvedRoot ` + -StateRoot $nativeStateRoot ` + -EnableUnsignedNativeUi:$EnableUnsignedNativeUi ` + -DisableUnsignedNativeUi:$DisableUnsignedNativeUi + if (-not $useUnsignedNativeUi) { + Restore-OriginalPimeTextService -PimeRoot $resolvedRoot -StateRoot $nativeStateRoot + } + + # Apply the optional native candidate window only when explicitly enabled + # and when this PIME installation contains no unrelated input methods. + # Preserve the original DLLs so a safe reinstall/uninstall can restore them. + $pythonMethods = Join-Path $resolvedRoot "python\input_methods" + $nodeMethods = Join-Path $resolvedRoot "node\input_methods" + $otherPythonModules = @( + Get-ChildItem -LiteralPath $pythonMethods -Directory -ErrorAction SilentlyContinue | + Where-Object { $_.Name -notin @($moduleName, "__pycache__") } + ) + $otherNodeModules = @( + Get-ChildItem -LiteralPath $nodeMethods -Directory -ErrorAction SilentlyContinue + ) + $nativeUiPayload = Join-Path $PayloadRoot "overlay\native_ui\bin" + $canInstallNativeUi = ( + $useUnsignedNativeUi -and + $otherPythonModules.Count -eq 0 -and $otherNodeModules.Count -eq 0 -and + (Test-Path -LiteralPath (Join-Path $nativeUiPayload "x86\PIMETextService.dll")) -and + (Test-Path -LiteralPath (Join-Path $nativeUiPayload "x64\PIMETextService.dll")) + ) + if ($useUnsignedNativeUi -and -not $canInstallNativeUi) { + throw "The remembered custom candidate UI cannot be installed because its payload is missing or unrelated PIME modules are present." + } + if ($canInstallNativeUi) { + $backupRoot = Join-Path $nativeStateRoot "backup" + $pendingRoot = Join-Path $nativeStateRoot "pending" + New-Item -ItemType Directory -Path $backupRoot -Force | Out-Null + $nativeHashes = @{} + $nativeUpdatePending = $false + if (-not ("SmartPriorityNativeMethods" -as [type])) { + Add-Type @" +using System; +using System.Runtime.InteropServices; + +public static class SmartPriorityNativeMethods { + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool MoveFileEx( + string existingFile, + string newFile, + int flags + ); +} +"@ + } + foreach ($architecture in @("x86", "x64")) { + $sourceDll = Join-Path $nativeUiPayload "$architecture\PIMETextService.dll" + $targetDll = Join-Path $resolvedRoot "$architecture\PIMETextService.dll" + $backupDll = Join-Path $backupRoot "$architecture\PIMETextService.dll" + $sourceHash = (Get-FileHash -Algorithm SHA256 -LiteralPath $sourceDll).Hash + New-Item -ItemType Directory -Path (Split-Path -Parent $backupDll) -Force | Out-Null + if ((Test-Path -LiteralPath $targetDll) -and -not (Test-Path -LiteralPath $backupDll)) { + Copy-Item -LiteralPath $targetDll -Destination $backupDll -Force + } + # Reinstalling the Python layer is common during development. Do + # not touch or re-queue a native DLL that is already current. + if ((Test-Path -LiteralPath $targetDll) -and + (Get-FileHash -Algorithm SHA256 -LiteralPath $targetDll).Hash -eq $sourceHash) { + $nativeHashes[$architecture] = $sourceHash + continue + } + try { + Copy-Item -LiteralPath $sourceDll -Destination $targetDll -Force + } + catch [System.IO.IOException], [System.UnauthorizedAccessException] { + # TSF loads this DLL into every text application, so Windows + # commonly keeps it locked. Stage a persistent copy and ask + # the kernel to replace it safely at the next reboot. + $pendingDll = Join-Path $pendingRoot "$architecture\PIMETextService.dll" + New-Item -ItemType Directory -Path (Split-Path -Parent $pendingDll) -Force | Out-Null + Copy-Item -LiteralPath $sourceDll -Destination $pendingDll -Force + $sessionManager = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" + $pendingMoves = (Get-ItemProperty -LiteralPath $sessionManager ` + -Name PendingFileRenameOperations -ErrorAction SilentlyContinue).PendingFileRenameOperations + $pendingText = @($pendingMoves) -join "`n" + $alreadyScheduled = ( + $pendingText.IndexOf($pendingDll, [StringComparison]::OrdinalIgnoreCase) -ge 0 -and + $pendingText.IndexOf($targetDll, [StringComparison]::OrdinalIgnoreCase) -ge 0 + ) + if (-not $alreadyScheduled) { + $moveFileDelayUntilReboot = 0x4 + $moveFileReplaceExisting = 0x1 + $scheduled = [SmartPriorityNativeMethods]::MoveFileEx( + $pendingDll, + $targetDll, + $moveFileDelayUntilReboot -bor $moveFileReplaceExisting + ) + if (-not $scheduled) { + $win32Error = [Runtime.InteropServices.Marshal]::GetLastWin32Error() + throw "Unable to schedule the $architecture native UI update (Win32 $win32Error)." + } + } + $nativeUpdatePending = $true + $nativeHashes[$architecture + "Pending"] = $true + } + $nativeHashes[$architecture] = $sourceHash + } + $nativeHashes | ConvertTo-Json | Set-Content ` + -LiteralPath (Join-Path $nativeStateRoot "native-ui.json") -Encoding UTF8 + if ($nativeUpdatePending) { + Write-Output "The modern candidate UI will finish installing after the next Windows restart." + } + } + Save-SmartPriorityNativeUiPreference ` + -PreferencePath $nativePreferencePath -Enabled $useUnsignedNativeUi + $x86Dll = Join-Path $resolvedRoot "x86\PIMETextService.dll" $x64Dll = Join-Path $resolvedRoot "x64\PIMETextService.dll" if (Test-Path -LiteralPath $x86Dll) { diff --git a/installer/native_ui_preference.ps1 b/installer/native_ui_preference.ps1 new file mode 100644 index 0000000..9956e77 --- /dev/null +++ b/installer/native_ui_preference.ps1 @@ -0,0 +1,115 @@ +$ErrorActionPreference = "Stop" + +function Read-SmartPriorityNativeUiPreference { + param( + [Parameter(Mandatory = $true)] + [string]$PreferencePath + ) + + if (-not (Test-Path -LiteralPath $PreferencePath)) { + return $null + } + try { + $value = Get-Content -LiteralPath $PreferencePath -Raw -Encoding UTF8 | + ConvertFrom-Json + if ($null -eq $value.enabled) { + return $null + } + return [bool]$value.enabled + } + catch { + # A damaged preference must never make installation fail. Fall back to + # recognizing an already active custom UI, then to the signed default. + return $null + } +} + +function Test-SmartPriorityCustomNativeUiState { + param( + [Parameter(Mandatory = $true)] + [string]$PimeRoot, + [Parameter(Mandatory = $true)] + [string]$StateRoot + ) + + $markerPath = Join-Path $StateRoot "native-ui.json" + if (-not (Test-Path -LiteralPath $markerPath)) { + return $false + } + try { + $marker = Get-Content -LiteralPath $markerPath -Raw -Encoding UTF8 | + ConvertFrom-Json + foreach ($architecture in @("x86", "x64")) { + $expectedHash = $marker.$architecture + if (-not $expectedHash) { + return $false + } + $activeDll = Join-Path $PimeRoot "$architecture\PIMETextService.dll" + if ((Test-Path -LiteralPath $activeDll) -and + (Get-FileHash -Algorithm SHA256 -LiteralPath $activeDll).Hash -eq $expectedHash) { + continue + } + $pendingDll = Join-Path $StateRoot "pending\$architecture\PIMETextService.dll" + $pendingProperty = $architecture + "Pending" + if ($marker.$pendingProperty -and + (Test-Path -LiteralPath $pendingDll) -and + (Get-FileHash -Algorithm SHA256 -LiteralPath $pendingDll).Hash -eq $expectedHash) { + continue + } + return $false + } + return $true + } + catch { + return $false + } +} + +function Resolve-SmartPriorityNativeUiPreference { + param( + [Parameter(Mandatory = $true)] + [string]$PreferencePath, + [Parameter(Mandatory = $true)] + [string]$PimeRoot, + [Parameter(Mandatory = $true)] + [string]$StateRoot, + [switch]$EnableUnsignedNativeUi, + [switch]$DisableUnsignedNativeUi + ) + + if ($EnableUnsignedNativeUi -and $DisableUnsignedNativeUi) { + throw "EnableUnsignedNativeUi and DisableUnsignedNativeUi cannot be used together." + } + if ($EnableUnsignedNativeUi) { + return $true + } + if ($DisableUnsignedNativeUi) { + return $false + } + + $stored = Read-SmartPriorityNativeUiPreference -PreferencePath $PreferencePath + if ($null -ne $stored) { + return [bool]$stored + } + + # Migrate installations created before the preference file existed. An + # active or correctly staged custom DLL proves that the user opted in. + return Test-SmartPriorityCustomNativeUiState ` + -PimeRoot $PimeRoot -StateRoot $StateRoot +} + +function Save-SmartPriorityNativeUiPreference { + param( + [Parameter(Mandatory = $true)] + [string]$PreferencePath, + [Parameter(Mandatory = $true)] + [bool]$Enabled + ) + + $parent = Split-Path -Parent $PreferencePath + New-Item -ItemType Directory -Path $parent -Force | Out-Null + @{ + enabled = $Enabled + version = 1 + } | ConvertTo-Json | Set-Content -LiteralPath $PreferencePath -Encoding UTF8 +} diff --git a/installer/uninstall.ps1 b/installer/uninstall.ps1 index 6eed3d0..e7cefd0 100644 --- a/installer/uninstall.ps1 +++ b/installer/uninstall.ps1 @@ -5,6 +5,7 @@ $textServiceGuid = "{35F67E9D-A54D-4177-9697-8B0AB71A9E04}" $moduleName = "pinned_bopomofo" $logRoot = Join-Path $env:ProgramData "SmartPriorityBopomofo" $logPath = Join-Path $logRoot "uninstall.log" +$nativeStateRoot = Join-Path $logRoot "native-state" New-Item -ItemType Directory -Path $logRoot -Force | Out-Null Start-Transcript -LiteralPath $logPath -Force | Out-Null @@ -45,6 +46,92 @@ try { if (Test-Path -LiteralPath $targetModule) { Remove-Item -LiteralPath $targetModule -Recurse -Force } + + $nativeMarker = Join-Path $nativeStateRoot "native-ui.json" + $backupRoot = Join-Path $nativeStateRoot "backup" + $pendingRoot = Join-Path $nativeStateRoot "pending" + if ((Test-Path -LiteralPath $nativeMarker) -and (Test-Path -LiteralPath $backupRoot)) { + $nativeHashes = Get-Content -LiteralPath $nativeMarker -Raw -Encoding UTF8 | + ConvertFrom-Json + $nativeStateCanBeRemoved = $true + if (-not ("SmartPriorityNativeMethods" -as [type])) { + Add-Type @" +using System; +using System.Runtime.InteropServices; + +public static class SmartPriorityNativeMethods { + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool MoveFileEx( + string existingFile, + string newFile, + int flags + ); +} +"@ + } + foreach ($architecture in @("x86", "x64")) { + $targetDll = Join-Path $resolvedRoot "$architecture\PIMETextService.dll" + $backupDll = Join-Path $backupRoot "$architecture\PIMETextService.dll" + $pendingDll = Join-Path $pendingRoot "$architecture\PIMETextService.dll" + $expectedHash = $nativeHashes.$architecture + if ((Test-Path -LiteralPath $targetDll) -and + (Test-Path -LiteralPath $backupDll) -and + (Get-FileHash -Algorithm SHA256 -LiteralPath $targetDll).Hash -eq + (Get-FileHash -Algorithm SHA256 -LiteralPath $backupDll).Hash) { + # A prior safe reinstall already restored PIME's signed + # DLL. There is nothing left to overwrite. + continue + } + elseif ((Test-Path -LiteralPath $targetDll) -and + (Test-Path -LiteralPath $backupDll) -and + $expectedHash -and + (Get-FileHash -Algorithm SHA256 -LiteralPath $targetDll).Hash -eq $expectedHash) { + try { + Copy-Item -LiteralPath $backupDll -Destination $targetDll -Force + } + catch [System.IO.IOException], [System.UnauthorizedAccessException] { + $restoreDll = Join-Path $nativeStateRoot "restore\$architecture\PIMETextService.dll" + New-Item -ItemType Directory -Path (Split-Path -Parent $restoreDll) -Force | Out-Null + Copy-Item -LiteralPath $backupDll -Destination $restoreDll -Force + $scheduled = [SmartPriorityNativeMethods]::MoveFileEx( + $restoreDll, + $targetDll, + 0x4 -bor 0x1 + ) + if (-not $scheduled) { + $win32Error = [Runtime.InteropServices.Marshal]::GetLastWin32Error() + throw "Unable to schedule the $architecture native UI restore (Win32 $win32Error)." + } + $nativeStateCanBeRemoved = $false + } + } + elseif ($nativeHashes.($architecture + "Pending") -and + (Test-Path -LiteralPath $pendingDll)) { + # Removing the persistent source cancels a replacement + # that Windows has not performed yet. + Remove-Item -LiteralPath $pendingDll -Force + } + else { + # A third party changed the shared DLL. Preserve our + # backup rather than overwriting or deleting evidence. + $nativeStateCanBeRemoved = $false + } + } + foreach ($architecture in @("x86", "x64")) { + $dll = Join-Path $resolvedRoot "$architecture\PIMETextService.dll" + if (-not (Test-Path -LiteralPath $dll)) { continue } + $regsvr = if ($architecture -eq "x86") { + Join-Path $env:WINDIR "SysWOW64\regsvr32.exe" + } else { + Join-Path $env:WINDIR "System32\regsvr32.exe" + } + & $regsvr /s $dll + } + if ($nativeStateCanBeRemoved -and (Test-Path -LiteralPath $nativeStateRoot)) { + Remove-Item -LiteralPath $nativeStateRoot -Recurse -Force + } + } } $languages = Get-WinUserLanguageList @@ -83,6 +170,11 @@ try { Remove-Item -LiteralPath $shortcutRoot -Force } + $nativePreferencePath = Join-Path $logRoot "native-ui-preference.json" + if (Test-Path -LiteralPath $nativePreferencePath) { + Remove-Item -LiteralPath $nativePreferencePath -Force + } + # Remove only this language profile. PIME and every other PIME input # method are shared and must remain registered. $profileKeys = @( diff --git a/native_ui/LGPL-2.0.txt b/native_ui/LGPL-2.0.txt new file mode 100644 index 0000000..f166cc5 --- /dev/null +++ b/native_ui/LGPL-2.0.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! \ No newline at end of file diff --git a/native_ui/README.md b/native_ui/README.md new file mode 100644 index 0000000..4784896 --- /dev/null +++ b/native_ui/README.md @@ -0,0 +1,27 @@ +# Smart Priority Bopomofo native candidate UI + +This directory contains the source and reproducible build script for the +Japanese-inspired candidate window bundled with Smart Priority Bopomofo. + +- Upstream PIME commit: `26fcf6ac8874e76b8f75f6826811b03bfdfc2e89` + (`v1.3.0-stable`, matching the bundled PIME runtime) +- Upstream libIME2 commit: `8ad3c9b433d930ce5614c483461dfa78cedb5efd` +- Upstream: https://github.com/EasyIME/PIME +- License: LGPL-2.0-or-later; see `LGPL-2.0.txt`. + +`src/CandidateWindow.cpp` is the complete modified source. The UI uses a warm +paper background, indigo accents, rounded clipping, a thin neutral border, +DPI-scaled spacing, and double-buffered painting. `src/CMakeLists.txt` excludes +PIMELauncher because the product keeps the signed launcher's existing binary +and rebuilds only `PIMETextService.dll`. + +Run `build_native_ui.ps1` on Windows with Visual Studio 2022 C++ tools to +reproduce `bin/x86/PIMETextService.dll` and `bin/x64/PIMETextService.dll`. + +These locally built DLLs are not code-signed and are therefore not installed +by default. The source installer accepts the explicit +`-EnableUnsignedNativeUi` switch when no other PIME input-method modules are +present. It backs up the original shared DLLs and remembers the opt-in across +normal and EXE updates. `-DisableUnsignedNativeUi` or uninstall explicitly +restores the signed PIME binaries when game or anti-cheat compatibility is +more important than the custom appearance. diff --git a/native_ui/bin/x64/PIMETextService.dll b/native_ui/bin/x64/PIMETextService.dll new file mode 100644 index 0000000000000000000000000000000000000000..b33ce810e2758249b1b1594d946364eb42ff1259 GIT binary patch literal 486912 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

<*Q)=MQS_S#n8)yPuc&9voh79lBh~ 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 literal 0 HcmV?d00001 diff --git a/native_ui/bin/x86/PIMETextService.dll b/native_ui/bin/x86/PIMETextService.dll new file mode 100644 index 0000000000000000000000000000000000000000..6eb63541cfeb0676332f76591e7823bdd4ede773 GIT binary patch literal 414720 zcmeFaePC3@)jxhWS&{`7?g9a$M2Hd<4QfhIffY>xo1n0;A+W)h1luac)E9)^1k~{2 zW`WCa6~C3%w)zw+_Mt6pX$uk+a04_OUWD*cje<%o)kzcEpcH~e_V+n6_wGv)#6HjS z=P%0c-MKU8o;h>QnKS2{nd`oLjgqV=iWUDN5k;xPH~r;_&u{)1X;GB^!{6wyZ0`N` z6?K-WZ(lL9;-LkZ^X5PH;Qa4ClKK7bKKkfmzRd4EkU8J~Xy!wYW=@)3lKIGE_djq$ zzkYqP4A4hbPx`@+Kf7+M`S1AJYsdWzzmKoIaa?D!y+V z*NpGuYi}60T6~WhNA-@c%@*~3{8{$cDfoT=V>galCcdu|_wRq~F9P0=Kie+8?|*Eh zD4+4r_bUj83-#FJQk1EdUdr&#=Tw??PAExN^tJTAMmZ1a-3MaeZ`j zh-(z3&@cR%-^v@jEDVynbUW(Fgw4 z?-oUw_lI6eMzk-D{*Xrr;Qlk0)IF79$4tZy-{D|p@bjxwafD}(fb?b z-~V0TcNL{dp{}6sN%&3@G>AgZ1NJw_YD(rX6la141MzK*Qbp87z0eKw7tH@Yeu=)K z&k9u;(ydbtzH32|Np-pC@_n)RYod)@^`D_{+H>t=jBjl ziX->W9^G~N{#U4^GK+t`E=dXOwrYx&XMN?qoD@gc)k(L)y(;iSUOgPWnrB>jDjl!W z{RUU3CEUx0t5nfuA+BuV>RwTE>FxX-zoJxx?7bZP$gAQ}%zgTPtsgF+ zqP!BqEm_2!^m{k`e%Q5w3Ajz74wLW=-v$1M)G1q^dq_9R% zJh;c#SI-|2IB`Oo+*!7(<+rDklwio$*TXAO1r^G6<%UpxW~8D>5&^!K`R$PumLj2M zNvJm$^IPJej*3E!^e->l1(^Lke29c8N^(Qui@ylS{AN7X7y-a9DP=Ww_TI7x{+3i% z1tMzo6{QisO?%Q&5}uf*V$iq?YA~?d-e4WB%(Ihs~gY`D0T*BkIvdh4ym^!SvJC~h5 z54h@zeE=IcpIUvb_P8VYj2D=N^V5j+iuvyVhq*d|S?->>nmwf)%mw61*oT3Asin)l zA^=tW1%7YRb#kcn^142RX0uw*tWUIv9#lV=9FoMnQWCecn7{v$7!MF~CUbY{3r7S# zJ)sqKwhlpw!^7XiZIolgSVwD8ZX}ADHm+2=D~%5p9kl0$=4#g4=GUxT+d@H@xmrq~A>Db_|A#qX23}-5i-sJ}gMM)QC8{3+Z5bur(r#Kp zd!U`2()`Wrwz}W^`q$U7SvEG!n*HwCe`Fu5|1yc~tmng%cWSOSarbOXeAx*h3u^6j z%ouE%O`mPaK4?^{BPpS}d+S?yokRQo%d{8o0Pb+ET& zMlt7@51HE**zFLv+q^S8#ry~r_D30Ha)vijWi96Oz#>3cc6b<=Dtlji&vbiU{a=%# z<542U<9&Ui7>`Q!esKvu`ZKUa*-4)ONw*GR3(`tihvu>c z4yJ1UPUpF*zCvo)If%^7tl<#PZgie9MCmO$fV&I|DVHsag%Va=Ca|z+xonp)G!CW2%ZmUE3QPcYO27b1D#wP3 zTCN;Lhr(|gf#G?GK92k|D&H5Pe<#s@bRzvb1pRIQQ~H0@1N}*T7V|zoiPC>}PxSxC z3*x?{f1t*e3hf5^f%+H*{np-9_c5n#?d<`f$NdSUokdD_E^|3BIM8w5Ax$^wJ4qP1 zZ>IB|g3cSo)8grDS4u(X5C52?5Kw}xS#J?QZ%Jaiv|M92>Ol+xJ%y=uxA^y$oaeVW&kKFvL*yLpLL#`!}_LB0u- zVUfH%8y{L(CzMw(;=i#}cenE?xI0eV^*df}g29sa3Vpsp_33^f+8Q#g+qY9UGurz2&F} z)dMNCV(_1=wDFIA1O(g3KJ>SdtrtAw8%s2uOy-N7<);Tj{yutsMr*ISF=@RV9^Ji} z2cdi41S>1yLa~?#rzn$pIY^ez?6UZ5ROOF@fvMl-1;`|R18`wOX!<-5nPJs#B1(Wj zeEkxXH+0jGlGa3UIe)E>r}xYrrmspxcb^Qq+JKS5&n_m4bCB`nnRt#dm1r&=rTSk` zW1OgwNOfvMRPRS*bmFm&gx#Zx5Vxj}gM zHxqsxxA%oIbsa@liTa)>`R7f9o!YNf2(@7ILYo*3)T7~8$45W{qQmj?Wq5Mja1fb5 zKt7l#mpB}W=DRT->N|1vL{?Ay&(3KzZGoCJCG2VkqKYp=pFS^~I%zP_91Fc{u0UMv z)DN2Q^lAq?=;fGE6_#3QLj}5{`O{dQHEd1ILrazlrquJ-Xp_cuhEp2BjAs7}ZS;_E zA=r|>OyfxYqIEM0#j-kFm??i{$uG>dbZ?aW%AqfQ0BaN03}y`;^9`!B2nPN+hz{IK>Lwv_iW+&DKyj8AVxI;V9jk)=)SBKSpZP9C~@W=FQN` zGqu8;Fm+1_!yLgUectNf#Y2^tvp9792+ha)M57|G89@7`+E2kF=JX;BXd+{vVzP=(@NJMup4pL z5H<+hH6ww$R=EZR7LQd{7UuZ}u|hkW<_Me^6lk&Gpk}$?(xBN1W$-rMFtjq=j!i)7#8SK3{Gony%SK!IC)T&-A8P+qq z#~~M;>WV+2_kpictJAe|XeD7yKo7G9G%v>r+NzYYuVCygi;ywh#jrNksPVRS^?jyY zJzTC)v4pw#SwREHrW<8}zn;+YqxSS=@*Zo1dfKB~%V;pP{-hItPqDT*jnDs;Pz|gB zrWN7CmqAGQM*0|XGD-oGFE%R;{l@}=xih@Udv~M~EO)0mAUQlyvf4yJ2=vH#pz0}h zDsUiGF5ZoP?JyP$SID(@yIRn$7n*B^AfTCjyGr)WU(D}*#_Zc8a{Ub?0-uT{_@(IZ zAP*ml8paZQR+_O2cWMjL^f3eBBY>O1QOcizzF@A5{+Y-VjrtXUMgJ2+O zTejgRx9o=)rqq(ID-A)%ug6txNF7i(%8;ROVIGmzPz7^o(pWr69gwOOIl@JTJ({W& z-m4Yfrxo6>2RWdU()ZAGS$SQh5*eH|u$Kemxm@0qH?EG|P=o8h2)a%!_2MLTIIL|; zpgw6XOuBz(@0G0%oh$aRgZ%%26DoUEOr?4DAWy?DHr-K2Bbi+v=;*IL4Sk>lmZYV! za8(i%R{x6Gs9NkPjfn2*dJ}b;dLGz*5}&DhkV+~oYLU3m^^;iHSLRh_dT93He>@A4 z1*wcQUu`eC5|g|vlM{VyzY{2yu+b`oKMc`j0usx&o~iBCj@v0}@D5C>Fd_6835WD~ z7DW%zC7PsqbOF%A2Yg@=^Ng&t;71mvHl)^`#|Y@bMpX6~&9Bv|`R2Hich|&~P*pxl zwho4biPRNGfKc%a?qnoRHUqWl zwO#RFixTR69;PCr+XX)0Y*O}O<8c~f=M)0zI)Y;Uij5%Gj1dgZl%47A35(0IG!Z`V zln{CrBq2&LGMKwP_ies%6~q}HJ}9dNAHf?E8DzRiNmRw3Tp!GNH)@X-d%O9z$g$N9 zkIF~$lT2YVOs)pZpoY=d0HcxoYC^L?7SpxD41B?2%UTH=u5i@K!W>9AF(CwQ7)+H_ z)q=(e_OfvNS(S<`>fUBwf@+DwcWn&cK-+y6P%f~bw_#BWuC z8g^}>OU=Ixb5V-s+QzCJ%OI`fLH!}5A#h%;9)uZ4^KV2|a_SO*)+wyv8y&fub=PJn zxEDQqehbE=5zU!vv*y|a1rDXUO>@6k%&&QcdY(pW6}Mf(ZTB`qiDB(H5H9|9s6pNR zB7YRoA?Dr|@o#1peOB`fSeAjBHdS{u!`r16xtdXlw1I_B5;fZb=hUiEY*usrg*p69 zbOjuK7d-XgaMj^{QFn*Jsd;01Ik2*KZN$pn)dZpiYL2RN)y0kYU1U`UxI=1DV}om( zMK7{y?mG0b&cok;Kb5(U0!}z}BLL9jN3vO=*yA0E0#@z9qd#0B2i|RiIWo&0PMw+$ z`+vG!D|Ph1#Jf8~%+XrC6`PFf7@_Kxj`~c4d*&C(o98mMfo&afDT6lOmFcj#~ zGo*c_71>!>o9=+G7m^{xAo>Y;fZ+mg)H<9(R3TUxsz3A@e2~z%*JB6(_BaO zd|29;5@`N!qc06yJ6u_1$*&Fh&t3C}@}I4u=FDWd}<6YnU#WTSyDo zHBMT(vg?gt*BgVzm{WHWwAGw)sb@1$gILt2@V@US>a2^f%YV_AYCsMJ^{=uy4R+89fqfXrk5OTT4tDxb|ozR19XX%yIr~nfRK4HN?wEu zr&5gzIS8bCgjJ1!MjnAs4qSNyn5E0gzS8F91K^n>){g~j!4}Ge-4u#E!1N0;-Kx{&+<8$dy{NjSPJ+Be?$S6x_wTH5%jXh$Am59+PN6wv*Bn1 z;^x2`EJyr7AvLw?8kUkD4c;UM(}s&++9eV|%v(g0WJ3yAiT8TflmZjpw+PW)A)wZa zg=$YBI>7zyJ0@IHLRfE%ObWBW(IS+j$=?r@QjE&O_x}x&ZpNr?gKH=I;5Wpm5@Q@A zgzr5^A|%DcbTvuO!5pA;St3euyz^q?-IF=x+aR`l@9A4Q}3vHM|*EiZ1m+RyIjS#-<^P15VWIC^!Dt&+;p7thnD zuM@04c8yr(qzKN3FLV5AUP$^p#kea3BSm;R$py5!)D*B(Az(R=cNMTWfz7_7vt=Bp zMBj(-E%omy{&#p~&bVwAU*F2vUVb^;+a&Wn%-`sbSATpB6xo%qB}J3|6?K5*<)6Yi z+^v=D|I)brcT*7Tl-KM*is-?k^F$8}d?tIjZbI%dd|izb4AZxH-XT`N_4!iIIHaD5 zl5@bx874AG0-3))7LUw*Uaow5WF$Ti*;2N6jMTWn2-NNLo_VIyR?2^YRWyib^nI+C zKPL<37=wZS(LKNnrw}J%z@VfbmX&%KFd8rLSD_=ELLq=)XmOuNm7T9WoTRk&S=5)V zCy2(@NL3nNjAAim5@-X5bT99BLGT9uU`;AL8HO8!&mxAMHk($aqgmmk#N34;i8iyk zLL<4Q{Dt*TiQdyXYbMID_L@x|5UjH%v1xe(?FML-L}*yq=7rL>B{iihn*$Y;mK(Y+jRkxph7XNrGdpxzp2um=8RUGOhBP}#oLC)nN{wL_wH zP>5=3tXdoDz*!mGRN85!djABh+{3NctV$Yh@n@_mu#C^Q_|sMu zB#qBc^4nJxB#+Ne_FGY-*U-a(y%sn=Ct8Dt)k%#ADQh-NtSU<`LBL~9d2R?kPrEXw zyef;^cTnIEq+SU4eE2%t1om6k?d2@y!dbEvS^+Q~-l+sE#eeB51@cG!Zu`uDW;_URW0lMqBM=#9tL}p|LxZ)cg;1=Jo08jF} zR~Am#WFeEh6Rr<^kub@3Q4ERIG^15^hi?!J%TfxN9QrGbsKeRezl5GSM}0nIw3}tL zn={%hnP`*%?j}p_+vR+;Q6Rd+@-qTs6+|WTM=|9m$VU4~VvpM+`PTRn(SI!B?G|>Z z1dr8bb$VA8OxEwVQp&}An|8NdzcXE%?`SBPplEkymg-NWX=QeXsP_{Yft^{JXH+0G zQk$5=%Iwl4!Rj~OQ+IWQU1I(R84(*4ArV~K!>$gh33tq24}fBn zraE6LQSWNA}I=@Y3xhJ7VXcmkw^CsJ$-s~h^9Q!YDs zPdqW@{83y&DV_+QJNNa;8CA$R3DI1hyGC#Vsh}sSA_@wxY+TBZ1{lg?W|g;mvOg>u6^ej~mO+ zH25W_M}8?~i|l$nEvJUCVh^nOnc5}UpM%RZ2UtwYDW8)_0Krdo-F=$x{8uDWk=00% zztbN6i`7y|NAbB=;!|+~J_UZ+cTE*u;e+PjeWJewJO@HJb}t+%tTc`7WYr@5=`>i? z*<5|SZXE^(JMtO7RLPHBf)Gh^yO)XLXV&v z%wcg|oJoOFqk<*BAgnYn$*c!9fd-RuASfMj`1N`N%7Qw5A z$qdbq?nSiX!I2aI*d?Ly@7w%sGw12!cA-g>CHZwqfB>h=uJq=!L=gzgf( zMSo3xG)LI(~V#)7DuI>(bU&h>-z!OMm+X)M;W`k}OiMEJDc_Le=H>Es9 zBZzjkou~;y1j3UH6+$j>!|%<)hUc4t%G&lER0Ty+wIE%wB@US?p{{t02pUPPzT|bX zq>v}Bx!XjFo2$8H3(){u6H*1?ss@QEIUFP`Nb4u>X}vDc(dTs<2im6~Zs?OOat2pd z3!ny-3@YZYpqAL_VH9IMgX~V- ziUl=*M7B^@GN5rL+_K?#0Vcz}i; z%%jHWQahS>Tytd-p-{0-#Pw;(64^p*ue;aqlON!jI`O7j@#-IAiy2}ROe|5!YwB8u?n7wS z(_qilTx(VaZ>PtBk7_T6{4#pM5Lzrnw2v6ANdh}c zUsA%rfFX0I$zVL3cA6NR`jyv z^Cy20<)&9r5alK_9sVA9-%Q_u?FM|^NMjL$t@)e4K}Y%TDNaM-O6bfcCJ2q-X_E64 z_^43wQIqbXu7|?bc`-h6fJWe>P-F{Tfsee0FseZ!o$g7R%McqxO2{6hgzQAELmkLj zpnD$P{|u`4uGk=WD#RoIrg1-taSu^ihbyG(9#|G4r-Og|7f5Z8ev==wwijK=d=61& z=5tJ?3ZfZMPnJm>_o6Jte=pl2luiy3p?nwV7G54+kW8~A8DQIC4akS#LEns%uHT2}@oj(a-V2%25bXu!G*B<} zUmY0B zUGNm1iJu|-Y!E_1>IF|#jHfnV^r@H1r}mRiMWmh{%t=_FnvDlj>=9ZgVgTK6QJ}j) zbabVzLUe_R=`pY~UCxuvwKPwv!S|t_Rtcoz%tkXFxdu&X%7?Q_7YfJ~k{z@-8+`+a z10((>;y({R{zdokx&YT1Bm6!^RJ!o##YPyR^w%vT1zBExP>=;q{rCZv zqbNeU~!-nxvm;VH_Ae+@~%(_BL12mh2)-spYd~4hB5qT4t z3isejn!ctzC9EU6W(((8u>;rlNy@3vk|NAg>;jMu(hQnq!y6^FJOQz&~ z!@!U>YuPl~u7OPhiZ(4x#TI150M!8s>*v6QHrcVNUm7k}PEKpc8;rb4!zRS)azQc1 z114b;+e@a#ZX|n{8$a|#79*p_jH@3ko`IF-nTAM&EbN$FX?C&hH2e#R>j&76N8{~B z>o?esv_VFn%zh9cuXwOs&Wks;dV{En|KTVLIAv zlZA%86d8OPO^AddM~$FBMuYp&faFsh5Uj)HTupr8*E;;tf}8Le7Ab5}h($5(Hi^3@ z#9hiRGwxC`?#>o>E5u#W|HfS^Ms8fYRCZSW`ef41#?M}uE2si;$jxqOry~){EgOT` zl?4eLO~(U*^KcaoF2yJHA{?wWuJp+rw2QP+&gDoOBzQ1u=&KkHrgr@3pJC3>_7h!S ziQmw2Dcn;;h!{UpJr%oYni6)ofiC|L6A44sPp6Il?QW5aN2ZI1SA~EY`9^d>H)n%d zy9_uno#;x64(WDvxV)&Y(_lP7cJ_Z?2zAe6WDbra1wcj58U_jI z#zje>lZ`inH^}9AICuh$OcHbzGeH7^8YKbM?ui7;K8ljymv<(R;K%qG*e-N{WMDR7 zENO`%!Cs!oyTWlr2GASC)oYjH2}u0e-iU8_?855PC!oUu+erdbrGS;HMMBUdJOj81 za7M8%q!;F>4NW9J@{O1*qN+Do{aMH}Z?^=Zq6`$%mKcqXKt`}kSY zf6&LK590c$4qpnaE|hO=WJ?cgr55w3*FQvKCgzKP7$?Q|kkNfaxc0QBncWv@))*|= zg-vLxh!7Ym2x-&Tu0xqxB)$@uL}X$Ug^Oo+Do#U6U^|Y)2(>yWpS(hWBON7^#h8(H z=Q&XHOsAQ^5Qf>fyr?iB4Vr}E^>S(ci7e*-M3`tBIodBW+f%Pdmk3q>MZ>`^BK4mr ztIq)dz%xwXBtryT&`|*IqOuI&M7E3ee60ljR+-WBECYBWzHtkf3z5Z@F(pu%QZ`%b z!2JtnoE8Azhb72O@L@*tTTEm5`?x2KWj^hXFxc*(k4f~=gxo>Ck3Md~Pif)69~NlK ziN!BzvkS#Azk)B5qNFnVs2VU4bt=p(WfV#s&Ad5mylz#UjSH^Ur$?|!w-57X&S9hV zX%?-|%3;_PEh3jk?v?mhMaG<3OL3EnWX(+*i^b!M*>G8ttq%fL0}2;Cg<~An9vc`e26vl-34E}zZX^rzJZ<+Z=`xEZ+uIT z7rRpKK%~q=Mfz5OKZ*DOOGX!;C*Ma9NNOPIS7B2Yc|be4d=m{hJ@vb z7%}ioQ&1OnCjwt#g_f^at;nzViZH_R98}pf|BZM9+1uZ)m5?XIC(@FU7U4=CWT zrQt9GL~f|#)qF3eadiAqgs?@&>fSUvb`Q2HAt>Qx)po5Y59HLQPa2nkJk-*eY&zwk z_Gd+uhgyU@)VR)fPzakkzA&wazRw{R%rtv{v0li^(cX*onATEf#-iBRHhs$mIxWA& zFE&l27+d_8K(?b<#z-(Wvy4e_S>aUw5Nucj-oTm?M?&grp%yrp6=Fx}mXYrBHj%07 zYR3L=d5{w?L@VKk*4(=T=in;+6GT`Yo`;1oXS3SiK-6Y6IzL~KNq)jF)tJ9|r9G!% zQV!<%n&y^wAwhKzk|o&<5Ki^!fp|2Od$)-9F!rUWcIaQ(;aIdAq25c3SoeO-yM!Mt;J9}KK0vLs5e%)SS?oHQRmb3GcQ?;a ziw^33c+SsaPYSEqmRvtWpY`qxHhruMU13j_3`JP#{Kk2KL7(i?M#8q`4?-SzG` zR~??C1}Vu$0CfX`a5iUm06J{zf(|NIi`>oGVdV7Zd35VIY~K9hG3s9vD8O9XBJ-y5 zAO1lOnZp>eU@;sofde3y$m_34$m=gpOsT8(w@#%=tx2FDBM0h^oYr0RoBZE!elvF{ z`&4p!@XX?&(5LE-N&O?!JbYJ3YM(QUd!a(>-__Ur@3yXniP3wOxY6VO00sA;DR%MC zeg(5)5ls20jFRN1L_F!>SHHC{1dL`XoE?-=9+QZ8iKF_)M2GDxH2aVY^-^E6plJ&B zHbgubtOMSDf3G|WN6M2z5`r}CCq zk$^NF*-g&+C4HZ=I?pfY#m?dw8a6S*8_7W|lBXj+#wH>e8m!xyeSWCBlJcGeFmiST*P-PiUQ%t4w_(z$vXpwBFPQNYQXb@dzLJFYFH4?(P{`GoM@QjveE6K zhYY+?y{FQN8H_psE8tdOp_h!p^uy?wv0ONzob}iZRM3u?X=f>ajG|Q&Mg=fg5LvMUPz$+hUS1<>khqvV47@MXu4Ftp z&}N58Mj>YspaOKhM~?X$S@&RxTuNE%`73};ipCvJ|GvpH_4 z0LqO#z5EP0T9pVj5#f{9XDJsX~c+OxG+}7mIR+7 zJc3V(vBI2ux*UTw^oTK5rho|hAU&{XEY1}wrA^eeuK{sv>ti2MBITEo^>8rDYEm%h z+F`XefGhq(;zH4{4)p6b!G&WJ`_&;B!shiLDJzo0pF<2O*0BzjpFCw%J6P#zb=kpb7Z#%J^~2Wg(JE-<5wv9kvUOvlq3$?oZL_TYEc zn`aOHbDA(QjI#%yXpU3oq(7zn37c+6_WRgxk-hWKSBD_Zltxwi3Fv|iDcO4uokKn% zvOo|0L)r{GwVKm(w43;aqur1)g~^Zv7s`p2X;s!~aXfn9{|Luu+6nW8kmn zFOVaZEpm*m6n%&0J>IZMuCrPHJQB4qVL9rrFHn*|_x;Omyqsji-#1XwZk&KQ)xE z`Rm-KSHZloat~7q^d5Cm6BJ4C zMzTE*zL8}@#{NR&YA53H9|FfLWdJ`+7TCcz#+bn8%K7tu3Ev)tKVQP1^nVMV3W zK1qBzW{R)0h2krHrTEHtL40Ly!&k%dS`45PUcQpP@MkQw!pm37-%7*sHKKg^^F~2< z`3upj7o%6}j4S<_&A19LUvK+s4ATtavTm|q}^buzNT_=<=wddJnnlUuTh1_;LXT3i1^pAj!Nb1N0GtJ zy4d&{gNx;(aelG6L$Vl~ zSL58Dv>u7EN%ZPlz_Xxhec0r5ob>036ki0Ugm_CE6L9R&IKXv^sV-k9D~x5&5Hn$-Pb-ehvqlD=MC}-Zv1dfRJwBAt75&ML zrc4aJ@rW11=o9|1(g(uVwkREpFu9bUEtD(5XNaq$A6#&i;RiRS*>0P?h%3cZyH&O) zzC3|4`s>D_?3qRs6Y%e_0#@<@}8In@| z(r#EFLV^u(?!pTP_)ut$I5vYyqJ{5iY*UZ&So{U}14~-|7r5}n7O(yyb=u3{Ku#o? zI9<0`qCT=6SbkQXmY+rbTerGiq(?e$_i72*T}jND8mE@dyCH88QY1dS_43$2gnZd%LZ##MUDgT_@x zOPO(%*-~O$*<0?wRkRn9Ufw`{R)jsC=_{pdwdH@`ESR98-#F&h5iH&nPM^nsVXEU zO%vrv3&lPMRJzO~CG*Mli8p@ zBU?A10ehC3@vjf#a(WJA-Z;LI_6~@nDxsymOPSy8Gb&DEek+bRu-gQWnaX}lE%j$t z;PBAu;oqd1k;Sq;scp_f7a@6PRS3X;dY6uDpWC9EH#6$#1{O(dfGtm z($VqsHuC#_u?tXzD3$|kN?A*OE^XT|HzpVW0dHxIO@Y|@rY_yFh8~M~lycaZ5J-u& znEzr}M{Tg^EYW?6jDPZ{u_p&!CuUL9;1TSAHvEkV{6qaoy(zvwiTp+P|2yG6_@^w! zKP5eJ4_3-0{ECC<8LD^o46NA>M<{`=x69Lsi+M-CiJyo()^OVlhD;!0*Xyikvnb#F=9COs33Uj zxk!A(HjaOZC(AIBc!NWXE4$qP0QX6&M7J%`eTtXeL~pZT2jI_Gy0D+(PaEfPz^|NV zYo(Jj6)N+!EnS2=y`0641xf6H^MG#>%cqkvCX}*;HYOxb-?~l?;}8$L@KF;mCYAl? zKz7WHwn7{cV~gMM6Nhh1|Ao8q=YOoxDN#oOe?wm! z?x5unX#m=JWU2|=2frPU@f+TM5L-XOl@qtnI7JRAWEBYY5EGpL(R^N+!&f*BmOYNe z94$KfVxw;(|LF$?w+izdw-ikp^wD!*BCm-VRov&l*$4Z$EgfNTw%^0cenUEd2AzNJ z1c`laB=;CEf>cBFQRxIkpRydTsuv|GtmXtOYm+TXO8E_Y&_+BBIr_k;cO_=Y!7H(B zc*vE-lW{8QrUi<_uwP(k5l3;{MU+|-R3S?p>B-p8=cb7^dP-Z@gyNBiC~X}t4WoDo zLm~$q?Du=zq9tIa!hiZ~f@Lko>-OW(`E*$u5hFHa2_tq++ddOEi&*ssr{XFc^x+c? z6uuLC7YwW9zi|}G(ziBJF(RY*)Lpfn%6p~dBG

wO9>p<){-~3kMehB#3og!g5&D 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 literal 0 HcmV?d00001 diff --git a/native_ui/build_native_ui.ps1 b/native_ui/build_native_ui.ps1 new file mode 100644 index 0000000..03c2030 --- /dev/null +++ b/native_ui/build_native_ui.ps1 @@ -0,0 +1,54 @@ +param() + +$ErrorActionPreference = "Stop" +$nativeRoot = $PSScriptRoot +$pimeCommit = "26fcf6ac8874e76b8f75f6826811b03bfdfc2e89" +$temporaryRoot = Join-Path $env:TEMP ("SmartPriorityPimeUi-" + [Guid]::NewGuid().ToString("N")) +$cmake = "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" + +if (-not (Test-Path -LiteralPath $cmake)) { + throw "Visual Studio 2022 CMake was not found: $cmake" +} + +$resolvedTemp = [IO.Path]::GetFullPath($env:TEMP).TrimEnd("\") +$resolvedBuild = [IO.Path]::GetFullPath($temporaryRoot).TrimEnd("\") +if (-not $resolvedBuild.StartsWith($resolvedTemp + "\", [StringComparison]::OrdinalIgnoreCase)) { + throw "Refusing to build outside the temporary directory." +} + +try { + & git clone --quiet https://github.com/EasyIME/PIME.git $resolvedBuild + & git -C $resolvedBuild checkout --quiet $pimeCommit + & git -C $resolvedBuild submodule update --init --depth 1 libIME2 jsoncpp + if ($LASTEXITCODE -ne 0) { throw "Unable to fetch the pinned PIME source." } + + Copy-Item -LiteralPath (Join-Path $nativeRoot "src\CandidateWindow.cpp") ` + -Destination (Join-Path $resolvedBuild "libIME2\src\CandidateWindow.cpp") -Force + Copy-Item -LiteralPath (Join-Path $nativeRoot "src\CMakeLists.txt") ` + -Destination (Join-Path $resolvedBuild "CMakeLists.txt") -Force + + foreach ($architecture in @( + @{ Name = "x86"; Platform = "Win32" }, + @{ Name = "x64"; Platform = "x64" } + )) { + $buildDir = Join-Path $resolvedBuild ("build-" + $architecture.Name) + & $cmake -S $resolvedBuild -B $buildDir -G "Visual Studio 17 2022" ` + -A $architecture.Platform "-DCMAKE_POLICY_VERSION_MINIMUM=3.5" + if ($LASTEXITCODE -ne 0) { throw "CMake configure failed for $($architecture.Name)." } + & $cmake --build $buildDir --config Release --target PIMETextService + if ($LASTEXITCODE -ne 0) { throw "Native UI build failed for $($architecture.Name)." } + $dll = Join-Path $buildDir "PIMETextService\Release\PIMETextService.dll" + $destination = Join-Path $nativeRoot ("bin\" + $architecture.Name) + New-Item -ItemType Directory -Path $destination -Force | Out-Null + Copy-Item -LiteralPath $dll -Destination $destination -Force + } + + Get-FileHash -Algorithm SHA256 -LiteralPath ` + (Join-Path $nativeRoot "bin\x86\PIMETextService.dll"), ` + (Join-Path $nativeRoot "bin\x64\PIMETextService.dll") +} +finally { + if (Test-Path -LiteralPath $resolvedBuild) { + Remove-Item -LiteralPath $resolvedBuild -Recurse -Force + } +} diff --git a/native_ui/src/CMakeLists.txt b/native_ui/src/CMakeLists.txt new file mode 100644 index 0000000..137d453 --- /dev/null +++ b/native_ui/src/CMakeLists.txt @@ -0,0 +1,43 @@ +cmake_minimum_required(VERSION 2.8.11) + +# override default c/c++ flags, add /MT to link VC++ runtime statically. +# NOTE: these two lines should go before the project() command according to CMake FAQ: +# https://cmake.org/Wiki/CMake_FAQ#Make_Override_Files +set(CMAKE_USER_MAKE_RULES_OVERRIDE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/c_flag_overrides.cmake) +set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX ${CMAKE_CURRENT_SOURCE_DIR}/cmake/cxx_flag_overrides.cmake) + +project(PIME) + +# load current number from file +file(READ "version.txt" PIME_VERSION) +# we use semantic versioning: ..[-] +# convert the version string into a list (separated by ;) +string(REGEX MATCHALL "[0-9]+" PIME_VERSION_PARTS "${PIME_VERSION}") +list(GET PIME_VERSION_PARTS 0 PIME_VERSION_MAJOR) +list(GET PIME_VERSION_PARTS 1 PIME_VERSION_MINOR) +list(GET PIME_VERSION_PARTS 2 PIME_VERSION_PATCH) + +# http://www.utf8everywhere.org/ +add_definitions( + /D_UNICODE=1 /DUNICODE=1 # do Unicode build + /D_CRT_SECURE_NO_WARNINGS # disable warnings about old libc functions + /GR- # turn off C++ RTTI + -DWIN32_LEAN_AND_MEAN + -D_WIN32_WINNT=0x0600 +) + +add_subdirectory(${PROJECT_SOURCE_DIR}/libIME2) + +# PIME 1.3.0 links the TSF client against jsoncpp. Keep the library while +# excluding the unrelated launcher executable from this UI-only rebuild. +set(JSONCPP_WITH_TESTS OFF CACHE BOOL "") +set(JSONCPP_WITH_POST_BUILD_UNITTEST OFF CACHE BOOL "") +set(JSONCPP_WITH_PKGCONFIG_SUPPORT OFF CACHE BOOL "") +add_subdirectory(${PROJECT_SOURCE_DIR}/jsoncpp) + +add_subdirectory(${PROJECT_SOURCE_DIR}/PIMETextService) + +# The Smart Priority UI build only needs the TSF DLL. PIMELauncher is retained +# from the signed PIME installer and is intentionally not rebuilt here. + +enable_testing() diff --git a/native_ui/src/CandidateWindow.cpp b/native_ui/src/CandidateWindow.cpp new file mode 100644 index 0000000..fca00e9 --- /dev/null +++ b/native_ui/src/CandidateWindow.cpp @@ -0,0 +1,439 @@ +// +// Copyright (C) 2013 - 2020 Hong Jen Yee (PCMan) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the +// Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +// Boston, MA 02110-1301, USA. +// + +#include "CandidateWindow.h" +#include "DrawUtils.h" +#include "TextService.h" +#include "EditSession.h" + +#include +#include + +#include +#include + +using namespace std; + +namespace Ime { + +namespace { + +const COLORREF kBackground = RGB(250, 249, 247); +const COLORREF kBorder = RGB(218, 216, 211); +const COLORREF kText = RGB(38, 37, 35); +const COLORREF kLabel = RGB(111, 105, 96); +const COLORREF kSelectedBackground = RGB(231, 235, 248); +const COLORREF kSelectedLabel = RGB(72, 83, 145); + +int scaledPixel(int value) { + HDC screen = ::GetDC(NULL); + int dpi = screen ? ::GetDeviceCaps(screen, LOGPIXELSX) : 96; + if(screen) + ::ReleaseDC(NULL, screen); + return ::MulDiv(value, dpi, 96); +} + +void candidateGrid(int itemCount, int maxColumns, int& rows, int& columns) { + if(itemCount <= 0) { + rows = 0; + columns = 0; + return; + } + + // Smart Priority Bopomofo uses two columns of five. Fill the left column + // (1-5) before the right column (6-0), matching Microsoft Bopomofo instead + // of the original row-major 1/2, 3/4 layout. + if(maxColumns == 2 && itemCount <= 10) { + rows = min(5, itemCount); + columns = (itemCount + rows - 1) / rows; + return; + } + + columns = min(maxColumns, itemCount); + rows = (itemCount + columns - 1) / columns; +} + +void fillRoundRect(HDC hdc, const RECT& rect, int radius, COLORREF color) { + HBRUSH brush = ::CreateSolidBrush(color); + HPEN pen = ::CreatePen(PS_NULL, 0, color); + HGDIOBJ oldBrush = ::SelectObject(hdc, brush); + HGDIOBJ oldPen = ::SelectObject(hdc, pen); + ::RoundRect(hdc, rect.left, rect.top, rect.right, rect.bottom, radius, radius); + ::SelectObject(hdc, oldPen); + ::SelectObject(hdc, oldBrush); + ::DeleteObject(pen); + ::DeleteObject(brush); +} + +} // namespace + +CandidateWindow::CandidateWindow(TextService* service, EditSession* session): + ImeWindow(service), + shown_(false), + candPerRow_(1), + textWidth_(0), + itemHeight_(0), + currentSel_(0), + hasResult_(false), + useCursor_(true), + selKeyWidth_(0) { + + // A restrained Japanese-inspired surface: generous whitespace, a warm + // paper background, subtle indigo selection, and no legacy 3D chrome. + margin_ = scaledPixel(10); + rowSpacing_ = scaledPixel(4); + colSpacing_ = scaledPixel(8); + + HWND parent = service->compositionWindow(session); + create(parent, WS_POPUP|WS_CLIPCHILDREN, + WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_NOACTIVATE); +} + +CandidateWindow::~CandidateWindow(void) { +} + +// ITfUIElement +STDMETHODIMP CandidateWindow::GetDescription(BSTR *pbstrDescription) { + if (!pbstrDescription) + return E_INVALIDARG; + *pbstrDescription = SysAllocString(L"Candidate window~"); + return S_OK; +} + +// {BD7CCC94-57CD-41D3-A789-AF47890CEB29} +STDMETHODIMP CandidateWindow::GetGUID(GUID *pguid) { + if (!pguid) + return E_INVALIDARG; + *pguid = { 0xbd7ccc94, 0x57cd, 0x41d3, { 0xa7, 0x89, 0xaf, 0x47, 0x89, 0xc, 0xeb, 0x29 } }; + return S_OK; +} + +STDMETHODIMP CandidateWindow::Show(BOOL bShow) { + shown_ = bShow; + if (shown_) + show(); + else + hide(); + return S_OK; +} + +STDMETHODIMP CandidateWindow::IsShown(BOOL *pbShow) { + if (!pbShow) + return E_INVALIDARG; + *pbShow = shown_; + return S_OK; +} + +// ITfCandidateListUIElement +STDMETHODIMP CandidateWindow::GetUpdatedFlags(DWORD *pdwFlags) { + if (!pdwFlags) + return E_INVALIDARG; + /// XXX update all!!! + *pdwFlags = TF_CLUIE_DOCUMENTMGR | TF_CLUIE_COUNT | TF_CLUIE_SELECTION | TF_CLUIE_STRING | TF_CLUIE_PAGEINDEX | TF_CLUIE_CURRENTPAGE; + return S_OK; +} + +STDMETHODIMP CandidateWindow::GetDocumentMgr(ITfDocumentMgr **ppdim) { + if (!textService_) + return E_FAIL; + return textService_->currentContext()->GetDocumentMgr(ppdim); +} + +STDMETHODIMP CandidateWindow::GetCount(UINT *puCount) { + if (!puCount) + return E_INVALIDARG; + *puCount = std::min(10, items_.size()); + return S_OK; +} + +STDMETHODIMP CandidateWindow::GetSelection(UINT *puIndex) { + assert(currentSel_ >= 0); + if (!puIndex) + return E_INVALIDARG; + *puIndex = static_cast(currentSel_); + return S_OK; +} + +STDMETHODIMP CandidateWindow::GetString(UINT uIndex, BSTR *pbstr) { + if (!pbstr) + return E_INVALIDARG; + if (uIndex >= items_.size()) + return E_INVALIDARG; + *pbstr = SysAllocString(items_[uIndex].c_str()); + return S_OK; +} + +STDMETHODIMP CandidateWindow::GetPageIndex(UINT *puIndex, UINT uSize, UINT *puPageCnt) { + /// XXX Always return the same single page index. + if (!puPageCnt) + return E_INVALIDARG; + *puPageCnt = 1; + if (puIndex) { + if (uSize < *puPageCnt) { + return E_INVALIDARG; + } + puIndex[0] = 0; + } + return S_OK; +} + +STDMETHODIMP CandidateWindow::SetPageIndex(UINT *puIndex, UINT uPageCnt) { + /// XXX Do not let app set page indices. + if (!puIndex) + return E_INVALIDARG; + return S_OK; +} + +STDMETHODIMP CandidateWindow::GetCurrentPage(UINT *puPage) { + if (!puPage) + return E_INVALIDARG; + *puPage = 0; + return S_OK; +} + +LRESULT CandidateWindow::wndProc(UINT msg, WPARAM wp , LPARAM lp) { + switch (msg) { + case WM_PAINT: + onPaint(wp, lp); + break; + case WM_ERASEBKGND: + return TRUE; + break; + case WM_LBUTTONDOWN: + onLButtonDown(wp, lp); + break; + case WM_MOUSEMOVE: + onMouseMove(wp, lp); + break; + case WM_LBUTTONUP: + onLButtonUp(wp, lp); + break; + case WM_MOUSEACTIVATE: + return MA_NOACTIVATE; + default: + return Window::wndProc(msg, wp, lp); + } + return 0; +} + +void CandidateWindow::onPaint(WPARAM wp, LPARAM lp) { + PAINTSTRUCT ps; + BeginPaint(hwnd_, &ps); + RECT rc; + GetClientRect(hwnd_,&rc); + + // Double-buffer the small popup to keep rapid candidate changes quiet and + // flicker-free. + HDC hDC = ::CreateCompatibleDC(ps.hdc); + HBITMAP bitmap = ::CreateCompatibleBitmap( + ps.hdc, rc.right - rc.left, rc.bottom - rc.top); + HGDIOBJ oldBitmap = ::SelectObject(hDC, bitmap); + HFONT oldFont = (HFONT)::SelectObject(hDC, font_); + ::SetBkMode(hDC, TRANSPARENT); + + fillRoundRect(hDC, rc, scaledPixel(12), kBackground); + HPEN borderPen = ::CreatePen(PS_SOLID, scaledPixel(1), kBorder); + HGDIOBJ oldPen = ::SelectObject(hDC, borderPen); + HGDIOBJ oldBrush = ::SelectObject(hDC, ::GetStockObject(NULL_BRUSH)); + ::RoundRect(hDC, rc.left, rc.top, rc.right - 1, rc.bottom - 1, + scaledPixel(12), scaledPixel(12)); + ::SelectObject(hDC, oldBrush); + ::SelectObject(hDC, oldPen); + ::DeleteObject(borderPen); + + // paint items + for(int i = 0, n = items_.size(); i < n; ++i) { + RECT item; + itemRect(i, item); + paintItem(hDC, i, item.left, item.top); + } + ::BitBlt(ps.hdc, 0, 0, rc.right, rc.bottom, hDC, 0, 0, SRCCOPY); + ::SelectObject(hDC, oldFont); + ::SelectObject(hDC, oldBitmap); + ::DeleteObject(bitmap); + ::DeleteDC(hDC); + EndPaint(hwnd_, &ps); +} + +void CandidateWindow::recalculateSize() { + if(items_.empty()) { + resize(margin_ * 2, margin_ * 2); + } + + HDC hDC = ::GetWindowDC(hwnd()); + int height = 0; + int width = 0; + selKeyWidth_ = 0; + textWidth_ = 0; + itemHeight_ = 0; + + HGDIOBJ oldFont = ::SelectObject(hDC, font_); + vector::const_iterator it; + for(int i = 0, n = items_.size(); i < n; ++i) { + SIZE selKeySize; + int lineHeight = 0; + // the selection key string + wchar_t selKey[] = L"?"; + selKey[0] = selKeys_[i]; + ::GetTextExtentPoint32W(hDC, selKey, 1, &selKeySize); + if(selKeySize.cx > selKeyWidth_) + selKeyWidth_ = selKeySize.cx; + + // the candidate string + SIZE candidateSize; + wstring& item = items_.at(i); + ::GetTextExtentPoint32W(hDC, item.c_str(), item.length(), &candidateSize); + if(candidateSize.cx > textWidth_) + textWidth_ = candidateSize.cx; + int itemHeight = max(candidateSize.cy, selKeySize.cy); + if(itemHeight > itemHeight_) + itemHeight_ = itemHeight; + } + itemHeight_ += scaledPixel(12); + selKeyWidth_ += scaledPixel(16); + textWidth_ += scaledPixel(16); + ::SelectObject(hDC, oldFont); + ::ReleaseDC(hwnd(), hDC); + + int rowCount, columnCount; + candidateGrid(static_cast(items_.size()), candPerRow_, rowCount, columnCount); + width = columnCount * (selKeyWidth_ + textWidth_); + width += colSpacing_ * max(0, columnCount - 1); + width += margin_ * 2; + height = itemHeight_ * rowCount + rowSpacing_ * max(0, rowCount - 1); + height += margin_ * 2; + resize(width, height); + HRGN region = ::CreateRoundRectRgn( + 0, 0, width + 1, height + 1, scaledPixel(12), scaledPixel(12)); + if(!::SetWindowRgn(hwnd(), region, TRUE)) + ::DeleteObject(region); +} + +void CandidateWindow::setCandPerRow(int n) { + if(n != candPerRow_) { + candPerRow_ = n; + recalculateSize(); + } +} + +bool CandidateWindow::filterKeyEvent(KeyEvent& keyEvent) { + // select item with arrow keys + int oldSel = currentSel_; + int itemCount = static_cast(items_.size()); + int rowCount, columnCount; + candidateGrid(itemCount, candPerRow_, rowCount, columnCount); + int row = rowCount > 0 ? currentSel_ % rowCount : 0; + int col = rowCount > 0 ? currentSel_ / rowCount : 0; + switch(keyEvent.keyCode()) { + case VK_UP: + if(row > 0) + --currentSel_; + break; + case VK_DOWN: + if(row + 1 < rowCount && currentSel_ + 1 < itemCount) + ++currentSel_; + break; + case VK_LEFT: + if(col > 0) + currentSel_ -= rowCount; + break; + case VK_RIGHT: + if(col + 1 < columnCount && currentSel_ + rowCount < itemCount) + currentSel_ += rowCount; + break; + case VK_RETURN: + hasResult_ = true; + return true; + default: + return false; + } + // if currently selected item is changed, redraw + if(currentSel_ != oldSel) { + // repaint the old and new items + RECT rect; + itemRect(oldSel, rect); + ::InvalidateRect(hwnd_, &rect, TRUE); + itemRect(currentSel_, rect); + ::InvalidateRect(hwnd_, &rect, TRUE); + return true; + } + return false; +} + +void CandidateWindow::setCurrentSel(int sel) { + if(sel >= items_.size()) + sel = 0; + if (currentSel_ != sel) { + currentSel_ = sel; + if (isVisible()) + ::InvalidateRect(hwnd_, NULL, TRUE); + } +} + +void CandidateWindow::clear() { + items_.clear(); + selKeys_.clear(); + currentSel_ = 0; + hasResult_ = false; +} + +void CandidateWindow::setUseCursor(bool use) { + useCursor_ = use; + if(isVisible()) + ::InvalidateRect(hwnd_, NULL, TRUE); +} + +void CandidateWindow::paintItem(HDC hDC, int i, int x, int y) { + RECT cell = { + x, + y, + x + selKeyWidth_ + textWidth_, + y + itemHeight_ + }; + if(useCursor_ && i == currentSel_) { + RECT selected = cell; + ::InflateRect(&selected, -scaledPixel(2), -scaledPixel(1)); + fillRoundRect(hDC, selected, scaledPixel(8), kSelectedBackground); + } + + wchar_t selKey[] = L"?"; + selKey[0] = selKeys_[i]; + int textY = y + scaledPixel(6); + ::SetTextColor(hDC, i == currentSel_ ? kSelectedLabel : kLabel); + ::TextOutW(hDC, x + scaledPixel(8), textY, selKey, 1); + + wstring& item = items_.at(i); + ::SetTextColor(hDC, kText); + ::TextOutW(hDC, x + selKeyWidth_, textY, item.c_str(), item.length()); +} + +void CandidateWindow::itemRect(int i, RECT& rect) { + int row, col; + int rowCount, columnCount; + candidateGrid(static_cast(items_.size()), candPerRow_, rowCount, columnCount); + row = rowCount > 0 ? i % rowCount : 0; + col = rowCount > 0 ? i / rowCount : 0; + rect.left = margin_ + col * (selKeyWidth_ + textWidth_ + colSpacing_); + rect.top = margin_ + row * (itemHeight_ + rowSpacing_); + rect.right = rect.left + (selKeyWidth_ + textWidth_); + rect.bottom = rect.top + itemHeight_; +} + + +} // namespace Ime diff --git a/pime_module/ime.json b/pime_module/ime.json index 942dc2d..d604735 100644 --- a/pime_module/ime.json +++ b/pime_module/ime.json @@ -1,6 +1,6 @@ { "name": "智慧優先注音", - "version": "0.4.2", + "version": "0.6.0", "guid": "{26EA5CF3-D515-40BE-9535-E7E98D5EE554}", "locale": "zh-Hant-TW", "fallbackLocale": "zh-TW", diff --git a/pime_module/pinned_bopomofo_ime.py b/pime_module/pinned_bopomofo_ime.py index 762479d..2aca5a7 100644 --- a/pime_module/pinned_bopomofo_ime.py +++ b/pime_module/pinned_bopomofo_ime.py @@ -12,16 +12,19 @@ from textService import TextService from . import pinned_libchewing +from .bopomofo_core.autocorrect import Autocorrector from .bopomofo_core.feedback_store import FeedbackStore from .bopomofo_core.keymap import symbol_for_event from .bopomofo_core.libchewing_provider import LibChewingProvider from .bopomofo_core.phrase_store import MAX_PHRASE_LENGTH, PhraseStore +from .bopomofo_core.phonetic_corrector import PhoneticCorrector from .bopomofo_core.pinned_store import PinnedStore from .bopomofo_core.session import CandidateSession -from .bopomofo_core.state import Event, EventKind +from .bopomofo_core.state import INITIALS, MEDIALS, RIMES, TONES, Event, EventKind SHIFT_PUNCTUATION = { + 0x20: "ˉ", # Shift+Space: standalone first-tone mark 0x31: "!", 0x32: "@", 0x33: "#", @@ -38,16 +41,25 @@ 0xBD: "——", # Shift+- 0xBE: "。", # Shift+. 0xBF: "?", # Shift+/ + 0xC0: "~", # Shift+` 0xDB: "『", # Shift+[ + 0xDC: "|", # Shift+\ 0xDD: "』", # Shift+] } VK_OEM_QUOTE = 0xDE -COMPACT_CANDIDATE_COUNT = 5 +CANDIDATE_PAGE_SIZE = 10 MAX_PHRASE_CHOICES = 12 +CANDIDATES_PER_ROW = 2 +CANDIDATE_SELECTION_LABELS = "1234567890" NUMPAD_TEXT = { **{key_code: str(key_code - 0x60) for key_code in range(0x60, 0x6A)}, + 0x6A: "*", # VK_MULTIPLY + 0x6B: "+", # VK_ADD + 0x6D: "-", # VK_SUBTRACT 0x6E: ".", # VK_DECIMAL + 0x6F: "/", # VK_DIVIDE } +BOPOMOFO_TEXT = INITIALS | MEDIALS | RIMES | TONES @dataclass @@ -86,6 +98,8 @@ def __init__(self, client): self.session = CandidateSession(provider, PinnedStore(pin_path)) self.phrase_store = PhraseStore(phrase_path) self.feedback_store = FeedbackStore(feedback_path) + self.autocorrector = Autocorrector() + self.phonetic_corrector = PhoneticCorrector(MAX_PHRASE_LENGTH) self.quote_open = False self.english_mode = False self.last_key_event = None @@ -100,7 +114,7 @@ def __init__(self, client): self.focus_index: int | None = None self.replacement_index: int | None = None self.reading_open = False - self.candidate_expanded = False + self.candidate_page = 0 self.candidate_choices: list[CandidateChoice] = [] @property @@ -110,12 +124,21 @@ def provisional(self) -> bool: def onActivate(self): super().onActivate() - self._restore_chinese_keyboard() - self.setSelKeys("12345") + # Reset our field-local Shift toggle, but respect the keyboard-open + # state supplied by TSF. Games and secure/custom controls may + # deliberately close their input context; forcing it open here can + # create an open/close feedback loop with the application. + self._reset_internal_chinese_mode() + # Each page exposes exactly ten numeric selection keys. The native UI + # fills its two columns from top to bottom: 1-5 on the left and 6-0 on + # the right. Keeping the native list and label string the same length + # prevents PIME from + # reading past the labels and painting garbage characters. + self.setSelKeys(CANDIDATE_SELECTION_LABELS) self.customizeUI( candFontName="Microsoft JhengHei UI", - candFontSize=18, - candPerRow=1, + candFontSize=16, + candPerRow=CANDIDATES_PER_ROW, candUseCursor=True, ) @@ -128,14 +151,16 @@ def onDeactivate(self): def onKeyboardStatusChanged(self, opened): self.keyboardOpen = opened - if not opened: - self._restore_chinese_keyboard() + self.pending_shift_toggle = False + self.last_key_down_time = 0.0 + if opened: + self.english_mode = False - def _restore_chinese_keyboard(self) -> None: - """Make this profile start open and in its internal Chinese mode.""" + def _reset_internal_chinese_mode(self) -> None: + """Reset the field-local mode without overriding the host app.""" self.english_mode = False - self.keyboardOpen = True - self.setKeyboardOpen(True) + self.pending_shift_toggle = False + self.last_key_down_time = 0.0 def filterKeyDown(self, keyEvent): self.last_key_event = keyEvent @@ -157,10 +182,15 @@ def filterKeyDown(self, keyEvent): return True if keyEvent.keyCode == VK_SPACE: return self.isComposing() + if self.showCandidates and keyEvent.keyCode in ( + VK_UP, + VK_DOWN, + VK_LEFT, + VK_RIGHT, + ): + return True if keyEvent.keyCode == VK_DOWN: return self._has_candidate_target() - if keyEvent.keyCode == VK_UP: - return self.showCandidates if keyEvent.keyCode in (VK_LEFT, VK_RIGHT): return bool(self.segments) and not self.session.preedit if keyEvent.keyCode in (VK_RETURN, VK_BACK, VK_ESCAPE): @@ -202,11 +232,15 @@ def onKeyDown(self, keyEvent): if keyEvent.keyCode == VK_DOWN and not self.showCandidates: if not self._has_candidate_target(): return False + # The menu must never reveal a better default that the editable + # composition has not already adopted. Synchronize through the + # same phrase ranking source before presenting alternatives. + self._apply_phrase_ranking() self.candidate_choices = self._build_candidate_choices() candidates, selected = self._candidate_target() if not candidates: return False - self.candidate_expanded = False + self.candidate_page = 0 visible = self._visible_candidates(candidates) self.setCandidateList(visible) self.setCandidateCursor(min(selected, len(visible) - 1)) @@ -214,26 +248,13 @@ def onKeyDown(self, keyEvent): self._render_buffer(keep_candidates=True) return True - if self.showCandidates and keyEvent.keyCode in (VK_UP, VK_DOWN): - candidates, _ = self._candidate_target() - if candidates: - visible = self._visible_candidates(candidates) - if ( - keyEvent.keyCode == VK_DOWN - and not self.candidate_expanded - and len(candidates) > len(visible) - and self.candidateCursor == len(visible) - 1 - ): - self.candidate_expanded = True - visible = self._visible_candidates(candidates) - self.setCandidateList(visible) - self.setCandidateCursor(COMPACT_CANDIDATE_COUNT) - else: - delta = -1 if keyEvent.keyCode == VK_UP else 1 - self.setCandidateCursor( - (self.candidateCursor + delta) % len(visible) - ) - self._render_buffer(keep_candidates=True) + if self.showCandidates and keyEvent.keyCode in ( + VK_UP, + VK_DOWN, + VK_LEFT, + VK_RIGHT, + ): + self._navigate_candidate_menu(keyEvent.keyCode) return True if self.showCandidates and keyEvent.keyCode == VK_RETURN: @@ -257,9 +278,32 @@ def onKeyDown(self, keyEvent): return False if self.session.preedit: if self.reading_open and self.session.candidates: + if self._is_literal_bopomofo(self.session.candidates[0]): + self._emit_or_buffer_literal(self.session.candidates[0]) + return True self._accept_active_candidate(0) return True + # Space supplies the implicit first tone. Do not decide from + # the symbol's slot alone: several symbols classed as initials + # are also complete Mandarin syllables (ㄙ→司/思, ㄓ→之/知, + # ㄔ→吃, ㄕ→師, ㄗ→資, ...). The dictionary is the source of + # truth; only a reading with no Chinese candidate falls back + # to literal Zhuyin. + literal = self.session.preedit event = self.session.input_symbol("ˉ") + if event.kind is EventKind.BELL and self.session.preedit: + # This exact first-tone reading has no Chinese syllable, + # but Microsoft Bopomofo still lets users output the raw + # Zhuyin symbol through the candidate window. + literal = self.session.preedit + self.session.candidates = [literal] + self.reading_open = True + self.candidate_page = 0 + self.setCandidateList([literal]) + self.setCandidateCursor(0) + self.setShowCandidates(True) + self._render_buffer(keep_candidates=True) + return True self._handle_session_event(event) return True self._commit_buffer(" ") @@ -316,6 +360,9 @@ def onKeyDown(self, keyEvent): symbol = symbol_for_event(keyEvent.keyCode, keyEvent.charCode) if symbol is not None: + if symbol in TONES and not self.session.preedit: + self._emit_or_buffer_literal(symbol) + return True # Ordinary typing continues at the end unless Backspace left an # explicit insertion gap inside the composition. if not self.session.preedit and self.replacement_index is None: @@ -372,17 +419,22 @@ def onCompositionTerminated(self, forced): self._clear_all() if forced: # TSF uses forced termination when focus moves to another edit - # context. Do not carry a field-local English toggle across it. - self._restore_chinese_keyboard() + # context. Reset our local toggle, but never fight an application + # that intentionally disabled its IME context. + self._reset_internal_chinese_mode() def _candidate_number(self, keyEvent) -> int | None: # The right-hand numeric keypad is text input, never a candidate key. if keyEvent.keyCode in NUMPAD_TEXT: return None - if 0x31 <= keyEvent.keyCode <= 0x35: + if 0x31 <= keyEvent.keyCode <= 0x39: return keyEvent.keyCode - 0x31 - if ord("1") <= keyEvent.charCode <= ord("5"): + if keyEvent.keyCode == 0x30: + return 9 + if ord("1") <= keyEvent.charCode <= ord("9"): return keyEvent.charCode - ord("1") + if keyEvent.charCode == ord("0"): + return 9 return None @staticmethod @@ -425,6 +477,49 @@ def _emit_punctuation(self, punctuation: str) -> None: """Replace an unfinished reading with the requested punctuation.""" self._emit_direct_text(punctuation) + def _emit_or_buffer_literal(self, text: str) -> None: + """Keep literal Bopomofo inside an existing editable composition.""" + if self.segments: + self._buffer_literal_text(text) + else: + self._emit_direct_text(text) + + def _buffer_literal_text( + self, text: str, start: int | None = None, end: int | None = None + ) -> None: + """Insert protected literal symbols without committing other text. + + One buffer segment is kept per Unicode symbol so readings, protection + masks, and rendered text remain aligned even for a spelling such as + ㄢˊ. Literal segments are locked because phrase ranking must never + silently turn a deliberately selected phonetic spelling into Hanzi. + """ + if not text: + return + if start is None: + if self.replacement_index is not None: + start = self.replacement_index + elif self.focus_index is not None: + start = self.focus_index + 1 + else: + start = len(self.segments) + if end is None: + end = start + literal_segments = [ + BufferedSyllable( + reading=character, + candidates=[character], + locked=True, + ) + for character in text + ] + self.segments[start:end] = literal_segments + self.session.clear() + self.replacement_index = None + self.reading_open = False + self.focus_index = start + len(literal_segments) - 1 + self._render_buffer() + def _emit_direct_text(self, text: str) -> None: """Insert non-Bopomofo text at the active caret and finish composition.""" if self.replacement_index is not None: @@ -503,6 +598,75 @@ def _candidate_phrase_spans(self, target: int) -> list[tuple[int, int]]: spans.append((target, target + width)) return spans + def _ranked_phrase_options(self, start: int, end: int) -> list[str]: + """Return one shared ranking for automatic text and candidate UI. + + Personal phrases win equal spans. For the whole buffer, conservative + reading-aware and exact typo corrections are then promoted ahead of + their uncorrected source sentences. Taiwan/frequency-backed phrases + follow, then the conversion engine. Unverified engine guesses are + allowed only for the whole buffer, where they represent the engine's + sentence-level default; intermediate guesses must be known words. + """ + if start < 0 or end > len(self.segments) or end - start < 2: + return [] + readings = [segment.reading for segment in self.segments[start:end]] + personal = self.phrase_store.exact(readings) + frequent = self.session.validated_frequent_phrase_candidates( + readings, + [segment.candidates for segment in self.segments[start:end]], + ) + whole_buffer = start == 0 and end == len(self.segments) + engine = [ + phrase + for phrase in self.session.phrase_candidates(readings) + if whole_buffer or self.session.is_frequent_phrase(phrase) + ] + corrected: list[str] = [] + current_text = "".join( + segment.text for segment in self.segments[start:end] + ) + if whole_buffer: + protected = [segment.locked for segment in self.segments[start:end]] + # Re-decode both the visible text and the exact-reading sources. + # On the next render the visible text may already be corrected; + # retaining the engine sources here makes the corrected sentence + # reproducible as candidate zero instead of a one-frame mutation. + for source in dict.fromkeys([current_text] + frequent + engine): + if len(source) != end - start: + continue + suggestion, phonetic_changes = self.phonetic_corrector.correct( + readings, + source, + protected, + self.session.candidates_for_reading, + self.session.frequent_phrase_candidates, + known_phrase_lookup=( + self.session.dictionary_phrase_candidates + ), + replacement_phrase_lookup=self.session.phrase_candidates, + ) + suggestion, typo_changes = self.autocorrector.correct( + suggestion, protected + ) + if ( + suggestion != source + and (phonetic_changes or typo_changes) + and suggestion not in corrected + ): + corrected.append(suggestion) + return [ + phrase + for phrase in dict.fromkeys( + ([personal] if personal else []) + + corrected + + frequent + + engine + + ([current_text] if corrected else []) + ) + if len(phrase) == end - start + ] + def _build_candidate_choices(self) -> list[CandidateChoice]: target = self._candidate_segment_index() if target is None: @@ -511,14 +675,22 @@ def _build_candidate_choices(self) -> list[CandidateChoice]: phrase_choices: list[CandidateChoice] = [] displayed: set[str] = set() for start, end in self._candidate_phrase_spans(target): - readings = [segment.reading for segment in self.segments[start:end]] - personal = self.phrase_store.exact(readings) - frequent = self.session.frequent_phrase_candidates( - [segment.candidates for segment in self.segments[start:end]] + current_text = "".join( + segment.text for segment in self.segments[start:end] ) - engine = self.session.phrase_candidates(readings) - for phrase in ([personal] if personal else []) + frequent + engine: - if len(phrase) != end - start or phrase in displayed: + for phrase in self._ranked_phrase_options(start, end): + # Keep exactly one whole-buffer choice even when automatic + # ranking has already adopted it. This preserves sentence + # selection/confirmation in the candidate editor. Shorter + # no-op spans are still noise: without this distinction a + # long composition fills the menu with the sentence, minus + # one character, minus two characters, and so on. + whole_buffer = start == 0 and end == len(self.segments) + if ( + len(phrase) != end - start + or (phrase == current_text and not whole_buffer) + or phrase in displayed + ): continue phrase_choices.append(CandidateChoice(phrase, start, end)) displayed.add(phrase) @@ -537,31 +709,111 @@ def _build_candidate_choices(self) -> list[CandidateChoice]: if len(single_choices) >= self.session.max_candidates: break - # Keep both editing styles visible on the first five rows: up to three - # word choices followed by enough single-character choices to fill the - # compact menu. Expanded navigation exposes the remaining candidates. - front_phrases = phrase_choices[:3] - front_single_count = COMPACT_CANDIDATE_COUNT - len(front_phrases) - choices = ( - front_phrases - + single_choices[:front_single_count] - + phrase_choices[len(front_phrases) :] - + single_choices[front_single_count:] + # At the end, sentence/word candidates remain first for whole-sentence + # confirmation. After the caret is moved into the composition, the + # user is explicitly editing the character to its right: put that + # character's candidates first so pressing 1 cannot accidentally lock + # the entire remaining sentence. Keep three phrase choices on page one + # so word-level editing remains one key away. + editing_inside = ( + self.focus_index is not None + and self.focus_index < len(self.segments) - 1 ) + if editing_inside: + front_phrase_count = min(3, len(phrase_choices)) + front_single_count = CANDIDATE_PAGE_SIZE - front_phrase_count + choices = ( + single_choices[:front_single_count] + + phrase_choices[:front_phrase_count] + + single_choices[front_single_count:] + + phrase_choices[front_phrase_count:] + ) + else: + front_phrases = phrase_choices[:3] + front_single_count = CANDIDATE_PAGE_SIZE - len(front_phrases) + choices = ( + front_phrases + + single_choices[:front_single_count] + + phrase_choices[len(front_phrases) :] + + single_choices[front_single_count:] + ) + # A literal Zhuyin spelling must never disappear onto page two while + # editing an uncommitted sentence. Keep it within the first four + # positions without displacing the highest-ranked Chinese choice. + literal_index = next( + ( + index + for index, choice in enumerate(choices) + if choice.width == 1 and self._is_literal_bopomofo(choice.text) + ), + None, + ) + if literal_index is not None and literal_index > 3: + literal_choice = choices.pop(literal_index) + choices.insert(3, literal_choice) return choices[: self.session.max_candidates] def _visible_candidates(self, candidates: list[str]) -> list[str]: - if self.candidate_expanded: - return candidates - return candidates[:COMPACT_CANDIDATE_COUNT] + start = self.candidate_page * CANDIDATE_PAGE_SIZE + return candidates[start : start + CANDIDATE_PAGE_SIZE] + + def _absolute_candidate_index(self, page_index: int) -> int: + return self.candidate_page * CANDIDATE_PAGE_SIZE + page_index + + @staticmethod + def _is_literal_bopomofo(text: str) -> bool: + return bool(text) and all(character in BOPOMOFO_TEXT for character in text) + + def _navigate_candidate_menu(self, key_code: int) -> None: + """Navigate a ten-item, two-column page without letter labels.""" + candidates, _ = self._candidate_target() + if not candidates: + return + visible = self._visible_candidates(candidates) + cursor = min(self.candidateCursor, len(visible) - 1) + + last_page = max(0, (len(candidates) - 1) // CANDIDATE_PAGE_SIZE) + target = cursor + if key_code == VK_RIGHT and self.candidate_page < last_page: + self.candidate_page += 1 + visible = self._visible_candidates(candidates) + target = 0 + self.setCandidateList(visible) + elif key_code == VK_LEFT and self.candidate_page > 0: + self.candidate_page -= 1 + visible = self._visible_candidates(candidates) + target = min(cursor, len(visible) - 1) + self.setCandidateList(visible) + elif key_code == VK_DOWN: + if cursor + 1 < len(visible): + target = cursor + 1 + elif self.candidate_page < last_page: + self.candidate_page += 1 + visible = self._visible_candidates(candidates) + target = 0 + self.setCandidateList(visible) + elif key_code == VK_UP: + if cursor > 0: + target = cursor - 1 + elif self.candidate_page > 0: + self.candidate_page -= 1 + visible = self._visible_candidates(candidates) + target = len(visible) - 1 + self.setCandidateList(visible) + self.setCandidateCursor(max(0, min(len(visible) - 1, target))) + self._render_buffer(keep_candidates=True) def _choose_highlighted_candidate(self, index: int) -> None: candidates, _ = self._candidate_target() + index = self._absolute_candidate_index(index) if index < 0 or index >= len(candidates): self._bell("沒有這個候選字") return if self.reading_open and self.session.candidates: selected = candidates[index] + if self._is_literal_bopomofo(selected): + self._emit_or_buffer_literal(selected) + return self.feedback_store.record( [self.session.preedit], candidates[0], selected ) @@ -576,6 +828,17 @@ def _choose_highlighted_candidate(self, index: int) -> None: self._render_buffer() def _apply_candidate_choice(self, choice: CandidateChoice) -> None: + if self._is_literal_bopomofo(choice.text): + if choice.start == 0 and choice.end == len(self.segments): + # Preserve the established standalone behavior: choosing raw + # Zhuyin with no surrounding editable text commits it at once. + self.setCommitString(choice.text) + self._clear_all() + self.setCompositionString("") + self.setCompositionCursor(0) + else: + self._buffer_literal_text(choice.text, choice.start, choice.end) + return readings = [ segment.reading for segment in self.segments[choice.start : choice.end] ] @@ -601,7 +864,7 @@ def _apply_candidate_choice(self, choice: CandidateChoice) -> None: def _pin_highlighted_candidate(self) -> None: candidates, _ = self._candidate_target() - index = self.candidateCursor + index = self._absolute_candidate_index(self.candidateCursor) if index < 0 or index >= len(candidates): self._bell("沒有可固定的候選字") return @@ -623,12 +886,28 @@ def _pin_highlighted_candidate(self) -> None: for offset, candidate in enumerate(self.candidate_choices) if offset != index ] + self.candidate_page = 0 self.setCandidateCursor(0) self._render_buffer(keep_candidates=True) self.showMessage("已固定為這組注音的第一候選", 2) def _handle_session_event(self, event: Event) -> None: if event.kind is EventKind.UPDATED and self.session.candidates: + # libchewing can append extremely rare Han characters even for a + # symbol that is not a normal standalone syllable (for example a + # lone ㄑ). Its ranked first candidate is the reliable boundary: + # Chinese first means auto-accept it; literal Zhuyin first means + # show the menu and do not let an obscure tail candidate win. + if self._is_literal_bopomofo(self.session.candidates[0]): + self.reading_open = True + self.candidate_page = 0 + self.setCandidateList( + self._visible_candidates(self.session.candidates) + ) + self.setCandidateCursor(0) + self.setShowCandidates(True) + self._render_buffer(keep_candidates=True) + return self._accept_active_candidate(0) return self._render_event(event) @@ -637,10 +916,16 @@ def _accept_active_candidate(self, index: int, advance_focus: bool = False) -> N if not self.session.candidates or not 0 <= index < len(self.session.candidates): self._bell("沒有這個候選字") return + reading = self.session.preedit segment = BufferedSyllable( - reading=self.session.preedit, + reading=reading, candidates=list(self.session.candidates), selected=index, + # A stored single-character preference remains candidate zero for + # isolated input, but must not become a permanent context lock. + # Otherwise an old 仙/不 preference blocks the reliable phrase + # correction 你先開始下一步吧. A choice made explicitly in this + # composition still arrives with advance_focus=True and is locked. locked=advance_focus, ) insertion = ( @@ -664,9 +949,10 @@ def _apply_phrase_ranking(self) -> None: if len(self.segments) < 2: return readings = [segment.reading for segment in self.segments] - phrase = self.session.best_phrase(readings) - if phrase and len(phrase) <= len(self.segments): - self._apply_ranked_phrase(len(phrase), phrase) + whole_options = self._ranked_phrase_options(0, len(self.segments)) + whole_default = whole_options[0] if whole_options else "" + if whole_default: + self._apply_ranked_phrase(len(self.segments), whole_default) personal_length, personal_phrase = self.phrase_store.best_suffix( readings @@ -680,8 +966,9 @@ def _apply_phrase_ranking(self) -> None: frequent_match: tuple[int, str] | None = None for width in range(max_width, 1, -1): suffix = self.segments[-width:] - frequent = self.session.frequent_phrase_candidates( - [segment.candidates for segment in suffix] + frequent = self.session.validated_frequent_phrase_candidates( + [segment.reading for segment in suffix], + [segment.candidates for segment in suffix], ) if frequent: frequent_match = (width, frequent[0]) @@ -691,8 +978,8 @@ def _apply_phrase_ranking(self) -> None: # current span even when libchewing does not expose that word through # its alternate-candidate API (對話框 is one such real case). engine_match = ( - (len(phrase), phrase) - if phrase and len(phrase) == len(self.segments) + (len(self.segments), whole_default) + if whole_default else None ) lexical_match = frequent_match @@ -706,9 +993,37 @@ def _apply_phrase_ranking(self) -> None: # Explicit user selection is the strongest layer, even when it covers # a shorter suffix than a bundled phrase. if personal_length: - self._apply_ranked_phrase(personal_length, personal_phrase) + self._apply_ranked_phrase(personal_length, personal_phrase, lock=True) + self._apply_live_phonetic_ranking() + + def _apply_live_phonetic_ranking(self) -> None: + """Re-rank every unlocked word from exact readings while composing.""" + if len(self.segments) < 2: + return + readings = [segment.reading for segment in self.segments] + text = "".join(segment.text for segment in self.segments) + protected = [segment.locked for segment in self.segments] + corrected, _ = self.phonetic_corrector.correct( + readings, + text, + protected, + self.session.candidates_for_reading, + self.session.frequent_phrase_candidates, + known_phrase_lookup=self.session.dictionary_phrase_candidates, + replacement_phrase_lookup=self.session.phrase_candidates, + allow_fuzzy=False, + ) + for segment, character in zip(self.segments, corrected): + if segment.locked or segment.text == character: + continue + segment.candidates = list( + dict.fromkeys([character] + segment.candidates) + )[: self.session.max_candidates] + segment.selected = 0 - def _apply_ranked_phrase(self, width: int, phrase: str) -> None: + def _apply_ranked_phrase( + self, width: int, phrase: str, lock: bool = False + ) -> None: """Move one phrase to the front without replacing locked segments.""" if width < 1 or len(phrase) != width or width > len(self.segments): return @@ -719,6 +1034,8 @@ def _apply_ranked_phrase(self, width: int, phrase: str) -> None: dict.fromkeys([suggested] + segment.candidates) )[: self.session.max_candidates] segment.selected = 0 + if lock: + segment.locked = True def _render_event(self, event: Event) -> None: self._render_buffer() @@ -737,12 +1054,13 @@ def _render_buffer(self, keep_candidates: bool = False) -> None: if keep_candidates and self.showCandidates: candidates, _ = self._candidate_target() - if candidates and 0 <= self.candidateCursor < len(candidates): - preview = candidates[self.candidateCursor] + candidate_index = self._absolute_candidate_index(self.candidateCursor) + if candidates and 0 <= candidate_index < len(candidates): + preview = candidates[candidate_index] if self.reading_open and self.session.candidates: active_text = preview elif self.candidate_choices: - choice = self.candidate_choices[self.candidateCursor] + choice = self.candidate_choices[candidate_index] segment_texts[choice.start : choice.end] = list(choice.text) else: target_index = self._candidate_segment_index() @@ -771,13 +1089,17 @@ def _render_buffer(self, keep_candidates: bool = False) -> None: # flag as closed even though Python still thinks it is open. self.setShowCandidates(True) else: - self.candidate_expanded = False + self.candidate_page = 0 self.candidate_choices = [] self.setCandidateList([]) self.setShowCandidates(False) self.setCandidateCursor(0) def _commit_buffer(self, suffix: str = "") -> None: + # Space, Enter, punctuation, Shift, deactivation, and direct English + # insertion all commit through here. Re-apply the shared default so a + # correct candidate cannot remain hidden behind Down at send time. + self._apply_phrase_ranking() text = "".join(segment.text for segment in self.segments) if not text: self._bell("沒有可以送出的文字") @@ -795,7 +1117,7 @@ def _clear_all(self) -> None: self.focus_index = None self.replacement_index = None self.reading_open = False - self.candidate_expanded = False + self.candidate_page = 0 self.candidate_choices = [] self.setCandidateList([]) self.setShowCandidates(False) diff --git a/pime_runtime/libchewing/data/swkb.dat b/pime_runtime/libchewing/data/swkb.dat index 66f6025..34307da 100644 --- a/pime_runtime/libchewing/data/swkb.dat +++ b/pime_runtime/libchewing/data/swkb.dat @@ -1,26 +1,26 @@ -Q 〔 -W 〕 -A 【 -S 】 -Z 《 -X 》 -E { -R } -D 「 -F 」 -C 『 -V 』 -T ‘ -Y ’ -G “ -H ” -B 〝 -N 〞 -U + -I - -O × -P ÷ -J ≠ -K ≒ -L Orz -M … +Q 〔 +W 〕 +A 【 +S 】 +Z 《 +X 》 +E { +R } +D 「 +F 」 +C 『 +V 』 +T ‘ +Y ’ +G “ +H ” +B 〝 +N 〞 +U + +I - +O × +P ÷ +J ≠ +K ≒ +L Orz +M … diff --git a/pime_runtime/libchewing/data/symbols.dat b/pime_runtime/libchewing/data/symbols.dat index 0864400..2ca2541 100644 --- a/pime_runtime/libchewing/data/symbols.dat +++ b/pime_runtime/libchewing/data/symbols.dat @@ -1,22 +1,22 @@ -… -※ -常用符號=,、。.?!;:‧‥﹐﹒˙·‘’“”〝〞‵′〃~$%@&#* -左右括號=()「」〔〕{}〈〉『』《》【】﹙﹚﹝﹞﹛﹜ -上下括號=︵︶﹁﹂︹︺︷︸︿﹀﹃﹄︽︾︻︼ -希臘字母=αβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ -數學符號=+-×÷=≠≒∞±√<>﹤﹥≦≧∩∪ˇ⊥∠∟⊿㏒㏑∫∮∵∴╳﹢ -特殊圖形=↑↓←→↖↗↙↘㊣◎○●⊕⊙△▲☆★◇◆□■▽▼§¥〒¢£※♀♂ -Unicode=♨☀☁☂☃♠♥♣♦♩♪♫♬☺☻ -單線框=├─┼┴┬┤┌┐╞═╪╡│▕└┘╭╮╰╯ -雙線框=╔╦╗╠═╬╣╓╥╖╒╤╕║╚╩╝╟╫╢╙╨╜╞╪╡╘╧╛ -填色方塊=_ˍ▁▂▃▄▅▆▇█▏▎▍▌▋▊▉◢◣◥◤ -線段=﹣﹦≡|∣∥–︱—︳╴¯ ̄﹉﹊﹍﹎﹋﹌﹏︴∕﹨╱╲/\ -表情與情緒=😀😃😄😁😆😅🤣😂🙂🙃😉😊😇🥰😍🤩😘😗😚😙🥲😋😛😜🤪😝🤑🤗🤭🤫🤔🤐🤨😐😑😶😏😒🙄😬🤥😌😔😪🤤😴😷🤒🤕🤢🤮🤧🥵🥶🥴😵🤯🤠🥳🥸😎🤓🧐😕😟🙁😮😯😲😳🥺😦😧😨😰😥😢😭😱😖😣😞😓😩😫🥱😤😡😠🤬😈👿💀💩🤡👹👺👻👽👾🤖😺😸😹😻😼😽🙀😿😾🙈🙉🙊💋💌💘💝💖💗💓💞💕💟💔🧡💛💚💙💜🤎🖤🤍💯💢💥💫💦💨💣💬💭💤 -人物與身體=👋🤚✋🖖👌🤌🤏🤞🤟🤘🤙👈👉👆🖕👇👍👎✊👊🤛🤜👏🙌👐🤲🤝🙏💅🤳💪🦾🦿🦵🦶👂🦻👃🧠🫀🫁🦷🦴👀👅👄👶🧒👦👧🧑👱👨🧔👩🧓👴👵🙍🙎🙅🙆💁🙋🧏🙇🤦🤷👮💂🥷👷🤴👸👳👲🧕🤵👰🤰🤱👼🎅🤶🦸🦹🧙🧚🧛🧜🧝🧞🧟💆💇🚶🧍🧎🏃💃🕺👯🧖🧗🤺🏇🏂🏄🚣🏊🚴🚵🤸🤼🤽🤾🤹🧘🛀🛌👭👫👬💏💑👪👤👥🫂👣 -動物、大自然=🐵🐒🦍🦧🐶🐕🦮🐩🐺🦊🦝🐱🐈🦁🐯🐅🐆🐴🐎🦄🦓🦌🦬🐮🐂🐃🐄🐷🐖🐗🐽🐏🐑🐐🐪🐫🦙🦒🐘🦣🦏🦛🐭🐁🐀🐹🐰🐇🦫🦔🦇🐻🐨🐼🦥🦦🦨🦘🦡🐾🦃🐔🐓🐣🐤🐥🐦🐧🦅🦆🦢🦉🦤🪶🦩🦚🦜🐸🐊🐢🦎🐍🐲🐉🦕🦖🐳🐋🐬🦭🐟🐠🐡🦈🐙🐚🐌🦋🐛🐜🐝🪲🐞🦗🪳🦂🦟🪰🪱🦠💐🌸💮🌹🥀🌺🌻🌼🌷🌱🪴🌲🌳🌴🌵🌾🌿🍀🍁🍂🍃 -飲食=🍇🍈🍉🍊🍋🍌🍍🥭🍎🍏🍐🍑🍒🍓🫐🥝🍅🫒🥥🥑🍆🥔🥕🌽🫑🥒🥬🥦🧄🧅🍄🥜🌰🍞🥐🥖🫓🥨🥯🥞🧇🧀🍖🍗🥩🥓🍔🍟🍕🌭🥪🌮🌯🫔🥙🧆🥚🍳🥘🍲🫕🥣🥗🍿🧈🧂🥫🍱🍘🍙🍚🍛🍜🍝🍠🍢🍣🍤🍥🥮🍡🥟🥠🥡🦀🦞🦐🦑🦪🍦🍧🍨🍩🍪🎂🍰🧁🥧🍫🍬🍭🍮🍯🍼🥛☕🫖🍵🍶🍾🍷🍸🍹🍺🍻🥂🥃🥤🧋🧃🧉🧊🥢🍴🥄🔪🏺 -時間=⌛⏳⌚⏰🕛🕧🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦📅📆 -天象與天氣=🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜🌝🌞🪐⭐🌟🌠🌌⛅🌀🌈🌂☔⚡⛄🔥💧🌊 -節慶與活動=🎃🎄🎆🎇🧨✨🎈🎉🎊🎋🎍🎎🎏🎐🎑🧧🎀🎁🎫🏆🏅🥇🥈🥉⚽⚾🥎🏀🏐🏈🏉🎾🥏🎳🏏🏑🏒🥍🏓🏸🥊🥋🥅⛳🎣🤿🎽🎿🛷🥌🎯🪀🪁🎱🔮🪄🧿🎮🎰🎲🧩🧸🪅🪆🃏🀄🎴🎭 -物品=🎨🧵🪡🧶🪢👓🥽🥼🦺👔👕👖🧣🧤🧥🧦👗👘🥻🩱🩲🩳👙👚👛👜👝🎒🩴👞👟🥾🥿👠👡🩰👢👑👒🎩🎓🧢🪖📿💄💍💎🔇🔈🔉🔊📢📣📯🔔🔕🎼🎵🎶🎤🎧📻🎷🪗🎸🎹🎺🎻🪕🥁🪘📱📲📞📟📠🔋🔌💻💽💾💿📀🧮🎥🎬📺📷📸📹📼🔍🔎💡🔦🏮🪔📔📕📖📗📘📙📚📓📒📃📜📄📰📑🔖💰🪙💴💵💶💷💸💳🧾💹📧📨📩📤📥📦📫📪📬📭📮📝💼📁📂📇📈📉📊📋📌📍📎📏📐🔒🔓🔏🔐🔑🔨🪓🔫🪃🏹🪚🔧🪛🔩🦯🔗🪝🧰🧲🪜🧪🧫🧬🔬🔭📡💉🩸💊🩹🩺🚪🛗🪞🪟🪑🚽🪠🚿🛁🪤🪒🧴🧷🧹🧺🧻🪣🧼🪥🧽🧯🛒🚬🪦🗿🪧🏧🏁🚩🎌🏴 -符號與標示=🚮🚰♿🚹🚺🚻🚼🚾🛂🛃🛄🛅🚸⛔🚫🚳🚭🚯🚱🚷📵🔞🔃🔄🔙🔚🔛🔜🔝🛐🕎🔯♈♉♊♋♌♍♎♏♐♑♒♓⛎🔀🔁🔂⏩⏪🔼⏫🔽⏬🎦🔅🔆📶📳📴➕➖➗❓❔❕❗💱💲🔱📛🔰⭕✅❌❎➰➿🔟🔠🔡🔢🔣🔤🆎🆑🆒🆓🆔🆕🆖🆗🆘🆙🆚🈁🈶🈯🉐🈹🈚🈲🉑🈸🈴🈳🈺🈵🔴🟠🟡🟢🔵🟣🟤⚫⚪🟥🟧🟨🟩🟦🟪🟫⬛⬜◾◽🔶🔷🔸🔹🔺🔻💠🔘🔳🔲 +… +※ +常用符號=,、。.?!;:‧‥﹐﹒˙·‘’“”〝〞‵′〃~$%@&#* +左右括號=()「」〔〕{}〈〉『』《》【】﹙﹚﹝﹞﹛﹜ +上下括號=︵︶﹁﹂︹︺︷︸︿﹀﹃﹄︽︾︻︼ +希臘字母=αβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ +數學符號=+-×÷=≠≒∞±√<>﹤﹥≦≧∩∪ˇ⊥∠∟⊿㏒㏑∫∮∵∴╳﹢ +特殊圖形=↑↓←→↖↗↙↘㊣◎○●⊕⊙△▲☆★◇◆□■▽▼§¥〒¢£※♀♂ +Unicode=♨☀☁☂☃♠♥♣♦♩♪♫♬☺☻ +單線框=├─┼┴┬┤┌┐╞═╪╡│▕└┘╭╮╰╯ +雙線框=╔╦╗╠═╬╣╓╥╖╒╤╕║╚╩╝╟╫╢╙╨╜╞╪╡╘╧╛ +填色方塊=_ˍ▁▂▃▄▅▆▇█▏▎▍▌▋▊▉◢◣◥◤ +線段=﹣﹦≡|∣∥–︱—︳╴¯ ̄﹉﹊﹍﹎﹋﹌﹏︴∕﹨╱╲/\ +表情與情緒=😀😃😄😁😆😅🤣😂🙂🙃😉😊😇🥰😍🤩😘😗😚😙🥲😋😛😜🤪😝🤑🤗🤭🤫🤔🤐🤨😐😑😶😏😒🙄😬🤥😌😔😪🤤😴😷🤒🤕🤢🤮🤧🥵🥶🥴😵🤯🤠🥳🥸😎🤓🧐😕😟🙁😮😯😲😳🥺😦😧😨😰😥😢😭😱😖😣😞😓😩😫🥱😤😡😠🤬😈👿💀💩🤡👹👺👻👽👾🤖😺😸😹😻😼😽🙀😿😾🙈🙉🙊💋💌💘💝💖💗💓💞💕💟💔🧡💛💚💙💜🤎🖤🤍💯💢💥💫💦💨💣💬💭💤 +人物與身體=👋🤚✋🖖👌🤌🤏🤞🤟🤘🤙👈👉👆🖕👇👍👎✊👊🤛🤜👏🙌👐🤲🤝🙏💅🤳💪🦾🦿🦵🦶👂🦻👃🧠🫀🫁🦷🦴👀👅👄👶🧒👦👧🧑👱👨🧔👩🧓👴👵🙍🙎🙅🙆💁🙋🧏🙇🤦🤷👮💂🥷👷🤴👸👳👲🧕🤵👰🤰🤱👼🎅🤶🦸🦹🧙🧚🧛🧜🧝🧞🧟💆💇🚶🧍🧎🏃💃🕺👯🧖🧗🤺🏇🏂🏄🚣🏊🚴🚵🤸🤼🤽🤾🤹🧘🛀🛌👭👫👬💏💑👪👤👥🫂👣 +動物、大自然=🐵🐒🦍🦧🐶🐕🦮🐩🐺🦊🦝🐱🐈🦁🐯🐅🐆🐴🐎🦄🦓🦌🦬🐮🐂🐃🐄🐷🐖🐗🐽🐏🐑🐐🐪🐫🦙🦒🐘🦣🦏🦛🐭🐁🐀🐹🐰🐇🦫🦔🦇🐻🐨🐼🦥🦦🦨🦘🦡🐾🦃🐔🐓🐣🐤🐥🐦🐧🦅🦆🦢🦉🦤🪶🦩🦚🦜🐸🐊🐢🦎🐍🐲🐉🦕🦖🐳🐋🐬🦭🐟🐠🐡🦈🐙🐚🐌🦋🐛🐜🐝🪲🐞🦗🪳🦂🦟🪰🪱🦠💐🌸💮🌹🥀🌺🌻🌼🌷🌱🪴🌲🌳🌴🌵🌾🌿🍀🍁🍂🍃 +飲食=🍇🍈🍉🍊🍋🍌🍍🥭🍎🍏🍐🍑🍒🍓🫐🥝🍅🫒🥥🥑🍆🥔🥕🌽🫑🥒🥬🥦🧄🧅🍄🥜🌰🍞🥐🥖🫓🥨🥯🥞🧇🧀🍖🍗🥩🥓🍔🍟🍕🌭🥪🌮🌯🫔🥙🧆🥚🍳🥘🍲🫕🥣🥗🍿🧈🧂🥫🍱🍘🍙🍚🍛🍜🍝🍠🍢🍣🍤🍥🥮🍡🥟🥠🥡🦀🦞🦐🦑🦪🍦🍧🍨🍩🍪🎂🍰🧁🥧🍫🍬🍭🍮🍯🍼🥛☕🫖🍵🍶🍾🍷🍸🍹🍺🍻🥂🥃🥤🧋🧃🧉🧊🥢🍴🥄🔪🏺 +時間=⌛⏳⌚⏰🕛🕧🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦📅📆 +天象與天氣=🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜🌝🌞🪐⭐🌟🌠🌌⛅🌀🌈🌂☔⚡⛄🔥💧🌊 +節慶與活動=🎃🎄🎆🎇🧨✨🎈🎉🎊🎋🎍🎎🎏🎐🎑🧧🎀🎁🎫🏆🏅🥇🥈🥉⚽⚾🥎🏀🏐🏈🏉🎾🥏🎳🏏🏑🏒🥍🏓🏸🥊🥋🥅⛳🎣🤿🎽🎿🛷🥌🎯🪀🪁🎱🔮🪄🧿🎮🎰🎲🧩🧸🪅🪆🃏🀄🎴🎭 +物品=🎨🧵🪡🧶🪢👓🥽🥼🦺👔👕👖🧣🧤🧥🧦👗👘🥻🩱🩲🩳👙👚👛👜👝🎒🩴👞👟🥾🥿👠👡🩰👢👑👒🎩🎓🧢🪖📿💄💍💎🔇🔈🔉🔊📢📣📯🔔🔕🎼🎵🎶🎤🎧📻🎷🪗🎸🎹🎺🎻🪕🥁🪘📱📲📞📟📠🔋🔌💻💽💾💿📀🧮🎥🎬📺📷📸📹📼🔍🔎💡🔦🏮🪔📔📕📖📗📘📙📚📓📒📃📜📄📰📑🔖💰🪙💴💵💶💷💸💳🧾💹📧📨📩📤📥📦📫📪📬📭📮📝💼📁📂📇📈📉📊📋📌📍📎📏📐🔒🔓🔏🔐🔑🔨🪓🔫🪃🏹🪚🔧🪛🔩🦯🔗🪝🧰🧲🪜🧪🧫🧬🔬🔭📡💉🩸💊🩹🩺🚪🛗🪞🪟🪑🚽🪠🚿🛁🪤🪒🧴🧷🧹🧺🧻🪣🧼🪥🧽🧯🛒🚬🪦🗿🪧🏧🏁🚩🎌🏴 +符號與標示=🚮🚰♿🚹🚺🚻🚼🚾🛂🛃🛄🛅🚸⛔🚫🚳🚭🚯🚱🚷📵🔞🔃🔄🔙🔚🔛🔜🔝🛐🕎🔯♈♉♊♋♌♍♎♏♐♑♒♓⛎🔀🔁🔂⏩⏪🔼⏫🔽⏬🎦🔅🔆📶📳📴➕➖➗❓❔❕❗💱💲🔱📛🔰⭕✅❌❎➰➿🔟🔠🔡🔢🔣🔤🆎🆑🆒🆓🆔🆕🆖🆗🆘🆙🆚🈁🈶🈯🉐🈹🈚🈲🉑🈸🈴🈳🈺🈵🔴🟠🟡🟢🔵🟣🟤⚫⚪🟥🟧🟨🟩🟦🟪🟫⬛⬜◾◽🔶🔷🔸🔹🔺🔻💠🔘🔳🔲 diff --git a/tests/native_ui_preference_smoke.ps1 b/tests/native_ui_preference_smoke.ps1 new file mode 100644 index 0000000..3b42da3 --- /dev/null +++ b/tests/native_ui_preference_smoke.ps1 @@ -0,0 +1,69 @@ +$ErrorActionPreference = "Stop" + +. (Join-Path $PSScriptRoot "..\installer\native_ui_preference.ps1") + +$temporaryRoot = Join-Path $env:TEMP ("SmartPriorityNativePreference-" + [Guid]::NewGuid().ToString("N")) +try { + $pimeRoot = Join-Path $temporaryRoot "PIME" + $stateRoot = Join-Path $temporaryRoot "state" + $preferencePath = Join-Path $temporaryRoot "native-ui-preference.json" + foreach ($architecture in @("x86", "x64")) { + New-Item -ItemType Directory -Path (Join-Path $pimeRoot $architecture) -Force | Out-Null + Set-Content -LiteralPath (Join-Path $pimeRoot "$architecture\PIMETextService.dll") ` + -Value "signed-$architecture" -Encoding ASCII + } + + $fresh = Resolve-SmartPriorityNativeUiPreference ` + -PreferencePath $preferencePath -PimeRoot $pimeRoot -StateRoot $stateRoot + if ($fresh) { throw "A fresh install must keep the signed default." } + + $enabled = Resolve-SmartPriorityNativeUiPreference ` + -PreferencePath $preferencePath -PimeRoot $pimeRoot -StateRoot $stateRoot ` + -EnableUnsignedNativeUi + if (-not $enabled) { throw "Explicit custom UI opt-in was ignored." } + Save-SmartPriorityNativeUiPreference -PreferencePath $preferencePath -Enabled $enabled + $remembered = Resolve-SmartPriorityNativeUiPreference ` + -PreferencePath $preferencePath -PimeRoot $pimeRoot -StateRoot $stateRoot + if (-not $remembered) { throw "Custom UI preference was not remembered." } + + $disabled = Resolve-SmartPriorityNativeUiPreference ` + -PreferencePath $preferencePath -PimeRoot $pimeRoot -StateRoot $stateRoot ` + -DisableUnsignedNativeUi + if ($disabled) { throw "Explicit signed UI selection was ignored." } + Save-SmartPriorityNativeUiPreference -PreferencePath $preferencePath -Enabled $disabled + $rememberedDisabled = Resolve-SmartPriorityNativeUiPreference ` + -PreferencePath $preferencePath -PimeRoot $pimeRoot -StateRoot $stateRoot + if ($rememberedDisabled) { throw "Signed UI preference was not remembered." } + + Remove-Item -LiteralPath $preferencePath -Force + $hashes = @{} + foreach ($architecture in @("x86", "x64")) { + $customDll = Join-Path $pimeRoot "$architecture\PIMETextService.dll" + Set-Content -LiteralPath $customDll -Value "custom-$architecture" -Encoding ASCII + $hashes[$architecture] = (Get-FileHash -Algorithm SHA256 -LiteralPath $customDll).Hash + } + New-Item -ItemType Directory -Path $stateRoot -Force | Out-Null + $hashes | ConvertTo-Json | Set-Content ` + -LiteralPath (Join-Path $stateRoot "native-ui.json") -Encoding UTF8 + $migrated = Resolve-SmartPriorityNativeUiPreference ` + -PreferencePath $preferencePath -PimeRoot $pimeRoot -StateRoot $stateRoot + if (-not $migrated) { throw "Existing custom UI state was not migrated." } + + $conflictRejected = $false + try { + Resolve-SmartPriorityNativeUiPreference ` + -PreferencePath $preferencePath -PimeRoot $pimeRoot -StateRoot $stateRoot ` + -EnableUnsignedNativeUi -DisableUnsignedNativeUi | Out-Null + } + catch { + $conflictRejected = $true + } + if (-not $conflictRejected) { throw "Conflicting UI switches were accepted." } + + Write-Output "PASS: native UI preference is persistent and explicitly reversible" +} +finally { + if (Test-Path -LiteralPath $temporaryRoot) { + Remove-Item -LiteralPath $temporaryRoot -Recurse -Force + } +} diff --git a/tests/pime_adapter_smoke.py b/tests/pime_adapter_smoke.py index f951099..cd0a65f 100644 --- a/tests/pime_adapter_smoke.py +++ b/tests/pime_adapter_smoke.py @@ -20,6 +20,8 @@ from pinned_bopomofo.pinned_bopomofo_ime import PinnedBopomofoTextService from pinned_bopomofo.bopomofo_core.keymap import keys_for_reading +from pinned_bopomofo.bopomofo_core.state import INITIALS, MEDIALS, RIMES +from pime_all_readings_audit import audit_all_readings class DummyClient: @@ -69,6 +71,13 @@ def special_key(service, key_code: int, sequence: int) -> dict: return reply +def candidate_selection_key(service, index: int, sequence: int) -> dict: + if not 0 <= index <= 9: + raise AssertionError(f"candidate index outside current page: {index}") + key_code = 0x30 if index == 9 else 0x31 + index + return special_key(service, key_code, sequence) + + def shifted_key(service, key_code: int, sequence: int) -> dict: key_states = [0] * 256 key_states[0x10] = 0x80 # VK_SHIFT @@ -127,10 +136,40 @@ def numpad_decimal_key(service, sequence: int) -> dict: return reply -def filter_key(service, method: str, key_code: int, sequence: int, shift=False): +def numpad_operator_key(service, key_code: int, sequence: int) -> dict: + reply = service.handleRequest( + { + "method": "onKeyDown", + "seqNum": sequence, + "charCode": 0, + "keyCode": key_code, + "repeatCount": 1, + "scanCode": 0, + "isExtended": key_code == 0x6F, + "keyStates": [0] * 256, + } + ) + assert reply["success"] + assert reply["return"] is True + return reply + + +def filter_key( + service, + method: str, + key_code: int, + sequence: int, + shift: bool = False, + control: bool = False, + alt: bool = False, +): key_states = [0] * 256 if shift: key_states[0x10] = 0x80 + if control: + key_states[0x11] = 0x80 + if alt: + key_states[0x12] = 0x80 if method == "filterKeyDown": key_states[key_code] = 0x80 return service.handleRequest( @@ -209,7 +248,7 @@ def type_readings(service, readings: list[str], sequence: int) -> int: return sequence -def force_composition_text(service, text: str) -> None: +def force_composition_text(service, text: str, *, locked: bool = True) -> None: """Put a known wrong homophone into completed segments for edit tests.""" assert len(service.segments) == len(text) for segment, character in zip(service.segments, text): @@ -217,7 +256,7 @@ def force_composition_text(service, text: str) -> None: dict.fromkeys([character] + segment.candidates) ) segment.selected = 0 - segment.locked = True + segment.locked = locked service.focus_index = len(service.segments) - 1 service._render_buffer() @@ -227,6 +266,17 @@ def main() -> None: os.environ["APPDATA"] = appdata service = PinnedBopomofoTextService(DummyClient()) + # Match Microsoft Bopomofo's vertical-first grid: 1-5 in the left + # column, 6-0 in the right column, and no letter selectors. + activation_reply = service.handleRequest( + {"method": "onActivate", "seqNum": 0, "isKeyboardOpen": False} + ) + assert "openKeyboard" not in activation_reply + assert not service.keyboardOpen + assert activation_reply["setSelKeys"] == "1234567890" + assert activation_reply["customizeUI"]["candPerRow"] == 2 + assert activation_reply["customizeUI"]["candFontSize"] == 16 + # ㄋㄧˇ -> 你 remains inside the composition instead of being sent # to the application immediately. press(service, "s", 1) @@ -258,15 +308,20 @@ def main() -> None: special_key(service, 0x28, 9) # VK_DOWN assert service.showCandidates original_reading = service.segments[0].reading - second_candidate = service.segments[0].candidates[1] + second_candidate = next( + candidate + for candidate in service.segments[0].candidates[1:] + if not service._is_literal_bopomofo(candidate) + ) single_choice_index = next( index for index, choice in enumerate(service.candidate_choices) if choice.width == 1 and choice.text == second_candidate ) - assert single_choice_index < 5 - special_key( - service, 0x31 + single_choice_index, 10 + for page_offset in range(single_choice_index // 10): + special_key(service, 0x27, 10 + page_offset) + candidate_selection_key( + service, single_choice_index % 10, 10 + single_choice_index // 10 ) # physical number, even when charCode is absent assert not service.showCandidates assert service.segments[0].selected == 0 @@ -277,6 +332,32 @@ def main() -> None: assert service.focus_index == 0 assert service._candidate_segment_index() == 1 + # Editing the first syllable of a longer uncommitted sentence must + # put single-character choices before whole-sentence choices. Choosing + # 1 locks only that syllable and advances to the next one; it never + # commits or freezes all remaining text. + three_service = PinnedBopomofoTextService(DummyClient()) + three_sequence = type_readings( + three_service, ["ㄒㄧㄝˇ", "ㄔㄥˊ", "ㄕˋ"], 900 + ) + for offset in range(3): + special_key(three_service, 0x25, three_sequence + offset) + assert three_service.focus_index == -1 + special_key(three_service, 0x28, three_sequence + 3) + assert three_service.candidate_choices[0].width == 1 + assert three_service.candidate_choices[0].start == 0 + select_first_reply = candidate_selection_key( + three_service, 0, three_sequence + 4 + ) + assert "commitString" not in select_first_reply + assert [segment.locked for segment in three_service.segments] == [ + True, + False, + False, + ] + assert three_service.focus_index == 0 + assert three_service._candidate_segment_index() == 1 + # Backspace on a completed character deletes it directly; it must not # turn back into a Bopomofo reading. special_key(service, 0x27, 11) # VK_RIGHT, move caret to the end @@ -313,6 +394,127 @@ def main() -> None: assert service.compositionString == "" assert service.segments == [] + # High-confidence offline corrections become visible sentence + # candidates before Enter and never write the surrounding sentence to + # a store or network service. + autocorrect_service = PinnedBopomofoTextService(DummyClient()) + autocorrect_sequence = type_readings( + autocorrect_service, + ["ㄨㄛˇ", "ㄧㄣˉ", "ㄍㄞˉ", "ㄅㄨˋ", "ㄏㄨㄟˋ", "ㄑㄩˋ"], + 1100, + ) + # High-confidence fuzzy correction is a visible sentence candidate, + # not an invisible Enter-time mutation. The exact-reading sentence is + # retained as candidate two so the user can explicitly override it. + assert autocorrect_service.compositionString == "我應該不會去" + special_key(autocorrect_service, 0x28, autocorrect_sequence) + autocorrect_sequence += 1 + assert autocorrect_service.candidateList[:2] == [ + "我應該不會去", + "我音該不會去", + ] + assert all( + choice.width == len(autocorrect_service.segments) + for choice in autocorrect_service.candidate_choices[:2] + ) + special_key(autocorrect_service, 0x1B, autocorrect_sequence) + autocorrect_sequence += 1 + force_composition_text(autocorrect_service, "我音該不會去", locked=False) + autocorrect_reply = special_key( + autocorrect_service, 0x0D, autocorrect_sequence + ) + assert autocorrect_reply["commitString"] == "我應該不會去" + + visible_override = PinnedBopomofoTextService(DummyClient()) + override_sequence = type_readings( + visible_override, + ["ㄨㄛˇ", "ㄧㄣˉ", "ㄍㄞˉ", "ㄅㄨˋ", "ㄏㄨㄟˋ", "ㄑㄩˋ"], + 1200, + ) + special_key(visible_override, 0x28, override_sequence) + candidate_selection_key(visible_override, 1, override_sequence + 1) + assert visible_override.compositionString == "我音該不會去" + assert all(segment.locked for segment in visible_override.segments) + override_reply = special_key(visible_override, 0x0D, override_sequence + 2) + assert override_reply["commitString"] == "我音該不會去" + + # The same decoder also handles an exact ㄧㄥ reading without needing + # a separate 英該 surface rule. + exact_reading_service = PinnedBopomofoTextService(DummyClient()) + exact_reading_sequence = type_readings( + exact_reading_service, ["ㄧㄥˉ", "ㄍㄞˉ"], 1150 + ) + force_composition_text(exact_reading_service, "英該", locked=False) + exact_reading_reply = special_key( + exact_reading_service, 0x0D, exact_reading_sequence + ) + assert exact_reading_reply["commitString"] == "應該" + + # A real word using ㄧㄣ remains untouched; fuzzy ㄣ/ㄥ decoding must + # not turn every occurrence of 音 into 應. + valid_phrase_service = PinnedBopomofoTextService(DummyClient()) + valid_phrase_sequence = type_readings( + valid_phrase_service, ["ㄧㄣˉ", "ㄍㄢˇ"], 1160 + ) + force_composition_text(valid_phrase_service, "音感", locked=False) + valid_phrase_reply = special_key( + valid_phrase_service, 0x0D, valid_phrase_sequence + ) + assert valid_phrase_reply["commitString"] == "音感" + + # Exact-reading language-model corrections also update the live + # composition instead of waiting for the candidate menu or Enter. + for readings, wrong, expected, start_sequence in ( + (["ㄧㄡˉ", "ㄒㄧㄢˉ"], "優仙", "優先", 1170), + (["ㄅㄨˋ", "ㄏㄜˊ", "ㄌㄧˇ"], "部合理", "不合理", 1180), + ): + live_service = PinnedBopomofoTextService(DummyClient()) + type_readings(live_service, readings, start_sequence) + force_composition_text(live_service, wrong, locked=False) + live_service._apply_phrase_ranking() + live_service._render_buffer() + assert live_service.compositionString == expected, ( + readings, + wrong, + live_service.compositionString, + ) + + # A character explicitly chosen by the user is protected. This is the + # strongest priority and intentionally preserves a literal discussion + # of a misspelling such as 因該. + protected_service = PinnedBopomofoTextService(DummyClient()) + protected_sequence = type_readings( + protected_service, ["ㄧㄣˉ", "ㄍㄞˉ"], 1120 + ) + force_composition_text(protected_service, "因該") + protected_service.segments[0].locked = True + protected_reply = special_key( + protected_service, 0x0D, protected_sequence + ) + assert protected_reply["commitString"] == "因該" + + personal_service = PinnedBopomofoTextService(DummyClient()) + personal_service.phrase_store.learn(["ㄧㄣˉ", "ㄍㄞˉ"], "因該") + personal_sequence = type_readings( + personal_service, ["ㄧㄣˉ", "ㄍㄞˉ"], 1130 + ) + assert personal_service.compositionString == "因該" + assert all(segment.locked for segment in personal_service.segments) + personal_reply = special_key( + personal_service, 0x0D, personal_sequence + ) + assert personal_reply["commitString"] == "因該" + + # An explicitly selected spelling is protected for every commit path; + # ordinary Space therefore preserves it exactly as composed. + literal_service = PinnedBopomofoTextService(DummyClient()) + literal_sequence = type_readings( + literal_service, ["ㄧㄣˉ", "ㄍㄞˉ"], 1140 + ) + force_composition_text(literal_service, "因該") + literal_reply = press(literal_service, " ", literal_sequence) + assert literal_reply["commitString"] == "因該 " + # A candidate chosen with a number key is learned automatically and # becomes first for the same reading in a fresh service instance. learned_service = PinnedBopomofoTextService(DummyClient()) @@ -331,7 +533,7 @@ def main() -> None: assert learned_service.compositionString == "" assert not learned_service.provisional assert not learned_service.english_mode - assert terminated_reply["openKeyboard"] is True + assert "openKeyboard" not in terminated_reply # The full tsi.dat phrase index ranks common 2/3-character words while # the UI continues to hold independently editable character segments. @@ -341,6 +543,10 @@ def main() -> None: (["ㄐㄧㄚˇ", "ㄕㄜˋ"], "假設"), (["ㄒㄧㄝˇ", "ㄔㄥˊ", "ㄕˋ"], "寫程式"), (["ㄉㄨㄟˋ", "ㄏㄨㄚˋ", "ㄎㄨㄤˉ"], "對話框"), + (["ㄅㄨˋ", "ㄓˉ", "ㄉㄠˋ"], "不知道"), + (["ㄍㄣˉ", "ㄗㄞˋ"], "跟在"), + (["ㄗㄞˋ", "ㄐㄧㄚˉ"], "在家"), + (["ㄗㄞˋ", "ㄧˉ", "ㄘˋ"], "再一次"), ) sequence = 21 for readings, expected in phrase_examples: @@ -417,10 +623,53 @@ def main() -> None: zi_service = PinnedBopomofoTextService(DummyClient()) sequence = type_readings(zi_service, ["ㄗˋ"], sequence) assert zi_service.compositionString == "字" + na_service = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(na_service, ["ㄋㄚˋ"], sequence) + assert na_service.compositionString == "那" + zuo_service = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(zuo_service, ["ㄗㄨㄛˋ"], sequence) + assert zuo_service.compositionString == "做" + shi_service = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(shi_service, ["ㄕˋ"], sequence) + assert shi_service.compositionString == "是" self_service = PinnedBopomofoTextService(DummyClient()) sequence = type_readings(self_service, ["ㄗˋ", "ㄐㄧˇ"], sequence) assert self_service.compositionString == "自己" + # Text-only frequency data may locate a phrase, but it cannot prove + # its pronunciation. 殼 is a rare alternate character candidate for + # ㄑㄩㄝˋ; that must not let 貝殼 borrow the wrong second syllable. + wrong_shell_service = PinnedBopomofoTextService(DummyClient()) + wrong_shell_readings = ["ㄅㄟˋ", "ㄑㄩㄝˋ"] + sequence = type_readings( + wrong_shell_service, wrong_shell_readings, sequence + ) + raw_shell_matches = ( + wrong_shell_service.session.frequent_phrase_candidates( + [ + segment.candidates + for segment in wrong_shell_service.segments + ] + ) + ) + assert "貝殼" in raw_shell_matches + assert "貝殼" not in ( + wrong_shell_service.session.validated_frequent_phrase_candidates( + wrong_shell_readings, + [ + segment.candidates + for segment in wrong_shell_service.segments + ], + ) + ) + assert wrong_shell_service.compositionString != "貝殼" + + shell_service = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings( + shell_service, ["ㄅㄟˋ", "ㄎㄜˊ"], sequence + ) + assert shell_service.compositionString == "貝殼" + # Once a high-confidence word is resolved, later syllables cannot # reach backwards and alter it. The protected 優先級 spelling also # beats the homophonous 優先及. @@ -447,6 +696,30 @@ def main() -> None: sequence = type_readings(personal_priority, optimize_readings, sequence) assert personal_priority.compositionString == "優話" + # A new explicit single-character correction replaces the previous + # personal priority for that reading. In particular, selecting 字 after + # an old 自 preference must persist and win in the next service. + relearn_service = PinnedBopomofoTextService(DummyClient()) + relearn_service.session.pins.pin("ㄗˋ", "自") + sequence = type_readings(relearn_service, ["ㄗˋ"], sequence) + assert relearn_service.compositionString == "自" + special_key(relearn_service, 0x28, sequence) # candidate menu + sequence += 1 + zi_choice = next( + index + for index, choice in enumerate(relearn_service.candidate_choices) + if choice.width == 1 and choice.text == "字" + ) + for _ in range(zi_choice // 10): + special_key(relearn_service, 0x27, sequence) # next page + sequence += 1 + candidate_selection_key(relearn_service, zi_choice % 10, sequence) + sequence += 1 + assert relearn_service.session.pins.phrases_for("ㄗˋ")[0] == "字" + relearned_service = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(relearned_service, ["ㄗˋ"], sequence) + assert relearned_service.compositionString == "字" + program_service = PinnedBopomofoTextService(DummyClient()) program_readings = ["ㄒㄧㄝˇ", "ㄔㄥˊ", "ㄕˋ"] sequence = type_readings(program_service, program_readings, sequence) @@ -491,6 +764,42 @@ def main() -> None: assert punctuation_reply["commitString"] == "字典?" assert punctuation_service.compositionString == "" + # Every printable Shift symbol on the standard keyboard is accounted + # for. This protects the two easy-to-miss OEM keys as well as the + # existing Chinese punctuation mappings. + expected_shift_symbols = { + 0x20: "ˉ", + 0x31: "!", + 0x32: "@", + 0x33: "#", + 0x34: "$", + 0x35: "%", + 0x36: "……", + 0x37: "&", + 0x38: "*", + 0x39: "(", + 0x30: ")", + 0xBA: ":", + 0xBB: "+", + 0xBC: ",", + 0xBD: "——", + 0xBE: "。", + 0xBF: "?", + 0xC0: "~", + 0xDB: "『", + 0xDC: "|", + 0xDD: "』", + } + for key_code, expected in expected_shift_symbols.items(): + symbol_service = PinnedBopomofoTextService(DummyClient()) + symbol_reply = shifted_key(symbol_service, key_code, sequence) + sequence += 1 + assert symbol_reply["commitString"] == expected, ( + hex(key_code), + symbol_reply["commitString"], + ) + assert not symbol_service.english_mode + # Shift+quote alternates Taiwanese corner quotes. open_quote = shifted_key(punctuation_service, 0xDE, sequence) sequence += 1 @@ -509,8 +818,8 @@ def main() -> None: } ) sequence += 1 - assert activation_reply["openKeyboard"] is True - assert mode_service.keyboardOpen + assert "openKeyboard" not in activation_reply + assert not mode_service.keyboardOpen assert not mode_service.english_mode sequence, _ = tap_shift(mode_service, sequence + 1) assert mode_service.english_mode @@ -524,8 +833,9 @@ def main() -> None: sequence, _ = tap_shift(mode_service, sequence + 2) assert not mode_service.english_mode - # Windows can close the keyboard compartment when focus changes. - # This profile reopens it and resets its field-local English toggle. + # Games and custom/secure controls can intentionally close the TSF + # keyboard compartment. Respect that state instead of repeatedly + # reopening it and racing the host application. mode_service.english_mode = True status_reply = mode_service.handleRequest( { @@ -535,10 +845,97 @@ def main() -> None: } ) sequence += 1 - assert status_reply["openKeyboard"] is True + assert "openKeyboard" not in status_reply + assert not mode_service.keyboardOpen + assert mode_service.english_mode + + # Reopening the context resets the internal Shift toggle to Chinese, + # but still does not write back to the TSF compartment. + opened_reply = mode_service.handleRequest( + { + "method": "onKeyboardStatusChanged", + "seqNum": sequence, + "opened": True, + } + ) + sequence += 1 + assert "openKeyboard" not in opened_reply assert mode_service.keyboardOpen assert not mode_service.english_mode + # Forced composition termination also stays host-controlled. + mode_service.english_mode = True + terminated_reply = mode_service.handleRequest( + { + "method": "onCompositionTerminated", + "seqNum": sequence, + "forced": True, + } + ) + sequence += 1 + assert "openKeyboard" not in terminated_reply + assert not mode_service.english_mode + + # Shift+Tab, Shift+F1-F12, Ctrl+Shift and Alt+Shift belong to the + # application/Windows. The IME must not consume them. + passthrough_service = PinnedBopomofoTextService(DummyClient()) + assert filter_key( + passthrough_service, + "filterKeyDown", + 0x09, + sequence, + shift=True, + )["return"] is False + sequence += 1 + for key_code in range(0x70, 0x7C): + assert filter_key( + passthrough_service, + "filterKeyDown", + key_code, + sequence, + shift=True, + )["return"] is False + sequence += 1 + for key_code in (0x08, 0x0D, 0x1B, 0x21, 0x22, 0x23, 0x24, 0x2D, 0x2E): + assert filter_key( + passthrough_service, + "filterKeyDown", + key_code, + sequence, + shift=True, + )["return"] is False + sequence += 1 + assert filter_key( + passthrough_service, + "filterKeyDown", + ord("A"), + sequence, + shift=True, + control=True, + )["return"] is False + sequence += 1 + assert filter_key( + passthrough_service, + "filterKeyDown", + 0x10, + sequence, + shift=True, + alt=True, + )["return"] is False + sequence += 1 + + # Every Shift+A-Z combination emits its corresponding uppercase ASCII + # letter while leaving persistent Chinese mode unchanged. + for character in "abcdefghijklmnopqrstuvwxyz": + letter_service = PinnedBopomofoTextService(DummyClient()) + sequence, letter_reply = hold_shift_letter( + letter_service, + character, + sequence, + ) + assert letter_reply["commitString"] == character.upper() + assert not letter_service.english_mode + # CORE CONTRACT: holding Shift while pressing A-Z emits a temporary # uppercase English letter and stays in Chinese mode. This behavior # is distinct from tapping Shift to toggle the persistent mode. @@ -624,6 +1021,23 @@ def main() -> None: assert decimal_reply["commitString"] == "字." assert not decimal_composition.showCandidates + # Every visible numpad operator is literal text, never a DaQian + # Bopomofo key. Check physical key codes with charCode absent. + for key_code, expected in ( + (0x6F, "/"), # VK_DIVIDE + (0x6A, "*"), # VK_MULTIPLY + (0x6D, "-"), # VK_SUBTRACT + (0x6B, "+"), # VK_ADD + ): + operator_service = PinnedBopomofoTextService(DummyClient()) + press(operator_service, "a", sequence) # incomplete ㄇ + operator_reply = numpad_operator_key( + operator_service, key_code, sequence + 1 + ) + sequence += 2 + assert operator_reply["commitString"] == expected + assert operator_service.session.preedit == "" + insertion_direct = PinnedBopomofoTextService(DummyClient()) sequence = type_readings( insertion_direct, ["ㄨㄣˊ", "ㄗˋ"], sequence @@ -635,6 +1049,278 @@ def main() -> None: ) assert direct_reply["commitString"] == "文D" + # As in Microsoft Bopomofo, a complete reading exposes the literal + # Zhuyin spelling near the front without replacing normal Chinese. + for reading, expected_literal in ( + ("ㄢˉ", "ㄢ"), + ("ㄢˊ", "ㄢˊ"), + ("ㄢˇ", "ㄢˇ"), + ("ㄢˋ", "ㄢˋ"), + ("ㄢ˙", "ㄢ˙"), + ): + tone_service = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(tone_service, [reading], sequence) + if not tone_service.showCandidates: + special_key(tone_service, 0x28, sequence) + sequence += 1 + available_literals = ( + [choice.text for choice in tone_service.candidate_choices] + if tone_service.candidate_choices + else list(tone_service.session.candidates) + ) + tone_choice = next( + index + for index, candidate in enumerate(available_literals) + if candidate == expected_literal + ) + assert tone_choice < 5 + literal_reply = candidate_selection_key( + tone_service, tone_choice, sequence + ) + sequence += 1 + assert literal_reply.get("commitString") == expected_literal, ( + reading, + expected_literal, + literal_reply, + ) + assert tone_service.compositionString == "" + + # Space supplies first tone and the dictionary decides whether a lone + # symbol can form Chinese. ㄉ cannot, while ㄜ and the syllabic initial + # ㄙ can; raw Zhuyin remains available as an alternate. + initial_literal = PinnedBopomofoTextService(DummyClient()) + press(initial_literal, "2", sequence) # ㄉ + initial_menu = press(initial_literal, " ", sequence + 1) + assert initial_menu["candidateList"] == ["ㄉ"], initial_menu + initial_reply = candidate_selection_key(initial_literal, 0, sequence + 2) + assert initial_reply["commitString"] == "ㄉ" + + rime_literal = PinnedBopomofoTextService(DummyClient()) + press(rime_literal, "k", sequence + 3) # ㄜ + press(rime_literal, " ", sequence + 4) + assert rime_literal.segments + assert rime_literal.compositionString != "ㄜ" + special_key(rime_literal, 0x28, sequence + 5) + assert "ㄜ" in [choice.text for choice in rime_literal.candidate_choices[:4]] + + syllabic_initial = PinnedBopomofoTextService(DummyClient()) + syllabic_candidates = syllabic_initial.session.provider.candidates("ㄙˉ") + press(syllabic_initial, keys_for_reading("ㄙ"), sequence + 6) + press(syllabic_initial, " ", sequence + 7) + assert syllabic_initial.compositionString == syllabic_candidates[0] + assert not syllabic_initial.showCandidates + + # The reported real-world sequence must flow without opening a raw + # Zhuyin menu: ㄧˋ + ㄙ + Space => 意思. Candidate zero and the text + # actually inserted into the composition must always agree. + meaning_service = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(meaning_service, ["ㄧˋ"], sequence + 8) + press(meaning_service, keys_for_reading("ㄙ"), sequence) + press(meaning_service, " ", sequence + 1) + assert meaning_service.compositionString == "意思" + assert not meaning_service.showCandidates + assert all( + segment.text == segment.candidates[0] + for segment in meaning_service.segments + ) + + # Stored single-character preferences rank isolated input but cannot + # freeze a bad character inside strong sentence context. This mirrors + # a profile contaminated by older builds that learned 仙 and 不. + contextual_readings = [ + "ㄋㄧˇ", + "ㄒㄧㄢˉ", + "ㄎㄞˉ", + "ㄕˇ", + "ㄒㄧㄚˋ", + "ㄧˉ", + "ㄅㄨˋ", + "ㄅㄚ˙", + ] + contextual_service = PinnedBopomofoTextService(DummyClient()) + contextual_service.session.pins.pin("ㄒㄧㄢˉ", "仙") + contextual_service.session.pins.pin("ㄅㄨˋ", "不") + sequence = type_readings( + contextual_service, contextual_readings, sequence + 2 + ) + assert contextual_service.compositionString == "你先開始下一步吧" + assert not any(segment.locked for segment in contextual_service.segments) + + # The candidate editor may keep one whole-sentence correction, but it + # must not expose unverified intermediate engine guesses such as + # 你先開始夏衣 or 你掀開 ahead of useful words and characters. + force_composition_text( + contextual_service, "你仙開始下一不吧", locked=False + ) + contextual_service.focus_index = -1 + choices = contextual_service._build_candidate_choices() + choice_texts = [choice.text for choice in choices] + assert choices[0].width == 1, choices + assert choices[0].start == 0, choices + assert "你先開始下一步吧" in choice_texts[:10], choice_texts + assert "你先開始夏衣" not in choice_texts + assert "你掀開" not in choice_texts + assert "你先" in choice_texts[:10], choice_texts + + # The actual Down-key path first applies that shared default. The + # correct sentence must already be visible in the editable buffer, + # rather than existing only as candidate number one. + special_key(contextual_service, 0x28, sequence) + sequence += 1 + assert contextual_service.compositionString == "你先開始下一步吧" + assert contextual_service.candidate_choices[0].width == 1 + assert "你先開始下一步吧" in contextual_service.candidateList + assert "你先開始夏衣" not in contextual_service.candidateList + assert "你掀開" not in contextual_service.candidateList + + # Every commit path synchronizes the same default even if an unlocked + # stale buffer somehow survived from an older build or edit action. + enter_default = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(enter_default, contextual_readings, sequence) + force_composition_text(enter_default, "你仙開始下一不吧", locked=False) + enter_reply = special_key(enter_default, 0x0D, sequence) + sequence += 1 + assert enter_reply["commitString"] == "你先開始下一步吧" + + space_default = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(space_default, contextual_readings, sequence) + force_composition_text(space_default, "你仙開始下一不吧", locked=False) + space_reply = press(space_default, " ", sequence) + sequence += 1 + assert space_reply["commitString"] == "你先開始下一步吧 " + + # Opening the editor at the end preserves one whole-sentence choice + # for explicit confirmation, but must not waste the remaining slots + # on no-op copies of progressively shorter suffix spans. + no_op_service = PinnedBopomofoTextService(DummyClient()) + no_op_readings = ["ㄨㄛˇ", "ㄧㄥˉ", "ㄍㄞˉ", "ㄅㄨˋ", "ㄏㄨㄟˋ", "ㄑㄩˋ"] + sequence = type_readings(no_op_service, no_op_readings, sequence) + special_key(no_op_service, 0x28, sequence) + whole_no_ops = [] + for choice in no_op_service.candidate_choices: + if choice.width == 1: + continue + occupied = "".join( + segment.text for segment in no_op_service.segments[choice.start : choice.end] + ) + if choice.text == occupied: + whole_no_ops.append(choice) + assert len(whole_no_ops) == 1, whole_no_ops + assert whole_no_ops[0].start == 0 + assert whole_no_ops[0].end == len(no_op_service.segments) + assert no_op_service.candidate_choices[0] == whole_no_ops[0] + + # Global character frequency must not override the dictionary's + # reading-aware default: 員 is common overall but normally pronounced + # ㄩㄢˊ, so ㄩㄣˋ must remain 運 rather than being promoted to 員. + yun_service = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings(yun_service, ["ㄩㄣˋ"], sequence + 1) + assert yun_service.compositionString == "運" + assert yun_service.segments[0].candidates[0] == "運" + assert "員" in yun_service.segments[0].candidates + + # Standalone tones still commit directly when no composition exists. + standalone_tone = PinnedBopomofoTextService(DummyClient()) + tone_reply = press(standalone_tone, "3", sequence + 1) + assert tone_reply["commitString"] == "ˇ" + sequence += 2 + + # Inside an existing composition, tones are protected literal + # segments. They must not have the Enter-like effect of committing all + # previously editable text. + buffered_tone = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings( + buffered_tone, ["ㄋㄧˇ", "ㄏㄠˇ"], sequence + ) + fourth_reply = press(buffered_tone, "4", sequence) + sequence += 1 + assert not fourth_reply.get("commitString") + assert buffered_tone.compositionString == "你好ˋ" + third_reply = press(buffered_tone, "3", sequence) + sequence += 1 + assert not third_reply.get("commitString") + assert buffered_tone.compositionString == "你好ˋˇ" + assert all(segment.locked for segment in buffered_tone.segments[-2:]) + buffered_tone_commit = special_key(buffered_tone, 0x0D, sequence) + sequence += 1 + assert buffered_tone_commit["commitString"] == "你好ˋˇ" + + # Choosing a raw Zhuyin candidate inside a sentence follows the same + # non-committing path; a later tone stays in that composition too. + buffered_literal = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings( + buffered_literal, ["ㄋㄧˇ", "ㄢˊ"], sequence + ) + special_key(buffered_literal, 0x28, sequence) + sequence += 1 + literal_index = next( + index + for index, choice in enumerate(buffered_literal.candidate_choices[:10]) + if choice.text == "ㄢˊ" + ) + literal_reply = candidate_selection_key( + buffered_literal, literal_index, sequence + ) + sequence += 1 + assert not literal_reply.get("commitString") + assert buffered_literal.compositionString == "你ㄢˊ" + trailing_tone = press(buffered_literal, "4", sequence) + sequence += 1 + assert not trailing_tone.get("commitString") + assert buffered_literal.compositionString == "你ㄢˊˋ" + + # Apply the dictionary-driven rule to every initial, medial, and rime, + # not only examples reported by the user. Valid standalone forms must + # select candidate zero and retain raw Zhuyin on page one; invalid + # forms fall back to the literal safely. + standalone_defaults = {} + for literal in sorted(INITIALS | MEDIALS | RIMES): + literal_service = PinnedBopomofoTextService(DummyClient()) + key = keys_for_reading(literal) + assert len(key) == 1, (literal, key) + candidates = literal_service.session.provider.candidates(literal + "ˉ") + chinese = [ + candidate + for candidate in candidates + if len(candidate) == 1 and not literal_service._is_literal_bopomofo(candidate) + ] + chinese_first = bool(candidates) and not literal_service._is_literal_bopomofo( + candidates[0] + ) + press(literal_service, key, sequence) + reply = press(literal_service, " ", sequence + 1) + if chinese_first: + assert literal_service.segments, (literal, reply) + assert literal_service.compositionString == candidates[0], ( + literal, + candidates, + literal_service.compositionString, + ) + assert literal_service.segments[0].text == ( + literal_service.segments[0].candidates[0] + ) + standalone_defaults[literal] = chinese + special_key(literal_service, 0x28, sequence + 2) + choices = [choice.text for choice in literal_service.candidate_choices] + assert literal in choices[:4], (literal, choices) + else: + assert reply["candidateList"][0] == literal, (literal, reply) + sequence += 3 + assert standalone_defaults["ㄧ"][0] == "一" + assert "阿" in standalone_defaults["ㄚ"] + + # Literal Zhuyin also remains on page one when editing a whole + # uncommitted sentence containing phrase candidates. + sentence_literal = PinnedBopomofoTextService(DummyClient()) + sequence = type_readings( + sentence_literal, ["ㄉㄨㄟˋ", "ㄏㄨㄚˋ", "ㄎㄨㄤˉ"], sequence + ) + special_key(sentence_literal, 0x28, sequence) + sequence += 1 + assert "ㄎㄨㄤ" in sentence_literal.candidateList, ( + sentence_literal.candidateList + ) + # Shift also switches when an unfinished Bopomofo reading is present; # the partial reading is cancelled instead of blocking mode changes. partial_service = PinnedBopomofoTextService(DummyClient()) @@ -659,30 +1345,65 @@ def main() -> None: assert toggle_reply["compositionString"] == "" assert toggle_ordering_service.english_mode - # The candidate menu starts compact. Moving down past candidate five - # expands the practical (top-20) list instead of wrapping around. + # The first page contains ten candidates in two vertical-first columns. + # Right opens the next page, while Down walks 1-5 then 6-0 and flips. expanded_service = PinnedBopomofoTextService(DummyClient()) press(expanded_service, "g", sequence) # ㄕ press(expanded_service, "4", sequence + 1) # ˋ - assert len(expanded_service.segments[0].candidates) > 5 + assert len(expanded_service.segments[0].candidates) > 10 open_reply = special_key( expanded_service, 0x28, sequence + 2 - ) # open compact list + ) # open first page assert open_reply["showCandidates"] is True - assert len(expanded_service.candidateList) == 5 - for offset in range(3, 7): - navigation_reply = special_key( - expanded_service, 0x28, sequence + offset - ) - assert navigation_reply["showCandidates"] is True - assert expanded_service.candidateCursor == 4 - expansion_reply = special_key( - expanded_service, 0x28, sequence + 7 - ) - assert expansion_reply["showCandidates"] is True - assert expanded_service.candidate_expanded - assert len(expanded_service.candidateList) > 5 - assert expanded_service.candidateCursor == 5 + assert len(expanded_service.candidateList) == 10 + first_page = list(expanded_service.candidateList) + next_page_reply = special_key( + expanded_service, 0x27, sequence + 3 + ) + assert next_page_reply["showCandidates"] is True + assert expanded_service.candidate_page == 1 + assert expanded_service.candidateList + assert expanded_service.candidateList != first_page + assert expanded_service.candidateCursor == 0 + special_key(expanded_service, 0x25, sequence + 4) # Left = prior page + assert expanded_service.candidate_page == 0 + + down_page_service = PinnedBopomofoTextService(DummyClient()) + press(down_page_service, "g", sequence + 5) + press(down_page_service, "4", sequence + 6) + special_key(down_page_service, 0x28, sequence + 7) + for offset in range(10): + special_key(down_page_service, 0x28, sequence + 8 + offset) + assert down_page_service.candidate_page == 1 + assert down_page_service.candidateCursor == 0 + + # Key 5 chooses the bottom of the left column and key 6 chooses the top + # of the right column. Letters are not candidate selectors. + fifth_service = PinnedBopomofoTextService(DummyClient()) + press(fifth_service, "g", sequence + 13) + press(fifth_service, "4", sequence + 14) + special_key(fifth_service, 0x28, sequence + 15) + fifth_choice = fifth_service.candidate_choices[4] + candidate_selection_key(fifth_service, 4, sequence + 16) + assert fifth_service.compositionString == fifth_choice.text + + sixth_service = PinnedBopomofoTextService(DummyClient()) + press(sixth_service, "g", sequence + 17) + press(sixth_service, "4", sequence + 18) + special_key(sixth_service, 0x28, sequence + 19) + sixth_choice = sixth_service.candidate_choices[5] + candidate_selection_key(sixth_service, 5, sequence + 20) + assert sixth_service.compositionString == sixth_choice.text + sequence += 21 + + # The full reading space is part of every PIME regression run. This + # prevents a future global-frequency change from reintroducing the + # same class of polyphonic error one reported reading at a time. + reading_audit = audit_all_readings() + assert reading_audit["dictionary_readings"] >= 1_400 + assert reading_audit["distinct_characters_audited"] >= 13_000 + assert reading_audit["old_global_frequency_promotions_blocked"] >= 400 + assert reading_audit["errors"] == [], reading_audit["errors"] # Invalid phonetics make only the configured gentle sound; the old # yellow showMessage tooltip must not be present in the PIME reply. diff --git a/tests/pime_all_readings_audit.py b/tests/pime_all_readings_audit.py new file mode 100644 index 0000000..55d826a --- /dev/null +++ b/tests/pime_all_readings_audit.py @@ -0,0 +1,140 @@ +"""Exhaustively audit single-syllable Bopomofo defaults with PIME's Python. + +This is intentionally separate from normal 64-bit unit tests because the +bundled libchewing DLL is 32-bit. It enumerates every initial/medial/rime/tone +slot combination, lets libchewing decide which readings exist, and verifies +that global character frequency never displaces the reading-aware default. +""" + +from __future__ import annotations + +import itertools +import json +import os +import sys +from pathlib import Path + + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +PIME_ROOT = Path(os.environ.get("PIME_ROOT", r"C:\Program Files (x86)\PIME")) +sys.path.insert(0, str(PIME_ROOT / "python")) +sys.path.insert( + 0, + str(PROJECT_ROOT / "dist" / "PIME-overlay" / "python" / "input_methods"), +) + +from pinned_bopomofo import pinned_libchewing +from pinned_bopomofo.bopomofo_core.keymap import keys_for_reading +from pinned_bopomofo.bopomofo_core.libchewing_provider import ( + MAX_CANDIDATES, + TAIWAN_FREQUENCY, + LibChewingProvider, + prioritize_common_character, +) +from pinned_bopomofo.bopomofo_core.state import INITIALS, MEDIALS, RIMES, TONES + + +def raw_candidates(provider: LibChewingProvider, reading: str) -> list[str]: + context = provider.context + context.Reset() + for key in keys_for_reading(reading): + context.handle_Default(ord(key)) + if context.cand_TotalChoice() <= 0: + return [] + context.cand_Enumerate() + results: list[str] = [] + while context.cand_hasNext() and len(results) < MAX_CANDIDATES: + candidate = context.cand_String().decode("utf-8") + if candidate not in results: + results.append(candidate) + return results + + +def completed_readings(): + initials = ("",) + tuple(sorted(INITIALS)) + medials = ("",) + tuple(sorted(MEDIALS)) + rimes = ("",) + tuple(sorted(RIMES)) + tones = tuple(sorted(TONES)) + for initial, medial, rime, tone in itertools.product( + initials, medials, rimes, tones + ): + body = initial + medial + rime + if body: + yield body + tone + + +def audit_all_readings() -> dict[str, object]: + provider = LibChewingProvider(pinned_libchewing) + total = 0 + valid = 0 + audited_characters: set[str] = set() + old_frequency_promotions: list[dict[str, str]] = [] + errors: list[str] = [] + + for reading in completed_readings(): + total += 1 + raw = raw_candidates(provider, reading) + if not raw: + continue + valid += 1 + audited_characters.update( + candidate for candidate in raw if len(candidate) == 1 + ) + + preserved = TAIWAN_FREQUENCY.rank_characters( + raw, preserve_first=True + ) + expected = prioritize_common_character(reading, preserved) + final = provider.candidates(reading) + if not expected or not final: + errors.append(f"{reading!r}: dictionary candidates disappeared") + continue + if final[0] != expected[0]: + errors.append( + f"{reading!r}: expected {expected[0]!r}, got {final[0]!r}" + ) + if raw[0] not in final: + errors.append( + f"{reading!r}: raw default {raw[0]!r} missing from final list" + ) + if len(final) != len(dict.fromkeys(final)): + errors.append(f"{reading!r}: duplicate final candidates") + literal = reading[:-1] if reading.endswith("ˉ") else reading + if literal not in final[:4]: + errors.append(f"{reading!r}: literal spelling is not in first four") + + old_ranked = prioritize_common_character( + reading, TAIWAN_FREQUENCY.rank_characters(raw) + ) + if old_ranked and old_ranked[0] != expected[0]: + old_frequency_promotions.append( + { + "reading": reading, + "dictionary": expected[0], + "old_global_frequency": old_ranked[0], + } + ) + + summary = { + "generated_combinations": total, + "dictionary_readings": valid, + "distinct_characters_audited": len(audited_characters), + "old_global_frequency_promotions_blocked": len( + old_frequency_promotions + ), + "promotion_examples": old_frequency_promotions[:20], + "errors": errors[:50], + } + return summary + + +def main() -> None: + summary = audit_all_readings() + print(json.dumps(summary, ensure_ascii=True, indent=2)) + errors = summary["errors"] + if errors: + raise AssertionError(f"all-reading audit found {len(errors)} errors") + + +if __name__ == "__main__": + main() diff --git a/tests/test_autocorrect.py b/tests/test_autocorrect.py new file mode 100644 index 0000000..4156345 --- /dev/null +++ b/tests/test_autocorrect.py @@ -0,0 +1,84 @@ +import json +import tempfile +import unittest +from pathlib import Path + +from bopomofo_core.autocorrect import Autocorrector + + +class AutocorrectTests(unittest.TestCase): + def test_bundled_rules_correct_high_confidence_typos(self) -> None: + autocorrector = Autocorrector() + self.assertGreaterEqual(autocorrector.rule_count, 40) + self.assertTrue( + {"因該", "音該", "英該"}.isdisjoint( + rule.wrong for rule in autocorrector.rules + ) + ) + corrected, changes = autocorrector.correct("我以經迫不急待了") + self.assertEqual("我已經迫不及待了", corrected) + self.assertEqual( + ["以經", "迫不急待"], + [c.wrong for c in changes], + ) + + def test_explicitly_selected_character_protects_the_whole_rule_span(self) -> None: + autocorrector = Autocorrector() + corrected, changes = autocorrector.correct("以經", [True, False]) + self.assertEqual("以經", corrected) + self.assertEqual([], changes) + + def test_does_not_force_context_dependent_or_valid_variants(self) -> None: + autocorrector = Autocorrector() + text = "他的作法布置得很好而且我在這裡" + self.assertEqual((text, []), autocorrector.correct(text)) + + def test_longest_rule_wins_and_rules_do_not_cascade(self) -> None: + with tempfile.TemporaryDirectory() as temp_dir: + path = Path(temp_dir) / "rules.json" + path.write_text( + json.dumps( + { + "meta": {"sources": [{"id": "test"}]}, + "rules": [ + {"wrong": "甲乙", "correct": "乙丙", "source": "test"}, + {"wrong": "甲乙丙", "correct": "丙乙甲", "source": "test"}, + {"wrong": "乙丙", "correct": "丁戊", "source": "test"}, + ], + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + corrected, changes = Autocorrector(path).correct("甲乙丙") + self.assertEqual("丙乙甲", corrected) + self.assertEqual(["甲乙丙"], [change.wrong for change in changes]) + + def test_missing_corrupt_or_invalid_rules_are_safe(self) -> None: + with tempfile.TemporaryDirectory() as temp_dir: + path = Path(temp_dir) / "rules.json" + self.assertEqual(("以經", []), Autocorrector(path).correct("以經")) + path.write_text("{broken", encoding="utf-8") + self.assertEqual(0, Autocorrector(path).rule_count) + path.write_text( + json.dumps( + { + "meta": {"sources": [{"id": "test"}]}, + "rules": [ + {"wrong": "長短", "correct": "不等長", "source": "test"}, + {"wrong": "未知", "correct": "來源", "source": "missing"}, + ], + }, + ensure_ascii=False, + ), + encoding="utf-8", + ) + self.assertEqual(0, Autocorrector(path).rule_count) + + def test_rejects_a_mismatched_protection_mask(self) -> None: + with self.assertRaises(ValueError): + Autocorrector().correct("以經", [False]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_common_usage.py b/tests/test_common_usage.py index 7c9ad6b..cbd0af9 100644 --- a/tests/test_common_usage.py +++ b/tests/test_common_usage.py @@ -1,6 +1,8 @@ import unittest from bopomofo_core.libchewing_provider import ( + COMMON_USAGE_RULES, + add_literal_bopomofo_candidate, apply_common_usage_overrides, prioritize_common_character, ) @@ -27,6 +29,52 @@ def test_zi_defaults_to_character_but_context_can_select_self(self) -> None: apply_common_usage_overrides(["ㄗˋ", "ㄨㄛˇ"], "字我"), ) + def test_na_defaults_to_demonstrative_not_inside(self) -> None: + self.assertEqual( + ["那", "內", "納"], + prioritize_common_character("ㄋㄚˋ", ["內", "那", "納"]), + ) + + def test_de_defaults_to_possessive_particle(self) -> None: + self.assertEqual( + ["的", "得", "地"], + prioritize_common_character("ㄉㄜ˙", ["得", "地", "的"]), + ) + + def test_zuo_and_shi_default_to_everyday_verbs(self) -> None: + self.assertEqual( + ["做", "作", "座"], + prioritize_common_character("ㄗㄨㄛˋ", ["作", "座", "做"]), + ) + self.assertEqual( + ["是", "市", "事"], + prioritize_common_character("ㄕˋ", ["市", "是", "事"]), + ) + + def test_complete_reading_exposes_literal_zhuyin_without_replacing_default(self) -> None: + for reading, literal in ( + ("ㄢˉ", "ㄢ"), + ("ㄢˊ", "ㄢˊ"), + ("ㄢˇ", "ㄢˇ"), + ("ㄢˋ", "ㄢˋ"), + ("ㄢ˙", "ㄢ˙"), + ): + with self.subTest(reading=reading): + ranked = add_literal_bopomofo_candidate( + reading, ["安", "鞍", "庵", "諳"] + ) + self.assertEqual("安", ranked[0]) + self.assertEqual(literal, ranked[1]) + + # A dictionary-provided literal in the long tail must be moved, not + # mistaken for an already-visible candidate. + self.assertEqual( + ["安", "ㄢ", "鞍", "庵"], + add_literal_bopomofo_candidate( + "ㄢˉ", ["安", "鞍", "庵", "ㄢ"] + ), + ) + def test_bu_phrases_are_forced_to_common_usage(self) -> None: self.assertEqual( "我不要", @@ -57,8 +105,10 @@ def test_zai_rules_distinguish_unambiguous_traditional_usage(self) -> None: examples = ( (["ㄗㄞˋ", "ㄐㄧㄢˋ"], "在見", "再見"), (["ㄒㄧㄢˋ", "ㄗㄞˋ"], "現再", "現在"), - (["ㄍㄣ", "ㄗㄞˋ"], "跟再", "跟在"), - (["ㄗㄞˋ", "ㄐㄧㄚ"], "再家", "在家"), + (["ㄍㄣˉ", "ㄗㄞˋ"], "跟再", "跟在"), + (["ㄗㄞˋ", "ㄐㄧㄚˉ"], "再家", "在家"), + (["ㄗㄞˋ", "ㄧˉ", "ㄘˋ"], "在一刺", "再一次"), + (["ㄅㄨˋ", "ㄓˉ", "ㄉㄠˋ"], "部之到", "不知道"), ) for readings, engine_result, expected in examples: with self.subTest(expected=expected): @@ -67,6 +117,12 @@ def test_zai_rules_distinguish_unambiguous_traditional_usage(self) -> None: apply_common_usage_overrides(readings, engine_result), ) + def test_every_common_usage_reading_is_a_completed_syllable(self) -> None: + tones = frozenset("ˉˊˇˋ˙") + for pattern, replacement in COMMON_USAGE_RULES: + with self.subTest(replacement=replacement): + self.assertTrue(all(reading[-1:] in tones for reading in pattern)) + def test_ambiguous_zai_phrase_is_left_to_the_engine(self) -> None: self.assertEqual( "在做", diff --git a/tests/test_frequency_lexicon.py b/tests/test_frequency_lexicon.py index bc83060..e5f755b 100644 --- a/tests/test_frequency_lexicon.py +++ b/tests/test_frequency_lexicon.py @@ -7,6 +7,11 @@ class FrequencyLexiconTests(unittest.TestCase): + def test_full_phrase_membership_is_not_limited_to_candidate_tail(self) -> None: + lexicon = FrequencyLexicon() + self.assertTrue(lexicon.contains("寫程式")) + self.assertFalse(lexicon.contains("寫成式")) + def test_bundled_index_is_large_and_contains_common_taiwan_words(self) -> None: lexicon = FrequencyLexicon() self.assertGreaterEqual(lexicon.entry_count, 100_000) diff --git a/tests/test_phonetic_corrector.py b/tests/test_phonetic_corrector.py new file mode 100644 index 0000000..c7e82a1 --- /dev/null +++ b/tests/test_phonetic_corrector.py @@ -0,0 +1,161 @@ +import unittest + +from bopomofo_core.phonetic_corrector import PhoneticCorrector, reading_variants + + +class PhoneticCorrectorTests(unittest.TestCase): + def setUp(self) -> None: + self.candidates = { + "ㄧㄣˉ": ["音", "因"], + "ㄧㄥˉ": ["應", "英"], + "ㄍㄞˉ": ["該"], + "ㄍㄢˇ": ["感", "敢"], + } + + def candidate_lookup(reading: str) -> list[str]: + return list(self.candidates.get(reading, [])) + + def phrase_lookup(columns: list[list[str]]) -> list[str]: + phrases = ["應該", "音感"] + return [ + phrase + for phrase in phrases + if len(phrase) == len(columns) + and all(character in column for character, column in zip(phrase, columns)) + ] + + def known_phrase_lookup(readings: list[str]) -> list[str]: + known = { + ("ㄧㄥˉ", "ㄍㄞˉ"): ["應該"], + ("ㄧㄣˉ", "ㄍㄢˇ"): ["音感"], + } + return known.get(tuple(readings), []) + + self.candidate_lookup = candidate_lookup + self.phrase_lookup = phrase_lookup + self.known_phrase_lookup = known_phrase_lookup + self.corrector = PhoneticCorrector() + + def correct(self, readings, text, protected=None): + return self.corrector.correct( + readings, + text, + protected or [False] * len(text), + self.candidate_lookup, + self.phrase_lookup, + self.known_phrase_lookup, + ) + + def test_uses_readings_instead_of_enumerating_wrong_characters(self) -> None: + corrected, changes = self.correct(["ㄧㄣˉ", "ㄍㄞˉ"], "音該") + self.assertEqual("應該", corrected) + self.assertTrue(changes[0].used_fuzzy_reading) + + corrected, changes = self.correct(["ㄧㄥˉ", "ㄍㄞˉ"], "英該") + self.assertEqual("應該", corrected) + self.assertFalse(changes[0].used_fuzzy_reading) + + def test_preserves_a_valid_phrase_and_explicit_selection(self) -> None: + self.assertEqual( + ("音感", []), self.correct(["ㄧㄣˉ", "ㄍㄢˇ"], "音感") + ) + self.assertEqual( + ("音該", []), + self.correct(["ㄧㄣˉ", "ㄍㄞˉ"], "音該", [True, False]), + ) + + def test_common_bopomofo_confusions_are_slot_based(self) -> None: + self.assertEqual(("ㄧㄣˉ", "ㄧㄥˉ"), reading_variants("ㄧㄣˉ")) + self.assertEqual(("ㄕˋ", "ㄙˋ"), reading_variants("ㄕˋ")) + self.assertEqual(("ㄗㄥˉ", "ㄓㄥˉ", "ㄗㄣˉ"), reading_variants("ㄗㄥˉ")) + + def test_live_ranking_can_disable_fuzzy_pronunciation_changes(self) -> None: + corrected, changes = self.corrector.correct( + ["ㄧㄣˉ", "ㄍㄞˉ"], + "音該", + [False, False], + self.candidate_lookup, + self.phrase_lookup, + allow_fuzzy=False, + ) + self.assertEqual(("音該", []), (corrected, changes)) + + def test_text_only_word_cannot_borrow_an_unrelated_pronunciation(self) -> None: + def candidate_lookup(reading: str) -> list[str]: + return { + "ㄅㄟˋ": ["被", "貝"], + "ㄑㄩㄝˋ": ["卻", "殼"], + "ㄎㄜˊ": ["殼"], + }.get(reading, []) + + def phrase_lookup(columns: list[list[str]]) -> list[str]: + return [ + phrase + for phrase in ["貝殼"] + if all(character in column for character, column in zip(phrase, columns)) + ] + + def known_phrase_lookup(readings: list[str]) -> list[str]: + return { + ("ㄅㄟˋ", "ㄑㄩㄝˋ"): ["被卻"], + ("ㄅㄟˋ", "ㄎㄜˊ"): ["貝殼"], + }.get(tuple(readings), []) + + wrong = self.corrector.correct( + ["ㄅㄟˋ", "ㄑㄩㄝˋ"], + "貝卻", + [False, False], + candidate_lookup, + phrase_lookup, + known_phrase_lookup, + allow_fuzzy=False, + ) + correct = self.corrector.correct( + ["ㄅㄟˋ", "ㄎㄜˊ"], + "被殼", + [False, False], + candidate_lookup, + phrase_lookup, + known_phrase_lookup, + allow_fuzzy=False, + ) + self.assertEqual(("貝卻", []), wrong) + self.assertEqual("貝殼", correct[0]) + self.assertFalse(correct[1][0].used_fuzzy_reading) + + def test_long_valid_word_blocks_shorter_overlapping_rewrite(self) -> None: + columns = { + "寫": ["寫"], + "程": ["程", "成"], + "式": ["式"], + } + + def phrase_lookup(candidate_columns): + if len(candidate_columns) == 2 and "寫" in candidate_columns[0]: + return ["寫成"] + return [] + + corrected, changes = self.corrector.correct( + ["寫", "程", "式"], + "寫程式", + [False, False, False], + lambda reading: columns[reading], + phrase_lookup, + phrase_validator=lambda phrase: phrase == "寫程式", + allow_fuzzy=False, + ) + self.assertEqual(("寫程式", []), (corrected, changes)) + + def test_rejects_misaligned_state(self) -> None: + with self.assertRaises(ValueError): + self.corrector.correct( + ["ㄧㄣˉ"], + "音該", + [False, False], + self.candidate_lookup, + self.phrase_lookup, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_session.py b/tests/test_session.py index 0e00b11..2cdb572 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -75,7 +75,7 @@ def best_phrase(self, readings): return "樹葉" if readings == ["ㄕㄨˋ", "ㄧㄝˋ"] else "" def phrase_candidates(self, readings): - return ["樹葉", "樹液", "數夜"] + return ["樹葉", "樹液"] def dictionary_phrase_candidates(self, readings): return ["樹葉", "樹液"] @@ -86,7 +86,7 @@ def frequent_phrase_candidates(self, candidate_columns): session = CandidateSession(ContextualProvider()) self.assertEqual("樹葉", session.best_phrase(["ㄕㄨˋ", "ㄧㄝˋ"])) self.assertEqual( - ["樹葉", "樹液", "數夜"], + ["樹葉", "樹液"], session.phrase_candidates(["ㄕㄨˋ", "ㄧㄝˋ"]), ) self.assertEqual( @@ -97,6 +97,12 @@ def frequent_phrase_candidates(self, candidate_columns): ["樹葉", "數夜"], session.frequent_phrase_candidates([["樹", "數"], ["葉", "夜"]]), ) + self.assertEqual( + ["樹葉"], + session.validated_frequent_phrase_candidates( + ["ㄕㄨˋ", "ㄧㄝˋ"], [["樹", "數"], ["葉", "夜"]] + ), + ) def test_phrase_ranking_is_optional(self) -> None: session = CandidateSession(FakeProvider()) @@ -108,6 +114,12 @@ def test_phrase_ranking_is_optional(self) -> None: self.assertEqual( [], session.frequent_phrase_candidates([["樹"], ["葉"]]) ) + self.assertEqual( + [], + session.validated_frequent_phrase_candidates( + ["ㄕㄨˋ", "ㄧㄝˋ"], [["樹"], ["葉"]] + ), + ) def test_user_pin_outranks_the_bundled_default(self) -> None: class ProtectedProvider(FakeProvider): @@ -125,6 +137,26 @@ def prioritize_candidates(self, reading, candidates): session.input_symbol(symbol) self.assertEqual(["自", "字"], session.candidates) + def test_malformed_multi_character_pin_cannot_break_segment_alignment(self) -> None: + class CharacterProvider(FakeProvider): + TABLE = {"ㄗˋ": ["字", "自"]} + + pins = PinnedStore() + pins.pin("ㄗˋ", "不是單字") + session = CandidateSession(CharacterProvider(), pins) + for symbol in "ㄗˋ": + session.input_symbol(symbol) + self.assertEqual(["字", "自"], session.candidates) + self.assertTrue(all(len(candidate) == 1 for candidate in session.candidates)) + + invalid_pins = PinnedStore() + invalid_pins.pin("ㄅˋ", "不是單字") + invalid = CandidateSession(CharacterProvider(), invalid_pins) + invalid.input_symbol("ㄅ") + event = invalid.input_symbol("ˋ") + self.assertEqual(EventKind.BELL, event.kind) + self.assertEqual("ㄅ", invalid.preedit) + def test_corrupt_pin_file_falls_back_without_blocking_startup(self) -> None: with tempfile.TemporaryDirectory() as temp_dir: path = Path(temp_dir) / "pins.json" diff --git a/tests/test_taiwan_frequency.py b/tests/test_taiwan_frequency.py index 5302dbb..2855757 100644 --- a/tests/test_taiwan_frequency.py +++ b/tests/test_taiwan_frequency.py @@ -7,6 +7,11 @@ class TaiwanFrequencyTests(unittest.TestCase): + def test_official_phrase_membership(self) -> None: + frequency = TaiwanFrequency() + self.assertTrue(frequency.contains_phrase("音感")) + self.assertFalse(frequency.contains_phrase("音該")) + def test_bundled_official_index_is_present(self) -> None: frequency = TaiwanFrequency() self.assertGreaterEqual(frequency.character_count, 4_000) @@ -38,6 +43,15 @@ def test_character_ranking_uses_frequency_and_preserves_unknown_order(self) -> N frequency.rank_characters(["自", "甲", "字", "乙"]), ) + def test_reading_dictionary_default_can_be_preserved(self) -> None: + frequency = TaiwanFrequency() + self.assertEqual( + ["運", "員", "均"], + frequency.rank_characters( + ["運", "均", "員"], preserve_first=True + ), + ) + def test_missing_index_is_optional(self) -> None: with tempfile.TemporaryDirectory() as temp_dir: frequency = TaiwanFrequency(Path(temp_dir) / "missing.json")