From 9e628b5d8445840ab95c1e67f11ff6dc02b107d6 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 2 Oct 2022 13:36:13 +0800 Subject: [PATCH 1/6] Megrez // Fix Unigram.consolidate(), letting it handle nerfed scores. --- Packages/vChewing_Megrez/Sources/Megrez/8_Unigram.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Packages/vChewing_Megrez/Sources/Megrez/8_Unigram.swift b/Packages/vChewing_Megrez/Sources/Megrez/8_Unigram.swift index c880abfd..32bf4325 100644 --- a/Packages/vChewing_Megrez/Sources/Megrez/8_Unigram.swift +++ b/Packages/vChewing_Megrez/Sources/Megrez/8_Unigram.swift @@ -43,12 +43,11 @@ extension Megrez { extension Array where Element == Megrez.Unigram { /// 給定過濾清單,讓單元圖陣列自我過濾。 - /// 在此基礎之上,對於相同詞值的多個單元圖,僅保留權重最大者。 public mutating func consolidate(filter theFilter: Set = .init()) { var inserted: [String: Double] = [:] var insertedArray: [Megrez.Unigram] = [] for neta in filter({ !theFilter.contains($0.value) }) { - if let existed = inserted[neta.value], existed >= neta.score { continue } + if inserted.keys.contains(neta.value) { continue } inserted[neta.value] = neta.score insertedArray.append(neta) } From e2f42c1ab831f75d4afcdc255803bbc3d027f220 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 2 Oct 2022 15:18:31 +0800 Subject: [PATCH 2/6] KeyHandler // Update certain comments. --- Source/Modules/KeyHandler_HandleComposition.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Modules/KeyHandler_HandleComposition.swift b/Source/Modules/KeyHandler_HandleComposition.swift index ff54915f..03e0f2e5 100644 --- a/Source/Modules/KeyHandler_HandleComposition.swift +++ b/Source/Modules/KeyHandler_HandleComposition.swift @@ -62,7 +62,7 @@ extension KeyHandler { composer.receiveKey(fromString: input.text) keyConsumedByReading = true - // 沒有調號的話,只需要 updateClientdisplayedText() 且終止處理(return true)即可。 + // 沒有調號的話,只需要 setInlineDisplayWithCursor() 且終止處理(return true)即可。 // 有調號的話,則不需要這樣,而是轉而繼續在此之後的處理。 if !composer.hasToneMarker() { stateCallback(buildInputtingState) @@ -119,7 +119,7 @@ extension KeyHandler { // 之後就是更新組字區了。先清空注拼槽的內容。 composer.clear() - // 再以回呼組字狀態的方式來執行 updateClientdisplayedText()。 + // 再以回呼組字狀態的方式來執行 setInlineDisplayWithCursor()。 var inputting = buildInputtingState inputting.textToCommit = textToCommit stateCallback(inputting) @@ -151,7 +151,7 @@ extension KeyHandler { /// 是說此時注拼槽並非為空、卻還沒組音。這種情況下只可能是「注拼槽內只有聲調」。 if keyConsumedByReading { - // 以回呼組字狀態的方式來執行 updateClientdisplayedText()。 + // 以回呼組字狀態的方式來執行 setInlineDisplayWithCursor()。 stateCallback(buildInputtingState) return true } From 6b97b1eec1ca79a01098c07980aa040a59bb36b8 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 2 Oct 2022 15:20:28 +0800 Subject: [PATCH 3/6] IMEStateData // Protocolize "userPhraseKVPair". --- .../Sources/Shared/Protocols/IMEStateProtocol.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/vChewing_Shared/Sources/Shared/Protocols/IMEStateProtocol.swift b/Packages/vChewing_Shared/Sources/Shared/Protocols/IMEStateProtocol.swift index 173b86eb..0a775f88 100644 --- a/Packages/vChewing_Shared/Sources/Shared/Protocols/IMEStateProtocol.swift +++ b/Packages/vChewing_Shared/Sources/Shared/Protocols/IMEStateProtocol.swift @@ -56,6 +56,7 @@ public protocol StateDataProtocol { var attributedStringNormal: NSAttributedString { get } var attributedStringMarking: NSAttributedString { get } var attributedStringPlaceholder: NSAttributedString { get } + var userPhraseKVPair: (String, String) { get } var userPhraseDumped: String { get } var userPhraseDumpedConverted: String { get } var doesUserPhraseExist: Bool { get } From 38e854f45a2a77ae369790c102f54abf3de8bd35 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 2 Oct 2022 15:45:05 +0800 Subject: [PATCH 4/6] Repo // Remove nerfed phrases from UOM database. --- .../LangModelAssembly/SubLMs/lmUserOverride.swift | 12 +++++++++++- Source/Modules/LMMgr.swift | 11 +++++++++++ Source/Modules/SessionCtl_Delegates.swift | 7 +++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmUserOverride.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmUserOverride.swift index 33afe642..28fefc51 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmUserOverride.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmUserOverride.swift @@ -151,9 +151,19 @@ extension vChewingLM.LMUserOverride { } } -// MARK: - Hash and Dehash the entire UOM data +// MARK: - Hash and Dehash the entire UOM data, etc. extension vChewingLM.LMUserOverride { + public func bleachSpecifiedSuggestions(target: String, saveCallback: @escaping () -> Void) { + for neta in mutLRUMap { + if neta.value.observation.overrides.keys.contains(target) { + mutLRUMap.removeValue(forKey: neta.key) + } + } + resetMRUList() + saveCallback() + } + /// 自 LRU 辭典內移除所有的單元圖。 public func bleachUnigrams(saveCallback: @escaping () -> Void) { for key in mutLRUMap.keys { diff --git a/Source/Modules/LMMgr.swift b/Source/Modules/LMMgr.swift index 426818c2..fb244910 100644 --- a/Source/Modules/LMMgr.swift +++ b/Source/Modules/LMMgr.swift @@ -610,6 +610,17 @@ public enum LMMgr { group.notify(queue: DispatchQueue.main) {} } + public static func bleachSpecifiedSuggestions(target: String, mode: Shared.InputMode) { + switch mode { + case .imeModeCHS: + Self.uomCHT.bleachSpecifiedSuggestions(target: target, saveCallback: { Self.uomCHT.saveData() }) + case .imeModeCHT: + Self.uomCHS.bleachSpecifiedSuggestions(target: target, saveCallback: { Self.uomCHS.saveData() }) + case .imeModeNULL: + break + } + } + public static func removeUnigramsFromUserOverrideModel(_ mode: Shared.InputMode) { switch mode { case .imeModeCHS: diff --git a/Source/Modules/SessionCtl_Delegates.swift b/Source/Modules/SessionCtl_Delegates.swift index 05df8620..722994f3 100644 --- a/Source/Modules/SessionCtl_Delegates.swift +++ b/Source/Modules/SessionCtl_Delegates.swift @@ -39,6 +39,13 @@ extension SessionCtl: KeyHandlerDelegate { { return false } + // 開始針對使用者半衰模組的清詞處理 + let rawPair = state.data.userPhraseKVPair + let valueCurrent = rawPair.1 + let valueReversed = ChineseConverter.crossConvert(rawPair.1) + LMMgr.bleachSpecifiedSuggestions(target: valueCurrent, mode: IMEApp.currentInputMode) + LMMgr.bleachSpecifiedSuggestions(target: valueReversed, mode: IMEApp.currentInputMode.reversed) + // 清詞完畢 return true } } From 25432ceec19b7888b889c46edcf2fc98aa6bcf82 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 2 Oct 2022 17:24:44 +0800 Subject: [PATCH 5/6] Repo // Let L-Shift toggle become effective immediately. --- Source/Modules/PrefMgr_Core.swift | 6 +++++- Source/Modules/SessionCtl_Core.swift | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Source/Modules/PrefMgr_Core.swift b/Source/Modules/PrefMgr_Core.swift index 00fd83a9..5f258811 100644 --- a/Source/Modules/PrefMgr_Core.swift +++ b/Source/Modules/PrefMgr_Core.swift @@ -103,7 +103,11 @@ public class PrefMgr: PrefMgrProtocol { public var upperCaseLetterKeyBehavior: Int @AppProperty(key: UserDef.kTogglingAlphanumericalModeWithLShift.rawValue, defaultValue: true) - public var togglingAlphanumericalModeWithLShift: Bool + public var togglingAlphanumericalModeWithLShift: Bool { + didSet { + SessionCtl.theShiftKeyDetector.alsoToggleWithLShift = togglingAlphanumericalModeWithLShift + } + } @AppProperty(key: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue, defaultValue: false) public var disableShiftTogglingAlphanumericalMode: Bool diff --git a/Source/Modules/SessionCtl_Core.swift b/Source/Modules/SessionCtl_Core.swift index 82c56c17..48af84e2 100644 --- a/Source/Modules/SessionCtl_Core.swift +++ b/Source/Modules/SessionCtl_Core.swift @@ -173,6 +173,7 @@ extension SessionCtl { keyHandler.clear() // 這句不要砍,因為後面 handle State.Empty() 不一定執行。 keyHandler.ensureKeyboardParser() + Self.theShiftKeyDetector.alsoToggleWithLShift = PrefMgr.shared.togglingAlphanumericalModeWithLShift if isASCIIMode, !isCapsLocked, PrefMgr.shared.disableShiftTogglingAlphanumericalMode { isASCIIMode = false } if isCapsLocked { isASCIIMode = isCapsLocked } // 同步 Caps Lock 狀態。 From c7d009006ebaf741183f0c1063bcfc454eeb4ba5 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 2 Oct 2022 16:39:31 +0800 Subject: [PATCH 6/6] Bump version to 2.8.5 SP1 Build 2851. --- Update-Info.plist | 2 +- vChewing.xcodeproj/project.pbxproj | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Update-Info.plist b/Update-Info.plist index fd5f8bd9..67a84027 100644 --- a/Update-Info.plist +++ b/Update-Info.plist @@ -5,7 +5,7 @@ CFBundleShortVersionString 2.8.5 CFBundleVersion - 2850 + 2851 UpdateInfoEndpoint https://gitee.com/vchewing/vChewing-macOS/raw/main/Update-Info.plist UpdateInfoSite diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index db371ed1..48af4742 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -1272,7 +1272,7 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2850; + CURRENT_PROJECT_VERSION = 2851; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1312,7 +1312,7 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2850; + CURRENT_PROJECT_VERSION = 2851; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -1351,7 +1351,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 2850; + CURRENT_PROJECT_VERSION = 2851; DEAD_CODE_STRIPPING = YES; ENABLE_HARDENED_RUNTIME = YES; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1404,7 +1404,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 2850; + CURRENT_PROJECT_VERSION = 2851; DEAD_CODE_STRIPPING = YES; ENABLE_HARDENED_RUNTIME = YES; ENABLE_NS_ASSERTIONS = NO; @@ -1539,7 +1539,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 2850; + CURRENT_PROJECT_VERSION = 2851; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1600,7 +1600,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 2850; + CURRENT_PROJECT_VERSION = 2851; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1648,7 +1648,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 2850; + CURRENT_PROJECT_VERSION = 2851; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -1694,7 +1694,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 2850; + CURRENT_PROJECT_VERSION = 2851; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES;