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:
parent
aa4a4f3cde
commit
b0f47828ec
|
@ -97,21 +97,26 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
|
|||
{
|
||||
NSString *newInputMode;
|
||||
vChewingLM *newLanguageModel;
|
||||
UserOverrideModel *newUserOverrideModel;
|
||||
|
||||
if ([value isKindOfClass:[NSString class]] && [value isEqual:imeModeCHS]) {
|
||||
newInputMode = imeModeCHS;
|
||||
newLanguageModel = [mgrLangModel lmCHS];
|
||||
newLanguageModel->setPhraseReplacementEnabled(false);
|
||||
newUserOverrideModel = [mgrLangModel userOverrideModelCHS];
|
||||
} else {
|
||||
newInputMode = imeModeCHT;
|
||||
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
|
||||
if (![_inputMode isEqualToString:newInputMode]) {
|
||||
_inputMode = newInputMode;
|
||||
_languageModel = newLanguageModel;
|
||||
_userOverrideModel = newUserOverrideModel;
|
||||
|
||||
if (_builder) {
|
||||
delete _builder;
|
||||
|
@ -146,7 +151,7 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
|
|||
// create the lattice builder
|
||||
_languageModel = [mgrLangModel lmCHT];
|
||||
_languageModel->setPhraseReplacementEnabled(Preferences.phraseReplacementEnabled);
|
||||
_userOverrideModel = [mgrLangModel userOverrideModel];
|
||||
_userOverrideModel = [mgrLangModel userOverrideModelCHT];
|
||||
|
||||
_builder = new BlockReadingBuilder(_languageModel);
|
||||
|
||||
|
@ -190,7 +195,7 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot";
|
|||
size_t cursorIndex = [self _actualCandidateCursorIndex];
|
||||
string stringValue = [value UTF8String];
|
||||
_builder->grid().fixNodeSelectedCandidate(cursorIndex, stringValue);
|
||||
if (_inputMode != imeModeCHS) {
|
||||
if (!Preferences.useSCPCTypingMode) { // 不要針對逐字選字模式啟用臨時半衰記憶模型。
|
||||
_userOverrideModel->observe(_walkedNodes, cursorIndex, stringValue, [[NSDate date] timeIntervalSince1970]);
|
||||
}
|
||||
[self _walk];
|
||||
|
|
|
@ -224,8 +224,7 @@ class ctlInputMethod: IMKInputController {
|
|||
}
|
||||
|
||||
@objc func togglePhraseReplacement(_ sender: Any?) {
|
||||
let enabled = Preferences.togglePhraseReplacementEnabled()
|
||||
mgrLangModel.phraseReplacementEnabled = enabled
|
||||
mgrLangModel.setPhraseReplacementEnabled(Preferences.togglePhraseReplacementEnabled())
|
||||
}
|
||||
|
||||
@objc func selfTerminate(_ sender: Any?) {
|
||||
|
@ -253,15 +252,15 @@ class ctlInputMethod: IMKInputController {
|
|||
}
|
||||
|
||||
@objc func openUserPhrases(_ sender: Any?) {
|
||||
open(userFileAt: mgrLangModel.userPhrasesDataPathCHT)
|
||||
open(userFileAt: mgrLangModel.userPhrasesDataPath(keyHandler.inputMode))
|
||||
}
|
||||
|
||||
@objc func openExcludedPhrases(_ sender: Any?) {
|
||||
open(userFileAt: mgrLangModel.excludedPhrasesDataPathCHT)
|
||||
open(userFileAt: mgrLangModel.excludedPhrasesDataPath(keyHandler.inputMode))
|
||||
}
|
||||
|
||||
@objc func openPhraseReplacement(_ sender: Any?) {
|
||||
open(userFileAt: mgrLangModel.phraseReplacementDataPathCHT)
|
||||
open(userFileAt: mgrLangModel.phraseReplacementDataPath(keyHandler.inputMode))
|
||||
}
|
||||
|
||||
@objc func reloadUserPhrases(_ sender: Any?) {
|
||||
|
@ -554,7 +553,7 @@ extension ctlInputMethod: KeyHandlerDelegate {
|
|||
if !state.validToWrite {
|
||||
return false
|
||||
}
|
||||
mgrLangModel.writeUserPhrase(state.userPhrase)
|
||||
mgrLangModel.writeUserPhrase(state.userPhrase, inputMode: keyHandler.inputMode)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,16 +31,16 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
+ (BOOL)checkIfUserLanguageModelFilesExist;
|
||||
|
||||
+ (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 *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, assign, nonatomic) BOOL phraseReplacementEnabled;
|
||||
@property (class, readonly, nonatomic) NSString *cnsDataPath;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -29,7 +29,8 @@ static const double kObservedOverrideHalflife = 5400.0;
|
|||
|
||||
static vChewingLM gLangModelCHT;
|
||||
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 kExcludedPhrasesvChewingTemplateName = @"template-exclude-phrases";
|
||||
|
@ -71,6 +72,9 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
|
|||
if (!gLangModelCHT.isDataModelLoaded()) {
|
||||
LTLoadLanguageModelFile(@"data-cht", gLangModelCHT);
|
||||
}
|
||||
if (!gLangModelCHT.isAssociatedPhrasesLoaded()) {
|
||||
LTLoadAssociatedPhrases(gLangModelCHT);
|
||||
}
|
||||
}
|
||||
|
||||
if ([mode isEqualToString:imeModeCHS]) {
|
||||
|
@ -85,13 +89,14 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
|
|||
|
||||
+ (void)loadUserPhrases
|
||||
{
|
||||
gLangModelCHT.loadUserPhrases([[self userPhrasesDataPathCHT] UTF8String], [[self excludedPhrasesDataPathCHT] UTF8String]);
|
||||
gLangModelCHS.loadUserPhrases([[self userPhrasesDataPathCHS] UTF8String], [[self excludedPhrasesDataPathCHS] UTF8String]);
|
||||
gLangModelCHT.loadUserPhrases([[self userPhrasesDataPath:imeModeCHT] UTF8String], [[self excludedPhrasesDataPath:imeModeCHT] UTF8String]);
|
||||
gLangModelCHS.loadUserPhrases([[self userPhrasesDataPath:imeModeCHS] UTF8String], [[self excludedPhrasesDataPath:imeModeCHS] UTF8String]);
|
||||
}
|
||||
|
||||
+ (void)loadUserPhraseReplacement
|
||||
{
|
||||
gLangModelCHT.loadPhraseReplacementMap([[self phraseReplacementDataPathCHT] UTF8String]);
|
||||
gLangModelCHT.loadPhraseReplacementMap([[self phraseReplacementDataPath:imeModeCHT] UTF8String]);
|
||||
gLangModelCHS.loadPhraseReplacementMap([[self phraseReplacementDataPath:imeModeCHS] UTF8String]);
|
||||
}
|
||||
|
||||
+ (void)setupDataModelValueConverter
|
||||
|
@ -171,13 +176,22 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
|
|||
if (![self checkIfUserDataFolderExists]) {
|
||||
return NO;
|
||||
}
|
||||
if (![self ensureFileExists:[self userPhrasesDataPathCHT] populateWithTemplate:kUserDataTemplateName extension:kTemplateExtension]) {
|
||||
if (![self ensureFileExists:[self userPhrasesDataPath:imeModeCHS] populateWithTemplate:kUserDataTemplateName extension:kTemplateExtension]) {
|
||||
return NO;
|
||||
}
|
||||
if (![self ensureFileExists:[self excludedPhrasesDataPathCHT] populateWithTemplate:kExcludedPhrasesvChewingTemplateName extension:kTemplateExtension]) {
|
||||
if (![self ensureFileExists:[self userPhrasesDataPath:imeModeCHT] populateWithTemplate:kUserDataTemplateName extension:kTemplateExtension]) {
|
||||
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 YES;
|
||||
|
@ -196,14 +210,14 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
|
|||
return NO;
|
||||
}
|
||||
|
||||
+ (BOOL)writeUserPhrase:(NSString *)userPhrase
|
||||
+ (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode;
|
||||
{
|
||||
if (![self checkIfUserLanguageModelFilesExist]) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
BOOL addLineBreakAtFront = NO;
|
||||
NSString *path = [self userPhrasesDataPathCHT];
|
||||
NSString *path = [self userPhrasesDataPath:mode];
|
||||
|
||||
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
|
||||
NSError *error = nil;
|
||||
|
@ -253,34 +267,22 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
|
|||
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 *)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 = [mode isEqualToString:imeModeCHT] ? @"phrases-replacement-cht.txt" : @"phrases-replacement-chs.txt";
|
||||
return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
|
||||
}
|
||||
|
||||
+ (vChewingLM *)lmCHT
|
||||
|
@ -293,19 +295,20 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
|
|||
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
|
||||
{
|
||||
gLangModelCHT.setPhraseReplacementEnabled(phraseReplacementEnabled);
|
||||
gLangModelCHS.setPhraseReplacementEnabled(phraseReplacementEnabled);
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -26,7 +26,8 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
@interface mgrLangModel ()
|
||||
@property (class, readonly, nonatomic) vChewing::vChewingLM *lmCHT;
|
||||
@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
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
|
Loading…
Reference in New Issue