From 503b102a72fb6a3a95556d0ab1c5868b376e6269 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 19 Aug 2022 18:21:09 +0800 Subject: [PATCH] InputState // Upgrade attributedString in ChoosingCandidate(). --- .../ControllerModules/InputState.swift | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/Source/Modules/ControllerModules/InputState.swift b/Source/Modules/ControllerModules/InputState.swift index 191d6d6b..28a61cc8 100644 --- a/Source/Modules/ControllerModules/InputState.swift +++ b/Source/Modules/ControllerModules/InputState.swift @@ -437,6 +437,17 @@ public enum InputState { override public var type: StateType { .ofChoosingCandidate } private(set) var candidates: [(String, String)] private(set) var isTypingVertical: Bool + // 該變數改為可以隨時更改的內容,不然的話 ctlInputMethod.candidateSelectionChanged() 會上演俄羅斯套娃(崩潰)。 + public var chosenCandidateString: String = "" { + didSet { + // 去掉讀音資訊,且最終留存「執行康熙 / JIS 轉換之前」的結果。 + if chosenCandidateString.contains("\u{17}") { + chosenCandidateString = String(chosenCandidateString.split(separator: "\u{17}")[0]) + } + if !chosenCandidateString.contains("\u{1A}") { return } + chosenCandidateString = String(chosenCandidateString.split(separator: "\u{1A}").reversed()[0]) + } + } init( composingBuffer: String, cursorIndex: Int, candidates: [(String, String)], isTypingVertical: Bool, @@ -447,6 +458,70 @@ public enum InputState { super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex, nodeValuesArray: nodeValuesArray) } + // 這個函數尚未經過嚴格的單元測試。請在使用時確保 chosenCandidateString 為空。 + // 不為空的話,該參數的返回值就會有對應的影響、顯示成類似 macOS 內建注音輸入法那樣子。 + // 本來想給輸入法拓展這方面的功能的,奈何 ctlInputMethod.candidateSelectionChanged() 這函式太氣人。 + // 想要講的幹話已經在那邊講完了,感興趣的可以去看看。 + override var attributedString: NSMutableAttributedString { + guard !chosenCandidateString.isEmpty else { return super.attributedString } + let bufferTextRear = composingBuffer.utf16SubString(with: 0.. = { + switch mgrPrefs.useRearCursorMode { + case false: return (max(0, cursorIndex - chosenCandidateString.utf16.count)).. = { + switch mgrPrefs.useRearCursorMode { + case false: return (max(0, cursorIndexU8 - chosenCandidateString.count)).." }