Reset // Bringing back the CNS11643 support.

This commit is contained in:
ShikiSuen 2022-02-08 11:52:55 +08:00
parent 3fa061f957
commit be55969698
9 changed files with 88 additions and 7 deletions

View File

@ -151,6 +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);
_languageModel->setCNSEnabled(Preferences.cns11643Enabled);
_userOverrideModel = [mgrLangModel userOverrideModelCHT]; _userOverrideModel = [mgrLangModel userOverrideModelCHT];
_builder = new BlockReadingBuilder(_languageModel); _builder = new BlockReadingBuilder(_languageModel);

View File

@ -212,10 +212,7 @@ class ctlInputMethod: IMKInputController {
} }
@objc func toggleCNS11643Enabled(_ sender: Any?) { @objc func toggleCNS11643Enabled(_ sender: Any?) {
// let enabled = Preferences.toggleCNS11643Enabled() mgrLangModel.setCNSEnabled(Preferences.toggleCNS11643Enabled())
// mgrLangModel.cnsEnabledCHS = enabled
// mgrLangModel.cnsEnabledCHT = enabled
_ = Preferences.toggleCNS11643Enabled()
NotifierController.notify(message: String(format: "%@%@%@", NSLocalizedString("CNS11643 Mode", comment: ""), "\n", Preferences.cns11643Enabled ? NSLocalizedString("NotificationSwitchON", comment: "") : NSLocalizedString("NotificationSwitchOFF", comment: ""))) NotifierController.notify(message: String(format: "%@%@%@", NSLocalizedString("CNS11643 Mode", comment: ""), "\n", Preferences.cns11643Enabled ? NSLocalizedString("NotificationSwitchON", comment: "") : NSLocalizedString("NotificationSwitchOFF", comment: "")))
} }

View File

@ -33,6 +33,7 @@ public:
CNSLM(); CNSLM();
~CNSLM(); ~CNSLM();
bool isLoaded();
bool open(const char *path); bool open(const char *path);
void close(); void close();
void dump(); void dump();

View File

@ -44,6 +44,14 @@ CNSLM::~CNSLM()
} }
} }
bool CNSLM::isLoaded()
{
if (data) {
return true;
}
return false;
}
bool CNSLM::open(const char *path) bool CNSLM::open(const char *path)
{ {
if (data) { if (data) {

View File

@ -33,8 +33,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (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 inputMode:(InputMode)mode; + (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode;
+ (void)setPhraseReplacementEnabled:(BOOL)phraseReplacementEnabled; + (void)setPhraseReplacementEnabled:(BOOL)phraseReplacementEnabled;
+ (BOOL)cnsEnabled:(InputMode)mode; + (void)setCNSEnabled:(BOOL)cnsEnabled;
+ (void)setCNSEnabled:(BOOL)cnsEnabled inputMode:(InputMode)mode;
+ (NSString *)userPhrasesDataPath:(InputMode)mode; + (NSString *)userPhrasesDataPath:(InputMode)mode;
+ (NSString *)excludedPhrasesDataPath:(InputMode)mode; + (NSString *)excludedPhrasesDataPath:(InputMode)mode;
+ (NSString *)phraseReplacementDataPath:(InputMode)mode; + (NSString *)phraseReplacementDataPath:(InputMode)mode;

View File

@ -58,9 +58,18 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
if (!gLangModelCHT.isDataModelLoaded()) { if (!gLangModelCHT.isDataModelLoaded()) {
LTLoadLanguageModelFile(@"data-cht", gLangModelCHT); LTLoadLanguageModelFile(@"data-cht", gLangModelCHT);
} }
if (!gLangModelCHT.isCNSDataLoaded()){
gLangModelCHT.loadCNSData([[self cnsDataPath] UTF8String]);
}
if (!gLangModelCHT.isAssociatedPhrasesLoaded()) {
LTLoadAssociatedPhrases(gLangModelCHT);
}
if (!gLangModelCHS.isDataModelLoaded()) { if (!gLangModelCHS.isDataModelLoaded()) {
LTLoadLanguageModelFile(@"data-chs", gLangModelCHS); LTLoadLanguageModelFile(@"data-chs", gLangModelCHS);
} }
if (!gLangModelCHS.isCNSDataLoaded()){
gLangModelCHS.loadCNSData([[self cnsDataPath] UTF8String]);
}
if (!gLangModelCHS.isAssociatedPhrasesLoaded()) { if (!gLangModelCHS.isAssociatedPhrasesLoaded()) {
LTLoadAssociatedPhrases(gLangModelCHS); LTLoadAssociatedPhrases(gLangModelCHS);
} }
@ -72,6 +81,9 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
if (!gLangModelCHT.isDataModelLoaded()) { if (!gLangModelCHT.isDataModelLoaded()) {
LTLoadLanguageModelFile(@"data-cht", gLangModelCHT); LTLoadLanguageModelFile(@"data-cht", gLangModelCHT);
} }
if (!gLangModelCHT.isCNSDataLoaded()){
gLangModelCHT.loadCNSData([[self cnsDataPath] UTF8String]);
}
if (!gLangModelCHT.isAssociatedPhrasesLoaded()) { if (!gLangModelCHT.isAssociatedPhrasesLoaded()) {
LTLoadAssociatedPhrases(gLangModelCHT); LTLoadAssociatedPhrases(gLangModelCHT);
} }
@ -81,6 +93,9 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
if (!gLangModelCHS.isDataModelLoaded()) { if (!gLangModelCHS.isDataModelLoaded()) {
LTLoadLanguageModelFile(@"data-chs", gLangModelCHS); LTLoadLanguageModelFile(@"data-chs", gLangModelCHS);
} }
if (!gLangModelCHS.isCNSDataLoaded()){
gLangModelCHS.loadCNSData([[self cnsDataPath] UTF8String]);
}
if (!gLangModelCHS.isAssociatedPhrasesLoaded()) { if (!gLangModelCHS.isAssociatedPhrasesLoaded()) {
LTLoadAssociatedPhrases(gLangModelCHS); LTLoadAssociatedPhrases(gLangModelCHS);
} }
@ -285,6 +300,12 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
return [[self dataFolderPath] stringByAppendingPathComponent:fileName]; return [[self dataFolderPath] stringByAppendingPathComponent:fileName];
} }
+ (NSString *)cnsDataPath
{
Class cls = NSClassFromString(@"ctlInputMethod");
return [[NSBundle bundleForClass:cls] pathForResource:@"char-kanji-cns" ofType:@"txt"];
}
+ (vChewingLM *)lmCHT + (vChewingLM *)lmCHT
{ {
return &gLangModelCHT; return &gLangModelCHT;
@ -311,4 +332,10 @@ static void LTLoadAssociatedPhrases(vChewingLM &lm)
gLangModelCHS.setPhraseReplacementEnabled(phraseReplacementEnabled); gLangModelCHS.setPhraseReplacementEnabled(phraseReplacementEnabled);
} }
+ (void)setCNSEnabled:(BOOL)cnsEnabled
{
gLangModelCHT.setCNSEnabled(cnsEnabled);
gLangModelCHS.setCNSEnabled(cnsEnabled);
}
@end @end

View File

@ -31,6 +31,7 @@ vChewingLM::~vChewingLM()
{ {
m_languageModel.close(); m_languageModel.close();
m_userPhrases.close(); m_userPhrases.close();
m_cnsModel.close();
m_excludedPhrases.close(); m_excludedPhrases.close();
m_phraseReplacement.close(); m_phraseReplacement.close();
m_associatedPhrases.close(); m_associatedPhrases.close();
@ -62,6 +63,19 @@ bool vChewingLM::isAssociatedPhrasesLoaded()
return m_associatedPhrases.isLoaded(); return m_associatedPhrases.isLoaded();
} }
void vChewingLM::loadCNSData(const char* cnsDataPath)
{
if (cnsDataPath) {
m_cnsModel.close();
m_cnsModel.open(cnsDataPath);
}
}
bool vChewingLM::isCNSDataLoaded()
{
return m_cnsModel.isLoaded();
}
void vChewingLM::loadUserPhrases(const char* userPhrasesDataPath, void vChewingLM::loadUserPhrases(const char* userPhrasesDataPath,
const char* excludedPhrasesDataPath) const char* excludedPhrasesDataPath)
{ {
@ -102,6 +116,7 @@ const vector<Unigram> vChewingLM::unigramsForKey(const string& key)
vector<Unigram> allUnigrams; vector<Unigram> allUnigrams;
vector<Unigram> userUnigrams; vector<Unigram> userUnigrams;
vector<Unigram> cnsUnigrams;
unordered_set<string> excludedValues; unordered_set<string> excludedValues;
unordered_set<string> insertedValues; unordered_set<string> insertedValues;
@ -123,7 +138,13 @@ const vector<Unigram> vChewingLM::unigramsForKey(const string& key)
allUnigrams = filterAndTransformUnigrams(rawGlobalUnigrams, excludedValues, insertedValues); allUnigrams = filterAndTransformUnigrams(rawGlobalUnigrams, excludedValues, insertedValues);
} }
if (m_cnsModel.hasUnigramsForKey(key) && m_cnsEnabled) {
vector<Unigram> rawCNSUnigrams = m_cnsModel.unigramsForKey(key);
cnsUnigrams = filterAndTransformUnigrams(rawCNSUnigrams, excludedValues, insertedValues);
}
allUnigrams.insert(allUnigrams.begin(), userUnigrams.begin(), userUnigrams.end()); allUnigrams.insert(allUnigrams.begin(), userUnigrams.begin(), userUnigrams.end());
allUnigrams.insert(allUnigrams.end(), cnsUnigrams.begin(), cnsUnigrams.end());
return allUnigrams; return allUnigrams;
} }
@ -150,6 +171,15 @@ bool vChewingLM::phraseReplacementEnabled()
return m_phraseReplacementEnabled; return m_phraseReplacementEnabled;
} }
void vChewingLM::setCNSEnabled(bool enabled)
{
m_cnsEnabled = enabled;
}
bool vChewingLM::cnsEnabled()
{
return m_cnsEnabled;
}
void vChewingLM::setExternalConverterEnabled(bool enabled) void vChewingLM::setExternalConverterEnabled(bool enabled)
{ {
m_externalConverterEnabled = enabled; m_externalConverterEnabled = enabled;

View File

@ -23,6 +23,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
#include <stdio.h> #include <stdio.h>
#include "UserPhrasesLM.h" #include "UserPhrasesLM.h"
#include "ParselessLM.h" #include "ParselessLM.h"
#include "CNSLM.h"
#include "PhraseReplacementMap.h" #include "PhraseReplacementMap.h"
#include "AssociatedPhrases.h" #include "AssociatedPhrases.h"
#include <unordered_set> #include <unordered_set>
@ -64,6 +65,12 @@ public:
/// If the data model is already loaded. /// If the data model is already loaded.
bool isDataModelLoaded(); bool isDataModelLoaded();
/// Asks to load the primary language model at the given path.
/// @param cnsDataPath The path of the CNS data model.
void loadCNSData(const char* cnsDataPath);
/// If the data model is already loaded.
bool isCNSDataLoaded();
/// Asks to load the associated phrases at the given path. /// Asks to load the associated phrases at the given path.
/// @param associatedPhrasesPath The path of the associated phrases. /// @param associatedPhrasesPath The path of the associated phrases.
void loadAssociatedPhrases(const char* associatedPhrasesPath); void loadAssociatedPhrases(const char* associatedPhrasesPath);
@ -93,6 +100,11 @@ public:
/// If phrase replacement is enabled or not. /// If phrase replacement is enabled or not.
bool phraseReplacementEnabled(); bool phraseReplacementEnabled();
/// Enables or disables CNS11643 input.
void setCNSEnabled(bool enabled);
/// If CNS11643 input is enabled or not.
bool cnsEnabled();
/// Enables or disables the external converter. /// Enables or disables the external converter.
void setExternalConverterEnabled(bool enabled); void setExternalConverterEnabled(bool enabled);
/// If the external converted is enabled or not. /// If the external converted is enabled or not.
@ -117,11 +129,13 @@ protected:
std::unordered_set<string>& insertedValues); std::unordered_set<string>& insertedValues);
ParselessLM m_languageModel; ParselessLM m_languageModel;
CNSLM m_cnsModel;
UserPhrasesLM m_userPhrases; UserPhrasesLM m_userPhrases;
UserPhrasesLM m_excludedPhrases; UserPhrasesLM m_excludedPhrases;
PhraseReplacementMap m_phraseReplacement; PhraseReplacementMap m_phraseReplacement;
AssociatedPhrases m_associatedPhrases; AssociatedPhrases m_associatedPhrases;
bool m_phraseReplacementEnabled; bool m_phraseReplacementEnabled;
bool m_cnsEnabled;
bool m_externalConverterEnabled; bool m_externalConverterEnabled;
std::function<string(string)> m_externalConverter; std::function<string(string)> m_externalConverter;
}; };

View File

@ -40,6 +40,7 @@
5BBBB77527AED70B0023B93A /* MenuIcon-SCVIM.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB77127AED70B0023B93A /* MenuIcon-SCVIM.png */; }; 5BBBB77527AED70B0023B93A /* MenuIcon-SCVIM.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB77127AED70B0023B93A /* MenuIcon-SCVIM.png */; };
5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB77227AED70B0023B93A /* MenuIcon-TCVIM.png */; }; 5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB77227AED70B0023B93A /* MenuIcon-TCVIM.png */; };
5BBBB77A27AEDC690023B93A /* clsSFX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BBBB77927AEDC690023B93A /* clsSFX.swift */; }; 5BBBB77A27AEDC690023B93A /* clsSFX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BBBB77927AEDC690023B93A /* clsSFX.swift */; };
5BD05B8127B22F3C004C4F1D /* char-kanji-cns.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */; };
6A0D4F4515FC0EB100ABF4B3 /* Mandarin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F2015FC0EB100ABF4B3 /* Mandarin.cpp */; }; 6A0D4F4515FC0EB100ABF4B3 /* Mandarin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F2015FC0EB100ABF4B3 /* Mandarin.cpp */; };
6A187E2616004C5900466B2E /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6A187E2816004C5900466B2E /* MainMenu.xib */; }; 6A187E2616004C5900466B2E /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6A187E2816004C5900466B2E /* MainMenu.xib */; };
6A225A1F23679F2600F685C6 /* NotarizedArchives in Resources */ = {isa = PBXBuildFile; fileRef = 6A225A1E23679F2600F685C6 /* NotarizedArchives */; }; 6A225A1F23679F2600F685C6 /* NotarizedArchives in Resources */ = {isa = PBXBuildFile; fileRef = 6A225A1E23679F2600F685C6 /* NotarizedArchives */; };
@ -140,6 +141,7 @@
5BBBB77227AED70B0023B93A /* MenuIcon-TCVIM.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MenuIcon-TCVIM.png"; sourceTree = "<group>"; }; 5BBBB77227AED70B0023B93A /* MenuIcon-TCVIM.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MenuIcon-TCVIM.png"; sourceTree = "<group>"; };
5BBBB77727AEDB290023B93A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainMenu.strings; sourceTree = "<group>"; }; 5BBBB77727AEDB290023B93A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainMenu.strings; sourceTree = "<group>"; };
5BBBB77927AEDC690023B93A /* clsSFX.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = clsSFX.swift; sourceTree = "<group>"; }; 5BBBB77927AEDC690023B93A /* clsSFX.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = clsSFX.swift; sourceTree = "<group>"; };
5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "char-kanji-cns.txt"; path = "Data/components/common/char-kanji-cns.txt"; sourceTree = "<group>"; };
6A0D4EA215FC0D2D00ABF4B3 /* vChewing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewing.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6A0D4EA215FC0D2D00ABF4B3 /* vChewing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewing.app; sourceTree = BUILT_PRODUCTS_DIR; };
6A0D4EF515FC0DA600ABF4B3 /* IME-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "IME-Info.plist"; sourceTree = "<group>"; }; 6A0D4EF515FC0DA600ABF4B3 /* IME-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "IME-Info.plist"; sourceTree = "<group>"; };
6A0D4EF615FC0DA600ABF4B3 /* vChewing-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "vChewing-Prefix.pch"; sourceTree = "<group>"; }; 6A0D4EF615FC0DA600ABF4B3 /* vChewing-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "vChewing-Prefix.pch"; sourceTree = "<group>"; };
@ -445,9 +447,10 @@
5B62A35027AE7F6600A19448 /* Data */ = { 5B62A35027AE7F6600A19448 /* Data */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5B2DB17127AF8771006D874E /* Makefile */, 5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */,
5B2DB16D27AF6891006D874E /* data-chs.txt */, 5B2DB16D27AF6891006D874E /* data-chs.txt */,
5B2DB16E27AF6891006D874E /* data-cht.txt */, 5B2DB16E27AF6891006D874E /* data-cht.txt */,
5B2DB17127AF8771006D874E /* Makefile */,
); );
name = Data; name = Data;
sourceTree = "<group>"; sourceTree = "<group>";
@ -705,6 +708,7 @@
5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */, 5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */,
5BBBB77527AED70B0023B93A /* MenuIcon-SCVIM.png in Resources */, 5BBBB77527AED70B0023B93A /* MenuIcon-SCVIM.png in Resources */,
5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */, 5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */,
5BD05B8127B22F3C004C4F1D /* char-kanji-cns.txt in Resources */,
5B2DB17027AF6891006D874E /* data-cht.txt in Resources */, 5B2DB17027AF6891006D874E /* data-cht.txt in Resources */,
5BBBB77327AED70B0023B93A /* MenuIcon-TCVIM@2x.png in Resources */, 5BBBB77327AED70B0023B93A /* MenuIcon-TCVIM@2x.png in Resources */,
5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */, 5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */,