From edbd5357a55c0a626b3e64d7ded339d1f62dee52 Mon Sep 17 00:00:00 2001 From: Hiraku Date: Mon, 24 Jan 2022 11:19:46 +0800 Subject: [PATCH] Hiraku: Simplifying CHS Implementation. --- Source/InputMethodController.mm | 24 ++------ Source/LanguageModelManager.h | 12 ++-- Source/LanguageModelManager.mm | 105 ++++++++------------------------ 3 files changed, 33 insertions(+), 108 deletions(-) diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index 545f5ede..ca17a4dc 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -1423,11 +1423,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } return NO; } - if (_inputMode == kBopomofoModeIdentifierCHT) { - return [LanguageModelManager writeUserPhraseCHT:currentMarkedPhrase]; - } else { - return [LanguageModelManager writeUserPhraseCHS:currentMarkedPhrase]; - } + return [LanguageModelManager writeUserPhrase:currentMarkedPhrase inputMode:_inputMode]; } - (void)_showCurrentMarkedTextTooltipWithClient:(id)client @@ -1556,29 +1552,17 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } - (void)openUserPhrases:(id)sender { - if (_inputMode == kBopomofoModeIdentifierCHT) { - [self _openUserFile:[LanguageModelManager userPhrasesDataPathCHT]]; - } else { - [self _openUserFile:[LanguageModelManager userPhrasesDataPathCHS]]; - } + [self _openUserFile:[LanguageModelManager userPhrasesDataPath:_inputMode]]; } - (void)openExcludedPhrases:(id)sender { - if (_inputMode == kBopomofoModeIdentifierCHT) { - [self _openUserFile:[LanguageModelManager excludedPhrasesDataPathCHT]]; - } else { - [self _openUserFile:[LanguageModelManager excludedPhrasesDataPathCHS]]; - } + [self _openUserFile:[LanguageModelManager excludedPhrasesDataPath:_inputMode]]; } - (void)openPhraseReplacement:(id)sender { - if (_inputMode == kBopomofoModeIdentifierCHT) { - [self _openUserFile:[LanguageModelManager phraseReplacementDataPathCHT]]; - } else { - [self _openUserFile:[LanguageModelManager phraseReplacementDataPathCHS]]; - } + [self _openUserFile:[LanguageModelManager phraseReplacementDataPath:_inputMode]]; } - (void)reloadUserPhrases:(id)sender diff --git a/Source/LanguageModelManager.h b/Source/LanguageModelManager.h index d68b605c..58b39fd8 100644 --- a/Source/LanguageModelManager.h +++ b/Source/LanguageModelManager.h @@ -19,16 +19,12 @@ NS_ASSUME_NONNULL_BEGIN + (void)loadUserPhrases; + (void)loadUserPhraseReplacement; + (BOOL)checkIfUserLanguageModelFilesExist; -+ (BOOL)writeUserPhraseCHT:(NSString *)userPhraseCHT; -+ (BOOL)writeUserPhraseCHS:(NSString *)userPhraseCHS; ++ (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(NSString *)inputMode; ++ (NSString *)userPhrasesDataPath:(NSString *)inputMode; ++ (NSString *)excludedPhrasesDataPath:(NSString *)inputMode; ++ (NSString *)phraseReplacementDataPath:(NSString *)inputMode; @property (class, readonly, nonatomic) NSString *dataFolderPath; -@property (class, readonly, nonatomic) NSString *userPhrasesDataPathCHT; -@property (class, readonly, nonatomic) NSString *userPhrasesDataPathCHS; -@property (class, readonly, nonatomic) NSString *excludedPhrasesDataPathCHT; -@property (class, readonly, nonatomic) NSString *excludedPhrasesDataPathCHS; -@property (class, readonly, nonatomic) NSString *phraseReplacementDataPathCHT; -@property (class, readonly, nonatomic) NSString *phraseReplacementDataPathCHS; @property (class, readonly, nonatomic) vChewing::vChewingLM *languageModelCoreCHT; @property (class, readonly, nonatomic) vChewing::vChewingLM *languageModelCoreCHS; @property (class, readonly, nonatomic) vChewing::UserOverrideModel *userOverrideModelCHT; diff --git a/Source/LanguageModelManager.mm b/Source/LanguageModelManager.mm index b7118dc1..139ded5f 100644 --- a/Source/LanguageModelManager.mm +++ b/Source/LanguageModelManager.mm @@ -26,6 +26,10 @@ vChewingLM glanguageModelCoreCHS; UserOverrideModel gUserOverrideModelCHS(kUserOverrideModelCapacity, kObservedOverrideHalflife); UserOverrideModel gUserOverrideModelCHT(kUserOverrideModelCapacity, kObservedOverrideHalflife); +// input modes +static NSString *const kBopomofoModeIdentifierCHT = @"org.atelierInmu.inputmethod.vChewing.TradBopomofo"; +static NSString *const kBopomofoModeIdentifierCHS = @"org.atelierInmu.inputmethod.vChewing.SimpBopomofo"; + @implementation LanguageModelManager static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewingLM &lm) @@ -43,14 +47,14 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing + (void)loadUserPhrases { - glanguageModelCoreCHT.loadUserPhrases([[self userPhrasesDataPathCHT] UTF8String], [[self excludedPhrasesDataPathCHT] UTF8String]); - glanguageModelCoreCHS.loadUserPhrases([[self userPhrasesDataPathCHS] UTF8String], [[self excludedPhrasesDataPathCHS] UTF8String]); + glanguageModelCoreCHT.loadUserPhrases([[self userPhrasesDataPath:kBopomofoModeIdentifierCHT] UTF8String], [[self excludedPhrasesDataPath:kBopomofoModeIdentifierCHT] UTF8String]); + glanguageModelCoreCHS.loadUserPhrases([[self userPhrasesDataPath:kBopomofoModeIdentifierCHS] UTF8String], [[self excludedPhrasesDataPath:kBopomofoModeIdentifierCHS] UTF8String]); } + (void)loadUserPhraseReplacement { - glanguageModelCoreCHT.loadPhraseReplacementMap([[self phraseReplacementDataPathCHT] UTF8String]); - glanguageModelCoreCHS.loadPhraseReplacementMap([[self phraseReplacementDataPathCHS] UTF8String]); + glanguageModelCoreCHT.loadPhraseReplacementMap([[self phraseReplacementDataPath:kBopomofoModeIdentifierCHT] UTF8String]); + glanguageModelCoreCHS.loadPhraseReplacementMap([[self phraseReplacementDataPath:kBopomofoModeIdentifierCHS] UTF8String]); } + (BOOL)checkIfUserDataFolderExists @@ -95,35 +99,35 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing if (![self checkIfUserDataFolderExists]) { return NO; } - if (![self checkIfFileExist:[self userPhrasesDataPathCHT]]) { + if (![self checkIfFileExist:[self userPhrasesDataPath:kBopomofoModeIdentifierCHT]]) { return NO; } - if (![self checkIfFileExist:[self excludedPhrasesDataPathCHT]]) { + if (![self checkIfFileExist:[self excludedPhrasesDataPath:kBopomofoModeIdentifierCHT]]) { return NO; } - if (![self checkIfFileExist:[self phraseReplacementDataPathCHT]]) { + if (![self checkIfFileExist:[self phraseReplacementDataPath:kBopomofoModeIdentifierCHT]]) { return NO; } - if (![self checkIfFileExist:[self userPhrasesDataPathCHS]]) { + if (![self checkIfFileExist:[self userPhrasesDataPath:kBopomofoModeIdentifierCHS]]) { return NO; } - if (![self checkIfFileExist:[self excludedPhrasesDataPathCHS]]) { + if (![self checkIfFileExist:[self excludedPhrasesDataPath:kBopomofoModeIdentifierCHS]]) { return NO; } - if (![self checkIfFileExist:[self phraseReplacementDataPathCHS]]) { + if (![self checkIfFileExist:[self phraseReplacementDataPath:kBopomofoModeIdentifierCHS]]) { return NO; } return YES; } -+ (BOOL)writeUserPhraseCHT:(NSString *)userPhrase ++ (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(NSString *)inputMode { if (![self checkIfUserLanguageModelFilesExist]) { return NO; } BOOL shuoldAddLineBreakAtFront = NO; - NSString *path = [self userPhrasesDataPathCHT]; + NSString *path = [self userPhrasesDataPath:inputMode]; if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { NSError *error = nil; @@ -163,53 +167,6 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing return YES; } -+ (BOOL)writeUserPhraseCHS:(NSString *)userPhrase -{ - if (![self checkIfUserLanguageModelFilesExist]) { - return NO; - } - - BOOL shuoldAddLineBreakAtFront = NO; - NSString *path = [self userPhrasesDataPathCHS]; - - if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { - NSError *error = nil; - NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error]; - unsigned long long fileSize = [attr fileSize]; - if (!error && fileSize) { - NSFileHandle *readFile = [NSFileHandle fileHandleForReadingAtPath:path]; - if (readFile) { - [readFile seekToFileOffset:fileSize - 1]; - NSData *data = [readFile readDataToEndOfFile]; - const void *bytes = [data bytes]; - if (*(char *)bytes != '\n') { - shuoldAddLineBreakAtFront = YES; - } - [readFile closeFile]; - } - } - } - - NSMutableString *currentMarkedPhrase = [NSMutableString string]; - if (shuoldAddLineBreakAtFront) { - [currentMarkedPhrase appendString:@"\n"]; - } - [currentMarkedPhrase appendString:userPhrase]; - [currentMarkedPhrase appendString:@"\n"]; - - NSFileHandle *writeFile = [NSFileHandle fileHandleForUpdatingAtPath:path]; - if (!writeFile) { - return NO; - } - [writeFile seekToEndOfFile]; - NSData *data = [currentMarkedPhrase dataUsingEncoding:NSUTF8StringEncoding]; - [writeFile writeData:data]; - [writeFile closeFile]; - - [self loadUserPhrases]; - return YES; -} - + (NSString *)dataFolderPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDirectory, YES); @@ -218,34 +175,22 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing return userDictPath; } -+ (NSString *)userPhrasesDataPathCHT ++ (NSString *)userPhrasesDataPath:(NSString *)inputMode { - return [[self dataFolderPath] stringByAppendingPathComponent:@"userdata-cht.txt"]; + NSString *fileName = [inputMode isEqualToString:kBopomofoModeIdentifierCHT] ? @"userdata-cht.txt" : @"userdata-chs.txt"; + return [[self dataFolderPath] stringByAppendingPathComponent:fileName]; } -+ (NSString *)userPhrasesDataPathCHS ++ (NSString *)excludedPhrasesDataPath:(NSString *)inputMode { - return [[self dataFolderPath] stringByAppendingPathComponent:@"userdata-chs.txt"]; + NSString *fileName = [inputMode isEqualToString:kBopomofoModeIdentifierCHT] ? @"exclude-phrases-cht.txt" : @"exclude-phrases-chs.txt"; + return [[self dataFolderPath] stringByAppendingPathComponent:fileName]; } -+ (NSString *)excludedPhrasesDataPathCHT ++ (NSString *)phraseReplacementDataPath:(NSString *)inputMode { - return [[self dataFolderPath] stringByAppendingPathComponent:@"exclude-phrases-cht.txt"]; -} - -+ (NSString *)excludedPhrasesDataPathCHS -{ - return [[self dataFolderPath] stringByAppendingPathComponent:@"exclude-phrases-chs.txt"]; -} - -+ (NSString *)phraseReplacementDataPathCHT -{ - return [[self dataFolderPath] stringByAppendingPathComponent:@"phrases-replacement-cht.txt"]; -} - -+ (NSString *)phraseReplacementDataPathCHS -{ - return [[self dataFolderPath] stringByAppendingPathComponent:@"phrases-replacement-chs.txt"]; + NSString *fileName = [inputMode isEqualToString:kBopomofoModeIdentifierCHT] ? @"phrases-replacement-cht.txt" : @"phrases-replacement-chs.txt"; + return [[self dataFolderPath] stringByAppendingPathComponent:fileName]; } + (vChewingLM *)languageModelCoreCHT