From b472241d992a4caa220f14c0a2d5c6fdff1a77fc Mon Sep 17 00:00:00 2001 From: Phil Cowans Date: Tue, 13 Mar 2007 15:02:21 +0000 Subject: [PATCH] More Japanese stuff * More Japanese stuff svn path=/trunk/; revision=3058 --- ChangeLog | 4 ++ Src/DasherCore/CannaConversionHelper.cpp | 4 ++ Src/DasherCore/ConversionManager.cpp | 68 +++++++++++++++++++++++------ Src/DasherCore/ConversionManager.h | 4 +- Src/DasherCore/ConversionManagerFactory.cpp | 5 ++- Src/DasherCore/ConversionManagerFactory.h | 3 +- Src/DasherCore/NodeCreationManager.cpp | 2 +- 7 files changed, 71 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5770818d..51ca2c2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2007-03-13 Phil Cowans + + * Fixed up backing off in conversion mode + 2007-03-03 Phil Cowans * Preparing for release diff --git a/Src/DasherCore/CannaConversionHelper.cpp b/Src/DasherCore/CannaConversionHelper.cpp index 2fb39fe1..2e232406 100644 --- a/Src/DasherCore/CannaConversionHelper.cpp +++ b/Src/DasherCore/CannaConversionHelper.cpp @@ -72,6 +72,10 @@ bool CCannaConversionHelper::Convert(const std::string &strSource, SCENode ** pR size_t outbytesleft = BUFSIZE; // Use EUC for Canna + // + // NOTE: As far as I can tell, this requires NFC rather than NFD + // normalisation. http://www.cl.cam.ac.uk/~mgk25/unicode.html + // iconv_t cd = iconv_open("EUC-JP", "UTF8"); iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); *outbuf = '\0'; diff --git a/Src/DasherCore/ConversionManager.cpp b/Src/DasherCore/ConversionManager.cpp index 2fcf7751..f3cb56b7 100644 --- a/Src/DasherCore/ConversionManager.cpp +++ b/Src/DasherCore/ConversionManager.cpp @@ -34,15 +34,18 @@ using namespace Dasher; -CConversionManager::CConversionManager(CNodeCreationManager *pNCManager, CConversionHelper *pHelper, int CMid) +CConversionManager::CConversionManager(CNodeCreationManager *pNCManager, CConversionHelper *pHelper, CAlphabet *pAlphabet, int CMid) : CNodeManager(2) { m_pNCManager = pNCManager; m_pHelper = pHelper; + m_pAlphabet = pAlphabet; //DOESN'T SEEM INTRINSIC //and check why pHelper may be empty if(pHelper) m_pLanguageModel = pHelper->GetLanguageModel(); + else + m_pLanguageModel = NULL; if(m_pLanguageModel) m_iLearnContext = m_pLanguageModel->CreateEmptyContext(); @@ -86,9 +89,14 @@ CDasherNode *CConversionManager::GetRoot(CDasherNode *pParent, int iLower, int i SConversionData *pNodeUserData = new SConversionData; pNewNode->m_pUserData = pNodeUserData; - pNodeUserData->pLanguageModel = m_pHelper->GetLanguageModel(); pNodeUserData->bType = false; pNodeUserData->iOffset = iOffset; + + if(m_pHelper) + pNodeUserData->pLanguageModel = m_pHelper->GetLanguageModel(); + else + pNodeUserData->pLanguageModel = NULL; + // CLanguageModel::Context iContext; // // std::cout<(pNode->m_pUserData)); + CDasherNode *pNewNode; + + // If no helper class is present then just drop straight back to an + // alphabet root. This should only happen in error cases, and the + // user should have been warned here. + // + if(!m_pHelper) { + int iLbnd(0); + int iHbnd(m_pNCManager->GetLongParameter(LP_NORMALIZATION)); + + CAlphabetManager::SRootData oRootData; + oRootData.szContext = NULL; + oRootData.iOffset = pCurrentDataNode->iOffset + 1; + + pNewNode = m_pNCManager->GetRoot(0, pNode, iLbnd, iHbnd, &oRootData); + pNewNode->SetFlag(NF_SEEN, false); + + pNode->Children().push_back(pNewNode); - if(!m_pNCManager) return; + } // Do the conversion and build the tree (lattice) if it hasn't been // done already. - + // if(!m_bTreeBuilt) { BuildTree(pNode); m_bTreeBuilt = true; } - CDasherNode *pNewNode; - - - - SConversionData * pCurrentDataNode (static_cast(pNode->m_pUserData)); SCENode *pCurrentSCEChild; if(pCurrentDataNode->pSCENode) @@ -455,18 +481,22 @@ void CConversionManager::RecursiveDumpTree(SCENode *pCurrent, unsigned int iDept } void CConversionManager::BuildTree(CDasherNode *pRoot) { + DASHER_ASSERT(m_pHelper); + CDasherNode *pCurrentNode(pRoot->Parent()); std::string strCurrentString; - if(m_pHelper) - m_pHelper->ClearData(m_iCMID); + m_pHelper->ClearData(m_iCMID); while(pCurrentNode) { if(pCurrentNode->m_pNodeManager->GetID() == 2) break; // TODO: Need to make this the edit text rather than the display text - strCurrentString = pCurrentNode->GetDisplayInfo()->strDisplayText + strCurrentString; + CAlphabetManager::SAlphabetData *pAlphabetData = + static_cast(pCurrentNode->m_pUserData); + + strCurrentString = m_pAlphabet->GetText(pAlphabetData->iSymbol) + strCurrentString; pCurrentNode = pCurrentNode->Parent(); } @@ -516,14 +546,24 @@ void CConversionManager::Output( CDasherNode *pNode, Dasher::VECTOR_SYMBOL_PROB* } } -void CConversionManager::Undo( CDasherNode *pNode ) { - SCENode *pCurrentSCENode(static_cast(pNode->m_pUserData)); +void CConversionManager::Undo( CDasherNode *pNode ) { + SCENode *pCurrentSCENode((static_cast(pNode->m_pUserData))->pSCENode); if(pCurrentSCENode) { if(pCurrentSCENode->pszConversion && (strlen(pCurrentSCENode->pszConversion) > 0)) { Dasher::CEditEvent oEvent(2, pCurrentSCENode->pszConversion); m_pNCManager->InsertEvent(&oEvent); } + } + else { + if((static_cast(pNode->m_pUserData))->bType) { + Dasher::CEditEvent oOPEvent(2, "|"); + m_pNCManager->InsertEvent(&oOPEvent); + } + else { + Dasher::CEditEvent oOPEvent(2, ">"); + m_pNCManager->InsertEvent(&oOPEvent); + } } } diff --git a/Src/DasherCore/ConversionManager.h b/Src/DasherCore/ConversionManager.h index b6170ac8..852dd5de 100644 --- a/Src/DasherCore/ConversionManager.h +++ b/Src/DasherCore/ConversionManager.h @@ -63,7 +63,7 @@ namespace Dasher { class CConversionManager : public CNodeManager { public: // TODO: We shouldn't need to know about this stuff, but the code is somewhat in knots at the moment - CConversionManager(CNodeCreationManager *pNCManager, CConversionHelper *pHelper, int CMid); + CConversionManager(CNodeCreationManager *pNCManager, CConversionHelper *pHelper, CAlphabet *pAlphabet, int CMid); ~CConversionManager(); /// @@ -201,6 +201,8 @@ namespace Dasher { CConversionHelper *m_pHelper; + CAlphabet *m_pAlphabet; + /// /// Reference count /// diff --git a/Src/DasherCore/ConversionManagerFactory.cpp b/Src/DasherCore/ConversionManagerFactory.cpp index 87998486..ae7891de 100644 --- a/Src/DasherCore/ConversionManagerFactory.cpp +++ b/Src/DasherCore/ConversionManagerFactory.cpp @@ -25,8 +25,9 @@ using namespace Dasher; -CConversionManagerFactory::CConversionManagerFactory(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CNodeCreationManager *pNCManager, int iID, Dasher::CAlphIO *pCAlphIO) { +CConversionManagerFactory::CConversionManagerFactory(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CNodeCreationManager *pNCManager, int iID, Dasher::CAlphIO *pCAlphIO, CAlphabet *pAlphabet) { m_pNCManager = pNCManager; + m_pAlphabet = pAlphabet; // TODO: Need to deal with the case of GetHelper returning NULL m_pHelper = GetHelper(pEventHandler, pSettingsStore, iID, pCAlphIO); @@ -37,7 +38,7 @@ CConversionManagerFactory::CConversionManagerFactory(Dasher::CEventHandler *pEve } CDasherNode *CConversionManagerFactory::GetRoot(CDasherNode *pParent, int iLower, int iUpper, void *pUserData) { - CConversionManager *pConversionManager(new CConversionManager(m_pNCManager, m_pHelper, m_iCMCount)); + CConversionManager *pConversionManager(new CConversionManager(m_pNCManager, m_pHelper, m_pAlphabet, m_iCMCount)); if(m_iCMCount >= MAX_CM_NUM-1){ pagecount ++; diff --git a/Src/DasherCore/ConversionManagerFactory.h b/Src/DasherCore/ConversionManagerFactory.h index 4abcb236..02e804c8 100644 --- a/Src/DasherCore/ConversionManagerFactory.h +++ b/Src/DasherCore/ConversionManagerFactory.h @@ -15,7 +15,7 @@ namespace Dasher { /// @{ class CConversionManagerFactory : public CNodeManagerFactory { public: - CConversionManagerFactory(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CNodeCreationManager *pNCManager, int iID, Dasher::CAlphIO *pCAlphIO); + CConversionManagerFactory(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CNodeCreationManager *pNCManager, int iID, Dasher::CAlphIO *pCAlphIO, CAlphabet *pAlphabet); virtual CDasherNode *GetRoot(CDasherNode *pParent, int iLower, int iUpper, void *pUserData); private: @@ -23,6 +23,7 @@ namespace Dasher { CNodeCreationManager *m_pNCManager; CConversionHelper *m_pHelper; + CAlphabet *m_pAlphabet; int m_iCMCount; int pagecount;//test diff --git a/Src/DasherCore/NodeCreationManager.cpp b/Src/DasherCore/NodeCreationManager.cpp index 4e9eb071..0453f5b5 100644 --- a/Src/DasherCore/NodeCreationManager.cpp +++ b/Src/DasherCore/NodeCreationManager.cpp @@ -15,7 +15,7 @@ CNodeCreationManager::CNodeCreationManager(Dasher::CDasherInterfaceBase *pInterf int iConversionID(m_pAlphabetManagerFactory->GetConversionID()); m_pControlManagerFactory = new CControlManagerFactory(this); - m_pConversionManagerFactory = new CConversionManagerFactory(pEventHandler, pSettingsStore, this, iConversionID, pAlphIO); + m_pConversionManagerFactory = new CConversionManagerFactory(pEventHandler, pSettingsStore, this, iConversionID, pAlphIO, m_pAlphabet); } CNodeCreationManager::~CNodeCreationManager() { -- 2.11.4.GIT