Hiraku: Simplifying CHS Implementation.
This commit is contained in:
parent
09e3f19b81
commit
edbd5357a5
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue