fix bug ooxml->odf. writing tests

This commit is contained in:
Dmitry Okunev
2024-10-25 12:31:12 +03:00
parent 1de2807051
commit ffe85bd64f
3 changed files with 225 additions and 29 deletions

View File

@ -33,9 +33,9 @@ namespace StarMath
m_pXmlWrite->WriteNodeEnd(L"w",true,false);
m_pXmlWrite->WriteString(m_wsAnnotationStarMath);
EndOdf();
//NSFile::CFileBinary oOriginal;
//oOriginal.CreateFile(L"X:/Rabotka/Original.txt");
//oOriginal.WriteStringUTF8(m_pXmlWrite->GetXmlString());
NSFile::CFileBinary oOriginal;
oOriginal.CreateFile(L"X:/Rabotka/Original.txt");
oOriginal.WriteStringUTF8(m_pXmlWrite->GetXmlString());
}
void COOXml2Odf::NodeDefinition(OOX::WritingElement *pNode,const bool& bMatrix)
{
@ -381,6 +381,11 @@ namespace StarMath
m_wsAnnotationStarMath += L"right " + BracketForAnnotation(stDelPr.m_wsEndBracket,false) + L" ";
m_pXmlWrite->WriteNodeEnd(L"mrow",false,false);
StyleClosing(iStyle,m_pXmlWrite);
if(iStyle && !m_stAttribute.empty())
{
m_stAttribute.top()->Release();
m_stAttribute.pop();
}
}
std::wstring COOXml2Odf::BracketForAnnotation(const std::wstring &wsBracket, const bool &bBeg)
{
@ -502,12 +507,16 @@ namespace StarMath
if(pMRun == nullptr) return arLine;
if(pMRun->m_oRPr.GetPointer() != nullptr)
stRpr = ConversionRunProperties(pMRun->m_oRPr.GetPointer());
else if (pMRun->m_oARPr.GetPointer() != nullptr)
ConversionARpr(pMRun->m_oARPr.GetPointer(),stRpr);
if(pMRun->m_oMRPr.GetPointer() != nullptr)
ConversionMRunProperties(pMRun->m_oMRPr.GetPointer(),stRpr);
if(pMRun->m_oMText.GetPointer() != nullptr)
arLine = ConversionMT(pMRun->m_oMText.GetPointer(),stRpr);
if(stRpr != nullptr && !arLine.empty())
{
if(!m_stAttribute.empty())
AttributeCheck(m_stAttribute.top(),stRpr);
for(int i = 0; i<arLine.size();i++)
{
if(i != 0 )
@ -526,7 +535,7 @@ namespace StarMath
StValuePr pMdPr;
if(pDelPr == nullptr)
return pMdPr;
iStyle = ConversionCtrlPr(pDelPr->m_oCtrlPr.GetPointer());
iStyle = ConversionCtrlPr(pDelPr->m_oCtrlPr.GetPointer(),true);
pMdPr.m_wsBegBracket = ConversionBegBracket(dynamic_cast<OOX::Logic::CBegChr*>(pDelPr->m_oBegChr.GetPointer()));
pMdPr.m_wsEndBracket = ConversionEndBracket(dynamic_cast<OOX::Logic::CEndChr*>(pDelPr->m_oEndChr.GetPointer()));
return pMdPr;
@ -617,6 +626,22 @@ namespace StarMath
else
return false;
}
void COOXml2Odf::AttributeCheck(StValuePr *&pParent, StValuePr *&pChild)
{
if(pParent == nullptr || pChild == nullptr)
return;
else
{
if(pParent->m_wsColor == pChild->m_wsColor)
pChild->m_wsColor.clear();
if(pParent->m_iSize == pChild->m_iSize)
pChild->m_iSize = 0;
if(pParent->m_enStyle == pChild->m_enStyle)
pChild->m_enStyle = SimpleTypes::EStyle::stylePlain;
if(pParent->m_enFont == pChild->m_enFont)
pChild->m_enFont = StarMath::TypeFont::empty;
}
}
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;
@ -879,6 +904,11 @@ namespace StarMath
}
m_pXmlWrite->WriteNodeEnd(L"mtable",false,false);
StyleClosing(iStyle,m_pXmlWrite);
if(iStyle != 0 && !m_stAttribute.empty())
{
m_stAttribute.top()->Release();
m_stAttribute.pop();
}
m_wsAnnotationStarMath += L"} ";
}
void COOXml2Odf::ConversionMr(OOX::Logic::CMr *pMr)
@ -899,15 +929,23 @@ namespace StarMath
}
m_pXmlWrite->WriteNodeEnd(L"mtr",false,false);
}
unsigned int COOXml2Odf::ConversionCtrlPr(OOX::Logic::CCtrlPr *pCtrlPr)
unsigned int COOXml2Odf::ConversionCtrlPr(OOX::Logic::CCtrlPr *pCtrlPr, const bool &bDelimiter)
{
if(pCtrlPr == nullptr)
return 0;
StValuePr* pValue;
unsigned int iStyle(0);
if(pCtrlPr->m_oRPr.GetPointer() != nullptr)
pValue = ConversionRunProperties(pCtrlPr->m_oRPr.GetPointer());
else if(pCtrlPr->m_oARPr.GetPointer() != nullptr)
ConversionARpr(pCtrlPr->m_oARPr.GetPointer(),pValue);
if(pValue != nullptr)
{
unsigned int iStyle(0);
StValuePr* pValue = ConversionRunProperties(dynamic_cast<OOX::Logic::CRunProperty*>(pCtrlPr->m_oRPr.GetPointer()));
COneElement::ConversionAttribute(pValue,iStyle,m_pXmlWrite,m_wsAnnotationStarMath);
if(!m_stAttribute.empty())
AttributeCheck(m_stAttribute.top(),pValue);
COneElement::ConversionAttribute(pValue,iStyle,m_pXmlWrite,m_wsAnnotationStarMath,bDelimiter);
if(bDelimiter)
m_stAttribute.push(pValue);
return iStyle;
}
return 0;
@ -916,7 +954,7 @@ namespace StarMath
{
if(pMPr == nullptr)
return 0;
return ConversionCtrlPr(dynamic_cast<OOX::Logic::CCtrlPr*>(pMPr->m_oCtrlPr.GetPointer()));
return ConversionCtrlPr(dynamic_cast<OOX::Logic::CCtrlPr*>(pMPr->m_oCtrlPr.GetPointer()),true);
}
std::wstring COOXml2Odf::GetOdf()
{
@ -978,7 +1016,7 @@ namespace StarMath
return;
ConversionVectorWritingElement(pDeg->m_arrItems);
}
void COOXml2Odf::ConversionGroupChr(OOX::Logic::CGroupChr *pGroup)
void COOXml2Odf::ConversionGroupChr(OOX::Logic::CGroupChr *pGroup, const bool &bElement)
{
if(pGroup == nullptr)
return;
@ -1005,27 +1043,43 @@ namespace StarMath
}
}
}
m_pXmlWrite->WriteNodeBegin(wsNode,false);
if(!wsAnnotation.empty())
{
m_pXmlWrite->WriteNodeBegin(wsNode,false);
ConversionElement(pGroup->m_oElement.GetPointer());
RecordingMoNode(stGroupPr.m_wsChr,m_pXmlWrite);
m_wsAnnotationStarMath += wsAnnotation;
m_pXmlWrite->WriteNodeEnd(wsNode,false,false);
m_pXmlWrite->WriteNodeBegin(L"mspace",true);
m_pXmlWrite->WriteNodeEnd(L"w",true,true);
m_wsAnnotationStarMath += L"` ";
if(bElement)
{
WritingbBracketsFromTopBottom(wsNode,stGroupPr.m_wsChr,wsAnnotation,pGroup->m_oElement.GetPointer());
}
else
{
m_pXmlWrite->WriteNodeBegin(wsNode,false);
WritingbBracketsFromTopBottom(wsNode,stGroupPr.m_wsChr,wsAnnotation,pGroup->m_oElement.GetPointer());
m_pXmlWrite->WriteNodeBegin(L"mspace",true);
m_pXmlWrite->WriteNodeEnd(L"w",true,true);
m_wsAnnotationStarMath += L"` ";
m_pXmlWrite->WriteNodeEnd(wsNode,false,false);
}
}
else
{
m_pXmlWrite->WriteNodeBegin(wsNode,false);
ConversionElement(pGroup->m_oElement.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 ";
m_wsAnnotationStarMath += L"\u0026quot;" + stGroupPr.m_wsChr + L"\u0026quot; ";
m_pXmlWrite->WriteNodeEnd(wsNode,false,false);
}
}
void COOXml2Odf::WritingbBracketsFromTopBottom(const std::wstring &wsNode, const std::wstring &wsChr, const std::wstring &wsAnnotation, OOX::Logic::CElement *pElement)
{
m_pXmlWrite->WriteNodeBegin(wsNode,false);
ConversionElement(pElement);
if(!wsChr.empty())
RecordingMoNode(wsChr,m_pXmlWrite);
else
RecordingMoNode(L"\u23DF",m_pXmlWrite);
m_wsAnnotationStarMath += wsAnnotation;
m_pXmlWrite->WriteNodeEnd(wsNode,false,false);
}
StValuePr COOXml2Odf::ConversionGroupChrPr(OOX::Logic::CGroupChrPr *pGroupPr)
@ -1140,8 +1194,13 @@ namespace StarMath
if(pLimLow == nullptr)
return;
m_pXmlWrite->WriteNodeBegin(L"munder",false);
ConversionElement(pLimLow->m_oElement.GetPointer());
m_wsAnnotationStarMath += L"csub ";
if(pLimLow->m_oElement.GetPointer()->m_arrItems.size() == 1 && pLimLow->m_oElement.GetPointer()->m_arrItems[0]->getType() == OOX::EElementType::et_m_groupChr)
ConversionGroupChr(dynamic_cast<OOX::Logic::CGroupChr*>(pLimLow->m_oElement.GetPointer()->m_arrItems[0]),true);
else
{
ConversionElement(pLimLow->m_oElement.GetPointer());
m_wsAnnotationStarMath += L"csub ";
}
ConversionLim(pLimLow->m_oLim.GetPointer());
m_pXmlWrite->WriteNodeEnd(L"munder",false,false);
}
@ -1150,8 +1209,13 @@ namespace StarMath
if(pLimUpp == nullptr)
return;
m_pXmlWrite->WriteNodeBegin(L"mover",false);
ConversionElement(pLimUpp->m_oElement.GetPointer());
m_wsAnnotationStarMath += L"csup ";
if(pLimUpp->m_oElement.GetPointer()->m_arrItems.size() == 1 && pLimUpp->m_oElement.GetPointer()->m_arrItems[0]->getType() == OOX::EElementType::et_m_groupChr)
ConversionGroupChr(dynamic_cast<OOX::Logic::CGroupChr*>(pLimUpp->m_oElement.GetPointer()->m_arrItems[0]),true);
else
{
ConversionElement(pLimUpp->m_oElement.GetPointer());
m_wsAnnotationStarMath += L"csup ";
}
ConversionLim(pLimUpp->m_oLim.GetPointer());
m_pXmlWrite->WriteNodeEnd(L"mover",false,false);
}
@ -1253,7 +1317,7 @@ namespace StarMath
{
return m_stAttribute;
}
void COneElement::ConversionAttribute(StValuePr* pAttribute, unsigned int &iStyle, XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation)
void COneElement::ConversionAttribute(StValuePr* pAttribute, unsigned int &iStyle, XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation,const bool& bDelimiter)
{
if(pAttribute == nullptr)
return;
@ -1330,8 +1394,8 @@ namespace StarMath
pXmlWrite->WriteNodeEnd(L"w",true,false);
iStyle++;
}
// delete pAttribute;
pAttribute->Release();
if(!bDelimiter)
pAttribute->Release();
}
bool COneElement::CheckStyle()
{
@ -1825,6 +1889,60 @@ namespace StarMath
else if(L"\u22EE" == wsSymbol) return L"dotsvert";
else if(L"\u22F0" == wsSymbol) return L"dotsup";
else if(L"\u22F1" == wsSymbol) return L"dotsdown";
else if(L"\u0391" == wsSymbol) return L"%ALPHA";
else if(L"\u03B1" == wsSymbol) return L"%alpha";
else if(L"\u0396" == wsSymbol) return L"%ZETA";
else if(L"\u03B6" == wsSymbol) return L"%zeta";
else if(L"\u039B" == wsSymbol) return L"%LAMBDA";
else if(L"\u03BB" == wsSymbol) return L"%lambda";
else if(L"\u03A0" == wsSymbol) return L"%PI";
else if(L"\u03C0" == wsSymbol) return L"%pi";
else if(L"\u03A6" == wsSymbol) return L"%PHI";
else if(L"\u03C6" == wsSymbol) return L"%phi";
else if(L"\u03B5" == wsSymbol) return L"%varepsilon";
else if(L"\u03B9" == wsSymbol) return L"%iota";
else if(L"\u0399" == wsSymbol) return L"%IOTA";
else if(L"\u03BE" == wsSymbol) return L"%xi";
else if(L"\u039E" == wsSymbol) return L"%XI";
else if(L"\u03F1" == wsSymbol) return L"%varrho";
else if(L"\u0392" == wsSymbol) return L"%BETA";
else if(L"\u03B2" == wsSymbol) return L"%beta";
else if(L"\u0397" == wsSymbol) return L"%ETA";
else if(L"\u03B7" == wsSymbol) return L"%eta";
else if(L"\u039C" == wsSymbol) return L"%MU";
else if(L"\u03BC" == wsSymbol) return L"%mu";
else if(L"\u03A1" == wsSymbol) return L"%RHO";
else if(L"\u03C1" == wsSymbol) return L"%rho";
else if(L"\u03A7" == wsSymbol) return L"%CHI";
else if( L"\u03C7" == wsSymbol) return L"%chi";
else if(L"\u03BA" == wsSymbol) return L"%kappa";
else if(L"\u039A" == wsSymbol) return L"%KAPPA";
else if(L"\u039F" == wsSymbol) return L"%OMICRON";
else if(L"\u03BF" == wsSymbol) return L"%omicron";
else if(L"\u03A3" == wsSymbol) return L"%SIGMA";
else if(L"\u03C3" == wsSymbol) return L"%sigma";
else if(L"\u03C6" == wsSymbol) return L"%varphi";
else if(L"\u0393" == wsSymbol) return L"%GAMMA";
else if(L"\u03B3" == wsSymbol) return L"%gamma";
else if(L"\u0398" == wsSymbol) return L"%THETA";
else if(L"\u03B8" == wsSymbol) return L"%theta";
else if(L"\u039D" == wsSymbol) return L"%NU";
else if(L"\u03BD" == wsSymbol) return L"%nu";
else if(L"\u03A8" == wsSymbol) return L"%PSI";
else if(L"\u03C8" == wsSymbol) return L"%psi";
else if(L"\u03DB" == wsSymbol) return L"%varsigma";
else if(L"\u0394" == wsSymbol) return L"%DELTA";
else if(L"\u03B4" == wsSymbol) return L"%delta";
else if(L"\u03A4" == wsSymbol) return L"%TAU";
else if(L"\u03C4" == wsSymbol) return L"%tau";
else if(L"\u03A9" == wsSymbol) return L"%OMEGA";
else if(L"\u03C9" == wsSymbol) return L"%omega";
else if(L"\u03D6" == wsSymbol) return L"%varphi";
else if(L"\u0395" == wsSymbol) return L"%EPSILON";
else if(L"\u03B5" == wsSymbol) return L"%epsilon";
else if(L"\u03A5" == wsSymbol) return L"%UPSILON";
else if(L"\u03C5" == wsSymbol) return L"%upsilon";
else if(L"\u03D1" == wsSymbol) return L"%vartheta";
else return L"";
}
}

View File

@ -11,6 +11,7 @@
#include <utility>
#include <cstring>
#include <sstream>
#include <stack>
namespace StarMath
{
@ -52,7 +53,7 @@ namespace StarMath
void ConversionMath(OOX::Logic::COMath* pMath);
std::vector<COneElement *> ConversionMT(OOX::Logic::CMText* pMt, const StValuePr* pValue);
void ConversionMF(OOX::Logic::CFraction* pMf);
unsigned int ConversionCtrlPr(OOX::Logic::CCtrlPr* pCtrlPr);
unsigned int ConversionCtrlPr(OOX::Logic::CCtrlPr* pCtrlPr, const bool& bDelimiter = false);
unsigned int ConversionCMPr(OOX::Logic::CMPr* pMPr);
StValuePr ConversionFpr(OOX::Logic::CFPr* pFpr);
std::wstring ConversionType(OOX::Logic::CType* pType);
@ -78,8 +79,9 @@ namespace StarMath
void ConversionRad(OOX::Logic::CRad* pRad);
unsigned int ConversionRadPr(OOX::Logic::CRadPr* pRadPr,bool& bDeg);
void ConversionDeg(OOX::Logic::CDeg* pDeg);
void ConversionGroupChr(OOX::Logic::CGroupChr* pGroup);
void ConversionGroupChr(OOX::Logic::CGroupChr* pGroup,const bool& bElement = false);
StValuePr ConversionGroupChrPr(OOX::Logic::CGroupChrPr* pGroupPr);
void WritingbBracketsFromTopBottom(const std::wstring& wsNode,const std::wstring& wsChr,const std::wstring& wsAnnotation,OOX::Logic::CElement* pElement);
void ConversionBar(OOX::Logic::CBar* pBar);
StValuePr ConversionBarPr(OOX::Logic::CBarPr* pBarPr,unsigned int& iStyle);
void ConversionSPre(OOX::Logic::CSPre* pSPre);
@ -106,6 +108,7 @@ namespace StarMath
static bool IsAlpha(const std::wstring& wsAlpha);
static void StyleClosing(const unsigned int &iStyle, XmlUtils::CXmlWriter* pXmlWrite);
bool ComparingAttributes(StValuePr* pRight, StValuePr* pLeft);
void AttributeCheck(StValuePr*& pParent, StValuePr*& pChild);
void EndOdf();
std::wstring GetOdf();
std::wstring GetAnnotation();
@ -113,6 +116,7 @@ namespace StarMath
private:
XmlUtils::CXmlWriter* m_pXmlWrite;
std::wstring m_wsAnnotationStarMath,m_wsSemantic;
std::stack<StValuePr*> m_stAttribute;
};
class COneElement
{
@ -127,7 +131,7 @@ namespace StarMath
TypeElement GetType();
void SetAttribute(StValuePr* stAttribute);
StValuePr* GetAttribute();
static void ConversionAttribute(StValuePr* pAttribute,unsigned int & iStyle ,XmlUtils::CXmlWriter* pXmlWrite,std::wstring& wsAnnotation);
static void ConversionAttribute(StValuePr* pAttribute, unsigned int & iStyle , XmlUtils::CXmlWriter* pXmlWrite, std::wstring& wsAnnotation, const bool &bDelimiter = false);
bool CheckStyle();
unsigned int GetStyle();
private:

View File

@ -401,6 +401,80 @@ TEST(OOXml2OdfTest,Func)
StCorrect.m_wsAnnotation = L"coth 5 ";
EXPECT_EQ(StResult,StCorrect);
}
TEST(OOXml2OdfTest,LimUpp)
{
XmlUtils::CXmlLiteReader oReader;
OOX::WritingElement* pElement = new OOX::Logic::CLimUpp;
if(oReader.FromString(L"<m:limUpp> <m:limUppPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:i/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:limUppPr> <m:e> <m:groupChr> <m:groupChrPr> <m:chr m:val=\"\u23DE\"/> <m:pos m:val=\"top\"/> <m:vertJc m:val=\"bot\"/> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:i/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:groupChrPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>1</m:t> </m:r> </m:e> </m:groupChr> </m:e> <m:lim> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>2</m:t> </m:r> </m:lim> </m:limUpp>") && oReader.ReadNextNode())
pElement->fromXML(oReader);
StarMath::COOXml2Odf oTest;
oTest.NodeDefinition(pElement);
StMath StCorrect,StResult;
StResult.m_wsSemantic = oTest.GetOdf();
StResult.m_wsAnnotation = oTest.GetAnnotation();
StCorrect.m_wsSemantic = L"<mover><mover><mn>1</mn><mo stretchy=\"false\">\u23DE</mo></mover><mn>2</mn></mover>";
StCorrect.m_wsAnnotation = L"1 overbrace 2 ";
EXPECT_EQ(StResult,StCorrect);
}
TEST(OOXml2OdfTest,LimLowWithGroup)
{
XmlUtils::CXmlLiteReader oReader;
OOX::WritingElement* pElement = new OOX::Logic::CLimLow();
if(oReader.FromString(L"<m:limLow> <m:limLowPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:i/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:limLowPr> <m:e> <m:groupChr> <m:groupChrPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:i/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:groupChrPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>3</m:t> </m:r> </m:e> </m:groupChr> </m:e> <m:lim> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>4</m:t> </m:r> </m:lim> </m:limLow>") && oReader.ReadNextNode())
pElement->fromXML(oReader);
StarMath::COOXml2Odf oTest;
oTest.NodeDefinition(pElement);
StMath StCorrect,StResult;
StResult.m_wsSemantic = oTest.GetOdf();
StResult.m_wsAnnotation = oTest.GetAnnotation();
StCorrect.m_wsSemantic = L"<munder><munder><mn>3</mn><mo stretchy=\"false\">\u23DF</mo></munder><mn>4</mn></munder>";
StCorrect.m_wsAnnotation = L"3 underbrace 4 ";
EXPECT_EQ(StResult,StCorrect);
}
TEST(OOXml2OdfTest,Example2)
{
XmlUtils::CXmlLiteReader oReader;
OOX::WritingElement* pElement = new OOX::Logic::COMathPara();
if(oReader.FromString(L"<m:oMathPara> <m:oMath> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>x</m:t> </m:r> <m:r> <m:rPr> <m:sty m:val=\"p\"/> </m:rPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>=</m:t> </m:r> <m:f> <m:fPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:fPr> <m:num> <m:r> <m:rPr> <m:sty m:val=\"p\"/> </m:rPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>-</m:t> </m:r> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>b</m:t> </m:r> <m:r> <m:rPr> <m:sty m:val=\"p\"/> </m:rPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>\u00B1</m:t> </m:r> <m:rad> <m:radPr> <m:degHide m:val=\"1\"/> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:radPr> <m:deg/> <m:e> <m:sSup> <m:sSupPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:sSupPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>b</m:t> </m:r> </m:e> <m:sup> <m:r> <m:rPr> <m:sty m:val=\"p\"/> </m:rPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>2</m:t> </m:r> </m:sup> </m:sSup> <m:r> <m:rPr> <m:sty m:val=\"p\"/> </m:rPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>-4</m:t> </m:r> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>ac</m:t> </m:r> </m:e> </m:rad> </m:num> <m:den> <m:r> <m:rPr> <m:sty m:val=\"p\"/> </m:rPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>2</m:t> </m:r> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>a</m:t> </m:r> </m:den> </m:f> </m:oMath> </m:oMathPara>") && oReader.ReadNextNode())
pElement->fromXML(oReader);
StarMath::COOXml2Odf oTest;
oTest.StartConversion(pElement);
std::wstring wsOdf = L"<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mrow><mi mathvariant=\"italic\">x</mi><mo stretchy=\"false\">=</mo></mrow><mfrac><mrow><mrow><mo stretchy=\"false\">-</mo><mi mathvariant=\"italic\">b</mi></mrow><mo stretchy=\"false\">\u00B1</mo></mrow><sqrt><msup><mi mathvariant=\"italic\">b</mi><mn>2</mn></msup><mrow><mo stretchy=\"false\">-</mo><mn>4</mn></mrow><mi mathvariant=\"italic\">ac</mi></sqrt><mn>2a</mn></mfrac></mrow><annotation encoding=\"StarMath 5.0\">x = { - b +- sqrt { b ^ {2 } - 4 ac } } over { 2a } </annotation></semantics></math>";
EXPECT_EQ(oTest.GetOdf(),wsOdf);
}
//TEST(OOXml2OdfTest,Example5)
//{
// XmlUtils::CXmlLiteReader oReader;
// OOX::WritingElement* pElement = new OOX::Logic::COMathPara();
// if(oReader.FromString(L"<m:oMathPara> <m:oMath> <m:sSup> <m:sSupPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:sSupPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>e</m:t> </m:r> </m:e> <m:sup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>x</m:t> </m:r> </m:sup> </m:sSup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>=1+</m:t> </m:r> <m:f> <m:fPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:fPr> <m:num> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>x</m:t> </m:r> </m:num> <m:den> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>1\u0021</m:t> </m:r> </m:den> </m:f> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>+</m:t> </m:r> <m:f> <m:fPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:fPr> <m:num> <m:sSup> <m:sSupPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:sSupPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>x</m:t> </m:r> </m:e> <m:sup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>2</m:t> </m:r> </m:sup> </m:sSup> </m:num> <m:den> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>2\u0021</m:t> </m:r> </m:den> </m:f> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>+</m:t> </m:r> <m:f> <m:fPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:fPr> <m:num> <m:sSup> <m:sSupPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:sSupPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>x</m:t> </m:r> </m:e> <m:sup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>3</m:t> </m:r> </m:sup> </m:sSup> </m:num> <m:den> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>3\u0021</m:t> </m:r> </m:den> </m:f> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>+\u2026,</m:t> </m:r> <m:r> <m:rPr> <m:sty m:val=\"p\"/> </m:rPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t xml:space=\"preserve\"> </m:t> </m:r> <m:r> <m:rPr> <m:sty m:val=\"p\"/> </m:rPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t xml:space=\"preserve\"> </m:t> </m:r> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>-\u221E\u003Cx\u003C\u221E</m:t> </m:r> </m:oMath> </m:oMathPara> ") && oReader.ReadNextNode())
// pElement->fromXML(oReader);
// StarMath::COOXml2Odf oTest;
// oTest.StartConversion(pElement);
// std::wstring wsOdf = L"<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msup><mi mathvariant=\"italic\">e</mi><mi mathvariant=\"italic\">x</mi></msup><mrow><mrow><mo stretchy=\"false\">=</mo><mn>1</mn></mrow><mo stretchy=\"false\">+</mo></mrow><mfrac><mi mathvariant=\"italic\">x</mi><mn>1</mn><mtext>\u0021</mtext></mfrac><mrow><mo stretchy=\"false\">+</mo></mrow><mfrac><msup><mi mathvariant=\"italic\">x</mi><mn>2</mn></msup><mn>2</mn><mtext>\u0021</mtext></mfrac><mrow><mo stretchy=\"false\">+</mo></mrow><mfrac><msup><mi mathvariant=\"italic\">x</mi><mn>3</mn></msup><mn>3</mn><mtext>\u0021</mtext></mfrac><mrow><mo stretchy=\"false\">+</mo><mi mathvariant=\"normal\">\u2026</mi></mrow><mtext>,</mtext><mspace /><mspace /><mrow><mrow><mrow><mo stretchy=\"false\">-</mo><mi mathvariant=\"normal\">\u221E</mi></mrow><mo stretchy=\"false\">&lt;</mo><mi mathvariant=\"italic\">x</mi></mrow><mo stretchy=\"false\">&lt;</mo><mi mathvariant=\"normal\">\221E</mi></mrow></mrow><annotation encoding=\"StarMath 5.0\">e ^ {x } = 1 + { x } over { 1 &quot;\u0021&quot; } + { x ^ {2 } } over { 2 &quot;\u0021&quot; } + { x ^ {3 } } over { 3 &quot;\u0021&quot; } + dotslow &quot;,&quot; ` ` - infinity &lt; x &lt; infinity </annotation></semantics></math>";
// EXPECT_EQ(oTest.GetOdf(),wsOdf);
//}
TEST(OOXml2OdfTest,Example1)
{
XmlUtils::CXmlLiteReader oReader;
OOX::WritingElement* pElement = new OOX::Logic::COMathPara();
if(oReader.FromString(L"<m:oMathPara> <m:oMath> <m:sSup> <m:sSupPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:sSupPr> <m:e> <m:d> <m:dPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:dPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>x+a</m:t> </m:r> </m:e> </m:d> </m:e> <m:sup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>n</m:t> </m:r> </m:sup> </m:sSup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>=</m:t> </m:r> <m:nary> <m:naryPr> <m:chr m:val=\"\u2211\"/> <m:grow m:val=\"1\"/> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:naryPr> <m:sub> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>k=0</m:t> </m:r> </m:sub> <m:sup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>n</m:t> </m:r> </m:sup> <m:e> <m:d> <m:dPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:dPr> <m:e> <m:f> <m:fPr> <m:type m:val=\"noBar\"/> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:fPr> <m:num> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>n</m:t> </m:r> </m:num> <m:den> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>k</m:t> </m:r> </m:den> </m:f> </m:e> </m:d> <m:sSup> <m:sSupPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:sSupPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>x</m:t> </m:r> </m:e> <m:sup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>k</m:t> </m:r> </m:sup> </m:sSup> <m:sSup> <m:sSupPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:sSupPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>a</m:t> </m:r> </m:e> <m:sup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\" w:cs=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>n-k</m:t> </m:r> </m:sup> </m:sSup> </m:e> </m:nary> </m:oMath> </m:oMathPara>") && oReader.ReadNextNode())
pElement->fromXML(oReader);
StarMath::COOXml2Odf oTest;
oTest.StartConversion(pElement);
std::wstring wsOdf = L"<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msup><mrow><mo fence=\"true\" form=\"prefix\" stretchy=\"true\" />(<mrow><mrow><mi mathvariant=\"italic\">x</mi><mo stretchy=\"false\">+</mo><mi mathvariant=\"italic\">a</mi></mrow></mrow><mo fence=\"true\" form=\"postfix\" stretchy=\"true\" />)</mrow><mi mathvariant=\"italic\">n</mi></msup><mrow><mo stretchy=\"false\">=</mo></mrow><munderover><mo stretchy=\"false\">\u2211</mo><mrow><mi mathvariant=\"italic\">k</mi><mo stretchy=\"false\">=</mo><mn>0</mn></mrow><mi mathvariant=\"italic\">n</mi></munderover><mrow><mo fence=\"true\" form=\"prefix\" stretchy=\"true\" />(<mrow><mtable><mtr><mtd><mi mathvariant=\"italic\">n</mi></mtd></mtr><mtr><mtd><mi mathvariant=\"italic\">k</mi></mtd></mtr></mtable></mrow><mo fence=\"true\" form=\"postfix\" stretchy=\"true\" />)</mrow><msup><mi mathvariant=\"italic\">x</mi><mi mathvariant=\"italic\">k</mi></msup><msup><mi mathvariant=\"italic\">a</mi><mrow><mi mathvariant=\"italic\">n</mi><mo stretchy=\"false\">-</mo><mi mathvariant=\"italic\">k</mi></mrow></msup></mrow><annotation encoding=\"StarMath 5.0\">left ( x + a right ) ^ {n } = sum from {k = 0 } to {n } left ( binom { n } { k } right ) x ^ {k } a ^ {n - k } </annotation></semantics></math>";
EXPECT_EQ(oTest.GetOdf(),wsOdf);
}
TEST(OOXml2OdfTest,Example3)
{
XmlUtils::CXmlLiteReader oReader;
OOX::WritingElement* pElement = new OOX::Logic::COMathPara();
if(oReader.FromString(L"<m:oMathPara> <m:oMath> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>A=\u03C0</m:t> </m:r> <m:sSup> <m:sSupPr> <m:ctrlPr> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> </m:ctrlPr> </m:sSupPr> <m:e> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>r</m:t> </m:r> </m:e> <m:sup> <m:r> <w:rPr> <w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/> <w:lang w:val=\"en-US\"/> </w:rPr> <m:t>2</m:t> </m:r> </m:sup> </m:sSup> </m:oMath> </m:oMathPara>") && oReader.ReadNextNode())
pElement->fromXML(oReader);
StarMath::COOXml2Odf oTest;
oTest.StartConversion(pElement);
std::wstring wsOdf = L"<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mrow><mi mathvariant=\"italic\">A</mi><mo stretchy=\"false\">=</mo><mi mathvariant=\"normal\">\u03C0</mi></mrow><msup><mi mathvariant=\"italic\">r</mi><mn>2</mn></msup></mrow><annotation encoding=\"StarMath 5.0\">A = %pi r ^ {2 } </annotation></semantics></math>";
EXPECT_EQ(oTest.GetOdf(),wsOdf);
}
//TEST(OOXml2OdfTest,MathTemp)
//{
// XmlUtils::CXmlLiteReader oReader;