diff --git a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift index 84c0584b..6cc12c30 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift @@ -272,23 +272,37 @@ class ctlInputMethod: IMKInputController { /// - Returns: IMK 選字窗專用的候選字串陣列。 override func candidates(_ sender: Any!) -> [Any]! { _ = sender // 防止格式整理工具毀掉與此對應的參數。 + var arrResult = [String]() + // 你沒看錯,三個狀態下的處理流程都是雷同的。 if let state = state as? InputState.AssociatedPhrases { - return state.candidates.map { theCandidate -> String in + for theCandidate in state.candidates { let theConverted = IME.kanjiConversionIfRequired(theCandidate.1) - return (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" + var result = (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" + if arrResult.contains(result) { + result = "\(result)(\(theCandidate.0))" + } + arrResult.append(result) } } else if let state = state as? InputState.SymbolTable { - return state.candidates.map { theCandidate -> String in + for theCandidate in state.candidates { let theConverted = IME.kanjiConversionIfRequired(theCandidate.1) - return (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" + var result = (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" + if arrResult.contains(result) { + result = "\(result)(\(theCandidate.0))" + } + arrResult.append(result) } } else if let state = state as? InputState.ChoosingCandidate { - return state.candidates.map { theCandidate -> String in + for theCandidate in state.candidates { let theConverted = IME.kanjiConversionIfRequired(theCandidate.1) - return (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" + var result = (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" + if arrResult.contains(result) { + result = "\(result)(\(theCandidate.0))" + } + arrResult.append(result) } } - return .init() + return arrResult } override open func candidateSelectionChanged(_: NSAttributedString!) { @@ -305,28 +319,44 @@ class ctlInputMethod: IMKInputController { } var indexDeducted = 0 + // 你沒看錯,三個狀態下的處理流程都是雷同的。 if let state = state as? InputState.AssociatedPhrases { - for (i, neta) in state.candidates.map(\.1).enumerated() { - let theConverted = IME.kanjiConversionIfRequired(neta) - let netaShown = (neta == theConverted) ? neta : "\(theConverted)(\(neta))" + for (i, neta) in state.candidates.enumerated() { + let theConverted = IME.kanjiConversionIfRequired(neta.1) + let netaShown = (neta.1 == theConverted) ? neta.1 : "\(theConverted)(\(neta.1))" + let netaShownWithPronunciation = "\(theConverted)(\(neta.0))" + if candidateString.string == netaShownWithPronunciation { + indexDeducted = i + break + } if candidateString.string == netaShown { indexDeducted = i break } } } else if let state = state as? InputState.SymbolTable { - for (i, neta) in state.candidates.map(\.1).enumerated() { - let theConverted = IME.kanjiConversionIfRequired(neta) - let netaShown = (neta == theConverted) ? neta : "\(theConverted)(\(neta))" + for (i, neta) in state.candidates.enumerated() { + let theConverted = IME.kanjiConversionIfRequired(neta.1) + let netaShown = (neta.1 == theConverted) ? neta.1 : "\(theConverted)(\(neta.1))" + let netaShownWithPronunciation = "\(theConverted)(\(neta.0))" + if candidateString.string == netaShownWithPronunciation { + indexDeducted = i + break + } if candidateString.string == netaShown { indexDeducted = i break } } } else if let state = state as? InputState.ChoosingCandidate { - for (i, neta) in state.candidates.map(\.1).enumerated() { - let theConverted = IME.kanjiConversionIfRequired(neta) - let netaShown = (neta == theConverted) ? neta : "\(theConverted)(\(neta))" + for (i, neta) in state.candidates.enumerated() { + let theConverted = IME.kanjiConversionIfRequired(neta.1) + let netaShown = (neta.1 == theConverted) ? neta.1 : "\(theConverted)(\(neta.1))" + let netaShownWithPronunciation = "\(theConverted)(\(neta.0))" + if candidateString.string == netaShownWithPronunciation { + indexDeducted = i + break + } if candidateString.string == netaShown { indexDeducted = i break