Skip to content

允許在用短節點覆寫(既有的)長節點所在的範圍內的節點時、保持這次的非覆寫範圍內容不變。 #100

@ShikiSuen

Description

@ShikiSuen

打比方說輸入法原廠詞庫內有「章太炎」一詞,你敲「章太炎」,然後想把「太」改成「泰」以使其變成「章泰炎」。macOS 內建的注音輸入法不會在這個過程對這個詞除了「太」以外的部分有任何變動,但所有 OV 系輸入法都對此有 Bug:會將這些部分全部重設為各自的讀音下的最高原始權重的漢字。也就是說,選字之後的結果可能會變成「張泰言」。

類似的可以拿來測試的詞有「蔡依林」「周杰倫」。

測試時請務必也測試「敲長句子、且這種詞在句子中間出現時」的情況。

該問題波及迄今為止幾乎全部的 OpenVanilla 系輸入法,至少波及:

  • 自然輸入法 mac 版 v11。 (不討論 v12)
  • 奇摩輸入法 (最終版本)。
  • 小麥注音輸入法 (截至 v2.4 的全部版本)。

也波及下述非 macOS 平台的輸入法:

  • 微軟新注音 2010 / Windows 10 & 11 內建微軟新注音。
  • 新酷音 TSF。

威注音輸入法截至 v1.9.3 SP2 版為止都受到上游的這個 Bug 的影響。
針對該問題有關的修正會在威注音 v1.9.4 版當中推送。
該修正必須搭配至少天權星組字引擎 v2.0.2 版方可生效。
威注音這次對該問題的修正算法可能比較囉唆,但至少在常用情形下不會再發生該問題。
如果還有問題的話,請依下文指引來電郵聯絡我、且在電郵內仔細闡明觸發條件:
https://vchewing.github.io/BUGREPORT.html


技術細節:

先在游標位置找出既有節點,記住這個節點的始末範圍(範圍A)。
然後再檢查要拿來覆寫成的字詞在覆寫成功後會有哪些始末範圍(範圍B)。
取範圍 A B 之併集,成為範圍 C。
然後檢查範圍 C 的邊界是否有切到(在這次覆寫行為之前的)前後方節點。
有的話,將那個節點的遠端也算入 C 的範圍內、更新 C 的邊界。

最後,將範圍 C 內的所有節點都以最小的幅位長度(spanLength)為單位……
……先用最高手動權重覆寫一遍。
(如果是字音數量不一致的節點的話,以該節點為單位;否則以漢字為單位。)

這樣一來,就完成了對游標上下文內容的鞏固工作。

然後再拿你在選字窗內選中確認過的候選字詞(的詞音配對)來覆寫節點。

這時,天權星組字引擎 v2.0.2 的更新就起作用了:
會將這次覆寫範圍內存在的「剛剛被鞏固過的最小節點們」的權重自動減半。
這樣一來,覆寫範圍外的內容就不會受變動。
因為都被標記過覆寫狀態、就不會被 walk() 爬軌函數改成你不想要的結果。

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions