Hiraku: Simplifying CHS Implementation.

This commit is contained in:
Hiraku 2022-01-24 11:19:46 +08:00 committed by ShikiSuen
parent 09e3f19b81
commit edbd5357a5
3 changed files with 33 additions and 108 deletions

View File

@ -1423,11 +1423,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; }
return NO; return NO;
} }
if (_inputMode == kBopomofoModeIdentifierCHT) { return [LanguageModelManager writeUserPhrase:currentMarkedPhrase inputMode:_inputMode];
return [LanguageModelManager writeUserPhraseCHT:currentMarkedPhrase];
} else {
return [LanguageModelManager writeUserPhraseCHS:currentMarkedPhrase];
}
} }
- (void)_showCurrentMarkedTextTooltipWithClient:(id)client - (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 - (void)openUserPhrases:(id)sender
{ {
if (_inputMode == kBopomofoModeIdentifierCHT) { [self _openUserFile:[LanguageModelManager userPhrasesDataPath:_inputMode]];
[self _openUserFile:[LanguageModelManager userPhrasesDataPathCHT]];
} else {
[self _openUserFile:[LanguageModelManager userPhrasesDataPathCHS]];
}
} }
- (void)openExcludedPhrases:(id)sender - (void)openExcludedPhrases:(id)sender
{ {
if (_inputMode == kBopomofoModeIdentifierCHT) { [self _openUserFile:[LanguageModelManager excludedPhrasesDataPath:_inputMode]];
[self _openUserFile:[LanguageModelManager excludedPhrasesDataPathCHT]];
} else {
[self _openUserFile:[LanguageModelManager excludedPhrasesDataPathCHS]];
}
} }
- (void)openPhraseReplacement:(id)sender - (void)openPhraseReplacement:(id)sender
{ {
if (_inputMode == kBopomofoModeIdentifierCHT) { [self _openUserFile:[LanguageModelManager phraseReplacementDataPath:_inputMode]];
[self _openUserFile:[LanguageModelManager phraseReplacementDataPathCHT]];
} else {
[self _openUserFile:[LanguageModelManager phraseReplacementDataPathCHS]];
}
} }
- (void)reloadUserPhrases:(id)sender - (void)reloadUserPhrases:(id)sender

View File

@ -19,16 +19,12 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)loadUserPhrases; + (void)loadUserPhrases;
+ (void)loadUserPhraseReplacement; + (void)loadUserPhraseReplacement;
+ (BOOL)checkIfUserLanguageModelFilesExist; + (BOOL)checkIfUserLanguageModelFilesExist;
+ (BOOL)writeUserPhraseCHT:(NSString *)userPhraseCHT; + (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(NSString *)inputMode;
+ (BOOL)writeUserPhraseCHS:(NSString *)userPhraseCHS; + (NSString *)userPhrasesDataPath:(NSString *)inputMode;
+ (NSString *)excludedPhrasesDataPath:(NSString *)inputMode;
+ (NSString *)phraseReplacementDataPath:(NSString *)inputMode;
@property (class, readonly, nonatomic) NSString *dataFolderPath; @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 *languageModelCoreCHT;
@property (class, readonly, nonatomic) vChewing::vChewingLM *languageModelCoreCHS; @property (class, readonly, nonatomic) vChewing::vChewingLM *languageModelCoreCHS;
@property (class, readonly, nonatomic) vChewing::UserOverrideModel *userOverrideModelCHT; @property (class, readonly, nonatomic) vChewing::UserOverrideModel *userOverrideModelCHT;

View File

@ -26,6 +26,10 @@ vChewingLM glanguageModelCoreCHS;
UserOverrideModel gUserOverrideModelCHS(kUserOverrideModelCapacity, kObservedOverrideHalflife); UserOverrideModel gUserOverrideModelCHS(kUserOverrideModelCapacity, kObservedOverrideHalflife);
UserOverrideModel gUserOverrideModelCHT(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 @implementation LanguageModelManager
static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewingLM &lm) static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewingLM &lm)
@ -43,14 +47,14 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing
+ (void)loadUserPhrases + (void)loadUserPhrases
{ {
glanguageModelCoreCHT.loadUserPhrases([[self userPhrasesDataPathCHT] UTF8String], [[self excludedPhrasesDataPathCHT] UTF8String]); glanguageModelCoreCHT.loadUserPhrases([[self userPhrasesDataPath:kBopomofoModeIdentifierCHT] UTF8String], [[self excludedPhrasesDataPath:kBopomofoModeIdentifierCHT] UTF8String]);
glanguageModelCoreCHS.loadUserPhrases([[self userPhrasesDataPathCHS] UTF8String], [[self excludedPhrasesDataPathCHS] UTF8String]); glanguageModelCoreCHS.loadUserPhrases([[self userPhrasesDataPath:kBopomofoModeIdentifierCHS] UTF8String], [[self excludedPhrasesDataPath:kBopomofoModeIdentifierCHS] UTF8String]);
} }
+ (void)loadUserPhraseReplacement + (void)loadUserPhraseReplacement
{ {
glanguageModelCoreCHT.loadPhraseReplacementMap([[self phraseReplacementDataPathCHT] UTF8String]); glanguageModelCoreCHT.loadPhraseReplacementMap([[self phraseReplacementDataPath:kBopomofoModeIdentifierCHT] UTF8String]);
glanguageModelCoreCHS.loadPhraseReplacementMap([[self phraseReplacementDataPathCHS] UTF8String]); glanguageModelCoreCHS.loadPhraseReplacementMap([[self phraseReplacementDataPath:kBopomofoModeIdentifierCHS] UTF8String]);
} }
+ (BOOL)checkIfUserDataFolderExists + (BOOL)checkIfUserDataFolderExists
@ -95,35 +99,35 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing
if (![self checkIfUserDataFolderExists]) { if (![self checkIfUserDataFolderExists]) {
return NO; return NO;
} }
if (![self checkIfFileExist:[self userPhrasesDataPathCHT]]) { if (![self checkIfFileExist:[self userPhrasesDataPath:kBopomofoModeIdentifierCHT]]) {
return NO; return NO;
} }
if (![self checkIfFileExist:[self excludedPhrasesDataPathCHT]]) { if (![self checkIfFileExist:[self excludedPhrasesDataPath:kBopomofoModeIdentifierCHT]]) {
return NO; return NO;
} }
if (![self checkIfFileExist:[self phraseReplacementDataPathCHT]]) { if (![self checkIfFileExist:[self phraseReplacementDataPath:kBopomofoModeIdentifierCHT]]) {
return NO; return NO;
} }
if (![self checkIfFileExist:[self userPhrasesDataPathCHS]]) { if (![self checkIfFileExist:[self userPhrasesDataPath:kBopomofoModeIdentifierCHS]]) {
return NO; return NO;
} }
if (![self checkIfFileExist:[self excludedPhrasesDataPathCHS]]) { if (![self checkIfFileExist:[self excludedPhrasesDataPath:kBopomofoModeIdentifierCHS]]) {
return NO; return NO;
} }
if (![self checkIfFileExist:[self phraseReplacementDataPathCHS]]) { if (![self checkIfFileExist:[self phraseReplacementDataPath:kBopomofoModeIdentifierCHS]]) {
return NO; return NO;
} }
return YES; return YES;
} }
+ (BOOL)writeUserPhraseCHT:(NSString *)userPhrase + (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(NSString *)inputMode
{ {
if (![self checkIfUserLanguageModelFilesExist]) { if (![self checkIfUserLanguageModelFilesExist]) {
return NO; return NO;
} }
BOOL shuoldAddLineBreakAtFront = NO; BOOL shuoldAddLineBreakAtFront = NO;
NSString *path = [self userPhrasesDataPathCHT]; NSString *path = [self userPhrasesDataPath:inputMode];
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
NSError *error = nil; NSError *error = nil;
@ -163,53 +167,6 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing
return YES; 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 + (NSString *)dataFolderPath
{ {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDirectory, YES); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDirectory, YES);
@ -218,34 +175,22 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing
return userDictPath; 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 *fileName = [inputMode isEqualToString:kBopomofoModeIdentifierCHT] ? @"phrases-replacement-cht.txt" : @"phrases-replacement-chs.txt";
} return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
+ (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"];
} }
+ (vChewingLM *)languageModelCoreCHT + (vChewingLM *)languageModelCoreCHT