From 02003c07f450bc3b6f55cc51dfff79b3cb77b40f Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Mon, 24 Jan 2022 13:56:45 +0800 Subject: [PATCH] CNS // Phase 8: Bind functions to conditions. --- Source/AppDelegate.swift | 1 + Source/Engine/LanguageModel/vChewingLM.cpp | 2 +- Source/InputMethodController.mm | 43 ++++++++-------------- Source/LanguageModelManager.mm | 4 ++ Source/vChewing-Bridging-Header.h | 1 + 5 files changed, 23 insertions(+), 28 deletions(-) diff --git a/Source/AppDelegate.swift b/Source/AppDelegate.swift index d334a23b..c84206f8 100644 --- a/Source/AppDelegate.swift +++ b/Source/AppDelegate.swift @@ -146,6 +146,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NonModalAlertWindowControlle func applicationDidFinishLaunching(_ notification: Notification) { LanguageModelManager.loadDataModels() + LanguageModelManager.loadCNSData() LanguageModelManager.loadUserPhrases() LanguageModelManager.loadUserPhraseReplacement() diff --git a/Source/Engine/LanguageModel/vChewingLM.cpp b/Source/Engine/LanguageModel/vChewingLM.cpp index 31e32617..6eae0f47 100644 --- a/Source/Engine/LanguageModel/vChewingLM.cpp +++ b/Source/Engine/LanguageModel/vChewingLM.cpp @@ -93,7 +93,7 @@ const vector vChewingLM::unigramsForKey(const string& key) allUnigrams = filterAndTransformUnigrams(rawGlobalUnigrams, excludedValues, insertedValues); } - if (m_cnsModel.hasUnigramsForKey(key)) { + if (m_cnsModel.hasUnigramsForKey(key) && m_CNSEnabled) { vector rawCNSUnigrams = m_cnsModel.unigramsForKey(key); cnsUnigrams = filterAndTransformUnigrams(rawCNSUnigrams, excludedValues, insertedValues); } diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index c82bf019..6095d939 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -112,6 +112,7 @@ static double FindHighestScore(const vector& nodes, double epsilon) // create the lattice builder _languageModel = [LanguageModelManager languageModelCoreCHT]; _languageModel->setPhraseReplacementEnabled(Preferences.phraseReplacementEnabled); + _languageModel->setCNSEnabled(Preferences.cns11643Enabled); _userOverrideModel = [LanguageModelManager userOverrideModelCHT]; _builder = new BlockReadingBuilder(_languageModel); @@ -139,7 +140,11 @@ static double FindHighestScore(const vector& nodes, double epsilon) NSMenuItem *useWinNT351BPMFMenuItem = [menu addItemWithTitle:NSLocalizedString(@"NT351 BPMF EMU", @"") action:@selector(toggleWinNT351BPMFMode:) keyEquivalent:@"P"]; useWinNT351BPMFMenuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand | NSEventModifierFlagControl; useWinNT351BPMFMenuItem.state = Preferences.useWinNT351BPMF ? NSControlStateValueOn : NSControlStateValueOff; - + + NSMenuItem *useCNS11643SupportMenuItem = [menu addItemWithTitle:NSLocalizedString(@"CNS11643 Mode", @"") action:@selector(toggleCNS11643Enabled:) keyEquivalent:@"L"]; + useCNS11643SupportMenuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand | NSEventModifierFlagControl; + useCNS11643SupportMenuItem.state = Preferences.cns11643Enabled ? NSControlStateValueOn : NSControlStateValueOff; + NSMenuItem *chineseConversionMenuItem = [menu addItemWithTitle:NSLocalizedString(@"Force KangXi Writing", @"") action:@selector(toggleChineseConverter:) keyEquivalent:@"K"]; chineseConversionMenuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand | NSEventModifierFlagControl; chineseConversionMenuItem.state = Preferences.chineseConversionEnabled ? NSControlStateValueOn : NSControlStateValueOff; @@ -169,8 +174,6 @@ static double FindHighestScore(const vector& nodes, double epsilon) [menu addItemWithTitle:NSLocalizedString(@"About vChewing…", @"") action:@selector(showAbout:) keyEquivalent:@""]; if (optionKeyPressed) { [menu addItemWithTitle:NSLocalizedString(@"Reboot vChewing…", @"") action:@selector(selfTerminate:) keyEquivalent:@""]; - [menu addItemWithTitle:NSLocalizedString(@"Deploy CNS Data…", @"") action:@selector(cnsDeploy:) keyEquivalent:@""]; - [menu addItemWithTitle:NSLocalizedString(@"Load CNS Data…", @"") action:@selector(loadCNSData:) keyEquivalent:@""]; } return menu; } @@ -264,6 +267,9 @@ static double FindHighestScore(const vector& nodes, double epsilon) // 自 Preferences 模組讀入自訂語彙置換功能開關狀態。 newLanguageModel->setPhraseReplacementEnabled(Preferences.phraseReplacementEnabled); + // 自 Preferences 模組讀取全字庫模式開關狀態。 + newLanguageModel->setCNSEnabled(Preferences.cns11643Enabled); + // Only apply the changes if the value is changed if (![_inputMode isEqualToString:newInputMode]) { [[NSUserDefaults standardUserDefaults] synchronize]; @@ -1530,6 +1536,13 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } } } +- (void)toggleCNS11643Enabled:(id)sender +{ + _languageModel->setCNSEnabled([Preferences toggleCNS11643Enabled]); + // 注意上面這一行已經動過開關了,所以接下來就不要 toggle。 + [NotifierController notifyWithMessage:[NSString stringWithFormat:@"%@%@%@", NSLocalizedString(@"CNS11643 Mode", @""), @"\n", [Preferences cns11643Enabled] ? NSLocalizedString(@"NotificationSwitchON", @"") : NSLocalizedString(@"NotificationSwitchOFF", @"")] stay:NO]; +} + - (void)selfTerminate:(id)sender { NSLog(@"vChewing App self-terminated on request."); @@ -1552,21 +1565,6 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } return YES; } -- (BOOL)_checkCNSFile -{ - if (![LanguageModelManager checkIfCNSDataExistAndHashMatched]) { - [self beep]; - NSLog(@"_checkCNSFile failed in the InputMethodController."); - return NO; - } - return YES; -} - -- (void)cnsDeploy:(id)sender -{ - [LanguageModelManager deployZipDataFile:@"UNICHARS"]; -} - - (void)_openUserFile:(NSString *)path { if (![self _checkUserFiles]) { @@ -1597,15 +1595,6 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } [LanguageModelManager loadUserPhraseReplacement]; } -- (void)loadCNSData:(id)sender -{ - if (!self._checkCNSFile) { - [self beep]; - } else { - [LanguageModelManager loadCNSData]; - } -} - - (void)showAbout:(id)sender { // show the About window, and also make the IME app itself the focus diff --git a/Source/LanguageModelManager.mm b/Source/LanguageModelManager.mm index f4177cf3..8c4aadd5 100644 --- a/Source/LanguageModelManager.mm +++ b/Source/LanguageModelManager.mm @@ -59,6 +59,10 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing + (void)loadCNSData { + if (!self.checkIfCNSDataExistAndHashMatched) { + [self deployZipDataFile:@"UNICHARS"]; + } + glanguageModelCoreCHT.loadCNSData([[self cnsDataPath] UTF8String]); glanguageModelCoreCHS.loadCNSData([[self cnsDataPath] UTF8String]); } diff --git a/Source/vChewing-Bridging-Header.h b/Source/vChewing-Bridging-Header.h index e92bf457..2d5893b2 100644 --- a/Source/vChewing-Bridging-Header.h +++ b/Source/vChewing-Bridging-Header.h @@ -14,6 +14,7 @@ #import "SSZipArchive.h" // Zip Archive Support; @interface LanguageModelManager : NSObject + (void)loadDataModels; ++ (void)loadCNSData; + (void)loadUserPhrases; + (void)loadUserPhraseReplacement; @end