#include "cooxml2odf.h" #include namespace StarMath { //class OOXml2Odf COOXml2Odf::COOXml2Odf():m_wsBaseColor(L""),m_uiBaseSize(0),m_bStretchyAcc(false),m_bHeight(false) { m_pXmlWrite = new XmlUtils::CXmlWriter; } COOXml2Odf::~COOXml2Odf() { delete m_pXmlWrite; } void COOXml2Odf::StartConversion(OOX::WritingElement *pNode) { m_pXmlWrite->WriteNodeBegin(L"math",true); m_pXmlWrite->WriteAttribute(L"xmlns",L"http:\/\/www.w3.org/1998/Math/MathML"); m_pXmlWrite->WriteAttribute(L"display",L"block"); m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteNodeBegin(L"semantics",false); if(pNode == nullptr) { m_pXmlWrite->WriteNodeBegin(L"annotation",false); EndOdf(); return; } else NodeDefinition(pNode); m_wsSemantic = m_pXmlWrite->GetXmlString(); m_pXmlWrite->WriteNodeBegin(L"annotation",true); m_pXmlWrite->WriteAttribute(L"encoding",L"StarMath 5.0"); m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteString(m_wsAnnotationStarMath); EndOdf(); } void COOXml2Odf::NodeDefinition(OOX::WritingElement *pNode,const bool& bMatrix) { if(pNode == nullptr) return; switch(pNode->getType()) { case OOX::EElementType::et_m_oMath: { ConversionMath(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_rad: { ConversionRad(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_f: { ConversionMF(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_d: { ConversionMd(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_nary: { ConversionNary(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_oMathPara: { ConversionMathPara(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_acc: { ConversionAcc(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_box: { 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)); break; } case OOX::EElementType::et_m_e: { ConversionElement(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_groupChr: { ConversionGroupChr(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_bar: { ConversionBar(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_sPre: { ConversionSPre(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_sSub: { ConversionSsub(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_sSup: { ConversionSsup(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_eqArr: { ConversionEqArr(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_limLow: { ConversionLimLow(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_limUpp: { ConversionLimUpp(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_func: { ConversionFunc(dynamic_cast(pNode)); break; } case OOX::EElementType::et_m_sSubSup: { ConversionSubSup(dynamic_cast(pNode)); break; } default: break; } } void COOXml2Odf::ConversionMath(OOX::Logic::COMath *pMath) { if(pMath == nullptr) return; bool bMrow(false); if(pMath->m_arrItems.size() > 1) { bMrow = true; m_pXmlWrite->WriteNodeBegin(L"mrow",false); } ConversionVectorWritingElement(pMath->m_arrItems); if(bMrow == true) m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); } void COOXml2Odf::ConversionMathPara(OOX::Logic::COMathPara *pMathPara) { if(pMathPara == nullptr) return; bool bNewLine(false); if(pMathPara->m_arrItems.size() > 1) { bNewLine = true; m_pXmlWrite->WriteNodeBegin(L"mtable",false); m_pXmlWrite->WriteNodeBegin(L"mtr",false); m_pXmlWrite->WriteNodeBegin(L"mtd",false); } for(unsigned int i = 0; i < pMathPara->m_arrItems.size();i++) { switch (i) { case 0: break; case 1: { if(pMathPara->m_arrItems[0]->getType() != OOX::EElementType::et_m_oMathParaPr) { m_wsAnnotationStarMath += L"newline "; m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); m_pXmlWrite->WriteNodeEnd(L"mtr",false,false); m_pXmlWrite->WriteNodeBegin(L"mtr",false); m_pXmlWrite->WriteNodeBegin(L"mtd",false); } break; } default: { m_wsAnnotationStarMath += L"newline "; m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); m_pXmlWrite->WriteNodeEnd(L"mtr",false,false); m_pXmlWrite->WriteNodeBegin(L"mtr",false); m_pXmlWrite->WriteNodeBegin(L"mtd",false); break; } } NodeDefinition(pMathPara->m_arrItems[i]); } if(bNewLine) { m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); m_pXmlWrite->WriteNodeEnd(L"mtr",false,false); m_pXmlWrite->WriteNodeEnd(L"mtable",false,false); } } std::vector COOXml2Odf::ConversionMT(OOX::Logic::CMText *pMt, const StValuePr* pValue, const bool& bMRpr) { std::vector arLine; if(pMt == nullptr) return arLine; std::wstring wsText = pMt->m_sText,wsElement,wsTextUTF16; wsTextUTF16 = COOXml2Odf::TransformationUTF32(pMt->m_sText); std::wstring::iterator itStart = wsTextUTF16.begin(),itEnd = wsTextUTF16.end(); COneElement* pRightTempElement = nullptr; while(itStart != itEnd) { COneElement* pTempElement; if(pRightTempElement == nullptr) { wsElement = ParsingText(itStart,itEnd); pTempElement = COneElement::CreateElement(wsElement); } else { pTempElement = pRightTempElement; pRightTempElement = nullptr; } if(pTempElement != nullptr) { if(pTempElement->GetType() == TypeElement::BinOperator) { CBinOperator* pBinOp = dynamic_cast(pTempElement); pBinOp->Parse(itStart,itEnd,pRightTempElement); if(!arLine.empty() && pBinOp->GetTypeBinOp() != TypeElement::neg) { if(CBinOperator::CheckRightArg(arLine.back()) && !CBinOperator::UnaryCheck(pValue,pBinOp->GetTypeBinOp())) { pBinOp->SetLeftArg(arLine.back()); arLine.pop_back(); } } } else if(pTempElement->GetType() == TypeElement::Connection) { CRelationsAndOperationsOnSets* pRelation = dynamic_cast(pTempElement); pRelation->Parse(itStart,itEnd,pRightTempElement); if(!arLine.empty() && CBinOperator::CheckRightArg(arLine.back())) { pRelation->SetLeftArg(arLine.back()); arLine.pop_back(); } } arLine.push_back(pTempElement); } } return arLine; } std::wstring COOXml2Odf::ParsingText(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) { std::wstring wsElement; for(;itStart != itEnd;itStart++) { if(iswspace(*itStart)) if(!wsElement.empty()) return wsElement; else { itStart++; return L" "; } else if(iswdigit(*itStart)) if(!wsElement.empty()) { if(iswdigit(wsElement.back())) wsElement.push_back(*itStart); else return wsElement; } else wsElement.push_back(*itStart); else if(iswalpha(*itStart)) if(!wsElement.empty()) { if(iswalpha(wsElement.back())) wsElement.push_back(*itStart); else return wsElement; } else wsElement.push_back(*itStart); else if(wsElement.empty()) { wsElement.push_back(*itStart); itStart++; return wsElement; } else return wsElement; } if(!wsElement.empty()) return wsElement; else return L""; } void COOXml2Odf::ConversionMF(OOX::Logic::CFraction *pMf) { if(pMf == nullptr) return; StValuePr stPr = ConversionFpr(dynamic_cast(pMf->m_oFPr.GetPointer())); TFormulaSize stStart,stFrac; stStart = m_stSize; m_stSize.Zeroing(); if(stPr.m_wsTypeName == L"noBar") { m_wsAnnotationStarMath += L"binom "; m_pXmlWrite->WriteNodeBegin(L"mtable",false); m_pXmlWrite->WriteNodeBegin(L"mtr",false); m_pXmlWrite->WriteNodeBegin(L"mtd",false); CheckVectorElementsForMf(pMf->m_oNum.GetPointer()->m_arrItems); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); m_stSize.Zeroing(); m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); m_pXmlWrite->WriteNodeEnd(L"mtr",false,false); m_pXmlWrite->WriteNodeBegin(L"mtr",false); m_pXmlWrite->WriteNodeBegin(L"mtd",false); CheckVectorElementsForMf(pMf->m_oDen.GetPointer()->m_arrItems); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); COOXml2Odf::ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); m_pXmlWrite->WriteNodeEnd(L"mtr",false,false); m_pXmlWrite->WriteNodeEnd(L"mtable",false,false); } else if(stPr.m_wsTypeName != L"lin") { m_pXmlWrite->WriteNodeBegin(L"mfrac",true); if(stPr.m_wsTypeName == L"skw") { m_pXmlWrite->WriteAttribute(L"bevelled",L"true"); m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteNodeBegin(L"mrow",false); CheckVectorElementsForMf(pMf->m_oNum.GetPointer()->m_arrItems); m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); m_stSize.Zeroing(); m_wsAnnotationStarMath += L"wideslash "; m_pXmlWrite->WriteNodeBegin(L"mrow",false); CheckVectorElementsForMf(pMf->m_oDen.GetPointer()->m_arrItems); m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); COOXml2Odf::ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; } else { m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteNodeBegin(L"mrow",false); CheckVectorElementsForMf(pMf->m_oNum.GetPointer()->m_arrItems); m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); m_stSize.Zeroing(); m_wsAnnotationStarMath += L"over "; m_pXmlWrite->WriteNodeBegin(L"mrow",false); CheckVectorElementsForMf(pMf->m_oDen.GetPointer()->m_arrItems); m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); COOXml2Odf::ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; } m_pXmlWrite->WriteNodeEnd(L"mfrac",false,false); } else { m_pXmlWrite->WriteNodeBegin(L"mrow",false); CheckVectorElementsForMf(pMf->m_oNum.GetPointer()->m_arrItems); RecordingMoNode(L"/",m_pXmlWrite); m_wsAnnotationStarMath += L"/ "; CheckVectorElementsForMf(pMf->m_oDen.GetPointer()->m_arrItems); COOXml2Odf::ComparisonSizeByHeight(m_stSize,stStart); m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); } } StValuePr COOXml2Odf::ConversionFpr(OOX::Logic::CFPr *pFpr) { StValuePr stValue; if(pFpr == nullptr) return stValue; stValue.m_wsTypeName = ConversionType(dynamic_cast(pFpr->m_oType.GetPointer())); return stValue; } std::wstring COOXml2Odf::ConversionType(OOX::Logic::CType *pType) { if(pType == nullptr) return L""; std::wstring wsType = pType->m_val->ToString(); return wsType; } void COOXml2Odf::ConversionMd(OOX::Logic::CDelimiter *pDel) { if(pDel == nullptr) return; StValuePr stDelPr; StStyleMenClose stStyle; m_stSize.m_iWidth += 2; if(pDel->m_arrItems[0] != nullptr && pDel->m_arrItems[0]->getType() == OOX::EElementType::et_m_dPr) stDelPr = ConversionMdPr(dynamic_cast(pDel->m_arrItems[0]),stStyle); m_pXmlWrite->WriteNodeBegin(L"mrow",false); if(!stDelPr.m_wsBegBracket.empty()) { m_pXmlWrite->WriteNodeBegin(L"mo",true); m_pXmlWrite->WriteAttribute(L"fence",L"true"); m_pXmlWrite->WriteAttribute(L"form",L"prefix"); m_pXmlWrite->WriteAttribute(L"stretchy",L"true"); m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteString(stDelPr.m_wsBegBracket); m_pXmlWrite->WriteNodeEnd(L"mo",false,false); m_stSize.m_iWidth -= 1; } m_wsAnnotationStarMath += L"left " + BracketForAnnotation(stDelPr.m_wsBegBracket,true) + L" "; m_pXmlWrite->WriteNodeBegin(L"mrow",false); for(int i = 1; im_arrItems.size();i++) { if(i >= 2) { RecordingMoNode(L"\u007C",m_pXmlWrite); m_wsAnnotationStarMath += L"mline "; m_stSize.m_iWidth += 1; } NodeDefinition(pDel->m_arrItems[i]); } m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); if(!stDelPr.m_wsEndBracket.empty()) { m_pXmlWrite->WriteNodeBegin(L"mo",true); m_pXmlWrite->WriteAttribute(L"fence",L"true"); m_pXmlWrite->WriteAttribute(L"form",L"postfix"); m_pXmlWrite->WriteAttribute(L"stretchy",L"true"); m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteString(stDelPr.m_wsEndBracket); m_pXmlWrite->WriteNodeEnd(L"mo",false,false); m_stSize.m_iWidth -= 1; } m_wsAnnotationStarMath += L"right " + BracketForAnnotation(stDelPr.m_wsEndBracket,false) + L" "; m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); StyleClosing(stStyle,m_pXmlWrite); if((stStyle.m_iStyle != 0 || stStyle.m_bMenClose) && !m_stAttribute.empty()) { m_stAttribute.top()->Release(); m_stAttribute.pop(); } } std::wstring COOXml2Odf::BracketForAnnotation(const std::wstring &wsBracket, const bool &bBeg) { if(wsBracket.empty()) return L"none"; else if(wsBracket == L"\u007C" && bBeg) return L"lline"; else if(wsBracket == L"\u007C" && !bBeg) return L"rline"; else if(wsBracket == L"\u2016" && bBeg) return L"ldline"; else if(wsBracket == L"\u2016" && !bBeg) return L"rdline"; else if(wsBracket == L"\u27E6") return L"ldbracket"; else if(wsBracket == L"\u27E7") return L"rdbracket"; else if(wsBracket == L"\u007B") return L"lbrace"; else if(wsBracket == L"\u007D") return L"rbrace"; else if(wsBracket == L"\u2329" || L"\u27E8" == wsBracket) return L"langle"; else if(wsBracket == L"\u232A" || L"\u27E9" == wsBracket) return L"rangle"; else if(wsBracket == L"\u2308") return L"lceil"; else if(wsBracket == L"\u2309") return L"rceil"; else if(wsBracket == L"\u230A") return L"lfloor"; else if(wsBracket == L"\u230B") return L"rfloor"; else return wsBracket; } void COOXml2Odf::ConversionNary(OOX::Logic::CNary *pNary) { if(pNary == nullptr) return; std::wstring wsTypeNary; StStyleMenClose stStyle; TFormulaSize stStart = m_stSize,stFrac; stFrac.m_iWidth += 1; m_stSize.Zeroing(); StValuePr stNaryPr = ConversionNaryPr(pNary->m_oNaryPr.GetPointer(),stStyle); if(stNaryPr.m_bSubHide && stNaryPr.m_bSupHide) wsTypeNary = L"munderover"; else if(!stNaryPr.m_bSubHide && stNaryPr.m_bSupHide) wsTypeNary = L"mover"; else if(!stNaryPr.m_bSupHide && stNaryPr.m_bSubHide) wsTypeNary = L"munder"; else wsTypeNary = L"mrow"; m_pXmlWrite->WriteNodeBegin(wsTypeNary,false); RecordingMoNode(stNaryPr.m_wsChr,m_pXmlWrite); m_wsAnnotationStarMath += ToStringChr(stNaryPr.m_wsChr) + L" "; if(stNaryPr.m_bSubHide) { m_wsAnnotationStarMath += L"from {"; ConversionSub(pNary->m_oSub.GetPointer()); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); m_stSize.Zeroing(); m_wsAnnotationStarMath += L"} "; } if(stNaryPr.m_bSupHide) { m_wsAnnotationStarMath += L"to {"; ConversionSup(pNary->m_oSup.GetPointer()); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); m_stSize.Zeroing(); m_wsAnnotationStarMath += L"} "; } m_pXmlWrite->WriteNodeEnd(wsTypeNary,false,false); ConversionElement(pNary->m_oElement.GetPointer()); COOXml2Odf::ComparisonSizeByHeight(stStart,stFrac); COOXml2Odf::ComparisonSizeByHeight(m_stSize,stStart); m_stSize.m_iHeight += 1; StyleClosing(stStyle,m_pXmlWrite); } void COOXml2Odf::ConversionSsub(OOX::Logic::CSSub *pSsub) { if(pSsub == nullptr) return; ConversionSub(pSsub->m_oSub.GetPointer(),pSsub->m_oElement.GetPointer()); } void COOXml2Odf::ConversionSub(OOX::Logic::CSub *pSub, OOX::Logic::CElement * pElement) { if(pSub == nullptr) return; m_pXmlWrite->WriteNodeBegin(L"msub",false); TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); if(pElement != nullptr) { ConversionElement(pElement); stFrac = m_stSize; m_stSize.Zeroing(); } else { m_pXmlWrite->WriteNodeBegin(L"mspace",true); m_pXmlWrite->WriteNodeEnd(L"w",true,true); m_wsAnnotationStarMath += L"` "; } m_wsAnnotationStarMath += L"_ {"; ConversionVectorWritingElement(pSub->m_arrItems); stFrac.m_iHeight += m_stSize.m_iHeight - 0.5; stFrac.m_iWidth += m_stSize.m_iWidth; ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_wsAnnotationStarMath += L"} "; m_pXmlWrite->WriteNodeEnd(L"msub",false,false); } void COOXml2Odf::ConversionSub(OOX::Logic::CSub *pSub) { if(pSub == nullptr) return; ConversionVectorWritingElement(pSub->m_arrItems); } void COOXml2Odf::ConversionSsup(OOX::Logic::CSSup *pSsup) { if(pSsup == nullptr) return; ConversionSup(pSsup->m_oSup.GetPointer(),pSsup->m_oElement.GetPointer()); } void COOXml2Odf::ConversionSup(OOX::Logic::CSup *pSup, OOX::Logic::CElement *pElement) { if(pSup == nullptr) return; TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); m_pXmlWrite->WriteNodeBegin(L"msup",false); if(pElement != nullptr) { ConversionElement(pElement); stFrac = m_stSize; m_stSize.Zeroing(); } else { m_pXmlWrite->WriteNodeBegin(L"mspace",true); m_pXmlWrite->WriteNodeEnd(L"w",true,true); m_wsAnnotationStarMath += L"` "; } m_wsAnnotationStarMath+= L"^ {"; ConversionVectorWritingElement(pSup->m_arrItems); stFrac.m_iHeight += m_stSize.m_iHeight - 0.5; stFrac.m_iWidth += m_stSize.m_iWidth; ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_wsAnnotationStarMath += L"} "; m_pXmlWrite->WriteNodeEnd(L"msup",false,false); } void COOXml2Odf::ConversionSup(OOX::Logic::CSup *pSup) { if(pSup == nullptr) return; ConversionVectorWritingElement(pSup->m_arrItems); } void COOXml2Odf::ConversionElement(OOX::Logic::CElement *pElement) { if(pElement == nullptr) return; ConversionVectorWritingElement(pElement->m_arrItems); } std::vector COOXml2Odf::ConversionMRun(OOX::Logic::CMRun *pMRun) { std::vector arLine; if(pMRun == nullptr) return arLine; StValuePr* stRpr(nullptr); 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); for (size_t i = 0; i < pMRun->m_arrItems.size(); ++i) { switch (pMRun->m_arrItems[i]->getType()) { case OOX::et_m_t: { std::vector arLine_run; arLine_run = ConversionMT(dynamic_cast(pMRun->m_arrItems[i]), stRpr, pMRun->m_oMRPr.GetPointer()); arLine.insert(arLine.end(), arLine_run.begin(), arLine_run.end()); arLine_run.clear(); }break; default: break; } } CreateAttribute(stRpr); if(stRpr != nullptr && !arLine.empty()) { if(!m_stAttribute.empty()) AttributeCheck(m_stAttribute.top(),stRpr); else AttributeCheck(stRpr); for(int i = 0; iSetAttribute(stRpr); stRpr->AddRef(); } else if(i == 0 ) arLine[i]->SetAttribute(stRpr); } } return arLine; } StValuePr COOXml2Odf::ConversionMdPr(OOX::Logic::CDelimiterPr *pDelPr, StStyleMenClose &stStyle) { StValuePr pMdPr; if(pDelPr == nullptr) return pMdPr; stStyle = ConversionCtrlPr(pDelPr->m_oCtrlPr.GetPointer(),true); pMdPr.m_wsBegBracket = ConversionBegBracket(dynamic_cast(pDelPr->m_oBegChr.GetPointer())); pMdPr.m_wsEndBracket = ConversionEndBracket(dynamic_cast(pDelPr->m_oEndChr.GetPointer())); return pMdPr; } StValuePr COOXml2Odf::ConversionNaryPr(OOX::Logic::CNaryPr *pNaryPr, StStyleMenClose &stStyle) { StValuePr stNaryPr; if(pNaryPr == nullptr) return stNaryPr; stStyle = ConversionCtrlPr(pNaryPr->m_oCtrlPr.GetPointer()); stNaryPr.m_wsChr = ConversionChr(pNaryPr->m_oChr.GetPointer()); if(pNaryPr->m_oSubHide.GetPointer() == nullptr) stNaryPr.m_bSubHide = true; if(pNaryPr->m_oSupHide.GetPointer() == nullptr) stNaryPr.m_bSupHide = true; return stNaryPr; } std::wstring COOXml2Odf::ConversionBegBracket(OOX::Logic::CBegChr *pBegChr) { if(pBegChr == nullptr) return L"("; if(pBegChr->m_val.GetPointer() == nullptr) return L"("; return pBegChr->m_val->GetValue(); } std::wstring COOXml2Odf::ConversionEndBracket(OOX::Logic::CEndChr *pEndChr) { if(pEndChr == nullptr) return L")"; if(pEndChr->m_val.GetPointer() == nullptr) return L")"; return pEndChr->m_val->GetValue(); } //annotation? std::wstring COOXml2Odf::ConversionChr(OOX::Logic::CChr *pChr) { if(pChr == nullptr) return L""; return pChr->m_val->GetValue(); } std::wstring COOXml2Odf::ToStringChr(const std::wstring &wsChr) { if(wsChr == L"\u2211") return L"sum"; else if(wsChr == L"\u220F") return L"prod"; else if(wsChr == L"\u2210") return L"coprod"; else if(wsChr.empty()) return L"int"; else if(wsChr == L"\u222C") return L"iint"; else if(wsChr == L"\u222D") return L"iiint"; else if(wsChr == L"\u222E") return L"lint"; else if(wsChr == L"\u222F") return L"llint"; else if(wsChr == L"\u2230") return L"lllint"; else return L"oper " + wsChr; } void COOXml2Odf::EndOdf() { m_pXmlWrite->WriteNodeEnd(L"annotation",false,false); m_pXmlWrite->WriteNodeEnd(L"semantics",false,false); m_pXmlWrite->WriteNodeEnd(L"math",false,false); } bool COOXml2Odf::IsDigit(const std::wstring &wsDigit) { if(wsDigit.empty()) return false; for(wchar_t cOneElement:wsDigit) if(!iswdigit(cOneElement)) return false; return true; } bool COOXml2Odf::IsAlpha(const std::wstring &wsAlpha) { for(wchar_t cOneElement:wsAlpha) if(!iswalpha(cOneElement)) return false; return true; } bool COOXml2Odf::ComparingAttributes(StValuePr *pRight, StValuePr *pLeft) { if(pRight == nullptr && pLeft == nullptr) return true; if(pRight != nullptr && pLeft != nullptr) { if(pRight->m_wsColor != pLeft->m_wsColor) return false; else if(pRight->m_iSize != pLeft->m_iSize) return false; else if(pRight->m_enStyle != pLeft->m_enStyle) return false; else if(pRight->m_enFont != pLeft->m_enFont) return false; else return true; } 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::AttributeCheck(StValuePr*& pChild) { if(pChild == nullptr && !pChild->m_bBaseAttribute) return; if(m_uiBaseSize != 0 && pChild->m_iSize == 0) pChild->m_iSize = m_uiBaseSize; if(!m_wsBaseColor.empty() && pChild->m_wsColor.empty()) pChild->m_wsColor = m_wsBaseColor; } void COOXml2Odf::CreateAttribute(StValuePr*& pAttribute) { if(pAttribute != nullptr) return; if(m_uiBaseSize != 0 || !m_wsBaseColor.empty()) { pAttribute = new StValuePr; pAttribute->m_bBaseAttribute = true; if(m_uiBaseSize != 0) pAttribute->m_iSize = m_uiBaseSize; if(!m_wsBaseColor.empty()) pAttribute->m_wsColor = m_wsBaseColor; } } 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"\u005E",wsSign; wsSign = TranslationDiacritSign(wsSymbol); if(wsSign.empty()) { m_pXmlWrite->WriteNodeBegin(L"mover",false); ConversionElement(pAcc->m_oElement.GetPointer()); m_pXmlWrite->WriteNodeBegin(L"mtext",false); m_pXmlWrite->WriteString(wsSymbol); m_pXmlWrite->WriteNodeEnd(L"mtext",false,false); m_wsAnnotationStarMath += L"csup "; m_wsAnnotationStarMath += L"\u0026quot;" + wsSymbol + L"\u0026quot; "; } 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",wsStretchy); m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteString(wsSymbol); m_pXmlWrite->WriteNodeEnd(L"mo",false,false); } m_pXmlWrite->WriteNodeEnd(L"mover",false,false); m_stSize.m_iHeight += 0.5; } void COOXml2Odf::ConversionFunc(OOX::Logic::CFunc *pFunc) { if(pFunc == nullptr) return; m_pXmlWrite->WriteNodeBegin(L"mrow",false); if(pFunc->m_oFName.GetPointer() != nullptr) ConversionVectorWritingElement(pFunc->m_oFName.GetPointer()->m_arrItems); ConversionElement(pFunc->m_oElement.GetPointer()); m_pXmlWrite->WriteNodeEnd(L"mrow",false,false); } StStyleMenClose COOXml2Odf::ConversionFuncPr(OOX::Logic::CFuncPr *pFuncPr) { StStyleMenClose stStyle; if(pFuncPr == nullptr) return stStyle; return ConversionCtrlPr(pFuncPr->m_oCtrlPr.GetPointer()); } void COOXml2Odf::RecordingMoNode(const std::wstring &wsSymbol, XmlUtils::CXmlWriter *pXmlWrite) { pXmlWrite->WriteNodeBegin(L"mo",true); pXmlWrite->WriteAttribute(L"stretchy",L"false"); pXmlWrite->WriteNodeEnd(L"w",true,false); if(!wsSymbol.empty()) pXmlWrite->WriteString(wsSymbol); else pXmlWrite->WriteString(L"\u222B"); pXmlWrite->WriteNodeEnd(L"mo",false,false); } void COOXml2Odf::ConversionBox(OOX::Logic::CBox *pBox) { if(pBox == nullptr) 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; if(pRPr == nullptr) { stTempPr->Release(); return nullptr; } bool bRpr(false); if(pRPr->m_oColor.GetPointer() != nullptr) { std::wstring wsColor,wsUpperColor(L""); wsColor = pRPr->m_oColor.GetPointer()->m_oVal.GetPointer()!= nullptr ? pRPr->m_oColor.GetPointer()->m_oVal.GetPointer()->ToStringNoAlpha():L""; if(wsColor != L"") { for(wchar_t chToken: wsColor) wsUpperColor += std::toupper(chToken); if(wsUpperColor != L"000000") { stTempPr->m_wsColor = wsUpperColor; bRpr = true; } } } if(pRPr->m_oSz.GetPointer() != nullptr) { stTempPr->m_iSize = pRPr->m_oSz.GetPointer()->m_oVal.GetPointer() != nullptr ? pRPr->m_oSz.GetPointer()->m_oVal.GetPointer()->GetValue():0; if(stTempPr->m_iSize != 0) bRpr = true; } if(pRPr->m_oRFonts.GetPointer()!= nullptr && pRPr->m_oRFonts.GetPointer()->m_sAscii.GetPointer()!= nullptr) stTempPr->m_enFont = FontCheck(pRPr->m_oRFonts.GetPointer()->m_sAscii.get(),bRpr); if(pRPr->m_oStrike.GetPointer()!=nullptr && pRPr->m_oStrike.GetPointer()->m_oVal.GetValue() == SimpleTypes::EOnOff::onoffTrue) { stTempPr->m_bStrike = true; bRpr = true; } if(pRPr->m_oBold.GetPointer() != nullptr && pRPr->m_oBold.GetPointer()->m_oVal.GetValue() == SimpleTypes::EOnOff::onoffTrue) { if(pRPr->m_oItalic.GetPointer() != nullptr && pRPr->m_oItalic.GetPointer()->m_oVal.GetValue() == SimpleTypes::EOnOff::onoffTrue) stTempPr->m_enStyle = SimpleTypes::EStyle::styleBoldItalic; else stTempPr->m_enStyle = SimpleTypes::EStyle::styleBold; bRpr = true; } else if(pRPr->m_oItalic.GetPointer() != nullptr && pRPr->m_oItalic.GetPointer()->m_oVal.GetValue() == SimpleTypes::EOnOff::onoffTrue) { stTempPr->m_enStyle = SimpleTypes::EStyle::styleItalic; bRpr = true; } else if(pRPr->m_oU.GetPointer() != nullptr && pRPr->m_oU->m_oVal.GetPointer() != nullptr) { stTempPr->m_enUnderLine = pRPr->m_oU->m_oVal->GetValue(); bRpr = true; } if(bRpr == true) return stTempPr; else { stTempPr->Release(); return nullptr; } } void COOXml2Odf::ConversionMRunProperties(OOX::Logic::CMRPr *pMRpr, StValuePr*&pValue) { if(pMRpr == nullptr) return ; if(pMRpr->m_oSty.GetPointer() != nullptr && pMRpr->m_oSty.GetPointer()->m_val.GetPointer()->GetValue() != SimpleTypes::EStyle::stylePlain) { if(pValue == nullptr) pValue = new StValuePr; pValue->m_enStyle = pMRpr->m_oSty.GetPointer()->m_val.GetPointer()->GetValue(); } } void COOXml2Odf::ConversionARpr(PPTX::Logic::RunProperties *pARpr, StValuePr *&pValue) { if(pARpr == nullptr) return; if(pValue == nullptr) pValue = new StValuePr; bool bAttribute{false}; if(pARpr->b.IsInit() && pARpr->b.get()) { if(pARpr->i.IsInit() && pARpr->i.get()) pValue->m_enStyle = SimpleTypes::EStyle::styleBoldItalic; else pValue->m_enStyle = SimpleTypes::EStyle::styleBold; bAttribute = true; } else if(pARpr->i.IsInit() && pARpr->i.get()) { pValue->m_enStyle = SimpleTypes::EStyle::styleItalic; bAttribute = true; } if(pARpr->sz.IsInit()) { pValue->m_iSize = pARpr->sz.get()/100; bAttribute = true; } if(pARpr->latin.IsInit() && !pARpr->latin->typeface.empty()) pValue->m_enFont = FontCheck(pARpr->latin->typeface,bAttribute); // if(pARpr->Fill.is_init() && pARpr->Fill.Fill.m_pData->) } StarMath::TypeFont COOXml2Odf::FontCheck(const std::wstring &wsFont, bool &bAttribute) { if(!wsFont.empty()) { if(L"Liberation Serif" == wsFont) { bAttribute = true; return StarMath::TypeFont::serif; } else if(L"Liberation Sans" == wsFont) { bAttribute = true; return StarMath::TypeFont::sans; } else if(L"Liberation Mono" == wsFont) { bAttribute = true; return StarMath::TypeFont::fixed; } else return StarMath::TypeFont::empty; } else return StarMath::TypeFont::empty; } bool COOXml2Odf::ColorCheck(const std::wstring &wsColor, std::wstring &wsRecordColor) { if(!wsColor.empty()) { if(L"0000FF" == wsColor) wsRecordColor = L"blue"; else if(L"00FF00" == wsColor) wsRecordColor = L"lime"; else if(L"008000" == wsColor) wsRecordColor = L"green"; else if(L"FF0000" == wsColor) wsRecordColor = L"red"; else if(L"ED0DD9" == wsColor) wsRecordColor = L"fuchsia"; else if(L"30D5C8" == wsColor) wsRecordColor = L"aqua"; else if(L"FFFF00" == wsColor) wsRecordColor = L"yellow"; else if(L"808080" == wsColor) wsRecordColor = L"gray"; else if(L"800000" == wsColor) wsRecordColor = L"maroon"; else if(L"000080" == wsColor) wsRecordColor = L"navy"; else if(L"808000" == wsColor) wsRecordColor = L"olive"; else if(L"800080" == wsColor) wsRecordColor = L"purple"; else if(L"C0C0C0" == wsColor) wsRecordColor = L"silver"; else if(L"008080" == wsColor) wsRecordColor = L"teal"; else if(L"FF7F50" == wsColor) wsRecordColor = L"coral"; else if(L"191970" == wsColor) wsRecordColor = L"midnightblue"; else if(L"DC143C" == wsColor) wsRecordColor = L"crimson"; else if(L"EE82EE" == wsColor) wsRecordColor = L"violet"; else if(L"FFA500" == wsColor) wsRecordColor = L"orange"; else if(L"FF4500" == wsColor) wsRecordColor = L"orangered"; else if(L"2E8B57" == wsColor) wsRecordColor = L"seagreen"; else if(L"4B0082" == wsColor) wsRecordColor = L"indigo"; else if(L"FF69B4" == wsColor) wsRecordColor = L"hotpink"; else if(L"FFF0F5" == wsColor) wsRecordColor = L"lavender"; else return false; return true; } else return false; } void COOXml2Odf::CheckVectorElementsForMf(std::vector arWrElement) { if(!arWrElement.empty()) { m_wsAnnotationStarMath += L"{ "; ConversionVectorWritingElement(arWrElement); m_wsAnnotationStarMath += L"} "; } else COOXml2Odf::EmptyBlock(m_pXmlWrite,m_wsAnnotationStarMath,m_stSize); } TFormulaSize COOXml2Odf::GetFormulaSize() { return m_stSize; } void COOXml2Odf::ConversionTextVector(std::vector &arLine, std::vector &arNewLine) { if(!arLine.empty()) { COneElement* pTempElement = nullptr; for(COneElement* pElement:arLine) { if(pElement->GetType() == TypeElement::String || pElement->GetType() == TypeElement::SpecialSymbol) { if(pTempElement == nullptr) pTempElement = pElement; else if(pTempElement->GetType() == TypeElement::BinOperator || pTempElement->GetType() == TypeElement::Connection) { if(!CBinOperator::SetRightArg(pTempElement,pElement)) { arNewLine.push_back(pTempElement); pTempElement = pElement; } } else if(pElement->GetType() ==TypeElement::String && pTempElement->GetType() == TypeElement::String && ComparingAttributes(pTempElement->GetAttribute(),pElement->GetAttribute())) { CNumberOrLetter* pFirst = dynamic_cast(pTempElement); CNumberOrLetter* pSecond = dynamic_cast(pElement); pFirst->AddingStrings(pSecond->GetString()); } else { arNewLine.push_back(pTempElement); pTempElement = pElement; } } else if(pElement->GetType() == TypeElement::BinOperator || pElement->GetType() == TypeElement::Connection) { if(pTempElement == nullptr) pTempElement = pElement; else if(pTempElement->GetType() != TypeElement::Empty) { if(!CBinOperator::SetLeftArg(pElement,pTempElement)) { arNewLine.push_back(pTempElement); pTempElement = pElement; } else pTempElement = pElement; } else { arNewLine.push_back(pTempElement); pTempElement = pElement; } } else { arNewLine.push_back(pTempElement); pTempElement = pElement; } } arNewLine.push_back(pTempElement); } if(!arNewLine.empty()) { arLine.clear(); for(int i = 0;i< arNewLine.size();i++) { if(arNewLine[i] != nullptr) arNewLine[i]->Conversion(m_pXmlWrite,m_wsAnnotationStarMath,m_stSize); } } arLine.clear(); arNewLine.clear(); } void COOXml2Odf::ConversionVectorWritingElement(std::vector arWrElements) { std::vector arLine,arNewLine; for(int i = 0; i < arWrElements.size() ;i++) { if(arWrElements[i]->getType() == OOX::EElementType::et_m_r) { std::vector arTemp = ConversionMRun(dynamic_cast(arWrElements[i])); arLine.insert(arLine.end(),arTemp.begin(),arTemp.end()); } else { if(!arLine.empty()) ConversionTextVector(arLine,arNewLine); NodeDefinition(arWrElements[i]); } } if(!arLine.empty()) { ConversionTextVector(arLine,arNewLine); } } std::wstring COOXml2Odf::TranslationDiacritSign(const std::wstring &wsSymbol) { 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"; else if(L"\u0306" == wsSymbol) return L"breve"; else if(L"\u030A" == wsSymbol) return L"circle"; else if(L"\u0304" == wsSymbol) return L"bar"; 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"\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) { 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) { if(pMatrix == nullptr) return; StStyleMenClose stStyle = ConversionCMPr(dynamic_cast(pMatrix->m_arrItems[0])); TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); m_wsAnnotationStarMath += L"matrix{"; m_pXmlWrite->WriteNodeBegin(L"mtable",false); for(int i = 1;im_arrItems.size();i++) { if(OOX::EElementType::et_m_mr == pMatrix->m_arrItems[i]->getType()) { ConversionMr(dynamic_cast(pMatrix->m_arrItems[i])); COOXml2Odf::ComparisonSizeByWidth(stFrac,m_stSize); m_stSize.Zeroing(); } if(i+1 < pMatrix->m_arrItems.size()) { m_wsAnnotationStarMath += L"## "; m_stSize.m_iHeight += 1; } } m_pXmlWrite->WriteNodeEnd(L"mtable",false,false); COOXml2Odf::ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; StyleClosing(stStyle,m_pXmlWrite); if((stStyle.m_iStyle != 0 || stStyle.m_bMenClose) && !m_stAttribute.empty()) { m_stAttribute.top()->Release(); m_stAttribute.pop(); } m_wsAnnotationStarMath += L"} "; } void COOXml2Odf::ConversionMr(OOX::Logic::CMr *pMr) { if(pMr == nullptr) return; m_pXmlWrite->WriteNodeBegin(L"mtr",false); TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); for(unsigned int i = 0;im_arrItems.size();i++) { 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); ComparisonSizeByHeight(stFrac,m_stSize); m_stSize.Zeroing(); } else { m_pXmlWrite->WriteNodeBegin(L"mspace",true); m_pXmlWrite->WriteAttribute(L"width",L"2em"); m_pXmlWrite->WriteNodeEnd(L"w",true,true); m_wsAnnotationStarMath += L"~ "; stFrac.m_iWidth += 1; } if(i+1 < pMr->m_arrItems.size()) { m_wsAnnotationStarMath += L"# "; stFrac.m_iWidth += 1; } m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); } } ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_pXmlWrite->WriteNodeEnd(L"mtr",false,false); } StStyleMenClose COOXml2Odf::ConversionCtrlPr(OOX::Logic::CCtrlPr *pCtrlPr, const bool &bDelimiter) { StStyleMenClose stStyle; if(pCtrlPr == nullptr) return stStyle; StValuePr* pValue(nullptr); 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); CreateAttribute(pValue); if(pValue != nullptr) { if(!m_stAttribute.empty()) AttributeCheck(m_stAttribute.top(),pValue); else AttributeCheck(pValue); COneElement::ConversionAttribute(pValue,stStyle,m_pXmlWrite,m_wsAnnotationStarMath,bDelimiter); if(bDelimiter) m_stAttribute.push(pValue); return stStyle; } return stStyle; } StStyleMenClose COOXml2Odf::ConversionCMPr(OOX::Logic::CMPr *pMPr) { StStyleMenClose stStyle; if(pMPr == nullptr) return stStyle; return ConversionCtrlPr(dynamic_cast(pMPr->m_oCtrlPr.GetPointer()),true); } std::wstring COOXml2Odf::GetOdf() { return m_pXmlWrite->GetXmlString(); } std::wstring COOXml2Odf::GetAnnotation() { return m_wsAnnotationStarMath; } std::wstring COOXml2Odf::GetSemantic() { return m_wsSemantic; } void COOXml2Odf::SetBaseAttribute(std::wstring wsBaseColor, unsigned int uiBaseSize) { if(!wsBaseColor.empty()) m_wsBaseColor = wsBaseColor; if(uiBaseSize != 0) m_uiBaseSize = uiBaseSize; } void COOXml2Odf::ConversionRad(OOX::Logic::CRad *pRad) { if(pRad == nullptr) return; bool bDeg{false}; StStyleMenClose stStyle = ConversionRadPr(pRad->m_oRadPr.GetPointer(),bDeg); if(bDeg) { m_wsAnnotationStarMath += L"sqrt "; m_pXmlWrite->WriteNodeBegin(L"msqrt",false); m_wsAnnotationStarMath += L"{ "; NodeDefinition(pRad->m_oElement.GetPointer()); m_wsAnnotationStarMath += L"} "; m_pXmlWrite->WriteNodeEnd(L"msqrt",false,false); m_stSize.m_iHeight += 1; } else if(!bDeg) { TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); m_wsAnnotationStarMath += L"nroot "; std::wstring wsStart = m_wsAnnotationStarMath,wsElement; m_wsAnnotationStarMath.clear(); m_pXmlWrite->WriteNodeBegin(L"mroot",false); m_wsAnnotationStarMath += L"{ "; NodeDefinition(pRad->m_oElement.GetPointer()); stFrac = m_stSize; m_stSize.Zeroing(); m_wsAnnotationStarMath += L"} "; wsElement = m_wsAnnotationStarMath; m_wsAnnotationStarMath.clear(); m_wsAnnotationStarMath += L"{ "; ConversionDeg(pRad->m_oDeg.GetPointer()); stFrac.m_iHeight += m_stSize.m_iHeight - 0.5; stFrac.m_iWidth += m_stSize.m_iWidth; ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_wsAnnotationStarMath += L"} "; wsStart += m_wsAnnotationStarMath + wsElement; m_wsAnnotationStarMath = wsStart; m_pXmlWrite->WriteNodeEnd(L"mroot",false,false); } m_stSize.m_iWidth += 1; StyleClosing(stStyle,m_pXmlWrite); } StStyleMenClose COOXml2Odf::ConversionRadPr(OOX::Logic::CRadPr *pRadPr,bool&bDeg) { StStyleMenClose stStyle; if(pRadPr == nullptr) return stStyle; bDeg = pRadPr->m_oDegHide.GetPointer() != nullptr ? true:false; return ConversionCtrlPr(dynamic_cast(pRadPr->m_oCtrlPr.GetPointer())); } void COOXml2Odf::ConversionDeg(OOX::Logic::CDeg *pDeg) { if(pDeg == nullptr) return; ConversionVectorWritingElement(pDeg->m_arrItems); } void COOXml2Odf::ConversionGroupChr(OOX::Logic::CGroupChr *pGroup, const bool &bElement) { if(pGroup == nullptr) return; StValuePr stGroupPr; stGroupPr = ConversionGroupChrPr(pGroup->m_oGroupChrPr.GetPointer()); std::wstring wsNode(L""),wsAnnotation = GroupChrForAnnotation(stGroupPr.m_wsChr); if(!wsAnnotation.empty()) { wsNode = stGroupPr.m_wsChr == L""? L"munder":L"mover"; } else { switch(stGroupPr.m_enPos) { case SimpleTypes::ETopBot::tbBot: { wsNode = L"mover"; break; } case SimpleTypes::ETopBot::tbTop: { wsNode = L"munder"; break; } } } if(!wsAnnotation.empty()) { 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 { StStyleMenClose stStyle; m_pXmlWrite->WriteNodeBegin(wsNode,false); 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); 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); } } 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) { StValuePr stGroupPr; if(pGroupPr == nullptr) return stGroupPr; if(pGroupPr->m_oChr.GetPointer()!= nullptr) stGroupPr.m_wsChr = pGroupPr->m_oChr.GetPointer()->m_val.GetPointer()->GetValue(); if(pGroupPr->m_oPos.GetPointer() != nullptr) stGroupPr.m_enPos = pGroupPr->m_oPos.GetPointer()->m_val.GetPointer()->GetValue(); if(pGroupPr->m_oVertJc.GetPointer() != nullptr) stGroupPr.m_enVert = pGroupPr->m_oVertJc.GetPointer()->m_val.GetPointer()->GetValue(); return stGroupPr; } std::wstring COOXml2Odf::GroupChrForAnnotation(const std::wstring &wsChr) { if(wsChr == L"\u23DE") return L"overbrace "; else if(L"" == wsChr) return L"underbrace "; else return L""; } void COOXml2Odf::ConversionBar(OOX::Logic::CBar *pBar) { if(pBar == nullptr) return; StStyleMenClose stStyle; std::wstring wsNode; StValuePr pBarPr = ConversionBarPr(pBar->m_oBarPr.GetPointer(),stStyle); if(pBarPr.m_enPos == SimpleTypes::ETopBot::tbTop) { wsNode = L"mover"; m_wsAnnotationStarMath += L"overline "; } else { wsNode = L"munder"; m_wsAnnotationStarMath += L"underline "; } m_pXmlWrite->WriteNodeBegin(wsNode,true); pBarPr.m_enPos == SimpleTypes::ETopBot::tbTop ? m_pXmlWrite->WriteAttribute(L"accent",L"true"): m_pXmlWrite->WriteAttribute(L"accentunder",L"true"); ConversionElement(pBar->m_oElement.GetPointer()); m_pXmlWrite->WriteNodeEnd(L"w",true,false); m_pXmlWrite->WriteNodeBegin(L"mo",false); pBarPr.m_enPos == SimpleTypes::ETopBot::tbTop ? m_pXmlWrite->WriteString(L"\u203E"):m_pXmlWrite->WriteString(L"\u005F"); m_pXmlWrite->WriteNodeEnd(L"mo",false,false); m_pXmlWrite->WriteNodeEnd(wsNode,false,false); StyleClosing(stStyle,m_pXmlWrite); m_stSize.m_iHeight += 1; } StValuePr COOXml2Odf::ConversionBarPr(OOX::Logic::CBarPr *pBarPr, StStyleMenClose &stStyle) { StValuePr stBarPr; if(pBarPr == nullptr) return stBarPr; if(pBarPr->m_oPos.GetPointer() != nullptr && pBarPr->m_oPos->m_val.GetPointer() != nullptr) stBarPr.m_enPos = pBarPr->m_oPos->m_val->GetValue(); stStyle = ConversionCtrlPr(pBarPr->m_oCtrlPr.GetPointer()); return stBarPr; } template bool IsEmptyNode(T pNode) { if(pNode == nullptr) return true; if(pNode->m_arrItems.size() == 0) return true; return false; } void COOXml2Odf::ConversionSPre(OOX::Logic::CSPre *pSPre) { if(pSPre == nullptr) return ; m_pXmlWrite->WriteNodeBegin(L"mmultiscripts",false); TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); if(IsEmptyNode(pSPre->m_oElement.GetPointer())) EmptyBlock(m_pXmlWrite,m_wsAnnotationStarMath,m_stSize); else ConversionElement(pSPre->m_oElement.GetPointer()); stFrac = m_stSize; m_stSize.Zeroing(); m_pXmlWrite->WriteNodeBegin(L"mprescripts",true); m_pXmlWrite->WriteNodeEnd(L"w",true,true); if(IsEmptyNode(pSPre->m_oSup.GetPointer())) { m_pXmlWrite->WriteNodeBegin(L"none",true); m_pXmlWrite->WriteNodeEnd(L"w",true,true); } else { m_wsAnnotationStarMath += L"lsup { "; ConversionSup(pSPre->m_oSup.GetPointer()); m_wsAnnotationStarMath += L"} "; } if(IsEmptyNode(pSPre->m_oSub.GetPointer())) { m_pXmlWrite->WriteNodeBegin(L"none",true); m_pXmlWrite->WriteNodeEnd(L"w",true,true); } else { m_wsAnnotationStarMath += L"lsub { "; ConversionSub(pSPre->m_oSub.GetPointer()); m_wsAnnotationStarMath += L"} "; } stFrac.m_iHeight += m_stSize.m_iHeight; stFrac.m_iWidth += m_stSize.m_iWidth; ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_pXmlWrite->WriteNodeEnd(L"mmultiscripts",false,false); } void COOXml2Odf::EmptyBlock(XmlUtils::CXmlWriter* pXmlWrite, std::wstring& wsAnnotation, TFormulaSize &stSize) { pXmlWrite->WriteNodeBegin(L"mi",true); pXmlWrite->WriteAttribute(L"mathvariant",L"normal"); pXmlWrite->WriteNodeEnd(L"w",true,false); pXmlWrite->WriteString(L"\u2751"); pXmlWrite->WriteNodeEnd(L"mi",false,false); wsAnnotation += L"{\u0026lt;\u003F\u0026gt;} "; stSize.m_iWidth += 1; } void COOXml2Odf::ConversionLimLow(OOX::Logic::CLimLow *pLimLow) { if(pLimLow == nullptr) return; TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); m_pXmlWrite->WriteNodeBegin(L"munder",false); 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(pLimLow->m_oElement.GetPointer()->m_arrItems[0]),true); else { ConversionElement(pLimLow->m_oElement.GetPointer()); m_wsAnnotationStarMath += L"csub "; } stFrac = m_stSize; m_stSize.Zeroing(); ConversionLim(pLimLow->m_oLim.GetPointer()); ComparisonSizeByWidth(stFrac,m_stSize); ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_pXmlWrite->WriteNodeEnd(L"munder",false,false); } void COOXml2Odf::ConversionLimUpp(OOX::Logic::CLimUpp *pLimUpp) { if(pLimUpp == nullptr) return; TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); m_pXmlWrite->WriteNodeBegin(L"mover",false); 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(pLimUpp->m_oElement.GetPointer()->m_arrItems[0]),true); else { ConversionElement(pLimUpp->m_oElement.GetPointer()); m_wsAnnotationStarMath += L"csup "; } stFrac = m_stSize; m_stSize.Zeroing(); ConversionLim(pLimUpp->m_oLim.GetPointer()); ComparisonSizeByWidth(stFrac,m_stSize); ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_pXmlWrite->WriteNodeEnd(L"mover",false,false); } void COOXml2Odf::ConversionLim(OOX::Logic::CLim *pLim) { if(pLim == nullptr) return; m_wsAnnotationStarMath += L"{ "; ConversionVectorWritingElement(pLim->m_arrItems); m_wsAnnotationStarMath += L"} "; } void COOXml2Odf::ConversionEqArr(OOX::Logic::CEqArr *pEqArr) { if(pEqArr == nullptr) return; m_pXmlWrite->WriteNodeBegin(L"mtable",false); TFormulaSize stStart = m_stSize,stFrac; m_stSize.Zeroing(); m_wsAnnotationStarMath += L"stack{"; for(int i = 1; im_arrItems.size();i++) { m_pXmlWrite->WriteNodeBegin(L"mtr",false); m_pXmlWrite->WriteNodeBegin(L"mtd",false); NodeDefinition(pEqArr->m_arrItems[i]); m_pXmlWrite->WriteNodeEnd(L"mtd",false,false); m_pXmlWrite->WriteNodeEnd(L"mtr",false,false); if(pEqArr->m_arrItems.size()>1 && i+1 < pEqArr->m_arrItems.size()) m_wsAnnotationStarMath += L"# "; ComparisonSizeByWidth(stFrac,m_stSize); m_stSize.Zeroing(); } ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_wsAnnotationStarMath += L"} "; m_pXmlWrite->WriteNodeEnd(L"mtable",false,false); } void COOXml2Odf::ConversionSubSup(OOX::Logic::CSSubSup *pSubSup) { if(pSubSup == nullptr) return; TFormulaSize stStart = m_stSize,stFrac,stTemp; m_stSize.Zeroing(); m_pXmlWrite->WriteNodeBegin(L"msubsup",false); ConversionElement(pSubSup->m_oElement.GetPointer()); stTemp = m_stSize; m_stSize.Zeroing(); m_wsAnnotationStarMath += L"_ { "; ConversionSub(pSubSup->m_oSub.GetPointer()); stFrac = m_stSize; m_stSize.Zeroing(); m_wsAnnotationStarMath += L"} ^ { "; ConversionSup(pSubSup->m_oSup.GetPointer()); ComparisonSizeByWidth(stFrac,m_stSize); ComparisonSizeByHeight(stFrac,stTemp); ComparisonSizeByHeight(stStart,stFrac); m_stSize = stStart; m_wsAnnotationStarMath += L"} "; m_pXmlWrite->WriteNodeEnd(L"msubsup",false,false); } void COOXml2Odf::StyleClosing(const StStyleMenClose &stStyle, XmlUtils::CXmlWriter *pXmlWrite) { if(stStyle.m_bUnderlineClose) { pXmlWrite->WriteNodeBegin(L"mo",false); pXmlWrite->WriteString(L"\u0332"); pXmlWrite->WriteNodeEnd(L"mo",false,false); pXmlWrite->WriteNodeEnd(L"munder",false,false); } if(stStyle.m_bMenClose) pXmlWrite->WriteNodeEnd(L"menclose",false,false); if(stStyle.m_iStyle != 0) { unsigned int k(0); while(k < stStyle.m_iStyle) { pXmlWrite->WriteNodeEnd(L"mstyle",false,false); k++; } } } void COOXml2Odf::MTextRecording(XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation, const std::wstring &wsText,TFormulaSize& stSize) { pXmlWrite->WriteNodeBegin(L"mtext",false); pXmlWrite->WriteString(wsText); pXmlWrite->WriteNodeEnd(L"mtext",false,false); wsAnnotation += L"\u0026quot;" + wsText + L"\u0026quot; "; stSize.m_iWidth += wsText.size(); } void COOXml2Odf::ComparisonSizeByHeight(TFormulaSize &stLeft, const TFormulaSize &stRight) { if(stRight.m_iHeight > stLeft.m_iHeight) stLeft.m_iHeight = stRight.m_iHeight; if(stRight.m_iWidth != 0) stLeft.m_iWidth += stRight.m_iWidth; } void COOXml2Odf::ComparisonSizeByWidth(TFormulaSize &stLeft, const TFormulaSize &stRight) { if(stRight.m_iHeight != 0) stLeft.m_iHeight += stRight.m_iHeight; if(stRight.m_iWidth > stLeft.m_iWidth) stLeft.m_iWidth = stRight.m_iWidth; } std::wstring COOXml2Odf::TransformationUTF32(const std::wstring &wsText) { NSStringUtils::CStringUTF32 oString32(wsText); std::wstring wsText16; for(unsigned int i = 0;i < oString32.length();i++) { //Mathematical Bold Capital if(oString32[i] >= 119808 && oString32[i] <= 119833) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119743)); //Italic Small Dotless I else if(oString32[i] == 120484) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120379)); //Italic Small Dotless J else if(oString32[i] == 120485) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120379)); //Bold Nabla else if(oString32[i] == 120513) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 111802)); //Italic Nabla else if(oString32[i] == 120571) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 111860)); //Bold Italic Nabla else if(oString32[i] == 120629) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 111918)); //Sans-Serif Bold Nabla else if(oString32[i] == 120687) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 111976)); //Sans-Serif Bold Italic Nabla else if(oString32[i] == 120745) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 112034)); //Mathematical Bold Small else if(oString32[i] >= 119834 && oString32[i] <= 119859) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119737)); //Italic Capital else if(oString32[i] >= 119860 && oString32[i] <= 119885) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119795)); //Italic Small else if(oString32[i] >= 119886 && oString32[i] <= 119911) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119789)); //Bold Italic Capital else if(oString32[i] >= 119912 && oString32[i] <= 119937) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119847)); //Bold Italic Small else if(oString32[i] >= 119938 && oString32[i] <= 119963) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119841)); //Script Capital else if(oString32[i] >= 119964 && oString32[i] <= 119989) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119899)); //Script Small else if(oString32[i] >= 119990 && oString32[i] <= 120015) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119893)); //Bold Script Capital else if(oString32[i] >= 120016 && oString32[i] <= 120041) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119951)); //Bold Script Small else if(oString32[i] >= 120042 && oString32[i] <= 120067) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119945)); //Fraktur Capital(120093?) else if(oString32[i] >= 120068 && oString32[i] <= 120092) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 112003)); //Fraktur Small else if(oString32[i] >= 120094 && oString32[i] <= 120119) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119997)); //Double-Struck Capital(120145?) else if(oString32[i] >= 120120 && oString32[i] <= 120144) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120055)); //Double-Struck Small else if(oString32[i] >= 120146 && oString32[i] <= 120171) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120049)); //Bold Fraktur Capital else if(oString32[i] >= 120172 && oString32[i] <= 120197) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120107)); //Bold Fraktur Small else if(oString32[i] >= 120198 && oString32[i] <= 120223) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120101)); //Sans-Serif Capital else if(oString32[i] >= 120224 && oString32[i] <= 120249) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120159)); //Sans-Serif Small else if(oString32[i] >= 120250 && oString32[i] <= 120275) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120153)); //Sans-Serif Bold Capital else if(oString32[i] >= 120276 && oString32[i] <= 120301) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120211)); //Sans-Serif Bold Small else if(oString32[i] >= 120302 && oString32[i] <= 120327) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120205)); //Sans-Serif Italic Capital else if(oString32[i] >= 120328 && oString32[i] <= 120353) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120263)); //Sans-Serif Italic Small else if(oString32[i] >= 120354 && oString32[i] <= 120379) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120257)); //Sans-Serif Bold Italic Capital else if(oString32[i] >= 120380 && oString32[i] <= 120405) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120315)); //Sans-Serif Bold Italic Small else if(oString32[i] >= 120406 && oString32[i] <= 120431) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120309)); //Monospace Capital else if(oString32[i] >= 120432 && oString32[i] <= 120457) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120367)); //Monospace Small else if(oString32[i] >= 120458 && oString32[i] <= 120483) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120361)); //Bold Capital Alpha else if(oString32[i] >= 120488 && oString32[i] <= 120512) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119575)); //Bold Small Alpha else if(oString32[i] >= 120514 && oString32[i] <= 120538) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119569)); //Italic Capital Alpha else if(oString32[i] >= 120546 && oString32[i] <= 120570) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119633)); //Italic Small Alpha else if(oString32[i] >= 120572 && oString32[i] <= 120596) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119627)); //Bold Italic Capital Alpha else if(oString32[i] >= 120604 && oString32[i] <= 120628) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119691)); //Bold Italic Small Alpha else if(oString32[i] >= 120630 && oString32[i] <= 120654) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119685)); //Sans-Serif Bold Capital Alpha else if(oString32[i] >= 120662 && oString32[i] <= 120686) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119749)); //Sans-Serif Bold Small Alpha else if(oString32[i] >= 120688 && oString32[i] <= 120712) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119743)); //Sans-Serif Bold Italic Capital Alpha else if(oString32[i] >= 120720 && oString32[i] <= 120744) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119807)); //Sans-Serif Bold Italic Small Alpha else if(oString32[i] >= 120746 && oString32[i] <= 120770) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 119801)); //Bold Digit Zero else if(oString32[i] >= 120782 && oString32[i] <= 120791) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120734)); //Double-Struck Digit Zero else if(oString32[i] >= 120792 && oString32[i] <= 120801) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120744)); //Sans-Serif Digit Zero else if(oString32[i] >= 120802 && oString32[i] <= 120811) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120754)); //Monospace Digit Zero else if(oString32[i] >= 120822 && oString32[i] <= 120831) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120774)); //Sans-Serif Bold Digit Zero else if(oString32[i] >= 120812 && oString32[i] <= 120821) wsText16.push_back((wchar_t)((unsigned int) oString32[i] - 120764)); else wsText16.push_back(oString32[i]); } return wsText16; } //class COneElement COneElement::COneElement():m_stAttribute(nullptr),m_iStyle(0) {} COneElement::COneElement(std::wstring &wsOneElement):m_stAttribute(nullptr),m_iStyle(0) { } COneElement::~COneElement() {} COneElement* COneElement::CreateElement(std::wstring &wsOneElement) { if(wsOneElement == L"") return nullptr; std::wstring wsAnnotation = CSpecialChar::DefinitionSpecialChar(wsOneElement); if(COOXml2Odf::IsDigit(wsOneElement)) return new CNumberOrLetter(wsOneElement,StarMath::TypeElement::number); else if(!wsAnnotation.empty()) return new CSpecialChar(wsOneElement,wsAnnotation); else if(wsOneElement == L" ") return new CSpace(); wsAnnotation.clear(); wsAnnotation = CBinOperator::BinOperatorSymbolForAnnotation(wsOneElement); if(wsAnnotation != L"") return new CBinOperator(wsOneElement,wsAnnotation); else wsAnnotation.clear(); wsAnnotation = CRelationsAndOperationsOnSets::TransformationForAnnotation(wsOneElement); if(wsAnnotation != L"") return new CRelationsAndOperationsOnSets(wsOneElement,wsAnnotation); if(COOXml2Odf::IsAlpha(wsOneElement)) return new CNumberOrLetter(wsOneElement,StarMath::TypeElement::letter); else return new CSpecialChar(wsOneElement,L""); } void COneElement::SetType(const TypeElement &enType) { m_enType = enType; } TypeElement COneElement::GetType() { return m_enType; } void COneElement::SetBaseAttribute(StValuePr *stAttribute) { if(m_stAttribute == nullptr) { m_stAttribute = stAttribute; stAttribute->AddRef(); } } StValuePr* COneElement::GetAttribute() { return m_stAttribute; } void COneElement::ConversionAttribute(StValuePr* pAttribute, StStyleMenClose &stStyle, XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation, const bool& bDelimiter) { if(pAttribute == nullptr) return; if(!pAttribute->m_wsColor.empty()) { pXmlWrite->WriteNodeBegin(L"mstyle",true); std::wstring wsColor; bool bColorName = COOXml2Odf::ColorCheck(pAttribute->m_wsColor,wsColor); if(!bColorName) wsColor = L"#" + pAttribute->m_wsColor; pXmlWrite->WriteAttribute(L"mathcolor",wsColor); pXmlWrite->WriteNodeEnd(L"w",true,false); if(bColorName) wsAnnotation += L"color " + wsColor + L" "; else wsAnnotation += L"color hex " + pAttribute->m_wsColor + L" "; stStyle.m_iStyle++; } if(pAttribute->m_iSize != 0) { std::wstring wsSize = std::to_wstring(pAttribute->m_iSize); pXmlWrite->WriteNodeBegin(L"mstyle",true); pXmlWrite->WriteAttribute(L"mathsize",wsSize+L"pt"); pXmlWrite->WriteNodeEnd(L"w",true,false); wsAnnotation += L"size " + wsSize + L" "; stStyle.m_iStyle++; } if(pAttribute->m_enStyle != SimpleTypes::EStyle::stylePlain) { std::wstring wsStyle; switch(pAttribute->m_enStyle) { case SimpleTypes::EStyle::styleBold: { wsStyle = L"bold"; wsAnnotation += L"bold "; break; } case SimpleTypes::EStyle::styleItalic: { wsStyle = L"italic"; wsAnnotation += L"ital "; break; } case SimpleTypes::EStyle::styleBoldItalic: { wsStyle = L"bold-italic"; wsAnnotation += L"bold ital "; break; } } pXmlWrite->WriteNodeBegin(L"mstyle",true); pXmlWrite->WriteAttribute(L"mathvariant",wsStyle); pXmlWrite->WriteNodeEnd(L"w",true,false); stStyle.m_iStyle++; } if(pAttribute->m_enFont != StarMath::TypeFont::empty) { std::wstring wsFont; switch(pAttribute->m_enFont) { case StarMath::TypeFont::fixed: { wsFont = L"monospace"; break; } case StarMath::TypeFont::sans: { wsFont = L"sans-serif"; break; } case StarMath::TypeFont::serif: { wsFont = L"normal"; break; } } pXmlWrite->WriteNodeBegin(L"mstyle",true); pXmlWrite->WriteAttribute(L"mathvariant",wsFont); pXmlWrite->WriteNodeEnd(L"w",true,false); stStyle.m_iStyle++; } if(pAttribute->m_bStrike) { pXmlWrite->WriteNodeBegin(L"menclose",true); pXmlWrite->WriteAttribute(L"notation",L"horizontalstrike"); pXmlWrite->WriteNodeEnd(L"w",true,false); wsAnnotation += L"overstrike "; stStyle.m_bMenClose = true; } if(pAttribute->m_enUnderLine == SimpleTypes::EUnderline::underlineSingle) { pXmlWrite->WriteNodeBegin(L"munder",true); pXmlWrite->WriteAttribute(L"accentunder",L"true"); pXmlWrite->WriteNodeEnd(L"w",true,false); wsAnnotation += L"underline "; stStyle.m_bUnderlineClose = true; } if(!bDelimiter) pAttribute->Release(); } bool COneElement::CheckStyle() { return (m_iStyle != 0); } unsigned int COneElement::GetStyle() { return m_iStyle; } //class CNumberOrLetter CNumberOrLetter::CNumberOrLetter(const std::wstring &wsElement, const TypeElement &enType) { m_wsElement = wsElement; m_enTypeElement = enType; SetType(TypeElement::String); } CNumberOrLetter::~CNumberOrLetter() {} void CNumberOrLetter::Conversion(XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation, TFormulaSize &stSize) { StStyleMenClose stStyle; stSize.m_iWidth += m_wsElement.size(); if(stSize.m_iHeight == 0) stSize.m_iHeight += 1; bool bCloseBracket(false); COneElement::ConversionAttribute(GetAttribute(),stStyle,pXmlWrite,wsAnnotation); if(GetAttribute()!= nullptr && m_wsElement.size()>1) { switch(m_enTypeElement) { case StarMath::TypeElement::number: { if(!COOXml2Odf::IsDigit(m_wsElement)) { wsAnnotation += L"{ "; bCloseBracket = true; } break; } case StarMath::TypeElement::letter: { if(!COOXml2Odf::IsAlpha(m_wsElement)) { wsAnnotation += L"{ "; bCloseBracket = true; } break; } default: break; } } switch(m_enTypeElement) { case StarMath::TypeElement::number: { pXmlWrite->WriteNodeBegin(L"mn",false); pXmlWrite->WriteString(XmlUtils::EncodeXmlString(m_wsElement)); pXmlWrite->WriteNodeEnd(L"mn",false,false); wsAnnotation += m_wsElement + L" "; break; } case StarMath::TypeElement::letter: case StarMath::TypeElement::letter_u32: { COOXml2Odf::MTextRecording(pXmlWrite,wsAnnotation,m_wsElement,stSize); break; } default: break; } if(bCloseBracket) wsAnnotation += L"} "; COOXml2Odf::StyleClosing(stStyle,pXmlWrite); } 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; } void CNumberOrLetter::AddingStrings(const std::wstring &wsString) { m_wsElement += wsString; } //class CBinOperator CBinOperator::~CBinOperator() { delete m_pRightArg; delete m_pLeftArg; } void CBinOperator::Parse(std::wstring::iterator &itStart, std::wstring::iterator &itEnd, COneElement*& pElement) { std::wstring wsTempElement = COOXml2Odf::ParsingText(itStart,itEnd); COneElement* pointElement; pointElement = COneElement::CreateElement(wsTempElement); if(pointElement != nullptr && pointElement->GetType() == TypeElement::Connection && pointElement->GetType() == TypeElement::BinOperator) pElement = pointElement; else m_pRightArg = pointElement; } void CBinOperator::Conversion(XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation, TFormulaSize &stSize) { StStyleMenClose stStyle; stSize.m_iWidth += 1; if(m_pLeftArg == nullptr && m_pRightArg == nullptr) { if(GetAttribute() != nullptr && m_enTypeBinOp != TypeElement::undefine) { COneElement::ConversionAttribute(GetAttribute(),stStyle,pXmlWrite,wsAnnotation); pXmlWrite->WriteNodeBegin(L"mtext",false); pXmlWrite->WriteString(m_wsSymbolBinOp); pXmlWrite->WriteNodeEnd(L"mtext",false,false); wsAnnotation += L"\u0026quot;" + m_wsSymbolBinOp + L"\u0026quot; "; COOXml2Odf::StyleClosing(stStyle,pXmlWrite); return; } } pXmlWrite->WriteNodeBegin(L"mrow",false); if(m_pLeftArg != nullptr) m_pLeftArg->Conversion(pXmlWrite,wsAnnotation,stSize); else if(GetAttribute() != nullptr && m_enTypeBinOp != TypeElement::undefine) COneElement::ConversionAttribute(GetAttribute(),stStyle,pXmlWrite,wsAnnotation); COOXml2Odf::RecordingMoNode(m_wsSymbolBinOp,pXmlWrite); wsAnnotation += m_wsAnnotation + L" "; if(m_pRightArg != nullptr) m_pRightArg->Conversion(pXmlWrite,wsAnnotation,stSize); 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; } void CBinOperator::SetRightArg(COneElement *pElement) { m_pRightArg = pElement; } bool CBinOperator::CheckRightArg() { return (m_pRightArg != nullptr); } bool CBinOperator::CheckRightArg(COneElement* pElement) { if(pElement == nullptr) return false; switch(pElement->GetType()) { case TypeElement::BinOperator: { CBinOperator* pTemp = dynamic_cast(pElement); return pTemp->CheckRightArg(); } case TypeElement::Connection: { CRelationsAndOperationsOnSets* pTemp = dynamic_cast(pElement); return pTemp->CheckRightArg(); } default: return true; } } bool CBinOperator::CheckLeftArg() { return (m_pLeftArg !=nullptr); } template bool SetRightArg(T* pElement,COneElement* pRightArg) { if(!pElement->CheckRightArg()) { pElement->SetRightArg(pRightArg); return true; } return false; } bool CBinOperator::SetRightArg(COneElement *pBinOp, COneElement *pRightArg) { switch(pBinOp->GetType()) { case TypeElement::BinOperator: { return StarMath::SetRightArg(dynamic_cast(pBinOp),pRightArg); } case TypeElement::Connection: { return StarMath::SetRightArg(dynamic_cast(pBinOp),pRightArg); } default: return false; } } bool CBinOperator::SetLeftArg(COneElement *pBinOp, COneElement *pLeftArg) { switch(pBinOp->GetType()) { case TypeElement::BinOperator: { CBinOperator* pTemp = dynamic_cast(pBinOp); switch(pTemp->GetTypeBinOp()) { case TypeElement::neg: return false; case TypeElement::plus: case TypeElement::minus: case TypeElement::plus_minus: case TypeElement::minus_plus: { if(pTemp->GetAttribute() == nullptr) if(!pTemp->CheckLeftArg() && CBinOperator::CheckRightArg(pLeftArg)) { pTemp->SetLeftArg(pLeftArg); return true; } return false; } default: if(!pTemp->CheckLeftArg() && CBinOperator::CheckRightArg(pLeftArg)) { pTemp->SetLeftArg(pLeftArg); return true; } else return false; } } case TypeElement::Connection: { CRelationsAndOperationsOnSets* pTemp = dynamic_cast(pBinOp); if(!pTemp->CheckLeftArg() && CBinOperator::CheckRightArg(pLeftArg)) { pTemp->SetLeftArg(pLeftArg); return true; } return false; } } } TypeElement CBinOperator::GetTypeBinOp() { return m_enTypeBinOp; } std::wstring CBinOperator::BinOperatorSymbolForAnnotation(const std::wstring &wsSymbol) { if(wsSymbol == L"+") return wsSymbol; else if(wsSymbol == L"-") return wsSymbol; else if(L"\u00B1" == wsSymbol) return L"+-"; else if(L"\u2213" == wsSymbol) return L"-+"; else if(L"*" == wsSymbol) return wsSymbol; else if(L"\u00B7" == wsSymbol) return L"cdot"; else if(L"\u00D7" == wsSymbol) return L"times"; else if(L"\u00F7" == wsSymbol) return L"div"; else if(L"\u2295" == wsSymbol) return L"oplus"; else if(L"\u2296" == wsSymbol) return L"ominus"; else if(L"\u2299" == wsSymbol) return L"odot"; else if(L"\u2297" == wsSymbol) return L"otimes"; else if(L"\u2298" == wsSymbol) return L"odivide"; else if(L"\u2218" == wsSymbol) return L"circ"; else if(L"\u2227" == wsSymbol) return L"and"; else if(L"\u2228" == wsSymbol) return L"or"; else if(L"\u00AC" == wsSymbol) return L"neg"; else return L""; } bool CBinOperator::UnaryCheck(const StValuePr *pValue, const TypeElement &enType) { if(pValue != nullptr) { switch(enType) { case TypeElement::plus: case TypeElement::plus_minus: case TypeElement::minus: case TypeElement::minus_plus: return true; default: return false; } } else return false; } //class RelationAndOperation CRelationsAndOperationsOnSets::~CRelationsAndOperationsOnSets() { delete m_pLeftArg; delete m_pRightArg; } void CRelationsAndOperationsOnSets::Parse(std::wstring::iterator &itStart, std::wstring::iterator &itEnd, COneElement *&pElement) { std::wstring wsTempElement = COOXml2Odf::ParsingText(itStart,itEnd); COneElement* pTempElement; pTempElement = COneElement::CreateElement(wsTempElement); if(pTempElement != nullptr && pTempElement->GetType() == TypeElement::Connection && pTempElement->GetType() == TypeElement::BinOperator) pElement = pTempElement; else m_pRightArg = pTempElement; } void CRelationsAndOperationsOnSets::Conversion(XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation, TFormulaSize &stSize) { stSize.m_iWidth += 1; if(m_pLeftArg == nullptr && m_pRightArg == nullptr) COOXml2Odf::MTextRecording(pXmlWrite,wsAnnotation,m_wsSymbol,stSize); else { pXmlWrite->WriteNodeBegin(L"mrow",false); if(m_pLeftArg!= nullptr) { if(GetAttribute() != nullptr) { GetAttribute()->AddRef(); m_pLeftArg->SetBaseAttribute(GetAttribute()); } m_pLeftArg->Conversion(pXmlWrite,wsAnnotation,stSize); } if(m_wsAnnotationSymbol == L"\u0026lt;" || m_wsAnnotationSymbol == L"\u0026gt;") COOXml2Odf::RecordingMoNode(m_wsAnnotationSymbol,pXmlWrite); else COOXml2Odf::RecordingMoNode(m_wsSymbol,pXmlWrite); wsAnnotation += m_wsAnnotationSymbol + L" "; if(m_pRightArg != nullptr) { if(GetAttribute() != nullptr) { GetAttribute()->AddRef(); m_pRightArg->SetBaseAttribute(GetAttribute()); } m_pRightArg->Conversion(pXmlWrite,wsAnnotation,stSize); } 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; } void CRelationsAndOperationsOnSets::SetRightArg(COneElement *pElement) { m_pRightArg = pElement; } bool CRelationsAndOperationsOnSets::CheckLeftArg() { return (m_pLeftArg != nullptr); } bool CRelationsAndOperationsOnSets::CheckRightArg() { return (m_pRightArg != nullptr); } std::wstring CRelationsAndOperationsOnSets::TransformationForAnnotation(std::wstring &wsSymbol) { if(wsSymbol == L"=") return L"= "; else if(wsSymbol == L"\u2260") return L"\u0026lt;\u0026gt; "; else if(wsSymbol == L"\u003C") return L"\u0026lt;"; else if(wsSymbol == L"\u2264") return L"\u0026lt;= "; else if(wsSymbol == L"\u2A7D") return L"leslant "; else if(wsSymbol == L"\u003E") return L"\u0026gt;"; else if(wsSymbol == L"\u2265") return L"\u0026gt;= "; else if(wsSymbol == L"\u2A7E") return L"geslant "; else if(wsSymbol == L"\u226A") return L"\u0026lt;\u0026lt; "; else if(wsSymbol == L"\u226B") return L"\u0026gt;\u0026gt; "; else if(wsSymbol == L"\u2248") return L"approx "; else if(wsSymbol == L"\u223C") return L"sim "; else if(wsSymbol == L"\u2243") return L"simeq "; else if(wsSymbol == L"\u2261") return L"equiv "; else if(wsSymbol == L"\u221D") return L"prop "; else if(wsSymbol == L"\u2225") return L"parallel "; else if(wsSymbol == L"\u22A5") return L"ortho "; else if(wsSymbol == L"\u2223") return L"divides "; else if(wsSymbol == L"\u2224") return L"ndivides "; else if(wsSymbol == L"\u2192") return L"toward "; else if(wsSymbol == L"\u22B7") return L"transl "; else if(wsSymbol == L"\u22B6") return L"transr "; else if(wsSymbol == L"\u225D") return L"def "; else if(wsSymbol == L"\u21D0") return L"dlarrow "; else if(wsSymbol == L"\u21D4") return L"dlrarrow "; else if(wsSymbol == L"\u21D2") return L"drarrow "; else if(wsSymbol == L"\u227A") return L"prec "; else if(wsSymbol == L"\u227B") return L"succ "; else if(wsSymbol == L"\u227C") return L"preccurlyeq "; else if(wsSymbol == L"\u227D") return L"succcurlyeq "; else if(wsSymbol == L"\u227E") return L"precsim "; else if(wsSymbol == L"\u227F") return L"succsim "; else if(wsSymbol == L"\u2280") return L"nprec "; else if(wsSymbol == L"\u2281") return L"nsucc "; else if(wsSymbol == L"\u2208") return L"in "; else if(wsSymbol == L"\u2209") return L"notin "; else if(wsSymbol == L"\u220B") return L"owns "; else if(wsSymbol == L"\u22C2") return L"intersection "; else if(wsSymbol == L"\u22C3") return L"union "; else if(wsSymbol == L"\u2216") return L"setminus "; else if(wsSymbol == L"\u2215") return L"setquotient "; else if(wsSymbol == L"\u2282") return L"subset "; else if(wsSymbol == L"\u2286") return L"subseteq "; else if(wsSymbol == L"\u2283") return L"supset "; else if(wsSymbol == L"\u2287") return L"supseteq "; else if(wsSymbol == L"\u2284") return L"nsubset "; else if(wsSymbol == L"\u2288") return L"nsubseteq "; else if(wsSymbol == L"\u2285") return L"nsupset "; else if(wsSymbol == L"\u2289") return L"nsupseteq "; else return L""; } //class CSpace CSpace::~CSpace() {} void CSpace::Parse(std::wstring::iterator &itStart, std::wstring::iterator &itEnd, COneElement *&pElement) {} void CSpace::Conversion(XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation, TFormulaSize &stSize) { stSize.m_iWidth += 1; pXmlWrite->WriteNodeBegin(L"mspace",true); pXmlWrite->WriteAttribute(L"width",L"0.5em"); pXmlWrite->WriteNodeEnd(L"w",true,true); wsAnnotation += L"` "; } void CSpace::SetAttribute(StValuePr *pAttribute) {} //class CSpecialChar CSpecialChar::~CSpecialChar() {} void CSpecialChar::Parse(std::wstring::iterator &itStart, std::wstring::iterator &itEnd, COneElement *&pElement) {} void CSpecialChar::Conversion(XmlUtils::CXmlWriter *pXmlWrite, std::wstring &wsAnnotation, TFormulaSize &stSize) { StStyleMenClose stStyle; if(GetAttribute() != nullptr) COneElement::ConversionAttribute(GetAttribute(),stStyle,pXmlWrite,wsAnnotation); 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"~ "; stSize.m_iWidth += 1; } else if(!m_wsAnnotation.empty()) { pXmlWrite->WriteNodeBegin(L"mi",true); pXmlWrite->WriteAttribute(L"mathvariant",L"normal"); pXmlWrite->WriteNodeEnd(L"w",true,false); pXmlWrite->WriteString(m_wsSymbol); pXmlWrite->WriteNodeEnd(L"mi",false,false); wsAnnotation += m_wsAnnotation + L" "; stSize.m_iWidth += m_wsAnnotation.size(); } else if(!m_wsSymbol.empty()) COOXml2Odf::MTextRecording(pXmlWrite,wsAnnotation,m_wsSymbol,stSize); 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"; 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"; else if(L"\u211A" == wsSymbol) return L"setQ"; else if(L"\u211D" == wsSymbol) return L"setR"; else if(L"\u2102" == wsSymbol) return L"setC"; else if(L"\u221E" == wsSymbol) return L"infinity"; else if(L"\u2202" == wsSymbol) return L"partial"; else if(L"\u2207" == wsSymbol) return L"nabla"; else if(L"\u2203" == wsSymbol) return L"exists"; else if(L"\u2204" == wsSymbol) return L"notexists"; else if(L"\u2200" == wsSymbol) return L"forall"; else if(L"\u0127" == wsSymbol) return L"hbar"; else if(L"\u019B" == wsSymbol) return L"lambdabar"; else if(L"\u211C" == wsSymbol) return L"Re"; else if(L"\u2111" == wsSymbol) return L"Im"; else if(L"\u2118" == wsSymbol) return L"wp"; else if(L"\u2112" == wsSymbol) return L"laplace"; else if(L"\u2131" == wsSymbol) return L"fourier"; else if(L"\u03F6" == wsSymbol) return L"backepsilon"; else if(L"\u2190" == wsSymbol) return L"leftarrow"; else if(L"\u2794" == wsSymbol) return L"rightarrow"; else if(L"\u2191" == wsSymbol) return L"uparrow"; else if(L"\u2193" == wsSymbol) return L"downarrow"; else if(L"\u2026" == wsSymbol) return L"dotslow"; else if(L"\u22EF" == wsSymbol) return L"dotsaxis"; 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""; } }