Reset // Separating UserPhrases & UoMs for CHS and CHT modes.

- Also deprecating (BOOL)phraseReplacementEnabled from the mgrLM.

Co-Authored-By: Hiraku <hirakujira@users.noreply.github.com>
This commit is contained in:
ShikiSuen 2022-02-07 20:31:13 +08:00
parent cf4e58f28b
commit 03fcf1ffa3
5 changed files with 61 additions and 53 deletions

View File

@ -97,21 +97,26 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
{ {
NSString *newInputMode; NSString *newInputMode;
vChewingLM *newLanguageModel; vChewingLM *newLanguageModel;
UserOverrideModel *newUserOverrideModel;
if ([value isKindOfClass:[NSString class]] && [value isEqual:imeModeCHS]) { if ([value isKindOfClass:[NSString class]] && [value isEqual:imeModeCHS]) {
newInputMode = imeModeCHS; newInputMode = imeModeCHS;
newLanguageModel = [mgrLangModel lmCHS]; newLanguageModel = [mgrLangModel lmCHS];
newLanguageModel->setPhraseReplacementEnabled(false); newUserOverrideModel = [mgrLangModel userOverrideModelCHS];
} else { } else {
newInputMode = imeModeCHT; newInputMode = imeModeCHT;
newLanguageModel = [mgrLangModel lmCHT]; newLanguageModel = [mgrLangModel lmCHT];
newLanguageModel->setPhraseReplacementEnabled(Preferences.phraseReplacementEnabled); newUserOverrideModel = [mgrLangModel userOverrideModelCHT];
} }
// Symchronize the Preference Setting "setPhraseReplacementEnabled" to the new LM.
newLanguageModel->setPhraseReplacementEnabled(Preferences.phraseReplacementEnabled);
// Only apply the changes if the value is changed // Only apply the changes if the value is changed
if (![_inputMode isEqualToString:newInputMode]) { if (![_inputMode isEqualToString:newInputMode]) {
_inputMode = newInputMode; _inputMode = newInputMode;
_languageModel = newLanguageModel; _languageModel = newLanguageModel;
_userOverrideModel = newUserOverrideModel;
if (_builder) { if (_builder) {
delete _builder; delete _builder;
@ -146,7 +151,7 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
// create the lattice builder // create the lattice builder
_languageModel = [mgrLangModel lmCHT]; _languageModel = [mgrLangModel lmCHT];
_languageModel->setPhraseReplacementEnabled(Preferences.phraseReplacementEnabled); _languageModel->setPhraseReplacementEnabled(Preferences.phraseReplacementEnabled);
_userOverrideModel = [mgrLangModel userOverrideModel]; _userOverrideModel = [mgrLangModel userOverrideModelCHT];
_builder = new BlockReadingBuilder(_languageModel); _builder = new BlockReadingBuilder(_languageModel);
@ -190,7 +195,7 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
size_t cursorIndex = [self _actualCandidateCursorIndex]; size_t cursorIndex = [self _actualCandidateCursorIndex];
string stringValue = [value UTF8String]; string stringValue = [value UTF8String];
_builder->grid().fixNodeSelectedCandidate(cursorIndex, stringValue); _builder->grid().fixNodeSelectedCandidate(cursorIndex, stringValue);
if (_inputMode != imeModeCHS) { if (!Preferences.useSCPCTypingMode) { // 不要針對逐字選字模式啟用臨時半衰記憶模型。
_userOverrideModel->observe(_walkedNodes, cursorIndex, stringValue, [[NSDate date] timeIntervalSince1970]); _userOverrideModel->observe(_walkedNodes, cursorIndex, stringValue, [[NSDate date] timeIntervalSince1970]);
} }
[self _walk]; [self _walk];

View File

@ -224,8 +224,7 @@ class ctlInputMethod: IMKInputController {
} }
@objc func togglePhraseReplacement(_ sender: Any?) { @objc func togglePhraseReplacement(_ sender: Any?) {
let enabled = Preferences.togglePhraseReplacementEnabled() mgrLangModel.setPhraseReplacementEnabled(Preferences.togglePhraseReplacementEnabled())
mgrLangModel.phraseReplacementEnabled = enabled
} }
@objc func selfTerminate(_ sender: Any?) { @objc func selfTerminate(_ sender: Any?) {
@ -253,15 +252,15 @@ class ctlInputMethod: IMKInputController {
} }
@objc func openUserPhrases(_ sender: Any?) { @objc func openUserPhrases(_ sender: Any?) {
open(userFileAt: mgrLangModel.userPhrasesDataPathCHT) open(userFileAt: mgrLangModel.userPhrasesDataPath(keyHandler.inputMode))
} }
@objc func openExcludedPhrases(_ sender: Any?) { @objc func openExcludedPhrases(_ sender: Any?) {
open(userFileAt: mgrLangModel.excludedPhrasesDataPathCHT) open(userFileAt: mgrLangModel.excludedPhrasesDataPath(keyHandler.inputMode))
} }
@objc func openPhraseReplacement(_ sender: Any?) { @objc func openPhraseReplacement(_ sender: Any?) {
open(userFileAt: mgrLangModel.phraseReplacementDataPathCHT) open(userFileAt: mgrLangModel.phraseReplacementDataPath(keyHandler.inputMode))
} }
@objc func reloadUserPhrases(_ sender: Any?) { @objc func reloadUserPhrases(_ sender: Any?) {
@ -554,7 +553,7 @@ extension ctlInputMethod: KeyHandlerDelegate {
if !state.validToWrite { if !state.validToWrite {
return false return false
} }
mgrLangModel.writeUserPhrase(state.userPhrase) mgrLangModel.writeUserPhrase(state.userPhrase, inputMode: keyHandler.inputMode)
return true return true
} }
} }

View File

@ -31,16 +31,16 @@ NS_ASSUME_NONNULL_BEGIN
+ (BOOL)checkIfUserLanguageModelFilesExist; + (BOOL)checkIfUserLanguageModelFilesExist;
+ (BOOL)checkIfUserPhraseExist:(NSString *)userPhrase key:(NSString *)key NS_SWIFT_NAME(checkIfExist(userPhrase:key:)); + (BOOL)checkIfUserPhraseExist:(NSString *)userPhrase key:(NSString *)key NS_SWIFT_NAME(checkIfExist(userPhrase:key:));
+ (BOOL)writeUserPhrase:(NSString *)userPhrase; + (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode;
+ (void)setPhraseReplacementEnabled:(BOOL)phraseReplacementEnabled;
+ (BOOL)cnsEnabled:(InputMode)mode;
+ (void)setCNSEnabled:(BOOL)cnsEnabled inputMode:(InputMode)mode;
+ (NSString *)userPhrasesDataPath:(InputMode)mode;
+ (NSString *)excludedPhrasesDataPath:(InputMode)mode;
+ (NSString *)phraseReplacementDataPath:(InputMode)mode;
@property (class, readonly, nonatomic) NSString *dataFolderPath; @property (class, readonly, nonatomic) NSString *dataFolderPath;
@property (class, readonly, nonatomic) NSString *userPhrasesDataPathCHT; @property (class, readonly, nonatomic) NSString *cnsDataPath;
@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, assign, nonatomic) BOOL phraseReplacementEnabled;
@end @end

View File

@ -29,7 +29,8 @@ static const double kObservedOverrideHalflife = 5400.0;
static vChewingLM gLangModelCHT; static vChewingLM gLangModelCHT;
static vChewingLM gLangModelCHS; static vChewingLM gLangModelCHS;
static UserOverrideModel gUserOverrideModel(kUserOverrideModelCapacity, kObservedOverrideHalflife); static UserOverrideModel gUserOverrideModelCHT(kUserOverrideModelCapacity, kObservedOverrideHalflife);
static UserOverrideModel gUserOverrideModelCHS(kUserOverrideModelCapacity, kObservedOverrideHalflife);
static NSString *const kUserDataTemplateName = @"template-data"; static NSString *const kUserDataTemplateName = @"template-data";
static NSString *const kExcludedPhrasesvChewingTemplateName = @"template-exclude-phrases"; static NSString *const kExcludedPhrasesvChewingTemplateName = @"template-exclude-phrases";
@ -71,6 +72,9 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
if (!gLangModelCHT.isDataModelLoaded()) { if (!gLangModelCHT.isDataModelLoaded()) {
LTLoadLanguageModelFile(@"data-cht", gLangModelCHT); LTLoadLanguageModelFile(@"data-cht", gLangModelCHT);
} }
if (!gLangModelCHT.isAssociatedPhrasesLoaded()) {
LTLoadAssociatedPhrases(gLangModelCHT);
}
} }
if ([mode isEqualToString:imeModeCHS]) { if ([mode isEqualToString:imeModeCHS]) {
@ -85,13 +89,14 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
+ (void)loadUserPhrases + (void)loadUserPhrases
{ {
gLangModelCHT.loadUserPhrases([[self userPhrasesDataPathCHT] UTF8String], [[self excludedPhrasesDataPathCHT] UTF8String]); gLangModelCHT.loadUserPhrases([[self userPhrasesDataPath:imeModeCHT] UTF8String], [[self excludedPhrasesDataPath:imeModeCHT] UTF8String]);
gLangModelCHS.loadUserPhrases([[self userPhrasesDataPathCHS] UTF8String], [[self excludedPhrasesDataPathCHS] UTF8String]); gLangModelCHS.loadUserPhrases([[self userPhrasesDataPath:imeModeCHS] UTF8String], [[self excludedPhrasesDataPath:imeModeCHS] UTF8String]);
} }
+ (void)loadUserPhraseReplacement + (void)loadUserPhraseReplacement
{ {
gLangModelCHT.loadPhraseReplacementMap([[self phraseReplacementDataPathCHT] UTF8String]); gLangModelCHT.loadPhraseReplacementMap([[self phraseReplacementDataPath:imeModeCHT] UTF8String]);
gLangModelCHS.loadPhraseReplacementMap([[self phraseReplacementDataPath:imeModeCHS] UTF8String]);
} }
+ (void)setupDataModelValueConverter + (void)setupDataModelValueConverter
@ -171,13 +176,22 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
if (![self checkIfUserDataFolderExists]) { if (![self checkIfUserDataFolderExists]) {
return NO; return NO;
} }
if (![self ensureFileExists:[self userPhrasesDataPathCHT] populateWithTemplate:kUserDataTemplateName extension:kTemplateExtension]) { if (![self ensureFileExists:[self userPhrasesDataPath:imeModeCHS] populateWithTemplate:kUserDataTemplateName extension:kTemplateExtension]) {
return NO; return NO;
} }
if (![self ensureFileExists:[self excludedPhrasesDataPathCHT] populateWithTemplate:kExcludedPhrasesvChewingTemplateName extension:kTemplateExtension]) { if (![self ensureFileExists:[self userPhrasesDataPath:imeModeCHT] populateWithTemplate:kUserDataTemplateName extension:kTemplateExtension]) {
return NO; return NO;
} }
if (![self ensureFileExists:[self phraseReplacementDataPathCHT] populateWithTemplate:kPhraseReplacementTemplateName extension:kTemplateExtension]) { if (![self ensureFileExists:[self excludedPhrasesDataPath:imeModeCHS] populateWithTemplate:kExcludedPhrasesvChewingTemplateName extension:kTemplateExtension]) {
return NO;
}
if (![self ensureFileExists:[self excludedPhrasesDataPath:imeModeCHT] populateWithTemplate:kExcludedPhrasesvChewingTemplateName extension:kTemplateExtension]) {
return NO;
}
if (![self ensureFileExists:[self phraseReplacementDataPath:imeModeCHS] populateWithTemplate:kPhraseReplacementTemplateName extension:kTemplateExtension]) {
return NO;
}
if (![self ensureFileExists:[self phraseReplacementDataPath:imeModeCHT] populateWithTemplate:kPhraseReplacementTemplateName extension:kTemplateExtension]) {
return NO; return NO;
} }
return YES; return YES;
@ -196,14 +210,14 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
return NO; return NO;
} }
+ (BOOL)writeUserPhrase:(NSString *)userPhrase + (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode;
{ {
if (![self checkIfUserLanguageModelFilesExist]) { if (![self checkIfUserLanguageModelFilesExist]) {
return NO; return NO;
} }
BOOL addLineBreakAtFront = NO; BOOL addLineBreakAtFront = NO;
NSString *path = [self userPhrasesDataPathCHT]; NSString *path = [self userPhrasesDataPath:mode];
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
NSError *error = nil; NSError *error = nil;
@ -253,34 +267,22 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
return userDictPath; return userDictPath;
} }
+ (NSString *)userPhrasesDataPathCHT + (NSString *)userPhrasesDataPath:(InputMode)mode;
{ {
return [[self dataFolderPath] stringByAppendingPathComponent:@"userdata-cht.txt"]; NSString *fileName = [mode isEqualToString:imeModeCHT] ? @"userdata-cht.txt" : @"userdata-chs.txt";
return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
} }
+ (NSString *)userPhrasesDataPathCHS + (NSString *)excludedPhrasesDataPath:(InputMode)mode;
{ {
return [[self dataFolderPath] stringByAppendingPathComponent:@"userdata-chs.txt"]; NSString *fileName = [mode isEqualToString:imeModeCHT] ? @"exclude-phrases-cht.txt" : @"exclude-phrases-chs.txt";
return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
} }
+ (NSString *)excludedPhrasesDataPathCHT + (NSString *)phraseReplacementDataPath:(InputMode)mode;
{ {
return [[self dataFolderPath] stringByAppendingPathComponent:@"exclude-phrases-cht.txt"]; NSString *fileName = [mode isEqualToString:imeModeCHT] ? @"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 *)lmCHT + (vChewingLM *)lmCHT
@ -293,19 +295,20 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
return &gLangModelCHS; return &gLangModelCHS;
} }
+ (vChewing::UserOverrideModel *)userOverrideModel + (vChewing::UserOverrideModel *)userOverrideModelCHT
{ {
return &gUserOverrideModel; return &gUserOverrideModelCHT;
} }
+ (BOOL)phraseReplacementEnabled + (vChewing::UserOverrideModel *)userOverrideModelCHS
{ {
return gLangModelCHT.phraseReplacementEnabled(); return &gUserOverrideModelCHS;
} }
+ (void)setPhraseReplacementEnabled:(BOOL)phraseReplacementEnabled + (void)setPhraseReplacementEnabled:(BOOL)phraseReplacementEnabled
{ {
gLangModelCHT.setPhraseReplacementEnabled(phraseReplacementEnabled); gLangModelCHT.setPhraseReplacementEnabled(phraseReplacementEnabled);
gLangModelCHS.setPhraseReplacementEnabled(phraseReplacementEnabled);
} }
@end @end

View File

@ -26,7 +26,8 @@ NS_ASSUME_NONNULL_BEGIN
@interface mgrLangModel () @interface mgrLangModel ()
@property (class, readonly, nonatomic) vChewing::vChewingLM *lmCHT; @property (class, readonly, nonatomic) vChewing::vChewingLM *lmCHT;
@property (class, readonly, nonatomic) vChewing::vChewingLM *lmCHS; @property (class, readonly, nonatomic) vChewing::vChewingLM *lmCHS;
@property (class, readonly, nonatomic) vChewing::UserOverrideModel *userOverrideModel; @property (class, readonly, nonatomic) vChewing::UserOverrideModel *userOverrideModelCHS;
@property (class, readonly, nonatomic) vChewing::UserOverrideModel *userOverrideModelCHT;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END