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
cf4e58f28b
commit
03fcf1ffa3
|
@ -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];
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue