From a19bf4bedd066374c8439b01d6bede25f7c95587 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 25 Apr 2025 12:38:40 +0300 Subject: [PATCH 1/4] for bug#74095 --- .../Reader/Converter/StarMath2OOXML/cooxml2odf.cpp | 11 +++++++++++ OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h | 1 + 2 files changed, 12 insertions(+) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp index 9fdd78b7c6..5cc36ef55b 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp @@ -80,6 +80,11 @@ namespace StarMath ConversionBox(dynamic_cast(pNode)); break; } + case OOX::EElementType::et_m_borderBox: + { + ConversionBorderBox(dynamic_cast(pNode)); + break; + } case OOX::EElementType::et_m_m: { ConversionMatrix(dynamic_cast(pNode)); @@ -788,6 +793,12 @@ namespace StarMath return; NodeDefinition(pBox->m_oElement.GetPointer()); } + void COOXml2Odf::ConversionBorderBox(OOX::Logic::CBorderBox * pBorderBox) + { + if(pBorderBox == nullptr) + return; + NodeDefinition(pBorderBox->m_oElement.GetPointer()); + } StValuePr* COOXml2Odf::ConversionRunProperties(OOX::Logic::CRunProperty *pRPr) { StValuePr* stTempPr = new StValuePr; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h index e36a020155..d9212f66d1 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h @@ -84,6 +84,7 @@ namespace StarMath void ConversionFunc(OOX::Logic::CFunc* pFunc); StStyleMenClose ConversionFuncPr(OOX::Logic::CFuncPr* pFuncPr); void ConversionBox(OOX::Logic::CBox* pBox); + void ConversionBorderBox(OOX::Logic::CBorderBox* pBorderBox); void ConversionTextVector(std::vector& arLine, std::vector& arNewLine); void ConversionVectorWritingElement(std::vector arWrElements); void ConversionMatrix(OOX::Logic::CMatrix *pMatrix); From 9b4558993774fee2580d5b99f753eee25ba366a1 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Thu, 15 May 2025 14:03:45 +0300 Subject: [PATCH 2/4] fix bug --- .../Converter/StarMath2OOXML/cooxml2odf.cpp | 59 +++++++++++++++---- .../Converter/StarMath2OOXML/cooxml2odf.h | 12 ++-- X2tConverter/test/TestOOOXml2Odf/test.cpp | 4 +- 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp index 5cc36ef55b..5b5dbef9ac 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp @@ -1130,8 +1130,17 @@ namespace StarMath { if(pMr->m_arrItems[i]->getType() == OOX::EElementType::et_m_e) { + OOX::Logic::CElement* pElement = dynamic_cast(pMr->m_arrItems[i]); m_pXmlWrite->WriteNodeBegin(L"mtd",false); - ConversionElement(dynamic_cast(pMr->m_arrItems[i])); + if(!pElement->m_arrItems.empty()) + ConversionElement(pElement); + else + { + m_pXmlWrite->WriteNodeBegin(L"mspace",true); + m_pXmlWrite->WriteAttribute(L"width",L"2em"); + m_pXmlWrite->WriteNodeEnd(L"w",true,true); + m_wsAnnotationStarMath += L"~ "; + } if(i+1 < pMr->m_arrItems.size()) m_wsAnnotationStarMath += L"# "; m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); @@ -1707,10 +1716,13 @@ namespace StarMath { return m_enType; } - void COneElement::SetAttribute(StValuePr *stAttribute) + void COneElement::SetBaseAttribute(StValuePr *stAttribute) { if(m_stAttribute == nullptr) + { m_stAttribute = stAttribute; + stAttribute->AddRef(); + } } StValuePr* COneElement::GetAttribute() { @@ -1900,6 +1912,10 @@ namespace StarMath } void CNumberOrLetter::Parse(std::wstring::iterator &itStart, std::wstring::iterator &itEnd, COneElement *&pElement) {} + void CNumberOrLetter::SetAttribute(StValuePr *pAttribute) + { + SetBaseAttribute(pAttribute); + } const std::wstring& CNumberOrLetter::GetString() { return m_wsElement; @@ -1933,21 +1949,18 @@ namespace StarMath { COneElement::ConversionAttribute(GetAttribute(),stStyle,pXmlWrite,wsAnnotation); pXmlWrite->WriteNodeBegin(L"mtext",false); - pXmlWrite->WriteString(m_wsAnnotation); + pXmlWrite->WriteString(m_wsSymbolBinOp); pXmlWrite->WriteNodeEnd(L"mtext",false,false); - wsAnnotation += L"\u0026quot;" + m_wsAnnotation + L"\u0026quot;"; + wsAnnotation += L"\u0026quot;" + m_wsSymbolBinOp + L"\u0026quot;"; COOXml2Odf::StyleClosing(stStyle,pXmlWrite); return; } } pXmlWrite->WriteNodeBegin(L"mrow",false); - if(GetAttribute() != nullptr && m_enTypeBinOp != TypeElement::undefine) + if(m_pLeftArg != nullptr) + m_pLeftArg->Conversion(pXmlWrite,wsAnnotation); + else if(GetAttribute() != nullptr && m_enTypeBinOp != TypeElement::undefine) COneElement::ConversionAttribute(GetAttribute(),stStyle,pXmlWrite,wsAnnotation); - else - { - if(m_pLeftArg != nullptr) - m_pLeftArg->Conversion(pXmlWrite,wsAnnotation); - } COOXml2Odf::RecordingMoNode(m_wsSymbolBinOp,pXmlWrite); wsAnnotation += m_wsAnnotation + L" "; if(m_pRightArg != nullptr) @@ -1955,6 +1968,14 @@ namespace StarMath COOXml2Odf::StyleClosing(stStyle,pXmlWrite); pXmlWrite->WriteNodeEnd(L"mrow",false,false); } + void CBinOperator::SetAttribute(StValuePr *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pLeftArg != nullptr) + m_pLeftArg->SetAttribute(pAttribute); + if(m_pRightArg != nullptr) + m_pRightArg->SetAttribute(pAttribute); + } void CBinOperator::SetLeftArg(COneElement *pElement) { m_pLeftArg = pElement; @@ -2134,7 +2155,7 @@ namespace StarMath if(GetAttribute() != nullptr) { GetAttribute()->AddRef(); - m_pLeftArg->SetAttribute(GetAttribute()); + m_pLeftArg->SetBaseAttribute(GetAttribute()); } m_pLeftArg->Conversion(pXmlWrite,wsAnnotation); } @@ -2148,13 +2169,21 @@ namespace StarMath if(GetAttribute() != nullptr) { GetAttribute()->AddRef(); - m_pRightArg->SetAttribute(GetAttribute()); + m_pRightArg->SetBaseAttribute(GetAttribute()); } m_pRightArg->Conversion(pXmlWrite,wsAnnotation); } pXmlWrite->WriteNodeEnd(L"mrow",false,false); } } + void CRelationsAndOperationsOnSets::SetAttribute(StValuePr *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pLeftArg != nullptr) + m_pLeftArg->SetAttribute(pAttribute); + if(m_pRightArg != nullptr) + m_pRightArg->SetAttribute(pAttribute); + } void CRelationsAndOperationsOnSets::SetLeftArg(COneElement *pElement) { m_pLeftArg = pElement; @@ -2285,6 +2314,8 @@ namespace StarMath pXmlWrite->WriteNodeEnd(L"w",true,true); wsAnnotation += L"` "; } + void CSpace::SetAttribute(StValuePr *pAttribute) + {} //class CSpecialChar CSpecialChar::~CSpecialChar() {} @@ -2308,6 +2339,10 @@ namespace StarMath COOXml2Odf::MTextRecording(pXmlWrite,wsAnnotation,m_wsSymbol); COOXml2Odf::StyleClosing(stStyle,pXmlWrite); } + void CSpecialChar::SetAttribute(StValuePr *pAttribute) + { + SetBaseAttribute(pAttribute); + } std::wstring CSpecialChar::DefinitionSpecialChar(const std::wstring &wsSymbol) { if(L"\u2205" == wsSymbol) return L"emptyset"; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h index d9212f66d1..fbefb302ca 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h @@ -19,9 +19,7 @@ namespace StarMath struct StValuePr { StValuePr():m_wsTypeName(L""),m_wsChr(L""),m_wsBegBracket(L""),m_wsEndBracket(L""),m_wsColor(L""),m_bSupHide(false),m_bSubHide(false),m_enStyle(SimpleTypes::EStyle::stylePlain),m_iSize(0),m_enPos(SimpleTypes::ETopBot::tbBot),m_enVert(SimpleTypes::ETopBot::tbBot),m_enFont(StarMath::TypeFont::empty),m_iCount(0),m_bStrike(false),m_enUnderLine(SimpleTypes::EUnderline::underlineNone),m_bBaseAttribute(false) - { - AddRef(); - } + {} std::wstring m_wsTypeName,m_wsChr; std::wstring m_wsBegBracket,m_wsEndBracket; std::wstring m_wsColor; @@ -148,10 +146,11 @@ namespace StarMath virtual ~COneElement(); virtual void Parse(std::wstring::iterator& itStart,std::wstring::iterator& itEnd,COneElement*& pElement) = 0; virtual void Conversion(XmlUtils::CXmlWriter* pXmlWrite,std::wstring& wsAnnotation) = 0; + virtual void SetAttribute(StValuePr* pAttribute) = 0; static COneElement* CreateElement(std::wstring& wsOneElement); void SetType(const TypeElement& enType); TypeElement GetType(); - void SetAttribute(StValuePr* stAttribute); + void SetBaseAttribute(StValuePr* stAttribute); StValuePr* GetAttribute(); static void ConversionAttribute(StValuePr* pAttribute, StStyleMenClose & stStyle , XmlUtils::CXmlWriter* pXmlWrite, std::wstring& wsAnnotation, const bool &bDelimiter = false); bool CheckStyle(); @@ -172,6 +171,7 @@ namespace StarMath virtual ~CNumberOrLetter(); void Conversion(XmlUtils::CXmlWriter* pXmlWrite,std::wstring& wsAnnotation) override; void Parse(std::wstring::iterator &itStart, std::wstring::iterator &itEnd,COneElement*& pElement) override; + void SetAttribute(StValuePr* pAttribute) override; const std::wstring& GetString(); void AddingStrings(const std::wstring& wsString); private: @@ -198,6 +198,7 @@ namespace StarMath virtual ~CBinOperator(); void Parse(std::wstring::iterator &itStart, std::wstring::iterator &itEnd, COneElement *&pElement) override; void Conversion(XmlUtils::CXmlWriter* pXmlWrite,std::wstring& wsAnnotation) override; + void SetAttribute(StValuePr* pAttribute) override; bool CheckLeftArg(); void SetLeftArg(COneElement* pElement); bool CheckRightArg(); @@ -225,6 +226,7 @@ namespace StarMath virtual ~CRelationsAndOperationsOnSets(); void Parse(std::wstring::iterator &itStart, std::wstring::iterator &itEnd,COneElement*& pElement) override; void Conversion(XmlUtils::CXmlWriter* pXmlWrite,std::wstring& wsAnnotation) override; + void SetAttribute(StValuePr* pAttribute) override; void SetLeftArg(COneElement* pElement); void SetRightArg(COneElement* pElement); bool CheckRightArg(); @@ -246,6 +248,7 @@ namespace StarMath virtual ~CSpace(); void Parse(std::wstring::iterator&itStart,std::wstring::iterator&itEnd,COneElement*& pElement) override; void Conversion(XmlUtils::CXmlWriter* pXmlWrite,std::wstring& wsAnnotation) override; + void SetAttribute(StValuePr* pAttribute) override; }; class CSpecialChar: public COneElement { @@ -259,6 +262,7 @@ namespace StarMath virtual ~CSpecialChar(); void Parse(std::wstring::iterator&itStart,std::wstring::iterator&itEnd,COneElement*& pElement) override; void Conversion(XmlUtils::CXmlWriter* pXmlWrite,std::wstring& wsAnnotation) override; + void SetAttribute(StValuePr* pAttribute) override; static std::wstring DefinitionSpecialChar(const std::wstring& wsSymbol); private: std::wstring m_wsSymbol,m_wsAnnotation; diff --git a/X2tConverter/test/TestOOOXml2Odf/test.cpp b/X2tConverter/test/TestOOOXml2Odf/test.cpp index 7227ec5a8d..1ea3ecdcaa 100644 --- a/X2tConverter/test/TestOOOXml2Odf/test.cpp +++ b/X2tConverter/test/TestOOOXml2Odf/test.cpp @@ -527,7 +527,7 @@ TEST(OOXml2OdfTest,TextMrPr) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"1+3bold ital 1 bold ital + 3 "; + std::wstring wsOdf = L"1+3bold ital 1 bold ital + bold ital 3 "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,ColorByName) @@ -593,7 +593,7 @@ TEST(OOXml2OdfTest,EmptyMatrix) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"bold ital matrix{# # ## # # ## # # } "; + std::wstring wsOdf = L"bold ital matrix{~ # ~ # ~ ## ~ # ~ # ~ ## ~ # ~ # ~ } "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,EmptyNary) From 366b122c510d3b5e795df21618918c57c117bded Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Tue, 20 May 2025 13:19:19 +0300 Subject: [PATCH 3/4] editing the conversion of diacritics and text --- .../Converter/StarMath2OOXML/cooxml2odf.cpp | 93 ++++++++++--------- .../Converter/StarMath2OOXML/cooxml2odf.h | 3 +- X2tConverter/test/TestOOOXml2Odf/test.cpp | 30 +++--- 3 files changed, 67 insertions(+), 59 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp index 5b5dbef9ac..de6b0c2ed8 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp @@ -4,7 +4,7 @@ namespace StarMath { //class OOXml2Odf - COOXml2Odf::COOXml2Odf():m_wsBaseColor(L""),m_uiBaseSize(0) + COOXml2Odf::COOXml2Odf():m_wsBaseColor(L""),m_uiBaseSize(0),m_bStretchyAcc(false) { m_pXmlWrite = new XmlUtils::CXmlWriter; } @@ -80,11 +80,6 @@ namespace StarMath ConversionBox(dynamic_cast(pNode)); break; } - case OOX::EElementType::et_m_borderBox: - { - ConversionBorderBox(dynamic_cast(pNode)); - break; - } case OOX::EElementType::et_m_m: { ConversionMatrix(dynamic_cast(pNode)); @@ -732,7 +727,7 @@ namespace StarMath } void COOXml2Odf::ConversionAcc(OOX::Logic::CAcc *pAcc) { - std::wstring wsSymbol = pAcc->m_oAccPr->m_oChr.IsInit() ? pAcc->m_oAccPr->m_oChr.get().m_val->GetValue() : L"",wsSign; + std::wstring wsSymbol = pAcc->m_oAccPr->m_oChr.IsInit() ? pAcc->m_oAccPr->m_oChr.get().m_val->GetValue() : L"\u005E",wsSign; wsSign = TranslationDiacritSign(wsSymbol); if(wsSign.empty()) { @@ -746,13 +741,23 @@ namespace StarMath } else { + std::wstring wsStretchy; m_wsAnnotationStarMath += wsSign + L" "; + if(m_bStretchyAcc) + { + m_wsAnnotationStarMath += L"{ "; + wsStretchy = L"true"; + } + else + wsStretchy = L"false"; m_pXmlWrite->WriteNodeBegin(L"mover",true); m_pXmlWrite->WriteAttribute(L"accent",L"true"); m_pXmlWrite->WriteNodeEnd(L"w",true,false); ConversionElement(pAcc->m_oElement.GetPointer()); + if(wsStretchy == L"true") + m_wsAnnotationStarMath += L"} "; m_pXmlWrite->WriteNodeBegin(L"mo",true); - m_pXmlWrite->WriteAttribute(L"stretchy",L"false"); + m_pXmlWrite->WriteAttribute(L"stretchy",wsStretchy); m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteString(wsSymbol); m_pXmlWrite->WriteNodeEnd(L"mo",false,false); @@ -793,12 +798,6 @@ namespace StarMath return; NodeDefinition(pBox->m_oElement.GetPointer()); } - void COOXml2Odf::ConversionBorderBox(OOX::Logic::CBorderBox * pBorderBox) - { - if(pBorderBox == nullptr) - return; - NodeDefinition(pBorderBox->m_oElement.GetPointer()); - } StValuePr* COOXml2Odf::ConversionRunProperties(OOX::Logic::CRunProperty *pRPr) { StValuePr* stTempPr = new StValuePr; @@ -1081,7 +1080,12 @@ namespace StarMath } std::wstring COOXml2Odf::TranslationDiacritSign(const std::wstring &wsSymbol) { - if( L"\u0308" == wsSymbol) return L"ddot"; + if( L"\u0308" == wsSymbol) return L"ddot"; + else if(L"\u005E" == wsSymbol) + { + m_bStretchyAcc = true; + return L"widehat"; + } else if(L"\u0307" == wsSymbol) return L"dot"; else if(L"\u0301" == wsSymbol) return L"acute"; else if(L"\u0300" == wsSymbol) return L"grave"; @@ -1091,11 +1095,23 @@ namespace StarMath else if(L"\u20DB" == wsSymbol) return L"dddot"; else if(L"\u20D1" == wsSymbol) return L"harpoon"; else if(L"\u20D7" == wsSymbol) return L"vec"; - else if(L"\u0342" == wsSymbol) return L"tilde"; + else if(L"\u007E" == wsSymbol) + { + m_bStretchyAcc = true; + return L"widetilde"; + } else if(L"\u0302" == wsSymbol) return L"hat"; else if(L"\u030C" == wsSymbol) return L"check"; - else if(L"\u0305" == wsSymbol) return L"overline"; - else if(L"\u0332" == wsSymbol) return L"underline"; + else if(L"\u0305" == wsSymbol) + { + m_bStretchyAcc = true; + return L"overline"; + } + else if(L"\u0332" == wsSymbol) + { + m_bStretchyAcc = true; + return L"underline"; + } else return L""; } void COOXml2Odf::ConversionMatrix(OOX::Logic::CMatrix* pMatrix) @@ -1130,17 +1146,8 @@ namespace StarMath { if(pMr->m_arrItems[i]->getType() == OOX::EElementType::et_m_e) { - OOX::Logic::CElement* pElement = dynamic_cast(pMr->m_arrItems[i]); m_pXmlWrite->WriteNodeBegin(L"mtd",false); - if(!pElement->m_arrItems.empty()) - ConversionElement(pElement); - else - { - m_pXmlWrite->WriteNodeBegin(L"mspace",true); - m_pXmlWrite->WriteAttribute(L"width",L"2em"); - m_pXmlWrite->WriteNodeEnd(L"w",true,true); - m_wsAnnotationStarMath += L"~ "; - } + ConversionElement(dynamic_cast(pMr->m_arrItems[i])); if(i+1 < pMr->m_arrItems.size()) m_wsAnnotationStarMath += L"# "; m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); @@ -1264,12 +1271,12 @@ namespace StarMath { case SimpleTypes::ETopBot::tbBot: { - wsNode = L"munder"; + wsNode = L"mover"; break; } case SimpleTypes::ETopBot::tbTop: { - wsNode = L"mover"; + wsNode = L"munder"; break; } } @@ -1292,13 +1299,16 @@ namespace StarMath } else { + StStyleMenClose stStyle; m_pXmlWrite->WriteNodeBegin(wsNode,false); - ConversionElement(pGroup->m_oElement.GetPointer()); + stStyle = ConversionCtrlPr(pGroup->m_oGroupChrPr.GetPointer()->m_oCtrlPr.GetPointer()); m_pXmlWrite->WriteNodeBegin(L"mtext",false); m_pXmlWrite->WriteString(stGroupPr.m_wsChr); m_pXmlWrite->WriteNodeEnd(L"mtext",false,false); - m_wsAnnotationStarMath += wsNode == L"mover"? L"csup ":L"csub "; + StyleClosing(stStyle,m_pXmlWrite); m_wsAnnotationStarMath += L"\u0026quot;" + stGroupPr.m_wsChr + L"\u0026quot; "; + m_wsAnnotationStarMath += wsNode == L"mover"? L"csup ":L"csub "; + ConversionElement(pGroup->m_oElement.GetPointer()); m_pXmlWrite->WriteNodeEnd(wsNode,false,false); } } @@ -1889,15 +1899,6 @@ namespace StarMath break; } case StarMath::TypeElement::letter: - { - pXmlWrite->WriteNodeBegin(L"mi",true); - pXmlWrite->WriteAttribute(L"mathvariant",L"italic"); - pXmlWrite->WriteNodeEnd(L"w",true,false); - pXmlWrite->WriteString(XmlUtils::EncodeXmlString(m_wsElement)); - pXmlWrite->WriteNodeEnd(L"mi",false,false); - wsAnnotation += m_wsElement + L" "; - break; - } case StarMath::TypeElement::letter_u32: { COOXml2Odf::MTextRecording(pXmlWrite,wsAnnotation,m_wsElement); @@ -2326,7 +2327,14 @@ namespace StarMath StStyleMenClose stStyle; if(GetAttribute() != nullptr) COneElement::ConversionAttribute(GetAttribute(),stStyle,pXmlWrite,wsAnnotation); - if(!m_wsAnnotation.empty()) + if(!m_wsAnnotation.empty() && m_wsAnnotation == L"space") + { + pXmlWrite->WriteNodeBegin(L"mspace",true); + pXmlWrite->WriteAttribute(L"width",L"2em"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + wsAnnotation += L"~ "; + } + else if(!m_wsAnnotation.empty()) { pXmlWrite->WriteNodeBegin(L"mi",true); pXmlWrite->WriteAttribute(L"mathvariant",L"normal"); @@ -2346,6 +2354,7 @@ namespace StarMath std::wstring CSpecialChar::DefinitionSpecialChar(const std::wstring &wsSymbol) { if(L"\u2205" == wsSymbol) return L"emptyset"; + else if(L"\u0026" == wsSymbol) return L"space"; else if(L"\u2135" == wsSymbol) return L"aleph"; else if(L"\u2115" == wsSymbol) return L"setN"; else if(L"\u2124" == wsSymbol) return L"setZ"; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h index fbefb302ca..c89abbd3e1 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.h @@ -137,6 +137,7 @@ namespace StarMath std::stack m_stAttribute; std::wstring m_wsBaseColor; unsigned int m_uiBaseSize; + bool m_bStretchyAcc; }; class COneElement { @@ -256,8 +257,6 @@ namespace StarMath CSpecialChar(const std::wstring& wsSymbol,const std::wstring& wsAnnotation):m_wsSymbol(wsSymbol),m_wsAnnotation(wsAnnotation) { SetType(TypeElement::SpecialSymbol); - if(m_wsSymbol == L"\u0026") - m_wsSymbol = L"\u0026amp;"; } virtual ~CSpecialChar(); void Parse(std::wstring::iterator&itStart,std::wstring::iterator&itEnd,COneElement*& pElement) override; diff --git a/X2tConverter/test/TestOOOXml2Odf/test.cpp b/X2tConverter/test/TestOOOXml2Odf/test.cpp index 1ea3ecdcaa..3eff835e5c 100644 --- a/X2tConverter/test/TestOOOXml2Odf/test.cpp +++ b/X2tConverter/test/TestOOOXml2Odf/test.cpp @@ -382,8 +382,8 @@ TEST(OOXml2OdfTest,LimLow) StMath StCorrect,StResult; StResult.m_wsSemantic = oTest.GetOdf(); StResult.m_wsAnnotation = oTest.GetAnnotation(); - StCorrect.m_wsSemantic = L"lim12"; - StCorrect.m_wsAnnotation = L"lim csub { 1 } 2 "; + StCorrect.m_wsSemantic = L"lim12"; + StCorrect.m_wsAnnotation = L""lim" csub { 1 } 2 "; EXPECT_EQ(StResult,StCorrect); } TEST(OOXml2OdfTest,Func) @@ -397,8 +397,8 @@ TEST(OOXml2OdfTest,Func) StMath StCorrect,StResult; StResult.m_wsSemantic = oTest.GetOdf(); StResult.m_wsAnnotation = oTest.GetAnnotation(); - StCorrect.m_wsSemantic = L"coth5"; - StCorrect.m_wsAnnotation = L"coth 5 "; + StCorrect.m_wsSemantic = L"coth5"; + StCorrect.m_wsAnnotation = L""coth" 5 "; EXPECT_EQ(StResult,StCorrect); } TEST(OOXml2OdfTest,LimUpp) @@ -439,7 +439,7 @@ TEST(OOXml2OdfTest,Example2) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"x=-b\u00B1b2-4ac2ax = { - b +- sqrt { b ^ {2 } - 4 ac } } over { 2a } "; + std::wstring wsOdf = L"x=-b\xB1b2-4ac2a"x" = { - "b" +- sqrt { "b" ^ {2 } - 4 "ac" } } over { 2a } "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,Example1) @@ -450,7 +450,7 @@ TEST(OOXml2OdfTest,Example1) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"(x+a)n=\x2211k=0n(nk)xkan-kleft ( x + a right ) ^ {n } "=" sum from {k = 0 } to {n } left ( binom { n } { k } right ) x ^ {k } a ^ {n - k } "; + std::wstring wsOdf = L"(x+a)n=\x2211k=0n(nk)xkan-kleft ( "x" + "a" right ) ^ {"n" } "=" sum from {"k" = 0 } to {"n" } left ( binom { "n" } { "k" } right ) "x" ^ {"k" } "a" ^ {"n" - "k" } "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,Example3) @@ -461,7 +461,7 @@ TEST(OOXml2OdfTest,Example3) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"A=\u03C0r2A = %pi r ^ {2 } "; + std::wstring wsOdf = L"A=\x3C0r2"A" = %pi "r" ^ {2 } "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,LimLowWithRelation) @@ -472,7 +472,7 @@ TEST(OOXml2OdfTest,LimLowWithRelation) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"limn\u2192\u221E(1)lim csub { n toward infinity } left ( 1 right ) "; + std::wstring wsOdf = L"limn\x2192\x221E(1)"lim" csub { "n" toward infinity } left ( 1 right ) "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,HarmonicSeries) @@ -483,7 +483,7 @@ TEST(OOXml2OdfTest,HarmonicSeries) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"(1+1n)ncolor red ital left ( 1 color hex 70AD47 "+"{ 1 } over { n } right ) ^ {color red n } "; + std::wstring wsOdf = L"(1+1n)ncolor red ital left ( 1 color hex 70AD47 "+"{ 1 } over { "n" } right ) ^ {color red "n" } "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,Example8) @@ -494,7 +494,7 @@ TEST(OOXml2OdfTest,Example8) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"sin\u03B1\u00B1sin\u03B2=2sin12(\u03B1\u00B1\u03B2)cos12(\u03B1\u2213\u03B2)sin %alpha +- sin %beta = 2 sin { 1 } over { 2 } left ( %alpha +- %beta right ) cos { 1 } over { 2 } left ( %alpha -+ %beta right ) "; + std::wstring wsOdf = L"sin\x3B1\xB1sin\x3B2=2sin12(\x3B1\xB1\x3B2)cos12(\x3B1\x2213\x3B2)"sin" %alpha +- "sin" %beta = 2 "sin" { 1 } over { 2 } left ( %alpha +- %beta right ) "cos" { 1 } over { 2 } left ( %alpha -+ %beta right ) "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,Example7) @@ -505,7 +505,7 @@ TEST(OOXml2OdfTest,Example7) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"a2+b2=c2a ^ {2 } + b ^ {2 } "=" c ^ {2 } "; + std::wstring wsOdf = L"a2+b2=c2"a" ^ {2 } + "b" ^ {2 } "=" "c" ^ {2 } "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,Example9) @@ -516,7 +516,7 @@ TEST(OOXml2OdfTest,Example9) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"cos\u03B1+cos\u03B2=2cos12(\u03B1+\u03B2)cos12(\u03B1-\u03B2)cos %alpha + cos %beta = 2 cos { 1 } over { 2 } left ( %alpha + %beta right ) cos { 1 } over { 2 } left ( %alpha - %beta right ) "; + std::wstring wsOdf = L"cos\x3B1+cos\x3B2=2cos12(\x3B1+\x3B2)cos12(\x3B1-\x3B2)"cos" %alpha + "cos" %beta = 2 "cos" { 1 } over { 2 } left ( %alpha + %beta right ) "cos" { 1 } over { 2 } left ( %alpha - %beta right ) "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,TextMrPr) @@ -538,7 +538,7 @@ TEST(OOXml2OdfTest,ColorByName) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"qb{ color midnightblue q } over { color orangered b } "; + std::wstring wsOdf = L"qb{ color midnightblue "q" } over { color orangered "b" } "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,EmptyNumerator) @@ -571,7 +571,7 @@ TEST(OOXml2OdfTest,ExceptionsDiacritics) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"1\u21942b\u2190abc\u21BC1 csup "\u2194" ` bold ital { 2b } csup "\u2190" ` abc csup "\u21BC" "; + std::wstring wsOdf = L"1\x21942b\x2190abc\x21BC1 csup "\x2194" ` bold ital { 2b } csup "\x2190" ` "abc" csup "\x21BC" "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,ExceptionsGroupChr) @@ -582,7 +582,7 @@ TEST(OOXml2OdfTest,ExceptionsGroupChr) pElement->fromXML(oReader); StarMath::COOXml2Odf oTest; oTest.StartConversion(pElement); - std::wstring wsOdf = L"1\u21942b\u21D4dia\u21D0bold ital 1 csub "\u2194" 2b csub "\u21D4" bold ital dia csub "\u21D0" "; + std::wstring wsOdf = L"\x21941\x21D42b\x21D0diabold ital "\x2194" csup bold ital 1 bold ital "\x21D4" csup 2b bold ital "\x21D0" csup bold ital "dia" "; EXPECT_EQ(oTest.GetOdf(),wsOdf); } TEST(OOXml2OdfTest,EmptyMatrix) From 0385087f98feed502bf213713c0c855403c32b72 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Tue, 20 May 2025 13:43:28 +0300 Subject: [PATCH 4/4] Fix prev commit --- .../Converter/StarMath2OOXML/cooxml2odf.cpp | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp index de6b0c2ed8..0d15556e26 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cooxml2odf.cpp @@ -80,6 +80,11 @@ namespace StarMath ConversionBox(dynamic_cast(pNode)); break; } + case OOX::EElementType::et_m_borderBox: + { + ConversionBorderBox(dynamic_cast(pNode)); + break; + } case OOX::EElementType::et_m_m: { ConversionMatrix(dynamic_cast(pNode)); @@ -798,6 +803,12 @@ namespace StarMath return; NodeDefinition(pBox->m_oElement.GetPointer()); } + void COOXml2Odf::ConversionBorderBox(OOX::Logic::CBorderBox *pBorderBox) + { + if(pBorderBox == nullptr) + return; + NodeDefinition(pBorderBox->m_oElement.GetPointer()); + } StValuePr* COOXml2Odf::ConversionRunProperties(OOX::Logic::CRunProperty *pRPr) { StValuePr* stTempPr = new StValuePr; @@ -1146,8 +1157,17 @@ namespace StarMath { if(pMr->m_arrItems[i]->getType() == OOX::EElementType::et_m_e) { + OOX::Logic::CElement* pElement = dynamic_cast(pMr->m_arrItems[i]); m_pXmlWrite->WriteNodeBegin(L"mtd",false); - ConversionElement(dynamic_cast(pMr->m_arrItems[i])); + if(!pElement->m_arrItems.empty()) + ConversionElement(pElement); + else + { + m_pXmlWrite->WriteNodeBegin(L"mspace",true); + m_pXmlWrite->WriteAttribute(L"width",L"2em"); + m_pXmlWrite->WriteNodeEnd(L"w",true,true); + m_wsAnnotationStarMath += L"~ "; + } if(i+1 < pMr->m_arrItems.size()) m_wsAnnotationStarMath += L"# "; m_pXmlWrite->WriteNodeEnd(L"mtd",false,false);