Repo // Massive updates conforming to recent changes of Megrez.

This commit is contained in:
ShikiSuen 2022-12-06 20:26:48 +08:00
parent 9b78be6d3a
commit 2664509276
14 changed files with 103 additions and 88 deletions

View File

@ -229,14 +229,15 @@ extension vChewingLM {
///
/// - Parameters:
/// - key:
/// - key:
/// - unigram:
/// - isFiltering:
public func insertTemporaryData(key: String, unigram: Megrez.Unigram, isFiltering: Bool) {
public func insertTemporaryData(keyArray: [String], unigram: Megrez.Unigram, isFiltering: Bool) {
let keyChain = keyArray.joined(separator: "-")
_ =
isFiltering
? lmFiltered.temporaryMap[key, default: []].append(unigram)
: lmUserPhrases.temporaryMap[key, default: []].append(unigram)
? lmFiltered.temporaryMap[keyChain, default: []].append(unigram)
: lmUserPhrases.temporaryMap[keyChain, default: []].append(unigram)
}
/// 使
@ -279,60 +280,62 @@ extension vChewingLM {
}
///
/// - Parameter key:
/// - Parameter key:
/// - Returns:
public func hasUnigramsFor(key: String) -> Bool {
key == " " || (!unigramsFor(key: key).isEmpty && !key.isEmpty)
public func hasUnigramsFor(keyArray: [String]) -> Bool {
let keyChain = keyArray.joined(separator: "-")
return keyChain == " " || (!unigramsFor(keyArray: keyArray).isEmpty && !keyChain.isEmpty)
}
///
/// - Parameters:
/// - key:
/// - key:
/// - value:
/// - Returns:
public func hasKeyValuePairFor(key: String, value: String) -> Bool {
unigramsFor(key: key).map(\.value).contains(value)
public func hasKeyValuePairFor(key: [String], value: String) -> Bool {
unigramsFor(keyArray: key).map(\.value).contains(value)
}
/// LMI
/// - Parameter key:
/// - Returns:
public func unigramsFor(key: String) -> [Megrez.Unigram] {
guard !key.isEmpty else { return [] }
public func unigramsFor(keyArray: [String]) -> [Megrez.Unigram] {
let keyChain = keyArray.joined(separator: "-")
guard !keyChain.isEmpty else { return [] }
///
if key == " " { return [.init(value: " ")] }
if keyChain == " " { return [.init(value: " ")] }
///
var rawAllUnigrams: [Megrez.Unigram] = []
if isCassetteEnabled { rawAllUnigrams += Self.lmCassette.unigramsFor(key: key) }
if isCassetteEnabled { rawAllUnigrams += Self.lmCassette.unigramsFor(key: keyChain) }
// 使
if isSCPCEnabled {
rawAllUnigrams += lmPlainBopomofo.valuesFor(key: key).map { Megrez.Unigram(value: $0, score: 0) }
rawAllUnigrams += lmPlainBopomofo.valuesFor(key: keyChain).map { Megrez.Unigram(value: $0, score: 0) }
}
// reversed 使
//
// rawUserUnigrams
rawAllUnigrams += lmUserPhrases.unigramsFor(key: key).reversed()
rawAllUnigrams += lmUserPhrases.unigramsFor(key: keyChain).reversed()
if !isCassetteEnabled || isCassetteEnabled && key.charComponents[0] == "_" {
if !isCassetteEnabled || isCassetteEnabled && keyChain.charComponents[0] == "_" {
// LMMisc LMCore score (-10.0, 0.0)
rawAllUnigrams += lmMisc.unigramsFor(key: key)
rawAllUnigrams += lmCore.unigramsFor(key: key)
if isCNSEnabled { rawAllUnigrams += Self.lmCNS.unigramsFor(key: key) }
rawAllUnigrams += lmMisc.unigramsFor(key: keyChain)
rawAllUnigrams += lmCore.unigramsFor(key: keyChain)
if isCNSEnabled { rawAllUnigrams += Self.lmCNS.unigramsFor(key: keyChain) }
}
if isSymbolEnabled {
rawAllUnigrams += lmUserSymbols.unigramsFor(key: key)
rawAllUnigrams += lmUserSymbols.unigramsFor(key: keyChain)
if !isCassetteEnabled {
rawAllUnigrams += Self.lmSymbols.unigramsFor(key: key)
rawAllUnigrams += Self.lmSymbols.unigramsFor(key: keyChain)
}
}
//
rawAllUnigrams.append(contentsOf: queryDateTimeUnigrams(with: key))
rawAllUnigrams.append(contentsOf: queryDateTimeUnigrams(with: keyChain))
//
if isPhraseReplacementEnabled {
@ -344,7 +347,7 @@ extension vChewingLM {
}
//
rawAllUnigrams.consolidate(filter: .init(lmFiltered.unigramsFor(key: key).map(\.value)))
rawAllUnigrams.consolidate(filter: .init(lmFiltered.unigramsFor(key: keyChain).map(\.value)))
return rawAllUnigrams
}
}

View File

@ -69,7 +69,7 @@ extension vChewingLM {
var headIndex = 0
guard let nodeIter = currentWalk.findNode(at: cursor, target: &headIndex) else { return .init() }
let key = vChewingLM.LMUserOverride.formObservationKey(walkedNodes: currentWalk, headIndex: headIndex)
return getSuggestion(key: key, timestamp: timestamp, headReading: nodeIter.key)
return getSuggestion(key: key, timestamp: timestamp, headReading: nodeIter.joinedKey())
}
}
}
@ -329,15 +329,15 @@ extension vChewingLM.LMUserOverride {
arrNodes = Array(arrNodes.reversed())
let kvCurrent = arrNodes[0].currentPair
guard !kvCurrent.key.contains("_") else {
guard !kvCurrent.joinedKey().contains("_") else {
return ""
}
//
if kvCurrent.key.split(separator: "-").count != kvCurrent.value.count { return "" }
if kvCurrent.keyArray.count != kvCurrent.value.count { return "" }
//
let strCurrent = kvCurrent.key
let strCurrent = kvCurrent.joinedKey()
var kvPrevious = Megrez.Compositor.KeyValuePaired()
var kvAnterior = Megrez.Compositor.KeyValuePaired()
var readingStack = ""
@ -354,19 +354,19 @@ extension vChewingLM.LMUserOverride {
}
if arrNodes.count >= 2,
!kvPrevious.key.contains("_"),
kvPrevious.key.split(separator: "-").count == kvPrevious.value.count
!kvPrevious.joinedKey().contains("_"),
kvPrevious.joinedKey().split(separator: "-").count == kvPrevious.value.count
{
kvPrevious = arrNodes[1].currentPair
readingStack = kvPrevious.key + readingStack
readingStack = kvPrevious.joinedKey() + readingStack
}
if arrNodes.count >= 3,
!kvAnterior.key.contains("_"),
kvAnterior.key.split(separator: "-").count == kvAnterior.value.count
!kvAnterior.joinedKey().contains("_"),
kvAnterior.joinedKey().split(separator: "-").count == kvAnterior.value.count
{
kvAnterior = arrNodes[2].currentPair
readingStack = kvAnterior.key + readingStack
readingStack = kvAnterior.joinedKey() + readingStack
}
return result

View File

@ -9,7 +9,7 @@
import Cocoa
public protocol CtlCandidateDelegate {
func candidatePairs(conv: Bool) -> [(String, String)]
func candidatePairs(conv: Bool) -> [([String], String)]
func candidatePairSelected(at index: Int)
func candidatePairRightClicked(at index: Int, action: CandidateContextMenuAction)
func candidates(_ sender: Any!) -> [Any]!

View File

@ -15,7 +15,7 @@ public protocol IMEStateProtocol {
var isASCIIMode: Bool { get set }
var isVerticalTyping: Bool { get set }
var isVerticalCandidateWindow: Bool { get set }
var candidates: [(String, String)] { get set }
var candidates: [([String], String)] { get set }
var hasComposition: Bool { get }
var isCandidateContainer: Bool { get }
var displayedText: String { get }
@ -49,7 +49,7 @@ public protocol IMEStateDataProtocol {
var isFilterable: Bool { get }
var isVerticalTyping: Bool { get set }
var isMarkedLengthValid: Bool { get }
var candidates: [(String, String)] { get set }
var candidates: [([String], String)] { get set }
var displayedText: String { get set }
var displayedTextConverted: String { get }
var tooltipBackupForInputting: String { get set }

View File

@ -84,7 +84,7 @@ public struct IMEState: IMEStateProtocol {
self.data = data
self.type = type
self.node = node
self.data.candidates = node.members.map { ("", $0.name) }
self.data.candidates = node.members.map { ([""], $0.name) }
}
}
@ -107,7 +107,7 @@ extension IMEState {
return result
}
public static func ofAssociates(candidates: [(String, String)]) -> IMEState {
public static func ofAssociates(candidates: [([String], String)]) -> IMEState {
var result = IMEState(type: .ofAssociates)
result.candidates = candidates
return result
@ -132,7 +132,7 @@ extension IMEState {
return result
}
public static func ofCandidates(candidates: [(String, String)], displayTextSegments: [String], cursor: Int)
public static func ofCandidates(candidates: [([String], String)], displayTextSegments: [String], cursor: Int)
-> IMEState
{
var result = IMEState(displayTextSegments: displayTextSegments, cursor: cursor)
@ -178,7 +178,7 @@ extension IMEState {
return result
}
public var candidates: [(String, String)] {
public var candidates: [([String], String)] {
get { data.candidates }
set { data.candidates = newValue }
}

View File

@ -91,7 +91,7 @@ public struct IMEStateData: IMEStateDataProtocol {
public var reading: String = ""
public var markedReadings = [String]()
public var candidates = [(String, String)]()
public var candidates = [([String], String)]()
public var textToCommit: String = ""
public var tooltip: String = ""
public var tooltipDuration: Double = 1.0
@ -172,7 +172,7 @@ public struct IMEStateData: IMEStateDataProtocol {
extension IMEStateData {
public var doesUserPhraseExist: Bool {
let text = displayedText.charComponents[markedRange].joined()
let joined = markedReadings.joined(separator: "-")
let joined = markedReadings.joined(separator: InputHandler.keySeparator)
return LMMgr.checkIfUserPhraseExist(
userPhrase: text, mode: IMEApp.currentInputMode, key: joined
)
@ -205,7 +205,7 @@ extension IMEStateData {
}
public var userPhraseKVPair: (String, String) {
let key = markedReadings.joined(separator: "-")
let key = markedReadings.joined(separator: InputHandler.keySeparator)
let value = displayedText.charComponents[markedRange].joined()
return (key, value)
}

View File

@ -22,6 +22,8 @@ public protocol InputHandlerProtocol {
var currentUOM: vChewingLM.LMUserOverride { get set }
var delegate: InputHandlerDelegate? { get set }
var composer: Tekkon.Composer { get set }
var keySeparator: String { get }
static var keySeparator: String { get }
var isCompositorEmpty: Bool { get }
var isComposerUsingPinyin: Bool { get }
func clear()
@ -31,7 +33,7 @@ public protocol InputHandlerProtocol {
func generateStateOfCandidates() -> IMEStateProtocol
func generateStateOfInputting(sansReading: Bool) -> IMEStateProtocol
func generateStateOfAssociates(withPair pair: Megrez.Compositor.KeyValuePaired) -> IMEStateProtocol
func consolidateNode(candidate: (String, String), respectCursorPushing: Bool, preConsolidate: Bool)
func consolidateNode(candidate: ([String], String), respectCursorPushing: Bool, preConsolidate: Bool)
func updateUnigramData() -> Bool
}
@ -149,10 +151,10 @@ public class InputHandler: InputHandlerProtocol {
/// - Parameter key:
/// - Returns:
/// nil
func generateArrayOfAssociates(withPair pair: Megrez.Compositor.KeyValuePaired) -> [(String, String)] {
var arrResult: [(String, String)] = []
func generateArrayOfAssociates(withPair pair: Megrez.Compositor.KeyValuePaired) -> [([String], String)] {
var arrResult: [([String], String)] = []
if currentLM.hasAssociatedPhrasesFor(pair: pair) {
arrResult = currentLM.associatedPhrasesFor(pair: pair).map { ("", $0) }
arrResult = currentLM.associatedPhrasesFor(pair: pair).map { ([""], $0) }
}
return arrResult
}
@ -223,7 +225,7 @@ public class InputHandler: InputHandlerProtocol {
for (subPosition, key) in currentNode.keyArray.enumerated() {
guard values.count > subPosition else { break } //
let thePair = Megrez.Compositor.KeyValuePaired(
key: key, value: values[subPosition]
keyArray: [key], value: values[subPosition]
)
compositor.overrideCandidate(thePair, at: position)
position += 1
@ -241,9 +243,9 @@ public class InputHandler: InputHandlerProtocol {
/// - respectCursorPushing: true
/// - consolidate:
public func consolidateNode(
candidate: (String, String), respectCursorPushing: Bool = true, preConsolidate: Bool = false
candidate: ([String], String), respectCursorPushing: Bool = true, preConsolidate: Bool = false
) {
let theCandidate: Megrez.Compositor.KeyValuePaired = .init(key: candidate.0, value: candidate.1)
let theCandidate: Megrez.Compositor.KeyValuePaired = .init(keyArray: candidate.0, value: candidate.1)
///
if preConsolidate { consolidateCursorContext(with: theCandidate) }
@ -284,7 +286,7 @@ public class InputHandler: InputHandlerProtocol {
}
///
func generateArrayOfCandidates(fixOrder: Bool = true) -> [(String, String)] {
func generateArrayOfCandidates(fixOrder: Bool = true) -> [([String], String)] {
/// 使 nodesCrossing macOS
/// nodeCrossing
var arrCandidates: [Megrez.Compositor.KeyValuePaired] = {
@ -301,7 +303,7 @@ public class InputHandler: InputHandlerProtocol {
// 調
if !prefs.fetchSuggestionsFromUserOverrideModel || prefs.useSCPCTypingMode || fixOrder {
return arrCandidates.map { ($0.key, $0.value) }
return arrCandidates.map { ($0.keyArray, $0.value) }
}
let arrSuggestedUnigrams: [(String, Megrez.Unigram)] = retrieveUOMSuggestions(apply: false)
@ -310,8 +312,8 @@ public class InputHandler: InputHandlerProtocol {
}
arrCandidates = arrSuggestedCandidates.filter { arrCandidates.contains($0) } + arrCandidates
arrCandidates = arrCandidates.deduplicated
arrCandidates = arrCandidates.stableSort { $0.key.split(separator: "-").count > $1.key.split(separator: "-").count }
return arrCandidates.map { ($0.key, $0.value) }
arrCandidates = arrCandidates.stableSort { $0.keyArray.count > $1.keyArray.count }
return arrCandidates.map { ($0.keyArray, $0.value) }
}
///
@ -437,6 +439,10 @@ public class InputHandler: InputHandlerProtocol {
// MARK: - Extracted methods and functions (Megrez).
public var keySeparator: String { compositor.separator }
public static var keySeparator: String { Megrez.Compositor.theSeparator }
///
public func updateUnigramData() -> Bool {
let result = compositor.update(updateExisting: true)

View File

@ -173,12 +173,12 @@ extension InputHandler {
? currentLM.isThisCassetteKeyAllowed(key: input.text) : composer.inputValidityCheck(key: input.charCode)
var shouldAutoSelectCandidate: Bool =
isInputValid || currentLM.hasUnigramsFor(key: customPunctuation)
|| currentLM.hasUnigramsFor(key: punctuation)
isInputValid || currentLM.hasUnigramsFor(keyArray: [customPunctuation])
|| currentLM.hasUnigramsFor(keyArray: [punctuation])
if !shouldAutoSelectCandidate, input.isUpperCaseASCIILetterKey {
let letter = "_letter_\(input.text)"
if currentLM.hasUnigramsFor(key: letter) { shouldAutoSelectCandidate = true }
if currentLM.hasUnigramsFor(keyArray: [letter]) { shouldAutoSelectCandidate = true }
}
if shouldAutoSelectCandidate {

View File

@ -53,7 +53,7 @@ extension InputHandler {
theComposer.intonation.clear()
//
let temporaryReadingKey = theComposer.getComposition()
if currentLM.hasUnigramsFor(key: temporaryReadingKey) {
if currentLM.hasUnigramsFor(keyArray: [temporaryReadingKey]) {
compositor.dropKey(direction: .rear)
walk() // Walk walk
composer = theComposer
@ -92,7 +92,7 @@ extension InputHandler {
return handleCtrlCommandEnter()
}
//
if !currentLM.hasUnigramsFor(key: readingKey) {
if !currentLM.hasUnigramsFor(keyArray: [readingKey]) {
delegate.callError("B49C0979語彙庫內無「\(readingKey)」的匹配記錄。")
if prefs.keepReadingUponCompositionError {
@ -140,14 +140,14 @@ extension InputHandler {
case 2...: delegate.switchState(candidateState)
case 1:
let firstCandidate = candidateState.candidates.first! //
let reading: String = firstCandidate.0
let reading: String = firstCandidate.0.joined(separator: compositor.separator)
let text: String = firstCandidate.1
delegate.switchState(IMEState.ofCommitting(textToCommit: text))
if !prefs.associatedPhrasesEnabled {
delegate.switchState(IMEState.ofEmpty())
} else {
let associatedPhrases = generateStateOfAssociates(withPair: .init(key: reading, value: text))
let associatedPhrases = generateStateOfAssociates(withPair: .init(keyArray: [reading], value: text))
delegate.switchState(associatedPhrases.candidates.isEmpty ? IMEState.ofEmpty() : associatedPhrases)
}
default: break
@ -240,7 +240,7 @@ extension InputHandler {
return handleCtrlCommandEnter()
}
//
if !currentLM.hasUnigramsFor(key: calligrapher) {
if !currentLM.hasUnigramsFor(keyArray: [calligrapher]) {
delegate.callError("B49C0979_Cassette語彙庫內無「\(calligrapher)」的匹配記錄。")
calligrapher.removeAll()
@ -282,14 +282,14 @@ extension InputHandler {
case 2...: delegate.switchState(candidateState)
case 1:
let firstCandidate = candidateState.candidates.first! //
let reading: String = firstCandidate.0
let reading: String = firstCandidate.0.joined(separator: compositor.separator)
let text: String = firstCandidate.1
delegate.switchState(IMEState.ofCommitting(textToCommit: text))
if !prefs.associatedPhrasesEnabled {
delegate.switchState(IMEState.ofEmpty())
} else {
let associatedPhrases = generateStateOfAssociates(withPair: .init(key: reading, value: text))
let associatedPhrases = generateStateOfAssociates(withPair: .init(keyArray: [reading], value: text))
delegate.switchState(associatedPhrases.candidates.isEmpty ? IMEState.ofEmpty() : associatedPhrases)
}
default: break

View File

@ -190,7 +190,7 @@ extension InputHandler {
if input.isSymbolMenuPhysicalKey, !input.isShiftHold, !input.isControlHold, state.type != .ofDeactivated {
if input.isOptionHold {
if currentLM.hasUnigramsFor(key: "_punctuation_list") {
if currentLM.hasUnigramsFor(keyArray: ["_punctuation_list"]) {
if isComposerOrCalligrapherEmpty, compositor.insertKey("_punctuation_list") {
walk()
// App

View File

@ -239,7 +239,7 @@ extension InputHandler {
func handlePunctuation(_ customPunctuation: String) -> Bool {
guard let delegate = delegate else { return false }
if !currentLM.hasUnigramsFor(key: customPunctuation) {
if !currentLM.hasUnigramsFor(keyArray: [customPunctuation]) {
return false
}
@ -269,7 +269,7 @@ extension InputHandler {
case 2...: delegate.switchState(candidateState)
case 1:
clear() // candidateState
if let candidateToCommit: (String, String) = candidateState.candidates.first, !candidateToCommit.1.isEmpty {
if let candidateToCommit: ([String], String) = candidateState.candidates.first, !candidateToCommit.1.isEmpty {
delegate.switchState(IMEState.ofCommitting(textToCommit: candidateToCommit.1))
} else {
delegate.switchState(candidateState)
@ -337,13 +337,13 @@ extension InputHandler {
var composed = ""
for node in compositor.walkedNodes {
var key = node.key
var key = node.keyArray.joined(separator: "\t")
if !prefs.cassetteEnabled {
if prefs.inlineDumpPinyinInLieuOfZhuyin {
key = Tekkon.restoreToneOneInZhuyinKey(target: key) //
key = Tekkon.cnvPhonaToHanyuPinyin(target: key) //
key = Tekkon.cnvHanyuPinyinToTextbookStyle(target: key) // 調
key = key.replacingOccurrences(of: "-", with: " ")
key = key.replacingOccurrences(of: "\t", with: " ")
} else {
key = Tekkon.cnvZhuyinChainToTextbookReading(target: key, newSeparator: " ")
}
@ -706,7 +706,7 @@ extension InputHandler {
return true
}
let currentPaired = (currentNode.key, currentNode.value)
let currentPaired = (currentNode.keyArray, currentNode.value)
var currentIndex = 0
if !currentNode.isOverriden {

View File

@ -279,8 +279,8 @@ public class LMMgr {
key unigramKey: String
) -> Bool {
switch mode {
case .imeModeCHS: return lmCHS.hasKeyValuePairFor(key: unigramKey, value: userPhrase)
case .imeModeCHT: return lmCHT.hasKeyValuePairFor(key: unigramKey, value: userPhrase)
case .imeModeCHS: return lmCHS.hasKeyValuePairFor(key: [unigramKey], value: userPhrase)
case .imeModeCHT: return lmCHT.hasKeyValuePairFor(key: [unigramKey], value: userPhrase)
case .imeModeNULL: return false
}
}

View File

@ -57,7 +57,8 @@ extension SessionCtl: InputHandlerDelegate {
//
let temporaryScore: Double = SessionCtl.areWeNerfing ? -114.514 : 0
LMMgr.currentLM.insertTemporaryData(
key: rawPair.0, unigram: .init(value: rawPair.1, score: temporaryScore), isFiltering: SessionCtl.areWeNerfing
keyArray: [rawPair.0], unigram: .init(value: rawPair.1, score: temporaryScore),
isFiltering: SessionCtl.areWeNerfing
)
// 使
LMMgr.bleachSpecifiedSuggestions(targets: [valueCurrent], mode: IMEApp.currentInputMode)
@ -95,12 +96,12 @@ extension SessionCtl: CtlCandidateDelegate {
PrefMgr.shared.useIMKCandidateWindow ? "123456789" : PrefMgr.shared.candidateKeys
}
public func candidatePairs(conv: Bool = false) -> [(String, String)] {
public func candidatePairs(conv: Bool = false) -> [([String], String)] {
if !state.isCandidateContainer || state.candidates.isEmpty { return [] }
if !conv || PrefMgr.shared.cns11643Enabled || state.candidates[0].0.contains("_punctuation") {
if !conv || PrefMgr.shared.cns11643Enabled || state.candidates[0].0.joined().contains("_punctuation") {
return state.candidates
}
let convertedCandidates: [(String, String)] = state.candidates.map { theCandidatePair -> (String, String) in
let convertedCandidates: [([String], String)] = state.candidates.map { theCandidatePair -> ([String], String) in
let theCandidate = theCandidatePair.1
let theConverted = ChineseConverter.kanjiConversionIfRequired(theCandidate)
let result = (theCandidate == theConverted) ? theCandidate : "\(theConverted)(\(theCandidate))"
@ -139,7 +140,7 @@ extension SessionCtl: CtlCandidateDelegate {
// selectedValue.1
if PrefMgr.shared.associatedPhrasesEnabled {
let associates = inputHandler.generateStateOfAssociates(
withPair: .init(key: selectedValue.0, value: selectedValue.1)
withPair: .init(keyArray: selectedValue.0, value: selectedValue.1)
)
switchState(associates.candidates.isEmpty ? IMEState.ofEmpty() : associates)
} else {
@ -162,7 +163,7 @@ extension SessionCtl: CtlCandidateDelegate {
}
if PrefMgr.shared.associatedPhrasesEnabled {
let associates = inputHandler.generateStateOfAssociates(
withPair: .init(key: selectedValue.0, value: String(valueKept))
withPair: .init(keyArray: selectedValue.0, value: String(valueKept))
)
if !associates.candidates.isEmpty {
switchState(associates)
@ -204,7 +205,7 @@ extension SessionCtl: CtlCandidateDelegate {
//
let temporaryScore: Double = (action == .toNerf) ? -114.514 : 0
LMMgr.currentLM.insertTemporaryData(
key: rawPair.0, unigram: .init(value: rawPair.1, score: temporaryScore), isFiltering: action == .toFilter
keyArray: rawPair.0, unigram: .init(value: rawPair.1, score: temporaryScore), isFiltering: action == .toFilter
)
// 使

View File

@ -21,17 +21,19 @@ extension SessionCtl {
var arrResult = [String]()
// 便 IMEState
func handleIMKCandidatesPrepared(_ candidates: [(String, String)], prefix: String = "") {
func handleIMKCandidatesPrepared(_ candidates: [([String], String)], prefix: String = "") {
guard let separator = inputHandler?.keySeparator else { return }
for theCandidate in candidates {
let theConverted = ChineseConverter.kanjiConversionIfRequired(theCandidate.1)
var result = (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)\u{1A}(\(theCandidate.1))"
if arrResult.contains(result) {
let reading: String =
PrefMgr.shared.cassetteEnabled
? theCandidate.0
? theCandidate.0.joined(separator: separator)
: (PrefMgr.shared.showHanyuPinyinInCompositionBuffer
? Tekkon.cnvPhonaToHanyuPinyin(target: Tekkon.restoreToneOneInZhuyinKey(target: theCandidate.0))
: theCandidate.0)
? Tekkon.cnvPhonaToHanyuPinyin(
target: Tekkon.restoreToneOneInZhuyinKey(target: theCandidate.0.joined(separator: separator)))
: theCandidate.0.joined(separator: separator))
result = "\(result)\u{17}(\(reading))"
}
arrResult.append(prefix + result)
@ -82,15 +84,18 @@ extension SessionCtl {
var indexDeducted = 0
// 便 IMEState
func handleIMKCandidatesSelected(_ candidates: [(String, String)], prefix: String = "") {
func handleIMKCandidatesSelected(_ candidates: [([String], String)], prefix: String = "") {
guard let separator = inputHandler?.keySeparator else { return }
for (i, neta) in candidates.enumerated() {
let theConverted = ChineseConverter.kanjiConversionIfRequired(neta.1)
let netaShown = (neta.1 == theConverted) ? neta.1 : "\(theConverted)\u{1A}(\(neta.1))"
let reading: String =
PrefMgr.shared.cassetteEnabled
? neta.0
? neta.0.joined(separator: separator)
: (PrefMgr.shared.showHanyuPinyinInCompositionBuffer
? Tekkon.cnvPhonaToHanyuPinyin(target: Tekkon.restoreToneOneInZhuyinKey(target: neta.0)) : neta.0)
? Tekkon.cnvPhonaToHanyuPinyin(
target: Tekkon.restoreToneOneInZhuyinKey(target: neta.0.joined(separator: separator)))
: neta.0.joined(separator: separator))
let netaShownWithPronunciation = "\(netaShown)\u{17}(\(reading))"
if candidateString == prefix + netaShownWithPronunciation {
indexDeducted = i
@ -104,7 +109,7 @@ extension SessionCtl {
}
// / JIS 使
func handleSymbolCandidatesSelected(_ candidates: [(String, String)]) {
func handleSymbolCandidatesSelected(_ candidates: [([String], String)]) {
for (i, neta) in candidates.enumerated() {
if candidateString == neta.1 {
indexDeducted = i