From 719754554125f9426ed3c4217d9567327f4d0ea0 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 11 Aug 2023 17:38:50 +0300 Subject: [PATCH 001/117] Started development of StarMath string parser --- .../StarMath2OOXML/StarMath2OOXML.pro | 16 ++ .../Reader/Converter/StarMath2OOXML/Test.cpp | 8 + .../StarMath2OOXML/cstarmathpars.cpp | 137 ++++++++++++++++++ .../Converter/StarMath2OOXML/cstarmathpars.h | 80 ++++++++++ 4 files changed, 241 insertions(+) create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro new file mode 100644 index 0000000000..19b793007b --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro @@ -0,0 +1,16 @@ +QT -= core gui + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) + +ADD_DEPENDENCY(UnicodeConverter, kernel) + +SOURCES += Test.cpp \ + cstarmathpars.cpp + +HEADERS += \ + cstarmathpars.h + +DESTDIR = $$PWD_ROOT_DIR/build/$$CIRE_BUILDS_PLATFORM_PREFIX/$$CORE_BUILDS_CONFIGURATION_PREFIX diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp new file mode 100644 index 0000000000..1624792f99 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp @@ -0,0 +1,8 @@ +#include "cstarmathpars.h" + +int main() +{ + std::wstring Temp = L"+245 + -376"; + StarMath::CStarMathPars TempO; + TempO.Pars(Temp); +} diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp new file mode 100644 index 0000000000..53d1f07891 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -0,0 +1,137 @@ +#include "cstarmathpars.h" +namespace StarMath +{ +//Class methods CStarMathPars + CStarMathPars::CStarMathPars() + { + } + + CStarMathPars::~CStarMathPars() + { + for(CElement* ReleaseObject: m_arParsLine) + { + delete ReleaseObject; + } + } + + void CStarMathPars::Pars(std::wstring& sStarMathLine) + { + std::wstring m_wsTempValueElement; + std::wstring::iterator itFirst = sStarMathLine.begin(), itEnd = sStarMathLine.end(); + while(itFirst != itEnd) + { + m_wsTempValueElement = sGetElement(itFirst,itEnd); + ParsElement(m_wsTempValueElement); + } + } + std::wstring CStarMathPars::sGetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd) + { + std::wstring m_wsElement; + for(itFirst; itFirst != itEnd;itFirst++) + { + if(*itFirst != ' ') m_wsElement.push_back(*itFirst); + else + { + itFirst++; + break; + } + } + return m_wsElement; + } + void CStarMathPars::ParsElement(std::wstring &sOneElement) + { + CNumber m_oDigit; + CUnarySign m_oUnarSign; + bool itDigit = CheckDigit(sOneElement); + if(itDigit) m_arParsLine.push_back(m_oDigit.GetNumber(sOneElement)); + else if(sOneElement.size() > 3 && CheckUnarSign(sOneElement,m_oUnarSign)) ParsElement(sOneElement); + } + + bool CStarMathPars::CheckDigit(std::wstring &wsCheckToken) + { + for(char Check: wsCheckToken) + { + if(!isdigit(Check)) return false; + } + return true; + } + + bool CStarMathPars::CheckUnarSign(std::wstring &wsCheckToken,CUnarySign& m_oUnarSign) + { + std::wstring wsTempValueUnarSign; + bool UnarSign = false; + for(int i = 0;i<2;i++) + { + if(wsCheckToken[i] == '+' || wsCheckToken[i] == '-') + { + wsTempValueUnarSign.push_back(wsCheckToken[i]); + UnarSign = true; + } + } + if(!wsTempValueUnarSign.empty() && UnarSign) + { + m_arParsLine.push_back(m_oUnarSign.GetUnarSign(wsTempValueUnarSign)); + wsCheckToken = wsCheckToken.substr(wsTempValueUnarSign.size()); + } + return UnarSign; + } +//Class methods CNumber + CNumber::CNumber() + { + } + + CNumber::~CNumber() + { + } + + std::wstring CNumber::GetValue() + { + return m_sValueNumber; + } + TypeElement CNumber::GetType() + { + return Number; + } + CNumber* CNumber::GetNumber(std::wstring& sNumberElement) + { + + CNumber* oValue = new CNumber; + oValue->m_sValueNumber = sNumberElement; + return oValue; +//Class methods CUnarySign + } + CUnarySign* CUnarySign::GetUnarSign(std::wstring& sUnarToken) + { + CUnarySign* oSign = new CUnarySign; + oSign->m_sUnar = sUnarToken; + return oSign; + } + + std::wstring CUnarySign::GetValue() + { + return m_sUnar; + } + TypeElement CUnarySign::GetType() + { + return m_UnarType; + } + CUnarySign::CUnarySign() + {} + CUnarySign::~CUnarySign() + {} +//Class methods CBinaryOperator + CBinaryOperator::CBinaryOperator() + {} + CBinaryOperator::~CBinaryOperator() + {} + TypeElement CBinaryOperator::GetType() + { + return m_TypeSign; + } + std::wstring CBinaryOperator::GetValue() + { + std::cout << m_TypeSign; + return L"Good"; + } +} + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h new file mode 100644 index 0000000000..f8164011c8 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -0,0 +1,80 @@ +#ifndef CSTARMATHPARS_H +#define CSTARMATHPARS_H +#include +#include +#include + +namespace StarMath +{ + enum TypeElement{Number,UnarSign,SM_BinOper_cdot,SM_BinOper_times,SM_BinOper_over,SM_BinOper_plus,SM_BinOper_minus,SM_BinOper_frac,SM_BinOper_div}; + class CElement + { + public: + virtual std::wstring GetValue() = 0; + virtual TypeElement GetType() = 0; + }; + + class CNumber: public CElement + { + public: + CNumber(); + ~CNumber(); + CNumber* GetNumber(std::wstring& sNumberElement); + std::wstring GetValue() override; + TypeElement GetType() override ; + private: + std::wstring m_sValueNumber; + TypeElement m_Number = Number; + }; + + class CUnarySign: public CElement + { + public: + CUnarySign(); + ~CUnarySign(); + std::wstring GetValue() override; + TypeElement GetType() override; + CUnarySign* GetUnarSign(std::wstring& sUnarToken); + private: + std::wstring m_sUnar; + TypeElement m_UnarType = UnarSign; + }; + class CBinaryOperator: public CElement + { + public: + CBinaryOperator(); + ~CBinaryOperator(); + std::wstring GetValue() override; + TypeElement GetType() override; + CBinaryOperator* GetSign(std::wstring& wsSignToken); + private: + TypeElement m_TypeSign; + }; + + class CBoxValue: public CElement + { + public: + CBoxValue(); + ~CBoxValue(); + CBoxValue* ReadBox(std::string::iterator& itStartBox,std::string::iterator& itEndBox); + std::wstring GetValue() override; + private: + std::vector arValueBox; + }; + + class CStarMathPars + { + public: + CStarMathPars(); + ~CStarMathPars(); + void Pars(std::wstring& sStarMathLine); + std::wstring sGetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd); + void ParsElement(std::wstring& sOneElement); + bool CheckDigit(std::wstring& wsCheckToken); + bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& m_oUnarSign); + private: + std::vector m_arParsLine; + }; +} + +#endif // CSTARMATHPARS_H From aa9ff3732064346e33d577bba2c213b460b891a7 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 18 Aug 2023 19:44:42 +0300 Subject: [PATCH 002/117] Development of algorithms --- .../Reader/Converter/StarMath2OOXML/Test.cpp | 2 +- .../StarMath2OOXML/cstarmathpars.cpp | 353 ++++++++++++++++-- .../Converter/StarMath2OOXML/cstarmathpars.h | 123 ++++-- 3 files changed, 420 insertions(+), 58 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp index 1624792f99..5d42b1aaef 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp @@ -2,7 +2,7 @@ int main() { - std::wstring Temp = L"+245 + -376"; + std::wstring Temp = L"37 over 7 over 7"; StarMath::CStarMathPars TempO; TempO.Pars(Temp); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 53d1f07891..d077fc78dd 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -6,7 +6,7 @@ namespace StarMath { } - CStarMathPars::~CStarMathPars() + CStarMathPars::~CStarMathPars() { for(CElement* ReleaseObject: m_arParsLine) { @@ -14,40 +14,74 @@ namespace StarMath } } - void CStarMathPars::Pars(std::wstring& sStarMathLine) + void CStarMathPars::PrintAr() + { + for(int i = 0;iGetType(); + } + } + + void CStarMathPars::Pars(std::wstring& wsStarMathLine) { - std::wstring m_wsTempValueElement; - std::wstring::iterator itFirst = sStarMathLine.begin(), itEnd = sStarMathLine.end(); + std::wstring::iterator itFirst = wsStarMathLine.begin(), itEnd = wsStarMathLine.end(); while(itFirst != itEnd) { - m_wsTempValueElement = sGetElement(itFirst,itEnd); - ParsElement(m_wsTempValueElement); + m_arParsLine.push_back(ParsElement(itFirst,itEnd)); } + PrintAr(); } - std::wstring CStarMathPars::sGetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd) + std::wstring CStarMathPars::GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd) { std::wstring m_wsElement; for(itFirst; itFirst != itEnd;itFirst++) { - if(*itFirst != ' ') m_wsElement.push_back(*itFirst); - else + if(iswspace(*itFirst)) { itFirst++; break; } + else if(!m_wsElement.empty() && (*itFirst == L'{' || *itFirst == L'}' || (isalpha(*itFirst) && isdigit(m_wsElement.back())) || (isdigit(*itFirst) && isalpha(m_wsElement.back())))) + { + return m_wsElement; + } + else if((*itFirst == L'{' || *itFirst == L'}') && m_wsElement.empty() ) + { + m_wsElement.push_back(*itFirst); + return m_wsElement; + } + else + { + m_wsElement.push_back(*itFirst); + } } - return m_wsElement; + if(!m_wsElement.empty()) return m_wsElement; + else return {}; } - void CStarMathPars::ParsElement(std::wstring &sOneElement) + CElement* CStarMathPars::ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd) { - CNumber m_oDigit; - CUnarySign m_oUnarSign; - bool itDigit = CheckDigit(sOneElement); - if(itDigit) m_arParsLine.push_back(m_oDigit.GetNumber(sOneElement)); - else if(sOneElement.size() > 3 && CheckUnarSign(sOneElement,m_oUnarSign)) ParsElement(sOneElement); + TypeBinOperator enTypeBinOp; + std::wstring wsOneElement = GetElement(itFirst,itEnd); + if(CheckDigit(wsOneElement)) + { + return new CNumber(wsOneElement); + } + else if(CheckBinOperator(wsOneElement,enTypeBinOp) || (wsOneElement.size() == 1 && CheckOneElementBinOperator(wsOneElement[0],enTypeBinOp))) + { + if(!m_arParsLine.empty()) + { + CBinaryOperator* m_pBinOp = new CBinaryOperator; + m_pBinOp->SetLeftArg(m_arParsLine.back()); + m_pBinOp->SetRightArg(ParsElement(itFirst,itEnd)); + m_pBinOp->SetTypeBin(enTypeBinOp); + m_arParsLine.pop_back(); + return m_pBinOp; + } + return NULL; + } } - bool CStarMathPars::CheckDigit(std::wstring &wsCheckToken) + bool CStarMathPars::CheckDigit(const std::wstring &wsCheckToken) { for(char Check: wsCheckToken) { @@ -56,7 +90,17 @@ namespace StarMath return true; } - bool CStarMathPars::CheckUnarSign(std::wstring &wsCheckToken,CUnarySign& m_oUnarSign) + /*bool CStarMathPars::CheckScalable_NotScalableBracket(const std::wstring &wsCheckToken, TypeElement &TypeBracket) + { + std::wstring wsSubstring; + if((wsSubstring = wsCheckToken.substr(0,4)) == L"left") + { + wsSubstring = wsCheckToken.substr(5); + return CheckScalable_NotScalableBracket(wsSubstring,TypeBracket); + } + }*/ +////////////////Requires improvement + /*bool CStarMathPars::CheckUnarSign(std::wstring &wsCheckToken,CUnarySign& m_oUnarSign) { std::wstring wsTempValueUnarSign; bool UnarSign = false; @@ -74,46 +118,198 @@ namespace StarMath wsCheckToken = wsCheckToken.substr(wsTempValueUnarSign.size()); } return UnarSign; + }*/ + + bool CStarMathPars::CheckBinOperator(const std::wstring &wsCheckToken, TypeBinOperator& enTypeBinOperator) + { + if(wsCheckToken == L"over") + { + enTypeBinOperator = over; + return true; + } + else if(wsCheckToken == L"cdot") + { + enTypeBinOperator = cdot; + return true; + } + else if(wsCheckToken == L"times") + { + enTypeBinOperator = times; + return true; + } + else if(wsCheckToken == L"frac") + { + enTypeBinOperator = frac; + return true; + } + else if(wsCheckToken == L"div") + { + enTypeBinOperator = div; + return true; + } + else if(wsCheckToken == L"oplus") + { + enTypeBinOperator = oplus; + return true; + } + else if(wsCheckToken == L"ominus") + { + enTypeBinOperator = ominus; + return true; + } + else if(wsCheckToken == L"odot") + { + enTypeBinOperator = odot; + return true; + } + else if(wsCheckToken == L"otimes") + { + enTypeBinOperator = otimes; + return true; + } + else if(wsCheckToken == L"odivide") + { + enTypeBinOperator = odivide; + return true; + } + else if(wsCheckToken == L"circ") + { + enTypeBinOperator = circ; + return true; + } + else if(wsCheckToken == L"wideslash") + { + enTypeBinOperator = wideslash; + return true; + } + else if(wsCheckToken == L"widebslash") + { + enTypeBinOperator = widebslash; + return true; + } + else return false; + } + + bool CStarMathPars::CheckOneElementBinOperator(const char &wsCheckToken, TypeBinOperator &enTypeBinOperator) + { + switch (wsCheckToken) + { + case '+': + enTypeBinOperator = plus; + return true; + break; + case '-': + enTypeBinOperator = minus; + return true; + break; + case '*': + enTypeBinOperator = multipl; + return true; + break; + case '/': + enTypeBinOperator = division; + return true; + break; + default: + return false; + break; + } + } + bool CStarMathPars::CheckOperator(const std::wstring &wsCheckToken, TypeOperator & enTypeOperator) + { + if(wsCheckToken == L"lim") + { + enTypeOperator = lim; + return true; + } + else if(wsCheckToken == L"sum") + { + enTypeOperator = sum; + return true; + } + else return false; + } + /*bool CStarMathPars::CheckIndex(const std::wstring &wsCheckToken, TypeBinOperator &TypeIndex) + { + if(wsCheckToken == L"from") + { + TypeIndex = SM_Index_from; + return true; + } + else if(wsCheckToken ==L"to") + { + TypeIndex = SM_Index_to; + return true; + } + else return false; + }*/ + bool CStarMathPars::CheckBracket(const char &wsCheckToken, TypeBracket & enTypeBracket) + { + switch (wsCheckToken) { + case '{': + enTypeBracket = brace_opening; + return true; + break; + case '}': + enTypeBracket = brace_closing; + return true; + break; + case '(': + enTypeBracket = round_opening; + return true; + break; + case ')': + enTypeBracket = round_closing; + return true; + break; + case '[': + enTypeBracket = square_opening; + return true; + break; + case ']': + enTypeBracket = square_closing; + return true; + break; + default: + return false; + break; + } } //Class methods CNumber CNumber::CNumber() { } - + CNumber::CNumber(const std::wstring &wsValue) + { + this->m_wsValueNumber = wsValue; + } CNumber::~CNumber() { } std::wstring CNumber::GetValue() { - return m_sValueNumber; + return m_wsValueNumber; } TypeElement CNumber::GetType() { return Number; } - CNumber* CNumber::GetNumber(std::wstring& sNumberElement) - { - - CNumber* oValue = new CNumber; - oValue->m_sValueNumber = sNumberElement; - return oValue; //Class methods CUnarySign - } - CUnarySign* CUnarySign::GetUnarSign(std::wstring& sUnarToken) + CUnarySign* CUnarySign::GetUnarSign(const std::wstring& wsUnarToken) { CUnarySign* oSign = new CUnarySign; - oSign->m_sUnar = sUnarToken; + oSign->m_wsUnar = wsUnarToken; return oSign; } std::wstring CUnarySign::GetValue() { - return m_sUnar; + return m_wsUnar; } TypeElement CUnarySign::GetType() { - return m_UnarType; + return m_enUnarType; } CUnarySign::CUnarySign() {} @@ -123,15 +319,104 @@ namespace StarMath CBinaryOperator::CBinaryOperator() {} CBinaryOperator::~CBinaryOperator() - {} + { + for(CElement* ReleaseObject: arLeftArg) + { + delete ReleaseObject; + } + for(CElement* ReleaseObject: arRightArg) + { + delete ReleaseObject; + } + } TypeElement CBinaryOperator::GetType() { - return m_TypeSign; + for(CElement* enTemp: arLeftArg) + { + std::wcout<< enTemp->GetType() << std::endl; + } + for(CElement* enTemp: arRightArg) + { + std::wcout<< enTemp->GetType() << std::endl; + } + return BinOperator; } std::wstring CBinaryOperator::GetValue() { - std::cout << m_TypeSign; + return {}; + } + TypeBinOperator CBinaryOperator::GetTypeBin() + { + return enTypeBinOp; + } + void CBinaryOperator::SetLeftArg( CElement *oLeftArg) + { + this->arLeftArg.push_back(oLeftArg); + } + void CBinaryOperator::SetRightArg(CElement *oRightArg) + { + this->arRightArg.push_back(oRightArg); + } + void CBinaryOperator::SetTypeBin(const TypeBinOperator &enType) + { + this->enTypeBinOp = enType; + } +//Class methods COperator + COperator::COperator() + {} + COperator::~COperator() + {} + TypeElement COperator::GetType() + { + return enType; + } + std::wstring COperator::GetValue() + { + return L""; + } + COperator* COperator::GetOperator(const TypeElement &enTypeOper) + { + COperator* oOper = new COperator; + oOper->enType = enTypeOper; + return oOper; + } +//Class methods CIndex + CIndex::CIndex() + {} + CIndex::~CIndex() + {} + TypeElement CIndex::GetType() + { + return enType; + } + std::wstring CIndex::GetValue() + { return L"Good"; } + CIndex* CIndex::GetIndex(const TypeElement &enTypeIndex) + { + CIndex* oIndex = new CIndex; + oIndex->enType = enTypeIndex; + return oIndex; + } +//Class methods CBracket + CBracket::CBracket() + {} + CBracket::~CBracket() + {} + TypeElement CBracket::GetType() + { + return enTypeEl; + } + std::wstring CBracket::GetValue() + { + return L"Good"; + } + CBracket* CBracket::GetBracket(const TypeBracket &enTypeBracket) + { + CBracket* oBracket = new CBracket; + oBracket->enTypeBracket = enTypeBracket; + return oBracket; + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index f8164011c8..dc5583a137 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -3,10 +3,54 @@ #include #include #include +#include namespace StarMath { - enum TypeElement{Number,UnarSign,SM_BinOper_cdot,SM_BinOper_times,SM_BinOper_over,SM_BinOper_plus,SM_BinOper_minus,SM_BinOper_frac,SM_BinOper_div}; + enum TypeElement{ + Number, + BinOperator, + Operator, + Bracket, + UnarSign, + Box, + SM_Index_from, + SM_Index_to, + }; + enum TypeBinOperator + { + cdot, + times, + over, + plus, + minus, + frac, + div, + multipl, + division, + oplus, + ominus, + odot, + otimes, + odivide, + circ, + wideslash, + widebslash, + }; + enum TypeOperator + { + lim, + sum, + }; + enum TypeBracket + { + brace_opening, + brace_closing, + round_opening, + round_closing, + square_opening, + square_closing, + }; class CElement { public: @@ -18,13 +62,12 @@ namespace StarMath { public: CNumber(); + CNumber(const std::wstring& wsValue); ~CNumber(); - CNumber* GetNumber(std::wstring& sNumberElement); std::wstring GetValue() override; TypeElement GetType() override ; private: - std::wstring m_sValueNumber; - TypeElement m_Number = Number; + std::wstring m_wsValueNumber; }; class CUnarySign: public CElement @@ -34,44 +77,78 @@ namespace StarMath ~CUnarySign(); std::wstring GetValue() override; TypeElement GetType() override; - CUnarySign* GetUnarSign(std::wstring& sUnarToken); + CUnarySign* GetUnarSign(const std::wstring& wsUnarToken); private: - std::wstring m_sUnar; - TypeElement m_UnarType = UnarSign; + std::wstring m_wsUnar; + TypeElement m_enUnarType = UnarSign; }; class CBinaryOperator: public CElement { public: CBinaryOperator(); - ~CBinaryOperator(); + virtual ~CBinaryOperator(); std::wstring GetValue() override; TypeElement GetType() override; - CBinaryOperator* GetSign(std::wstring& wsSignToken); + TypeBinOperator GetTypeBin(); + void SetTypeBin(const TypeBinOperator& enType); + void SetLeftArg(CElement* oLeftArg); + void SetRightArg(CElement* oRightArg); private: - TypeElement m_TypeSign; + TypeBinOperator enTypeBinOp; + std::vector arLeftArg; + std::vector arRightArg; }; - - class CBoxValue: public CElement + class COperator: public CElement { public: - CBoxValue(); - ~CBoxValue(); - CBoxValue* ReadBox(std::string::iterator& itStartBox,std::string::iterator& itEndBox); + COperator(); + ~COperator(); std::wstring GetValue() override; + TypeElement GetType() override; + COperator* GetOperator(const TypeElement& enTypeOper); private: - std::vector arValueBox; + TypeElement enType; + }; + class CIndex: public CElement + { + public: + CIndex(); + ~CIndex(); + std::wstring GetValue() override; + TypeElement GetType() override; + CIndex* GetIndex(const TypeElement& enTypeIndex); + private: + TypeElement enType; + }; + class CBracket: public CElement + { + public: + CBracket(); + ~CBracket(); + std::wstring GetValue() override; + TypeElement GetType() override; + CBracket* GetBracket(const TypeBracket& enTypeBracket); + private: + TypeBracket enTypeBracket; + TypeElement enTypeEl; }; - class CStarMathPars { public: CStarMathPars(); - ~CStarMathPars(); - void Pars(std::wstring& sStarMathLine); - std::wstring sGetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd); - void ParsElement(std::wstring& sOneElement); - bool CheckDigit(std::wstring& wsCheckToken); - bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& m_oUnarSign); + virtual ~CStarMathPars(); + void Pars(std::wstring& wsStarMathLine); + std::wstring GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd); + CElement* ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd); + bool CheckDigit(const std::wstring& wsCheckToken); + bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& oUnarSign); + bool CheckBinOperator(const std::wstring& wsCheckToken,TypeBinOperator& enTypeBinOperator); + bool CheckOneElementBinOperator(const char& wsCheckToken, TypeBinOperator& enTypeBinOperator); + bool CheckOperator(const std::wstring& wsCheckToken,TypeOperator& enTypeOperator); + bool CheckIndex(const std::wstring& wsCheckToken, TypeElement& TypeIndex); + bool CheckBracket(const char& wsCheckToken,TypeBracket& TypeBracket); + bool CheckScalable_NotScalableBracket(const std::wstring& wsCheckToken, TypeElement& TypeBracket); + void PrintAr(); private: std::vector m_arParsLine; }; From 5ac9df5d896dca72939302c363d9e9825a594f7e Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 25 Aug 2023 18:28:53 +0300 Subject: [PATCH 003/117] Improvement of functionality (brackets, scalable brackets, attributes) --- .../Reader/Converter/StarMath2OOXML/Test.cpp | 2 +- .../StarMath2OOXML/cstarmathpars.cpp | 509 ++++++++++++++---- .../Converter/StarMath2OOXML/cstarmathpars.h | 129 +++-- 3 files changed, 513 insertions(+), 127 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp index 5d42b1aaef..7284ecff94 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp @@ -2,7 +2,7 @@ int main() { - std::wstring Temp = L"37 over 7 over 7"; + std::wstring Temp = L"lim from color red bold {7 over 5 over 3} to 56 721 "; StarMath::CStarMathPars TempO; TempO.Pars(Temp); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index d077fc78dd..87576579c8 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -27,27 +27,30 @@ namespace StarMath std::wstring::iterator itFirst = wsStarMathLine.begin(), itEnd = wsStarMathLine.end(); while(itFirst != itEnd) { - m_arParsLine.push_back(ParsElement(itFirst,itEnd)); + m_arParsLine.push_back(ParsElement(itFirst,itEnd,m_arParsLine)); + //std::wcout << GetElement(itFirst,itEnd)<& arParsLine) { TypeBinOperator enTypeBinOp; + TypeBracket enTypeBracket; + TypeOperator enTypeOp; + TypeAttribute enTypeAtt; std::wstring wsOneElement = GetElement(itFirst,itEnd); if(CheckDigit(wsOneElement)) { return new CNumber(wsOneElement); } - else if(CheckBinOperator(wsOneElement,enTypeBinOp) || (wsOneElement.size() == 1 && CheckOneElementBinOperator(wsOneElement[0],enTypeBinOp))) + else if(wsOneElement.size() == 1 && CheckOneElementBinOperator(wsOneElement[0],enTypeBinOp)) { - if(!m_arParsLine.empty()) + return new CBinaryOperator(enTypeBinOp); + } + else if(CheckBinOperator(wsOneElement,enTypeBinOp)) + { + if(!arParsLine.empty()) { CBinaryOperator* m_pBinOp = new CBinaryOperator; - m_pBinOp->SetLeftArg(m_arParsLine.back()); - m_pBinOp->SetRightArg(ParsElement(itFirst,itEnd)); + m_pBinOp->SetLeftArg(arParsLine.back()); + m_pBinOp->SetRightArg(ParsElement(itFirst,itEnd,arParsLine)); m_pBinOp->SetTypeBin(enTypeBinOp); - m_arParsLine.pop_back(); + arParsLine.pop_back(); return m_pBinOp; } return NULL; } + else if(CheckBracket(wsOneElement[0],enTypeBracket)) + { + std::vector arValueBrecket; + std::wstring::iterator itTempIteratorforBacket = itFirst; + wsOneElement = GetElement(itFirst,itEnd); + while(wsOneElement[0] != L'}') + { + arValueBrecket.push_back(ParsElement(itTempIteratorforBacket,itEnd,arValueBrecket)); + itFirst = itTempIteratorforBacket; + wsOneElement = GetElement(itFirst,itEnd); + } + return new CBracket(arValueBrecket,enTypeBracket); + } + else if(CheckOperator(wsOneElement,enTypeOp)) + { + COperator* oTempOp = new COperator; + std::vector arValueBrecket; + std::wstring::iterator itSavePos; + do + { + itSavePos = itFirst; + wsOneElement = GetElement(itFirst,itEnd); + if( wsOneElement == L"from") + oTempOp->SetFrom(ParsElement(itFirst,itEnd,arValueBrecket)); + else if(wsOneElement == L"to") + oTempOp->SetTo(ParsElement(itFirst,itEnd,arValueBrecket)); + else + break; + }while(true); + oTempOp->SetValueOp(ParsElement(itSavePos,itEnd,arValueBrecket)); + oTempOp->SetTypeOp(enTypeOp); + return oTempOp; + } + else if(CheckTopAttribute(wsOneElement,enTypeAtt) || CheckPropertiesAttribute(wsOneElement,enTypeAtt)|| (wsOneElement == L"color" && CheckColorAttribute(GetElement(itFirst,itEnd),enTypeAtt))) + { + return new CAttribute(ParsElement(itFirst,itEnd,arParsLine),enTypeAtt); + } +// else if(wsOneElement == L"left" && CheckScalable_NotScalableBracket(GetElement(itFirst,itEnd),enTypeBracket)) +// { +// std::vector arValueBrecket; +// std::wstring::iterator itTempIteratorforBacket = itFirst; +// wsOneElement = GetElement(itFirst,itEnd); +// while(wsOneElement != L"right") +// { +// arValueBrecket.push_back(ParsElement(itTempIteratorforBacket,itEnd,arValueBrecket)); +// itFirst = itTempIteratorforBacket; +// wsOneElement = GetElement(itFirst,itEnd); +// } +// wsOneElement = GetElement(itFirst,itEnd); +// return new CBracket(arValueBrecket,enTypeBracket); +// } } bool CStarMathPars::CheckDigit(const std::wstring &wsCheckToken) @@ -89,16 +150,44 @@ namespace StarMath } return true; } - - /*bool CStarMathPars::CheckScalable_NotScalableBracket(const std::wstring &wsCheckToken, TypeElement &TypeBracket) + bool CStarMathPars::CheckScalable_NotScalableBracket(const std::wstring &wsCheckToken, TypeBracket &enType) { - std::wstring wsSubstring; - if((wsSubstring = wsCheckToken.substr(0,4)) == L"left") + if(wsCheckToken == L"ldbracket") { - wsSubstring = wsCheckToken.substr(5); - return CheckScalable_NotScalableBracket(wsSubstring,TypeBracket); + enType = ldbracket; + return true; } - }*/ + else if(wsCheckToken == L"lbrace") + { + enType = lbrace; + return true; + } + else if(wsCheckToken == L"langle") + { + enType = langle; + return true; + } + else if(wsCheckToken == L"lceil") + { + enType = lceil; + return true; + } + else if(wsCheckToken == L"lfloor") + { + enType = lfloor; + return true; + } + else if(wsCheckToken == L"lline") + { + enType = lline; + return true; + } + else if(wsCheckToken == L"ldline") + { + enType = ldline; + return true; + } + } ////////////////Requires improvement /*bool CStarMathPars::CheckUnarSign(std::wstring &wsCheckToken,CUnarySign& m_oUnarSign) { @@ -197,22 +286,18 @@ namespace StarMath case '+': enTypeBinOperator = plus; return true; - break; case '-': enTypeBinOperator = minus; return true; - break; + case '*': enTypeBinOperator = multipl; return true; - break; case '/': enTypeBinOperator = division; return true; - break; default: return false; - break; } } bool CStarMathPars::CheckOperator(const std::wstring &wsCheckToken, TypeOperator & enTypeOperator) @@ -229,52 +314,256 @@ namespace StarMath } else return false; } - /*bool CStarMathPars::CheckIndex(const std::wstring &wsCheckToken, TypeBinOperator &TypeIndex) + bool CStarMathPars::CheckIndex(const std::wstring &wsCheckToken) { if(wsCheckToken == L"from") { - TypeIndex = SM_Index_from; return true; } else if(wsCheckToken ==L"to") { - TypeIndex = SM_Index_to; return true; } else return false; - }*/ + } bool CStarMathPars::CheckBracket(const char &wsCheckToken, TypeBracket & enTypeBracket) { switch (wsCheckToken) { case '{': - enTypeBracket = brace_opening; + enTypeBracket = brace; return true; - break; - case '}': - enTypeBracket = brace_closing; - return true; - break; case '(': - enTypeBracket = round_opening; + enTypeBracket = round; return true; - break; - case ')': - enTypeBracket = round_closing; - return true; - break; case '[': - enTypeBracket = square_opening; + enTypeBracket = square; return true; - break; - case ']': - enTypeBracket = square_closing; - return true; - break; default: return false; - break; } } + bool CStarMathPars::CheckTopAttribute(const std::wstring& wsCheckToken,TypeAttribute& enTypeAtt) + { + if(wsCheckToken == L"acute") + { + enTypeAtt = acute; + return true; + } + else if(wsCheckToken == L"breve") + { + enTypeAtt = breve; + return true; + } + else if(wsCheckToken == L"dot") + { + enTypeAtt = dot; + return true; + } + else if(wsCheckToken == L"dddot") + { + enTypeAtt = dddot; + return true; + } + else if(wsCheckToken == L"vec") + { + enTypeAtt = vec; + return true; + } + else if(wsCheckToken == L"tilde") + { + enTypeAtt = tilde; + return true; + } + else if(wsCheckToken == L"check") + { + enTypeAtt = check; + return true; + } + else if(wsCheckToken == L"grave") + { + enTypeAtt = grave; + return true; + } + else if(wsCheckToken == L"circle") + { + enTypeAtt = circle; + return true; + } + else if(wsCheckToken == L"ddot") + { + enTypeAtt = ddot; + return true; + } + else if(wsCheckToken == L"bar") + { + enTypeAtt = bar; + return true; + } + else if(wsCheckToken == L"harpoon") + { + enTypeAtt = harpoon; + return true; + } + else if(wsCheckToken == L"hat") + { + enTypeAtt = hat; + return true; + } + else if(wsCheckToken == L"widevec") + { + enTypeAtt = widevec; + return true; + } + else if(wsCheckToken == L"widetilde") + { + enTypeAtt = widetilde; + return true; + } + else if(wsCheckToken == L"overline") + { + enTypeAtt = overline; + return true; + } + else if(wsCheckToken == L"overstrike") + { + enTypeAtt = overstrike; + return true; + } + else if(wsCheckToken == L"wideharpoon") + { + enTypeAtt = wideharpoon; + return true; + } + else if(wsCheckToken == L"widehat") + { + enTypeAtt = widehat; + return true; + } + else if(wsCheckToken == L"underline") + { + enTypeAtt = underline; + return true; + } + else return false; + } + bool CStarMathPars::CheckPropertiesAttribute(const std::wstring& wsCheckToken,TypeAttribute& enTypeAtt) + { + if(wsCheckToken == L"phantom") + { + enTypeAtt = phantom; + return true; + } + else if(wsCheckToken == L"bold") + { + enTypeAtt = bold; + return true; + } + else if(wsCheckToken == L"ital") + { + enTypeAtt = ital; + return true; + } + else return false; + } + bool CStarMathPars::CheckColorAttribute(const std::wstring &wsCheckToken, TypeAttribute &enTypeAtt) + { + if(wsCheckToken == L"black") + { + enTypeAtt = black; + return true; + } + else if(wsCheckToken == L"green") + { + enTypeAtt = green; + return true; + } + else if(wsCheckToken == L"aqua") + { + enTypeAtt = aqua; + return true; + } + else if(wsCheckToken == L"yellow") + { + enTypeAtt = yellow; + return true; + } + else if(wsCheckToken == L"lime") + { + enTypeAtt = lime; + return true; + } + else if(wsCheckToken == L"navy") + { + enTypeAtt = navy; + return true; + } + else if(wsCheckToken == L"purple") + { + enTypeAtt = purple; + return true; + } + else if(wsCheckToken == L"teal") + { + enTypeAtt = teal; + return true; + } + else if(wsCheckToken == L"blue") + { + enTypeAtt = blue; + return true; + } + else if(wsCheckToken == L"red") + { + enTypeAtt = red; + return true; + } + else if(wsCheckToken == L"fuchsia") + { + enTypeAtt = fuchsia; + return true; + } + else if(wsCheckToken == L"gray") + { + enTypeAtt = gray; + return true; + } + else if(wsCheckToken == L"maroon") + { + enTypeAtt = maroon; + return true; + } + else if(wsCheckToken == L"olive") + { + enTypeAtt = olive; + return true; + } + else if(wsCheckToken == L"silver") + { + enTypeAtt = silver; + return true; + } + else if(wsCheckToken == L"coral") + { + enTypeAtt = coral; + return true; + } + else if(wsCheckToken == L"midnightblue") + { + enTypeAtt = midnightblue; + return true; + } + else if(wsCheckToken == L"crimson") + { + enTypeAtt = crimson; + return true; + } + else if(wsCheckToken == L"violet") + { + enTypeAtt = violet; + return true; + } + else return false; + } //Class methods CNumber CNumber::CNumber() { @@ -318,27 +607,19 @@ namespace StarMath //Class methods CBinaryOperator CBinaryOperator::CBinaryOperator() {} + CBinaryOperator::CBinaryOperator(const TypeBinOperator &enType) + { + enTypeBinOp = enType; + arLeftArg = nullptr; + arRightArg = nullptr; + } CBinaryOperator::~CBinaryOperator() { - for(CElement* ReleaseObject: arLeftArg) - { - delete ReleaseObject; - } - for(CElement* ReleaseObject: arRightArg) - { - delete ReleaseObject; - } + delete arLeftArg; + delete arRightArg; } TypeElement CBinaryOperator::GetType() { - for(CElement* enTemp: arLeftArg) - { - std::wcout<< enTemp->GetType() << std::endl; - } - for(CElement* enTemp: arRightArg) - { - std::wcout<< enTemp->GetType() << std::endl; - } return BinOperator; } std::wstring CBinaryOperator::GetValue() @@ -351,72 +632,114 @@ namespace StarMath } void CBinaryOperator::SetLeftArg( CElement *oLeftArg) { - this->arLeftArg.push_back(oLeftArg); + this->arLeftArg = oLeftArg; } void CBinaryOperator::SetRightArg(CElement *oRightArg) { - this->arRightArg.push_back(oRightArg); + this->arRightArg = oRightArg; } void CBinaryOperator::SetTypeBin(const TypeBinOperator &enType) { this->enTypeBinOp = enType; } //Class methods COperator - COperator::COperator() + COperator::COperator(): oFromValue(NULL),oToValue(NULL),oValueOp(NULL) {} COperator::~COperator() - {} + { + delete oFromValue; + delete oToValue; + delete oValueOp; + } TypeElement COperator::GetType() { - return enType; + /*std::wcout << oFromValue->GetType() <GetType() <GetType() <enType = enTypeOper; - return oOper; + return enTypeOp; } -//Class methods CIndex - CIndex::CIndex() - {} - CIndex::~CIndex() - {} - TypeElement CIndex::GetType() + void COperator::SetFrom(CElement *oFrom) { - return enType; + oFromValue = oFrom; } - std::wstring CIndex::GetValue() + void COperator::SetTo(CElement *oTo) { - return L"Good"; + oToValue = oTo; } - CIndex* CIndex::GetIndex(const TypeElement &enTypeIndex) + void COperator::SetValueOp(CElement *oValue) { - CIndex* oIndex = new CIndex; - oIndex->enType = enTypeIndex; - return oIndex; + oValueOp = oValue; + } + void COperator::SetTypeOp(const TypeOperator& enType) + { + enTypeOp = enType; + } + void COperator::AvailabilityMline() + { + bMline = true; } //Class methods CBracket CBracket::CBracket() {} + CBracket::CBracket(const std::vector& arValue,const TypeBracket& enType) + { + arBrecketVal = arValue; + enTypeBracket = enType; + } CBracket::~CBracket() - {} + { + for(CElement* ReleaseObject: arBrecketVal) + { + delete ReleaseObject; + } + } TypeElement CBracket::GetType() { - return enTypeEl; + for(CElement* enTemp: arBrecketVal) + { + std::wcout<< enTemp->GetType() << std::endl; + } + return Bracket; } std::wstring CBracket::GetValue() { - return L"Good"; + return {}; } - CBracket* CBracket::GetBracket(const TypeBracket &enTypeBracket) +//Class methods CAttribute + CAttribute::CAttribute() + {} + CAttribute::CAttribute(CElement *oValue, const TypeAttribute &enType) { - CBracket* oBracket = new CBracket; - oBracket->enTypeBracket = enTypeBracket; - return oBracket; + enTypeAtt = enType; + oValueAtt = oValue; + } + CAttribute::~CAttribute() + { + delete oValueAtt; + } + std::wstring CAttribute::GetValue() + { + return {}; + } + TypeElement CAttribute::GetType() + { + return Attribute; + } + void CAttribute::SetTypeAtt(const TypeAttribute &enType) + { + enTypeAtt = enType; + } + void CAttribute::SetValueAtt(CElement *oValue) + { + oValueAtt = oValue; } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index dc5583a137..e0c8a4cb14 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -13,9 +13,7 @@ namespace StarMath Operator, Bracket, UnarSign, - Box, - SM_Index_from, - SM_Index_to, + Attribute, }; enum TypeBinOperator { @@ -44,12 +42,61 @@ namespace StarMath }; enum TypeBracket { - brace_opening, - brace_closing, - round_opening, - round_closing, - square_opening, - square_closing, + brace, + round, + square, + ldbracket, + lbrace, + langle, + lceil, + lfloor, + lline, + ldline, + }; + enum TypeAttribute + { + acute, + breve, + dot, + dddot, + vec, + tilde, + check, + grave, + circle, + ddot, + bar, + harpoon, + hat, + widevec, + widetilde, + overline, + overstrike, + wideharpoon, + widehat, + underline,//top elements + phantom, + bold, + ital,//properties (without a pin and headset) + black, + green, + aqua, + yellow, + lime, + navy, + purple, + teal, + blue, + red, + fuchsia, + gray, + maroon, + olive, + silver, + coral, + midnightblue, + crimson, + violet,//color(without rgb and hex) }; class CElement { @@ -63,7 +110,7 @@ namespace StarMath public: CNumber(); CNumber(const std::wstring& wsValue); - ~CNumber(); + virtual ~CNumber(); std::wstring GetValue() override; TypeElement GetType() override ; private: @@ -86,6 +133,7 @@ namespace StarMath { public: CBinaryOperator(); + CBinaryOperator(const TypeBinOperator& enType); virtual ~CBinaryOperator(); std::wstring GetValue() override; TypeElement GetType() override; @@ -95,42 +143,54 @@ namespace StarMath void SetRightArg(CElement* oRightArg); private: TypeBinOperator enTypeBinOp; - std::vector arLeftArg; - std::vector arRightArg; + CElement* arLeftArg; + CElement* arRightArg; }; class COperator: public CElement { public: COperator(); - ~COperator(); + virtual ~COperator(); std::wstring GetValue() override; TypeElement GetType() override; - COperator* GetOperator(const TypeElement& enTypeOper); + TypeOperator GetTypeOp(); + void SetTypeOp(const TypeOperator& enType); + void SetFrom(CElement* oFrom); + void SetTo(CElement* oTo); + void SetValueOp(CElement* oValue); + void AvailabilityMline(); private: - TypeElement enType; - }; - class CIndex: public CElement - { - public: - CIndex(); - ~CIndex(); - std::wstring GetValue() override; - TypeElement GetType() override; - CIndex* GetIndex(const TypeElement& enTypeIndex); - private: - TypeElement enType; + TypeOperator enTypeOp; + CElement* oFromValue{nullptr}; + CElement* oToValue{nullptr}; + CElement* oValueOp{nullptr}; + bool bMline{false}; }; class CBracket: public CElement { public: CBracket(); - ~CBracket(); + CBracket(const std::vector& arValue,const TypeBracket& enType); + virtual ~CBracket(); std::wstring GetValue() override; TypeElement GetType() override; - CBracket* GetBracket(const TypeBracket& enTypeBracket); private: TypeBracket enTypeBracket; - TypeElement enTypeEl; + std::vector arBrecketVal; + }; + class CAttribute: public CElement + { + public: + CAttribute(); + CAttribute(CElement* oValue,const TypeAttribute& enType); + virtual ~CAttribute(); + std::wstring GetValue() override; + TypeElement GetType() override; + void SetTypeAtt(const TypeAttribute& enType); + void SetValueAtt(CElement* oValue); + private: + TypeAttribute enTypeAtt; + CElement* oValueAtt; }; class CStarMathPars { @@ -139,15 +199,18 @@ namespace StarMath virtual ~CStarMathPars(); void Pars(std::wstring& wsStarMathLine); std::wstring GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd); - CElement* ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd); + CElement* ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, std::vector& arParsLine); bool CheckDigit(const std::wstring& wsCheckToken); bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& oUnarSign); bool CheckBinOperator(const std::wstring& wsCheckToken,TypeBinOperator& enTypeBinOperator); bool CheckOneElementBinOperator(const char& wsCheckToken, TypeBinOperator& enTypeBinOperator); bool CheckOperator(const std::wstring& wsCheckToken,TypeOperator& enTypeOperator); - bool CheckIndex(const std::wstring& wsCheckToken, TypeElement& TypeIndex); - bool CheckBracket(const char& wsCheckToken,TypeBracket& TypeBracket); - bool CheckScalable_NotScalableBracket(const std::wstring& wsCheckToken, TypeElement& TypeBracket); + bool CheckIndex(const std::wstring& wsCheckToken); + bool CheckBracket(const char& wsCheckToken,TypeBracket& enTypeBracket); + bool CheckScalable_NotScalableBracket(const std::wstring& wsCheckToken, TypeBracket& enType); + bool CheckTopAttribute(const std::wstring& wsCheckToken,TypeAttribute& enTypeAtt); + bool CheckPropertiesAttribute(const std::wstring& wsCheckToken,TypeAttribute& enTypeAtt); + bool CheckColorAttribute(const std::wstring& wsCheckToken, TypeAttribute& enTypeAtt); void PrintAr(); private: std::vector m_arParsLine; From 9e009cc0f8103d01af34f9ddc2f7ad9ed5fea0d7 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Sat, 2 Sep 2023 10:11:57 +0300 Subject: [PATCH 004/117] Revision of reading brackets. Conversion development. --- .../StarMath2OOXML/StarMath2OOXML.pro | 2 + .../Reader/Converter/StarMath2OOXML/Test.cpp | 5 +- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 78 ++ .../StarMath2OOXML/cconversionsmtoooxml.h | 22 + .../StarMath2OOXML/cstarmathpars.cpp | 906 +++++++++--------- .../Converter/StarMath2OOXML/cstarmathpars.h | 101 +- 6 files changed, 652 insertions(+), 462 deletions(-) create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro index 19b793007b..1353236bee 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro +++ b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro @@ -8,9 +8,11 @@ include($$CORE_ROOT_DIR/Common/base.pri) ADD_DEPENDENCY(UnicodeConverter, kernel) SOURCES += Test.cpp \ + cconversionsmtoooxml.cpp \ cstarmathpars.cpp HEADERS += \ + cconversionsmtoooxml.h \ cstarmathpars.h DESTDIR = $$PWD_ROOT_DIR/build/$$CIRE_BUILDS_PLATFORM_PREFIX/$$CORE_BUILDS_CONFIGURATION_PREFIX diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp index 7284ecff94..7e664e4714 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp @@ -1,8 +1,11 @@ #include "cstarmathpars.h" +#include "cconversionsmtoooxml.h" int main() { - std::wstring Temp = L"lim from color red bold {7 over 5 over 3} to 56 721 "; + std::wstring Temp = L"2+1"; StarMath::CStarMathPars TempO; TempO.Pars(Temp); + ConversionSM2OOXML::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(TempO.GetVector()); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp new file mode 100644 index 0000000000..7c41842c5e --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -0,0 +1,78 @@ +#include "cconversionsmtoooxml.h" +namespace ConversionSM2OOXML { + CConversionSMtoOOXML::CConversionSMtoOOXML() + { + } + void CConversionSMtoOOXML::StartConversion(std::vector arPars) + { + m_oXmlWrite.WriteNodeBegin(L"m:oMathPara",false); + m_oXmlWrite.WriteNodeBegin(L"m:oMath",false); + m_oXmlWrite.WriteNodeBegin(L"m:r",false); + StandartProperties(); + for(StarMath::CElement* m_oTempElement:arPars) + { + ConversionOneElement(m_oTempElement); + } + EndConversion(); + std::wcout<< m_oXmlWrite.GetXmlString()<GetType() == 0) + { + ConversNumber(dynamic_cast(m_oElement)); + } + else if(m_oElement->GetType() == 1) + { + ConversBinOperator(dynamic_cast (m_oElement)); + } + } + void CConversionSMtoOOXML::ConversBinOperator(StarMath::CBinaryOperator *m_oElement) + { + if(m_oElement->GetTypeBin() == 3 || m_oElement->GetTypeBin() == 4) + { + m_oXmlWrite.WriteNodeBegin(L"m:t",false); + ConversionOneElement(m_oElement->GetLeftArg()); + if(m_oElement->GetTypeRight() == 0) + { + if(m_oElement->GetTypeBin() == 3) m_oXmlWrite.WriteString(L"+"); + else m_oXmlWrite.WriteString(L"-"); + ConversionOneElement(m_oElement->GetRightArg()); + } + m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); + } + } + void CConversionSMtoOOXML::ConversNumber(StarMath::CNumber *m_oElement) + { + m_oXmlWrite.WriteString(m_oElement->GetValue()); + } + void CConversionSMtoOOXML::StandartProperties() + { + m_oXmlWrite.WriteNodeBegin(L"m:rPr",false); + m_oXmlWrite.WriteNodeBegin(L"m:sty",true); + m_oXmlWrite.WriteAttribute(L"m:val",L"p"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNodeEnd(L"m:rPr",false,false); + m_oXmlWrite.WriteNodeBegin(L"w:rPr",false); + m_oXmlWrite.WriteNodeBegin(L"w:rFonts",true); + m_oXmlWrite.WriteAttribute(L"w:hAnsi",L"Cambria Math"); + m_oXmlWrite.WriteAttribute(L"w:ascii",L"Cambria Math"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNodeBegin(L"w:sz",true); + m_oXmlWrite.WriteAttribute(L"w:val",L"40"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNodeBegin(L"w:szCs",true); + m_oXmlWrite.WriteAttribute(L"w:val",L"40"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNodeBegin(L"w:lang",true); + m_oXmlWrite.WriteAttribute(L"w:val",L"en-US"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNodeEnd(L"w:rPr",false,false); + } + void CConversionSMtoOOXML::EndConversion() + { + m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:oMath",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:oMathPara",false,false); + } +} diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h new file mode 100644 index 0000000000..f658e68cb1 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -0,0 +1,22 @@ +#ifndef CCONVERSIONSMTOOOXML_H +#define CCONVERSIONSMTOOOXML_H +#include "cstarmathpars.h" +#include "X:/Rabotka/Clone/core/DesktopEditor/xml/include/xmlwriter.h" + +namespace ConversionSM2OOXML { + class CConversionSMtoOOXML + { + public: + CConversionSMtoOOXML(); + //friend class StarMath::CStarMathPars; + void StartConversion(std::vector arPars); + void StandartProperties(); + void ConversionOneElement(StarMath::CElement* m_oElement); + void ConversBinOperator(StarMath::CBinaryOperator* m_oElement); + void ConversNumber(StarMath::CNumber* m_oElement); + void EndConversion(); + private: + XmlUtils::CXmlWriter m_oXmlWrite; + }; +} +#endif // CCONVERSIONSMTOOOXML_H diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 87576579c8..89b890d057 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -30,7 +30,8 @@ namespace StarMath m_arParsLine.push_back(ParsElement(itFirst,itEnd,m_arParsLine)); //std::wcout << GetElement(itFirst,itEnd)<& arParsLine) { - TypeBinOperator enTypeBinOp; - TypeBracket enTypeBracket; - TypeOperator enTypeOp; - TypeAttribute enTypeAtt; + CAttribute* m_oAttribute = new CAttribute; std::wstring wsOneElement = GetElement(itFirst,itEnd); + while((L"color" == wsOneElement && CheckingTheNextElement(itFirst,itEnd,CheckColorAttribute))|| CheckPropertiesAttribute(wsOneElement) || CheckTopAttribute(wsOneElement)) + { + if(wsOneElement == L"color") wsOneElement = GetElement(itFirst,itEnd); + m_oAttribute->SetTypeAtt(wsOneElement); + wsOneElement = GetElement(itFirst,itEnd); + } + if(CheckDigit(wsOneElement)) { - return new CNumber(wsOneElement); + CNumber* m_oCNumber = new CNumber(wsOneElement); + m_oCNumber->SetAttribute(m_oAttribute); + return m_oCNumber; } - else if(wsOneElement.size() == 1 && CheckOneElementBinOperator(wsOneElement[0],enTypeBinOp)) - { - return new CBinaryOperator(enTypeBinOp); - } - else if(CheckBinOperator(wsOneElement,enTypeBinOp)) + if(CheckSpecialCharacter(wsOneElement)) return new CSpecialCharacters(wsOneElement); + else if(CheckBinOperator(wsOneElement) || CheckPlusOrMinus(wsOneElement) || CheckBinOperatorLowPriority(wsOneElement)) { if(!arParsLine.empty()) { - CBinaryOperator* m_pBinOp = new CBinaryOperator; + CBinaryOperator* m_pBinOp = new CBinaryOperator(wsOneElement); + CElement* m_oTempElement{ParsElement(itFirst,itEnd,arParsLine)}; m_pBinOp->SetLeftArg(arParsLine.back()); - m_pBinOp->SetRightArg(ParsElement(itFirst,itEnd,arParsLine)); - m_pBinOp->SetTypeBin(enTypeBinOp); arParsLine.pop_back(); + if(((CheckPlusOrMinus(wsOneElement) || CheckBinOperatorLowPriority(wsOneElement)) && (CheckingTheNextElement(itFirst, itEnd,CheckBinOperator)||CheckingTheNextElement(itFirst, itEnd, CheckIndex))) || (CheckBinOperator(wsOneElement) && CheckingTheNextElement(itFirst, itEnd,CheckIndex))) + { + arParsLine.push_back(m_oTempElement); + m_pBinOp->SetRightArg(ParsElement(itFirst,itEnd,arParsLine)); + } + else m_pBinOp->SetRightArg(m_oTempElement); + m_pBinOp->SetAttribute(m_oAttribute); return m_pBinOp; } return NULL; } - else if(CheckBracket(wsOneElement[0],enTypeBracket)) + else if(CheckBracketOpen(wsOneElement) || CheckScalable_NotScalableBracketLeft(wsOneElement) || (L"left" == wsOneElement && CheckingTheNextElement(itFirst,itEnd,CheckScalable_NotScalableBracketLeft))) { + CBracket* m_oBracket = new CBracket; + std::wstring wsTypeBracket; std::vector arValueBrecket; - std::wstring::iterator itTempIteratorforBacket = itFirst; - wsOneElement = GetElement(itFirst,itEnd); - while(wsOneElement[0] != L'}') + if(L"left" == wsOneElement) { - arValueBrecket.push_back(ParsElement(itTempIteratorforBacket,itEnd,arValueBrecket)); - itFirst = itTempIteratorforBacket; + m_oBracket->SetScalable(); wsOneElement = GetElement(itFirst,itEnd); + wsTypeBracket = wsOneElement; } - return new CBracket(arValueBrecket,enTypeBracket); + else wsTypeBracket = wsOneElement; + while(!CheckingTheNextElement(itFirst,itEnd,CheckBracketClose) && !CheckingTheNextElement(itFirst,itEnd,CheckScalable_NotScalableBracketRight)) + { + arValueBrecket.push_back(ParsElement(itFirst,itEnd,arValueBrecket)); + } + wsOneElement = GetElement(itFirst,itEnd); + std::wcout << wsOneElement << std::endl; + if(L"right" == wsOneElement) wsOneElement = GetElement(itFirst,itEnd); + m_oBracket->SetBracketVal(arValueBrecket); + m_oBracket->SetTypeBracket(wsTypeBracket); + m_oBracket ->SetAttribute(m_oAttribute); + return m_oBracket; } - else if(CheckOperator(wsOneElement,enTypeOp)) + else if(CheckOperator(wsOneElement)) { - COperator* oTempOp = new COperator; + COperator* oTempOp = new COperator(wsOneElement); std::vector arValueBrecket; std::wstring::iterator itSavePos; do @@ -119,27 +140,9 @@ namespace StarMath break; }while(true); oTempOp->SetValueOp(ParsElement(itSavePos,itEnd,arValueBrecket)); - oTempOp->SetTypeOp(enTypeOp); + oTempOp->SetAttribute(m_oAttribute); return oTempOp; } - else if(CheckTopAttribute(wsOneElement,enTypeAtt) || CheckPropertiesAttribute(wsOneElement,enTypeAtt)|| (wsOneElement == L"color" && CheckColorAttribute(GetElement(itFirst,itEnd),enTypeAtt))) - { - return new CAttribute(ParsElement(itFirst,itEnd,arParsLine),enTypeAtt); - } -// else if(wsOneElement == L"left" && CheckScalable_NotScalableBracket(GetElement(itFirst,itEnd),enTypeBracket)) -// { -// std::vector arValueBrecket; -// std::wstring::iterator itTempIteratorforBacket = itFirst; -// wsOneElement = GetElement(itFirst,itEnd); -// while(wsOneElement != L"right") -// { -// arValueBrecket.push_back(ParsElement(itTempIteratorforBacket,itEnd,arValueBrecket)); -// itFirst = itTempIteratorforBacket; -// wsOneElement = GetElement(itFirst,itEnd); -// } -// wsOneElement = GetElement(itFirst,itEnd); -// return new CBracket(arValueBrecket,enTypeBracket); -// } } bool CStarMathPars::CheckDigit(const std::wstring &wsCheckToken) @@ -150,43 +153,13 @@ namespace StarMath } return true; } - bool CStarMathPars::CheckScalable_NotScalableBracket(const std::wstring &wsCheckToken, TypeBracket &enType) + bool CStarMathPars::CheckScalable_NotScalableBracketLeft(const std::wstring &wsCheckToken) { - if(wsCheckToken == L"ldbracket") - { - enType = ldbracket; - return true; - } - else if(wsCheckToken == L"lbrace") - { - enType = lbrace; - return true; - } - else if(wsCheckToken == L"langle") - { - enType = langle; - return true; - } - else if(wsCheckToken == L"lceil") - { - enType = lceil; - return true; - } - else if(wsCheckToken == L"lfloor") - { - enType = lfloor; - return true; - } - else if(wsCheckToken == L"lline") - { - enType = lline; - return true; - } - else if(wsCheckToken == L"ldline") - { - enType = ldline; - return true; - } + return(L"ldbracket" == wsCheckToken || L"lbrace" == wsCheckToken || L"langle" == wsCheckToken || L"lceil" == wsCheckToken || L"lfloor" == wsCheckToken || L"lline" == wsCheckToken || L"ldline" == wsCheckToken); + } + bool CStarMathPars::CheckScalable_NotScalableBracketRight(const std::wstring &wsCheckToken) + { + return(L"rdbracket" == wsCheckToken || L"rbrace" == wsCheckToken || L"rangle" == wsCheckToken || L"rceil" == wsCheckToken || L"rfloor" == wsCheckToken || L"rline" == wsCheckToken || L"rdline" == wsCheckToken || L"right" == wsCheckToken); } ////////////////Requires improvement /*bool CStarMathPars::CheckUnarSign(std::wstring &wsCheckToken,CUnarySign& m_oUnarSign) @@ -208,361 +181,92 @@ namespace StarMath } return UnarSign; }*/ - - bool CStarMathPars::CheckBinOperator(const std::wstring &wsCheckToken, TypeBinOperator& enTypeBinOperator) + bool CStarMathPars::CheckingTheNextElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, bool (&func)(const std::wstring&)) { - if(wsCheckToken == L"over") - { - enTypeBinOperator = over; - return true; - } - else if(wsCheckToken == L"cdot") - { - enTypeBinOperator = cdot; - return true; - } - else if(wsCheckToken == L"times") - { - enTypeBinOperator = times; - return true; - } - else if(wsCheckToken == L"frac") - { - enTypeBinOperator = frac; - return true; - } - else if(wsCheckToken == L"div") - { - enTypeBinOperator = div; - return true; - } - else if(wsCheckToken == L"oplus") - { - enTypeBinOperator = oplus; - return true; - } - else if(wsCheckToken == L"ominus") - { - enTypeBinOperator = ominus; - return true; - } - else if(wsCheckToken == L"odot") - { - enTypeBinOperator = odot; - return true; - } - else if(wsCheckToken == L"otimes") - { - enTypeBinOperator = otimes; - return true; - } - else if(wsCheckToken == L"odivide") - { - enTypeBinOperator = odivide; - return true; - } - else if(wsCheckToken == L"circ") - { - enTypeBinOperator = circ; - return true; - } - else if(wsCheckToken == L"wideslash") - { - enTypeBinOperator = wideslash; - return true; - } - else if(wsCheckToken == L"widebslash") - { - enTypeBinOperator = widebslash; - return true; - } - else return false; + std::wstring::iterator itTempVal = itFirst; + bool bResult = func(GetElement(itFirst,itEnd)); + itFirst = itTempVal; + return bResult; } - - bool CStarMathPars::CheckOneElementBinOperator(const char &wsCheckToken, TypeBinOperator &enTypeBinOperator) + bool CStarMathPars::CheckBinOperator(const std::wstring &wsCheckToken) { - switch (wsCheckToken) - { - case '+': - enTypeBinOperator = plus; - return true; - case '-': - enTypeBinOperator = minus; - return true; - - case '*': - enTypeBinOperator = multipl; - return true; - case '/': - enTypeBinOperator = division; - return true; - default: - return false; - } + return(L"*" ==wsCheckToken || L"/" == wsCheckToken || wsCheckToken == L"over" || wsCheckToken == L"cdot" || wsCheckToken == L"times" || wsCheckToken == L"frac" || wsCheckToken == L"div" || wsCheckToken == L"odot" || wsCheckToken == L"otimes" || wsCheckToken == L"odivide" || wsCheckToken == L"wideslash" || wsCheckToken == L"widebslash"); } - bool CStarMathPars::CheckOperator(const std::wstring &wsCheckToken, TypeOperator & enTypeOperator) + bool CStarMathPars::CheckBinOperatorLowPriority(const std::wstring &wsCheckToken) { - if(wsCheckToken == L"lim") - { - enTypeOperator = lim; - return true; - } - else if(wsCheckToken == L"sum") - { - enTypeOperator = sum; - return true; - } - else return false; + return (wsCheckToken == L"oplus" || wsCheckToken == L"ominus"|| wsCheckToken == L"circ"); } - bool CStarMathPars::CheckIndex(const std::wstring &wsCheckToken) + bool CStarMathPars::CheckPlusOrMinus(const std::wstring &wsCheckToken) { - if(wsCheckToken == L"from") + switch (wsCheckToken[0]) { + case L'+': return true; - } - else if(wsCheckToken ==L"to") - { - return true; - } - else return false; - } - bool CStarMathPars::CheckBracket(const char &wsCheckToken, TypeBracket & enTypeBracket) - { - switch (wsCheckToken) { - case '{': - enTypeBracket = brace; - return true; - case '(': - enTypeBracket = round; - return true; - case '[': - enTypeBracket = square; + case L'-': return true; default: return false; } } - bool CStarMathPars::CheckTopAttribute(const std::wstring& wsCheckToken,TypeAttribute& enTypeAtt) + bool CStarMathPars::CheckOperator(const std::wstring &wsCheckToken) { - if(wsCheckToken == L"acute") - { - enTypeAtt = acute; - return true; - } - else if(wsCheckToken == L"breve") - { - enTypeAtt = breve; - return true; - } - else if(wsCheckToken == L"dot") - { - enTypeAtt = dot; - return true; - } - else if(wsCheckToken == L"dddot") - { - enTypeAtt = dddot; - return true; - } - else if(wsCheckToken == L"vec") - { - enTypeAtt = vec; - return true; - } - else if(wsCheckToken == L"tilde") - { - enTypeAtt = tilde; - return true; - } - else if(wsCheckToken == L"check") - { - enTypeAtt = check; - return true; - } - else if(wsCheckToken == L"grave") - { - enTypeAtt = grave; - return true; - } - else if(wsCheckToken == L"circle") - { - enTypeAtt = circle; - return true; - } - else if(wsCheckToken == L"ddot") - { - enTypeAtt = ddot; - return true; - } - else if(wsCheckToken == L"bar") - { - enTypeAtt = bar; - return true; - } - else if(wsCheckToken == L"harpoon") - { - enTypeAtt = harpoon; - return true; - } - else if(wsCheckToken == L"hat") - { - enTypeAtt = hat; - return true; - } - else if(wsCheckToken == L"widevec") - { - enTypeAtt = widevec; - return true; - } - else if(wsCheckToken == L"widetilde") - { - enTypeAtt = widetilde; - return true; - } - else if(wsCheckToken == L"overline") - { - enTypeAtt = overline; - return true; - } - else if(wsCheckToken == L"overstrike") - { - enTypeAtt = overstrike; - return true; - } - else if(wsCheckToken == L"wideharpoon") - { - enTypeAtt = wideharpoon; - return true; - } - else if(wsCheckToken == L"widehat") - { - enTypeAtt = widehat; - return true; - } - else if(wsCheckToken == L"underline") - { - enTypeAtt = underline; - return true; - } - else return false; + return(wsCheckToken == L"lim" || wsCheckToken == L"sum"); } - bool CStarMathPars::CheckPropertiesAttribute(const std::wstring& wsCheckToken,TypeAttribute& enTypeAtt) + bool CStarMathPars::CheckIndex(const std::wstring &wsCheckToken) { - if(wsCheckToken == L"phantom") - { - enTypeAtt = phantom; - return true; - } - else if(wsCheckToken == L"bold") - { - enTypeAtt = bold; - return true; - } - else if(wsCheckToken == L"ital") - { - enTypeAtt = ital; - return true; - } - else return false; + return (wsCheckToken == L"from" || wsCheckToken == L"to" || wsCheckToken[0] == L'_' || wsCheckToken[0] == L'^' ); } - bool CStarMathPars::CheckColorAttribute(const std::wstring &wsCheckToken, TypeAttribute &enTypeAtt) + bool CStarMathPars::CheckBracketOpen(const std::wstring& wsCheckToken) { - if(wsCheckToken == L"black") - { - enTypeAtt = black; + switch (wsCheckToken[0]) { + case '{': return true; - } - else if(wsCheckToken == L"green") - { - enTypeAtt = green; + case '(': return true; - } - else if(wsCheckToken == L"aqua") - { - enTypeAtt = aqua; + case '[': return true; - } - else if(wsCheckToken == L"yellow") - { - enTypeAtt = yellow; + case '}': return true; - } - else if(wsCheckToken == L"lime") - { - enTypeAtt = lime; + case ')': return true; - } - else if(wsCheckToken == L"navy") - { - enTypeAtt = navy; + case ']': return true; + default: + return false; } - else if(wsCheckToken == L"purple") - { - enTypeAtt = purple; + } + bool CStarMathPars::CheckBracketClose(const std::wstring& wsCheckToken) + { + switch (wsCheckToken[0]) {; + case '}': return true; - } - else if(wsCheckToken == L"teal") - { - enTypeAtt = teal; + case ')': return true; - } - else if(wsCheckToken == L"blue") - { - enTypeAtt = blue; + case ']': return true; + default: + return false; } - else if(wsCheckToken == L"red") - { - enTypeAtt = red; - return true; - } - else if(wsCheckToken == L"fuchsia") - { - enTypeAtt = fuchsia; - return true; - } - else if(wsCheckToken == L"gray") - { - enTypeAtt = gray; - return true; - } - else if(wsCheckToken == L"maroon") - { - enTypeAtt = maroon; - return true; - } - else if(wsCheckToken == L"olive") - { - enTypeAtt = olive; - return true; - } - else if(wsCheckToken == L"silver") - { - enTypeAtt = silver; - return true; - } - else if(wsCheckToken == L"coral") - { - enTypeAtt = coral; - return true; - } - else if(wsCheckToken == L"midnightblue") - { - enTypeAtt = midnightblue; - return true; - } - else if(wsCheckToken == L"crimson") - { - enTypeAtt = crimson; - return true; - } - else if(wsCheckToken == L"violet") - { - enTypeAtt = violet; - return true; - } - else return false; + } + bool CStarMathPars::CheckTopAttribute(const std::wstring& wsCheckToken) + { + return(L"acute" == wsCheckToken || L"breve" == wsCheckToken || L"dot" == wsCheckToken || L"dddot" == wsCheckToken || L"vec" == wsCheckToken || L"tilde" == wsCheckToken || L"check" == wsCheckToken || L"grave" == wsCheckToken || L"circle" == wsCheckToken || L"ddot" == wsCheckToken || L"bar" == wsCheckToken || L"harpoon" == wsCheckToken || L"hat" == wsCheckToken || L"widevec" == wsCheckToken || L"widetilde" == wsCheckToken || L"overline" == wsCheckToken || L"overstrike" == wsCheckToken || L"wideharpoon" == wsCheckToken || L"widehat" == wsCheckToken || L"underline" == wsCheckToken); + } + bool CStarMathPars::CheckPropertiesAttribute(const std::wstring& wsCheckToken) + { + return(L"ital" == wsCheckToken || L"bold" == wsCheckToken || L"phantom" == wsCheckToken); + } + bool CStarMathPars::CheckColorAttribute(const std::wstring &wsCheckToken) + { + return (L"violet" == wsCheckToken || L"black" == wsCheckToken || L"green" == wsCheckToken || L"aqua" == wsCheckToken || L"yellow" == wsCheckToken || L"lime" == wsCheckToken || L"navy" == wsCheckToken || L"purple" == wsCheckToken || L"teal" == wsCheckToken || L"blue" == wsCheckToken || L"red" == wsCheckToken || L"fuchsia" == wsCheckToken || L"gray" == wsCheckToken || L"maroon" == wsCheckToken || L"olive" == wsCheckToken || L"silver" == wsCheckToken || L"coral" == wsCheckToken || L"midnightblue" == wsCheckToken || L"crimson" == wsCheckToken || L"violet" == wsCheckToken); + } + bool CStarMathPars::CheckSpecialCharacter(const std::wstring &wsCheckToken) + { + return (L"mline" == wsCheckToken || L"grid" == wsCheckToken); + } + std::vector CStarMathPars::GetVector() + { + return m_arParsLine; } //Class methods CNumber CNumber::CNumber() @@ -607,9 +311,76 @@ namespace StarMath //Class methods CBinaryOperator CBinaryOperator::CBinaryOperator() {} - CBinaryOperator::CBinaryOperator(const TypeBinOperator &enType) + CBinaryOperator::CBinaryOperator(const std::wstring& wsToken) { - enTypeBinOp = enType; + if(wsToken == L"+") + { + enTypeBinOp = plus; + } + else if(wsToken == L"-") + { + enTypeBinOp = minus; + } + else if(wsToken == L"*") + { + enTypeBinOp = multipl; + } + else if(wsToken == L"/") + { + enTypeBinOp = division; + } + else if(wsToken == L"over") + { + enTypeBinOp = over; + } + else if(wsToken == L"cdot") + { + enTypeBinOp = cdot; + } + else if(wsToken == L"times") + { + enTypeBinOp = times; + } + else if(wsToken == L"frac") + { + enTypeBinOp = frac; + } + else if(wsToken == L"div") + { + enTypeBinOp = div; + } + else if(wsToken == L"oplus") + { + enTypeBinOp = oplus; + } + else if(wsToken == L"ominus") + { + enTypeBinOp = ominus; + } + else if(wsToken == L"odot") + { + enTypeBinOp = odot; + } + else if(wsToken == L"otimes") + { + enTypeBinOp = otimes; + } + else if(wsToken == L"odivide") + { + enTypeBinOp = odivide; + } + else if(wsToken == L"circ") + { + enTypeBinOp = circ; + } + else if(wsToken == L"wideslash") + { + enTypeBinOp = wideslash; + } + else if(wsToken == L"widebslash") + { + enTypeBinOp = widebslash; + } arLeftArg = nullptr; arRightArg = nullptr; } @@ -642,9 +413,32 @@ namespace StarMath { this->enTypeBinOp = enType; } + CElement* CBinaryOperator::GetLeftArg() + { + return arLeftArg; + } + CElement* CBinaryOperator::GetRightArg() + { + return arRightArg; + } + TypeElement CBinaryOperator::GetTypeRight() + { + return arRightArg->GetType(); + } //Class methods COperator COperator::COperator(): oFromValue(NULL),oToValue(NULL),oValueOp(NULL) {} + COperator::COperator(const std::wstring& wsToken): oFromValue(NULL), oToValue(NULL), oValueOp(NULL) + { + if(wsToken== L"lim") + { + enTypeOp = lim; + } + else if(wsToken == L"sum") + { + enTypeOp = sum; + } + } COperator::~COperator() { delete oFromValue; @@ -682,17 +476,43 @@ namespace StarMath { enTypeOp = enType; } - void COperator::AvailabilityMline() - { - bMline = true; - } //Class methods CBracket CBracket::CBracket() {} - CBracket::CBracket(const std::vector& arValue,const TypeBracket& enType) + CBracket::CBracket(const std::vector& arValue,const std::wstring& wsCheckToken) { arBrecketVal = arValue; - enTypeBracket = enType; + if (L"{" == wsCheckToken) enTypeBracket =brace; + else if (L"(" == wsCheckToken) enTypeBracket = round; + else if (L"[" == wsCheckToken) enTypeBracket = square; + else if(wsCheckToken == L"ldbracket") + { + enTypeBracket = ldbracket; + } + else if(wsCheckToken == L"lbrace") + { + enTypeBracket = lbrace; + } + else if(wsCheckToken == L"langle") + { + enTypeBracket = langle; + } + else if(wsCheckToken == L"lceil") + { + enTypeBracket = lceil; + } + else if(wsCheckToken == L"lfloor") + { + enTypeBracket = lfloor; + } + else if(wsCheckToken == L"lline") + { + enTypeBracket = lline; + } + else if(wsCheckToken == L"ldline") + { + enTypeBracket = ldline; + } } CBracket::~CBracket() { @@ -713,33 +533,261 @@ namespace StarMath { return {}; } + void CBracket::SetScalable() + { + bScalable = true; + } + void CBracket::SetBracketVal(const std::vector &arBrecketValue) + { + arBrecketVal = arBrecketValue; + } + void CBracket::SetTypeBracket(const std::wstring& wsCheckToken) + { + if (L"{" == wsCheckToken) enTypeBracket =brace; + else if (L"(" == wsCheckToken) enTypeBracket = round; + else if (L"[" == wsCheckToken) enTypeBracket = square; + else if(wsCheckToken == L"ldbracket") + { + enTypeBracket = ldbracket; + } + else if(wsCheckToken == L"lbrace") + { + enTypeBracket = lbrace; + } + else if(wsCheckToken == L"langle") + { + enTypeBracket = langle; + } + else if(wsCheckToken == L"lceil") + { + enTypeBracket = lceil; + } + else if(wsCheckToken == L"lfloor") + { + enTypeBracket = lfloor; + } + else if(wsCheckToken == L"lline") + { + enTypeBracket = lline; + } + else if(wsCheckToken == L"ldline") + { + enTypeBracket = ldline; + } + } //Class methods CAttribute CAttribute::CAttribute() - {} - CAttribute::CAttribute(CElement *oValue, const TypeAttribute &enType) { - enTypeAtt = enType; - oValueAtt = oValue; + } + CAttribute::CAttribute(const TypeAttributeTop &enType) + { + enTypeTop = enType; } CAttribute::~CAttribute() { - delete oValueAtt; } - std::wstring CAttribute::GetValue() + void CAttribute::SetTypeAtt(const std::wstring& wsCheckToken) + { + if(wsCheckToken == L"phantom") + { + bPhantom = true; + } + else if(wsCheckToken == L"bold") + { + bBold = true; + } + else if(wsCheckToken == L"ital") + { + bItal = true; + } + else if(wsCheckToken == L"black") + { + enTypeColor = black; + } + else if(wsCheckToken == L"green") + { + enTypeColor = green; + } + else if(wsCheckToken == L"aqua") + { + enTypeColor = aqua; + } + else if(wsCheckToken == L"yellow") + { + enTypeColor = yellow; + } + else if(wsCheckToken == L"lime") + { + enTypeColor = lime; + } + else if(wsCheckToken == L"navy") + { + enTypeColor = navy; + } + else if(wsCheckToken == L"purple") + { + enTypeColor = purple; + } + else if(wsCheckToken == L"teal") + { + enTypeColor = teal; + } + else if(wsCheckToken == L"blue") + { + enTypeColor = blue; + } + else if(wsCheckToken == L"red") + { + enTypeColor = red; + } + else if(wsCheckToken == L"fuchsia") + { + enTypeColor = fuchsia; + } + else if(wsCheckToken == L"gray") + { + enTypeColor = gray; + } + else if(wsCheckToken == L"maroon") + { + enTypeColor = maroon; + } + else if(wsCheckToken == L"olive") + { + enTypeColor = olive; + } + else if(wsCheckToken == L"silver") + { + enTypeColor = silver; + } + else if(wsCheckToken == L"coral") + { + enTypeColor = coral; + } + else if(wsCheckToken == L"midnightblue") + { + enTypeColor = midnightblue; + } + else if(wsCheckToken == L"crimson") + { + enTypeColor = crimson; + } + else if(wsCheckToken == L"violet") + { + enTypeColor = violet; + } + else if(wsCheckToken == L"acute") + { + enTypeTop = acute; + } + else if(wsCheckToken == L"breve") + { + enTypeTop = breve; + } + else if(wsCheckToken == L"dot") + { + enTypeTop = dot; + } + else if(wsCheckToken == L"dddot") + { + enTypeTop = dddot; + } + else if(wsCheckToken == L"vec") + { + enTypeTop = vec; + } + else if(wsCheckToken == L"tilde") + { + enTypeTop = tilde; + } + else if(wsCheckToken == L"check") + { + enTypeTop = check; + } + else if(wsCheckToken == L"grave") + { + enTypeTop = grave; + } + else if(wsCheckToken == L"circle") + { + enTypeTop = circle; + } + else if(wsCheckToken == L"ddot") + { + enTypeTop = ddot; + } + else if(wsCheckToken == L"bar") + { + enTypeTop = bar; + } + else if(wsCheckToken == L"harpoon") + { + enTypeTop = harpoon; + } + else if(wsCheckToken == L"hat") + { + enTypeTop = hat; + } + else if(wsCheckToken == L"widevec") + { + enTypeTop = widevec; + } + else if(wsCheckToken == L"widetilde") + { + enTypeTop = widetilde; + } + else if(wsCheckToken == L"overline") + { + enTypeTop = overline; + } + else if(wsCheckToken == L"overstrike") + { + enTypeTop = overstrike; + } + else if(wsCheckToken == L"wideharpoon") + { + enTypeTop = wideharpoon; + } + else if(wsCheckToken == L"widehat") + { + enTypeTop = widehat; + } + else if(wsCheckToken == L"underline") + { + enTypeTop = underline; + } + } + TypeAttributeTop CAttribute::GetTypeAtt() + { + return enTypeTop; + } +//Class methods CElement + CElement::~CElement() + { + } + void CElement::SetAttribute(CAttribute* m_oCAttribute) + { + oCAttribute = m_oCAttribute; + } + TypeAttributeTop CElement::GetTypeAttribute() + { + return oCAttribute->GetTypeAtt(); + } +//Class methods CSpecial + CSpecialCharacters::CSpecialCharacters(const std::wstring& wsToken) + { + if(L"mline" == wsToken) enTypeSpecial = mline; + else if(L"grid" == wsToken) enTypeSpecial = grid; + } + CSpecialCharacters::~CSpecialCharacters() + {} + std::wstring CSpecialCharacters::GetValue() { return {}; } - TypeElement CAttribute::GetType() + TypeElement CSpecialCharacters::GetType() { - return Attribute; - } - void CAttribute::SetTypeAtt(const TypeAttribute &enType) - { - enTypeAtt = enType; - } - void CAttribute::SetValueAtt(CElement *oValue) - { - oValueAtt = oValue; + return SpecialCharacter; } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index e0c8a4cb14..9541470f6c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -14,6 +14,7 @@ namespace StarMath Bracket, UnarSign, Attribute, + SpecialCharacter, }; enum TypeBinOperator { @@ -53,8 +54,9 @@ namespace StarMath lline, ldline, }; - enum TypeAttribute + enum TypeAttributeTop { + noneTop, acute, breve, dot, @@ -75,9 +77,10 @@ namespace StarMath wideharpoon, widehat, underline,//top elements - phantom, - bold, - ital,//properties (without a pin and headset) + }; + enum TypeAttributeColor + { + noneColor, black, green, aqua, @@ -98,13 +101,48 @@ namespace StarMath crimson, violet,//color(without rgb and hex) }; + enum TypeCharacter + { + mline, + grid, + }; + class CAttribute + { + public: + CAttribute(); + CAttribute(const TypeAttributeTop& enType); + virtual ~CAttribute(); + void SetTypeAtt(const std::wstring& wsCheckToken); + TypeAttributeTop GetTypeAtt(); + private: + TypeAttributeTop enTypeTop{noneTop}; + TypeAttributeColor enTypeColor{noneColor}; + bool bBold{false}; + bool bItal{false}; + bool bPhantom{false}; + }; + class CElement { public: + virtual ~CElement(); virtual std::wstring GetValue() = 0; virtual TypeElement GetType() = 0; + void SetAttribute(CAttribute* m_oCAttribute); + TypeAttributeTop GetTypeAttribute(); + private: + CAttribute* oCAttribute; + }; + class CSpecialCharacters: public CElement + { + public: + CSpecialCharacters(const std::wstring& wsToken); + virtual ~CSpecialCharacters(); + std::wstring GetValue() override; + TypeElement GetType() override; + private: + TypeCharacter enTypeSpecial; }; - class CNumber: public CElement { public: @@ -133,7 +171,7 @@ namespace StarMath { public: CBinaryOperator(); - CBinaryOperator(const TypeBinOperator& enType); + CBinaryOperator(const std::wstring& wsToken); virtual ~CBinaryOperator(); std::wstring GetValue() override; TypeElement GetType() override; @@ -141,6 +179,10 @@ namespace StarMath void SetTypeBin(const TypeBinOperator& enType); void SetLeftArg(CElement* oLeftArg); void SetRightArg(CElement* oRightArg); + CElement* GetLeftArg(); + CElement* GetRightArg(); + TypeElement GetTypeRight(); + bool CheckBinOperator(const std::wstring& wsCheckToken); private: TypeBinOperator enTypeBinOp; CElement* arLeftArg; @@ -150,6 +192,7 @@ namespace StarMath { public: COperator(); + COperator(const std::wstring& wsToken); virtual ~COperator(); std::wstring GetValue() override; TypeElement GetType() override; @@ -158,59 +201,53 @@ namespace StarMath void SetFrom(CElement* oFrom); void SetTo(CElement* oTo); void SetValueOp(CElement* oValue); - void AvailabilityMline(); private: TypeOperator enTypeOp; CElement* oFromValue{nullptr}; CElement* oToValue{nullptr}; CElement* oValueOp{nullptr}; - bool bMline{false}; }; class CBracket: public CElement { public: CBracket(); - CBracket(const std::vector& arValue,const TypeBracket& enType); + CBracket(const std::vector& arValue,const std::wstring& wsCheckToken); virtual ~CBracket(); std::wstring GetValue() override; TypeElement GetType() override; + void SetScalable(); + void SetBracketVal(const std::vector& arBrecketValue); + void SetTypeBracket(const std::wstring& wsCheckToken); private: + bool bScalable{false}; TypeBracket enTypeBracket; std::vector arBrecketVal; }; - class CAttribute: public CElement - { - public: - CAttribute(); - CAttribute(CElement* oValue,const TypeAttribute& enType); - virtual ~CAttribute(); - std::wstring GetValue() override; - TypeElement GetType() override; - void SetTypeAtt(const TypeAttribute& enType); - void SetValueAtt(CElement* oValue); - private: - TypeAttribute enTypeAtt; - CElement* oValueAtt; - }; class CStarMathPars { public: CStarMathPars(); virtual ~CStarMathPars(); + std::vector GetVector(); void Pars(std::wstring& wsStarMathLine); std::wstring GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd); CElement* ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, std::vector& arParsLine); bool CheckDigit(const std::wstring& wsCheckToken); bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& oUnarSign); - bool CheckBinOperator(const std::wstring& wsCheckToken,TypeBinOperator& enTypeBinOperator); - bool CheckOneElementBinOperator(const char& wsCheckToken, TypeBinOperator& enTypeBinOperator); - bool CheckOperator(const std::wstring& wsCheckToken,TypeOperator& enTypeOperator); - bool CheckIndex(const std::wstring& wsCheckToken); - bool CheckBracket(const char& wsCheckToken,TypeBracket& enTypeBracket); - bool CheckScalable_NotScalableBracket(const std::wstring& wsCheckToken, TypeBracket& enType); - bool CheckTopAttribute(const std::wstring& wsCheckToken,TypeAttribute& enTypeAtt); - bool CheckPropertiesAttribute(const std::wstring& wsCheckToken,TypeAttribute& enTypeAtt); - bool CheckColorAttribute(const std::wstring& wsCheckToken, TypeAttribute& enTypeAtt); + static bool CheckBinOperator(const std::wstring& wsCheckToken); + bool CheckBinOperatorLowPriority(const std::wstring& wsCheckToken); + bool CheckPlusOrMinus(const std::wstring& wsCheckToken); + bool CheckOperator(const std::wstring& wsCheckToken); + static bool CheckIndex(const std::wstring& wsCheckToken); + bool CheckBracketOpen(const std::wstring& wsCheckToken); + static bool CheckBracketClose(const std::wstring& wsCheckToken); + static bool CheckScalable_NotScalableBracketLeft(const std::wstring& wsCheckToken); + static bool CheckScalable_NotScalableBracketRight(const std::wstring& wsCheckToken); + bool CheckTopAttribute(const std::wstring& wsCheckToken); + bool CheckPropertiesAttribute(const std::wstring& wsCheckToken); + static bool CheckColorAttribute(const std::wstring& wsCheckToken); + bool CheckSpecialCharacter(const std::wstring& wsCheckToken); + bool CheckingTheNextElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd,bool (&func)(const std::wstring& wsCheckToken)); void PrintAr(); private: std::vector m_arParsLine; From 0c55adc82a06fb3e2f82bbb21f9eed34a0cbc4fb Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Sun, 10 Sep 2023 15:19:45 +0300 Subject: [PATCH 005/117] Conversion development --- .../StarMath2OOXML/StarMath2OOXML.pro | 3 +- .../Reader/Converter/StarMath2OOXML/Test.cpp | 4 +- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 205 +++++++++++++++--- .../StarMath2OOXML/cconversionsmtoooxml.h | 19 +- .../StarMath2OOXML/cstarmathpars.cpp | 16 +- .../Converter/StarMath2OOXML/cstarmathpars.h | 105 +-------- .../Converter/StarMath2OOXML/typeselements.h | 105 +++++++++ 7 files changed, 316 insertions(+), 141 deletions(-) create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro index 1353236bee..1723166640 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro +++ b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro @@ -13,6 +13,7 @@ SOURCES += Test.cpp \ HEADERS += \ cconversionsmtoooxml.h \ - cstarmathpars.h + cstarmathpars.h \ + typeselements.h DESTDIR = $$PWD_ROOT_DIR/build/$$CIRE_BUILDS_PLATFORM_PREFIX/$$CORE_BUILDS_CONFIGURATION_PREFIX diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp index 7e664e4714..bfe63d7e43 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp @@ -3,9 +3,9 @@ int main() { - std::wstring Temp = L"2+1"; + std::wstring Temp = L"1 + 2 over 3"; StarMath::CStarMathPars TempO; TempO.Pars(Temp); - ConversionSM2OOXML::CConversionSMtoOOXML m_oTest; + StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(TempO.GetVector()); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 7c41842c5e..e3bb31cf43 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -1,5 +1,7 @@ #include "cconversionsmtoooxml.h" -namespace ConversionSM2OOXML { +#include "../../../../DesktopEditor/common/File.h" +#include +namespace StarMath { CConversionSMtoOOXML::CConversionSMtoOOXML() { } @@ -7,52 +9,133 @@ namespace ConversionSM2OOXML { { m_oXmlWrite.WriteNodeBegin(L"m:oMathPara",false); m_oXmlWrite.WriteNodeBegin(L"m:oMath",false); - m_oXmlWrite.WriteNodeBegin(L"m:r",false); - StandartProperties(); - for(StarMath::CElement* m_oTempElement:arPars) + for(CElement* m_oTempElement:arPars) { ConversionOneElement(m_oTempElement); } EndConversion(); - std::wcout<< m_oXmlWrite.GetXmlString()<GetType() == 0) + switch (m_oElement->GetType()) { - ConversNumber(dynamic_cast(m_oElement)); - } - else if(m_oElement->GetType() == 1) - { - ConversBinOperator(dynamic_cast (m_oElement)); + case Number: + ConversNumber(dynamic_cast(m_oElement)); + break; + case BinOperator: + ConversBinOperator(dynamic_cast (m_oElement)); + break; + case Operator: + ConversOperator(dynamic_cast (m_oElement)); + break; + default: + break; } } - void CConversionSMtoOOXML::ConversBinOperator(StarMath::CBinaryOperator *m_oElement) + void CConversionSMtoOOXML::ConversBinOperator(CBinaryOperator *m_oElement) { - if(m_oElement->GetTypeBin() == 3 || m_oElement->GetTypeBin() == 4) + if(m_oElement->GetTypeBin() == plus || m_oElement->GetTypeBin() == minus || m_oElement->GetTypeBin() == multipl || m_oElement->GetTypeBin() == cdot || m_oElement->GetTypeBin() == times || m_oElement->GetTypeBin() == div || m_oElement->GetTypeBin() == odivide || m_oElement->GetTypeBin() == oplus || m_oElement->GetTypeBin() == ominus || m_oElement->GetTypeBin() == odot || m_oElement->GetTypeBin() == otimes) { - m_oXmlWrite.WriteNodeBegin(L"m:t",false); ConversionOneElement(m_oElement->GetLeftArg()); - if(m_oElement->GetTypeRight() == 0) + m_oXmlWrite.WriteNodeBegin(L"m:r",false); + StandartProperties(); + m_oXmlWrite.WriteNodeBegin(L"m:t",false); + switch (m_oElement->GetTypeBin()) { - if(m_oElement->GetTypeBin() == 3) m_oXmlWrite.WriteString(L"+"); - else m_oXmlWrite.WriteString(L"-"); + case plus: m_oXmlWrite.WriteString(L"+");break; + case minus: + m_oXmlWrite.WriteString(L"-"); + break; + case multipl: + m_oXmlWrite.WriteString(L"*"); + break; + case cdot: + m_oXmlWrite.WriteString(L"\u00B7"); + break; + case times: + m_oXmlWrite.WriteString(L"\u00D7"); + break; + case div: + m_oXmlWrite.WriteString(L"\u00F7"); + break; + case odivide: + m_oXmlWrite.WriteString(L"\u2298"); + break; + case oplus: + m_oXmlWrite.WriteString(L"\u2295"); + break; + case ominus: + m_oXmlWrite.WriteString(L"\u2296"); + break; + case odot: + m_oXmlWrite.WriteString(L"\u2299"); + break; + case otimes: + m_oXmlWrite.WriteString(L"\u2297"); + break; + default: + break; + } + if(m_oElement->GetTypeRight() == Number) + { + CNumber* m_oNumber = dynamic_cast (m_oElement->GetRightArg()); + m_oXmlWrite.WriteString(m_oNumber->GetValue()); + m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); + } + else + { + m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); ConversionOneElement(m_oElement->GetRightArg()); } - m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); + + } + else if(m_oElement->GetTypeBin() == over || m_oElement->GetTypeBin() == division) + { + m_oXmlWrite.WriteNodeBegin(L"m:f",false); + if(m_oElement->GetTypeBin() == division) PropertiesMFPR(true,L"skw"); + else PropertiesMFPR(false,L""); + BlockRecording(L"m:num",m_oElement->GetLeftArg()); + BlockRecording(L"m:den",m_oElement->GetRightArg()); + m_oXmlWrite.WriteNodeEnd(L"m:f",false,false); } } - void CConversionSMtoOOXML::ConversNumber(StarMath::CNumber *m_oElement) + void CConversionSMtoOOXML::ConversNumber(CNumber *m_oElement) { + m_oXmlWrite.WriteNodeBegin(L"m:r",false); + StandartProperties(); + m_oXmlWrite.WriteNodeBegin(L"m:t",false); m_oXmlWrite.WriteString(m_oElement->GetValue()); + m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); + } + void CConversionSMtoOOXML::ConversOperator(COperator *m_oElement) + { + if(m_oElement->GetTypeOp() == sum) + { + m_oXmlWrite.WriteNodeBegin(L"m:nary",false); + PropertiesNaryPr(L"\u2211",nullptr == m_oElement->GetFrom(),m_oElement->GetTo()); + if(m_oElement->GetFrom() == nullptr) m_oXmlWrite.WriteNode(L"m:sub",L""); + else + { + BlockRecording(L"m:sub",m_oElement->GetFrom()); + } + if(m_oElement->GetTo() == nullptr) m_oXmlWrite.WriteNode(L"m:sup",L""); + else + { + BlockRecording(L"m:sup",m_oElement->GetTo()); + } + BlockRecording(L"m:e",m_oElement->GetValueOp()); + m_oXmlWrite.WriteNodeEnd(L"m:nary",false,false); + } } void CConversionSMtoOOXML::StandartProperties() { - m_oXmlWrite.WriteNodeBegin(L"m:rPr",false); - m_oXmlWrite.WriteNodeBegin(L"m:sty",true); - m_oXmlWrite.WriteAttribute(L"m:val",L"p"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNodeEnd(L"m:rPr",false,false); m_oXmlWrite.WriteNodeBegin(L"w:rPr",false); m_oXmlWrite.WriteNodeBegin(L"w:rFonts",true); m_oXmlWrite.WriteAttribute(L"w:hAnsi",L"Cambria Math"); @@ -64,14 +147,80 @@ namespace ConversionSM2OOXML { m_oXmlWrite.WriteNodeBegin(L"w:szCs",true); m_oXmlWrite.WriteAttribute(L"w:val",L"40"); m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNodeBegin(L"w:lang",true); - m_oXmlWrite.WriteAttribute(L"w:val",L"en-US"); + m_oXmlWrite.WriteNodeEnd(L"w:rPr",false,false); + } + void CConversionSMtoOOXML::PropertiesMFPR(bool bType,const std::wstring& wsType) + { + m_oXmlWrite.WriteNodeBegin(L"m:fPr",false); + if(bType) + { + m_oXmlWrite.WriteNodeBegin(L"m:type",true); + m_oXmlWrite.WriteAttribute(L"m:val",wsType); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + } + m_oXmlWrite.WriteNodeBegin(L"m:ctrlPr",false); + m_oXmlWrite.WriteNodeBegin(L"w:rPr",false); + m_oXmlWrite.WriteNodeBegin(L"w:rFonts",true); + m_oXmlWrite.WriteAttribute(L"w:hAnsi",L"Cambria Math"); + m_oXmlWrite.WriteAttribute(L"w:ascii",L"Cambria Math"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNode(L"w:i",L""); + //m_oXmlWrite.WriteNode(L"w:iCs",L""); + m_oXmlWrite.WriteNodeBegin(L"w:sz",true); + m_oXmlWrite.WriteAttribute(L"w:val",L"40"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNodeBegin(L"w:szCs",true); + m_oXmlWrite.WriteAttribute(L"w:val",L"40"); m_oXmlWrite.WriteNodeEnd(L"w",true,true); m_oXmlWrite.WriteNodeEnd(L"w:rPr",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:ctrlPr",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:fPr",false,false); + } + void CConversionSMtoOOXML::PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup) + { + m_oXmlWrite.WriteNodeBegin(L"m:naryPr",false); + m_oXmlWrite.WriteNodeBegin(L"m:chr",true); + m_oXmlWrite.WriteAttribute(L"m:val",wsTypeOperator); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNodeBegin(L"m:limLoc",true); + m_oXmlWrite.WriteAttribute(L"m:val",L"undOvr"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + if(bEmptySub) + { + m_oXmlWrite.WriteNodeBegin(L"m:subHide",true); + m_oXmlWrite.WriteAttribute(L"m:val",L"1"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + } + if(bEmptySup) + { + m_oXmlWrite.WriteNodeBegin(L"m:supHide",true); + m_oXmlWrite.WriteAttribute(L"m:val",L"1"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + } + m_oXmlWrite.WriteNodeBegin(L"m:ctrlPr",false); + m_oXmlWrite.WriteNodeBegin(L"w:rPr",false); + m_oXmlWrite.WriteNodeBegin(L"w:rFonts",true); + m_oXmlWrite.WriteAttribute(L"w:hAnsi",L"Cambria Math"); + m_oXmlWrite.WriteAttribute(L"w:ascii",L"Cambria Math"); + m_oXmlWrite.WriteNodeEnd(L"w",true,true); + m_oXmlWrite.WriteNode(L"w:i",L""); + m_oXmlWrite.WriteNodeEnd(L"w:rPr",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:ctrlPr",false,false); + m_oXmlWrite.WriteNodeEnd(L"m:naryPr",false,false); + } + void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *CValueBlock) + { + m_oXmlWrite.WriteNodeBegin(wsNameBlock,false); + ConversionOneElement(CValueBlock); + m_oXmlWrite.WriteNodeEnd(wsNameBlock,false,false); + } + std::wstring CConversionSMtoOOXML::GetOOXML() + { + return m_oXmlWrite.GetXmlString(); } void CConversionSMtoOOXML::EndConversion() { - m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); + //m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); m_oXmlWrite.WriteNodeEnd(L"m:oMath",false,false); m_oXmlWrite.WriteNodeEnd(L"m:oMathPara",false,false); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index f658e68cb1..6c47b84ddf 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -1,20 +1,27 @@ #ifndef CCONVERSIONSMTOOOXML_H #define CCONVERSIONSMTOOOXML_H #include "cstarmathpars.h" -#include "X:/Rabotka/Clone/core/DesktopEditor/xml/include/xmlwriter.h" +#include "../../../../DesktopEditor/xml/include/xmlwriter.h" -namespace ConversionSM2OOXML { + + +namespace StarMath { class CConversionSMtoOOXML { public: CConversionSMtoOOXML(); //friend class StarMath::CStarMathPars; - void StartConversion(std::vector arPars); + void StartConversion(std::vector arPars); void StandartProperties(); - void ConversionOneElement(StarMath::CElement* m_oElement); - void ConversBinOperator(StarMath::CBinaryOperator* m_oElement); - void ConversNumber(StarMath::CNumber* m_oElement); + void PropertiesMFPR(bool bType,const std::wstring& wsType); + void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup); + void ConversionOneElement(CElement* m_oElement); + void ConversBinOperator(CBinaryOperator* m_oElement); + void ConversNumber(CNumber* m_oElement); + void ConversOperator(COperator* m_oElement); + void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock); void EndConversion(); + std::wstring GetOOXML() ; private: XmlUtils::CXmlWriter m_oXmlWrite; }; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 89b890d057..e4d6c1662c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -116,7 +116,6 @@ namespace StarMath arValueBrecket.push_back(ParsElement(itFirst,itEnd,arValueBrecket)); } wsOneElement = GetElement(itFirst,itEnd); - std::wcout << wsOneElement << std::endl; if(L"right" == wsOneElement) wsOneElement = GetElement(itFirst,itEnd); m_oBracket->SetBracketVal(arValueBrecket); m_oBracket->SetTypeBracket(wsTypeBracket); @@ -447,9 +446,6 @@ namespace StarMath } TypeElement COperator::GetType() { - /*std::wcout << oFromValue->GetType() <GetType() <GetType() < #include #include @@ -7,105 +8,6 @@ namespace StarMath { - enum TypeElement{ - Number, - BinOperator, - Operator, - Bracket, - UnarSign, - Attribute, - SpecialCharacter, - }; - enum TypeBinOperator - { - cdot, - times, - over, - plus, - minus, - frac, - div, - multipl, - division, - oplus, - ominus, - odot, - otimes, - odivide, - circ, - wideslash, - widebslash, - }; - enum TypeOperator - { - lim, - sum, - }; - enum TypeBracket - { - brace, - round, - square, - ldbracket, - lbrace, - langle, - lceil, - lfloor, - lline, - ldline, - }; - enum TypeAttributeTop - { - noneTop, - acute, - breve, - dot, - dddot, - vec, - tilde, - check, - grave, - circle, - ddot, - bar, - harpoon, - hat, - widevec, - widetilde, - overline, - overstrike, - wideharpoon, - widehat, - underline,//top elements - }; - enum TypeAttributeColor - { - noneColor, - black, - green, - aqua, - yellow, - lime, - navy, - purple, - teal, - blue, - red, - fuchsia, - gray, - maroon, - olive, - silver, - coral, - midnightblue, - crimson, - violet,//color(without rgb and hex) - }; - enum TypeCharacter - { - mline, - grid, - }; class CAttribute { public: @@ -201,6 +103,9 @@ namespace StarMath void SetFrom(CElement* oFrom); void SetTo(CElement* oTo); void SetValueOp(CElement* oValue); + CElement* GetValueOp(); + CElement* GetFrom(); + CElement* GetTo(); private: TypeOperator enTypeOp; CElement* oFromValue{nullptr}; @@ -233,7 +138,7 @@ namespace StarMath std::wstring GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd); CElement* ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, std::vector& arParsLine); bool CheckDigit(const std::wstring& wsCheckToken); - bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& oUnarSign); + //bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& oUnarSign); static bool CheckBinOperator(const std::wstring& wsCheckToken); bool CheckBinOperatorLowPriority(const std::wstring& wsCheckToken); bool CheckPlusOrMinus(const std::wstring& wsCheckToken); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h new file mode 100644 index 0000000000..cd3023ee4a --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -0,0 +1,105 @@ +#ifndef TYPESELEMENTS_H +#define TYPESELEMENTS_H +namespace StarMath +{ +enum TypeElement{ + Number, + BinOperator, + Operator, + Bracket, + UnarSign, + Attribute, + SpecialCharacter, +}; +enum TypeBinOperator +{ + cdot, + times, + over, + plus, + minus, + frac, + div, + multipl, + division, + oplus, + ominus, + odot, + otimes, + odivide, + circ, + wideslash, + widebslash, +}; +enum TypeOperator +{ + lim, + sum, +}; +enum TypeBracket +{ + brace, + round, + square, + ldbracket, + lbrace, + langle, + lceil, + lfloor, + lline, + ldline, +}; +enum TypeAttributeTop +{ + noneTop, + acute, + breve, + dot, + dddot, + vec, + tilde, + check, + grave, + circle, + ddot, + bar, + harpoon, + hat, + widevec, + widetilde, + overline, + overstrike, + wideharpoon, + widehat, + underline,//top elements +}; +enum TypeAttributeColor +{ + noneColor, + black, + green, + aqua, + yellow, + lime, + navy, + purple, + teal, + blue, + red, + fuchsia, + gray, + maroon, + olive, + silver, + coral, + midnightblue, + crimson, + violet,//color(without rgb and hex) +}; +enum TypeCharacter +{ + mline, + grid, +}; +} +#endif // TYPESELEMENTS_H From e72afe11d355c16a609d6b8579b6009a59d71ebb Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Mon, 11 Sep 2023 18:14:38 +0300 Subject: [PATCH 006/117] Adding tests --- .../StarMath2OOXML/StarMath2OOXML.pri | 16 ++ .../StarMath2OOXML/StarMath2OOXML.pro | 19 --- .../Reader/Converter/StarMath2OOXML/Test.cpp | 16 +- .../TestSMConverter/TestSMConverter.pro | 18 ++ .../StarMath2OOXML/TestSMConverter/main.cpp | 159 ++++++++++++++++++ .../StarMath2OOXML/cconversionsmtoooxml.cpp | 12 +- 6 files changed, 207 insertions(+), 33 deletions(-) create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri delete mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/TestSMConverter.pro create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri new file mode 100644 index 0000000000..fe88c40eb8 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri @@ -0,0 +1,16 @@ + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) + +ADD_DEPENDENCY(UnicodeConverter, kernel) + +SOURCES += $$PWD/cconversionsmtoooxml.cpp \ + $$PWD/cstarmathpars.cpp + +HEADERS += \ + $$PWD/cconversionsmtoooxml.h \ + $$PWD/cstarmathpars.h \ + $$PWD/typeselements.h + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro deleted file mode 100644 index 1723166640..0000000000 --- a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pro +++ /dev/null @@ -1,19 +0,0 @@ -QT -= core gui - -CORE_ROOT_DIR = $$PWD/../../../.. -PWD_ROOT_DIR = $$PWD - -include($$CORE_ROOT_DIR/Common/base.pri) - -ADD_DEPENDENCY(UnicodeConverter, kernel) - -SOURCES += Test.cpp \ - cconversionsmtoooxml.cpp \ - cstarmathpars.cpp - -HEADERS += \ - cconversionsmtoooxml.h \ - cstarmathpars.h \ - typeselements.h - -DESTDIR = $$PWD_ROOT_DIR/build/$$CIRE_BUILDS_PLATFORM_PREFIX/$$CORE_BUILDS_CONFIGURATION_PREFIX diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp index bfe63d7e43..4f9a843b9c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp @@ -1,11 +1,11 @@ #include "cstarmathpars.h" #include "cconversionsmtoooxml.h" -int main() -{ - std::wstring Temp = L"1 + 2 over 3"; - StarMath::CStarMathPars TempO; - TempO.Pars(Temp); - StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(TempO.GetVector()); -} +//int main() +//{ +// std::wstring Temp = L"1 + 2 over 3"; +// StarMath::CStarMathPars TempO; +// TempO.Pars(Temp); +// StarMath::CConversionSMtoOOXML m_oTest; +// m_oTest.StartConversion(TempO.GetVector()); +//} diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/TestSMConverter.pro b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/TestSMConverter.pro new file mode 100644 index 0000000000..788618500b --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/TestSMConverter.pro @@ -0,0 +1,18 @@ +QT -= core gui + +TARGET = test +CONFIG += console +CONFIG -= app_bundle +TEMPLATE = app + +CORE_ROOT_DIR = $$PWD/../../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri) +include($$CORE_ROOT_DIR/Common/3dParty/googletest/googletest.pri) + + + +SOURCES += main.cpp + +DESTDIR = $$PWD/build diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp new file mode 100644 index 0000000000..ff0774672e --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -0,0 +1,159 @@ +#include "../cstarmathpars.h" +#include "../cconversionsmtoooxml.h" +#include "gtest/gtest.h" + + + +TEST(SMConvectorTest, BinOperatorPlus) +{ + std::wstring wsBinOperatorPlus = L"2 + 3"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"2+3"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorOver) +{ + std::wstring wsBinOperatorPlus = L"2 over 3"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"23"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorCdot) +{ + std::wstring wsBinOperatorPlus = L"5 cdot 8"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"5\u00B78"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorTimes) +{ + std::wstring wsBinOperatorPlus = L"5 times 8"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"5\u00D78"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorMultipl) +{ + std::wstring wsBinOperatorPlus = L"4 * 2"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"4*2"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorDiv) +{ + std::wstring wsBinOperatorPlus = L"4div2"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"4\u00F72"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorDivision) +{ + std::wstring wsBinOperatorPlus = L"4/2"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"42"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorOplus) +{ + std::wstring wsBinOperatorPlus = L"226oplus179"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"226\u2295179"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorOdot) +{ + std::wstring wsBinOperatorPlus = L"226 odot 179"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"226\u2299179"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorOtimes) +{ + std::wstring wsBinOperatorPlus = L"226 otimes 179"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"226\u2297179"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,OperatorSum) +{ + std::wstring wsBinOperatorPlus = L"sum 5"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"5"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,OperatorSumFrom) +{ + std::wstring wsBinOperatorPlus = L"sum from 10 5"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"105"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,OperatorSumTo) +{ + std::wstring wsBinOperatorPlus = L"sum to 10 5"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"105"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,OperatorSumFromTo) +{ + std::wstring wsBinOperatorPlus = L"sum from 666 to 777 567"; + StarMath::CStarMathPars m_oTempO; + m_oTempO.Pars(wsBinOperatorPlus); + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.GetVector()); + std::wstring XmlString = L"666777567"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index e3bb31cf43..f0988e010b 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -14,10 +14,10 @@ namespace StarMath { ConversionOneElement(m_oTempElement); } EndConversion(); - NSFile::CFileBinary oFile; - oFile.CreateFileW(L"Test.txt"); - oFile.WriteStringUTF8(m_oXmlWrite.GetXmlString()); - oFile.CloseFile(); +// NSFile::CFileBinary oFile; +// oFile.CreateFileW(L"Test.txt"); +// oFile.WriteStringUTF8(m_oXmlWrite.GetXmlString()); +// oFile.CloseFile(); } void CConversionSMtoOOXML::ConversionOneElement(CElement *m_oElement) { @@ -98,7 +98,7 @@ namespace StarMath { else if(m_oElement->GetTypeBin() == over || m_oElement->GetTypeBin() == division) { m_oXmlWrite.WriteNodeBegin(L"m:f",false); - if(m_oElement->GetTypeBin() == division) PropertiesMFPR(true,L"skw"); + if(m_oElement->GetTypeBin() == division) PropertiesMFPR(true,L"lin"); else PropertiesMFPR(false,L""); BlockRecording(L"m:num",m_oElement->GetLeftArg()); BlockRecording(L"m:den",m_oElement->GetRightArg()); @@ -119,7 +119,7 @@ namespace StarMath { if(m_oElement->GetTypeOp() == sum) { m_oXmlWrite.WriteNodeBegin(L"m:nary",false); - PropertiesNaryPr(L"\u2211",nullptr == m_oElement->GetFrom(),m_oElement->GetTo()); + PropertiesNaryPr(L"\u2211",nullptr == m_oElement->GetFrom(),nullptr == m_oElement->GetTo()); if(m_oElement->GetFrom() == nullptr) m_oXmlWrite.WriteNode(L"m:sub",L""); else { From 417267a96375dc64d312e0ca1ba8024b4d3a745e Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Mon, 25 Sep 2023 16:12:50 +0300 Subject: [PATCH 007/117] adding parsing of structures such as matrices, indexes --- .../StarMath2OOXML/cstarmathpars.cpp | 293 +++++++++++++++--- .../Converter/StarMath2OOXML/cstarmathpars.h | 78 ++++- .../Converter/StarMath2OOXML/typeselements.h | 100 +++++- 3 files changed, 419 insertions(+), 52 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index e4d6c1662c..fd5de25f4e 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -21,6 +21,29 @@ namespace StarMath m_arParsLine[i]->GetType(); } } +//Test version (works correctly only with operators, does not work correctly with attributes) + CElement* CStarMathPars::ReadWithoutBrackets(std::wstring::iterator &itFirst, std::wstring::iterator &itEnd,std::vector& arParsLine) + { + CElement* m_oOneElement = ParsElement(itFirst,itEnd,arParsLine); + if(m_oOneElement->GetType() != Bracket) + { + std::vector arTempValue; + arTempValue.push_back(m_oOneElement); + while(CheckingTheNextElement(itFirst,itEnd,CheckBinOperator)|| CheckingTheNextElement(itFirst,itEnd,CheckPlusOrMinus)||CheckingTheNextElement(itFirst,itEnd,CheckBinOperatorLowPriority)) + { + arTempValue.push_back(ParsElement(itFirst,itEnd,arTempValue)); + } + if(arTempValue.size()== 1) return m_oOneElement = arTempValue.back(); + else + { + CBracket* m_oBracket = new CBracket; + m_oBracket->SetBracketVal(arTempValue); + m_oBracket->SetTypeBracket(L"brace"); + return m_oBracket; + } + } + else return m_oOneElement; + } void CStarMathPars::Pars(std::wstring& wsStarMathLine) { @@ -44,11 +67,11 @@ namespace StarMath itFirst++; break; } - else if(!m_wsElement.empty() && (*itFirst == L'{' || *itFirst == L'}' || *itFirst == L'+' || *itFirst == L'-' || *itFirst == L'/' || *itFirst == L'*' || L'^' == *itFirst || L'_' == *itFirst || (iswalpha(*itFirst) && iswdigit(m_wsElement.back())) || (iswdigit(*itFirst) && iswalpha(m_wsElement.back())))) + else if(!m_wsElement.empty() && (*itFirst == L'{' || *itFirst == L'}' || *itFirst == L'+' || *itFirst == L'-' || *itFirst == L'/' || *itFirst == L'*' || L'^' == *itFirst || L'_' == *itFirst || (iswdigit(*itFirst) && !iswdigit(m_wsElement.back())) || (iswalpha(*itFirst) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *itFirst || L'>' == *itFirst || L'=' == *itFirst)))) { return m_wsElement; } - else if((*itFirst == L'{' || *itFirst == L'}' || *itFirst == L'+' || *itFirst == L'-' || *itFirst == L'/' || *itFirst == L'*' || L'^' == *itFirst || L'_' == *itFirst ) && m_wsElement.empty() ) + else if(((*itFirst == L'{' || *itFirst == L'}' || *itFirst == L'+' || *itFirst == L'-' || *itFirst == L'/' || *itFirst == L'*' || L'^' == *itFirst || L'_' == *itFirst || L'=' == *itFirst ) && m_wsElement.empty()) || (!m_wsElement.empty() && ((m_wsElement.back() == L'<' && (L'=' == *itFirst || L'<' == *itFirst || L'>' == *itFirst)) || (m_wsElement.back() == L'>' && (L'>' == *itFirst || L'=' == *itFirst)) ) ) ) { m_wsElement.push_back(*itFirst); itFirst++; @@ -79,14 +102,37 @@ namespace StarMath m_oCNumber->SetAttribute(m_oAttribute); return m_oCNumber; } - if(CheckSpecialCharacter(wsOneElement)) return new CSpecialCharacters(wsOneElement); + else if(CheckSpecialCharacter(wsOneElement) || CheckSpecialOperation(wsOneElement) || CheckSpecialConnection(wsOneElement)) return new CSpecialSymbol(wsOneElement); + else if(CheckFunction(wsOneElement)) + { + CFunction* m_oFunction = new CFunction; + m_oFunction->SetTypeFunction(wsOneElement); + if(L"ln" == wsOneElement) m_oFunction->SetArgument(ReadWithoutBrackets(itFirst,itEnd,arParsLine)); + else m_oFunction->SetArgument(ParsElement(itFirst,itEnd,arParsLine)); + m_oFunction->SetAttribute(m_oAttribute); + return m_oFunction; + } + else if(CheckIndex(wsOneElement)) + { + CIndex* m_oIndex = new CIndex(wsOneElement); + m_oIndex->SetArgument(arParsLine.back()); + m_oIndex->SetIndex(ParsElement(itFirst,itEnd,arParsLine)); + return m_oIndex; + } + else if(CheckMatrix(wsOneElement)) + { + CMatrix* m_oMatrix = new CMatrix(wsOneElement); + m_oMatrix->SetArgument(ParsElement(itFirst,itEnd,arParsLine)); + m_oMatrix->SetAttribute(m_oAttribute); + return m_oMatrix; + } else if(CheckBinOperator(wsOneElement) || CheckPlusOrMinus(wsOneElement) || CheckBinOperatorLowPriority(wsOneElement)) { if(!arParsLine.empty()) { CBinaryOperator* m_pBinOp = new CBinaryOperator(wsOneElement); CElement* m_oTempElement{ParsElement(itFirst,itEnd,arParsLine)}; - m_pBinOp->SetLeftArg(arParsLine.back()); + m_pBinOp->SetArgument(arParsLine.back()); arParsLine.pop_back(); if(((CheckPlusOrMinus(wsOneElement) || CheckBinOperatorLowPriority(wsOneElement)) && (CheckingTheNextElement(itFirst, itEnd,CheckBinOperator)||CheckingTheNextElement(itFirst, itEnd, CheckIndex))) || (CheckBinOperator(wsOneElement) && CheckingTheNextElement(itFirst, itEnd,CheckIndex))) { @@ -189,7 +235,7 @@ namespace StarMath } bool CStarMathPars::CheckBinOperator(const std::wstring &wsCheckToken) { - return(L"*" ==wsCheckToken || L"/" == wsCheckToken || wsCheckToken == L"over" || wsCheckToken == L"cdot" || wsCheckToken == L"times" || wsCheckToken == L"frac" || wsCheckToken == L"div" || wsCheckToken == L"odot" || wsCheckToken == L"otimes" || wsCheckToken == L"odivide" || wsCheckToken == L"wideslash" || wsCheckToken == L"widebslash"); + return(L"*" ==wsCheckToken || L"/" == wsCheckToken || wsCheckToken == L"over" || wsCheckToken == L"cdot" || wsCheckToken == L"times" || wsCheckToken == L"div" || wsCheckToken == L"odot" || wsCheckToken == L"otimes" || wsCheckToken == L"odivide" || wsCheckToken == L"wideslash" || wsCheckToken == L"widebslash"); } bool CStarMathPars::CheckBinOperatorLowPriority(const std::wstring &wsCheckToken) { @@ -213,7 +259,11 @@ namespace StarMath } bool CStarMathPars::CheckIndex(const std::wstring &wsCheckToken) { - return (wsCheckToken == L"from" || wsCheckToken == L"to" || wsCheckToken[0] == L'_' || wsCheckToken[0] == L'^' ); + return (wsCheckToken == L"_" || wsCheckToken == L"^" || L"lsup" == wsCheckToken || L"lsub" == wsCheckToken || L"csup" == wsCheckToken || L"csub" == wsCheckToken); + } + bool CStarMathPars::CheckIndexOp(const std::wstring &wsCheckToken) + { + return(L"from" == wsCheckToken || L"to" == wsCheckToken); } bool CStarMathPars::CheckBracketOpen(const std::wstring& wsCheckToken) { @@ -224,12 +274,6 @@ namespace StarMath return true; case '[': return true; - case '}': - return true; - case ')': - return true; - case ']': - return true; default: return false; } @@ -261,12 +305,32 @@ namespace StarMath } bool CStarMathPars::CheckSpecialCharacter(const std::wstring &wsCheckToken) { - return (L"mline" == wsCheckToken || L"grid" == wsCheckToken); + return (L"mline" == wsCheckToken || L"#" == wsCheckToken || L"##" == wsCheckToken); + } + bool CStarMathPars::CheckSpecialOperation(const std::wstring &wsCheckToken) + { + return(L"intersection" == wsCheckToken || L"union" == wsCheckToken || L"setminus" == wsCheckToken || L"setquoyient" == wsCheckToken || L"subseteq" == wsCheckToken || L"subset" == wsCheckToken || L"supset" == wsCheckToken || L"supseteq" == wsCheckToken || L"nsubset" == wsCheckToken || L"nsupseteq" == wsCheckToken || L"nsupset" == wsCheckToken || L"nsubseteq" == wsCheckToken || L"in" == wsCheckToken || L"notin" == wsCheckToken || L"owns" == wsCheckToken); + } + bool CStarMathPars::CheckSpecialConnection(const std::wstring &wsCheckToken) + { + return(L"approx" == wsCheckToken || L"sim" == wsCheckToken || L"simeq" == wsCheckToken || L"equiv" == wsCheckToken || L"prop" == wsCheckToken || L"parallel" == wsCheckToken || L"ortho" == wsCheckToken || L"divides" == wsCheckToken || L"ndivides" == wsCheckToken || L"toward" == wsCheckToken || L"transl" == wsCheckToken || L"transr" == wsCheckToken || L"def" == wsCheckToken || L"=" == wsCheckToken || L"<>" == wsCheckToken || L"<" == wsCheckToken || L"<=" == wsCheckToken || L"leslant" == wsCheckToken || L">" == wsCheckToken || L">=" == wsCheckToken || L"geslant" == wsCheckToken || L"<<" == wsCheckToken || L">>" == wsCheckToken || L"prec" == wsCheckToken || L"succ" == wsCheckToken || L"preccurlyeq" == wsCheckToken || L"succcurlyeq" == wsCheckToken || L"precsim" == wsCheckToken || L"succsim" == wsCheckToken || L"nprec" == wsCheckToken || L"nsucc" == wsCheckToken || L"dlarrow" == wsCheckToken || L"dlrarrow" == wsCheckToken || L"drarrow" == wsCheckToken); } std::vector CStarMathPars::GetVector() { return m_arParsLine; } + bool CStarMathPars::CheckFunction(const std::wstring &wsCheckToken) + { + return(L"sin" == wsCheckToken || L"cos" == wsCheckToken || L"ln" == wsCheckToken || L"tan" == wsCheckToken || L"cot" == wsCheckToken || L"sinh" == wsCheckToken || L"cosh" == wsCheckToken || L"tanh" == wsCheckToken || L"coth" == wsCheckToken || L"arcsin" == wsCheckToken || L"arccos" == wsCheckToken || L"arctan" == wsCheckToken || L"arccot" == wsCheckToken || L"arsinh" == wsCheckToken || L"arcosh" == wsCheckToken || L"artanh" == wsCheckToken || L"arcoth" == wsCheckToken || L"abs" == wsCheckToken || L"fact" == wsCheckToken || L"sqrt" == wsCheckToken || L"nroot" == wsCheckToken); + } + bool CStarMathPars::CheckOperation(const std::wstring &wsCheckToken) + { + return(L"intersection" == wsCheckToken || L"union" == wsCheckToken || L"setminus" == wsCheckToken || L"setquoytient" == wsCheckToken || L"subseteq" == wsCheckToken || L"subset" == wsCheckToken); + } + bool CStarMathPars::CheckMatrix(const std::wstring &wsCheckToken) + { + return (L"stack" == wsCheckToken || L"matrix" == wsCheckToken || L"binom" == wsCheckToken); + } //Class methods CNumber CNumber::CNumber() { @@ -309,7 +373,9 @@ namespace StarMath {} //Class methods CBinaryOperator CBinaryOperator::CBinaryOperator() - {} + { + oRightArg = nullptr; + } CBinaryOperator::CBinaryOperator(const std::wstring& wsToken) { if(wsToken == L"+") @@ -380,13 +446,11 @@ namespace StarMath { enTypeBinOp = widebslash; } - arLeftArg = nullptr; - arRightArg = nullptr; + oRightArg = nullptr; } CBinaryOperator::~CBinaryOperator() { - delete arLeftArg; - delete arRightArg; + delete oRightArg; } TypeElement CBinaryOperator::GetType() { @@ -400,29 +464,21 @@ namespace StarMath { return enTypeBinOp; } - void CBinaryOperator::SetLeftArg( CElement *oLeftArg) + void CBinaryOperator::SetRightArg(CElement *oArgument) { - this->arLeftArg = oLeftArg; - } - void CBinaryOperator::SetRightArg(CElement *oRightArg) - { - this->arRightArg = oRightArg; + oRightArg = oArgument; } void CBinaryOperator::SetTypeBin(const TypeBinOperator &enType) { this->enTypeBinOp = enType; } - CElement* CBinaryOperator::GetLeftArg() - { - return arLeftArg; - } CElement* CBinaryOperator::GetRightArg() { - return arRightArg; + return oRightArg; } TypeElement CBinaryOperator::GetTypeRight() { - return arRightArg->GetType(); + return oRightArg->GetType(); } //Class methods COperator COperator::COperator(): oFromValue(NULL),oToValue(NULL),oValueOp(NULL) @@ -551,7 +607,7 @@ namespace StarMath } void CBracket::SetTypeBracket(const std::wstring& wsCheckToken) { - if (L"{" == wsCheckToken) enTypeBracket =brace; + if (L"{" == wsCheckToken) enTypeBracket = brace; else if (L"(" == wsCheckToken) enTypeBracket = round; else if (L"[" == wsCheckToken) enTypeBracket = square; else if(wsCheckToken == L"ldbracket") @@ -782,20 +838,183 @@ namespace StarMath return oCAttribute->GetTypeAtt(); } //Class methods CSpecial - CSpecialCharacters::CSpecialCharacters(const std::wstring& wsToken) + CSpecialSymbol::CSpecialSymbol(const std::wstring& wsToken) { if(L"mline" == wsToken) enTypeSpecial = mline; - else if(L"grid" == wsToken) enTypeSpecial = grid; + else if(L"#" == wsToken) enTypeSpecial = grid; + else if(L"##" == wsToken) enTypeSpecial = dlgrid; + else if(L"intersection" == wsToken) enTypeSpecial = intersection; + else if(L"union" == wsToken) enTypeSpecial = Union; + else if(L"setminus" == wsToken) enTypeSpecial = setminus; + else if(L"setquoyient" == wsToken) enTypeSpecial = setquoyient; + else if(L"subseteg" == wsToken) enTypeSpecial = subseteq; + else if(L"subset" == wsToken) enTypeSpecial = subset; + else if(L"supset" == wsToken) enTypeSpecial = supset; + else if(L"supseteq" == wsToken) enTypeSpecial = supseteq; + else if(L"nsubset" == wsToken) enTypeSpecial = nsubset; + else if(L"nsubseteq" == wsToken) enTypeSpecial = nsubseteq; + else if(L"nsupseteq" == wsToken) enTypeSpecial = nsupseteq; + else if(L"nsupset" == wsToken) enTypeSpecial = nsupset; + else if(L"in" == wsToken) enTypeSpecial = in; + else if(L"notin" == wsToken) enTypeSpecial = notin; + else if(L"owns" == wsToken) enTypeSpecial = owns; + else if(L"approx" == wsToken) enTypeSpecial = approx; + else if(L"sim" == wsToken) enTypeSpecial = sim; + else if(L"simeq" == wsToken) enTypeSpecial = simeq; + else if(L"equiv" == wsToken) enTypeSpecial = equiv; + else if(L"prop" == wsToken) enTypeSpecial = prop; + else if(L"parallel" == wsToken) enTypeSpecial = parallel; + else if(L"ortho" == wsToken) enTypeSpecial = ortho; + else if(L"divides" == wsToken) enTypeSpecial = divides; + else if(L"ndivides" == wsToken) enTypeSpecial = ndivides; + else if(L"toward" == wsToken) enTypeSpecial = toward; + else if(L"transl" == wsToken) enTypeSpecial = transl; + else if(L"transr" == wsToken) enTypeSpecial = transr; + else if(L"def" == wsToken) enTypeSpecial = def; + else if(L"=" == wsToken) enTypeSpecial = equals; + else if(L"<>" == wsToken) enTypeSpecial = notequals; + else if(L"<" == wsToken) enTypeSpecial = learrow; + else if(L"<=" == wsToken) enTypeSpecial = learrowequals; + else if(L"leslant" == wsToken) enTypeSpecial = leslant; + else if(L">" == wsToken) enTypeSpecial = riarrow; + else if(L">=" == wsToken) enTypeSpecial = riarrowequals; + else if(L"geslant" == wsToken) enTypeSpecial = geslant; + else if(L"<<" == wsToken) enTypeSpecial = dllearrow; + else if(L">>" == wsToken) enTypeSpecial = dlriarrow; + else if(L"prec" == wsToken) enTypeSpecial = prec; + else if(L"succ" == wsToken) enTypeSpecial = succ; + else if(L"preccurlyeq" == wsToken) enTypeSpecial = preccurlyeq; + else if(L"succcurlyeq" == wsToken) enTypeSpecial = succcurlyeq; + else if(L"precsim" == wsToken) enTypeSpecial = precsim; + else if(L"succsim" == wsToken) enTypeSpecial = succsim; + else if(L"nprec" == wsToken) enTypeSpecial = nprec; + else if(L"nsucc" == wsToken) enTypeSpecial = nsucc; + else if(L"dlarrow" == wsToken) enTypeSpecial = dlarrow; + else if(L"dlrarrow" == wsToken) enTypeSpecial = dlrarrow; + else if(L"drarrow" == wsToken) enTypeSpecial = drarrow; + SetAttribute(nullptr); } - CSpecialCharacters::~CSpecialCharacters() + CSpecialSymbol::~CSpecialSymbol() {} - std::wstring CSpecialCharacters::GetValue() + std::wstring CSpecialSymbol::GetValue() { return {}; } - TypeElement CSpecialCharacters::GetType() + TypeElement CSpecialSymbol::GetType() { - return SpecialCharacter; + return SpecialSymbol; } +//class methods CFunction + CFunction::CFunction() + {} + CFunction::~CFunction() + { + } + std::wstring CFunction::GetValue() + { + return L""; + } + TypeElement CFunction::GetType() + { + return Function; + } + TypeFunction CFunction::GetTypeFun() + { + return enTypeFun; + } + void CFunction::SetTypeFunction(const std::wstring &wsCheckToken) + { + if(L"sin" == wsCheckToken) enTypeFun = sin; + else if(L"abs" == wsCheckToken) enTypeFun = abs; + else if(L"fact" == wsCheckToken) enTypeFun = fact; + else if(L"sqrt" == wsCheckToken) enTypeFun = sqrt; + else if(L"cos" == wsCheckToken) enTypeFun = cos; + else if(L"tan" == wsCheckToken) enTypeFun = tan; + else if(L"cot" == wsCheckToken) enTypeFun = cot; + else if(L"sinh" == wsCheckToken) enTypeFun = sinh; + else if(L"cosh" == wsCheckToken) enTypeFun = cosh; + else if(L"tanh" == wsCheckToken) enTypeFun = tanh; + else if(L"coth" == wsCheckToken) enTypeFun = coth; + else if(L"arcsin" == wsCheckToken) enTypeFun = arcsin; + else if(L"arccos" == wsCheckToken) enTypeFun = arccos; + else if(L"arctan" == wsCheckToken) enTypeFun = arctan; + else if(L"arccot" == wsCheckToken) enTypeFun = arccot; + else if(L"arsinh" == wsCheckToken) enTypeFun = arsinh; + else if(L"arcosh" == wsCheckToken) enTypeFun = arcosh; + else if(L"artanh" == wsCheckToken) enTypeFun = artanh; + else if(L"arcoth" == wsCheckToken) enTypeFun = arcoth; + else if(L"ln" == wsCheckToken) enTypeFun = ln; + } +//class methods CArgumentContainer + CArgumentContainer::CArgumentContainer() + { + oArgument = nullptr; + } + CArgumentContainer::~CArgumentContainer() + { + delete oArgument; + } + std::wstring CArgumentContainer::GetValue() + { + return L""; + } + TypeElement CArgumentContainer::GetType() + { + return TwoArgumentContainer; + } + void CArgumentContainer::SetArgument(CElement *oValue) + { + oArgument = oValue; + } + CElement* CArgumentContainer::GetArgument() + { + return oArgument; + } +//class methods CIndex + CIndex::CIndex(const std::wstring& wsToken) + { + if(L"^" == wsToken) enTypeIn = upper; + else if(L"_" == wsToken) enTypeIn = lower; + else if(L"lsup" == wsToken) enTypeIn = lsup; + else if(L"lsub" == wsToken) enTypeIn = lsub; + else if(L"csup" == wsToken) enTypeIn = csup; + else if(L"csub" == wsToken) enTypeIn = csub; + SetAttribute(nullptr); + } + CIndex::~CIndex() + { + delete oIndex; + } + std::wstring CIndex::GetValue() + { + return {}; + } + TypeElement CIndex::GetType() + { + return Index; + } + void CIndex::SetIndex(CElement *oValueIndex) + { + oIndex = oValueIndex; + } +//class methods CMatrix + CMatrix::CMatrix(const std::wstring& wsToken) + { + if (L"binom" == wsToken) enTypeMatrix = binom; + else if(L"stack" == wsToken) enTypeMatrix = stack; + else if(L"matrix" == wsToken) enTypeMatrix = matrix; + } + CMatrix::~CMatrix() + {} + std::wstring CMatrix::GetValue() + { + return {}; + } + TypeElement CMatrix::GetType() + { + return Matrix; + } } + + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index f7bf9b31f1..1d594a5356 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -35,15 +35,15 @@ namespace StarMath private: CAttribute* oCAttribute; }; - class CSpecialCharacters: public CElement + class CSpecialSymbol: public CElement { public: - CSpecialCharacters(const std::wstring& wsToken); - virtual ~CSpecialCharacters(); + CSpecialSymbol(const std::wstring& wsToken); + virtual ~CSpecialSymbol(); std::wstring GetValue() override; TypeElement GetType() override; private: - TypeCharacter enTypeSpecial; + TypeSymbol enTypeSpecial; }; class CNumber: public CElement { @@ -69,7 +69,21 @@ namespace StarMath std::wstring m_wsUnar; TypeElement m_enUnarType = UnarSign; }; - class CBinaryOperator: public CElement + + class CArgumentContainer: public CElement + { + public: + CArgumentContainer(); + virtual ~CArgumentContainer(); + std::wstring GetValue() override; + TypeElement GetType() override; + void SetArgument(CElement* oValue); + CElement* GetArgument(); + private: + CElement* oArgument; + }; + + class CBinaryOperator: public CArgumentContainer { public: CBinaryOperator(); @@ -78,17 +92,13 @@ namespace StarMath std::wstring GetValue() override; TypeElement GetType() override; TypeBinOperator GetTypeBin(); + void SetRightArg(CElement* oArgument); void SetTypeBin(const TypeBinOperator& enType); - void SetLeftArg(CElement* oLeftArg); - void SetRightArg(CElement* oRightArg); - CElement* GetLeftArg(); CElement* GetRightArg(); TypeElement GetTypeRight(); - bool CheckBinOperator(const std::wstring& wsCheckToken); private: + CElement* oRightArg; TypeBinOperator enTypeBinOp; - CElement* arLeftArg; - CElement* arRightArg; }; class COperator: public CElement { @@ -128,6 +138,41 @@ namespace StarMath TypeBracket enTypeBracket; std::vector arBrecketVal; }; + class CFunction: public CArgumentContainer + { + public: + CFunction(); + virtual ~CFunction(); + std::wstring GetValue() override; + TypeElement GetType() override; + TypeFunction GetTypeFun(); + void SetTypeFunction(const std::wstring& wsCheckToken); + private: + TypeFunction enTypeFun; + }; + class CIndex: public CArgumentContainer + { + public: + CIndex(const std::wstring& wsToken); + virtual ~CIndex(); + std::wstring GetValue() override; + TypeElement GetType() override; + void SetIndex(CElement* oValueIndex); + CElement* GetIndex(); + private: + TypeIndex enTypeIn; + CElement* oIndex; + }; + class CMatrix: public CArgumentContainer + { + public: + CMatrix(const std::wstring& wsToken); + virtual ~CMatrix(); + std::wstring GetValue() override; + TypeElement GetType() override; + private: + TypeMatrix enTypeMatrix; + }; class CStarMathPars { public: @@ -137,13 +182,15 @@ namespace StarMath void Pars(std::wstring& wsStarMathLine); std::wstring GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd); CElement* ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, std::vector& arParsLine); + CElement* ReadWithoutBrackets(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd,std::vector& arParsLine); bool CheckDigit(const std::wstring& wsCheckToken); //bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& oUnarSign); static bool CheckBinOperator(const std::wstring& wsCheckToken); - bool CheckBinOperatorLowPriority(const std::wstring& wsCheckToken); - bool CheckPlusOrMinus(const std::wstring& wsCheckToken); + static bool CheckBinOperatorLowPriority(const std::wstring& wsCheckToken); + static bool CheckPlusOrMinus(const std::wstring& wsCheckToken); bool CheckOperator(const std::wstring& wsCheckToken); static bool CheckIndex(const std::wstring& wsCheckToken); + bool CheckIndexOp(const std::wstring& wsCheckToken); bool CheckBracketOpen(const std::wstring& wsCheckToken); static bool CheckBracketClose(const std::wstring& wsCheckToken); static bool CheckScalable_NotScalableBracketLeft(const std::wstring& wsCheckToken); @@ -152,7 +199,12 @@ namespace StarMath bool CheckPropertiesAttribute(const std::wstring& wsCheckToken); static bool CheckColorAttribute(const std::wstring& wsCheckToken); bool CheckSpecialCharacter(const std::wstring& wsCheckToken); + bool CheckSpecialOperation(const std::wstring& wsCheckToken);//doing first + bool CheckSpecialConnection(const std::wstring& wsCheckToken);// doint first bool CheckingTheNextElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd,bool (&func)(const std::wstring& wsCheckToken)); + bool CheckFunction(const std::wstring& wsCheckToken); + bool CheckOperation(const std::wstring& wsCheckToken); + bool CheckMatrix(const std::wstring& wsCheckToken); void PrintAr(); private: std::vector m_arParsLine; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index cd3023ee4a..80e0cf7056 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -9,7 +9,12 @@ enum TypeElement{ Bracket, UnarSign, Attribute, - SpecialCharacter, + SpecialSymbol, + Function, + TwoArgumentContainer, + Operation, + Index, + Matrix, }; enum TypeBinOperator { @@ -96,10 +101,101 @@ enum TypeAttributeColor crimson, violet,//color(without rgb and hex) }; -enum TypeCharacter +enum TypeSymbol { mline, grid, + dlgrid, + intersection, + Union, + setminus, + setquoyient, + subseteq, + subset, + supset, + supseteq, + nsubset, + nsupseteq, + nsupset, + nsubseteq, + in, + notin, + owns, + approx, + sim, + simeq, + equiv, + prop, + parallel, + ortho, + divides, + ndivides, + toward, + transl, + transr, + def, + equals, + notequals, + learrow, + learrowequals, + leslant, + riarrow, + riarrowequals, + geslant, + dllearrow, + dlriarrow, + prec, + succ, + preccurlyeq, + succcurlyeq, + precsim, + succsim, + nprec, + nsucc, + dlarrow, + dlrarrow, + drarrow, +}; +enum TypeFunction +{ + abs, + fact, + sqrt, + nroot,//nroot? + sin, + cos, + tan, + cot, + sinh, + cosh, + tanh, + coth, + arcsin, + arccos, + arctan, + arccot, + arsinh, + arcosh, + artanh, + arcoth, + ln, + exp, + log, +}; +enum TypeIndex +{ + upper, + lower, + lsup, + lsub, + csup, + csub, +}; +enum TypeMatrix +{ + binom, + stack, + matrix, }; } #endif // TYPESELEMENTS_H From eec0075e549067c42ffffa673ce982b85c70d186 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 13 Oct 2023 18:18:06 +0300 Subject: [PATCH 008/117] =?UTF-8?q?=D0=A1hange=20of=20architecture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 29 +- .../StarMath2OOXML/cconversionsmtoooxml.h | 42 +- .../StarMath2OOXML/cstarmathpars.cpp | 1335 +++++------------ .../Converter/StarMath2OOXML/cstarmathpars.h | 221 +-- .../Converter/StarMath2OOXML/typeselements.h | 73 +- 5 files changed, 522 insertions(+), 1178 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index f0988e010b..fcb9c297fb 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -1,7 +1,7 @@ #include "cconversionsmtoooxml.h" #include "../../../../DesktopEditor/common/File.h" #include -namespace StarMath { +/*namespace StarMath { CConversionSMtoOOXML::CConversionSMtoOOXML() { } @@ -14,17 +14,17 @@ namespace StarMath { ConversionOneElement(m_oTempElement); } EndConversion(); -// NSFile::CFileBinary oFile; -// oFile.CreateFileW(L"Test.txt"); -// oFile.WriteStringUTF8(m_oXmlWrite.GetXmlString()); -// oFile.CloseFile(); + NSFile::CFileBinary oFile; + oFile.CreateFileW(L"Test.txt"); + oFile.WriteStringUTF8(m_oXmlWrite.GetXmlString()); + oFile.CloseFile(); } void CConversionSMtoOOXML::ConversionOneElement(CElement *m_oElement) { switch (m_oElement->GetType()) { - case Number: - ConversNumber(dynamic_cast(m_oElement)); + case Text: + ConversText(dynamic_cast(m_oElement)); break; case BinOperator: ConversBinOperator(dynamic_cast (m_oElement)); @@ -40,7 +40,7 @@ namespace StarMath { { if(m_oElement->GetTypeBin() == plus || m_oElement->GetTypeBin() == minus || m_oElement->GetTypeBin() == multipl || m_oElement->GetTypeBin() == cdot || m_oElement->GetTypeBin() == times || m_oElement->GetTypeBin() == div || m_oElement->GetTypeBin() == odivide || m_oElement->GetTypeBin() == oplus || m_oElement->GetTypeBin() == ominus || m_oElement->GetTypeBin() == odot || m_oElement->GetTypeBin() == otimes) { - ConversionOneElement(m_oElement->GetLeftArg()); + ConversionOneElement(m_oElement->GetFirstElement()); m_oXmlWrite.WriteNodeBegin(L"m:r",false); StandartProperties(); m_oXmlWrite.WriteNodeBegin(L"m:t",false); @@ -80,9 +80,9 @@ namespace StarMath { default: break; } - if(m_oElement->GetTypeRight() == Number) + if(m_oElement->GetTypeSecondElement() == Text) { - CNumber* m_oNumber = dynamic_cast (m_oElement->GetRightArg()); + CText* m_oNumber = dynamic_cast (m_oElement->GetSecondElement()); m_oXmlWrite.WriteString(m_oNumber->GetValue()); m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); @@ -91,7 +91,7 @@ namespace StarMath { { m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); - ConversionOneElement(m_oElement->GetRightArg()); + ConversionOneElement(m_oElement->GetSecondElement()); } } @@ -100,12 +100,12 @@ namespace StarMath { m_oXmlWrite.WriteNodeBegin(L"m:f",false); if(m_oElement->GetTypeBin() == division) PropertiesMFPR(true,L"lin"); else PropertiesMFPR(false,L""); - BlockRecording(L"m:num",m_oElement->GetLeftArg()); - BlockRecording(L"m:den",m_oElement->GetRightArg()); + BlockRecording(L"m:num",m_oElement->GetFirstElement()); + BlockRecording(L"m:den",m_oElement->GetSecondElement()); m_oXmlWrite.WriteNodeEnd(L"m:f",false,false); } } - void CConversionSMtoOOXML::ConversNumber(CNumber *m_oElement) + void CConversionSMtoOOXML::ConversText(CText *m_oElement) { m_oXmlWrite.WriteNodeBegin(L"m:r",false); StandartProperties(); @@ -225,3 +225,4 @@ namespace StarMath { m_oXmlWrite.WriteNodeEnd(L"m:oMathPara",false,false); } } +*/ diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 6c47b84ddf..1aa8b5f411 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -5,25 +5,25 @@ -namespace StarMath { - class CConversionSMtoOOXML - { - public: - CConversionSMtoOOXML(); - //friend class StarMath::CStarMathPars; - void StartConversion(std::vector arPars); - void StandartProperties(); - void PropertiesMFPR(bool bType,const std::wstring& wsType); - void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup); - void ConversionOneElement(CElement* m_oElement); - void ConversBinOperator(CBinaryOperator* m_oElement); - void ConversNumber(CNumber* m_oElement); - void ConversOperator(COperator* m_oElement); - void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock); - void EndConversion(); - std::wstring GetOOXML() ; - private: - XmlUtils::CXmlWriter m_oXmlWrite; - }; -} +//namespace StarMath { +// class CConversionSMtoOOXML +// { +// public: +// CConversionSMtoOOXML(); +// //friend class StarMath::CStarMathPars; +// void StartConversion(std::vector arPars); +// void StandartProperties(); +// void PropertiesMFPR(bool bType,const std::wstring& wsType); +// void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup); +// void ConversionOneElement(CElement* m_oElement); +// void ConversBinOperator(CBinaryOperator* m_oElement); +// void ConversText(CText* m_oElement); +// void ConversOperator(COperator* m_oElement); +// void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock); +// void EndConversion(); +// std::wstring GetOOXML() ; +// private: +// XmlUtils::CXmlWriter m_oXmlWrite; +// }; +//} #endif // CCONVERSIONSMTOOOXML_H diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index fd5de25f4e..65344bf039 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -1,62 +1,42 @@ #include "cstarmathpars.h" namespace StarMath { -//Class methods CStarMathPars - CStarMathPars::CStarMathPars() +//class methods CParsStarMath + std::vector CParseStarMathString::Parse(std::wstring& wsParseString) { - } - - CStarMathPars::~CStarMathPars() - { - for(CElement* ReleaseObject: m_arParsLine) + std::wstring::iterator itStart = wsParseString.begin(),itEnd = wsParseString.end(); + while(itStart != itEnd) { - delete ReleaseObject; + arEquation.push_back(ParsElement(itStart,itEnd)); } + return arEquation; } - void CStarMathPars::PrintAr() - { - for(int i = 0;iGetType(); - } - } -//Test version (works correctly only with operators, does not work correctly with attributes) - CElement* CStarMathPars::ReadWithoutBrackets(std::wstring::iterator &itFirst, std::wstring::iterator &itEnd,std::vector& arParsLine) + CElement* CParseStarMathString::ParsElement(std::wstring::iterator& itStart, std::wstring::iterator& itEnd) { - CElement* m_oOneElement = ParsElement(itFirst,itEnd,arParsLine); - if(m_oOneElement->GetType() != Bracket) + CElement* pElement; + std::wstring wsToken = GetElement(itStart,itEnd); + std::vector arAttributes; + TypeElement enTypeToken = CAttribute::IsAttribute(wsToken); + while(enTypeToken != TypeElement::undefine && itStart != itEnd) { - std::vector arTempValue; - arTempValue.push_back(m_oOneElement); - while(CheckingTheNextElement(itFirst,itEnd,CheckBinOperator)|| CheckingTheNextElement(itFirst,itEnd,CheckPlusOrMinus)||CheckingTheNextElement(itFirst,itEnd,CheckBinOperatorLowPriority)) - { - arTempValue.push_back(ParsElement(itFirst,itEnd,arTempValue)); - } - if(arTempValue.size()== 1) return m_oOneElement = arTempValue.back(); - else - { - CBracket* m_oBracket = new CBracket; - m_oBracket->SetBracketVal(arTempValue); - m_oBracket->SetTypeBracket(L"brace"); - return m_oBracket; - } - } - else return m_oOneElement; - } - - void CStarMathPars::Pars(std::wstring& wsStarMathLine) - { - std::wstring::iterator itFirst = wsStarMathLine.begin(), itEnd = wsStarMathLine.end(); - while(itFirst != itEnd) - { - m_arParsLine.push_back(ParsElement(itFirst,itEnd,m_arParsLine)); - //std::wcout << GetElement(itFirst,itEnd)<SetAttribute(arAttributes); + pElement->Pars(itStart,itEnd); + return pElement; + } + else return pElement; } - std::wstring CStarMathPars::GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd) + std::wstring CParseStarMathString::GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd) { std::wstring m_wsElement{}; for(; itFirst != itEnd;itFirst++) @@ -85,936 +65,411 @@ namespace StarMath if(!m_wsElement.empty()) return m_wsElement; else return {}; } - CElement* CStarMathPars::ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd,std::vector& arParsLine) + bool CParseStarMathString::CheckingTheNextElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, bool (&func)(const std::wstring&)) { - CAttribute* m_oAttribute = new CAttribute; - std::wstring wsOneElement = GetElement(itFirst,itEnd); - while((L"color" == wsOneElement && CheckingTheNextElement(itFirst,itEnd,CheckColorAttribute))|| CheckPropertiesAttribute(wsOneElement) || CheckTopAttribute(wsOneElement)) - { - if(wsOneElement == L"color") wsOneElement = GetElement(itFirst,itEnd); - m_oAttribute->SetTypeAtt(wsOneElement); - wsOneElement = GetElement(itFirst,itEnd); - } - - if(CheckDigit(wsOneElement)) - { - CNumber* m_oCNumber = new CNumber(wsOneElement); - m_oCNumber->SetAttribute(m_oAttribute); - return m_oCNumber; - } - else if(CheckSpecialCharacter(wsOneElement) || CheckSpecialOperation(wsOneElement) || CheckSpecialConnection(wsOneElement)) return new CSpecialSymbol(wsOneElement); - else if(CheckFunction(wsOneElement)) - { - CFunction* m_oFunction = new CFunction; - m_oFunction->SetTypeFunction(wsOneElement); - if(L"ln" == wsOneElement) m_oFunction->SetArgument(ReadWithoutBrackets(itFirst,itEnd,arParsLine)); - else m_oFunction->SetArgument(ParsElement(itFirst,itEnd,arParsLine)); - m_oFunction->SetAttribute(m_oAttribute); - return m_oFunction; - } - else if(CheckIndex(wsOneElement)) - { - CIndex* m_oIndex = new CIndex(wsOneElement); - m_oIndex->SetArgument(arParsLine.back()); - m_oIndex->SetIndex(ParsElement(itFirst,itEnd,arParsLine)); - return m_oIndex; - } - else if(CheckMatrix(wsOneElement)) - { - CMatrix* m_oMatrix = new CMatrix(wsOneElement); - m_oMatrix->SetArgument(ParsElement(itFirst,itEnd,arParsLine)); - m_oMatrix->SetAttribute(m_oAttribute); - return m_oMatrix; - } - else if(CheckBinOperator(wsOneElement) || CheckPlusOrMinus(wsOneElement) || CheckBinOperatorLowPriority(wsOneElement)) - { - if(!arParsLine.empty()) - { - CBinaryOperator* m_pBinOp = new CBinaryOperator(wsOneElement); - CElement* m_oTempElement{ParsElement(itFirst,itEnd,arParsLine)}; - m_pBinOp->SetArgument(arParsLine.back()); - arParsLine.pop_back(); - if(((CheckPlusOrMinus(wsOneElement) || CheckBinOperatorLowPriority(wsOneElement)) && (CheckingTheNextElement(itFirst, itEnd,CheckBinOperator)||CheckingTheNextElement(itFirst, itEnd, CheckIndex))) || (CheckBinOperator(wsOneElement) && CheckingTheNextElement(itFirst, itEnd,CheckIndex))) - { - arParsLine.push_back(m_oTempElement); - m_pBinOp->SetRightArg(ParsElement(itFirst,itEnd,arParsLine)); - } - else m_pBinOp->SetRightArg(m_oTempElement); - m_pBinOp->SetAttribute(m_oAttribute); - return m_pBinOp; - } - return NULL; - } - else if(CheckBracketOpen(wsOneElement) || CheckScalable_NotScalableBracketLeft(wsOneElement) || (L"left" == wsOneElement && CheckingTheNextElement(itFirst,itEnd,CheckScalable_NotScalableBracketLeft))) - { - CBracket* m_oBracket = new CBracket; - std::wstring wsTypeBracket; - std::vector arValueBrecket; - if(L"left" == wsOneElement) - { - m_oBracket->SetScalable(); - wsOneElement = GetElement(itFirst,itEnd); - wsTypeBracket = wsOneElement; - } - else wsTypeBracket = wsOneElement; - while(!CheckingTheNextElement(itFirst,itEnd,CheckBracketClose) && !CheckingTheNextElement(itFirst,itEnd,CheckScalable_NotScalableBracketRight)) - { - arValueBrecket.push_back(ParsElement(itFirst,itEnd,arValueBrecket)); - } - wsOneElement = GetElement(itFirst,itEnd); - if(L"right" == wsOneElement) wsOneElement = GetElement(itFirst,itEnd); - m_oBracket->SetBracketVal(arValueBrecket); - m_oBracket->SetTypeBracket(wsTypeBracket); - m_oBracket ->SetAttribute(m_oAttribute); - return m_oBracket; - } - else if(CheckOperator(wsOneElement)) - { - COperator* oTempOp = new COperator(wsOneElement); - std::vector arValueBrecket; - std::wstring::iterator itSavePos; - do - { - itSavePos = itFirst; - wsOneElement = GetElement(itFirst,itEnd); - if( wsOneElement == L"from") - oTempOp->SetFrom(ParsElement(itFirst,itEnd,arValueBrecket)); - else if(wsOneElement == L"to") - oTempOp->SetTo(ParsElement(itFirst,itEnd,arValueBrecket)); - else - break; - }while(true); - oTempOp->SetValueOp(ParsElement(itSavePos,itEnd,arValueBrecket)); - oTempOp->SetAttribute(m_oAttribute); - return oTempOp; - } + std::wstring::iterator itTempVal = itFirst; + std::wstring wsAttributeToken = GetElement(itFirst,itEnd); +// while(true) +// { +// if(wsAttributeToken == L"color") wsAttributeToken = GetElement(itFirst,itEnd); +// wsAttributeToken = GetElement(itFirst,itEnd); +// } + itFirst = itTempVal; + if(func(wsAttributeToken)) return true; + else return false; } - - bool CStarMathPars::CheckDigit(const std::wstring &wsCheckToken) +//class methods CAttribute + CAttribute::~CAttribute() + {} + CAttribute::CAttribute(const TypeElement &enType) { - for(char Check: wsCheckToken) + enTypeAttr = enType; + } + TypeElement CAttribute::GetType() + { + return enTypeAttr; + } +//нет phantom, rgb, 16 , гарнитуры и кегля + TypeElement CAttribute::IsAttribute(const std::wstring &wsToken) + { + if(L"acute" == wsToken) return TypeElement::acute; + else if(L"color" == wsToken) return TypeElement::color; + else if(L"breve" == wsToken) return TypeElement::breve; + else if(L"dot" == wsToken) return TypeElement::dot; + else if(L"dddot" == wsToken) return TypeElement::dddot; + else if(L"vec" == wsToken) return TypeElement::vec; + else if(L"tilde" == wsToken) return TypeElement::tilde; + else if(L"check" == wsToken) return TypeElement::check; + else if(L"grave" == wsToken) return TypeElement::grave; + else if(L"circle" == wsToken) return TypeElement::circle; + else if(L"ddot" == wsToken) return TypeElement::ddot; + else if(L"bar" == wsToken) return TypeElement::bar; + else if(L"harpoon" == wsToken) return TypeElement::harpoon; + else if(L"hat" == wsToken) return TypeElement::hat; + else if(L"widevec" == wsToken) return TypeElement::widevec; + else if(L"widetilde" == wsToken) return TypeElement::widetilde; + else if(L"overline" == wsToken) return TypeElement::overline; + else if(L"overstrike" == wsToken) return TypeElement::overstrike; + else if(L"wideharpoon" == wsToken) return TypeElement::wideharpoon; + else if(L"widehat" == wsToken) return TypeElement::widehat; + else if(L"underline" == wsToken) return TypeElement::underline; + else if(L"ital" == wsToken) return TypeElement::ital; + else if(L"bold" == wsToken) return TypeElement::bold; + else if(L"black" == wsToken) return TypeElement::black; + else if(L"green" == wsToken) return TypeElement::green; + else if(L"aqua" == wsToken) return TypeElement::aqua; + else if(L"yellow" == wsToken) return TypeElement::yellow; + else if(L"lime" == wsToken) return TypeElement::lime; + else if(L"navy" == wsToken) return TypeElement::navy; + else if(L"purple" == wsToken) return TypeElement::purple; + else if(L"teal" == wsToken) return TypeElement::teal; + else if(L"blue" == wsToken) return TypeElement::blue; + else if(L"red" == wsToken) return TypeElement::red; + else if(L"fuchsia" == wsToken) return TypeElement::fuchsia; + else if(L"gray" == wsToken) return TypeElement::gray; + else if(L"maroon" == wsToken) return TypeElement::maroon; + else if(L"olive" == wsToken) return TypeElement::olive; + else if(L"silver" == wsToken) return TypeElement::silver; + else if(L"coral" == wsToken) return TypeElement::coral; + else if(L"midnightblue" == wsToken) return TypeElement::midnightblue; + else if(L"crimson" == wsToken) return TypeElement::crimson; + else if(L"violet" == wsToken) return TypeElement::violet; + else if(L"orange" == wsToken) return TypeElement::orange; + else if(L"seagreen" == wsToken) return TypeElement::seagreen; + else if(L"hotpink" == wsToken) return TypeElement::hotpink; + else if(L"orangered" == wsToken) return TypeElement::orangered; + else if(L"indigo" == wsToken) return TypeElement::indigo; + else if(L"lavender" == wsToken) return TypeElement::lavender; + else return TypeElement::undefine; + } +//class methods CElement + CElement::~CElement() + {} + CElement::CElement() + {} +// TypeElement CElement::GetTypeElement(const std::wstring& wsToken) +// { +// if (wsToken == L"+") +// { +// return TypeElement::plus; +// } +// else if (wsToken == L"-") +// { +// return TypeElement::minus; +// } +// else if (wsToken == L"*") +// { +// return TypeElement::multipl; +// } +// else if (wsToken == L"/") +// { +// return TypeElement::division; +// } +// else if (wsToken == L"over") +// { +// return TypeElement::over; +// } +// else if (wsToken == L"cdot") +// { +// return TypeElement::cdot; +// } +// else if (wsToken == L"times") +// { +// return TypeElement::times; +// } +// else if (wsToken == L"frac") +// { +// return TypeElement::frac; +// } +// else if (wsToken == L"div") +// { +// return TypeElement::div; +// } +// else if (wsToken == L"oplus") +// { +// return TypeElement::oplus; +// } +// else if (wsToken == L"ominus") +// { +// return TypeElement::ominus; +// } +// else if (wsToken == L"odot") +// { +// return TypeElement::odot; +// } +// else if (wsToken == L"otimes") +// { +// return TypeElement::otimes; +// } +// else if (wsToken == L"odivide") +// { +// return TypeElement::odivide; +// } +// else if (wsToken == L"circ") +// { +// return TypeElement::circ; +// } +// else if (wsToken == L"wideslash") +// { +// return TypeElement::wideslash; +// } +// else if (wsToken == L"widebslash") +// { +// return TypeElement::widebslash; +// } +// else if(L"{" == wsToken) return TypeElement::brace; +// else if(L"(" == wsToken) return TypeElement::round; +// else if(L"[" == wsToken) return TypeElement::square; +// else if(L"ldbracket" == wsToken) return TypeElement::ldbracket; +// else if(L"lbrace" == wsToken) return TypeElement::lbrace; +// else if(L"langle" == wsToken) return TypeElement::langle; +// else if(L"lceil" == wsToken) return TypeElement::lceil; +// else if(L"lfloor" == wsToken) return TypeElement::lfloor; +// else if(L"lline" == wsToken) return TypeElement::lline; +// else if(L"ldline" == wsToken) return TypeElement::ldline; +// else return TypeElement::undefine; +// } + CElement* CElement::CreateElement(const std::wstring& wsToken) + { + //binop + if (wsToken == L"+") { - if(!isdigit(Check)) return false; + return new CElementBinOperator(TypeElement::plus); + } + else if (wsToken == L"-") + { + return new CElementBinOperator(TypeElement::minus); + } + else if (wsToken == L"*") + { + return new CElementBinOperator(TypeElement::multipl); + } + else if (wsToken == L"/") + { + return new CElementBinOperator(TypeElement::division); + } + else if (wsToken == L"over") + { + return new CElementBinOperator(TypeElement::over); + } + else if (wsToken == L"cdot") + { + return new CElementBinOperator(TypeElement::cdot); + } + else if (wsToken == L"times") + { + return new CElementBinOperator(TypeElement::times); + } + else if (wsToken == L"frac") + { + return new CElementBinOperator(TypeElement::frac); + } + else if (wsToken == L"div") + { + return new CElementBinOperator(TypeElement::div); + } + else if (wsToken == L"oplus") + { + return new CElementBinOperator(TypeElement::oplus); + } + else if (wsToken == L"ominus") + { + return new CElementBinOperator(TypeElement::ominus); + } + else if (wsToken == L"odot") + { + return new CElementBinOperator(TypeElement::odot); + } + else if (wsToken == L"otimes") + { + return new CElementBinOperator(TypeElement::otimes); + } + else if (wsToken == L"odivide") + { + return new CElementBinOperator(TypeElement::odivide); + } + else if (wsToken == L"circ") + { + return new CElementBinOperator(TypeElement::circ); + } + else if (wsToken == L"wideslash") + { + return new CElementBinOperator(TypeElement::wideslash); + } + else if (wsToken == L"widebslash") + { + return new CElementBinOperator(TypeElement::widebslash); + } + //brace + else if(L"{" == wsToken) return new CElementBracket(TypeElement::brace); +// else if(L"(" == wsToken) return TypeElement::round; +// else if(L"[" == wsToken) return TypeElement::square; +// else if(L"ldbracket" == wsToken) return TypeElement::ldbracket; +// else if(L"lbrace" == wsToken) return TypeElement::lbrace; +// else if(L"langle" == wsToken) return TypeElement::langle; +// else if(L"lceil" == wsToken) return TypeElement::lceil; +// else if(L"lfloor" == wsToken) return TypeElement::lfloor; +// else if(L"lline" == wsToken) return TypeElement::lline; +// else if(L"ldline" == wsToken) return TypeElement::ldline; + else if(CElementString::IsDigit(wsToken)) return new CElementString(wsToken); + else return nullptr; + } + void CElement::SetAttribute(const std::vector arAttr) + { + arElementAttributes = arAttr; + } +//class methods CElementString + CElementString::CElementString(const std::wstring& wsTokenString) + { + wsString = wsTokenString; + } + CElementString::~CElementString() + {} + void CElementString::SetString(const std::wstring& wsTokenString) + { + wsString = wsTokenString; + } + void CElementString::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + { + } + std::wstring CElementString::GetString() + { + return wsString; + } + bool CElementString::IsDigit(const std::wstring &wsToken) + { + for(char cOneElement: wsToken) + { + if(!isdigit(cOneElement)) return false; } return true; } - bool CStarMathPars::CheckScalable_NotScalableBracketLeft(const std::wstring &wsCheckToken) +//class methods CElementBinOperator + CElementBinOperator::CElementBinOperator(const TypeElement& enType) { - return(L"ldbracket" == wsCheckToken || L"lbrace" == wsCheckToken || L"langle" == wsCheckToken || L"lceil" == wsCheckToken || L"lfloor" == wsCheckToken || L"lline" == wsCheckToken || L"ldline" == wsCheckToken); + enTypeBinOp = enType; } - bool CStarMathPars::CheckScalable_NotScalableBracketRight(const std::wstring &wsCheckToken) + CElementBinOperator::~CElementBinOperator() { - return(L"rdbracket" == wsCheckToken || L"rbrace" == wsCheckToken || L"rangle" == wsCheckToken || L"rceil" == wsCheckToken || L"rfloor" == wsCheckToken || L"rline" == wsCheckToken || L"rdline" == wsCheckToken || L"right" == wsCheckToken); + delete pLeftArgument; + delete pRightArgument; } -////////////////Requires improvement - /*bool CStarMathPars::CheckUnarSign(std::wstring &wsCheckToken,CUnarySign& m_oUnarSign) + void CElementBinOperator::SetLeftArg(CElement *pElement) { - std::wstring wsTempValueUnarSign; - bool UnarSign = false; - for(int i = 0;i<2;i++) + pLeftArgument = pElement; + } + void CElementBinOperator::SetRightArg(CElement *pElement) + { + pRightArgument = pElement; + } + void CElementBinOperator::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + { + SetRightArg(CParseStarMathString::ParsElement(itStart,itEnd)); + } + void CElementBinOperator::SetTypeBinOP(const TypeElement &enType) + { + enTypeBinOp = enType; + } + bool CElementBinOperator::IsBinOperator(const TypeElement& enCheckType) + { + switch (enCheckType) { - if(wsCheckToken[i] == '+' || wsCheckToken[i] == '-') - { - wsTempValueUnarSign.push_back(wsCheckToken[i]); - UnarSign = true; - } - } - if(!wsTempValueUnarSign.empty() && UnarSign) - { - m_arParsLine.push_back(m_oUnarSign.GetUnarSign(wsTempValueUnarSign)); - wsCheckToken = wsCheckToken.substr(wsTempValueUnarSign.size()); - } - return UnarSign; - }*/ - bool CStarMathPars::CheckingTheNextElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, bool (&func)(const std::wstring&)) - { - std::wstring::iterator itTempVal = itFirst; - bool bResult = func(GetElement(itFirst,itEnd)); - itFirst = itTempVal; - return bResult; - } - bool CStarMathPars::CheckBinOperator(const std::wstring &wsCheckToken) - { - return(L"*" ==wsCheckToken || L"/" == wsCheckToken || wsCheckToken == L"over" || wsCheckToken == L"cdot" || wsCheckToken == L"times" || wsCheckToken == L"div" || wsCheckToken == L"odot" || wsCheckToken == L"otimes" || wsCheckToken == L"odivide" || wsCheckToken == L"wideslash" || wsCheckToken == L"widebslash"); - } - bool CStarMathPars::CheckBinOperatorLowPriority(const std::wstring &wsCheckToken) - { - return (wsCheckToken == L"oplus" || wsCheckToken == L"ominus"|| wsCheckToken == L"circ"); - } - bool CStarMathPars::CheckPlusOrMinus(const std::wstring &wsCheckToken) - { - switch (wsCheckToken[0]) - { - case L'+': - return true; - case L'-': - return true; + case TypeElement::plus: + return true; + case TypeElement::minus: + return true; + case TypeElement::over: + return true; + case TypeElement::multipl: + return true; + case TypeElement::division: + return true; + case TypeElement::cdot: + return true; + case TypeElement::times: + return true; + case TypeElement::frac: + return true; + case TypeElement::div: + return true; + case TypeElement::oplus: + return true; + case TypeElement::ominus: + return true; + case TypeElement::odot: + return true; + case TypeElement::otimes: + return true; + case TypeElement::odivide: + return true; + case TypeElement::circ: + return true; + case TypeElement::wideslash: + return true; + case TypeElement::widebslash: + return true; default: - return false; + return false; } } - bool CStarMathPars::CheckOperator(const std::wstring &wsCheckToken) + bool CElementBinOperator::IsLowPriorityBinOp(const TypeElement &enType) { - return(wsCheckToken == L"lim" || wsCheckToken == L"sum"); - } - bool CStarMathPars::CheckIndex(const std::wstring &wsCheckToken) - { - return (wsCheckToken == L"_" || wsCheckToken == L"^" || L"lsup" == wsCheckToken || L"lsub" == wsCheckToken || L"csup" == wsCheckToken || L"csub" == wsCheckToken); - } - bool CStarMathPars::CheckIndexOp(const std::wstring &wsCheckToken) - { - return(L"from" == wsCheckToken || L"to" == wsCheckToken); - } - bool CStarMathPars::CheckBracketOpen(const std::wstring& wsCheckToken) - { - switch (wsCheckToken[0]) { - case '{': - return true; - case '(': - return true; - case '[': - return true; - default: - return false; - } - } - bool CStarMathPars::CheckBracketClose(const std::wstring& wsCheckToken) - { - switch (wsCheckToken[0]) {; - case '}': - return true; - case ')': - return true; - case ']': - return true; - default: - return false; - } - } - bool CStarMathPars::CheckTopAttribute(const std::wstring& wsCheckToken) - { - return(L"acute" == wsCheckToken || L"breve" == wsCheckToken || L"dot" == wsCheckToken || L"dddot" == wsCheckToken || L"vec" == wsCheckToken || L"tilde" == wsCheckToken || L"check" == wsCheckToken || L"grave" == wsCheckToken || L"circle" == wsCheckToken || L"ddot" == wsCheckToken || L"bar" == wsCheckToken || L"harpoon" == wsCheckToken || L"hat" == wsCheckToken || L"widevec" == wsCheckToken || L"widetilde" == wsCheckToken || L"overline" == wsCheckToken || L"overstrike" == wsCheckToken || L"wideharpoon" == wsCheckToken || L"widehat" == wsCheckToken || L"underline" == wsCheckToken); - } - bool CStarMathPars::CheckPropertiesAttribute(const std::wstring& wsCheckToken) - { - return(L"ital" == wsCheckToken || L"bold" == wsCheckToken || L"phantom" == wsCheckToken); - } - bool CStarMathPars::CheckColorAttribute(const std::wstring &wsCheckToken) - { - return (L"violet" == wsCheckToken || L"black" == wsCheckToken || L"green" == wsCheckToken || L"aqua" == wsCheckToken || L"yellow" == wsCheckToken || L"lime" == wsCheckToken || L"navy" == wsCheckToken || L"purple" == wsCheckToken || L"teal" == wsCheckToken || L"blue" == wsCheckToken || L"red" == wsCheckToken || L"fuchsia" == wsCheckToken || L"gray" == wsCheckToken || L"maroon" == wsCheckToken || L"olive" == wsCheckToken || L"silver" == wsCheckToken || L"coral" == wsCheckToken || L"midnightblue" == wsCheckToken || L"crimson" == wsCheckToken || L"violet" == wsCheckToken); - } - bool CStarMathPars::CheckSpecialCharacter(const std::wstring &wsCheckToken) - { - return (L"mline" == wsCheckToken || L"#" == wsCheckToken || L"##" == wsCheckToken); - } - bool CStarMathPars::CheckSpecialOperation(const std::wstring &wsCheckToken) - { - return(L"intersection" == wsCheckToken || L"union" == wsCheckToken || L"setminus" == wsCheckToken || L"setquoyient" == wsCheckToken || L"subseteq" == wsCheckToken || L"subset" == wsCheckToken || L"supset" == wsCheckToken || L"supseteq" == wsCheckToken || L"nsubset" == wsCheckToken || L"nsupseteq" == wsCheckToken || L"nsupset" == wsCheckToken || L"nsubseteq" == wsCheckToken || L"in" == wsCheckToken || L"notin" == wsCheckToken || L"owns" == wsCheckToken); - } - bool CStarMathPars::CheckSpecialConnection(const std::wstring &wsCheckToken) - { - return(L"approx" == wsCheckToken || L"sim" == wsCheckToken || L"simeq" == wsCheckToken || L"equiv" == wsCheckToken || L"prop" == wsCheckToken || L"parallel" == wsCheckToken || L"ortho" == wsCheckToken || L"divides" == wsCheckToken || L"ndivides" == wsCheckToken || L"toward" == wsCheckToken || L"transl" == wsCheckToken || L"transr" == wsCheckToken || L"def" == wsCheckToken || L"=" == wsCheckToken || L"<>" == wsCheckToken || L"<" == wsCheckToken || L"<=" == wsCheckToken || L"leslant" == wsCheckToken || L">" == wsCheckToken || L">=" == wsCheckToken || L"geslant" == wsCheckToken || L"<<" == wsCheckToken || L">>" == wsCheckToken || L"prec" == wsCheckToken || L"succ" == wsCheckToken || L"preccurlyeq" == wsCheckToken || L"succcurlyeq" == wsCheckToken || L"precsim" == wsCheckToken || L"succsim" == wsCheckToken || L"nprec" == wsCheckToken || L"nsucc" == wsCheckToken || L"dlarrow" == wsCheckToken || L"dlrarrow" == wsCheckToken || L"drarrow" == wsCheckToken); - } - std::vector CStarMathPars::GetVector() - { - return m_arParsLine; - } - bool CStarMathPars::CheckFunction(const std::wstring &wsCheckToken) - { - return(L"sin" == wsCheckToken || L"cos" == wsCheckToken || L"ln" == wsCheckToken || L"tan" == wsCheckToken || L"cot" == wsCheckToken || L"sinh" == wsCheckToken || L"cosh" == wsCheckToken || L"tanh" == wsCheckToken || L"coth" == wsCheckToken || L"arcsin" == wsCheckToken || L"arccos" == wsCheckToken || L"arctan" == wsCheckToken || L"arccot" == wsCheckToken || L"arsinh" == wsCheckToken || L"arcosh" == wsCheckToken || L"artanh" == wsCheckToken || L"arcoth" == wsCheckToken || L"abs" == wsCheckToken || L"fact" == wsCheckToken || L"sqrt" == wsCheckToken || L"nroot" == wsCheckToken); - } - bool CStarMathPars::CheckOperation(const std::wstring &wsCheckToken) - { - return(L"intersection" == wsCheckToken || L"union" == wsCheckToken || L"setminus" == wsCheckToken || L"setquoytient" == wsCheckToken || L"subseteq" == wsCheckToken || L"subset" == wsCheckToken); - } - bool CStarMathPars::CheckMatrix(const std::wstring &wsCheckToken) - { - return (L"stack" == wsCheckToken || L"matrix" == wsCheckToken || L"binom" == wsCheckToken); - } -//Class methods CNumber - CNumber::CNumber() - { - } - CNumber::CNumber(const std::wstring &wsValue) - { - this->m_wsValueNumber = wsValue; - } - CNumber::~CNumber() - { - } - - std::wstring CNumber::GetValue() - { - return m_wsValueNumber; - } - TypeElement CNumber::GetType() - { - return Number; - } -//Class methods CUnarySign - CUnarySign* CUnarySign::GetUnarSign(const std::wstring& wsUnarToken) - { - CUnarySign* oSign = new CUnarySign; - oSign->m_wsUnar = wsUnarToken; - return oSign; - } - - std::wstring CUnarySign::GetValue() - { - return m_wsUnar; - } - TypeElement CUnarySign::GetType() - { - return m_enUnarType; - } - CUnarySign::CUnarySign() - {} - CUnarySign::~CUnarySign() - {} -//Class methods CBinaryOperator - CBinaryOperator::CBinaryOperator() - { - oRightArg = nullptr; - } - CBinaryOperator::CBinaryOperator(const std::wstring& wsToken) - { - if(wsToken == L"+") - { - enTypeBinOp = plus; - } - else if(wsToken == L"-") - { - enTypeBinOp = minus; - } - else if(wsToken == L"*") - { - enTypeBinOp = multipl; - } - else if(wsToken == L"/") - { - enTypeBinOp = division; - } - else if(wsToken == L"over") - { - enTypeBinOp = over; - } - else if(wsToken == L"cdot") - { - enTypeBinOp = cdot; - } - else if(wsToken == L"times") - { - enTypeBinOp = times; - } - else if(wsToken == L"frac") - { - enTypeBinOp = frac; - } - else if(wsToken == L"div") - { - enTypeBinOp = div; - } - else if(wsToken == L"oplus") - { - enTypeBinOp = oplus; - } - else if(wsToken == L"ominus") - { - enTypeBinOp = ominus; - } - else if(wsToken == L"odot") - { - enTypeBinOp = odot; - } - else if(wsToken == L"otimes") + switch (enType) { - enTypeBinOp = otimes; + case TypeElement::plus: + return true; + case TypeElement::minus: + return true; + case TypeElement::oplus: + return true; + case TypeElement::ominus: + return true; + case TypeElement::circ: + return true; + default: + return false; } - else if(wsToken == L"odivide") - { - enTypeBinOp = odivide; - } - else if(wsToken == L"circ") - { - enTypeBinOp = circ; - } - else if(wsToken == L"wideslash") - { - enTypeBinOp = wideslash; - } - else if(wsToken == L"widebslash") - { - enTypeBinOp = widebslash; - } - oRightArg = nullptr; - } - CBinaryOperator::~CBinaryOperator() - { - delete oRightArg; } - TypeElement CBinaryOperator::GetType() + bool CElementBinOperator::IsHighPriorityBinOp(const TypeElement &enType) { - return BinOperator; - } - std::wstring CBinaryOperator::GetValue() - { - return {}; - } - TypeBinOperator CBinaryOperator::GetTypeBin() - { - return enTypeBinOp; - } - void CBinaryOperator::SetRightArg(CElement *oArgument) - { - oRightArg = oArgument; - } - void CBinaryOperator::SetTypeBin(const TypeBinOperator &enType) - { - this->enTypeBinOp = enType; - } - CElement* CBinaryOperator::GetRightArg() - { - return oRightArg; - } - TypeElement CBinaryOperator::GetTypeRight() - { - return oRightArg->GetType(); - } -//Class methods COperator - COperator::COperator(): oFromValue(NULL),oToValue(NULL),oValueOp(NULL) - {} - COperator::COperator(const std::wstring& wsToken): oFromValue(NULL), oToValue(NULL), oValueOp(NULL) - { - if(wsToken== L"lim") + switch(enType) { - enTypeOp = lim; + case TypeElement::over: + return true; + default: + return false; } - else if(wsToken == L"sum") - { - enTypeOp = sum; - } - } - COperator::~COperator() - { - delete oFromValue; - delete oToValue; - delete oValueOp; - } - TypeElement COperator::GetType() - { - return Operator; - } - std::wstring COperator::GetValue() - { - return {}; - } - TypeOperator COperator::GetTypeOp() - { - return enTypeOp; - } - void COperator::SetFrom(CElement *oFrom) - { - oFromValue = oFrom; - } - void COperator::SetTo(CElement *oTo) - { - oToValue = oTo; - } - void COperator::SetValueOp(CElement *oValue) - { - oValueOp = oValue; - } - void COperator::SetTypeOp(const TypeOperator& enType) - { - enTypeOp = enType; - } - CElement* COperator::GetValueOp() - { - return oValueOp; - } - CElement* COperator::GetFrom() - { - return oFromValue; - } - CElement* COperator::GetTo() - { - return oToValue; - } -//Class methods CBracket - CBracket::CBracket() - {} - CBracket::CBracket(const std::vector& arValue,const std::wstring& wsCheckToken) - { - arBrecketVal = arValue; - if (L"{" == wsCheckToken) enTypeBracket =brace; - else if (L"(" == wsCheckToken) enTypeBracket = round; - else if (L"[" == wsCheckToken) enTypeBracket = square; - else if(wsCheckToken == L"ldbracket") - { - enTypeBracket = ldbracket; - } - else if(wsCheckToken == L"lbrace") - { - enTypeBracket = lbrace; - } - else if(wsCheckToken == L"langle") - { - enTypeBracket = langle; - } - else if(wsCheckToken == L"lceil") - { - enTypeBracket = lceil; - } - else if(wsCheckToken == L"lfloor") - { - enTypeBracket = lfloor; - } - else if(wsCheckToken == L"lline") - { - enTypeBracket = lline; - } - else if(wsCheckToken == L"ldline") - { - enTypeBracket = ldline; - } - } - CBracket::~CBracket() - { - for(CElement* ReleaseObject: arBrecketVal) - { - delete ReleaseObject; - } - } - TypeElement CBracket::GetType() - { - for(CElement* enTemp: arBrecketVal) - { - std::wcout<< enTemp->GetType() << std::endl; - } - return Bracket; - } - std::wstring CBracket::GetValue() - { - return {}; - } - void CBracket::SetScalable() - { - bScalable = true; - } - void CBracket::SetBracketVal(const std::vector &arBrecketValue) - { - arBrecketVal = arBrecketValue; } - void CBracket::SetTypeBracket(const std::wstring& wsCheckToken) +//class methods CElementBracket + CElementBracket::CElementBracket(const TypeElement& enType) { - if (L"{" == wsCheckToken) enTypeBracket = brace; - else if (L"(" == wsCheckToken) enTypeBracket = round; - else if (L"[" == wsCheckToken) enTypeBracket = square; - else if(wsCheckToken == L"ldbracket") - { - enTypeBracket = ldbracket; - } - else if(wsCheckToken == L"lbrace") - { - enTypeBracket = lbrace; - } - else if(wsCheckToken == L"langle") - { - enTypeBracket = langle; - } - else if(wsCheckToken == L"lceil") - { - enTypeBracket = lceil; - } - else if(wsCheckToken == L"lfloor") - { - enTypeBracket = lfloor; - } - else if(wsCheckToken == L"lline") - { - enTypeBracket = lline; - } - else if(wsCheckToken == L"ldline") - { - enTypeBracket = ldline; - } + enTypeBracket = enType; } -//Class methods CAttribute - CAttribute::CAttribute() + CElementBracket::~CElementBracket() { + for(CElement* pTemp:arBrecketValue) delete pTemp; } - CAttribute::CAttribute(const TypeAttributeTop &enType) + void CElementBracket::SetBracketValue(const std::vector &arValue) { - enTypeTop = enType; + arBrecketValue = arValue; } - CAttribute::~CAttribute() + bool CElementBracket::IsBracketClose(const std::wstring &wsToken) { + if(L"}" == wsToken) return true; + else if(L")" == wsToken) return true; + else if(L"]" == wsToken) return true; + else return false; } - void CAttribute::SetTypeAtt(const std::wstring& wsCheckToken) + //нужно поправить GetElement(беру его тут + в методе ParsElement) + void CElementBracket::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) { - if(wsCheckToken == L"phantom") - { - bPhantom = true; - } - else if(wsCheckToken == L"bold") - { - bBold = true; - } - else if(wsCheckToken == L"ital") - { - bItal = true; - } - else if(wsCheckToken == L"black") - { - enTypeColor = black; - } - else if(wsCheckToken == L"green") - { - enTypeColor = green; - } - else if(wsCheckToken == L"aqua") - { - enTypeColor = aqua; - } - else if(wsCheckToken == L"yellow") - { - enTypeColor = yellow; - } - else if(wsCheckToken == L"lime") - { - enTypeColor = lime; - } - else if(wsCheckToken == L"navy") - { - enTypeColor = navy; - } - else if(wsCheckToken == L"purple") + std::wstring wsToken = CParseStarMathString::GetElement(itStart,itEnd) ; + while(L"right" != wsToken && !IsBracketClose(wsToken)) { - enTypeColor = purple; + arBrecketValue.push_back(CParseStarMathString::ParsElement(itStart,itEnd)); + wsToken = CParseStarMathString::GetElement(itStart,itEnd); } - else if(wsCheckToken == L"teal") - { - enTypeColor = teal; - } - else if(wsCheckToken == L"blue") - { - enTypeColor = blue; - } - else if(wsCheckToken == L"red") - { - enTypeColor = red; - } - else if(wsCheckToken == L"fuchsia") - { - enTypeColor = fuchsia; - } - else if(wsCheckToken == L"gray") - { - enTypeColor = gray; - } - else if(wsCheckToken == L"maroon") - { - enTypeColor = maroon; - } - else if(wsCheckToken == L"olive") - { - enTypeColor = olive; - } - else if(wsCheckToken == L"silver") - { - enTypeColor = silver; - } - else if(wsCheckToken == L"coral") - { - enTypeColor = coral; - } - else if(wsCheckToken == L"midnightblue") - { - enTypeColor = midnightblue; - } - else if(wsCheckToken == L"crimson") - { - enTypeColor = crimson; - } - else if(wsCheckToken == L"violet") - { - enTypeColor = violet; - } - else if(wsCheckToken == L"acute") - { - enTypeTop = acute; - } - else if(wsCheckToken == L"breve") - { - enTypeTop = breve; - } - else if(wsCheckToken == L"dot") - { - enTypeTop = dot; - } - else if(wsCheckToken == L"dddot") - { - enTypeTop = dddot; - } - else if(wsCheckToken == L"vec") - { - enTypeTop = vec; - } - else if(wsCheckToken == L"tilde") - { - enTypeTop = tilde; - } - else if(wsCheckToken == L"check") - { - enTypeTop = check; - } - else if(wsCheckToken == L"grave") - { - enTypeTop = grave; - } - else if(wsCheckToken == L"circle") - { - enTypeTop = circle; - } - else if(wsCheckToken == L"ddot") - { - enTypeTop = ddot; - } - else if(wsCheckToken == L"bar") - { - enTypeTop = bar; - } - else if(wsCheckToken == L"harpoon") - { - enTypeTop = harpoon; - } - else if(wsCheckToken == L"hat") - { - enTypeTop = hat; - } - else if(wsCheckToken == L"widevec") - { - enTypeTop = widevec; - } - else if(wsCheckToken == L"widetilde") - { - enTypeTop = widetilde; - } - else if(wsCheckToken == L"overline") - { - enTypeTop = overline; - } - else if(wsCheckToken == L"overstrike") - { - enTypeTop = overstrike; - } - else if(wsCheckToken == L"wideharpoon") - { - enTypeTop = wideharpoon; - } - else if(wsCheckToken == L"widehat") - { - enTypeTop = widehat; - } - else if(wsCheckToken == L"underline") - { - enTypeTop = underline; - } - } - TypeAttributeTop CAttribute::GetTypeAtt() - { - return enTypeTop; - } -//Class methods CElement - CElement::~CElement() - { - } - void CElement::SetAttribute(CAttribute* m_oCAttribute) - { - oCAttribute = m_oCAttribute; - } - TypeAttributeTop CElement::GetTypeAttribute() - { - return oCAttribute->GetTypeAtt(); - } -//Class methods CSpecial - CSpecialSymbol::CSpecialSymbol(const std::wstring& wsToken) - { - if(L"mline" == wsToken) enTypeSpecial = mline; - else if(L"#" == wsToken) enTypeSpecial = grid; - else if(L"##" == wsToken) enTypeSpecial = dlgrid; - else if(L"intersection" == wsToken) enTypeSpecial = intersection; - else if(L"union" == wsToken) enTypeSpecial = Union; - else if(L"setminus" == wsToken) enTypeSpecial = setminus; - else if(L"setquoyient" == wsToken) enTypeSpecial = setquoyient; - else if(L"subseteg" == wsToken) enTypeSpecial = subseteq; - else if(L"subset" == wsToken) enTypeSpecial = subset; - else if(L"supset" == wsToken) enTypeSpecial = supset; - else if(L"supseteq" == wsToken) enTypeSpecial = supseteq; - else if(L"nsubset" == wsToken) enTypeSpecial = nsubset; - else if(L"nsubseteq" == wsToken) enTypeSpecial = nsubseteq; - else if(L"nsupseteq" == wsToken) enTypeSpecial = nsupseteq; - else if(L"nsupset" == wsToken) enTypeSpecial = nsupset; - else if(L"in" == wsToken) enTypeSpecial = in; - else if(L"notin" == wsToken) enTypeSpecial = notin; - else if(L"owns" == wsToken) enTypeSpecial = owns; - else if(L"approx" == wsToken) enTypeSpecial = approx; - else if(L"sim" == wsToken) enTypeSpecial = sim; - else if(L"simeq" == wsToken) enTypeSpecial = simeq; - else if(L"equiv" == wsToken) enTypeSpecial = equiv; - else if(L"prop" == wsToken) enTypeSpecial = prop; - else if(L"parallel" == wsToken) enTypeSpecial = parallel; - else if(L"ortho" == wsToken) enTypeSpecial = ortho; - else if(L"divides" == wsToken) enTypeSpecial = divides; - else if(L"ndivides" == wsToken) enTypeSpecial = ndivides; - else if(L"toward" == wsToken) enTypeSpecial = toward; - else if(L"transl" == wsToken) enTypeSpecial = transl; - else if(L"transr" == wsToken) enTypeSpecial = transr; - else if(L"def" == wsToken) enTypeSpecial = def; - else if(L"=" == wsToken) enTypeSpecial = equals; - else if(L"<>" == wsToken) enTypeSpecial = notequals; - else if(L"<" == wsToken) enTypeSpecial = learrow; - else if(L"<=" == wsToken) enTypeSpecial = learrowequals; - else if(L"leslant" == wsToken) enTypeSpecial = leslant; - else if(L">" == wsToken) enTypeSpecial = riarrow; - else if(L">=" == wsToken) enTypeSpecial = riarrowequals; - else if(L"geslant" == wsToken) enTypeSpecial = geslant; - else if(L"<<" == wsToken) enTypeSpecial = dllearrow; - else if(L">>" == wsToken) enTypeSpecial = dlriarrow; - else if(L"prec" == wsToken) enTypeSpecial = prec; - else if(L"succ" == wsToken) enTypeSpecial = succ; - else if(L"preccurlyeq" == wsToken) enTypeSpecial = preccurlyeq; - else if(L"succcurlyeq" == wsToken) enTypeSpecial = succcurlyeq; - else if(L"precsim" == wsToken) enTypeSpecial = precsim; - else if(L"succsim" == wsToken) enTypeSpecial = succsim; - else if(L"nprec" == wsToken) enTypeSpecial = nprec; - else if(L"nsucc" == wsToken) enTypeSpecial = nsucc; - else if(L"dlarrow" == wsToken) enTypeSpecial = dlarrow; - else if(L"dlrarrow" == wsToken) enTypeSpecial = dlrarrow; - else if(L"drarrow" == wsToken) enTypeSpecial = drarrow; - SetAttribute(nullptr); - } - CSpecialSymbol::~CSpecialSymbol() - {} - std::wstring CSpecialSymbol::GetValue() - { - return {}; - } - TypeElement CSpecialSymbol::GetType() - { - return SpecialSymbol; - } -//class methods CFunction - CFunction::CFunction() - {} - CFunction::~CFunction() - { - } - std::wstring CFunction::GetValue() - { - return L""; - } - TypeElement CFunction::GetType() - { - return Function; - } - TypeFunction CFunction::GetTypeFun() - { - return enTypeFun; - } - void CFunction::SetTypeFunction(const std::wstring &wsCheckToken) - { - if(L"sin" == wsCheckToken) enTypeFun = sin; - else if(L"abs" == wsCheckToken) enTypeFun = abs; - else if(L"fact" == wsCheckToken) enTypeFun = fact; - else if(L"sqrt" == wsCheckToken) enTypeFun = sqrt; - else if(L"cos" == wsCheckToken) enTypeFun = cos; - else if(L"tan" == wsCheckToken) enTypeFun = tan; - else if(L"cot" == wsCheckToken) enTypeFun = cot; - else if(L"sinh" == wsCheckToken) enTypeFun = sinh; - else if(L"cosh" == wsCheckToken) enTypeFun = cosh; - else if(L"tanh" == wsCheckToken) enTypeFun = tanh; - else if(L"coth" == wsCheckToken) enTypeFun = coth; - else if(L"arcsin" == wsCheckToken) enTypeFun = arcsin; - else if(L"arccos" == wsCheckToken) enTypeFun = arccos; - else if(L"arctan" == wsCheckToken) enTypeFun = arctan; - else if(L"arccot" == wsCheckToken) enTypeFun = arccot; - else if(L"arsinh" == wsCheckToken) enTypeFun = arsinh; - else if(L"arcosh" == wsCheckToken) enTypeFun = arcosh; - else if(L"artanh" == wsCheckToken) enTypeFun = artanh; - else if(L"arcoth" == wsCheckToken) enTypeFun = arcoth; - else if(L"ln" == wsCheckToken) enTypeFun = ln; - } -//class methods CArgumentContainer - CArgumentContainer::CArgumentContainer() - { - oArgument = nullptr; - } - CArgumentContainer::~CArgumentContainer() - { - delete oArgument; - } - std::wstring CArgumentContainer::GetValue() - { - return L""; - } - TypeElement CArgumentContainer::GetType() - { - return TwoArgumentContainer; - } - void CArgumentContainer::SetArgument(CElement *oValue) - { - oArgument = oValue; - } - CElement* CArgumentContainer::GetArgument() - { - return oArgument; - } -//class methods CIndex - CIndex::CIndex(const std::wstring& wsToken) - { - if(L"^" == wsToken) enTypeIn = upper; - else if(L"_" == wsToken) enTypeIn = lower; - else if(L"lsup" == wsToken) enTypeIn = lsup; - else if(L"lsub" == wsToken) enTypeIn = lsub; - else if(L"csup" == wsToken) enTypeIn = csup; - else if(L"csub" == wsToken) enTypeIn = csub; - SetAttribute(nullptr); - } - CIndex::~CIndex() - { - delete oIndex; - } - std::wstring CIndex::GetValue() - { - return {}; - } - TypeElement CIndex::GetType() - { - return Index; - } - void CIndex::SetIndex(CElement *oValueIndex) - { - oIndex = oValueIndex; } -//class methods CMatrix - CMatrix::CMatrix(const std::wstring& wsToken) - { - if (L"binom" == wsToken) enTypeMatrix = binom; - else if(L"stack" == wsToken) enTypeMatrix = stack; - else if(L"matrix" == wsToken) enTypeMatrix = matrix; - } - CMatrix::~CMatrix() - {} - std::wstring CMatrix::GetValue() - { - return {}; - } - TypeElement CMatrix::GetType() - { - return Matrix; - } } - diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 1d594a5356..613a5caf88 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -11,203 +11,82 @@ namespace StarMath class CAttribute { public: - CAttribute(); - CAttribute(const TypeAttributeTop& enType); - virtual ~CAttribute(); - void SetTypeAtt(const std::wstring& wsCheckToken); - TypeAttributeTop GetTypeAtt(); + CAttribute(const TypeElement& enType); + ~CAttribute(); + static TypeElement IsAttribute(const std::wstring& wsToken); + TypeElement GetType(); private: - TypeAttributeTop enTypeTop{noneTop}; - TypeAttributeColor enTypeColor{noneColor}; - bool bBold{false}; - bool bItal{false}; - bool bPhantom{false}; + TypeElement enTypeAttr; }; - class CElement { public: + CElement(); virtual ~CElement(); - virtual std::wstring GetValue() = 0; - virtual TypeElement GetType() = 0; - void SetAttribute(CAttribute* m_oCAttribute); - TypeAttributeTop GetTypeAttribute(); + virtual void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) = 0; + //принимает подтип (over, frac и т.д) и создает нужный нам класс(внутри уже идет проверка по классам) + static CElement* CreateElement(const std::wstring& wsToken); + //static TypeElement GetTypeElement(const std::wstring& wsToken); + void SetAttribute(const std::vector arAttr); private: - CAttribute* oCAttribute; - }; - class CSpecialSymbol: public CElement - { - public: - CSpecialSymbol(const std::wstring& wsToken); - virtual ~CSpecialSymbol(); - std::wstring GetValue() override; - TypeElement GetType() override; - private: - TypeSymbol enTypeSpecial; - }; - class CNumber: public CElement - { - public: - CNumber(); - CNumber(const std::wstring& wsValue); - virtual ~CNumber(); - std::wstring GetValue() override; - TypeElement GetType() override ; - private: - std::wstring m_wsValueNumber; + std::vector arElementAttributes; }; - class CUnarySign: public CElement + class CElementString: public CElement { public: - CUnarySign(); - ~CUnarySign(); - std::wstring GetValue() override; - TypeElement GetType() override; - CUnarySign* GetUnarSign(const std::wstring& wsUnarToken); + CElementString(const std::wstring& wsTokenString); + virtual ~CElementString(); + void SetString(const std::wstring& wsTokenString); + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; + std::wstring GetString(); + static bool IsDigit(const std::wstring& wsCheckToken); private: - std::wstring m_wsUnar; - TypeElement m_enUnarType = UnarSign; + std::wstring wsString; }; - class CArgumentContainer: public CElement + class CElementBinOperator: public CElement { public: - CArgumentContainer(); - virtual ~CArgumentContainer(); - std::wstring GetValue() override; - TypeElement GetType() override; - void SetArgument(CElement* oValue); - CElement* GetArgument(); - private: - CElement* oArgument; - }; - - class CBinaryOperator: public CArgumentContainer - { - public: - CBinaryOperator(); - CBinaryOperator(const std::wstring& wsToken); - virtual ~CBinaryOperator(); - std::wstring GetValue() override; - TypeElement GetType() override; - TypeBinOperator GetTypeBin(); - void SetRightArg(CElement* oArgument); - void SetTypeBin(const TypeBinOperator& enType); + CElementBinOperator(const TypeElement& enType); + virtual ~CElementBinOperator(); + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; + void SetLeftArg(CElement* pElement); + void SetRightArg(CElement* pElement); + void SetTypeBinOP(const TypeElement& enType); CElement* GetRightArg(); - TypeElement GetTypeRight(); + CElement* GetLeftArg(); + static bool IsBinOperator(const TypeElement& enCheckType); private: - CElement* oRightArg; - TypeBinOperator enTypeBinOp; + bool IsLowPriorityBinOp(const TypeElement& enType); + bool IsHighPriorityBinOp(const TypeElement& enType); + CElement* pLeftArgument; + CElement* pRightArgument; + TypeElement enTypeBinOp; }; - class COperator: public CElement + + class CElementBracket: public CElement { public: - COperator(); - COperator(const std::wstring& wsToken); - virtual ~COperator(); - std::wstring GetValue() override; - TypeElement GetType() override; - TypeOperator GetTypeOp(); - void SetTypeOp(const TypeOperator& enType); - void SetFrom(CElement* oFrom); - void SetTo(CElement* oTo); - void SetValueOp(CElement* oValue); - CElement* GetValueOp(); - CElement* GetFrom(); - CElement* GetTo(); + CElementBracket(const TypeElement& enType); + virtual ~CElementBracket(); + void SetBracketValue(const std::vector& arValue); + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; private: - TypeOperator enTypeOp; - CElement* oFromValue{nullptr}; - CElement* oToValue{nullptr}; - CElement* oValueOp{nullptr}; + static bool IsBracketClose(const std::wstring& wsToken); + TypeElement enTypeBracket; + std::vector arBrecketValue; }; - class CBracket: public CElement + + class CParseStarMathString { public: - CBracket(); - CBracket(const std::vector& arValue,const std::wstring& wsCheckToken); - virtual ~CBracket(); - std::wstring GetValue() override; - TypeElement GetType() override; - void SetScalable(); - void SetBracketVal(const std::vector& arBrecketValue); - void SetTypeBracket(const std::wstring& wsCheckToken); + std::vector Parse(std::wstring& wsParseString); + static CElement* ParsElement(std::wstring::iterator& itStart, std::wstring::iterator& itEnd); + static std::wstring GetElement(std::wstring::iterator& itStart,std::wstring::iterator& itEnd); + static bool CheckingTheNextElement(std::wstring::iterator& itStart,std::wstring::iterator& itEnd, bool (&func)(const std::wstring&)); private: - bool bScalable{false}; - TypeBracket enTypeBracket; - std::vector arBrecketVal; - }; - class CFunction: public CArgumentContainer - { - public: - CFunction(); - virtual ~CFunction(); - std::wstring GetValue() override; - TypeElement GetType() override; - TypeFunction GetTypeFun(); - void SetTypeFunction(const std::wstring& wsCheckToken); - private: - TypeFunction enTypeFun; - }; - class CIndex: public CArgumentContainer - { - public: - CIndex(const std::wstring& wsToken); - virtual ~CIndex(); - std::wstring GetValue() override; - TypeElement GetType() override; - void SetIndex(CElement* oValueIndex); - CElement* GetIndex(); - private: - TypeIndex enTypeIn; - CElement* oIndex; - }; - class CMatrix: public CArgumentContainer - { - public: - CMatrix(const std::wstring& wsToken); - virtual ~CMatrix(); - std::wstring GetValue() override; - TypeElement GetType() override; - private: - TypeMatrix enTypeMatrix; - }; - class CStarMathPars - { - public: - CStarMathPars(); - virtual ~CStarMathPars(); - std::vector GetVector(); - void Pars(std::wstring& wsStarMathLine); - std::wstring GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd); - CElement* ParsElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, std::vector& arParsLine); - CElement* ReadWithoutBrackets(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd,std::vector& arParsLine); - bool CheckDigit(const std::wstring& wsCheckToken); - //bool CheckUnarSign(std::wstring& wsCheckToken,CUnarySign& oUnarSign); - static bool CheckBinOperator(const std::wstring& wsCheckToken); - static bool CheckBinOperatorLowPriority(const std::wstring& wsCheckToken); - static bool CheckPlusOrMinus(const std::wstring& wsCheckToken); - bool CheckOperator(const std::wstring& wsCheckToken); - static bool CheckIndex(const std::wstring& wsCheckToken); - bool CheckIndexOp(const std::wstring& wsCheckToken); - bool CheckBracketOpen(const std::wstring& wsCheckToken); - static bool CheckBracketClose(const std::wstring& wsCheckToken); - static bool CheckScalable_NotScalableBracketLeft(const std::wstring& wsCheckToken); - static bool CheckScalable_NotScalableBracketRight(const std::wstring& wsCheckToken); - bool CheckTopAttribute(const std::wstring& wsCheckToken); - bool CheckPropertiesAttribute(const std::wstring& wsCheckToken); - static bool CheckColorAttribute(const std::wstring& wsCheckToken); - bool CheckSpecialCharacter(const std::wstring& wsCheckToken); - bool CheckSpecialOperation(const std::wstring& wsCheckToken);//doing first - bool CheckSpecialConnection(const std::wstring& wsCheckToken);// doint first - bool CheckingTheNextElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd,bool (&func)(const std::wstring& wsCheckToken)); - bool CheckFunction(const std::wstring& wsCheckToken); - bool CheckOperation(const std::wstring& wsCheckToken); - bool CheckMatrix(const std::wstring& wsCheckToken); - void PrintAr(); - private: - std::vector m_arParsLine; + std::vector arEquation; }; } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index 80e0cf7056..8cb8406ea5 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -2,8 +2,10 @@ #define TYPESELEMENTS_H namespace StarMath { -enum TypeElement{ - Number, +enum class TypeElement{ + undefine, + //global + String, BinOperator, Operator, Bracket, @@ -15,9 +17,7 @@ enum TypeElement{ Operation, Index, Matrix, -}; -enum TypeBinOperator -{ + //binoop cdot, times, over, @@ -35,14 +35,10 @@ enum TypeBinOperator circ, wideslash, widebslash, -}; -enum TypeOperator -{ + //op lim, sum, -}; -enum TypeBracket -{ + //brace brace, round, square, @@ -53,10 +49,10 @@ enum TypeBracket lfloor, lline, ldline, -}; -enum TypeAttributeTop -{ - noneTop, + //attribute + ital, + bold, + //top element acute, breve, dot, @@ -77,10 +73,7 @@ enum TypeAttributeTop wideharpoon, widehat, underline,//top elements -}; -enum TypeAttributeColor -{ - noneColor, + color, black, green, aqua, @@ -99,10 +92,14 @@ enum TypeAttributeColor coral, midnightblue, crimson, - violet,//color(without rgb and hex) -}; -enum TypeSymbol -{ + violet, + orange, + seagreen, + hotpink, + orangered, + indigo, + lavender, + //color(without rgb and hex) mline, grid, dlgrid, @@ -155,9 +152,27 @@ enum TypeSymbol dlarrow, dlrarrow, drarrow, -}; -enum TypeFunction -{ + emptyset, + aleph, + setN, + setZ, + setQ, + setR, + setC, + infinity, + partial, + nabla, + exists, + notexists, + forall, + hbar, + lambdabar, + Re, + Im, + wp, + laplace, + fourier, + backepsilon, abs, fact, sqrt, @@ -181,18 +196,12 @@ enum TypeFunction ln, exp, log, -}; -enum TypeIndex -{ upper, lower, lsup, lsub, csup, csub, -}; -enum TypeMatrix -{ binom, stack, matrix, From 5b0516e398d83dc761f44941bc83c67577faee36 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 27 Oct 2023 17:23:25 +0300 Subject: [PATCH 009/117] Architecture refinement (adding connections, functions and operators) --- .../StarMath2OOXML/cstarmathpars.cpp | 493 +++++++++++++++--- .../Converter/StarMath2OOXML/cstarmathpars.h | 113 +++- .../Converter/StarMath2OOXML/typeselements.h | 9 +- 3 files changed, 527 insertions(+), 88 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 65344bf039..83507abcc4 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -5,9 +5,18 @@ namespace StarMath std::vector CParseStarMathString::Parse(std::wstring& wsParseString) { std::wstring::iterator itStart = wsParseString.begin(),itEnd = wsParseString.end(); + while(itStart != itEnd) { - arEquation.push_back(ParsElement(itStart,itEnd)); + CElement* pTempElement = ParsElement(itStart,itEnd); + if(nullptr == pTempElement) + break; + if(!arEquation.empty() && (pTempElement->GetBaseType() == TypeElement::BinOperator || pTempElement->GetBaseType() == TypeElement::SetOperations || pTempElement->GetBaseType() == TypeElement::Connection) ) + { + AddLeftArgument(arEquation.back(),pTempElement); + arEquation.pop_back(); + } + arEquation.push_back(pTempElement); } return arEquation; } @@ -32,6 +41,12 @@ namespace StarMath { pElement->SetAttribute(arAttributes); pElement->Pars(itStart,itEnd); + if(CheckingTheNextElement(itStart,itEnd,CIndex::IsIndex)) + { + CIndex* pIndex = CIndex::CreateIndex(GetElement(itStart,itEnd)); + pIndex->SetValueIndex(ParsElement(itStart,itEnd)); + pElement->SetIndex(pIndex); + } return pElement; } else return pElement; @@ -47,7 +62,7 @@ namespace StarMath itFirst++; break; } - else if(!m_wsElement.empty() && (*itFirst == L'{' || *itFirst == L'}' || *itFirst == L'+' || *itFirst == L'-' || *itFirst == L'/' || *itFirst == L'*' || L'^' == *itFirst || L'_' == *itFirst || (iswdigit(*itFirst) && !iswdigit(m_wsElement.back())) || (iswalpha(*itFirst) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *itFirst || L'>' == *itFirst || L'=' == *itFirst)))) + else if(!m_wsElement.empty() && (*itFirst == L'(' || L')' == *itFirst || *itFirst == L'{' || *itFirst == L'}' || *itFirst == L'+' || *itFirst == L'-' || *itFirst == L'/' || *itFirst == L'*' || L'^' == *itFirst || L'_' == *itFirst || (iswdigit(*itFirst) && !iswdigit(m_wsElement.back())) || (iswalpha(*itFirst) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *itFirst || L'>' == *itFirst || L'=' == *itFirst)))) { return m_wsElement; } @@ -68,16 +83,58 @@ namespace StarMath bool CParseStarMathString::CheckingTheNextElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, bool (&func)(const std::wstring&)) { std::wstring::iterator itTempVal = itFirst; - std::wstring wsAttributeToken = GetElement(itFirst,itEnd); -// while(true) -// { -// if(wsAttributeToken == L"color") wsAttributeToken = GetElement(itFirst,itEnd); -// wsAttributeToken = GetElement(itFirst,itEnd); -// } + std::wstring wsToken = GetElement(itFirst,itEnd); + TypeElement enTypeAttr = CAttribute::IsAttribute(wsToken); + while(enTypeAttr != TypeElement::undefine && (itFirst != itEnd)) + { + wsToken = GetElement(itFirst,itEnd); + enTypeAttr = CAttribute::IsAttribute(wsToken); + } itFirst = itTempVal; - if(func(wsAttributeToken)) return true; + if(func(wsToken)) return true; else return false; } + bool CParseStarMathString::MoveToNextElement(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + { + if(itStart !=itEnd) + { + std::wstring wsNextElement = CParseStarMathString::GetElement(itStart,itEnd); + if(L"right" == wsNextElement && (itStart!=itEnd)) wsNextElement = CParseStarMathString::GetElement(itStart,itEnd); + return true; + } + return false; + } + template + void CParseStarMathString::SetLeft(CElement *pLeftArg, CElement *pElementWhichAdd) + { + T* pBinOpElement = dynamic_cast(pElementWhichAdd); + pBinOpElement->SetLeftArg(pLeftArg); + pElementWhichAdd = pBinOpElement; + } + + void CParseStarMathString::AddLeftArgument(CElement *pLeftArg, CElement *pElementWhichAdd) + { + switch(pElementWhichAdd->GetBaseType()) + { + case TypeElement::BinOperator: + { + SetLeft(pLeftArg, pElementWhichAdd); + break; + } + case TypeElement::SetOperations: + { + SetLeft(pLeftArg, pElementWhichAdd); + break; + } + case TypeElement::Connection: + { + SetLeft(pLeftArg,pElementWhichAdd); + break; + } + default: + break; + } + } //class methods CAttribute CAttribute::~CAttribute() {} @@ -145,7 +202,7 @@ namespace StarMath //class methods CElement CElement::~CElement() {} - CElement::CElement() + CElement::CElement(): pElementIndex(nullptr) {} // TypeElement CElement::GetTypeElement(const std::wstring& wsToken) // { @@ -236,6 +293,7 @@ namespace StarMath { return new CElementBinOperator(TypeElement::plus); } + else if(CElementString::IsDigit(wsToken)) return new CElementString(wsToken); else if (wsToken == L"-") { return new CElementBinOperator(TypeElement::minus); @@ -302,22 +360,104 @@ namespace StarMath } //brace else if(L"{" == wsToken) return new CElementBracket(TypeElement::brace); -// else if(L"(" == wsToken) return TypeElement::round; -// else if(L"[" == wsToken) return TypeElement::square; -// else if(L"ldbracket" == wsToken) return TypeElement::ldbracket; -// else if(L"lbrace" == wsToken) return TypeElement::lbrace; -// else if(L"langle" == wsToken) return TypeElement::langle; -// else if(L"lceil" == wsToken) return TypeElement::lceil; -// else if(L"lfloor" == wsToken) return TypeElement::lfloor; -// else if(L"lline" == wsToken) return TypeElement::lline; -// else if(L"ldline" == wsToken) return TypeElement::ldline; - else if(CElementString::IsDigit(wsToken)) return new CElementString(wsToken); + else if(L"(" == wsToken) return new CElementBracket(TypeElement::round); + else if(L"[" == wsToken) return new CElementBracket(TypeElement::square); + else if(L"ldbracket" == wsToken) return new CElementBracket(TypeElement::ldbracket); + else if(L"lbrace" == wsToken) return new CElementBracket(TypeElement::lbrace); + else if(L"langle" == wsToken) return new CElementBracket(TypeElement::langle); + else if(L"lceil" == wsToken) return new CElementBracket(TypeElement::lceil); + else if(L"lfloor" == wsToken) return new CElementBracket(TypeElement::lfloor); + else if(L"lline" == wsToken) return new CElementBracket(TypeElement::lline); + else if(L"ldline" == wsToken) return new CElementBracket(TypeElement::ldline); + else if(L"intersection" == wsToken) return new CElementSetOperations(TypeElement::intersection); + else if(L"union" == wsToken) return new CElementSetOperations(TypeElement::Union); + else if(L"setminus" == wsToken) return new CElementSetOperations(TypeElement::setminus); + else if(L"setquoyient" == wsToken) return new CElementSetOperations(TypeElement::setquoyient); + else if(L"subseteq" == wsToken) return new CElementSetOperations(TypeElement::subseteq); + else if(L"subset" == wsToken) return new CElementSetOperations(TypeElement::subset); + else if(L"supset" == wsToken) return new CElementSetOperations(TypeElement::supset); + else if(L"supseteq" == wsToken) return new CElementSetOperations(TypeElement::supseteq); + else if(L"nsubset" == wsToken) return new CElementSetOperations(TypeElement::nsubset); + else if(L"nsubseteq" == wsToken) return new CElementSetOperations(TypeElement::nsubseteq); + else if(L"nsupset" == wsToken) return new CElementSetOperations(TypeElement::nsupset); + else if(L"nsubseteq" == wsToken) return new CElementSetOperations(TypeElement::nsubseteq); + else if(L"in" == wsToken) return new CElementSetOperations(TypeElement::in); + else if(L"notin" == wsToken) return new CElementSetOperations(TypeElement::notin); + else if(L"owns" == wsToken) return new CElementSetOperations(TypeElement::owns); + else if(L"approx" == wsToken) return new CElementConnection(TypeElement::approx); + else if(L"sim" == wsToken) return new CElementConnection(TypeElement::sim); + else if(L"simeq" == wsToken) return new CElementConnection(TypeElement::simeq); + else if(L"equiv" == wsToken) return new CElementConnection(TypeElement::equiv); + else if(L"prop" == wsToken) return new CElementConnection(TypeElement::prop); + else if(L"parallel" == wsToken) return new CElementConnection(TypeElement::parallel);\ + else if(L"ortho" == wsToken) return new CElementConnection(TypeElement::ortho); + else if(L"divides" == wsToken) return new CElementConnection(TypeElement::divides); + else if(L"ndivides" == wsToken) return new CElementConnection(TypeElement::ndivides); + else if(L"toward" == wsToken) return new CElementConnection(TypeElement::toward); + else if(L"transl" == wsToken) return new CElementConnection(TypeElement::transl); + else if(L"transr" == wsToken) return new CElementConnection(TypeElement::transr); + else if(L"def" == wsToken) return new CElementConnection(TypeElement::def); + else if(L"=" == wsToken) return new CElementConnection(TypeElement::equals); + else if(L"<>" == wsToken) return new CElementConnection(TypeElement::notequals); + else if(L"<" == wsToken) return new CElementConnection(TypeElement::learrow); + else if(L"<=" == wsToken) return new CElementConnection(TypeElement::learrowequals); + else if(L"leslant" == wsToken) return new CElementConnection(TypeElement::leslant); + else if(L">" == wsToken) return new CElementConnection(TypeElement::riarrow); + else if(L">=" == wsToken) return new CElementConnection(TypeElement::riarrowequals); + else if(L"geslant" == wsToken) return new CElementConnection(TypeElement::geslant); + else if(L"<<" == wsToken) return new CElementConnection(TypeElement::dllearrow); + else if(L">>" == wsToken) return new CElementConnection(TypeElement::dlriarrow); + else if(L"prec" == wsToken) return new CElementConnection(TypeElement::prec); + else if(L"succ" == wsToken) return new CElementConnection(TypeElement::succ); + else if(L"preccurlyeq" == wsToken) return new CElementConnection(TypeElement::preccurlyeq); + else if(L"succcurlyeq" == wsToken) return new CElementConnection(TypeElement::succcurlyeq); + else if(L"precsim" == wsToken) return new CElementConnection(TypeElement::precsim); + else if(L"succsim" == wsToken) return new CElementConnection(TypeElement::succsim); + else if(L"nprec" == wsToken) return new CElementConnection(TypeElement::nprec); + else if(L"nsucc" == wsToken) return new CElementConnection(TypeElement::nsucc); + else if(L"dlarrow" == wsToken) return new CElementConnection(TypeElement::dlarrow); + else if(L"dlrarrow" == wsToken) return new CElementConnection(TypeElement::dlrarrow); + else if(L"drarrow" == wsToken) return new CElementConnection(TypeElement::drarrow); + else if(L"abs" == wsToken) return new CElementFunction(TypeElement::abs); + else if(L"fact" == wsToken) return new CElementFunction(TypeElement::fact); + else if(L"sqrt" == wsToken) return new CElementFunction(TypeElement::sqrt); + else if(L"sin" == wsToken) return new CElementFunction(TypeElement::sin); + else if(L"cos" == wsToken) return new CElementFunction(TypeElement::cos); + else if(L"tan" == wsToken) return new CElementFunction(TypeElement::tan); + else if(L"cot" == wsToken) return new CElementFunction(TypeElement::cot); + else if(L"sinh" == wsToken) return new CElementFunction(TypeElement::sinh); + else if(L"cosh" == wsToken) return new CElementFunction(TypeElement::cosh); + else if(L"tanh" == wsToken) return new CElementFunction(TypeElement::tanh); + else if(L"coth" == wsToken) return new CElementFunction(TypeElement::coth); + else if(L"arcsin" == wsToken) return new CElementFunction(TypeElement::arcsin); + else if(L"arccos" == wsToken) return new CElementFunction(TypeElement::arccos); + else if(L"arctan" == wsToken) return new CElementFunction(TypeElement::arctan); + else if(L"arccot" == wsToken) return new CElementFunction(TypeElement::arccot); + else if(L"arsinh" == wsToken) return new CElementFunction(TypeElement::arsinh); + else if(L"arcosh" == wsToken) return new CElementFunction(TypeElement::arcosh); + else if(L"artanh" == wsToken) return new CElementFunction(TypeElement::artanh); + else if(L"arcoth" == wsToken) return new CElementFunction(TypeElement::arcoth); + else if(L"ln" == wsToken) return new CElementFunction(TypeElement::ln); + else if(L"exp" == wsToken) return new CElementFunction(TypeElement::exp); + else if(L"log" == wsToken) return new CElementFunction(TypeElement::log); else return nullptr; } void CElement::SetAttribute(const std::vector arAttr) { arElementAttributes = arAttr; } + void CElement::SetIndex(CIndex *pIndex) + { + pElementIndex = pIndex; + } + TypeElement CElement::GetBaseType() + { + return enBaseType; + } + void CElement::SetBaseType(const TypeElement &enType) + { + enBaseType = enType; + } //class methods CElementString CElementString::CElementString(const std::wstring& wsTokenString) { @@ -348,6 +488,7 @@ namespace StarMath CElementBinOperator::CElementBinOperator(const TypeElement& enType) { enTypeBinOp = enType; + SetBaseType(TypeElement::BinOperator); } CElementBinOperator::~CElementBinOperator() { @@ -364,82 +505,58 @@ namespace StarMath } void CElementBinOperator::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) { - SetRightArg(CParseStarMathString::ParsElement(itStart,itEnd)); +// нужно сделать функцию для чтения без скобок +// if(enTypeBinOp == TypeElement::frac) +// { + +// } + CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); + if(IsBinOperatorLowPrior() && CParseStarMathString::CheckingTheNextElement(itStart,itEnd,IsBinOperatorHightPrior)) + { + CElement* pBinOp = CParseStarMathString::ParsElement(itStart,itEnd); + CParseStarMathString::AddLeftArgument(pTempElement,pBinOp); + SetRightArg(pBinOp); + } + else + SetRightArg(pTempElement); } void CElementBinOperator::SetTypeBinOP(const TypeElement &enType) { enTypeBinOp = enType; } - bool CElementBinOperator::IsBinOperator(const TypeElement& enCheckType) + bool CElementBinOperator::IsBinOperatorHightPrior(const std::wstring& wsToken) { - switch (enCheckType) - { + if(L"cdot" == wsToken) return true; + else if(L"times" == wsToken) return true; + else if(L"over" == wsToken) return true; +// else if(L"frac" == wsToken) return true; + else if(L"div" == wsToken) return true; + else if(L"multipl" == wsToken) return true; + else if(L"division" == wsToken) return true; + else if(L"odot" == wsToken) return true; + else if(L"otimes" == wsToken) return true; + else if(L"odivide" == wsToken) return true; + else if(L"circ" == wsToken) return true; + else if(L"wideslash" == wsToken) return true; + else if(L"widebslash" == wsToken) return true; + } + bool CElementBinOperator::IsBinOperatorLowPrior() + { + switch (enTypeBinOp) { case TypeElement::plus: return true; case TypeElement::minus: return true; - case TypeElement::over: - return true; - case TypeElement::multipl: - return true; - case TypeElement::division: - return true; - case TypeElement::cdot: - return true; - case TypeElement::times: - return true; - case TypeElement::frac: - return true; - case TypeElement::div: - return true; case TypeElement::oplus: return true; case TypeElement::ominus: return true; - case TypeElement::odot: - return true; - case TypeElement::otimes: - return true; - case TypeElement::odivide: - return true; case TypeElement::circ: return true; - case TypeElement::wideslash: - return true; - case TypeElement::widebslash: - return true; default: return false; } } - bool CElementBinOperator::IsLowPriorityBinOp(const TypeElement &enType) - { - switch (enType) - { - case TypeElement::plus: - return true; - case TypeElement::minus: - return true; - case TypeElement::oplus: - return true; - case TypeElement::ominus: - return true; - case TypeElement::circ: - return true; - default: - return false; - } - } - bool CElementBinOperator::IsHighPriorityBinOp(const TypeElement &enType) - { - switch(enType) - { - case TypeElement::over: - return true; - default: - return false; - } - } //class methods CElementBracket CElementBracket::CElementBracket(const TypeElement& enType) { @@ -458,17 +575,231 @@ namespace StarMath if(L"}" == wsToken) return true; else if(L")" == wsToken) return true; else if(L"]" == wsToken) return true; + else if(L"rdbracket" == wsToken) return true; + else if(L"rbrace" == wsToken) return true; + else if(L"rangle" == wsToken) return true; + else if(L"rceil" == wsToken) return true; + else if(L"rfloor" == wsToken) return true; + else if(L"rline" == wsToken) return true; + else if(L"rdline" == wsToken) return true; + else if(L"right" == wsToken) return true; else return false; } - //нужно поправить GetElement(беру его тут + в методе ParsElement) + // правка if void CElementBracket::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) { - std::wstring wsToken = CParseStarMathString::GetElement(itStart,itEnd) ; - while(L"right" != wsToken && !IsBracketClose(wsToken)) + while(!CParseStarMathString::CheckingTheNextElement(itStart,itEnd,IsBracketClose)) { - arBrecketValue.push_back(CParseStarMathString::ParsElement(itStart,itEnd)); - wsToken = CParseStarMathString::GetElement(itStart,itEnd); + CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); + if(!arBrecketValue.empty() && (pTempElement->GetBaseType() == TypeElement::BinOperator || pTempElement->GetBaseType() == TypeElement::SetOperations) ) + { + CParseStarMathString::AddLeftArgument(arBrecketValue.back(),pTempElement); + arBrecketValue.pop_back(); + } + arBrecketValue.push_back(pTempElement); } + //доработать() + if(!CParseStarMathString::MoveToNextElement(itStart,itEnd)); + } +//class methods CElementSpecialSymbol + CElementSpecialSymbol::CElementSpecialSymbol(const TypeElement &enType) + { + enTypeSpecial = enType; + } + CElementSpecialSymbol::~CElementSpecialSymbol() + {} + void CElementSpecialSymbol::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + { + } +//class methods CElementSetOperations + CElementSetOperations::CElementSetOperations(const TypeElement &enType) + { + enTypeSet = enType; + SetBaseType(TypeElement::SetOperations); + } + CElementSetOperations::~CElementSetOperations() + { + delete pLeftArgument; + delete pRightArgument; + } + void CElementSetOperations::SetLeftArg(CElement *pElement) + { + pLeftArgument = pElement; + } + CElement* CElementSetOperations::GetLeftArg() + { + return pLeftArgument; + } + void CElementSetOperations::SetRightArg(CElement *pElement) + { + pRightArgument = pElement; + } + CElement* CElementSetOperations::GetRightArg() + { + return pRightArgument; + } + void CElementSetOperations::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + { + CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); + if(CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementBinOperator::IsBinOperatorHightPrior)) + { + CElement* pBinOpElement = CParseStarMathString::ParsElement(itStart,itEnd); + CParseStarMathString::AddLeftArgument(pTempElement,pBinOpElement); + SetRightArg(pBinOpElement); + } + else SetRightArg(pTempElement); + } + bool CElementSetOperations::IsSetOperation(const std::wstring &wsToken) + { + if(L"union" == wsToken) return true; + else return false; + } +//class methods CElementConnection + CElementConnection::CElementConnection(const TypeElement& enType) + { + enTypeCon = enType; + SetBaseType(TypeElement::Connection); + } + CElementConnection::~CElementConnection() + { + delete pLeftArgument; + delete pRightArgument; + } + void CElementConnection::SetRightArg(CElement *pElement) + { + pRightArgument = pElement; + } + CElement* CElementConnection::GetRightArg() + { + return pRightArgument; + } + void CElementConnection::SetLeftArg(CElement *pElement) + { + pLeftArgument = pElement; + } + CElement* CElementConnection::GetLeftArg() + { + return pLeftArgument; + } + void CElementConnection::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + { + CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); + if(CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementBinOperator::IsBinOperatorHightPrior)) + { + CElement* pBinOp = CParseStarMathString::ParsElement(itStart,itEnd); + CParseStarMathString::AddLeftArgument(pTempElement,pBinOp); + SetRightArg(pBinOp); + } + else SetRightArg(pTempElement); + } + bool CElementConnection::IsConnection(const std::wstring& wsToken) + { + if(L"def" == wsToken) return true; + else return false; + } +//class methods CIndex + CIndex::CIndex(const TypeElement& enType) + { + enTypeIndex = enType; + } + CIndex::~CIndex() + { + delete pValueIndex; + } + void CIndex::SetValueIndex(CElement *pElement) + { + pValueIndex = pElement; + } + CElement* CIndex::GetValueIndex() + { + return pValueIndex; + } + bool CIndex::IsIndex(const std::wstring &wsCheckToken) + { + if(L"^" == wsCheckToken) return true; + else if(L"_" == wsCheckToken) return true; + else if(L"lsup" == wsCheckToken) return true; + else if(L"lsub" == wsCheckToken) return true; + else if(L"csup" == wsCheckToken) return true; + else if(L"csub" == wsCheckToken) return true; + else return false; + } + CIndex* CIndex::CreateIndex(const std::wstring &wsToken) + { + if(L"^" == wsToken) return new CIndex(TypeElement::upper); + else if(L"_" == wsToken) return new CIndex(TypeElement::lower); + else if(L"lsup" == wsToken) return new CIndex(TypeElement::lsup); + else if(L"lsub" == wsToken) return new CIndex(TypeElement::lsub); + else if(L"csup" == wsToken) return new CIndex(TypeElement::csup); + else if(L"csub" == wsToken) return new CIndex(TypeElement::csub); + else return nullptr; + } +//class methods CElementFunction + CElementFunction::CElementFunction(const TypeElement &enType) + { + enTypeFunction = enType; + SetBaseType(TypeElement::Function); + } + CElementFunction::~CElementFunction() + { + delete pValue; + } + void CElementFunction::SetValueFunction(CElement *pElement) + { + pValue = pElement; + } + CElement* CElementFunction::GetValueFunction() + { + return pValue; + } + + void CElementFunction::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + { + SetValueFunction(CParseStarMathString::ParsElement(itStart,itEnd)); + } +//class methods CElementOperation + CElementOperator::CElementOperator(const TypeElement &enType) + { + enTypeOperator = enType; + SetBaseType(TypeElement::Operation); + } + CElementOperator::~CElementOperator() + { + delete pValueOperator; + delete pValueFrom; + delete pValueTo; + } + void CElementOperator::SetValueOperator(CElement *pElement) + { + pValueOperator = pElement; + } + CElement* CElementOperator::GetValueOperator() + { + return pValueOperator; + } + void CElementOperator::SetFromValue(CElement *pElement) + { + pValueFrom = pElement; + } + CElement* CElementOperator::GetFromValue() + { + return pValueFrom; + } + void CElementOperator::SetToValue(CElement *pElement) + { + pValueTo = pElement; + } + CElement* CElementOperator::GetToValue() + { + return pValueTo; + } + void CElementOperator::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + { + do + { + CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); + + }while(CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementBinOperator::IsBinOperatorHightPrior) || CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementSetOperations::IsSetOperation) || CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementConnection::IsConnection)); } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 613a5caf88..f60e0ae9e6 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -18,6 +18,9 @@ namespace StarMath private: TypeElement enTypeAttr; }; + + class CIndex; + class CElement { public: @@ -28,8 +31,27 @@ namespace StarMath static CElement* CreateElement(const std::wstring& wsToken); //static TypeElement GetTypeElement(const std::wstring& wsToken); void SetAttribute(const std::vector arAttr); + void SetIndex(CIndex* pIndex); + void SetBaseType(const TypeElement& enType); + TypeElement GetBaseType(); private: + CIndex* pElementIndex; std::vector arElementAttributes; + TypeElement enBaseType; + }; + + class CIndex + { + public: + CIndex(const TypeElement& enType); + ~CIndex(); + void SetValueIndex(CElement* pElement); + CElement* GetValueIndex(); + static bool IsIndex(const std::wstring& wsCheckToken); + static CIndex* CreateIndex(const std::wstring& wsToken); + private: + CElement* pValueIndex; + TypeElement enTypeIndex; }; class CElementString: public CElement @@ -38,10 +60,10 @@ namespace StarMath CElementString(const std::wstring& wsTokenString); virtual ~CElementString(); void SetString(const std::wstring& wsTokenString); - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; std::wstring GetString(); static bool IsDigit(const std::wstring& wsCheckToken); private: + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; std::wstring wsString; }; @@ -50,34 +72,109 @@ namespace StarMath public: CElementBinOperator(const TypeElement& enType); virtual ~CElementBinOperator(); - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; void SetLeftArg(CElement* pElement); void SetRightArg(CElement* pElement); void SetTypeBinOP(const TypeElement& enType); CElement* GetRightArg(); CElement* GetLeftArg(); - static bool IsBinOperator(const TypeElement& enCheckType); + static bool IsBinOperatorHightPrior(const std::wstring& wsToken); private: - bool IsLowPriorityBinOp(const TypeElement& enType); - bool IsHighPriorityBinOp(const TypeElement& enType); + bool IsBinOperatorLowPrior(); + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; CElement* pLeftArgument; CElement* pRightArgument; TypeElement enTypeBinOp; }; + class CElementOperator: public CElement + { + public: + CElementOperator(const TypeElement& enType); + virtual ~CElementOperator(); + void SetValueOperator(CElement* pElement); + CElement* GetValueOperator(); + void SetFromValue(CElement* pElement); + CElement* GetFromValue(); + void SetToValue(CElement* pElement); + CElement* GetToValue(); + private: + void Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) override; + CElement* pValueOperator; + CElement* pValueFrom; + CElement* pValueTo; + TypeElement enTypeOperator; + }; + class CElementBracket: public CElement { public: CElementBracket(const TypeElement& enType); virtual ~CElementBracket(); void SetBracketValue(const std::vector& arValue); - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; private: + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; static bool IsBracketClose(const std::wstring& wsToken); TypeElement enTypeBracket; std::vector arBrecketValue; }; + class CElementSetOperations: public CElement + { + public: + CElementSetOperations(const TypeElement& enType); + virtual ~CElementSetOperations(); + void SetLeftArg(CElement* pElement); + CElement* GetLeftArg(); + void SetRightArg(CElement* pElement); + CElement* GetRightArg(); + static bool IsSetOperation(const std::wstring& wsToken); + private: + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; + CElement* pLeftArgument; + CElement* pRightArgument; + TypeElement enTypeSet; + }; + + class CElementConnection: public CElement + { + public: + CElementConnection(const TypeElement& enType); + virtual ~CElementConnection(); + void SetRightArg(CElement* pElement); + CElement* GetRightArg(); + void SetLeftArg(CElement* pElement); + CElement* GetLeftArg(); + static bool IsConnection(const std::wstring& wsToken); + private: + void Pars(std::wstring::iterator& itStart, std::wstring::iterator& itEnd) override; + CElement* pLeftArgument; + CElement* pRightArgument; + TypeElement enTypeCon; + }; + + class CElementFunction: public CElement + { + public: + CElementFunction(const TypeElement& enType); + virtual ~CElementFunction(); + void SetValueFunction(CElement* pElement); + CElement* GetValueFunction(); + private: + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; + CElement* pValue; + TypeElement enTypeFunction; + }; + + class CElementSpecialSymbol: public CElement + { + public: + CElementSpecialSymbol(const TypeElement& enType); + virtual ~CElementSpecialSymbol(); + private: + void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; + TypeElement enTypeSpecial; + }; + class CParseStarMathString { public: @@ -85,6 +182,10 @@ namespace StarMath static CElement* ParsElement(std::wstring::iterator& itStart, std::wstring::iterator& itEnd); static std::wstring GetElement(std::wstring::iterator& itStart,std::wstring::iterator& itEnd); static bool CheckingTheNextElement(std::wstring::iterator& itStart,std::wstring::iterator& itEnd, bool (&func)(const std::wstring&)); + static bool MoveToNextElement(std::wstring::iterator& itStart,std::wstring::iterator& itEnd); + static void AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); + template + static void SetLeft(CElement* pLeftArg, CElement* pElementWhichaAdd); private: std::vector arEquation; }; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index 8cb8406ea5..c46f56ffd8 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -7,16 +7,17 @@ enum class TypeElement{ //global String, BinOperator, + SetOperations, Operator, Bracket, UnarSign, Attribute, SpecialSymbol, Function, - TwoArgumentContainer, Operation, Index, Matrix, + Connection, //binoop cdot, times, @@ -103,6 +104,7 @@ enum class TypeElement{ mline, grid, dlgrid, + //setopetions intersection, Union, setminus, @@ -118,6 +120,7 @@ enum class TypeElement{ in, notin, owns, + //connection approx, sim, simeq, @@ -152,6 +155,7 @@ enum class TypeElement{ dlarrow, dlrarrow, drarrow, + // emptyset, aleph, setN, @@ -173,6 +177,7 @@ enum class TypeElement{ laplace, fourier, backepsilon, + //function abs, fact, sqrt, @@ -196,12 +201,14 @@ enum class TypeElement{ ln, exp, log, + //index upper, lower, lsup, lsub, csup, csub, + // binom, stack, matrix, From 3a17ce21efd69140d4fa1281e4c38680caafc139 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Wed, 8 Nov 2023 17:24:09 +0300 Subject: [PATCH 010/117] Reworking of the CElementOperator class, reworking of some part of the conversion, tests --- .../StarMath2OOXML/TestSMConverter/main.cpp | 98 +- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 270 ++--- .../StarMath2OOXML/cconversionsmtoooxml.h | 37 +- .../StarMath2OOXML/cstarmathpars.cpp | 994 +++++++++++------- .../Converter/StarMath2OOXML/cstarmathpars.h | 137 ++- .../Converter/StarMath2OOXML/typeselements.h | 27 + 6 files changed, 872 insertions(+), 691 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index ff0774672e..7369496324 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -6,154 +6,140 @@ TEST(SMConvectorTest, BinOperatorPlus) { - std::wstring wsBinOperatorPlus = L"2 + 3"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"2 + 3"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"2+3"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorOver) { - std::wstring wsBinOperatorPlus = L"2 over 3"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"2 over 3"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"23"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorCdot) { - std::wstring wsBinOperatorPlus = L"5 cdot 8"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"5 cdot 8"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"5\u00B78"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorTimes) { - std::wstring wsBinOperatorPlus = L"5 times 8"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"5 times 8"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"5\u00D78"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorMultipl) { - std::wstring wsBinOperatorPlus = L"4 * 2"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"4 * 2"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"4*2"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorDiv) { - std::wstring wsBinOperatorPlus = L"4div2"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"4div2"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"4\u00F72"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorDivision) { - std::wstring wsBinOperatorPlus = L"4/2"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"4/2"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"42"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorOplus) { - std::wstring wsBinOperatorPlus = L"226oplus179"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"226oplus179"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"226\u2295179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorOdot) { - std::wstring wsBinOperatorPlus = L"226 odot 179"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"226 odot 179"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"226\u2299179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,BinOperatorOtimes) { - std::wstring wsBinOperatorPlus = L"226 otimes 179"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsBinOperator = L"226 otimes 179"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); std::wstring XmlString = L"226\u2297179"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,OperatorSum) { - std::wstring wsBinOperatorPlus = L"sum 5"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsOperator = L"sum 5"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); std::wstring XmlString = L"5"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,OperatorSumFrom) { - std::wstring wsBinOperatorPlus = L"sum from 10 5"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsOperator = L"sum from 10 5"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); std::wstring XmlString = L"105"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,OperatorSumTo) { - std::wstring wsBinOperatorPlus = L"sum to 10 5"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsOperator = L"sum to 10 5"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); std::wstring XmlString = L"105"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } TEST(SMConvectorTest,OperatorSumFromTo) { - std::wstring wsBinOperatorPlus = L"sum from 666 to 777 567"; - StarMath::CStarMathPars m_oTempO; - m_oTempO.Pars(wsBinOperatorPlus); + std::wstring wsOperator = L"sum from 666 to 777 567"; + StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; - m_oTest.StartConversion(m_oTempO.GetVector()); + m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); std::wstring XmlString = L"666777567"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index fcb9c297fb..b71ecf436d 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -1,228 +1,114 @@ #include "cconversionsmtoooxml.h" #include "../../../../DesktopEditor/common/File.h" #include -/*namespace StarMath { +namespace StarMath { CConversionSMtoOOXML::CConversionSMtoOOXML() { } void CConversionSMtoOOXML::StartConversion(std::vector arPars) { - m_oXmlWrite.WriteNodeBegin(L"m:oMathPara",false); - m_oXmlWrite.WriteNodeBegin(L"m:oMath",false); - for(CElement* m_oTempElement:arPars) + m_oXmlWrite = new XmlUtils::CXmlWriter; + m_oXmlWrite->WriteNodeBegin(L"m:oMathPara",false); + m_oXmlWrite->WriteNodeBegin(L"m:oMath",false); + for(CElement* oTempElement:arPars) { - ConversionOneElement(m_oTempElement); + oTempElement->ConversionToOOXML(m_oXmlWrite); } EndConversion(); - NSFile::CFileBinary oFile; - oFile.CreateFileW(L"Test.txt"); - oFile.WriteStringUTF8(m_oXmlWrite.GetXmlString()); - oFile.CloseFile(); +// NSFile::CFileBinary oFile; +// oFile.CreateFileW(L"Test.txt"); +// oFile.WriteStringUTF8(m_oXmlWrite->GetXmlString()); +// oFile.CloseFile(); } - void CConversionSMtoOOXML::ConversionOneElement(CElement *m_oElement) + void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* oXmlWrite) { - switch (m_oElement->GetType()) - { - case Text: - ConversText(dynamic_cast(m_oElement)); - break; - case BinOperator: - ConversBinOperator(dynamic_cast (m_oElement)); - break; - case Operator: - ConversOperator(dynamic_cast (m_oElement)); - break; - default: - break; - } + oXmlWrite->WriteNodeBegin(L"w:rPr",false); + oXmlWrite->WriteNodeBegin(L"w:rFonts",true); + oXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + oXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + oXmlWrite->WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeBegin(L"w:sz",true); + oXmlWrite->WriteAttribute(L"w:val",L"40"); + oXmlWrite->WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeBegin(L"w:szCs",true); + oXmlWrite->WriteAttribute(L"w:val",L"40"); + oXmlWrite->WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeEnd(L"w:rPr",false,false); } - void CConversionSMtoOOXML::ConversBinOperator(CBinaryOperator *m_oElement) + void CConversionSMtoOOXML::PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* oXmlWrite) { - if(m_oElement->GetTypeBin() == plus || m_oElement->GetTypeBin() == minus || m_oElement->GetTypeBin() == multipl || m_oElement->GetTypeBin() == cdot || m_oElement->GetTypeBin() == times || m_oElement->GetTypeBin() == div || m_oElement->GetTypeBin() == odivide || m_oElement->GetTypeBin() == oplus || m_oElement->GetTypeBin() == ominus || m_oElement->GetTypeBin() == odot || m_oElement->GetTypeBin() == otimes) - { - ConversionOneElement(m_oElement->GetFirstElement()); - m_oXmlWrite.WriteNodeBegin(L"m:r",false); - StandartProperties(); - m_oXmlWrite.WriteNodeBegin(L"m:t",false); - switch (m_oElement->GetTypeBin()) - { - case plus: m_oXmlWrite.WriteString(L"+");break; - case minus: - m_oXmlWrite.WriteString(L"-"); - break; - case multipl: - m_oXmlWrite.WriteString(L"*"); - break; - case cdot: - m_oXmlWrite.WriteString(L"\u00B7"); - break; - case times: - m_oXmlWrite.WriteString(L"\u00D7"); - break; - case div: - m_oXmlWrite.WriteString(L"\u00F7"); - break; - case odivide: - m_oXmlWrite.WriteString(L"\u2298"); - break; - case oplus: - m_oXmlWrite.WriteString(L"\u2295"); - break; - case ominus: - m_oXmlWrite.WriteString(L"\u2296"); - break; - case odot: - m_oXmlWrite.WriteString(L"\u2299"); - break; - case otimes: - m_oXmlWrite.WriteString(L"\u2297"); - break; - default: - break; - } - if(m_oElement->GetTypeSecondElement() == Text) - { - CText* m_oNumber = dynamic_cast (m_oElement->GetSecondElement()); - m_oXmlWrite.WriteString(m_oNumber->GetValue()); - m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); - } - else - { - m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); - ConversionOneElement(m_oElement->GetSecondElement()); - } - - } - else if(m_oElement->GetTypeBin() == over || m_oElement->GetTypeBin() == division) - { - m_oXmlWrite.WriteNodeBegin(L"m:f",false); - if(m_oElement->GetTypeBin() == division) PropertiesMFPR(true,L"lin"); - else PropertiesMFPR(false,L""); - BlockRecording(L"m:num",m_oElement->GetFirstElement()); - BlockRecording(L"m:den",m_oElement->GetSecondElement()); - m_oXmlWrite.WriteNodeEnd(L"m:f",false,false); - } - } - void CConversionSMtoOOXML::ConversText(CText *m_oElement) - { - m_oXmlWrite.WriteNodeBegin(L"m:r",false); - StandartProperties(); - m_oXmlWrite.WriteNodeBegin(L"m:t",false); - m_oXmlWrite.WriteString(m_oElement->GetValue()); - m_oXmlWrite.WriteNodeEnd(L"m:t",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); - } - void CConversionSMtoOOXML::ConversOperator(COperator *m_oElement) - { - if(m_oElement->GetTypeOp() == sum) - { - m_oXmlWrite.WriteNodeBegin(L"m:nary",false); - PropertiesNaryPr(L"\u2211",nullptr == m_oElement->GetFrom(),nullptr == m_oElement->GetTo()); - if(m_oElement->GetFrom() == nullptr) m_oXmlWrite.WriteNode(L"m:sub",L""); - else - { - BlockRecording(L"m:sub",m_oElement->GetFrom()); - } - if(m_oElement->GetTo() == nullptr) m_oXmlWrite.WriteNode(L"m:sup",L""); - else - { - BlockRecording(L"m:sup",m_oElement->GetTo()); - } - BlockRecording(L"m:e",m_oElement->GetValueOp()); - m_oXmlWrite.WriteNodeEnd(L"m:nary",false,false); - } - } - void CConversionSMtoOOXML::StandartProperties() - { - m_oXmlWrite.WriteNodeBegin(L"w:rPr",false); - m_oXmlWrite.WriteNodeBegin(L"w:rFonts",true); - m_oXmlWrite.WriteAttribute(L"w:hAnsi",L"Cambria Math"); - m_oXmlWrite.WriteAttribute(L"w:ascii",L"Cambria Math"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNodeBegin(L"w:sz",true); - m_oXmlWrite.WriteAttribute(L"w:val",L"40"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNodeBegin(L"w:szCs",true); - m_oXmlWrite.WriteAttribute(L"w:val",L"40"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNodeEnd(L"w:rPr",false,false); - } - void CConversionSMtoOOXML::PropertiesMFPR(bool bType,const std::wstring& wsType) - { - m_oXmlWrite.WriteNodeBegin(L"m:fPr",false); + oXmlWrite->WriteNodeBegin(L"m:fPr",false); if(bType) { - m_oXmlWrite.WriteNodeBegin(L"m:type",true); - m_oXmlWrite.WriteAttribute(L"m:val",wsType); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeBegin(L"m:type",true); + oXmlWrite->WriteAttribute(L"m:val",wsType); + oXmlWrite->WriteNodeEnd(L"w",true,true); } - m_oXmlWrite.WriteNodeBegin(L"m:ctrlPr",false); - m_oXmlWrite.WriteNodeBegin(L"w:rPr",false); - m_oXmlWrite.WriteNodeBegin(L"w:rFonts",true); - m_oXmlWrite.WriteAttribute(L"w:hAnsi",L"Cambria Math"); - m_oXmlWrite.WriteAttribute(L"w:ascii",L"Cambria Math"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNode(L"w:i",L""); - //m_oXmlWrite.WriteNode(L"w:iCs",L""); - m_oXmlWrite.WriteNodeBegin(L"w:sz",true); - m_oXmlWrite.WriteAttribute(L"w:val",L"40"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNodeBegin(L"w:szCs",true); - m_oXmlWrite.WriteAttribute(L"w:val",L"40"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNodeEnd(L"w:rPr",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:ctrlPr",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:fPr",false,false); + oXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + oXmlWrite->WriteNodeBegin(L"w:rPr",false); + oXmlWrite->WriteNodeBegin(L"w:rFonts",true); + oXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + oXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + oXmlWrite->WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNode(L"w:i",L""); + //m_oXmlWrite->WriteNode(L"w:iCs",L""); + oXmlWrite->WriteNodeBegin(L"w:sz",true); + oXmlWrite->WriteAttribute(L"w:val",L"40"); + oXmlWrite->WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeBegin(L"w:szCs",true); + oXmlWrite->WriteAttribute(L"w:val",L"40"); + oXmlWrite->WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + oXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + oXmlWrite->WriteNodeEnd(L"m:fPr",false,false); } - void CConversionSMtoOOXML::PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup) + void CConversionSMtoOOXML::PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* oXmlWrite) { - m_oXmlWrite.WriteNodeBegin(L"m:naryPr",false); - m_oXmlWrite.WriteNodeBegin(L"m:chr",true); - m_oXmlWrite.WriteAttribute(L"m:val",wsTypeOperator); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNodeBegin(L"m:limLoc",true); - m_oXmlWrite.WriteAttribute(L"m:val",L"undOvr"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeBegin(L"m:naryPr",false); + oXmlWrite->WriteNodeBegin(L"m:chr",true); + oXmlWrite->WriteAttribute(L"m:val",wsTypeOperator); + oXmlWrite->WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeBegin(L"m:limLoc",true); + oXmlWrite->WriteAttribute(L"m:val",L"undOvr"); + oXmlWrite->WriteNodeEnd(L"w",true,true); if(bEmptySub) { - m_oXmlWrite.WriteNodeBegin(L"m:subHide",true); - m_oXmlWrite.WriteAttribute(L"m:val",L"1"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeBegin(L"m:subHide",true); + oXmlWrite->WriteAttribute(L"m:val",L"1"); + oXmlWrite->WriteNodeEnd(L"w",true,true); } if(bEmptySup) { - m_oXmlWrite.WriteNodeBegin(L"m:supHide",true); - m_oXmlWrite.WriteAttribute(L"m:val",L"1"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNodeBegin(L"m:supHide",true); + oXmlWrite->WriteAttribute(L"m:val",L"1"); + oXmlWrite->WriteNodeEnd(L"w",true,true); } - m_oXmlWrite.WriteNodeBegin(L"m:ctrlPr",false); - m_oXmlWrite.WriteNodeBegin(L"w:rPr",false); - m_oXmlWrite.WriteNodeBegin(L"w:rFonts",true); - m_oXmlWrite.WriteAttribute(L"w:hAnsi",L"Cambria Math"); - m_oXmlWrite.WriteAttribute(L"w:ascii",L"Cambria Math"); - m_oXmlWrite.WriteNodeEnd(L"w",true,true); - m_oXmlWrite.WriteNode(L"w:i",L""); - m_oXmlWrite.WriteNodeEnd(L"w:rPr",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:ctrlPr",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:naryPr",false,false); + oXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + oXmlWrite->WriteNodeBegin(L"w:rPr",false); + oXmlWrite->WriteNodeBegin(L"w:rFonts",true); + oXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + oXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + oXmlWrite->WriteNodeEnd(L"w",true,true); + oXmlWrite->WriteNode(L"w:i",L""); + oXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + oXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + oXmlWrite->WriteNodeEnd(L"m:naryPr",false,false); } - void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *CValueBlock) + void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *CValueBlock,XmlUtils::CXmlWriter* oXmlWrite) { - m_oXmlWrite.WriteNodeBegin(wsNameBlock,false); - ConversionOneElement(CValueBlock); - m_oXmlWrite.WriteNodeEnd(wsNameBlock,false,false); + oXmlWrite->WriteNodeBegin(wsNameBlock,false); + CValueBlock->ConversionToOOXML(oXmlWrite); + oXmlWrite->WriteNodeEnd(wsNameBlock,false,false); } std::wstring CConversionSMtoOOXML::GetOOXML() { - return m_oXmlWrite.GetXmlString(); + return m_oXmlWrite->GetXmlString(); } void CConversionSMtoOOXML::EndConversion() { - //m_oXmlWrite.WriteNodeEnd(L"m:r",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:oMath",false,false); - m_oXmlWrite.WriteNodeEnd(L"m:oMathPara",false,false); + //m_oXmlWrite->WriteNodeEnd(L"m:r",false,false); + m_oXmlWrite->WriteNodeEnd(L"m:oMath",false,false); + m_oXmlWrite->WriteNodeEnd(L"m:oMathPara",false,false); } } -*/ + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 1aa8b5f411..975c7f630f 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -5,25 +5,20 @@ -//namespace StarMath { -// class CConversionSMtoOOXML -// { -// public: -// CConversionSMtoOOXML(); -// //friend class StarMath::CStarMathPars; -// void StartConversion(std::vector arPars); -// void StandartProperties(); -// void PropertiesMFPR(bool bType,const std::wstring& wsType); -// void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup); -// void ConversionOneElement(CElement* m_oElement); -// void ConversBinOperator(CBinaryOperator* m_oElement); -// void ConversText(CText* m_oElement); -// void ConversOperator(COperator* m_oElement); -// void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock); -// void EndConversion(); -// std::wstring GetOOXML() ; -// private: -// XmlUtils::CXmlWriter m_oXmlWrite; -// }; -//} +namespace StarMath { + class CConversionSMtoOOXML + { + public: + CConversionSMtoOOXML(); + void StartConversion(std::vector arPars); + static void StandartProperties(XmlUtils::CXmlWriter* oXmlWrite); + static void PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* oXmlWrite); + static void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* m_oXmlWrite); + static void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock,XmlUtils::CXmlWriter* oXmlWrite); + void EndConversion(); + std::wstring GetOOXML() ; + private: + XmlUtils::CXmlWriter* m_oXmlWrite; + }; +} #endif // CCONVERSIONSMTOOOXML_H diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 83507abcc4..8f31a51c1d 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -1,118 +1,71 @@ #include "cstarmathpars.h" +#include "cconversionsmtoooxml.h" namespace StarMath { //class methods CParsStarMath - std::vector CParseStarMathString::Parse(std::wstring& wsParseString) + std::vector CParserStarMathString::Parse(std::wstring& wsParseString) { std::wstring::iterator itStart = wsParseString.begin(),itEnd = wsParseString.end(); - - while(itStart != itEnd) + CStarMathReader* pReader = new CStarMathReader(itStart,itEnd); + while(!pReader->CheckIteratorPosition()) { - CElement* pTempElement = ParsElement(itStart,itEnd); + CElement* pTempElement = ParseElement(pReader); if(nullptr == pTempElement) break; - if(!arEquation.empty() && (pTempElement->GetBaseType() == TypeElement::BinOperator || pTempElement->GetBaseType() == TypeElement::SetOperations || pTempElement->GetBaseType() == TypeElement::Connection) ) + if(!m_arEquation.empty() && (pTempElement->GetBaseType() == TypeElement::BinOperator || pTempElement->GetBaseType() == TypeElement::SetOperations || pTempElement->GetBaseType() == TypeElement::Connection) ) { - AddLeftArgument(arEquation.back(),pTempElement); - arEquation.pop_back(); + AddLeftArgument(m_arEquation.back(),pTempElement); + m_arEquation.pop_back(); } - arEquation.push_back(pTempElement); + m_arEquation.push_back(pTempElement); } - return arEquation; + return m_arEquation; } - CElement* CParseStarMathString::ParsElement(std::wstring::iterator& itStart, std::wstring::iterator& itEnd) + CElement* CParserStarMathString::ParseElement(CStarMathReader* pReader) { CElement* pElement; - std::wstring wsToken = GetElement(itStart,itEnd); std::vector arAttributes; - TypeElement enTypeToken = CAttribute::IsAttribute(wsToken); - while(enTypeToken != TypeElement::undefine && itStart != itEnd) + + if(pReader->EmptyString()) { - if(enTypeToken != TypeElement::color) arAttributes.push_back(new CAttribute(enTypeToken)); - wsToken = GetElement(itStart,itEnd); - enTypeToken = CAttribute::IsAttribute(wsToken); + pReader->GetToken(); + pReader->SetTypesToken(); } - if(L"left" == wsToken) pElement = CElement::CreateElement(GetElement(itStart,itEnd)); - else pElement = CElement::CreateElement(wsToken); + while(pReader->GetGlobalType() == TypeElement::Attribute) + { + if(pReader->GetLocalType() != TypeElement::color) arAttributes.push_back(new CAttribute(pReader->GetLocalType())); + pReader->GetToken(); + pReader->SetTypesToken(); + } + + pElement = CElement::CreateElement(pReader); if(pElement != nullptr) { pElement->SetAttribute(arAttributes); - pElement->Pars(itStart,itEnd); - if(CheckingTheNextElement(itStart,itEnd,CIndex::IsIndex)) - { - CIndex* pIndex = CIndex::CreateIndex(GetElement(itStart,itEnd)); - pIndex->SetValueIndex(ParsElement(itStart,itEnd)); - pElement->SetIndex(pIndex); - } + pReader->ClearWString(); + pElement->Parse(pReader); +// if(CheckingTheNextElement(itStart,itEnd,CIndex::IsIndex)) +// { +// CIndex* pIndex = CIndex::CreateIndex(GetElement(itStart,itEnd)); +// pIndex->SetValueIndex(ParseElement(itStart,itEnd)); +// pElement->SetIndex(pIndex); +// } return pElement; } else return pElement; } - std::wstring CParseStarMathString::GetElement(std::wstring::iterator& itFirst,std::wstring::iterator& itEnd) - { - std::wstring m_wsElement{}; - for(; itFirst != itEnd;itFirst++) - { - if(iswspace(*itFirst) && m_wsElement.empty()) continue; - else if(iswspace(*itFirst) && !m_wsElement.empty()) - { - itFirst++; - break; - } - else if(!m_wsElement.empty() && (*itFirst == L'(' || L')' == *itFirst || *itFirst == L'{' || *itFirst == L'}' || *itFirst == L'+' || *itFirst == L'-' || *itFirst == L'/' || *itFirst == L'*' || L'^' == *itFirst || L'_' == *itFirst || (iswdigit(*itFirst) && !iswdigit(m_wsElement.back())) || (iswalpha(*itFirst) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *itFirst || L'>' == *itFirst || L'=' == *itFirst)))) - { - return m_wsElement; - } - else if(((*itFirst == L'{' || *itFirst == L'}' || *itFirst == L'+' || *itFirst == L'-' || *itFirst == L'/' || *itFirst == L'*' || L'^' == *itFirst || L'_' == *itFirst || L'=' == *itFirst ) && m_wsElement.empty()) || (!m_wsElement.empty() && ((m_wsElement.back() == L'<' && (L'=' == *itFirst || L'<' == *itFirst || L'>' == *itFirst)) || (m_wsElement.back() == L'>' && (L'>' == *itFirst || L'=' == *itFirst)) ) ) ) - { - m_wsElement.push_back(*itFirst); - itFirst++; - return m_wsElement; - } - else - { - m_wsElement.push_back(*itFirst); - } - } - if(!m_wsElement.empty()) return m_wsElement; - else return {}; - } - bool CParseStarMathString::CheckingTheNextElement(std::wstring::iterator& itFirst, std::wstring::iterator& itEnd, bool (&func)(const std::wstring&)) - { - std::wstring::iterator itTempVal = itFirst; - std::wstring wsToken = GetElement(itFirst,itEnd); - TypeElement enTypeAttr = CAttribute::IsAttribute(wsToken); - while(enTypeAttr != TypeElement::undefine && (itFirst != itEnd)) - { - wsToken = GetElement(itFirst,itEnd); - enTypeAttr = CAttribute::IsAttribute(wsToken); - } - itFirst = itTempVal; - if(func(wsToken)) return true; - else return false; - } - bool CParseStarMathString::MoveToNextElement(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) - { - if(itStart !=itEnd) - { - std::wstring wsNextElement = CParseStarMathString::GetElement(itStart,itEnd); - if(L"right" == wsNextElement && (itStart!=itEnd)) wsNextElement = CParseStarMathString::GetElement(itStart,itEnd); - return true; - } - return false; - } template - void CParseStarMathString::SetLeft(CElement *pLeftArg, CElement *pElementWhichAdd) + void SetLeft(CElement *pLeftArg, CElement *pElementWhichAdd) { T* pBinOpElement = dynamic_cast(pElementWhichAdd); pBinOpElement->SetLeftArg(pLeftArg); pElementWhichAdd = pBinOpElement; } - void CParseStarMathString::AddLeftArgument(CElement *pLeftArg, CElement *pElementWhichAdd) + void CParserStarMathString::AddLeftArgument(CElement *pLeftArg, CElement *pElementWhichAdd) { switch(pElementWhichAdd->GetBaseType()) { @@ -135,19 +88,40 @@ namespace StarMath break; } } + CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader) + { + CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); + pReader->GetToken(); + pReader->SetTypesToken(); + while(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::SetOperations || pReader->GetGlobalType() == TypeElement::Connection) + { + CElement* pSecondTempElement = CParserStarMathString::ParseElement(pReader); + if(pFirstTempElement != nullptr) + { + CParserStarMathString::AddLeftArgument(pFirstTempElement,pSecondTempElement); + } + pFirstTempElement = pSecondTempElement; + if(pReader->GetGlobalType() == TypeElement::Empty) + { + pReader->GetToken(); + pReader->SetTypesToken(); + } + } + return pFirstTempElement; + } //class methods CAttribute CAttribute::~CAttribute() {} CAttribute::CAttribute(const TypeElement &enType) { - enTypeAttr = enType; + m_enTypeAttr = enType; } TypeElement CAttribute::GetType() { - return enTypeAttr; + return m_enTypeAttr; } //нет phantom, rgb, 16 , гарнитуры и кегля - TypeElement CAttribute::IsAttribute(const std::wstring &wsToken) + TypeElement CAttribute::GetTypeAttribute(const std::wstring &wsToken) { if(L"acute" == wsToken) return TypeElement::acute; else if(L"color" == wsToken) return TypeElement::color; @@ -201,8 +175,14 @@ namespace StarMath } //class methods CElement CElement::~CElement() - {} - CElement::CElement(): pElementIndex(nullptr) + { + for(CAttribute* pTemp:m_arElementAttributes) + { + delete pTemp; + } + delete m_pElementIndex; + } + CElement::CElement(): m_pElementIndex(nullptr) {} // TypeElement CElement::GetTypeElement(const std::wstring& wsToken) // { @@ -286,263 +266,220 @@ namespace StarMath // else if(L"ldline" == wsToken) return TypeElement::ldline; // else return TypeElement::undefine; // } - CElement* CElement::CreateElement(const std::wstring& wsToken) + CElement* CElement::CreateElement(CStarMathReader* pReader) { - //binop - if (wsToken == L"+") - { - return new CElementBinOperator(TypeElement::plus); + switch (pReader->GetGlobalType()) { + case TypeElement::String: + return new CElementString(pReader->GetString()); + case TypeElement::BinOperator: + return new CElementBinOperator(pReader->GetLocalType()); + case TypeElement::SetOperations: + return new CElementSetOperations(pReader->GetLocalType()); + case TypeElement::Connection: + return new CElementConnection(pReader->GetLocalType()); + case TypeElement::Function: + return new CElementFunction(pReader->GetLocalType()); + case TypeElement::Bracket: + return new CElementBracket(pReader->GetLocalType()); + case TypeElement::Operation: + return new CElementOperator(pReader->GetLocalType()); + default: + return nullptr; } - else if(CElementString::IsDigit(wsToken)) return new CElementString(wsToken); - else if (wsToken == L"-") - { - return new CElementBinOperator(TypeElement::minus); - } - else if (wsToken == L"*") - { - return new CElementBinOperator(TypeElement::multipl); - } - else if (wsToken == L"/") - { - return new CElementBinOperator(TypeElement::division); - } - else if (wsToken == L"over") - { - return new CElementBinOperator(TypeElement::over); - } - else if (wsToken == L"cdot") - { - return new CElementBinOperator(TypeElement::cdot); - } - else if (wsToken == L"times") - { - return new CElementBinOperator(TypeElement::times); - } - else if (wsToken == L"frac") - { - return new CElementBinOperator(TypeElement::frac); - } - else if (wsToken == L"div") - { - return new CElementBinOperator(TypeElement::div); - } - else if (wsToken == L"oplus") - { - return new CElementBinOperator(TypeElement::oplus); - } - else if (wsToken == L"ominus") - { - return new CElementBinOperator(TypeElement::ominus); - } - else if (wsToken == L"odot") - { - return new CElementBinOperator(TypeElement::odot); - } - else if (wsToken == L"otimes") - { - return new CElementBinOperator(TypeElement::otimes); - } - else if (wsToken == L"odivide") - { - return new CElementBinOperator(TypeElement::odivide); - } - else if (wsToken == L"circ") - { - return new CElementBinOperator(TypeElement::circ); - } - else if (wsToken == L"wideslash") - { - return new CElementBinOperator(TypeElement::wideslash); - } - else if (wsToken == L"widebslash") - { - return new CElementBinOperator(TypeElement::widebslash); - } - //brace - else if(L"{" == wsToken) return new CElementBracket(TypeElement::brace); - else if(L"(" == wsToken) return new CElementBracket(TypeElement::round); - else if(L"[" == wsToken) return new CElementBracket(TypeElement::square); - else if(L"ldbracket" == wsToken) return new CElementBracket(TypeElement::ldbracket); - else if(L"lbrace" == wsToken) return new CElementBracket(TypeElement::lbrace); - else if(L"langle" == wsToken) return new CElementBracket(TypeElement::langle); - else if(L"lceil" == wsToken) return new CElementBracket(TypeElement::lceil); - else if(L"lfloor" == wsToken) return new CElementBracket(TypeElement::lfloor); - else if(L"lline" == wsToken) return new CElementBracket(TypeElement::lline); - else if(L"ldline" == wsToken) return new CElementBracket(TypeElement::ldline); - else if(L"intersection" == wsToken) return new CElementSetOperations(TypeElement::intersection); - else if(L"union" == wsToken) return new CElementSetOperations(TypeElement::Union); - else if(L"setminus" == wsToken) return new CElementSetOperations(TypeElement::setminus); - else if(L"setquoyient" == wsToken) return new CElementSetOperations(TypeElement::setquoyient); - else if(L"subseteq" == wsToken) return new CElementSetOperations(TypeElement::subseteq); - else if(L"subset" == wsToken) return new CElementSetOperations(TypeElement::subset); - else if(L"supset" == wsToken) return new CElementSetOperations(TypeElement::supset); - else if(L"supseteq" == wsToken) return new CElementSetOperations(TypeElement::supseteq); - else if(L"nsubset" == wsToken) return new CElementSetOperations(TypeElement::nsubset); - else if(L"nsubseteq" == wsToken) return new CElementSetOperations(TypeElement::nsubseteq); - else if(L"nsupset" == wsToken) return new CElementSetOperations(TypeElement::nsupset); - else if(L"nsubseteq" == wsToken) return new CElementSetOperations(TypeElement::nsubseteq); - else if(L"in" == wsToken) return new CElementSetOperations(TypeElement::in); - else if(L"notin" == wsToken) return new CElementSetOperations(TypeElement::notin); - else if(L"owns" == wsToken) return new CElementSetOperations(TypeElement::owns); - else if(L"approx" == wsToken) return new CElementConnection(TypeElement::approx); - else if(L"sim" == wsToken) return new CElementConnection(TypeElement::sim); - else if(L"simeq" == wsToken) return new CElementConnection(TypeElement::simeq); - else if(L"equiv" == wsToken) return new CElementConnection(TypeElement::equiv); - else if(L"prop" == wsToken) return new CElementConnection(TypeElement::prop); - else if(L"parallel" == wsToken) return new CElementConnection(TypeElement::parallel);\ - else if(L"ortho" == wsToken) return new CElementConnection(TypeElement::ortho); - else if(L"divides" == wsToken) return new CElementConnection(TypeElement::divides); - else if(L"ndivides" == wsToken) return new CElementConnection(TypeElement::ndivides); - else if(L"toward" == wsToken) return new CElementConnection(TypeElement::toward); - else if(L"transl" == wsToken) return new CElementConnection(TypeElement::transl); - else if(L"transr" == wsToken) return new CElementConnection(TypeElement::transr); - else if(L"def" == wsToken) return new CElementConnection(TypeElement::def); - else if(L"=" == wsToken) return new CElementConnection(TypeElement::equals); - else if(L"<>" == wsToken) return new CElementConnection(TypeElement::notequals); - else if(L"<" == wsToken) return new CElementConnection(TypeElement::learrow); - else if(L"<=" == wsToken) return new CElementConnection(TypeElement::learrowequals); - else if(L"leslant" == wsToken) return new CElementConnection(TypeElement::leslant); - else if(L">" == wsToken) return new CElementConnection(TypeElement::riarrow); - else if(L">=" == wsToken) return new CElementConnection(TypeElement::riarrowequals); - else if(L"geslant" == wsToken) return new CElementConnection(TypeElement::geslant); - else if(L"<<" == wsToken) return new CElementConnection(TypeElement::dllearrow); - else if(L">>" == wsToken) return new CElementConnection(TypeElement::dlriarrow); - else if(L"prec" == wsToken) return new CElementConnection(TypeElement::prec); - else if(L"succ" == wsToken) return new CElementConnection(TypeElement::succ); - else if(L"preccurlyeq" == wsToken) return new CElementConnection(TypeElement::preccurlyeq); - else if(L"succcurlyeq" == wsToken) return new CElementConnection(TypeElement::succcurlyeq); - else if(L"precsim" == wsToken) return new CElementConnection(TypeElement::precsim); - else if(L"succsim" == wsToken) return new CElementConnection(TypeElement::succsim); - else if(L"nprec" == wsToken) return new CElementConnection(TypeElement::nprec); - else if(L"nsucc" == wsToken) return new CElementConnection(TypeElement::nsucc); - else if(L"dlarrow" == wsToken) return new CElementConnection(TypeElement::dlarrow); - else if(L"dlrarrow" == wsToken) return new CElementConnection(TypeElement::dlrarrow); - else if(L"drarrow" == wsToken) return new CElementConnection(TypeElement::drarrow); - else if(L"abs" == wsToken) return new CElementFunction(TypeElement::abs); - else if(L"fact" == wsToken) return new CElementFunction(TypeElement::fact); - else if(L"sqrt" == wsToken) return new CElementFunction(TypeElement::sqrt); - else if(L"sin" == wsToken) return new CElementFunction(TypeElement::sin); - else if(L"cos" == wsToken) return new CElementFunction(TypeElement::cos); - else if(L"tan" == wsToken) return new CElementFunction(TypeElement::tan); - else if(L"cot" == wsToken) return new CElementFunction(TypeElement::cot); - else if(L"sinh" == wsToken) return new CElementFunction(TypeElement::sinh); - else if(L"cosh" == wsToken) return new CElementFunction(TypeElement::cosh); - else if(L"tanh" == wsToken) return new CElementFunction(TypeElement::tanh); - else if(L"coth" == wsToken) return new CElementFunction(TypeElement::coth); - else if(L"arcsin" == wsToken) return new CElementFunction(TypeElement::arcsin); - else if(L"arccos" == wsToken) return new CElementFunction(TypeElement::arccos); - else if(L"arctan" == wsToken) return new CElementFunction(TypeElement::arctan); - else if(L"arccot" == wsToken) return new CElementFunction(TypeElement::arccot); - else if(L"arsinh" == wsToken) return new CElementFunction(TypeElement::arsinh); - else if(L"arcosh" == wsToken) return new CElementFunction(TypeElement::arcosh); - else if(L"artanh" == wsToken) return new CElementFunction(TypeElement::artanh); - else if(L"arcoth" == wsToken) return new CElementFunction(TypeElement::arcoth); - else if(L"ln" == wsToken) return new CElementFunction(TypeElement::ln); - else if(L"exp" == wsToken) return new CElementFunction(TypeElement::exp); - else if(L"log" == wsToken) return new CElementFunction(TypeElement::log); - else return nullptr; } void CElement::SetAttribute(const std::vector arAttr) { - arElementAttributes = arAttr; + m_arElementAttributes = arAttr; } void CElement::SetIndex(CIndex *pIndex) { - pElementIndex = pIndex; + m_pElementIndex = pIndex; } TypeElement CElement::GetBaseType() { - return enBaseType; + return m_enBaseType; } void CElement::SetBaseType(const TypeElement &enType) { - enBaseType = enType; + m_enBaseType = enType; } //class methods CElementString CElementString::CElementString(const std::wstring& wsTokenString) { - wsString = wsTokenString; + m_wsString = wsTokenString; + SetBaseType(TypeElement::String); } CElementString::~CElementString() {} void CElementString::SetString(const std::wstring& wsTokenString) { - wsString = wsTokenString; + m_wsString = wsTokenString; } - void CElementString::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + void CElementString::Parse(CStarMathReader* pReader) { + pReader->ClearWString(); + } + void CElementString::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) + { + oXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(oXmlWrite); + oXmlWrite->WriteNodeBegin(L"m:t",false); + oXmlWrite->WriteString(m_wsString); + oXmlWrite->WriteNodeEnd(L"m:t",false,false); + oXmlWrite->WriteNodeEnd(L"m:r",false,false); } std::wstring CElementString::GetString() { - return wsString; + return m_wsString; } - bool CElementString::IsDigit(const std::wstring &wsToken) + TypeElement CElementString::GetDigit(const std::wstring &wsToken) { - for(char cOneElement: wsToken) + for(wchar_t cOneElement: wsToken) { - if(!isdigit(cOneElement)) return false; + if(!isdigit(cOneElement)) return TypeElement::undefine; } - return true; + return TypeElement::String; } //class methods CElementBinOperator - CElementBinOperator::CElementBinOperator(const TypeElement& enType) + CElementBinOperator::CElementBinOperator(const TypeElement& enType): m_pLeftArgument(nullptr) , m_pRightArgument(nullptr) { - enTypeBinOp = enType; + m_enTypeBinOp = enType; SetBaseType(TypeElement::BinOperator); } CElementBinOperator::~CElementBinOperator() { - delete pLeftArgument; - delete pRightArgument; + delete m_pLeftArgument; + delete m_pRightArgument; } void CElementBinOperator::SetLeftArg(CElement *pElement) { - pLeftArgument = pElement; + m_pLeftArgument = pElement; } void CElementBinOperator::SetRightArg(CElement *pElement) { - pRightArgument = pElement; + m_pRightArgument = pElement; } - void CElementBinOperator::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + void CElementBinOperator::Parse(CStarMathReader* pReader) { -// нужно сделать функцию для чтения без скобок -// if(enTypeBinOp == TypeElement::frac) -// { - -// } - CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); - if(IsBinOperatorLowPrior() && CParseStarMathString::CheckingTheNextElement(itStart,itEnd,IsBinOperatorHightPrior)) + if(pReader->GetLocalType() == TypeElement::frac) { - CElement* pBinOp = CParseStarMathString::ParsElement(itStart,itEnd); - CParseStarMathString::AddLeftArgument(pTempElement,pBinOp); - SetRightArg(pBinOp); + SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader)); } else - SetRightArg(pTempElement); + { + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + pReader->GetToken(); + pReader->SetTypesToken(); + if(IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) + { + CElement* pBinOp = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); + SetRightArg(pBinOp); + } + else + SetRightArg(pTempElement); + } + } + void CElementBinOperator::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) + { + if(m_enTypeBinOp == TypeElement::over || m_enTypeBinOp ==TypeElement::division) + { + oXmlWrite->WriteNodeBegin(L"m:f",false); + if(m_enTypeBinOp == TypeElement::division) CConversionSMtoOOXML::PropertiesMFPR(true,L"lin",oXmlWrite); + else CConversionSMtoOOXML::PropertiesMFPR(false,L"",oXmlWrite); + CConversionSMtoOOXML::BlockRecording(L"m:num",m_pLeftArgument,oXmlWrite); + CConversionSMtoOOXML::BlockRecording(L"m:den",m_pRightArgument,oXmlWrite); + oXmlWrite->WriteNodeEnd(L"m:f",false,false); + } + else if(m_enTypeBinOp == TypeElement::plus ||m_enTypeBinOp == TypeElement::minus || m_enTypeBinOp == TypeElement::multipl || m_enTypeBinOp == TypeElement::cdot || m_enTypeBinOp == TypeElement::times || m_enTypeBinOp == TypeElement::div || m_enTypeBinOp == TypeElement::odivide || m_enTypeBinOp == TypeElement::oplus || m_enTypeBinOp == TypeElement::ominus || m_enTypeBinOp == TypeElement::odot || m_enTypeBinOp == TypeElement::otimes) + { + m_pLeftArgument->ConversionToOOXML(oXmlWrite); + oXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(oXmlWrite); + oXmlWrite->WriteNodeBegin(L"m:t",false); + switch (m_enTypeBinOp) + { + case TypeElement::plus: + oXmlWrite->WriteString(L"+"); + break; + case TypeElement::minus: + oXmlWrite->WriteString(L"-"); + break; + case TypeElement::multipl: + oXmlWrite->WriteString(L"*"); + break; + case TypeElement::cdot: + oXmlWrite->WriteString(L"\u00B7"); + break; + case TypeElement::times: + oXmlWrite->WriteString(L"\u00D7"); + break; + case TypeElement::div: + oXmlWrite->WriteString(L"\u00F7"); + break; + case TypeElement::odivide: + oXmlWrite->WriteString(L"\u2298"); + break; + case TypeElement::oplus: + oXmlWrite->WriteString(L"\u2295"); + break; + case TypeElement::ominus: + oXmlWrite->WriteString(L"\u2296"); + break; + case TypeElement::odot: + oXmlWrite->WriteString(L"\u2299"); + break; + case TypeElement::otimes: + oXmlWrite->WriteString(L"\u2297"); + break; + default: + break; + } + if(m_pRightArgument->GetBaseType() == TypeElement::String) + { + CElementString* oNumber = dynamic_cast (m_pRightArgument); + oXmlWrite->WriteString(oNumber->GetString()); + oXmlWrite->WriteNodeEnd(L"m:t",false,false); + oXmlWrite->WriteNodeEnd(L"m:r",false,false); + } + else + { + oXmlWrite->WriteNodeEnd(L"m:t",false,false); + oXmlWrite->WriteNodeEnd(L"m:r",false,false); + m_pRightArgument->ConversionToOOXML(oXmlWrite); + } + + } } void CElementBinOperator::SetTypeBinOP(const TypeElement &enType) { - enTypeBinOp = enType; + m_enTypeBinOp = enType; } - bool CElementBinOperator::IsBinOperatorHightPrior(const std::wstring& wsToken) + TypeElement CElementBinOperator::GetBinOperator(const std::wstring& wsToken) { - if(L"cdot" == wsToken) return true; - else if(L"times" == wsToken) return true; - else if(L"over" == wsToken) return true; -// else if(L"frac" == wsToken) return true; - else if(L"div" == wsToken) return true; - else if(L"multipl" == wsToken) return true; - else if(L"division" == wsToken) return true; - else if(L"odot" == wsToken) return true; - else if(L"otimes" == wsToken) return true; - else if(L"odivide" == wsToken) return true; - else if(L"circ" == wsToken) return true; - else if(L"wideslash" == wsToken) return true; - else if(L"widebslash" == wsToken) return true; + if(L"cdot" == wsToken) return TypeElement::cdot; + else if(L"+" == wsToken) return TypeElement::plus; + else if(L"-" == wsToken) return TypeElement::minus; + else if(L"oplus" == wsToken) return TypeElement::oplus; + else if(L"ominus" == wsToken) return TypeElement::ominus; + else if(L"circ" == wsToken) return TypeElement::circ; + else if(L"times" == wsToken) return TypeElement::times; + else if(L"over" == wsToken) return TypeElement::over; + else if(L"frac" == wsToken) return TypeElement::frac; + else if(L"div" == wsToken) return TypeElement::div; + else if(L"*" == wsToken) return TypeElement::multipl; + else if(L"/" == wsToken) return TypeElement::division; + else if(L"odot" == wsToken) return TypeElement::odot; + else if(L"otimes" == wsToken) return TypeElement::otimes; + else if(L"odivide" == wsToken) return TypeElement::odivide; + else if(L"wideslash" == wsToken) return TypeElement::wideslash; + else if(L"widebslash" == wsToken) return TypeElement::widebslash; + else return TypeElement::undefine; } bool CElementBinOperator::IsBinOperatorLowPrior() { - switch (enTypeBinOp) { + switch (m_enTypeBinOp) { case TypeElement::plus: return true; case TypeElement::minus: @@ -560,159 +497,252 @@ namespace StarMath //class methods CElementBracket CElementBracket::CElementBracket(const TypeElement& enType) { - enTypeBracket = enType; + m_enTypeBracket = enType; } CElementBracket::~CElementBracket() { - for(CElement* pTemp:arBrecketValue) delete pTemp; + for(CElement* pTemp:m_arBrecketValue) delete pTemp; } void CElementBracket::SetBracketValue(const std::vector &arValue) { - arBrecketValue = arValue; + m_arBrecketValue = arValue; } - bool CElementBracket::IsBracketClose(const std::wstring &wsToken) + TypeElement CElementBracket::GetBracketOpen(const std::wstring &wsToken) { - if(L"}" == wsToken) return true; - else if(L")" == wsToken) return true; - else if(L"]" == wsToken) return true; - else if(L"rdbracket" == wsToken) return true; - else if(L"rbrace" == wsToken) return true; - else if(L"rangle" == wsToken) return true; - else if(L"rceil" == wsToken) return true; - else if(L"rfloor" == wsToken) return true; - else if(L"rline" == wsToken) return true; - else if(L"rdline" == wsToken) return true; - else if(L"right" == wsToken) return true; - else return false; + if(L"{" == wsToken) return TypeElement::brace; + else if(L"(" == wsToken) return TypeElement::round; + else if(L"[" == wsToken) return TypeElement::square; + else if(L"ldbracket" == wsToken) return TypeElement::ldbracket; + else if(L"lbrace" == wsToken) return TypeElement::lbrace; + else if(L"langle" == wsToken) return TypeElement::langle; + else if(L"lceil" == wsToken) return TypeElement::lceil; + else if(L"lfloor" == wsToken) return TypeElement::lfloor; + else if(L"lline" == wsToken) return TypeElement::lline; + else if(L"ldline" == wsToken) return TypeElement::ldline; + else return TypeElement::undefine; } - // правка if - void CElementBracket::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + TypeElement CElementBracket::GetBracketClose(const std::wstring &wsToken) { - while(!CParseStarMathString::CheckingTheNextElement(itStart,itEnd,IsBracketClose)) + if(L"}" == wsToken) return TypeElement::rwbrace; + else if(L")" == wsToken) return TypeElement::rround; + else if(L"]" == wsToken) return TypeElement::rsquare; + else if(L"rdbracket" == wsToken) return TypeElement::rdbracket; + else if(L"rbrace" == wsToken) return TypeElement::rbrace; + else if(L"rangle" == wsToken) return TypeElement::rangle; + else if(L"rceil" == wsToken) return TypeElement::rceil; + else if(L"rfloor" == wsToken) return TypeElement::rfloor; + else if(L"rline" == wsToken) return TypeElement::rline; + else if(L"rdline" == wsToken) return TypeElement::rdline; + else if(L"right" == wsToken) return TypeElement::right; + else return TypeElement::undefine; + } + //сделать не через SetTypesToken,а локальную переменную и через нее определять конец скобок + void CElementBracket::Parse(CStarMathReader* pReader) + { + pReader->GetToken(); + TypeElement enBracketClose = GetBracketClose(pReader->GetString()); + if(enBracketClose == TypeElement::undefine) { - CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); - if(!arBrecketValue.empty() && (pTempElement->GetBaseType() == TypeElement::BinOperator || pTempElement->GetBaseType() == TypeElement::SetOperations) ) + pReader->SetTypesToken(); + } + while(enBracketClose == TypeElement::undefine) + { + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + if(!m_arBrecketValue.empty() && (pTempElement->GetBaseType() == TypeElement::BinOperator || pTempElement->GetBaseType() == TypeElement::SetOperations) ) { - CParseStarMathString::AddLeftArgument(arBrecketValue.back(),pTempElement); - arBrecketValue.pop_back(); + CParserStarMathString::AddLeftArgument(m_arBrecketValue.back(),pTempElement); + m_arBrecketValue.pop_back(); } - arBrecketValue.push_back(pTempElement); + m_arBrecketValue.push_back(pTempElement); + if(pReader->EmptyString()) + { + pReader->GetToken(); + enBracketClose = GetBracketClose(pReader->GetString()); + if(enBracketClose == TypeElement::undefine) + { + pReader->SetTypesToken(); + } + } + else enBracketClose = GetBracketClose(pReader->GetString()); } //доработать() - if(!CParseStarMathString::MoveToNextElement(itStart,itEnd)); + pReader->ClearWString(); + } + void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + } //class methods CElementSpecialSymbol CElementSpecialSymbol::CElementSpecialSymbol(const TypeElement &enType) { - enTypeSpecial = enType; + m_enTypeSpecial = enType; } CElementSpecialSymbol::~CElementSpecialSymbol() {} - void CElementSpecialSymbol::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + void CElementSpecialSymbol::Parse(CStarMathReader* pReader) { } //class methods CElementSetOperations - CElementSetOperations::CElementSetOperations(const TypeElement &enType) + CElementSetOperations::CElementSetOperations(const TypeElement &enType): m_pRightArgument(nullptr), m_pLeftArgument(nullptr) { - enTypeSet = enType; + m_enTypeSet = enType; SetBaseType(TypeElement::SetOperations); } CElementSetOperations::~CElementSetOperations() { - delete pLeftArgument; - delete pRightArgument; + delete m_pLeftArgument; + delete m_pRightArgument; } void CElementSetOperations::SetLeftArg(CElement *pElement) { - pLeftArgument = pElement; + m_pLeftArgument = pElement; } CElement* CElementSetOperations::GetLeftArg() { - return pLeftArgument; + return m_pLeftArgument; } void CElementSetOperations::SetRightArg(CElement *pElement) { - pRightArgument = pElement; + m_pRightArgument = pElement; } CElement* CElementSetOperations::GetRightArg() { - return pRightArgument; + return m_pRightArgument; } - void CElementSetOperations::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + void CElementSetOperations::Parse(CStarMathReader* pReader) { - CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); - if(CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementBinOperator::IsBinOperatorHightPrior)) + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + pReader->GetToken(); + pReader->SetTypesToken(); + if(pReader->GetGlobalType() == TypeElement::BinOperator) { - CElement* pBinOpElement = CParseStarMathString::ParsElement(itStart,itEnd); - CParseStarMathString::AddLeftArgument(pTempElement,pBinOpElement); + CElement* pBinOpElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTempElement,pBinOpElement); SetRightArg(pBinOpElement); } else SetRightArg(pTempElement); } - bool CElementSetOperations::IsSetOperation(const std::wstring &wsToken) + void CElementSetOperations::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - if(L"union" == wsToken) return true; - else return false; + + } + TypeElement CElementSetOperations::GetSetOperation(const std::wstring &wsToken) + { + if(L"intersection" == wsToken) return TypeElement::intersection; + else if(L"union" == wsToken) return TypeElement::Union; + else if(L"setminus" == wsToken) return TypeElement::setminus; + else if(L"setquoyient" == wsToken) return TypeElement::setquoyient; + else if(L"subseteq" == wsToken) return TypeElement::subseteq; + else if(L"subset" == wsToken) return TypeElement::subset; + else if(L"supset" == wsToken) return TypeElement::supset; + else if(L"supseteq" == wsToken) return TypeElement::supseteq; + else if(L"nsubset" == wsToken) return TypeElement::nsubset; + else if(L"nsubseteq" == wsToken) return TypeElement::nsubseteq; + else if(L"nsupset" == wsToken) return TypeElement::nsupset; + else if(L"nsubseteq" == wsToken) return TypeElement::nsubseteq; + else if(L"in" == wsToken) return TypeElement::in; + else if(L"notin" == wsToken) return TypeElement::notin; + else if(L"owns" == wsToken) return TypeElement::owns; + else return TypeElement::undefine; } //class methods CElementConnection - CElementConnection::CElementConnection(const TypeElement& enType) + CElementConnection::CElementConnection(const TypeElement& enType): m_pLeftArgument(nullptr), m_pRightArgument(nullptr) { - enTypeCon = enType; + m_enTypeCon = enType; SetBaseType(TypeElement::Connection); } CElementConnection::~CElementConnection() { - delete pLeftArgument; - delete pRightArgument; + delete m_pLeftArgument; + delete m_pRightArgument; } void CElementConnection::SetRightArg(CElement *pElement) { - pRightArgument = pElement; + m_pRightArgument = pElement; } CElement* CElementConnection::GetRightArg() { - return pRightArgument; + return m_pRightArgument; } void CElementConnection::SetLeftArg(CElement *pElement) { - pLeftArgument = pElement; + m_pLeftArgument = pElement; } CElement* CElementConnection::GetLeftArg() { - return pLeftArgument; + return m_pLeftArgument; } - void CElementConnection::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + void CElementConnection::Parse(CStarMathReader *pReader) { - CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); - if(CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementBinOperator::IsBinOperatorHightPrior)) + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + pReader->GetToken(); + pReader->SetTypesToken(); + if(pReader->GetGlobalType() == TypeElement::BinOperator) { - CElement* pBinOp = CParseStarMathString::ParsElement(itStart,itEnd); - CParseStarMathString::AddLeftArgument(pTempElement,pBinOp); + CElement* pBinOp = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); SetRightArg(pBinOp); } else SetRightArg(pTempElement); } - bool CElementConnection::IsConnection(const std::wstring& wsToken) + void CElementConnection::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - if(L"def" == wsToken) return true; - else return false; + } -//class methods CIndex - CIndex::CIndex(const TypeElement& enType) + TypeElement CElementConnection::GetConnection(const std::wstring& wsToken) { - enTypeIndex = enType; + if(L"approx" == wsToken) return TypeElement::approx; + else if(L"sim" == wsToken) return TypeElement::sim; + else if(L"simeq" == wsToken) return TypeElement::simeq; + else if(L"equiv" == wsToken) return TypeElement::equiv; + else if(L"prop" == wsToken) return TypeElement::prop; + else if(L"parallel" == wsToken) return TypeElement::parallel; + else if(L"ortho" == wsToken) return TypeElement::ortho; + else if(L"divides" == wsToken) return TypeElement::divides; + else if(L"ndivides" == wsToken) return TypeElement::ndivides; + else if(L"toward" == wsToken) return TypeElement::toward; + else if(L"transl" == wsToken) return TypeElement::transl; + else if(L"transr" == wsToken) return TypeElement::transr; + else if(L"def" == wsToken) return TypeElement::def; + else if(L"=" == wsToken) return TypeElement::equals; + else if(L"<>" == wsToken) return TypeElement::notequals; + else if(L"<" == wsToken) return TypeElement::learrow; + else if(L"<=" == wsToken) return TypeElement::learrowequals; + else if(L"leslant" == wsToken) return TypeElement::leslant; + else if(L">" == wsToken) return TypeElement::riarrow; + else if(L">=" == wsToken) return TypeElement::riarrowequals; + else if(L"geslant" == wsToken) return TypeElement::geslant; + else if(L"<<" == wsToken) return TypeElement::dllearrow; + else if(L">>" == wsToken) return TypeElement::dlriarrow; + else if(L"prec" == wsToken) return TypeElement::prec; + else if(L"succ" == wsToken) return TypeElement::succ; + else if(L"preccurlyeq" == wsToken) return TypeElement::preccurlyeq; + else if(L"succcurlyeq" == wsToken) return TypeElement::succcurlyeq; + else if(L"precsim" == wsToken) return TypeElement::precsim; + else if(L"succsim" == wsToken) return TypeElement::succsim; + else if(L"nprec" == wsToken) return TypeElement::nprec; + else if(L"nsucc" == wsToken) return TypeElement::nsucc; + else if(L"dlarrow" == wsToken) return TypeElement::dlarrow; + else if(L"dlrarrow" == wsToken) return TypeElement::dlrarrow; + else if(L"drarrow" == wsToken) return TypeElement::drarrow; + else return TypeElement::undefine; +} +//class methods CIndex + CIndex::CIndex(const TypeElement& enType): m_pValueIndex(nullptr) + { + m_enTypeIndex = enType; } CIndex::~CIndex() { - delete pValueIndex; + delete m_pValueIndex; } void CIndex::SetValueIndex(CElement *pElement) { - pValueIndex = pElement; + m_pValueIndex = pElement; } CElement* CIndex::GetValueIndex() { - return pValueIndex; + return m_pValueIndex; } bool CIndex::IsIndex(const std::wstring &wsCheckToken) { @@ -735,71 +765,293 @@ namespace StarMath else return nullptr; } //class methods CElementFunction - CElementFunction::CElementFunction(const TypeElement &enType) + CElementFunction::CElementFunction(const TypeElement &enType): m_pValue(nullptr) { - enTypeFunction = enType; + m_enTypeFunction = enType; SetBaseType(TypeElement::Function); } CElementFunction::~CElementFunction() { - delete pValue; + delete m_pValue; } void CElementFunction::SetValueFunction(CElement *pElement) { - pValue = pElement; + m_pValue = pElement; } CElement* CElementFunction::GetValueFunction() { - return pValue; + return m_pValue; } - void CElementFunction::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + void CElementFunction::Parse(CStarMathReader* pReader) { - SetValueFunction(CParseStarMathString::ParsElement(itStart,itEnd)); + SetValueFunction(CParserStarMathString::ParseElement(pReader)); + pReader->ClearWString(); + } + void CElementFunction::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + + } + TypeElement CElementFunction::GetFunction(const std::wstring &wsToken) + { + if(L"abs" == wsToken) return TypeElement::abs; + else if(L"fact" == wsToken) return TypeElement::fact; + else if(L"sqrt" == wsToken) return TypeElement::sqrt; + else if(L"sin" == wsToken) return TypeElement::sin; + else if(L"cos" == wsToken) return TypeElement::cos; + else if(L"tan" == wsToken) return TypeElement::tan; + else if(L"cot" == wsToken) return TypeElement::cot; + else if(L"sinh" == wsToken) return TypeElement::sinh; + else if(L"cosh" == wsToken) return TypeElement::cosh; + else if(L"tanh" == wsToken) return TypeElement::tanh; + else if(L"coth" == wsToken) return TypeElement::coth; + else if(L"arcsin" == wsToken) return TypeElement::arcsin; + else if(L"arccos" == wsToken) return TypeElement::arccos; + else if(L"arctan" == wsToken) return TypeElement::arctan; + else if(L"arccot" == wsToken) return TypeElement::arccot; + else if(L"arsinh" == wsToken) return TypeElement::arsinh; + else if(L"arcosh" == wsToken) return TypeElement::arcosh; + else if(L"artanh" == wsToken) return TypeElement::artanh; + else if(L"arcoth" == wsToken) return TypeElement::arcoth; + else if(L"ln" == wsToken) return TypeElement::ln; + else if(L"exp" == wsToken) return TypeElement::exp; + else if(L"log" == wsToken) return TypeElement::log; + else return TypeElement::undefine; } //class methods CElementOperation - CElementOperator::CElementOperator(const TypeElement &enType) + CElementOperator::CElementOperator(const TypeElement &enType): m_pValueFrom(nullptr), m_pValueTo(nullptr), m_pValueOperator(nullptr) { - enTypeOperator = enType; + m_enTypeOperator = enType; SetBaseType(TypeElement::Operation); } CElementOperator::~CElementOperator() { - delete pValueOperator; - delete pValueFrom; - delete pValueTo; + delete m_pValueOperator; + delete m_pValueFrom; + delete m_pValueTo; } void CElementOperator::SetValueOperator(CElement *pElement) { - pValueOperator = pElement; + m_pValueOperator = pElement; } CElement* CElementOperator::GetValueOperator() { - return pValueOperator; + return m_pValueOperator; } void CElementOperator::SetFromValue(CElement *pElement) { - pValueFrom = pElement; + m_pValueFrom = pElement; } CElement* CElementOperator::GetFromValue() { - return pValueFrom; + return m_pValueFrom; } void CElementOperator::SetToValue(CElement *pElement) { - pValueTo = pElement; + m_pValueTo = pElement; } CElement* CElementOperator::GetToValue() { - return pValueTo; + return m_pValueTo; } - void CElementOperator::Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) + TypeElement CElementOperator::GetFromOrTo(const std::wstring &wsToken) { - do + if(L"from" == wsToken) return TypeElement::from; + else if(L"to" == wsToken) return TypeElement::to; + else return TypeElement::undefine; + } + TypeElement CElementOperator::GetOperator(const std::wstring &wsToken) + { + if(L"lim" == wsToken) return TypeElement::lim; + if(L"sum" == wsToken) return TypeElement::sum; + if(L"liminf" == wsToken) return TypeElement::liminf; + if(L"limsup" == wsToken) return TypeElement::limsup; + if(L"prod" == wsToken) return TypeElement::prod; + if(L"coprod" == wsToken) return TypeElement::coprod; + if(L"Int" == wsToken) return TypeElement::Int; + if(L"iint" == wsToken) return TypeElement::iint; + if(L"iiint" == wsToken) return TypeElement::iiint; + if(L"lint" == wsToken) return TypeElement::lint; + if(L"llint" == wsToken) return TypeElement::llint; + if(L"lllint" == wsToken) return TypeElement::lllint; + else return TypeElement::undefine; + } + void CElementOperator::Parse(CStarMathReader* pReader) + { + pReader->GetToken(); + pReader->SetTypesToken(); + if(pReader->GetLocalType() == TypeElement::from) { - CElement* pTempElement = CParseStarMathString::ParsElement(itStart,itEnd); + pReader->ClearWString(); + SetFromValue(CParserStarMathString::ReadingWithoutBracket(pReader)); + } + if(pReader->GetLocalType() == TypeElement::to) + { + pReader->ClearWString(); + SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader)); + } - }while(CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementBinOperator::IsBinOperatorHightPrior) || CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementSetOperations::IsSetOperation) || CParseStarMathString::CheckingTheNextElement(itStart,itEnd,CElementConnection::IsConnection)); + SetValueOperator(CParserStarMathString::ReadingWithoutBracket(pReader)); + } + void CElementOperator::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) + { + if(m_enTypeOperator == TypeElement::sum) + { + oXmlWrite->WriteNodeBegin(L"m:nary",false); + CConversionSMtoOOXML::PropertiesNaryPr(L"\u2211",nullptr == m_pValueFrom,nullptr == m_pValueTo,oXmlWrite); + if(m_pValueFrom == nullptr) oXmlWrite->WriteNode(L"m:sub",L""); + else + { + CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueFrom,oXmlWrite); + } + if(m_pValueTo == nullptr) oXmlWrite->WriteNode(L"m:sup",L""); + else + { + CConversionSMtoOOXML::BlockRecording(L"m:sup",m_pValueTo,oXmlWrite); + } + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValueOperator,oXmlWrite); + oXmlWrite->WriteNodeEnd(L"m:nary",false,false); + } + } +// class methods CStarMathReader + CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd): m_enGlobalType(TypeElement::Empty) + { + m_itStart = itStart; + m_itEnd = itEnd; + } + CStarMathReader::~CStarMathReader() + {} + void CStarMathReader::GetToken() + { + if(m_itStart != m_itEnd) + { + m_wsToken = GetElement(); + if(m_wsToken == L"left") m_wsToken = GetElement(); + else if(L"right" == m_wsToken ) m_wsToken = GetElement(); + } + } + void CStarMathReader::SetTypesToken() + { + m_enUnderType = CAttribute::GetTypeAttribute(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Attribute; + return; + } + m_enUnderType = CElementOperator::GetFromOrTo(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Operation; + return; + } + m_enUnderType = CElementBracket::GetBracketOpen(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Bracket; + return; + } + m_enUnderType = CElementString::GetDigit(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::String; + return; + } + m_enUnderType = CElementBinOperator::GetBinOperator(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::BinOperator; + return; + } + m_enUnderType = CElementSetOperations::GetSetOperation(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::SetOperations; + return; + } + m_enUnderType = CElementConnection::GetConnection(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Connection; + return; + } + m_enUnderType = CElementFunction::GetFunction(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Function; + return; + } + m_enUnderType = CElementOperator::GetOperator(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Operation; + return; + } + if(m_enUnderType == TypeElement::undefine) + { + m_enGlobalType = TypeElement::Empty; + return; + } + } + TypeElement CStarMathReader::GetLocalType() + { + return m_enUnderType; + } + TypeElement CStarMathReader::GetGlobalType() + { + return m_enGlobalType; + } + std::wstring CStarMathReader::GetString() + { + return m_wsToken; + } +// void CStarMathReader::SkipNextElement() +// { +// if(m_itStart !=m_itEnd) +// { +// std::wstring wsNextElement = CParserStarMathString::GetElement(m_itStart,m_itEnd); +// } +// } + void CStarMathReader::ClearWString() + { + m_wsToken.clear(); + } + bool CStarMathReader::EmptyString() + { + return m_wsToken.empty(); + } + bool CStarMathReader::CheckIteratorPosition() + { + if(m_itStart !=m_itEnd) return false; + else return true; + } + std::wstring CStarMathReader::GetElement() + { + std::wstring m_wsElement{}; + for(; m_itStart != m_itEnd;m_itStart++) + { + if(iswspace(*m_itStart) && m_wsElement.empty()) continue; + else if(iswspace(*m_itStart) && !m_wsElement.empty()) + { + m_itStart++; + break; + } + else if(!m_wsElement.empty() && (*m_itStart == L'(' || L')' == *m_itStart || *m_itStart == L'{' || *m_itStart == L'}' || *m_itStart == L'+' || *m_itStart == L'-' || *m_itStart == L'/' || *m_itStart == L'*' || L'^' == *m_itStart || L'_' == *m_itStart || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (iswalpha(*m_itStart) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) + { + return m_wsElement; + } + else if(((*m_itStart == L'{' || *m_itStart == L'}' || *m_itStart == L'+' || *m_itStart == L'-' || *m_itStart == L'/' || *m_itStart == L'*' || L'^' == *m_itStart || L'_' == *m_itStart || L'=' == *m_itStart ) && m_wsElement.empty()) || (!m_wsElement.empty() && ((m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) + { + m_wsElement.push_back(*m_itStart); + m_itStart++; + return m_wsElement; + } + else + { + m_wsElement.push_back(*m_itStart); + } + } + if(!m_wsElement.empty()) return m_wsElement; + else return {}; } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index f60e0ae9e6..f10bd3d1b8 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -5,18 +5,45 @@ #include #include #include +#include "../../../../DesktopEditor/xml/include/xmlwriter.h" namespace StarMath { + //Сlass for working with tokens (reading, defining types, passing) + class CStarMathReader + { + public: + CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd); + ~CStarMathReader(); + void GetToken(); + //getting a subtype and setting the global type of a token to variables m_enUnderType and m_enGlobalType + void SetTypesToken(); + //void SkipNextElement(); + TypeElement GetGlobalType(); + TypeElement GetLocalType(); + std::wstring GetString(); + //clearing a variable m_wsToken + void ClearWString(); + bool CheckIteratorPosition(); + bool EmptyString(); + private: + //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) + std::wstring GetElement(); + std::wstring::iterator m_itStart,m_itEnd; + TypeElement m_enGlobalType; + TypeElement m_enUnderType; + std::wstring m_wsToken; + }; + class CAttribute { public: CAttribute(const TypeElement& enType); ~CAttribute(); - static TypeElement IsAttribute(const std::wstring& wsToken); + static TypeElement GetTypeAttribute(const std::wstring& wsToken); TypeElement GetType(); private: - TypeElement enTypeAttr; + TypeElement m_enTypeAttr; }; class CIndex; @@ -26,18 +53,18 @@ namespace StarMath public: CElement(); virtual ~CElement(); - virtual void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) = 0; - //принимает подтип (over, frac и т.д) и создает нужный нам класс(внутри уже идет проверка по классам) - static CElement* CreateElement(const std::wstring& wsToken); - //static TypeElement GetTypeElement(const std::wstring& wsToken); + virtual void Parse(CStarMathReader* pReader) = 0; + //The function creates the class we need (by determining the class type by a variable m_enGlobalType from the class CStarMathReader) + static CElement* CreateElement(CStarMathReader* pReader); + virtual void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) = 0; void SetAttribute(const std::vector arAttr); void SetIndex(CIndex* pIndex); void SetBaseType(const TypeElement& enType); TypeElement GetBaseType(); private: - CIndex* pElementIndex; - std::vector arElementAttributes; - TypeElement enBaseType; + CIndex* m_pElementIndex; + std::vector m_arElementAttributes; + TypeElement m_enBaseType; }; class CIndex @@ -50,8 +77,8 @@ namespace StarMath static bool IsIndex(const std::wstring& wsCheckToken); static CIndex* CreateIndex(const std::wstring& wsToken); private: - CElement* pValueIndex; - TypeElement enTypeIndex; + CElement* m_pValueIndex; + TypeElement m_enTypeIndex; }; class CElementString: public CElement @@ -61,10 +88,11 @@ namespace StarMath virtual ~CElementString(); void SetString(const std::wstring& wsTokenString); std::wstring GetString(); - static bool IsDigit(const std::wstring& wsCheckToken); + static TypeElement GetDigit(const std::wstring& wsCheckToken); private: - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; - std::wstring wsString; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; + std::wstring m_wsString; }; class CElementBinOperator: public CElement @@ -77,13 +105,14 @@ namespace StarMath void SetTypeBinOP(const TypeElement& enType); CElement* GetRightArg(); CElement* GetLeftArg(); - static bool IsBinOperatorHightPrior(const std::wstring& wsToken); + static TypeElement GetBinOperator(const std::wstring& wsToken); private: bool IsBinOperatorLowPrior(); - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; - CElement* pLeftArgument; - CElement* pRightArgument; - TypeElement enTypeBinOp; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; + CElement* m_pLeftArgument; + CElement* m_pRightArgument; + TypeElement m_enTypeBinOp; }; class CElementOperator: public CElement @@ -97,12 +126,15 @@ namespace StarMath CElement* GetFromValue(); void SetToValue(CElement* pElement); CElement* GetToValue(); + static TypeElement GetOperator(const std::wstring& wsToken); + static TypeElement GetFromOrTo(const std::wstring& wsToken); private: - void Pars(std::wstring::iterator &itStart, std::wstring::iterator &itEnd) override; - CElement* pValueOperator; - CElement* pValueFrom; - CElement* pValueTo; - TypeElement enTypeOperator; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; + CElement* m_pValueOperator; + CElement* m_pValueFrom; + CElement* m_pValueTo; + TypeElement m_enTypeOperator; }; class CElementBracket: public CElement @@ -111,11 +143,13 @@ namespace StarMath CElementBracket(const TypeElement& enType); virtual ~CElementBracket(); void SetBracketValue(const std::vector& arValue); + static TypeElement GetBracketOpen(const std::wstring& wsToken); private: - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; - static bool IsBracketClose(const std::wstring& wsToken); - TypeElement enTypeBracket; - std::vector arBrecketValue; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite); + TypeElement GetBracketClose(const std::wstring& wsToken); + TypeElement m_enTypeBracket; + std::vector m_arBrecketValue; }; class CElementSetOperations: public CElement @@ -127,12 +161,13 @@ namespace StarMath CElement* GetLeftArg(); void SetRightArg(CElement* pElement); CElement* GetRightArg(); - static bool IsSetOperation(const std::wstring& wsToken); + static TypeElement GetSetOperation(const std::wstring& wsToken); private: - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; - CElement* pLeftArgument; - CElement* pRightArgument; - TypeElement enTypeSet; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pLeftArgument; + CElement* m_pRightArgument; + TypeElement m_enTypeSet; }; class CElementConnection: public CElement @@ -144,12 +179,13 @@ namespace StarMath CElement* GetRightArg(); void SetLeftArg(CElement* pElement); CElement* GetLeftArg(); - static bool IsConnection(const std::wstring& wsToken); + static TypeElement GetConnection(const std::wstring& wsToken); private: - void Pars(std::wstring::iterator& itStart, std::wstring::iterator& itEnd) override; - CElement* pLeftArgument; - CElement* pRightArgument; - TypeElement enTypeCon; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pLeftArgument; + CElement* m_pRightArgument; + TypeElement m_enTypeCon; }; class CElementFunction: public CElement @@ -159,10 +195,12 @@ namespace StarMath virtual ~CElementFunction(); void SetValueFunction(CElement* pElement); CElement* GetValueFunction(); + static TypeElement GetFunction(const std::wstring& wsToken); private: - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; - CElement* pValue; - TypeElement enTypeFunction; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pValue; + TypeElement m_enTypeFunction; }; class CElementSpecialSymbol: public CElement @@ -171,23 +209,20 @@ namespace StarMath CElementSpecialSymbol(const TypeElement& enType); virtual ~CElementSpecialSymbol(); private: - void Pars(std::wstring::iterator& itStart,std::wstring::iterator& itEnd) override; - TypeElement enTypeSpecial; + void Parse(CStarMathReader* pReader) override; + TypeElement m_enTypeSpecial; }; - class CParseStarMathString + class CParserStarMathString { public: std::vector Parse(std::wstring& wsParseString); - static CElement* ParsElement(std::wstring::iterator& itStart, std::wstring::iterator& itEnd); - static std::wstring GetElement(std::wstring::iterator& itStart,std::wstring::iterator& itEnd); - static bool CheckingTheNextElement(std::wstring::iterator& itStart,std::wstring::iterator& itEnd, bool (&func)(const std::wstring&)); - static bool MoveToNextElement(std::wstring::iterator& itStart,std::wstring::iterator& itEnd); + static CElement* ParseElement(CStarMathReader* pReader); + //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). static void AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); - template - static void SetLeft(CElement* pLeftArg, CElement* pElementWhichaAdd); + static CElement* ReadingWithoutBracket(CStarMathReader* pReader); private: - std::vector arEquation; + std::vector m_arEquation; }; } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index c46f56ffd8..038e89d5a4 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -10,6 +10,7 @@ enum class TypeElement{ SetOperations, Operator, Bracket, + //BracketEnd, UnarSign, Attribute, SpecialSymbol, @@ -18,6 +19,7 @@ enum class TypeElement{ Index, Matrix, Connection, + Empty, //binoop cdot, times, @@ -39,6 +41,16 @@ enum class TypeElement{ //op lim, sum, + liminf, + limsup, + prod, + coprod, + Int, + iint, + iiint, + lint, + llint, + lllint, //brace brace, round, @@ -212,6 +224,21 @@ enum class TypeElement{ binom, stack, matrix, + //bracket close + rwbrace, + rbrace, + rround, + rsquare, + rdbracket, + rangle, + rceil, + rfloor, + rline, + rdline, + right, + //op + from, + to, }; } #endif // TYPESELEMENTS_H From f9b4f8402b4dcbb6767de50d1ca9f3d1018ddb7e Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 17 Nov 2023 12:04:13 +0300 Subject: [PATCH 011/117] added conversion of operations on sets and connections. tests added --- .../StarMath2OOXML/TestSMConverter/main.cpp | 470 +++++++++++++++++ .../StarMath2OOXML/cconversionsmtoooxml.cpp | 136 ++--- .../StarMath2OOXML/cconversionsmtoooxml.h | 9 +- .../StarMath2OOXML/cstarmathpars.cpp | 475 +++++++++++++++++- .../Converter/StarMath2OOXML/cstarmathpars.h | 56 ++- .../Converter/StarMath2OOXML/typeselements.h | 12 +- 6 files changed, 1062 insertions(+), 96 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index 7369496324..3e38e5b8ee 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -143,3 +143,473 @@ TEST(SMConvectorTest,OperatorSumFromTo) std::wstring XmlString = L"666777567"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } + +TEST(SMConvectorTest,SetOperationUnion) +{ + std::wstring wsString = L"23 union 45"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"23\u22C345"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationIntersection) +{ + std::wstring wsString = L"15 intersection 1234"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"15\u22C21234"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSetminus) +{ + std::wstring wsString = L"7 setminus 15745"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"7\u221615745"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSetquotient) +{ + std::wstring wsString = L"91 setquotient 45"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"91\u221545"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSubset) +{ + std::wstring wsString = L"1 subset 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22822"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSubseteq) +{ + std::wstring wsString = L"77subseteq66"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"77\u228666"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSupset) +{ + std::wstring wsString = L"11supset22"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"11\u228322"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSupseteq) +{ + std::wstring wsString = L"1 supseteq 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22872"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNsubset) +{ + std::wstring wsString = L"21nsubset2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"21\u22842"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNsubseteq) +{ + std::wstring wsString = L"782nsubseteq250"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"782\u2288250"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNsupset) +{ + std::wstring wsString = L"1nsupset2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22852"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNsupseteq) +{ + std::wstring wsString = L"1nsupseteq2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22892"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationIn) +{ + std::wstring wsString = L"1 in 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22082"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNotin) +{ + std::wstring wsString = L"3 notin 4"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"3\u22094"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationOwns) +{ + std::wstring wsString = L"5owns6"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"5\u220B6"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDlarrow) +{ + std::wstring wsString = L"7 dlarrow 8"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"7\u21D08"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDlrarrow) +{ + std::wstring wsString = L"9 dlrarrow 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"9\u21D410"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDrarrow) +{ + std::wstring wsString = L"11drarrow12"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"11\u21D212"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionEquals) +{ + std::wstring wsString = L"13=14"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"13=14"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionNotequals) +{ + std::wstring wsString = L"15 <> 16"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"15\u226016"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionLearrow) +{ + std::wstring wsString = L"17<18"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"17<18"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionLearrowequals) +{ + std::wstring wsString = L"19<= 20"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"19\u226420"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionRiarrow) +{ + std::wstring wsString = L"21 >22"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"21>22"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionRiarrowequals) +{ + std::wstring wsString = L"23 >=24"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"23\u226524"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDllearrow) +{ + std::wstring wsString = L"25 <<26"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"25\u226A26"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDlriarrow) +{ + std::wstring wsString = L"27 >> 28"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"27\u226B28"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionApprox) +{ + std::wstring wsString = L"29 approx30"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"29\u224830"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSim) +{ + std::wstring wsString = L"31sim 32"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"31\u223C32"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSimeq) +{ + std::wstring wsString = L"33 simeq 34"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"33\u224334"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionEquiv) +{ + std::wstring wsString = L"35 equiv 36"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"35\u226136"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionProp) +{ + std::wstring wsString = L"37 prop 38"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"37\u221D38"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionParallel) +{ + std::wstring wsString = L"39 parallel 40"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"39\u222540"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionOrtho) +{ + std::wstring wsString = L"41ortho42"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"41\u22A542"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDivides) +{ + std::wstring wsString = L"43 divides 44"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"43\u222344"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionNdivides) +{ + std::wstring wsString = L"45 ndivides 46"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"45\u222446"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionToward) +{ + std::wstring wsString = L"47 toward 48"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"47\u219248"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionTransl) +{ + std::wstring wsString = L"49 transl 50"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"49\u22B750"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionTransr) +{ + std::wstring wsString = L"51 transr 52"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"51\u22B652"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDef) +{ + std::wstring wsString = L"53def54"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"53\u225D54"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionPrec) +{ + std::wstring wsString = L"55prec56"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"55\u227A56"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSucc) +{ + std::wstring wsString = L"57 succ 58"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"57\u227B58"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionPreccurlyeq) +{ + std::wstring wsString = L"59 preccurlyeq 60"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"59\u227C60"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSucccurlyeq) +{ + std::wstring wsString = L"61 succcurlyeq 62"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"61\u227D62"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionPrecsim) +{ + std::wstring wsString = L"63 precsim 64"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"63\u227E64"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSuccsim) +{ + std::wstring wsString = L"65 succsim 66"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"65\u227F66"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionNprec) +{ + std::wstring wsString = L"67nprec68"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"67\u228068"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionNsucc) +{ + std::wstring wsString = L"69nsucc70"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"69\u228170"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index b71ecf436d..1410f92e47 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -20,85 +20,85 @@ namespace StarMath { // oFile.WriteStringUTF8(m_oXmlWrite->GetXmlString()); // oFile.CloseFile(); } - void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* oXmlWrite) + void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite) { - oXmlWrite->WriteNodeBegin(L"w:rPr",false); - oXmlWrite->WriteNodeBegin(L"w:rFonts",true); - oXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - oXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); - oXmlWrite->WriteNodeEnd(L"w",true,true); - oXmlWrite->WriteNodeBegin(L"w:sz",true); - oXmlWrite->WriteAttribute(L"w:val",L"40"); - oXmlWrite->WriteNodeEnd(L"w",true,true); - oXmlWrite->WriteNodeBegin(L"w:szCs",true); - oXmlWrite->WriteAttribute(L"w:val",L"40"); - oXmlWrite->WriteNodeEnd(L"w",true,true); - oXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + pXmlWrite->WriteNodeBegin(L"w:rPr",false); + pXmlWrite->WriteNodeBegin(L"w:rFonts",true); + pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:sz",true); + pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:szCs",true); + pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); } - void CConversionSMtoOOXML::PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* oXmlWrite) + void CConversionSMtoOOXML::PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite) { - oXmlWrite->WriteNodeBegin(L"m:fPr",false); + pXmlWrite->WriteNodeBegin(L"m:fPr",false); if(bType) { - oXmlWrite->WriteNodeBegin(L"m:type",true); - oXmlWrite->WriteAttribute(L"m:val",wsType); - oXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:type",true); + pXmlWrite->WriteAttribute(L"m:val",wsType); + pXmlWrite->WriteNodeEnd(L"w",true,true); } - oXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - oXmlWrite->WriteNodeBegin(L"w:rPr",false); - oXmlWrite->WriteNodeBegin(L"w:rFonts",true); - oXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - oXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); - oXmlWrite->WriteNodeEnd(L"w",true,true); - oXmlWrite->WriteNode(L"w:i",L""); - //m_oXmlWrite->WriteNode(L"w:iCs",L""); - oXmlWrite->WriteNodeBegin(L"w:sz",true); - oXmlWrite->WriteAttribute(L"w:val",L"40"); - oXmlWrite->WriteNodeEnd(L"w",true,true); - oXmlWrite->WriteNodeBegin(L"w:szCs",true); - oXmlWrite->WriteAttribute(L"w:val",L"40"); - oXmlWrite->WriteNodeEnd(L"w",true,true); - oXmlWrite->WriteNodeEnd(L"w:rPr",false,false); - oXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); - oXmlWrite->WriteNodeEnd(L"m:fPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + pXmlWrite->WriteNodeBegin(L"w:rPr",false); + pXmlWrite->WriteNodeBegin(L"w:rFonts",true); + pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNode(L"w:i",L""); + //m_pXmlWrite->WriteNode(L"w:iCs",L""); + pXmlWrite->WriteNodeBegin(L"w:sz",true); + pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:szCs",true); + pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:fPr",false,false); } - void CConversionSMtoOOXML::PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* oXmlWrite) + void CConversionSMtoOOXML::PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite) { - oXmlWrite->WriteNodeBegin(L"m:naryPr",false); - oXmlWrite->WriteNodeBegin(L"m:chr",true); - oXmlWrite->WriteAttribute(L"m:val",wsTypeOperator); - oXmlWrite->WriteNodeEnd(L"w",true,true); - oXmlWrite->WriteNodeBegin(L"m:limLoc",true); - oXmlWrite->WriteAttribute(L"m:val",L"undOvr"); - oXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:naryPr",false); + pXmlWrite->WriteNodeBegin(L"m:chr",true); + pXmlWrite->WriteAttribute(L"m:val",wsTypeOperator); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:limLoc",true); + pXmlWrite->WriteAttribute(L"m:val",L"undOvr"); + pXmlWrite->WriteNodeEnd(L"w",true,true); if(bEmptySub) { - oXmlWrite->WriteNodeBegin(L"m:subHide",true); - oXmlWrite->WriteAttribute(L"m:val",L"1"); - oXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:subHide",true); + pXmlWrite->WriteAttribute(L"m:val",L"1"); + pXmlWrite->WriteNodeEnd(L"w",true,true); } if(bEmptySup) { - oXmlWrite->WriteNodeBegin(L"m:supHide",true); - oXmlWrite->WriteAttribute(L"m:val",L"1"); - oXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:supHide",true); + pXmlWrite->WriteAttribute(L"m:val",L"1"); + pXmlWrite->WriteNodeEnd(L"w",true,true); } - oXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - oXmlWrite->WriteNodeBegin(L"w:rPr",false); - oXmlWrite->WriteNodeBegin(L"w:rFonts",true); - oXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - oXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); - oXmlWrite->WriteNodeEnd(L"w",true,true); - oXmlWrite->WriteNode(L"w:i",L""); - oXmlWrite->WriteNodeEnd(L"w:rPr",false,false); - oXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); - oXmlWrite->WriteNodeEnd(L"m:naryPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + pXmlWrite->WriteNodeBegin(L"w:rPr",false); + pXmlWrite->WriteNodeBegin(L"w:rFonts",true); + pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNode(L"w:i",L""); + pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:naryPr",false,false); } - void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *CValueBlock,XmlUtils::CXmlWriter* oXmlWrite) + void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *CValueBlock,XmlUtils::CXmlWriter* pXmlWrite) { - oXmlWrite->WriteNodeBegin(wsNameBlock,false); - CValueBlock->ConversionToOOXML(oXmlWrite); - oXmlWrite->WriteNodeEnd(wsNameBlock,false,false); + pXmlWrite->WriteNodeBegin(wsNameBlock,false); + CValueBlock->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameBlock,false,false); } std::wstring CConversionSMtoOOXML::GetOOXML() { @@ -106,9 +106,17 @@ namespace StarMath { } void CConversionSMtoOOXML::EndConversion() { - //m_oXmlWrite->WriteNodeEnd(L"m:r",false,false); + //m_pXmlWrite->WriteNodeEnd(L"m:r",false,false); m_oXmlWrite->WriteNodeEnd(L"m:oMath",false,false); m_oXmlWrite->WriteNodeEnd(L"m:oMathPara",false,false); } + void CConversionSMtoOOXML::PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:funcPr", false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr", false); + StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr", false,false); + pXmlWrite->WriteNodeEnd(L"m:funcPr",false,false); + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 975c7f630f..09e23d500f 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -11,10 +11,11 @@ namespace StarMath { public: CConversionSMtoOOXML(); void StartConversion(std::vector arPars); - static void StandartProperties(XmlUtils::CXmlWriter* oXmlWrite); - static void PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* oXmlWrite); - static void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* m_oXmlWrite); - static void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock,XmlUtils::CXmlWriter* oXmlWrite); + static void StandartProperties(XmlUtils::CXmlWriter* pXmlWrite); + static void PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite); + static void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite); + static void PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite); + static void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock,XmlUtils::CXmlWriter* pXmlWrite); void EndConversion(); std::wstring GetOOXML() ; private: diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 8f31a51c1d..d9f2bdcd64 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -12,7 +12,7 @@ namespace StarMath CElement* pTempElement = ParseElement(pReader); if(nullptr == pTempElement) break; - if(!m_arEquation.empty() && (pTempElement->GetBaseType() == TypeElement::BinOperator || pTempElement->GetBaseType() == TypeElement::SetOperations || pTempElement->GetBaseType() == TypeElement::Connection) ) + if(!m_arEquation.empty() && CheckForLeftArgument(pTempElement->GetBaseType()) ) { AddLeftArgument(m_arEquation.back(),pTempElement); m_arEquation.pop_back(); @@ -45,7 +45,7 @@ namespace StarMath if(pElement != nullptr) { pElement->SetAttribute(arAttributes); - pReader->ClearWString(); + pReader->ClearReader(); pElement->Parse(pReader); // if(CheckingTheNextElement(itStart,itEnd,CIndex::IsIndex)) // { @@ -60,9 +60,9 @@ namespace StarMath template void SetLeft(CElement *pLeftArg, CElement *pElementWhichAdd) { - T* pBinOpElement = dynamic_cast(pElementWhichAdd); - pBinOpElement->SetLeftArg(pLeftArg); - pElementWhichAdd = pBinOpElement; + T* pTempElement = dynamic_cast(pElementWhichAdd); + pTempElement->SetLeftArg(pLeftArg); + pElementWhichAdd = pTempElement; } void CParserStarMathString::AddLeftArgument(CElement *pLeftArg, CElement *pElementWhichAdd) @@ -84,6 +84,11 @@ namespace StarMath SetLeft(pLeftArg,pElementWhichAdd); break; } + case TypeElement::BracketWithIndex: + { + SetLeft(pLeftArg,pElementWhichAdd); + break; + } default: break; } @@ -93,7 +98,7 @@ namespace StarMath CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - while(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::SetOperations || pReader->GetGlobalType() == TypeElement::Connection) + while(CheckForLeftArgument(pReader->GetGlobalType())) { CElement* pSecondTempElement = CParserStarMathString::ParseElement(pReader); if(pFirstTempElement != nullptr) @@ -109,6 +114,22 @@ namespace StarMath } return pFirstTempElement; } + bool CParserStarMathString::CheckForLeftArgument(const TypeElement &enType) + { + switch(enType) + { + case TypeElement::BinOperator: + return true; + case TypeElement::Connection: + return true; + case TypeElement::SetOperations: + return true; + case TypeElement::BracketWithIndex: + return true; + default: + return false; + } + } //class methods CAttribute CAttribute::~CAttribute() {} @@ -283,6 +304,14 @@ namespace StarMath return new CElementBracket(pReader->GetLocalType()); case TypeElement::Operation: return new CElementOperator(pReader->GetLocalType()); + case TypeElement::BracketWithIndex: + return new CElementBracketWithIndex(pReader->GetLocalType()); + case TypeElement::Grade: + return new CElementGrade(); + case TypeElement::Matrix: + return new CElementMatrix(pReader->GetLocalType()); + case TypeElement::SpecialSymbol: + return new CElementSpecialSymbol(pReader->GetLocalType()); default: return nullptr; } @@ -317,7 +346,7 @@ namespace StarMath } void CElementString::Parse(CStarMathReader* pReader) { - pReader->ClearWString(); + pReader->ClearReader(); } void CElementString::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) { @@ -336,7 +365,7 @@ namespace StarMath { for(wchar_t cOneElement: wsToken) { - if(!isdigit(cOneElement)) return TypeElement::undefine; + if(!isdigit(cOneElement) || L'\0' == cOneElement) return TypeElement::undefine; } return TypeElement::String; } @@ -361,7 +390,7 @@ namespace StarMath } void CElementBinOperator::Parse(CStarMathReader* pReader) { - if(pReader->GetLocalType() == TypeElement::frac) + if(m_enTypeBinOp == TypeElement::frac) { SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader)); SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader)); @@ -371,7 +400,7 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) + if(IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex) { CElement* pBinOp = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); @@ -498,6 +527,7 @@ namespace StarMath CElementBracket::CElementBracket(const TypeElement& enType) { m_enTypeBracket = enType; + SetBaseType(TypeElement::Bracket); } CElementBracket::~CElementBracket() { @@ -536,7 +566,6 @@ namespace StarMath else if(L"right" == wsToken) return TypeElement::right; else return TypeElement::undefine; } - //сделать не через SetTypesToken,а локальную переменную и через нее определять конец скобок void CElementBracket::Parse(CStarMathReader* pReader) { pReader->GetToken(); @@ -548,7 +577,7 @@ namespace StarMath while(enBracketClose == TypeElement::undefine) { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - if(!m_arBrecketValue.empty() && (pTempElement->GetBaseType() == TypeElement::BinOperator || pTempElement->GetBaseType() == TypeElement::SetOperations) ) + if(!m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType())) { CParserStarMathString::AddLeftArgument(m_arBrecketValue.back(),pTempElement); m_arBrecketValue.pop_back(); @@ -566,7 +595,7 @@ namespace StarMath else enBracketClose = GetBracketClose(pReader->GetString()); } //доработать() - pReader->ClearWString(); + pReader->ClearReader(); } void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -576,12 +605,26 @@ namespace StarMath CElementSpecialSymbol::CElementSpecialSymbol(const TypeElement &enType) { m_enTypeSpecial = enType; + SetBaseType(TypeElement::SpecialSymbol); } CElementSpecialSymbol::~CElementSpecialSymbol() {} void CElementSpecialSymbol::Parse(CStarMathReader* pReader) { } + TypeElement CElementSpecialSymbol::GetSpecialSymbol(const std::wstring &wsToken) + { + if(L"emptyset" == wsToken) return TypeElement::emptyset; + else if(L"aleph" == wsToken) return TypeElement::aleph; + else if(L"setN" == wsToken) return TypeElement::setN; + else if(L"setZ" == wsToken) return TypeElement::setZ; + else if(L"setQ" == wsToken) return TypeElement::setQ; + else if(L"setR" == wsToken) return TypeElement::setR; + else if(L"setc" == wsToken) return TypeElement::setC; + else return TypeElement::undefine; + } + void CElementSpecialSymbol::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + {} //class methods CElementSetOperations CElementSetOperations::CElementSetOperations(const TypeElement &enType): m_pRightArgument(nullptr), m_pLeftArgument(nullptr) { @@ -614,7 +657,7 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(pReader->GetGlobalType() == TypeElement::BinOperator) + if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex) { CElement* pBinOpElement = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOpElement); @@ -624,14 +667,70 @@ namespace StarMath } void CElementSetOperations::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - + m_pLeftArgument->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:r", false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:t",false); + switch(m_enTypeSet) + { + case TypeElement::Union: + pXmlWrite->WriteString(L"\u22C3"); + break; + case TypeElement::intersection: + pXmlWrite->WriteString(L"\u22C2"); + break; + case TypeElement::setminus: + pXmlWrite->WriteString(L"\u2216"); + break; + case TypeElement::setquotient: + pXmlWrite->WriteString(L"\u2215"); + break; + case TypeElement::subset: + pXmlWrite->WriteString(L"\u2282"); + break; + case TypeElement::subseteq: + pXmlWrite->WriteString(L"\u2286"); + break; + case TypeElement::supset: + pXmlWrite->WriteString(L"\u2283"); + break; + case TypeElement::supseteq: + pXmlWrite->WriteString(L"\u2287"); + break; + case TypeElement::nsubset: + pXmlWrite->WriteString(L"\u2284"); + break; + case TypeElement::nsubseteq: + pXmlWrite->WriteString(L"\u2288"); + break; + case TypeElement::nsupset: + pXmlWrite->WriteString(L"\u2285"); + break; + case TypeElement::nsupseteq: + pXmlWrite->WriteString(L"\u2289"); + break; + case TypeElement::in: + pXmlWrite->WriteString(L"\u2208"); + break; + case TypeElement::owns: + pXmlWrite->WriteString(L"\u220B"); + break; + case TypeElement::notin: + pXmlWrite->WriteString(L"\u2209"); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + m_pRightArgument->ConversionToOOXML(pXmlWrite); } TypeElement CElementSetOperations::GetSetOperation(const std::wstring &wsToken) { if(L"intersection" == wsToken) return TypeElement::intersection; else if(L"union" == wsToken) return TypeElement::Union; else if(L"setminus" == wsToken) return TypeElement::setminus; - else if(L"setquoyient" == wsToken) return TypeElement::setquoyient; + else if(L"setquotient" == wsToken) return TypeElement::setquotient; else if(L"subseteq" == wsToken) return TypeElement::subseteq; else if(L"subset" == wsToken) return TypeElement::subset; else if(L"supset" == wsToken) return TypeElement::supset; @@ -639,7 +738,7 @@ namespace StarMath else if(L"nsubset" == wsToken) return TypeElement::nsubset; else if(L"nsubseteq" == wsToken) return TypeElement::nsubseteq; else if(L"nsupset" == wsToken) return TypeElement::nsupset; - else if(L"nsubseteq" == wsToken) return TypeElement::nsubseteq; + else if(L"nsupseteq" == wsToken) return TypeElement::nsupseteq; else if(L"in" == wsToken) return TypeElement::in; else if(L"notin" == wsToken) return TypeElement::notin; else if(L"owns" == wsToken) return TypeElement::owns; @@ -677,7 +776,7 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(pReader->GetGlobalType() == TypeElement::BinOperator) + if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex) { CElement* pBinOp = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); @@ -685,9 +784,117 @@ namespace StarMath } else SetRightArg(pTempElement); } + //absent leslant,geslant and toward void CElementConnection::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - + m_pLeftArgument->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:t",false); + switch(m_enTypeCon) + { + case TypeElement::equals: + pXmlWrite->WriteString(L"="); + break; + case TypeElement::notequals: + pXmlWrite->WriteString(L"\u2260"); + break; + case TypeElement::learrow: + pXmlWrite->WriteString(L"<"); + break; + case TypeElement::learrowequals: + pXmlWrite->WriteString(L"\u2264"); + break; + case TypeElement::riarrow: + pXmlWrite->WriteString(L">"); + break; + case TypeElement::riarrowequals: + pXmlWrite->WriteString(L"\u2265"); + break; + case TypeElement::dllearrow: + pXmlWrite->WriteString(L"\u226A"); + break; + case TypeElement::dlriarrow: + pXmlWrite->WriteString(L"\u226B"); + break; + case TypeElement::dlrarrow: + pXmlWrite->WriteString(L"\u21D4"); + break; + case TypeElement::drarrow: + pXmlWrite->WriteString(L"\u21D2"); + break; + case TypeElement::dlarrow: + pXmlWrite->WriteString(L"\u21D0"); + break; + case TypeElement::prec: + pXmlWrite->WriteString(L"\u227A"); + break; + case TypeElement::succ: + pXmlWrite->WriteString(L"\u227B"); + break; + case TypeElement::preccurlyeq: + pXmlWrite->WriteString(L"\u227C"); + break; + case TypeElement::succcurlyeq: + pXmlWrite->WriteString(L"\u227D"); + break; + case TypeElement::precsim: + pXmlWrite->WriteString(L"\u227E"); + break; + case TypeElement::succsim: + pXmlWrite->WriteString(L"\u227F"); + break; + case TypeElement::nprec: + pXmlWrite->WriteString(L"\u2280"); + break; + case TypeElement::nsucc: + pXmlWrite->WriteString(L"\u2281"); + break; + case TypeElement::approx: + pXmlWrite->WriteString(L"\u2248"); + break; + case TypeElement::sim: + pXmlWrite->WriteString(L"\u223C"); + break; + case TypeElement::simeq: + pXmlWrite->WriteString(L"\u2243"); + break; + case TypeElement::equiv: + pXmlWrite->WriteString(L"\u2261"); + break; + case TypeElement::prop: + pXmlWrite->WriteString(L"\u221D"); + break; + case TypeElement::parallel: + pXmlWrite->WriteString(L"\u2225"); + break; + case TypeElement::ortho: + pXmlWrite->WriteString(L"\u22A5"); + break; + case TypeElement::divides: + pXmlWrite->WriteString(L"\u2223"); + break; + case TypeElement::ndivides: + pXmlWrite->WriteString(L"\u2224"); + break; + case TypeElement::toward: + pXmlWrite->WriteString(L"\u2192"); + break; + case TypeElement::transl: + pXmlWrite->WriteString(L"\u22B7"); + break; + case TypeElement::transr: + pXmlWrite->WriteString(L"\u22B6"); + break; + case TypeElement::def: + pXmlWrite->WriteString(L"\u225D"); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:t", false, false); + pXmlWrite->WriteNodeEnd(L"m:r",false ,false); + m_pRightArgument->ConversionToOOXML(pXmlWrite); } TypeElement CElementConnection::GetConnection(const std::wstring& wsToken) { @@ -786,11 +993,80 @@ namespace StarMath void CElementFunction::Parse(CStarMathReader* pReader) { SetValueFunction(CParserStarMathString::ParseElement(pReader)); - pReader->ClearWString(); + pReader->ClearReader(); } void CElementFunction::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - + pXmlWrite->WriteNodeBegin(L"m:func",false); + CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:fName",false); + pXmlWrite->WriteNodeBegin(L"m:r",false); + pXmlWrite->WriteNodeBegin(L"m:rPr",false); + pXmlWrite->WriteNodeBegin(L"m:sty",true); + pXmlWrite->WriteAttribute(L"m:val",L"p"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"m:rPr",false,false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:t",false); + switch (m_enTypeFunction) { + case TypeElement::cos: + pXmlWrite->WriteString(L"cos"); + break; + case TypeElement::sin: + pXmlWrite->WriteString(L"sin"); + break; + case TypeElement::tan: + pXmlWrite->WriteString(L"tan"); + break; + case TypeElement::cot: + pXmlWrite->WriteString(L"cot"); + break; + case TypeElement::sinh: + pXmlWrite->WriteString(L"sinh"); + break; + case TypeElement::cosh: + pXmlWrite->WriteString(L"cosh"); + break; + case TypeElement::tanh: + pXmlWrite->WriteString(L"tanh"); + break; + case TypeElement::coth: + pXmlWrite->WriteString(L"coth"); + break; + case TypeElement::arcsin: + pXmlWrite->WriteString(L"arcsin"); + break; + case TypeElement::arccos: + pXmlWrite->WriteString(L"arccos"); + break; + case TypeElement::arctan: + pXmlWrite->WriteString(L"arctan"); + break; + case TypeElement::arccot: + pXmlWrite->WriteString(L"arccot"); + break; + case TypeElement::arsinh: + pXmlWrite->WriteString(L"arsinh"); + break; + case TypeElement::arcosh: + pXmlWrite->WriteString(L"arcosh"); + break; + case TypeElement::artanh: + pXmlWrite->WriteString(L"artanh"); + break; + case TypeElement::arcoth: + pXmlWrite->WriteString(L"arcoth"); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + pXmlWrite->WriteNodeEnd(L"m:fName",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + m_pValue->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:func",false,false); } TypeElement CElementFunction::GetFunction(const std::wstring &wsToken) { @@ -882,12 +1158,12 @@ namespace StarMath pReader->SetTypesToken(); if(pReader->GetLocalType() == TypeElement::from) { - pReader->ClearWString(); + pReader->ClearReader(); SetFromValue(CParserStarMathString::ReadingWithoutBracket(pReader)); } if(pReader->GetLocalType() == TypeElement::to) { - pReader->ClearWString(); + pReader->ClearReader(); SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader)); } @@ -944,6 +1220,24 @@ namespace StarMath m_enGlobalType = TypeElement::Operation; return; } + m_enUnderType = CElementBracketWithIndex::GetBracketWithIndex(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::BracketWithIndex; + return; + } + m_enUnderType = CElementGrade::GetGrade(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Grade; + return; + } + m_enUnderType=CElementMatrix::GetMatrix(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Matrix; + return; + } m_enUnderType = CElementBracket::GetBracketOpen(m_wsToken); if(m_enUnderType != TypeElement::undefine) { @@ -956,6 +1250,12 @@ namespace StarMath m_enGlobalType = TypeElement::String; return; } + m_enUnderType = CElementSpecialSymbol::GetSpecialSymbol(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::SpecialSymbol; + return; + } m_enUnderType = CElementBinOperator::GetBinOperator(m_wsToken); if(m_enUnderType != TypeElement::undefine) { @@ -1011,9 +1311,11 @@ namespace StarMath // std::wstring wsNextElement = CParserStarMathString::GetElement(m_itStart,m_itEnd); // } // } - void CStarMathReader::ClearWString() + void CStarMathReader::ClearReader() { m_wsToken.clear(); + m_enGlobalType = TypeElement::Empty; + m_enUnderType = TypeElement::Empty; } bool CStarMathReader::EmptyString() { @@ -1053,6 +1355,131 @@ namespace StarMath if(!m_wsElement.empty()) return m_wsElement; else return {}; } +//class methods CElementBracketWithIndex + CElementBracketWithIndex::CElementBracketWithIndex(const TypeElement &enType): m_pLeftArg(nullptr), m_pValue(nullptr) + { + m_enTypeBracketWithIndex = enType; + SetBaseType(TypeElement::BracketWithIndex); + } + CElementBracketWithIndex::~CElementBracketWithIndex() + { + delete m_pLeftArg; + delete m_pValue; + } + void CElementBracketWithIndex::SetLeftArg(CElement *pElement) + { + m_pLeftArg = pElement; + } + void CElementBracketWithIndex::SetBracketValue(CElement *pElement) + { + m_pValue = pElement; + } + void CElementBracketWithIndex::Parse(CStarMathReader *pReader) + { + SetBracketValue(CParserStarMathString::ParseElement(pReader)); + } + void CElementBracketWithIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + + } + TypeElement CElementBracketWithIndex::GetBracketWithIndex(const std::wstring &wsToken) + { + if(L"overbrace" == wsToken) return TypeElement::overbrace; + else if(L"underbrace" == wsToken) return TypeElement::underbrace; + else return TypeElement::undefine; + } +//class methods CElementGrade + CElementGrade::CElementGrade(): m_pValueFrom(nullptr), m_pValueGrade(nullptr), m_pValueTo(nullptr) + { + SetBaseType(TypeElement::Grade); + } + CElementGrade::~CElementGrade() + { + delete m_pValueFrom; + delete m_pValueTo; + delete m_pValueGrade; + } + void CElementGrade::SetValueFrom(CElement* pElement) + { + m_pValueFrom = pElement; + } + void CElementGrade::SetValueTo(CElement *pElement) + { + m_pValueTo = pElement; + } + void CElementGrade::SetValueGrade(CElement *pElement) + { + m_pValueGrade = pElement; + } + void CElementGrade::Parse(CStarMathReader *pReader) + { + SetValueGrade(CParserStarMathString::ParseElement(pReader)); + pReader->GetToken(); + pReader->SetTypesToken(); + if(pReader->GetLocalType() == TypeElement::from) + { + pReader->ClearReader(); + SetValueFrom(CParserStarMathString::ParseElement(pReader)); + pReader->GetToken(); + pReader->SetTypesToken(); + } + if(pReader->GetLocalType() == TypeElement::to) + { + pReader->ClearReader(); + SetValueTo(CParserStarMathString::ParseElement(pReader)); + } + } + void CElementGrade::ConversionToOOXML(XmlUtils::CXmlWriter *oXmlWrite) + { + + } + TypeElement CElementGrade::GetGrade(const std::wstring &wsToken) + { + if(L"evaluate" == wsToken) return TypeElement::evaluate; + else return TypeElement::undefine; + } +//class methods CElementMatrix + CElementMatrix::CElementMatrix(const TypeElement &enType): m_pFirstArgument(nullptr), m_pSecondArgument(nullptr) + { + m_enTypeMatrix = enType; + SetBaseType(TypeElement::Matrix); + } + CElementMatrix::~CElementMatrix() + { + delete m_pFirstArgument; + delete m_pSecondArgument; + } + void CElementMatrix::SetFirstArgument(CElement *pElement) + { + m_pFirstArgument = pElement; + } + void CElementMatrix::SetSecondArgument(CElement *pElement) + { + m_pSecondArgument = pElement; + } + TypeElement CElementMatrix::GetMatrix(const std::wstring &wsToken) + { + if(L"binom" == wsToken) return TypeElement::binom; + else if(L"stack" == wsToken) return TypeElement::stack; + else if(L"matrix" == wsToken) return TypeElement::matrix; + else return TypeElement::undefine; + } + void CElementMatrix::Parse(CStarMathReader *pReader) + { + if(m_enTypeMatrix == TypeElement::binom) + { + SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader)); + } + else + { + SetFirstArgument(CParserStarMathString::ParseElement(pReader)); + } + } + void CElementMatrix::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index f10bd3d1b8..a2d01986a0 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -23,7 +23,7 @@ namespace StarMath TypeElement GetLocalType(); std::wstring GetString(); //clearing a variable m_wsToken - void ClearWString(); + void ClearReader(); bool CheckIteratorPosition(); bool EmptyString(); private: @@ -137,6 +137,23 @@ namespace StarMath TypeElement m_enTypeOperator; }; + class CElementGrade: public CElement + { + public: + CElementGrade(); + virtual ~CElementGrade(); + void SetValueGrade(CElement* pElement); + void SetValueFrom(CElement* pElement); + void SetValueTo(CElement* pElement); + static TypeElement GetGrade(const std::wstring& wsToken); + private: + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; + CElement* m_pValueGrade; + CElement* m_pValueFrom; + CElement* m_pValueTo; + }; + class CElementBracket: public CElement { public: @@ -146,12 +163,28 @@ namespace StarMath static TypeElement GetBracketOpen(const std::wstring& wsToken); private: void Parse(CStarMathReader* pReader) override; - void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite); + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; TypeElement GetBracketClose(const std::wstring& wsToken); TypeElement m_enTypeBracket; std::vector m_arBrecketValue; }; + class CElementBracketWithIndex: public CElement + { + public: + CElementBracketWithIndex(const TypeElement& enType); + virtual ~CElementBracketWithIndex(); + void SetLeftArg(CElement* pElement); + void SetBracketValue(CElement* pElement); + static TypeElement GetBracketWithIndex(const std::wstring& wsToken); + private: + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pLeftArg; + CElement* m_pValue; + TypeElement m_enTypeBracketWithIndex; + }; + class CElementSetOperations: public CElement { public: @@ -208,11 +241,29 @@ namespace StarMath public: CElementSpecialSymbol(const TypeElement& enType); virtual ~CElementSpecialSymbol(); + static TypeElement GetSpecialSymbol(const std::wstring& wsToken); private: void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; TypeElement m_enTypeSpecial; }; + class CElementMatrix: public CElement + { + public: + CElementMatrix(const TypeElement& enType); + virtual ~CElementMatrix(); + void SetFirstArgument(CElement* pElement); + void SetSecondArgument(CElement* pElement); + static TypeElement GetMatrix(const std::wstring& wsToken); + private: + void Parse(CStarMathReader *pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pFirstArgument; + CElement* m_pSecondArgument; + TypeElement m_enTypeMatrix; + }; + class CParserStarMathString { public: @@ -220,6 +271,7 @@ namespace StarMath static CElement* ParseElement(CStarMathReader* pReader); //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). static void AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); + static bool CheckForLeftArgument(const TypeElement& enType); static CElement* ReadingWithoutBracket(CStarMathReader* pReader); private: std::vector m_arEquation; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index 038e89d5a4..c12a5fbad0 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -10,6 +10,8 @@ enum class TypeElement{ SetOperations, Operator, Bracket, + BracketWithIndex, + Grade, //BracketEnd, UnarSign, Attribute, @@ -120,7 +122,7 @@ enum class TypeElement{ intersection, Union, setminus, - setquoyient, + setquotient, subseteq, subset, supset, @@ -167,7 +169,7 @@ enum class TypeElement{ dlarrow, dlrarrow, drarrow, - // + //SpecialSymbol emptyset, aleph, setN, @@ -175,6 +177,7 @@ enum class TypeElement{ setQ, setR, setC, + // infinity, partial, nabla, @@ -239,6 +242,11 @@ enum class TypeElement{ //op from, to, + //bracketWithIndex + overbrace, + underbrace, + //grade + evaluate, }; } #endif // TYPESELEMENTS_H From 5533ac8a591536ceaec8529fefc55f56ca5a6875 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 1 Dec 2023 16:27:26 +0300 Subject: [PATCH 012/117] Adding conversion of brackets, matrices, scores and indexes. Tests. --- .../StarMath2OOXML/TestSMConverter/main.cpp | 322 +++++++++++++++ .../StarMath2OOXML/cconversionsmtoooxml.cpp | 92 +++++ .../StarMath2OOXML/cconversionsmtoooxml.h | 4 + .../StarMath2OOXML/cstarmathpars.cpp | 376 +++++++++++------- .../Converter/StarMath2OOXML/cstarmathpars.h | 24 +- .../Converter/StarMath2OOXML/typeselements.h | 3 +- 6 files changed, 673 insertions(+), 148 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index 3e38e5b8ee..41495fe80e 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -613,3 +613,325 @@ TEST(SMConvectorTest,ConnectionNsucc) std::wstring wsXmlString = L"69\u228170"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } + +TEST(SMConvectorTest,BracketRound) +{ + std::wstring wsString = L"(2+3)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2+3"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketSquare) +{ + std::wstring wsString = L"[4-5]"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"4-5"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLdbracket) +{ + std::wstring wsString = L"ldbracket 6+7 rdbracket"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"6+7"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLbrace) +{ + std::wstring wsString = L"lbrace 8 - 9 rbrace"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"8-9"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLangle) +{ + std::wstring wsString = L"langle 10 over 11 rangle"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1011"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLceil) +{ + std::wstring wsString = L"lceil 12 ominus 13 rceil"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"12\u229613"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLfloor) +{ + std::wstring wsString = L"lfloor 14 union 15 rfloor"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"14\u22C315"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLline) +{ + std::wstring wsString = L"lline 16 / 17 rline"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1617"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLdline) +{ + std::wstring wsString = L"ldline 18 oplus 19 rdline"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"18\u229519"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionCos) +{ + std::wstring wsString = L"cos{2+3}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"cos2+3"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionSin) +{ + std::wstring wsString = L"sin 4 over 5"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"sin45"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionTan) +{ + std::wstring wsString = L"tan{6 / 7}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"tan67"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionCot) +{ + std::wstring wsString = L"cot(8 over 9)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"cot89"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionSinh) +{ + std::wstring wsString = L"sinh 2 supset 3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"sinh2\u22833"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionCosh) +{ + std::wstring wsString = L"cosh 2 + 3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"cosh2+3"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionTanh) +{ + std::wstring wsString = L"tanh(11otimes12)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"tanh11\u229712"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionCoth222) +{ + std::wstring wsString = L"coth222"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"coth222"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArcsin) +{ + std::wstring wsString = L"arcsin{13 ominus 14}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arcsin13\u229614"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArccos) +{ + std::wstring wsString = L"arccos{15 - 16}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arccos15-16"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArctan) +{ + std::wstring wsString = L"arctan 17 over 18"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arctan1718"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArccot) +{ + std::wstring wsString = L"arccot 20 + 30"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arccot20+30"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArsinh) +{ + std::wstring wsString = L"{arsinh{2/3}} over sum from 1 to 5 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arsinh231510"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArcosh) +{ + std::wstring wsString = L"35 + 27 over {arcosh binom 23 78}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"35+27arcosh2378"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArtanhArcoth) +{ + std::wstring wsString = L"arcoth 30 subset {artanh 27}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arcoth30\u2282artanh27"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,MatrixBinom) +{ + std::wstring wsString = L"binom{2 over 7 supset 277}{arcoth 89}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"27\u2283277arcoth89"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,MatrixMatrix) +{ + std::wstring wsString = L"matrix{2 / 8 -5 # sum from 2 over 10 union 3 to 10*10 100 ## cosh(10) # 2 oplus 10over100 }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"28-5210\u22C3310*10100cosh102\u229510100"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,MatrixStack) +{ + std::wstring wsString = L"stack{2 over 10 # binom 2 3 # matrix{1 # 2 ## 3 # 4}}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"210231234"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexLower) +{ + std::wstring wsString = L"25 over 1 _ 2 "; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2512"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexUpper) +{ + std::wstring wsString = L"{binom {cos 5} 2 over 4 }^ 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"cos52410"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexLsup) +{ + std::wstring wsString = L"{2 over 7} lsup binom 2+3 {cos 15}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2+3cos1527"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexLsub) +{ + std::wstring wsString = L"2222^10 lsub 2 over 3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"22222103"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +//TEST(SMConvectorTest,FunctionCos) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString = L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 1410f92e47..8a37899866 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -118,5 +118,97 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"m:ctrlPr", false,false); pXmlWrite->WriteNodeEnd(L"m:funcPr",false,false); } + + void CConversionSMtoOOXML::PropertiesDPr(XmlUtils::CXmlWriter *pXmlWrite, const TypeElement &enTypeBracket) + { + pXmlWrite->WriteNodeBegin(L"m:dPr",false); + switch(enTypeBracket) + { + case TypeElement::langle: + BracketTypeNotation(L"\u2329",L"\u232A",pXmlWrite); + break; + case TypeElement::square: + BracketTypeNotation(L"\u005B",L"\u005D",pXmlWrite); + break; + case TypeElement::ldbracket: + BracketTypeNotation(L"\u27E6",L"\u27E7",pXmlWrite); + break; + case TypeElement::lbrace: + BracketTypeNotation(L"\u007B",L"\u007D",pXmlWrite); + break; + case TypeElement::lceil: + BracketTypeNotation(L"\u23A1",L"\u23A4",pXmlWrite); + break; + case TypeElement::lfloor: + BracketTypeNotation(L"\u23A3",L"\u23A6",pXmlWrite); + break; + case TypeElement::lline: + BracketTypeNotation(L"\u23AA",L"\u23AA",pXmlWrite); + break; + case TypeElement::ldline: + BracketTypeNotation(L"\u2016",L"\u2016",pXmlWrite); + break; + } + pXmlWrite->WriteNodeBegin(L"m:ctrlPr"); + StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:dPr",false,false); + } + void CConversionSMtoOOXML::BracketTypeNotation(const std::wstring &wsOpenBracket, const std::wstring &wsCloseBracket, XmlUtils::CXmlWriter *pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:begChr", true); + pXmlWrite->WriteAttribute(L"m:val",wsOpenBracket); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:endChr", true); + pXmlWrite->WriteAttribute(L"m:val", wsCloseBracket); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + void CConversionSMtoOOXML::PropertiesMPr(XmlUtils::CXmlWriter *pXmlWrite, const TypeElement &enTypeMatrix) + { + pXmlWrite->WriteNodeBegin(L"m:mPr",false); + pXmlWrite->WriteNodeBegin(L"m:mcs",false); + pXmlWrite->WriteNodeBegin(L"m:mc",false); + pXmlWrite->WriteNodeBegin(L"m:mcPr",false); + pXmlWrite->WriteNodeBegin(L"m:count",true); + switch(enTypeMatrix) + { + case TypeElement::matrix: + pXmlWrite->WriteAttribute(L"m:val",L"2"); + break; + default: + pXmlWrite->WriteAttribute(L"m:val",L"1"); + break; + } + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:mcJc",true); + pXmlWrite->WriteAttribute(L"m:val",L"center"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"m:mcPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:mc",false,false); + pXmlWrite->WriteNodeEnd(L"m:mcs",false,false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:mPr",false,false); + } + void CConversionSMtoOOXML::BlocGrade(XmlUtils::CXmlWriter *pXmlWrite,CElement* pValueGrade) + { + pXmlWrite->WriteNodeBegin(L"m:d",false); + pXmlWrite->WriteNodeBegin(L"m:dPr",false); + pXmlWrite->WriteNodeBegin(L"m:begChr",true); + pXmlWrite->WriteAttribute(L"m:val",L""); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:endChr",true); + pXmlWrite->WriteAttribute(L"m:val",L"\u23AA"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false); + pXmlWrite->WriteNodeEnd(L"m:dPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + pValueGrade->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:d",false,false); + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 09e23d500f..e1932e7a39 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -16,9 +16,13 @@ namespace StarMath { static void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite); static void PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite); static void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock,XmlUtils::CXmlWriter* pXmlWrite); + static void PropertiesDPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeBracket); + static void PropertiesMPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeMatrix); + static void BlocGrade(XmlUtils::CXmlWriter* pXmlWrite,CElement* pValueGrade); void EndConversion(); std::wstring GetOOXML() ; private: + static void BracketTypeNotation(const std::wstring& wsOpenBracket,const std::wstring& wsCloseBracket, XmlUtils::CXmlWriter* pXmlWrite); XmlUtils::CXmlWriter* m_oXmlWrite; }; } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index d9f2bdcd64..95511ad53b 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -19,6 +19,12 @@ namespace StarMath } m_arEquation.push_back(pTempElement); } + if(!pReader->EmptyString()) + { + CElement* pTempElement = ParseElement(pReader); + if(nullptr != pTempElement) + m_arEquation.push_back(pTempElement); + } return m_arEquation; } @@ -47,12 +53,6 @@ namespace StarMath pElement->SetAttribute(arAttributes); pReader->ClearReader(); pElement->Parse(pReader); -// if(CheckingTheNextElement(itStart,itEnd,CIndex::IsIndex)) -// { -// CIndex* pIndex = CIndex::CreateIndex(GetElement(itStart,itEnd)); -// pIndex->SetValueIndex(ParseElement(itStart,itEnd)); -// pElement->SetIndex(pIndex); -// } return pElement; } else return pElement; @@ -89,6 +89,11 @@ namespace StarMath SetLeft(pLeftArg,pElementWhichAdd); break; } + case TypeElement::Index: + { + SetLeft(pLeftArg,pElementWhichAdd); + break; + } default: break; } @@ -106,7 +111,7 @@ namespace StarMath CParserStarMathString::AddLeftArgument(pFirstTempElement,pSecondTempElement); } pFirstTempElement = pSecondTempElement; - if(pReader->GetGlobalType() == TypeElement::Empty) + if(pReader->EmptyString()) { pReader->GetToken(); pReader->SetTypesToken(); @@ -126,6 +131,8 @@ namespace StarMath return true; case TypeElement::BracketWithIndex: return true; + case TypeElement::Index: + return true; default: return false; } @@ -201,92 +208,9 @@ namespace StarMath { delete pTemp; } - delete m_pElementIndex; } - CElement::CElement(): m_pElementIndex(nullptr) + CElement::CElement() {} -// TypeElement CElement::GetTypeElement(const std::wstring& wsToken) -// { -// if (wsToken == L"+") -// { -// return TypeElement::plus; -// } -// else if (wsToken == L"-") -// { -// return TypeElement::minus; -// } -// else if (wsToken == L"*") -// { -// return TypeElement::multipl; -// } -// else if (wsToken == L"/") -// { -// return TypeElement::division; -// } -// else if (wsToken == L"over") -// { -// return TypeElement::over; -// } -// else if (wsToken == L"cdot") -// { -// return TypeElement::cdot; -// } -// else if (wsToken == L"times") -// { -// return TypeElement::times; -// } -// else if (wsToken == L"frac") -// { -// return TypeElement::frac; -// } -// else if (wsToken == L"div") -// { -// return TypeElement::div; -// } -// else if (wsToken == L"oplus") -// { -// return TypeElement::oplus; -// } -// else if (wsToken == L"ominus") -// { -// return TypeElement::ominus; -// } -// else if (wsToken == L"odot") -// { -// return TypeElement::odot; -// } -// else if (wsToken == L"otimes") -// { -// return TypeElement::otimes; -// } -// else if (wsToken == L"odivide") -// { -// return TypeElement::odivide; -// } -// else if (wsToken == L"circ") -// { -// return TypeElement::circ; -// } -// else if (wsToken == L"wideslash") -// { -// return TypeElement::wideslash; -// } -// else if (wsToken == L"widebslash") -// { -// return TypeElement::widebslash; -// } -// else if(L"{" == wsToken) return TypeElement::brace; -// else if(L"(" == wsToken) return TypeElement::round; -// else if(L"[" == wsToken) return TypeElement::square; -// else if(L"ldbracket" == wsToken) return TypeElement::ldbracket; -// else if(L"lbrace" == wsToken) return TypeElement::lbrace; -// else if(L"langle" == wsToken) return TypeElement::langle; -// else if(L"lceil" == wsToken) return TypeElement::lceil; -// else if(L"lfloor" == wsToken) return TypeElement::lfloor; -// else if(L"lline" == wsToken) return TypeElement::lline; -// else if(L"ldline" == wsToken) return TypeElement::ldline; -// else return TypeElement::undefine; -// } CElement* CElement::CreateElement(CStarMathReader* pReader) { switch (pReader->GetGlobalType()) { @@ -312,6 +236,8 @@ namespace StarMath return new CElementMatrix(pReader->GetLocalType()); case TypeElement::SpecialSymbol: return new CElementSpecialSymbol(pReader->GetLocalType()); + case TypeElement::Index: + return new CElementIndex(pReader->GetLocalType()); default: return nullptr; } @@ -320,11 +246,7 @@ namespace StarMath { m_arElementAttributes = arAttr; } - void CElement::SetIndex(CIndex *pIndex) - { - m_pElementIndex = pIndex; - } - TypeElement CElement::GetBaseType() + const TypeElement& CElement::GetBaseType() { return m_enBaseType; } @@ -363,6 +285,8 @@ namespace StarMath } TypeElement CElementString::GetDigit(const std::wstring &wsToken) { + if(wsToken.empty()) return TypeElement::undefine; + for(wchar_t cOneElement: wsToken) { if(!isdigit(cOneElement) || L'\0' == cOneElement) return TypeElement::undefine; @@ -400,7 +324,7 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex) + if(IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex || pReader->GetGlobalType() == TypeElement::Index) { CElement* pBinOp = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); @@ -566,6 +490,10 @@ namespace StarMath else if(L"right" == wsToken) return TypeElement::right; else return TypeElement::undefine; } + std::vector CElementBracket::GetBracketValue() + { + return m_arBrecketValue; + } void CElementBracket::Parse(CStarMathReader* pReader) { pReader->GetToken(); @@ -599,6 +527,25 @@ namespace StarMath } void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { + if(m_enTypeBracket != TypeElement::brace) + { + pXmlWrite->WriteNodeBegin(L"m:d",false); + CConversionSMtoOOXML::PropertiesDPr(pXmlWrite,m_enTypeBracket); + pXmlWrite->WriteNodeBegin(L"m:e",false); + for(CElement* oTemp:m_arBrecketValue) + { + oTemp->ConversionToOOXML(pXmlWrite); + } + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:d",false,false); + } + else + { + for(CElement* oTemp:m_arBrecketValue) + { + oTemp->ConversionToOOXML(pXmlWrite); + } + } } //class methods CElementSpecialSymbol @@ -614,7 +561,9 @@ namespace StarMath } TypeElement CElementSpecialSymbol::GetSpecialSymbol(const std::wstring &wsToken) { - if(L"emptyset" == wsToken) return TypeElement::emptyset; + if(L"#" == wsToken) return TypeElement::grid; + else if(L"##" == wsToken) return TypeElement::transition; + else if(L"emptyset" == wsToken) return TypeElement::emptyset; else if(L"aleph" == wsToken) return TypeElement::aleph; else if(L"setN" == wsToken) return TypeElement::setN; else if(L"setZ" == wsToken) return TypeElement::setZ; @@ -624,7 +573,13 @@ namespace StarMath else return TypeElement::undefine; } void CElementSpecialSymbol::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) - {} + { + if(m_enTypeSpecial == TypeElement::transition) + { + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + } + } //class methods CElementSetOperations CElementSetOperations::CElementSetOperations(const TypeElement &enType): m_pRightArgument(nullptr), m_pLeftArgument(nullptr) { @@ -657,7 +612,7 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex) + if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex || pReader->GetGlobalType() == TypeElement::Index) { CElement* pBinOpElement = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOpElement); @@ -776,7 +731,7 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex) + if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex || pReader->GetGlobalType() == TypeElement::Index) { CElement* pBinOp = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); @@ -935,41 +890,93 @@ namespace StarMath else return TypeElement::undefine; } //class methods CIndex - CIndex::CIndex(const TypeElement& enType): m_pValueIndex(nullptr) + CElementIndex::CElementIndex(const TypeElement& enType): m_pValueIndex(nullptr),m_pValue(nullptr) { m_enTypeIndex = enType; + SetBaseType(TypeElement::Index); } - CIndex::~CIndex() + CElementIndex::~CElementIndex() { delete m_pValueIndex; + delete m_pValue; } - void CIndex::SetValueIndex(CElement *pElement) + void CElementIndex::SetValueIndex(CElement *pElement) { m_pValueIndex = pElement; } - CElement* CIndex::GetValueIndex() + void CElementIndex::SetLeftArg(CElement *pElement) + { + m_pValue = pElement; + } + CElement* CElementIndex::GetValueIndex() { return m_pValueIndex; } - bool CIndex::IsIndex(const std::wstring &wsCheckToken) + TypeElement CElementIndex::GetIndex(const std::wstring &wsCheckToken) { - if(L"^" == wsCheckToken) return true; - else if(L"_" == wsCheckToken) return true; - else if(L"lsup" == wsCheckToken) return true; - else if(L"lsub" == wsCheckToken) return true; - else if(L"csup" == wsCheckToken) return true; - else if(L"csub" == wsCheckToken) return true; - else return false; + if(L"^" == wsCheckToken) return TypeElement::upper; + else if(L"_" == wsCheckToken) return TypeElement::lower; + else if(L"lsup" == wsCheckToken) return TypeElement::lsup; + else if(L"lsub" == wsCheckToken) return TypeElement::lsub; + else if(L"csup" == wsCheckToken) return TypeElement::csup; + else if(L"csub" == wsCheckToken) return TypeElement::csub; + else return TypeElement::undefine; } - CIndex* CIndex::CreateIndex(const std::wstring &wsToken) + void CElementIndex::Parse(CStarMathReader *pReader) { - if(L"^" == wsToken) return new CIndex(TypeElement::upper); - else if(L"_" == wsToken) return new CIndex(TypeElement::lower); - else if(L"lsup" == wsToken) return new CIndex(TypeElement::lsup); - else if(L"lsub" == wsToken) return new CIndex(TypeElement::lsub); - else if(L"csup" == wsToken) return new CIndex(TypeElement::csup); - else if(L"csub" == wsToken) return new CIndex(TypeElement::csub); - else return nullptr; + SetValueIndex(CParserStarMathString::ParseElement(pReader)); + } + void CElementIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + if(m_enTypeIndex == TypeElement::upper || m_enTypeIndex == TypeElement::lower) + { + std::wstring wsNameNodeIndex; + switch(m_enTypeIndex) + { + case TypeElement::upper: + wsNameNodeIndex = L"m:sSup"; + break; + case TypeElement::lower: + wsNameNodeIndex = L"m:sSub"; + break; + } + pXmlWrite->WriteNodeBegin(wsNameNodeIndex,false); + pXmlWrite->WriteNodeBegin(wsNameNodeIndex+L"Pr",false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValue,pXmlWrite); + switch(m_enTypeIndex) + { + case TypeElement::upper: + CConversionSMtoOOXML::BlockRecording(L"m:sup",m_pValueIndex,pXmlWrite); + break; + case TypeElement::lower: + CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueIndex,pXmlWrite); + break; + } + pXmlWrite->WriteNodeEnd(wsNameNodeIndex,false,false); + } + else if(m_enTypeIndex == TypeElement::lsub || TypeElement::lsup == m_enTypeIndex) + { + pXmlWrite->WriteNodeBegin(L"m:sPre",false); + pXmlWrite->WriteNodeBegin(L"m:sPrePr",false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:sPrePr",false,false); + if(m_enTypeIndex==TypeElement::lsup) + { + CConversionSMtoOOXML::BlockRecording(L"m:sup",m_pValueIndex,pXmlWrite); + } + else if(m_enTypeIndex == TypeElement::lsub) + { + CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueIndex,pXmlWrite); + } + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValue,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); + } } //class methods CElementFunction CElementFunction::CElementFunction(const TypeElement &enType): m_pValue(nullptr) @@ -992,8 +999,17 @@ namespace StarMath void CElementFunction::Parse(CStarMathReader* pReader) { - SetValueFunction(CParserStarMathString::ParseElement(pReader)); - pReader->ClearReader(); + CElement* pTemp = CParserStarMathString::ParseElement(pReader); + pReader->GetToken(); + pReader->SetTypesToken(); + if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::Index) + { + CElement* pBinOp = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTemp,pBinOp); + pTemp = pBinOp; + } + SetValueFunction(pTemp); + //pReader->ClearReader(); } void CElementFunction::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -1205,6 +1221,7 @@ namespace StarMath if(m_wsToken == L"left") m_wsToken = GetElement(); else if(L"right" == m_wsToken ) m_wsToken = GetElement(); } + //std::wcout<') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) + else if(!m_wsElement.empty() && (*m_itStart == L'[' || *m_itStart == L']' || *m_itStart == L'(' || L')' == *m_itStart || *m_itStart == L'{' || *m_itStart == L'}' || *m_itStart == L'+' || *m_itStart == L'-' || *m_itStart == L'/' || *m_itStart == L'*' || L'^' == *m_itStart || L'_' == *m_itStart || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (iswalpha(*m_itStart) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) { return m_wsElement; } - else if(((*m_itStart == L'{' || *m_itStart == L'}' || *m_itStart == L'+' || *m_itStart == L'-' || *m_itStart == L'/' || *m_itStart == L'*' || L'^' == *m_itStart || L'_' == *m_itStart || L'=' == *m_itStart ) && m_wsElement.empty()) || (!m_wsElement.empty() && ((m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) + else if(((*m_itStart == L'{' || *m_itStart == L'}' || *m_itStart == L'+' || *m_itStart == L'-' || *m_itStart == L'/' || *m_itStart == L'*' || L'^' == *m_itStart || L'_' == *m_itStart || L'=' == *m_itStart || *m_itStart == L'[' || *m_itStart == L']') && m_wsElement.empty()) || (!m_wsElement.empty() && ((m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) { m_wsElement.push_back(*m_itStart); m_itStart++; @@ -1429,9 +1445,50 @@ namespace StarMath SetValueTo(CParserStarMathString::ParseElement(pReader)); } } - void CElementGrade::ConversionToOOXML(XmlUtils::CXmlWriter *oXmlWrite) + void CElementGrade::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - + if(m_pValueFrom == nullptr && m_pValueTo == nullptr) + { + CConversionSMtoOOXML::BlocGrade(pXmlWrite,m_pValueGrade); + } + else + { + std::wstring wsNodeGrade; + if(m_pValueFrom != nullptr && m_pValueTo == nullptr) + { + wsNodeGrade = L"m:sSub"; + } + else if(m_pValueFrom == nullptr && m_pValueTo != nullptr) + { + wsNodeGrade = L"m:sSup"; + } + else if(m_pValueFrom != nullptr && m_pValueTo != nullptr) + { + wsNodeGrade = L"m:sSubSup"; + } + pXmlWrite->WriteNodeBegin(wsNodeGrade,false); + pXmlWrite->WriteNodeBegin(wsNodeGrade + L"Pr",false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(wsNodeGrade + L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + CConversionSMtoOOXML::BlocGrade(pXmlWrite,m_pValueGrade); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + if(m_pValueFrom != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:sub",false); + m_pValueFrom->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:sub",false,false); + } + if(m_pValueTo != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:sup",false); + m_pValueTo->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:sup",false,false); + } + pXmlWrite->WriteNodeEnd(wsNodeGrade,false,false); + } } TypeElement CElementGrade::GetGrade(const std::wstring &wsToken) { @@ -1478,7 +1535,56 @@ namespace StarMath } void CElementMatrix::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - + pXmlWrite->WriteNodeBegin(L"m:m",false); + CConversionSMtoOOXML::PropertiesMPr(pXmlWrite,m_enTypeMatrix); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + switch(m_enTypeMatrix) + { + case TypeElement::matrix: + { + CElementBracket* pTempBracket = dynamic_cast(m_pFirstArgument); + std::vector pTempValue = pTempBracket->GetBracketValue(); + for(CElement* pOneElement:pTempValue) + { + if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol && pOneElement->GetBaseType()!= TypeElement::undefine) + { + pXmlWrite->WriteNodeBegin(L"m:e",false); + pOneElement->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + } + else if(pOneElement->GetBaseType() != TypeElement::undefine) + pOneElement->ConversionToOOXML(pXmlWrite); + } + break; + } + case TypeElement::stack: + { + CElementBracket* pTempBracket = dynamic_cast(m_pFirstArgument); + std::vector pTempValue = pTempBracket->GetBracketValue(); + for(CElement* pOneElement:pTempValue) + { + if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol) + { + pXmlWrite->WriteNodeBegin(L"m:e",false); + pOneElement->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + } + } + break; + } + case TypeElement::binom: + { + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pFirstArgument,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pSecondArgument,pXmlWrite); + break; + } + } + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeEnd(L"m:m",false,false); } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index a2d01986a0..fd08ad4af8 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -46,8 +46,6 @@ namespace StarMath TypeElement m_enTypeAttr; }; - class CIndex; - class CElement { public: @@ -58,26 +56,27 @@ namespace StarMath static CElement* CreateElement(CStarMathReader* pReader); virtual void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) = 0; void SetAttribute(const std::vector arAttr); - void SetIndex(CIndex* pIndex); void SetBaseType(const TypeElement& enType); - TypeElement GetBaseType(); + const TypeElement& GetBaseType(); private: - CIndex* m_pElementIndex; std::vector m_arElementAttributes; TypeElement m_enBaseType; }; - class CIndex + class CElementIndex: public CElement { public: - CIndex(const TypeElement& enType); - ~CIndex(); + CElementIndex(const TypeElement& enType); + virtual ~CElementIndex(); void SetValueIndex(CElement* pElement); + void SetLeftArg(CElement* pElement); CElement* GetValueIndex(); - static bool IsIndex(const std::wstring& wsCheckToken); - static CIndex* CreateIndex(const std::wstring& wsToken); + static TypeElement GetIndex(const std::wstring& wsCheckToken); private: + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValueIndex; + CElement* m_pValue; TypeElement m_enTypeIndex; }; @@ -148,7 +147,7 @@ namespace StarMath static TypeElement GetGrade(const std::wstring& wsToken); private: void Parse(CStarMathReader* pReader) override; - void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValueGrade; CElement* m_pValueFrom; CElement* m_pValueTo; @@ -161,9 +160,10 @@ namespace StarMath virtual ~CElementBracket(); void SetBracketValue(const std::vector& arValue); static TypeElement GetBracketOpen(const std::wstring& wsToken); + std::vector GetBracketValue(); private: void Parse(CStarMathReader* pReader) override; - void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override;// TypeElement GetBracketClose(const std::wstring& wsToken); TypeElement m_enTypeBracket; std::vector m_arBrecketValue; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index c12a5fbad0..e997664bd4 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -116,7 +116,6 @@ enum class TypeElement{ lavender, //color(without rgb and hex) mline, - grid, dlgrid, //setopetions intersection, @@ -177,6 +176,8 @@ enum class TypeElement{ setQ, setR, setC, + grid, + transition, // infinity, partial, From 35eb2849ef8a43a890c0ea5257f36c8a74d3d849 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 15 Dec 2023 17:55:00 +0300 Subject: [PATCH 013/117] Adding conversion of indexed brackets, diacritics and attributes. Editing operator conversion. --- .../StarMath2OOXML/TestSMConverter/main.cpp | 123 +++- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 257 +++++-- .../StarMath2OOXML/cconversionsmtoooxml.h | 23 +- .../StarMath2OOXML/cstarmathpars.cpp | 648 +++++++++++++++--- .../Converter/StarMath2OOXML/cstarmathpars.h | 73 +- .../Converter/StarMath2OOXML/typeselements.h | 8 +- 6 files changed, 932 insertions(+), 200 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index 41495fe80e..b81713a1a7 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -20,7 +20,7 @@ TEST(SMConvectorTest,BinOperatorOver) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"23"; + std::wstring XmlString = L"23"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -70,7 +70,7 @@ TEST(SMConvectorTest,BinOperatorDivision) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); - std::wstring XmlString = L"42"; + std::wstring XmlString = L"42"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -110,7 +110,7 @@ TEST(SMConvectorTest,OperatorSum) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"5"; + std::wstring XmlString = L"5"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -120,7 +120,7 @@ TEST(SMConvectorTest,OperatorSumFrom) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"105"; + std::wstring XmlString = L"105"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -130,7 +130,7 @@ TEST(SMConvectorTest,OperatorSumTo) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"105"; + std::wstring XmlString = L"105"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -140,7 +140,7 @@ TEST(SMConvectorTest,OperatorSumFromTo) StarMath::CParserStarMathString m_oTempO; StarMath::CConversionSMtoOOXML m_oTest; m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); - std::wstring XmlString = L"666777567"; + std::wstring XmlString = L"666777567"; EXPECT_EQ(m_oTest.GetOOXML(),XmlString); } @@ -660,7 +660,7 @@ TEST(SMConvectorTest,BracketLangle) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1011"; + std::wstring wsXmlString = L"1011"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -690,7 +690,7 @@ TEST(SMConvectorTest,BracketLline) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"1617"; + std::wstring wsXmlString = L"1617"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -720,7 +720,7 @@ TEST(SMConvectorTest,FunctionSin) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"sin45"; + std::wstring wsXmlString = L"sin45"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -730,7 +730,7 @@ TEST(SMConvectorTest,FunctionTan) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"tan67"; + std::wstring wsXmlString = L"tan67"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -740,7 +740,7 @@ TEST(SMConvectorTest,FunctionCot) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cot89"; + std::wstring wsXmlString = L"cot89"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -810,7 +810,7 @@ TEST(SMConvectorTest,FunctionArctan) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arctan1718"; + std::wstring wsXmlString = L"arctan1718"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -830,7 +830,7 @@ TEST(SMConvectorTest,FunctionArsinh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arsinh231510"; + std::wstring wsXmlString = L"arsinh231510"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -840,7 +840,7 @@ TEST(SMConvectorTest,FunctionArcosh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"35+27arcosh2378"; + std::wstring wsXmlString = L"35+27arcosh2378"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -860,7 +860,7 @@ TEST(SMConvectorTest,MatrixBinom) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"27\u2283277arcoth89"; + std::wstring wsXmlString = L"27\u2283277arcoth89"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -870,7 +870,7 @@ TEST(SMConvectorTest,MatrixMatrix) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"28-5210\u22C3310*10100cosh102\u229510100"; + std::wstring wsXmlString = L"28-5210\u22C3310*10100cosh102\u229510100"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -880,7 +880,7 @@ TEST(SMConvectorTest,MatrixStack) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"210231234"; + std::wstring wsXmlString = L"210231234"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -890,7 +890,7 @@ TEST(SMConvectorTest,IndexLower) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2512"; + std::wstring wsXmlString = L"2512"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -900,7 +900,7 @@ TEST(SMConvectorTest,IndexUpper) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"cos52410"; + std::wstring wsXmlString = L"cos52410"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -910,7 +910,7 @@ TEST(SMConvectorTest,IndexLsup) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2+3cos1527"; + std::wstring wsXmlString = L"2+3cos1527"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -920,7 +920,37 @@ TEST(SMConvectorTest,IndexLsub) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"22222103"; + std::wstring wsXmlString = L"22222103"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketWithIndexOverbrace) +{ + std::wstring wsString = L"color red size 16 {2/3} overbrace color navy size 18 stack{10 # 100 # 10 }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"231010010"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,OperatorLllint) +{ + std::wstring wsString = L"color red bold lllint from color navy bold 2 over color crimson 10 to color green (2 color orange bold + 3) 100"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2102+3100"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLdlineAttribute) +{ + std::wstring wsString = L"color green left ldline color navy bold 10 over color purple dot underline 100 color orange bold ital + 3 right rdline + ital bold 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"10100+3+10"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -934,4 +964,55 @@ TEST(SMConvectorTest,IndexLsub) // EXPECT_EQ(oTest.GetOOXML(),wsXmlString); //} +//TEST(SMConvectorTest,FunctionCos) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString = L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + +//TEST(SMConvectorTest,FunctionCos) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString = L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + +//TEST(SMConvectorTest,FunctionCos) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString = L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + +//TEST(SMConvectorTest,FunctionCos) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString = L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + +//TEST(SMConvectorTest,FunctionCos) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString = L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 8a37899866..a29aa78430 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -2,40 +2,100 @@ #include "../../../../DesktopEditor/common/File.h" #include namespace StarMath { - CConversionSMtoOOXML::CConversionSMtoOOXML() + CConversionSMtoOOXML::CConversionSMtoOOXML(): m_pXmlWrite(nullptr) { } + //check XMLWrite(if not nullptr == delete) void CConversionSMtoOOXML::StartConversion(std::vector arPars) { - m_oXmlWrite = new XmlUtils::CXmlWriter; - m_oXmlWrite->WriteNodeBegin(L"m:oMathPara",false); - m_oXmlWrite->WriteNodeBegin(L"m:oMath",false); + m_pXmlWrite = new XmlUtils::CXmlWriter; + m_pXmlWrite->WriteNodeBegin(L"m:oMathPara",false); + m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); for(CElement* oTempElement:arPars) { - oTempElement->ConversionToOOXML(m_oXmlWrite); + oTempElement->ConversionToOOXML(m_pXmlWrite); } EndConversion(); -// NSFile::CFileBinary oFile; -// oFile.CreateFileW(L"Test.txt"); -// oFile.WriteStringUTF8(m_oXmlWrite->GetXmlString()); -// oFile.CloseFile(); + NSFile::CFileBinary oFile; + oFile.CreateFileW(L"Test.txt"); + oFile.WriteStringUTF8(m_pXmlWrite->GetXmlString()); + oFile.CloseFile(); } - void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite) + void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { - pXmlWrite->WriteNodeBegin(L"w:rPr",false); - pXmlWrite->WriteNodeBegin(L"w:rFonts",true); - pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:sz",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:szCs",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + if(pAttribute == nullptr) + { + pXmlWrite->WriteNodeBegin(L"w:rPr",false); + pXmlWrite->WriteNodeBegin(L"w:rFonts",true); + pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:sz",true); + pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:szCs",true); + pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + } + else + { + pXmlWrite->WriteNodeBegin(L"w:rPr",false); + pXmlWrite->WriteNodeBegin(L"w:rFonts",true); + pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + if(pAttribute->GetSize() == 0) + { + pXmlWrite->WriteNodeBegin(L"w:sz",true); + pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:szCs",true); + pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + else + { + pXmlWrite->WriteNodeBegin(L"w:sz",true); + pXmlWrite->WriteAttribute(L"w:val",std::to_wstring(pAttribute->GetSize())); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:szCs",true); + pXmlWrite->WriteAttribute(L"w:val",std::to_wstring(pAttribute->GetSize())); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + if(!pAttribute->EmptyColor() && pAttribute != nullptr) + { + pXmlWrite->WriteNodeBegin(L"w:color",true); + pXmlWrite->WriteAttribute(L"w:val",pAttribute->GetColor()); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + if(pAttribute->GetBold()) + { + pXmlWrite->WriteNodeBegin(L"m:sty", true); + pXmlWrite->WriteAttribute(L"m:val",L"b"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:b",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:bCs",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + if(pAttribute->GetItal()) + { + pXmlWrite->WriteNodeBegin(L"m:sty", true); + pXmlWrite->WriteAttribute(L"m:val",L"i"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"w:i",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + if(pAttribute->GetStrike()) + { + pXmlWrite->WriteNodeBegin(L"w:strike",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + } } - void CConversionSMtoOOXML::PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite) + void CConversionSMtoOOXML::PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { pXmlWrite->WriteNodeBegin(L"m:fPr",false); if(bType) @@ -44,33 +104,60 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"m:val",wsType); pXmlWrite->WriteNodeEnd(L"w",true,true); } - pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - pXmlWrite->WriteNodeBegin(L"w:rPr",false); - pXmlWrite->WriteNodeBegin(L"w:rFonts",true); - pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNode(L"w:i",L""); - //m_pXmlWrite->WriteNode(L"w:iCs",L""); - pXmlWrite->WriteNodeBegin(L"w:sz",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:szCs",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); - pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + WriteCtrlPrNode(pXmlWrite,pAttribute); +// pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); +// pXmlWrite->WriteNodeBegin(L"w:rPr",false); +// pXmlWrite->WriteNodeBegin(L"w:rFonts",true); +// pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); +// pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); +// pXmlWrite->WriteNodeEnd(L"w",true,true); +// pXmlWrite->WriteNode(L"w:i",L""); +// //m_pXmlWrite->WriteNode(L"w:iCs",L""); +// pXmlWrite->WriteNodeBegin(L"w:sz",true); +// pXmlWrite->WriteAttribute(L"w:val",L"40"); +// pXmlWrite->WriteNodeEnd(L"w",true,true); +// pXmlWrite->WriteNodeBegin(L"w:szCs",true); +// pXmlWrite->WriteAttribute(L"w:val",L"40"); +// pXmlWrite->WriteNodeEnd(L"w",true,true); +// pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); +// pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); pXmlWrite->WriteNodeEnd(L"m:fPr",false,false); } - void CConversionSMtoOOXML::PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite) + void CConversionSMtoOOXML::PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { pXmlWrite->WriteNodeBegin(L"m:naryPr",false); - pXmlWrite->WriteNodeBegin(L"m:chr",true); - pXmlWrite->WriteAttribute(L"m:val",wsTypeOperator); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"m:limLoc",true); - pXmlWrite->WriteAttribute(L"m:val",L"undOvr"); - pXmlWrite->WriteNodeEnd(L"w",true,true); + switch(enTypeOp) + { + case TypeElement::sum: + { + WriteChrNode(L"\u2211",pXmlWrite); + break; + } + case TypeElement::prod: + WriteChrNode(L"\u220F",pXmlWrite); + break; + case TypeElement::coprod: + WriteChrNode(L"\u2210",pXmlWrite); + break; + case TypeElement::iint: + WriteChrNode(L"\u222C",pXmlWrite); + break; + case TypeElement::iiint: + WriteChrNode(L"\u222D",pXmlWrite); + break; + case TypeElement::lint: + WriteChrNode(L"\u222E",pXmlWrite); + break; + case TypeElement::llint: + WriteChrNode(L"\u222F",pXmlWrite); + break; + case TypeElement::lllint: + WriteChrNode(L"\u2230",pXmlWrite); + break; + default: + break; + } + WriteLimLocNode(L"undOvr",pXmlWrite); if(bEmptySub) { pXmlWrite->WriteNodeBegin(L"m:subHide",true); @@ -83,15 +170,7 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"m:val",L"1"); pXmlWrite->WriteNodeEnd(L"w",true,true); } - pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - pXmlWrite->WriteNodeBegin(L"w:rPr",false); - pXmlWrite->WriteNodeBegin(L"w:rFonts",true); - pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNode(L"w:i",L""); - pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); - pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + WriteCtrlPrNode(pXmlWrite,pAttribute); pXmlWrite->WriteNodeEnd(L"m:naryPr",false,false); } void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *CValueBlock,XmlUtils::CXmlWriter* pXmlWrite) @@ -102,24 +181,23 @@ namespace StarMath { } std::wstring CConversionSMtoOOXML::GetOOXML() { - return m_oXmlWrite->GetXmlString(); + return m_pXmlWrite->GetXmlString(); } void CConversionSMtoOOXML::EndConversion() { - //m_pXmlWrite->WriteNodeEnd(L"m:r",false,false); - m_oXmlWrite->WriteNodeEnd(L"m:oMath",false,false); - m_oXmlWrite->WriteNodeEnd(L"m:oMathPara",false,false); + m_pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); + m_pXmlWrite->WriteNodeEnd(L"m:oMathPara",false,false); } - void CConversionSMtoOOXML::PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite) + void CConversionSMtoOOXML::PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { pXmlWrite->WriteNodeBegin(L"m:funcPr", false); pXmlWrite->WriteNodeBegin(L"m:ctrlPr", false); - StandartProperties(pXmlWrite); + StandartProperties(pXmlWrite,pAttribute); pXmlWrite->WriteNodeEnd(L"m:ctrlPr", false,false); pXmlWrite->WriteNodeEnd(L"m:funcPr",false,false); } - void CConversionSMtoOOXML::PropertiesDPr(XmlUtils::CXmlWriter *pXmlWrite, const TypeElement &enTypeBracket) + void CConversionSMtoOOXML::PropertiesDPr(XmlUtils::CXmlWriter *pXmlWrite, const TypeElement &enTypeBracket,CAttribute* pAttribute) { pXmlWrite->WriteNodeBegin(L"m:dPr",false); switch(enTypeBracket) @@ -150,7 +228,7 @@ namespace StarMath { break; } pXmlWrite->WriteNodeBegin(L"m:ctrlPr"); - StandartProperties(pXmlWrite); + StandartProperties(pXmlWrite,pAttribute); pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); pXmlWrite->WriteNodeEnd(L"m:dPr",false,false); } @@ -163,7 +241,7 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"m:val", wsCloseBracket); pXmlWrite->WriteNodeEnd(L"w",true,true); } - void CConversionSMtoOOXML::PropertiesMPr(XmlUtils::CXmlWriter *pXmlWrite, const TypeElement &enTypeMatrix) + void CConversionSMtoOOXML::PropertiesMPr(XmlUtils::CXmlWriter *pXmlWrite, const TypeElement &enTypeMatrix,CAttribute* pAttribute) { pXmlWrite->WriteNodeBegin(L"m:mPr",false); pXmlWrite->WriteNodeBegin(L"m:mcs",false); @@ -187,11 +265,11 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"m:mc",false,false); pXmlWrite->WriteNodeEnd(L"m:mcs",false,false); pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - StandartProperties(pXmlWrite); + StandartProperties(pXmlWrite,pAttribute); pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); pXmlWrite->WriteNodeEnd(L"m:mPr",false,false); } - void CConversionSMtoOOXML::BlocGrade(XmlUtils::CXmlWriter *pXmlWrite,CElement* pValueGrade) + void CConversionSMtoOOXML::NodeGrade(XmlUtils::CXmlWriter *pXmlWrite,CElement* pValueGrade,CAttribute* pAttribute) { pXmlWrite->WriteNodeBegin(L"m:d",false); pXmlWrite->WriteNodeBegin(L"m:dPr",false); @@ -202,7 +280,7 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"m:val",L"\u23AA"); pXmlWrite->WriteNodeEnd(L"w",true,true); pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - StandartProperties(pXmlWrite); + StandartProperties(pXmlWrite,pAttribute); pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false); pXmlWrite->WriteNodeEnd(L"m:dPr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); @@ -210,5 +288,50 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeEnd(L"m:d",false,false); } + void CConversionSMtoOOXML::WriteCtrlPrNode(XmlUtils::CXmlWriter *pXmlWrite, CAttribute *pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + } + void CConversionSMtoOOXML::WriteChrNode(const std::wstring &wsTypeOp,XmlUtils::CXmlWriter* pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:chr",true); + pXmlWrite->WriteAttribute(L"m:val",wsTypeOp); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + void CConversionSMtoOOXML::WriteLimLocNode(const std::wstring &wsTypeLimLock,XmlUtils::CXmlWriter* pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:limLoc",true); + pXmlWrite->WriteAttribute(L"m:val",wsTypeLimLock); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + void CConversionSMtoOOXML::WrtieRPrFName(const TypeElement &enTypeOp, XmlUtils::CXmlWriter *pXmlWrite,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + pXmlWrite->WriteNodeBegin(L"m:rPr",false); + pXmlWrite->WriteNodeBegin(L"m:sty",true); + pXmlWrite->WriteAttribute(L"m:val",L"p"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"m:rPr",false,false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeBegin(L"m:t",false); + switch(enTypeOp) + { + case TypeElement::lim: + pXmlWrite->WriteString(L"lim"); + break; + case TypeElement::liminf: + pXmlWrite->WriteString(L"lim inf"); + break; + case TypeElement::limsup: + pXmlWrite->WriteString(L"lim sup"); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index e1932e7a39..c7f8a59938 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -6,24 +6,29 @@ namespace StarMath { +//delete XmlWrite class CConversionSMtoOOXML { public: CConversionSMtoOOXML(); void StartConversion(std::vector arPars); - static void StandartProperties(XmlUtils::CXmlWriter* pXmlWrite); - static void PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite); - static void PropertiesNaryPr(const std::wstring& wsTypeOperator,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite); - static void PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite); + static void StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock,XmlUtils::CXmlWriter* pXmlWrite); - static void PropertiesDPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeBracket); - static void PropertiesMPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeMatrix); - static void BlocGrade(XmlUtils::CXmlWriter* pXmlWrite,CElement* pValueGrade); + static void PropertiesDPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeBracket,CAttribute* pAttribute); + static void PropertiesMPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeMatrix,CAttribute* pAttribute); + static void NodeGrade(XmlUtils::CXmlWriter* pXmlWrite,CElement* pValueGrade,CAttribute* pAttribute); + static void WriteCtrlPrNode(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void WriteChrNode(const std::wstring& wsTypeOp,XmlUtils::CXmlWriter* pXmlWrite); + static void WriteLimLocNode(const std::wstring& wsTypeLimLock,XmlUtils::CXmlWriter* pXmlWrite); + static void WrtieRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); void EndConversion(); - std::wstring GetOOXML() ; + std::wstring GetOOXML(); private: static void BracketTypeNotation(const std::wstring& wsOpenBracket,const std::wstring& wsCloseBracket, XmlUtils::CXmlWriter* pXmlWrite); - XmlUtils::CXmlWriter* m_oXmlWrite; + XmlUtils::CXmlWriter* m_pXmlWrite; }; } #endif // CCONVERSIONSMTOOOXML_H diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 95511ad53b..fe620a13be 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -31,7 +31,6 @@ namespace StarMath CElement* CParserStarMathString::ParseElement(CStarMathReader* pReader) { CElement* pElement; - std::vector arAttributes; if(pReader->EmptyString()) { @@ -39,18 +38,14 @@ namespace StarMath pReader->SetTypesToken(); } - while(pReader->GetGlobalType() == TypeElement::Attribute) - { - if(pReader->GetLocalType() != TypeElement::color) arAttributes.push_back(new CAttribute(pReader->GetLocalType())); - pReader->GetToken(); - pReader->SetTypesToken(); - } - pElement = CElement::CreateElement(pReader); if(pElement != nullptr) { - pElement->SetAttribute(arAttributes); + if(pReader->GetAttribute() != nullptr) + pElement->SetAttribute(pReader->GetAttribute()); + else if(pReader->GetAttributeTemp() != nullptr) + pElement->SetAttribute(pReader->GetAttributeTemp()); pReader->ClearReader(); pElement->Parse(pReader); return pElement; @@ -98,13 +93,14 @@ namespace StarMath break; } } - CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader) + CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader,CAttribute* pAttribute) { CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); while(CheckForLeftArgument(pReader->GetGlobalType())) { + pReader->SetAttributeTemp(pAttribute); CElement* pSecondTempElement = CParserStarMathString::ParseElement(pReader); if(pFirstTempElement != nullptr) { @@ -117,6 +113,7 @@ namespace StarMath pReader->SetTypesToken(); } } + pReader->ClearAttributeTemp(); return pFirstTempElement; } bool CParserStarMathString::CheckForLeftArgument(const TypeElement &enType) @@ -138,42 +135,227 @@ namespace StarMath } } //class methods CAttribute + CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0) + { + } CAttribute::~CAttribute() {} - CAttribute::CAttribute(const TypeElement &enType) + void CAttribute::SetSize(const unsigned int &iSize) { - m_enTypeAttr = enType; + m_iSize = iSize; } - TypeElement CAttribute::GetType() + void CAttribute::SetBold() { - return m_enTypeAttr; + m_bBold = true; } + void CAttribute::SetItal() + { + m_bItal = true; + } + void CAttribute::SetPhantom() + { + m_bPhantom = true; + } + void CAttribute::SetStrike() + { + m_bStrike = true; + } + void CAttribute::SetColor(const TypeElement &enColor) + { + if(enColor != TypeElement::undefine) + { + switch (enColor) { + case TypeElement::black: + m_wsColor = L"000000"; + break; + case TypeElement::blue: + m_wsColor = L"0400ff"; + break; + case TypeElement::green: + m_wsColor =L"00FF00"; + break; + case TypeElement::red: + m_wsColor =L"FF0000"; + break; + case TypeElement::fuchsia: + m_wsColor =L"ED0DD9"; + break; + case TypeElement::aqua: + m_wsColor =L"30D5C8"; + break; + case TypeElement::yellow: + m_wsColor =L"FFFF00"; + break; + case TypeElement::gray: + m_wsColor =L"808080"; + break; + case TypeElement::lime: + m_wsColor =L"00FF00"; + break; + case TypeElement::maroon: + m_wsColor =L"800000"; + break; + case TypeElement::navy: + m_wsColor =L"000080"; + break; + case TypeElement::olive: + m_wsColor =L"808000"; + break; + case TypeElement::purple: + m_wsColor =L"800080"; + break; + case TypeElement::silver: + m_wsColor =L"C0C0C0"; + break; + case TypeElement::teal: + m_wsColor =L"008080"; + break; + case TypeElement::coral: + m_wsColor =L"FF7F50"; + break; + case TypeElement::midnightblue: + m_wsColor =L"191970"; + break; + case TypeElement::crimson: + m_wsColor =L"DC143C"; + break; + case TypeElement::violet: + m_wsColor =L"EE82EE"; + break; + case TypeElement::orange: + m_wsColor =L"FFA500"; + break; + case TypeElement::orangered: + m_wsColor =L"FF4500"; + break; + case TypeElement::seagreen: + m_wsColor =L"2E8B57"; + break; + case TypeElement::indigo: + m_wsColor =L"4B0082"; + break; + case TypeElement::hotpink: + m_wsColor =L"FF69B4"; + break; + case TypeElement::lavender: + m_wsColor =L"FFF0F5"; + break; + default: + break; + } + } + } + void CAttribute::SetFont(const TypeElement &enFont) + { + switch (enFont) { + case TypeElement::ital: + SetItal(); + break; + case TypeElement::bold: + SetBold(); + break; + case TypeElement::phantom: + SetPhantom(); + break; + case TypeElement::overstrike: + SetStrike(); + break; + default: + break; + } + } + bool CAttribute::GetBold() + { + return m_bBold; + } + bool CAttribute::GetItal() + { + return m_bItal; + } + bool CAttribute::GetPhantom() + { + return m_bPhantom; + } + bool CAttribute::GetStrike() + { + return m_bStrike; + } + std::wstring CAttribute::GetColor() + { + return m_wsColor; + } + unsigned int CAttribute::GetSize() + { + return m_iSize; + } + bool CAttribute::EmptyColor() + { + return m_wsColor.empty(); + } + void CAttribute::ParseColorAttribute(const std::wstring &wsToken,CStarMathReader* pReader) + { + TypeElement enTempColor = GetTypeColorAttribute(wsToken); + switch(enTempColor) + { + case TypeElement::hex: + pReader->GetToken(); + m_wsColor = pReader->GetString(); + break; + case TypeElement::rgb: + { + const int iTempLen = 7; + wchar_t arTemp[iTempLen]; + unsigned int wsRed,wsGreen,wsBlue; + pReader->GetToken(); + wsRed = std::stoi(pReader->GetString()); + pReader->GetToken(); + wsGreen = std::stoi(pReader->GetString()); + pReader->GetToken(); + wsBlue = std::stoi(pReader->GetString()); + if(wsRed > 255 || wsGreen > 255 || wsBlue > 255) + m_wsColor = L"000000"; + else + { + swprintf(arTemp,iTempLen,L"%02X%02X%02X",wsRed,wsGreen,wsBlue); + m_wsColor = std::wstring(arTemp,6); + } + break; + } + default: + SetColor(enTempColor); + break; + } + } + void CAttribute::ParseFontAttribute(const TypeElement& enTypeFont, CStarMathReader *pReader) + { + switch(enTypeFont) + { + case TypeElement::size: + { + pReader->GetToken(); + int iTemp = std::stoi(pReader->GetString()); + if (iTemp >= 0) + m_iSize = iTemp*2; + else + m_iSize = 24; + break; + } + case TypeElement::font: + { + break; + } + default: + SetFont(enTypeFont); + break; + } + } + //нет phantom, rgb, 16 , гарнитуры и кегля - TypeElement CAttribute::GetTypeAttribute(const std::wstring &wsToken) + TypeElement CAttribute::GetTypeColorAttribute(const std::wstring &wsToken) { - if(L"acute" == wsToken) return TypeElement::acute; - else if(L"color" == wsToken) return TypeElement::color; - else if(L"breve" == wsToken) return TypeElement::breve; - else if(L"dot" == wsToken) return TypeElement::dot; - else if(L"dddot" == wsToken) return TypeElement::dddot; - else if(L"vec" == wsToken) return TypeElement::vec; - else if(L"tilde" == wsToken) return TypeElement::tilde; - else if(L"check" == wsToken) return TypeElement::check; - else if(L"grave" == wsToken) return TypeElement::grave; - else if(L"circle" == wsToken) return TypeElement::circle; - else if(L"ddot" == wsToken) return TypeElement::ddot; - else if(L"bar" == wsToken) return TypeElement::bar; - else if(L"harpoon" == wsToken) return TypeElement::harpoon; - else if(L"hat" == wsToken) return TypeElement::hat; - else if(L"widevec" == wsToken) return TypeElement::widevec; - else if(L"widetilde" == wsToken) return TypeElement::widetilde; - else if(L"overline" == wsToken) return TypeElement::overline; - else if(L"overstrike" == wsToken) return TypeElement::overstrike; - else if(L"wideharpoon" == wsToken) return TypeElement::wideharpoon; - else if(L"widehat" == wsToken) return TypeElement::widehat; - else if(L"underline" == wsToken) return TypeElement::underline; - else if(L"ital" == wsToken) return TypeElement::ital; - else if(L"bold" == wsToken) return TypeElement::bold; + if(L"color" == wsToken) return TypeElement::color; + else if(L"hex"==wsToken) return TypeElement::hex; + else if(L"rgb" == wsToken) return TypeElement::rgb; else if(L"black" == wsToken) return TypeElement::black; else if(L"green" == wsToken) return TypeElement::green; else if(L"aqua" == wsToken) return TypeElement::aqua; @@ -201,15 +383,22 @@ namespace StarMath else if(L"lavender" == wsToken) return TypeElement::lavender; else return TypeElement::undefine; } + TypeElement CAttribute::GetTypeFontAttribute(const std::wstring &wsToken) + { + if(L"bold" == wsToken) return TypeElement::bold; + else if(L"size" == wsToken) return TypeElement::size; + else if(L"font" == wsToken) return TypeElement::font; + else if(L"ital" == wsToken) return TypeElement::ital; + else if(L"phantom" == wsToken ) return TypeElement::phantom; + else if(L"overstrike" == wsToken) return TypeElement::overstrike; + else return TypeElement::undefine; + } //class methods CElement CElement::~CElement() { - for(CAttribute* pTemp:m_arElementAttributes) - { - delete pTemp; - } + delete m_pAttribute; } - CElement::CElement() + CElement::CElement(): m_pAttribute(nullptr) {} CElement* CElement::CreateElement(CStarMathReader* pReader) { @@ -238,13 +427,15 @@ namespace StarMath return new CElementSpecialSymbol(pReader->GetLocalType()); case TypeElement::Index: return new CElementIndex(pReader->GetLocalType()); + case TypeElement::Mark: + return new CElementDiacriticalMark(pReader->GetLocalType()); default: return nullptr; } } - void CElement::SetAttribute(const std::vector arAttr) + void CElement::SetAttribute(CAttribute* pAttribute) { - m_arElementAttributes = arAttr; + m_pAttribute = pAttribute; } const TypeElement& CElement::GetBaseType() { @@ -254,6 +445,10 @@ namespace StarMath { m_enBaseType = enType; } + CAttribute* CElement::GetAttribute() + { + return m_pAttribute; + } //class methods CElementString CElementString::CElementString(const std::wstring& wsTokenString) { @@ -273,7 +468,7 @@ namespace StarMath void CElementString::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) { oXmlWrite->WriteNodeBegin(L"m:r",false); - CConversionSMtoOOXML::StandartProperties(oXmlWrite); + CConversionSMtoOOXML::StandartProperties(oXmlWrite,GetAttribute()); oXmlWrite->WriteNodeBegin(L"m:t",false); oXmlWrite->WriteString(m_wsString); oXmlWrite->WriteNodeEnd(L"m:t",false,false); @@ -316,11 +511,13 @@ namespace StarMath { if(m_enTypeBinOp == TypeElement::frac) { - SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader)); - SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); + SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); } else { + if(m_enTypeBinOp == TypeElement::plus || TypeElement::minus == m_enTypeBinOp) + pReader->SetAttribute(GetAttribute()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); @@ -339,8 +536,8 @@ namespace StarMath if(m_enTypeBinOp == TypeElement::over || m_enTypeBinOp ==TypeElement::division) { oXmlWrite->WriteNodeBegin(L"m:f",false); - if(m_enTypeBinOp == TypeElement::division) CConversionSMtoOOXML::PropertiesMFPR(true,L"lin",oXmlWrite); - else CConversionSMtoOOXML::PropertiesMFPR(false,L"",oXmlWrite); + if(m_enTypeBinOp == TypeElement::division) CConversionSMtoOOXML::PropertiesMFPR(true,L"lin",oXmlWrite,GetAttribute()); + else CConversionSMtoOOXML::PropertiesMFPR(false,L"",oXmlWrite,GetAttribute()); CConversionSMtoOOXML::BlockRecording(L"m:num",m_pLeftArgument,oXmlWrite); CConversionSMtoOOXML::BlockRecording(L"m:den",m_pRightArgument,oXmlWrite); oXmlWrite->WriteNodeEnd(L"m:f",false,false); @@ -349,7 +546,7 @@ namespace StarMath { m_pLeftArgument->ConversionToOOXML(oXmlWrite); oXmlWrite->WriteNodeBegin(L"m:r",false); - CConversionSMtoOOXML::StandartProperties(oXmlWrite); + CConversionSMtoOOXML::StandartProperties(oXmlWrite,GetAttribute()); oXmlWrite->WriteNodeBegin(L"m:t",false); switch (m_enTypeBinOp) { @@ -504,6 +701,7 @@ namespace StarMath } while(enBracketClose == TypeElement::undefine) { + pReader->SetAttributeTemp(GetAttribute()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); if(!m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType())) { @@ -523,6 +721,7 @@ namespace StarMath else enBracketClose = GetBracketClose(pReader->GetString()); } //доработать() + pReader->ClearAttributeTemp(); pReader->ClearReader(); } void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) @@ -530,7 +729,7 @@ namespace StarMath if(m_enTypeBracket != TypeElement::brace) { pXmlWrite->WriteNodeBegin(L"m:d",false); - CConversionSMtoOOXML::PropertiesDPr(pXmlWrite,m_enTypeBracket); + CConversionSMtoOOXML::PropertiesDPr(pXmlWrite,m_enTypeBracket,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:e",false); for(CElement* oTemp:m_arBrecketValue) { @@ -624,7 +823,7 @@ namespace StarMath { m_pLeftArgument->ConversionToOOXML(pXmlWrite); pXmlWrite->WriteNodeBegin(L"m:r", false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:t",false); switch(m_enTypeSet) { @@ -728,11 +927,13 @@ namespace StarMath } void CElementConnection::Parse(CStarMathReader *pReader) { + pReader->SetAttribute(GetAttribute()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex || pReader->GetGlobalType() == TypeElement::Index) { + pReader->SetAttribute(GetAttribute()); CElement* pBinOp = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); SetRightArg(pBinOp); @@ -744,7 +945,7 @@ namespace StarMath { m_pLeftArgument->ConversionToOOXML(pXmlWrite); pXmlWrite->WriteNodeBegin(L"m:r",false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:t",false); switch(m_enTypeCon) { @@ -943,7 +1144,7 @@ namespace StarMath pXmlWrite->WriteNodeBegin(wsNameNodeIndex,false); pXmlWrite->WriteNodeBegin(wsNameNodeIndex+L"Pr",false); pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValue,pXmlWrite); @@ -963,7 +1164,7 @@ namespace StarMath pXmlWrite->WriteNodeBegin(L"m:sPre",false); pXmlWrite->WriteNodeBegin(L"m:sPrePr",false); pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); pXmlWrite->WriteNodeEnd(L"m:sPrePr",false,false); if(m_enTypeIndex==TypeElement::lsup) @@ -977,6 +1178,15 @@ namespace StarMath CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValue,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); } +// else if(m_enTypeIndex == TypeElement::csup || TypeElement::csub == m_enTypeIndex) +// { +// pXmlWrite->WriteNodeBegin(L"m:acc",false); +// pXmlWrite->WriteNodeBegin(L"m:accPr",false); +// pXmlWrite->WriteNodeBegin(L"m:chr",true); +// pXmlWrite->WriteAttribute(L"m:val",L""); +// pXmlWrite->WriteNodeEnd(L"m:accPr",false,false); +// pXmlWrite->WriteNodeEnd(L"m:acc",false,false); +// } } //class methods CElementFunction CElementFunction::CElementFunction(const TypeElement &enType): m_pValue(nullptr) @@ -1014,7 +1224,7 @@ namespace StarMath void CElementFunction::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { pXmlWrite->WriteNodeBegin(L"m:func",false); - CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite); + CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:fName",false); pXmlWrite->WriteNodeBegin(L"m:r",false); pXmlWrite->WriteNodeBegin(L"m:rPr",false); @@ -1022,7 +1232,7 @@ namespace StarMath pXmlWrite->WriteAttribute(L"m:val",L"p"); pXmlWrite->WriteNodeEnd(L"w",true,true); pXmlWrite->WriteNodeEnd(L"m:rPr",false,false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:t",false); switch (m_enTypeFunction) { case TypeElement::cos: @@ -1160,7 +1370,7 @@ namespace StarMath if(L"limsup" == wsToken) return TypeElement::limsup; if(L"prod" == wsToken) return TypeElement::prod; if(L"coprod" == wsToken) return TypeElement::coprod; - if(L"Int" == wsToken) return TypeElement::Int; + if(L"int" == wsToken) return TypeElement::Int; if(L"iint" == wsToken) return TypeElement::iint; if(L"iiint" == wsToken) return TypeElement::iiint; if(L"lint" == wsToken) return TypeElement::lint; @@ -1170,54 +1380,110 @@ namespace StarMath } void CElementOperator::Parse(CStarMathReader* pReader) { + pReader->SetAttributeTemp(GetAttribute()); pReader->GetToken(); pReader->SetTypesToken(); if(pReader->GetLocalType() == TypeElement::from) { pReader->ClearReader(); - SetFromValue(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetFromValue(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); } if(pReader->GetLocalType() == TypeElement::to) { pReader->ClearReader(); - SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); } - - SetValueOperator(CParserStarMathString::ReadingWithoutBracket(pReader)); + pReader->SetAttributeTemp(GetAttribute()); + SetValueOperator(CParserStarMathString::ParseElement(pReader)); + pReader->ClearAttributeTemp(); } - void CElementOperator::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) + void CElementOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) { - if(m_enTypeOperator == TypeElement::sum) + if(m_enTypeOperator == TypeElement::lim || TypeElement::liminf == m_enTypeOperator || TypeElement::limsup == m_enTypeOperator) { - oXmlWrite->WriteNodeBegin(L"m:nary",false); - CConversionSMtoOOXML::PropertiesNaryPr(L"\u2211",nullptr == m_pValueFrom,nullptr == m_pValueTo,oXmlWrite); - if(m_pValueFrom == nullptr) oXmlWrite->WriteNode(L"m:sub",L""); + std::wstring wsTempNameNode; + if(m_pValueFrom != nullptr) + wsTempNameNode = L"m:limLow"; + else if(m_pValueTo != nullptr) + wsTempNameNode = L"m:limUpp"; + pXmlWrite->WriteNodeBegin(L"m:func",false); + CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:fName",false); + if(m_pValueFrom == nullptr && m_pValueTo == nullptr) + CConversionSMtoOOXML::WrtieRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute()); else { - CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueFrom,oXmlWrite); + pXmlWrite->WriteNodeBegin(wsTempNameNode,false); + pXmlWrite->WriteNodeBegin(wsTempNameNode+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr); + pXmlWrite->WriteNodeEnd(wsTempNameNode+L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + CConversionSMtoOOXML::WrtieRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeBegin(L"m:lim",false); + if(wsTempNameNode == L"m:limLow") + m_pValueFrom->ConversionToOOXML(pXmlWrite); + else if(wsTempNameNode == L"m:limUpp") + m_pValueTo->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:lim",false,false); + pXmlWrite->WriteNodeEnd(wsTempNameNode,false,false); } - if(m_pValueTo == nullptr) oXmlWrite->WriteNode(L"m:sup",L""); + pXmlWrite->WriteNodeEnd(L"m:fName",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + m_pValueOperator->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:func",false,false); + } + else + { + pXmlWrite->WriteNodeBegin(L"m:nary",false); + CConversionSMtoOOXML::PropertiesNaryPr(m_enTypeOperator,nullptr == m_pValueFrom,nullptr == m_pValueTo,pXmlWrite,GetAttribute()); + if(m_pValueFrom == nullptr) pXmlWrite->WriteNode(L"m:sub",L""); else { - CConversionSMtoOOXML::BlockRecording(L"m:sup",m_pValueTo,oXmlWrite); + CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueFrom,pXmlWrite); } - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValueOperator,oXmlWrite); - oXmlWrite->WriteNodeEnd(L"m:nary",false,false); + if(m_pValueTo == nullptr) pXmlWrite->WriteNode(L"m:sup",L""); + else + { + CConversionSMtoOOXML::BlockRecording(L"m:sup",m_pValueTo,pXmlWrite); + } + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValueOperator,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:nary",false,false); } } // class methods CStarMathReader - CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd): m_enGlobalType(TypeElement::Empty) + CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd): m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr),m_pAttributeTemp(nullptr) { m_itStart = itStart; m_itEnd = itEnd; + //m_pAttribute = new CAttribute(); } CStarMathReader::~CStarMathReader() - {} + { + delete m_pAttribute; + } + //TODO :: ParseColor and ParseFont void CStarMathReader::GetToken() { if(m_itStart != m_itEnd) { m_wsToken = GetElement(); + TypeElement enTypeFont =CAttribute::GetTypeFontAttribute(m_wsToken),enTypeColor = CAttribute::GetTypeColorAttribute(m_wsToken); + if(enTypeFont != TypeElement::undefine ||enTypeColor != TypeElement::undefine) + m_pAttribute = new CAttribute(); + while((enTypeFont != TypeElement::undefine ||enTypeColor != TypeElement::undefine) && m_itStart != m_itEnd) + { + if(enTypeColor == TypeElement::color) m_pAttribute->ParseColorAttribute(GetElement(),this); + else if(enTypeFont != TypeElement::undefine) m_pAttribute->ParseFontAttribute(enTypeFont,this); + + if(m_itStart != m_itEnd) + { + m_wsToken = GetElement(); + enTypeColor = CAttribute::GetTypeColorAttribute(m_wsToken); + enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); + } + } if(m_wsToken == L"left") m_wsToken = GetElement(); else if(L"right" == m_wsToken ) m_wsToken = GetElement(); } @@ -1225,12 +1491,6 @@ namespace StarMath } void CStarMathReader::SetTypesToken() { - m_enUnderType = CAttribute::GetTypeAttribute(m_wsToken); - if(m_enUnderType != TypeElement::undefine) - { - m_enGlobalType = TypeElement::Attribute; - return; - } m_enUnderType = CElementOperator::GetFromOrTo(m_wsToken); if(m_enUnderType != TypeElement::undefine) { @@ -1261,6 +1521,12 @@ namespace StarMath m_enGlobalType = TypeElement::Matrix; return; } + m_enUnderType = CElementDiacriticalMark::GetMark(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::Mark; + return; + } m_enUnderType = CElementBracket::GetBracketOpen(m_wsToken); if(m_enUnderType != TypeElement::undefine) { @@ -1332,6 +1598,7 @@ namespace StarMath m_wsToken.clear(); m_enGlobalType = TypeElement::Empty; m_enUnderType = TypeElement::Empty; + m_pAttribute = nullptr; } bool CStarMathReader::EmptyString() { @@ -1342,6 +1609,26 @@ namespace StarMath if(m_itStart !=m_itEnd) return false; else return true; } + void CStarMathReader::SetAttributeTemp(CAttribute *pAttribute) + { + m_pAttributeTemp = pAttribute; + } + void CStarMathReader::SetAttribute(CAttribute *pAttribute) + { + m_pAttribute = pAttribute; + } + CAttribute* CStarMathReader::GetAttribute() + { + return m_pAttribute; + } + CAttribute* CStarMathReader::GetAttributeTemp() + { + return m_pAttributeTemp; + } + void CStarMathReader::ClearAttributeTemp() + { + m_pAttributeTemp = nullptr; + } std::wstring CStarMathReader::GetElement() { std::wstring m_wsElement{}; @@ -1396,7 +1683,67 @@ namespace StarMath } void CElementBracketWithIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - + std::wstring wsNameNode; + switch (m_enTypeBracketWithIndex) { + case TypeElement::overbrace: + wsNameNode = L"m:limUpp"; + break; + case TypeElement::underbrace: + wsNameNode = L"m:limLow"; + break; + default: + break; + } + pXmlWrite->WriteNodeBegin(wsNameNode,false); + pXmlWrite->WriteNodeBegin(wsNameNode+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(wsNameNode+L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + pXmlWrite->WriteNodeBegin(L"m:groupChr",false); + pXmlWrite->WriteNodeBegin(L"m:groupChrPr",false); + if(TypeElement::overbrace == m_enTypeBracketWithIndex) + { + pXmlWrite->WriteNodeBegin(L"m:chr",true); + pXmlWrite->WriteAttribute(L"m:val",L"\u23DE"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:pos",true); + pXmlWrite->WriteAttribute(L"m:val",L"top"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:vertJc",true); + pXmlWrite->WriteAttribute(L"m:val",L"bot"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:groupChrPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + switch(m_enTypeBracketWithIndex) + { + case TypeElement::overbrace: + m_pLeftArg->ConversionToOOXML(pXmlWrite); + break; + case TypeElement::underbrace: + m_pValue->ConversionToOOXML(pXmlWrite); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:groupChr",false,false); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeBegin(L"m:lim",false); + switch(m_enTypeBracketWithIndex) + { + case TypeElement::overbrace: + m_pValue->ConversionToOOXML(pXmlWrite); + break; + case TypeElement::underbrace: + m_pLeftArg->ConversionToOOXML(pXmlWrite); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:lim",false,false); + pXmlWrite->WriteNodeEnd(wsNameNode,false,false); } TypeElement CElementBracketWithIndex::GetBracketWithIndex(const std::wstring &wsToken) { @@ -1449,7 +1796,7 @@ namespace StarMath { if(m_pValueFrom == nullptr && m_pValueTo == nullptr) { - CConversionSMtoOOXML::BlocGrade(pXmlWrite,m_pValueGrade); + CConversionSMtoOOXML::NodeGrade(pXmlWrite,m_pValueGrade,GetAttribute()); } else { @@ -1469,11 +1816,11 @@ namespace StarMath pXmlWrite->WriteNodeBegin(wsNodeGrade,false); pXmlWrite->WriteNodeBegin(wsNodeGrade + L"Pr",false); pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); pXmlWrite->WriteNodeEnd(wsNodeGrade + L"Pr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); - CConversionSMtoOOXML::BlocGrade(pXmlWrite,m_pValueGrade); + CConversionSMtoOOXML::NodeGrade(pXmlWrite,m_pValueGrade,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:e",false,false); if(m_pValueFrom != nullptr) { @@ -1525,18 +1872,21 @@ namespace StarMath { if(m_enTypeMatrix == TypeElement::binom) { - SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader)); - SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader)); + pReader->SetAttribute(GetAttribute()); + SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); + pReader->SetAttribute(GetAttribute()); + SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); } else { + pReader->SetAttribute(GetAttribute()); SetFirstArgument(CParserStarMathString::ParseElement(pReader)); } } void CElementMatrix::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { pXmlWrite->WriteNodeBegin(L"m:m",false); - CConversionSMtoOOXML::PropertiesMPr(pXmlWrite,m_enTypeMatrix); + CConversionSMtoOOXML::PropertiesMPr(pXmlWrite,m_enTypeMatrix,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:mr",false); switch(m_enTypeMatrix) { @@ -1586,6 +1936,128 @@ namespace StarMath pXmlWrite->WriteNodeEnd(L"m:mr",false,false); pXmlWrite->WriteNodeEnd(L"m:m",false,false); } +//class CElementDiacriticalMark + CElementDiacriticalMark::CElementDiacriticalMark(const TypeElement& enType):m_pValueMark(nullptr) + { + m_enTypeMark = enType; + SetBaseType(TypeElement::Mark); + } + CElementDiacriticalMark::~CElementDiacriticalMark() + { + delete m_pValueMark; + } + void CElementDiacriticalMark::SetValueMark(CElement *pValue) + { + m_pValueMark = pValue; + } + TypeElement CElementDiacriticalMark::GetMark(const std::wstring &wsToken) + { + if(L"acute" == wsToken) return TypeElement::acute; + else if(L"breve" == wsToken) return TypeElement::breve; + else if(L"dot" == wsToken) return TypeElement::dot; + else if(L"dddot" == wsToken) return TypeElement::dddot; + else if(L"vec" == wsToken) return TypeElement::vec; + else if(L"tilde" == wsToken) return TypeElement::tilde; + else if(L"check" == wsToken) return TypeElement::check; + else if(L"grave" == wsToken) return TypeElement::grave; + else if(L"circle" == wsToken) return TypeElement::circle; + else if(L"ddot" == wsToken) return TypeElement::ddot; + else if(L"bar" == wsToken) return TypeElement::bar; + else if(L"harpoon" == wsToken) return TypeElement::harpoon; + else if(L"hat" == wsToken) return TypeElement::hat; + else if(L"widevec" == wsToken) return TypeElement::widevec; + else if(L"widetilde" == wsToken) return TypeElement::widetilde; + else if(L"overline" == wsToken) return TypeElement::overline; + else if(L"overstrike" == wsToken) return TypeElement::overstrike; + else if(L"wideharpoon" == wsToken) return TypeElement::wideharpoon; + else if(L"widehat" == wsToken) return TypeElement::widehat; + else if(L"underline" == wsToken) return TypeElement::underline; + } + void CElementDiacriticalMark::Parse(CStarMathReader *pReader) + { + pReader->SetAttribute(GetAttribute()); + SetValueMark(CParserStarMathString::ParseElement(pReader)); + } + void CElementDiacriticalMark::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + std::wstring wsTypeMark; + switch(m_enTypeMark) + { + case TypeElement::dot: + wsTypeMark = L"\u0307"; + break; + case TypeElement::overline: + wsTypeMark = L"\u0305"; + break; + case TypeElement::vec: + wsTypeMark = L"\u279E"; + break; + case TypeElement::acute: + wsTypeMark = L"\u0301"; + break; + case TypeElement::grave: + wsTypeMark = L"\u0300"; + break; + case TypeElement::breve: + wsTypeMark = L"\u0306"; + break; + case TypeElement::circle: + wsTypeMark = L"\u030A"; + break; + case TypeElement::ddot: + wsTypeMark = L"\u0308"; + break; + case TypeElement::bar: + wsTypeMark = L"\u0304"; + break; + case TypeElement::dddot: + wsTypeMark = L"\u0309"; + break; + case TypeElement::harpoon: + wsTypeMark = L"\u21C0"; + break; + case TypeElement::tilde: + wsTypeMark = L"\u0342"; + break; + case TypeElement::hat: + wsTypeMark = L"\u0302"; + break; + case TypeElement::check: + wsTypeMark = L"\u030C"; + break; + case TypeElement::widevec: + wsTypeMark = L"\u27F6"; + break; + case TypeElement::widetilde: + wsTypeMark = L"\u0360"; + break; +// case TypeElement::wideharpoon: +// wsTypeMark = L"\u"; +// break; +// case TypeElement::widehat: +// wsTypeMark = L"\u"; +// break; + case TypeElement::underline: + wsTypeMark = L"\u0332"; + break; +// case TypeElement::: +// wsTypeMark = L"\u"; +// break; + default: + break; + } + pXmlWrite->WriteNodeBegin(L"m:acc",false); + pXmlWrite->WriteNodeBegin(L"m:accPr",false); + pXmlWrite->WriteNodeBegin(L"m:chr",true); + pXmlWrite->WriteAttribute(L"m:val",wsTypeMark); + pXmlWrite->WriteNodeEnd(L"w",true,true); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:accPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + m_pValueMark->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:acc",false,false); + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index fd08ad4af8..e1ff22d467 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -9,6 +9,40 @@ namespace StarMath { + class CStarMathReader; + + class CAttribute + { + public: + CAttribute(); + ~CAttribute(); + static TypeElement GetTypeColorAttribute(const std::wstring& wsToken); + static TypeElement GetTypeFontAttribute(const std::wstring& wsToken); + bool GetBold(); + bool GetItal(); + bool GetPhantom(); + bool GetStrike(); + unsigned int GetSize(); + std::wstring GetColor(); + bool EmptyColor(); + void ParseFontAttribute(const TypeElement& enTypeFont,CStarMathReader* pReader); + void ParseColorAttribute(const std::wstring& wsToken,CStarMathReader* pReader); + private: + void SetSize(const unsigned int& iSize); + void SetBold(); + void SetItal(); + void SetPhantom(); + void SetStrike(); + void SetColor(const TypeElement& enColor); + void SetFont(const TypeElement& enFont); + std::wstring m_wsColor; + bool m_bBold; + bool m_bItal; + bool m_bPhantom; + bool m_bStrike; + unsigned int m_iSize; + std::wstring m_wsNameFont; + }; //Сlass for working with tokens (reading, defining types, passing) class CStarMathReader { @@ -26,6 +60,11 @@ namespace StarMath void ClearReader(); bool CheckIteratorPosition(); bool EmptyString(); + void SetAttribute(CAttribute* pAttribute); + void SetAttributeTemp(CAttribute* pAttribute); + CAttribute* GetAttributeTemp(); + CAttribute* GetAttribute(); + void ClearAttributeTemp(); private: //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) std::wstring GetElement(); @@ -33,17 +72,8 @@ namespace StarMath TypeElement m_enGlobalType; TypeElement m_enUnderType; std::wstring m_wsToken; - }; - - class CAttribute - { - public: - CAttribute(const TypeElement& enType); - ~CAttribute(); - static TypeElement GetTypeAttribute(const std::wstring& wsToken); - TypeElement GetType(); - private: - TypeElement m_enTypeAttr; + CAttribute* m_pAttribute; + CAttribute* m_pAttributeTemp; }; class CElement @@ -55,11 +85,12 @@ namespace StarMath //The function creates the class we need (by determining the class type by a variable m_enGlobalType from the class CStarMathReader) static CElement* CreateElement(CStarMathReader* pReader); virtual void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) = 0; - void SetAttribute(const std::vector arAttr); + void SetAttribute(CAttribute* pAttribute); void SetBaseType(const TypeElement& enType); + CAttribute* GetAttribute(); const TypeElement& GetBaseType(); private: - std::vector m_arElementAttributes; + CAttribute* m_pAttribute; TypeElement m_enBaseType; }; @@ -264,6 +295,20 @@ namespace StarMath TypeElement m_enTypeMatrix; }; + class CElementDiacriticalMark: public CElement + { + public: + CElementDiacriticalMark(const TypeElement& enType); + virtual ~CElementDiacriticalMark(); + void SetValueMark(CElement* pValue); + static TypeElement GetMark(const std::wstring& wsToken); + private: + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pValueMark; + TypeElement m_enTypeMark; + }; + class CParserStarMathString { public: @@ -272,7 +317,7 @@ namespace StarMath //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). static void AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); static bool CheckForLeftArgument(const TypeElement& enType); - static CElement* ReadingWithoutBracket(CStarMathReader* pReader); + static CElement* ReadingWithoutBracket(CStarMathReader* pReader,CAttribute* pAttribute); private: std::vector m_arEquation; }; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index e997664bd4..bff250cba0 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -12,6 +12,7 @@ enum class TypeElement{ Bracket, BracketWithIndex, Grade, + Mark, //BracketEnd, UnarSign, Attribute, @@ -67,6 +68,10 @@ enum class TypeElement{ //attribute ital, bold, + phantom, + overstrike, + size, + font, //top element acute, breve, @@ -84,11 +89,12 @@ enum class TypeElement{ widevec, widetilde, overline, - overstrike, wideharpoon, widehat, underline,//top elements color, + hex, + rgb, black, green, aqua, From bc6e7e2831482095382eb6b9934e8571daae9612 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 22 Dec 2023 17:17:18 +0300 Subject: [PATCH 014/117] Refinement of attributes. Code refactoring. Editing logic. --- .../StarMath2OOXML/TestSMConverter/main.cpp | 78 ++-- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 39 +- .../StarMath2OOXML/cconversionsmtoooxml.h | 3 +- .../StarMath2OOXML/cstarmathpars.cpp | 344 ++++++++++++++---- .../Converter/StarMath2OOXML/cstarmathpars.h | 31 +- 5 files changed, 348 insertions(+), 147 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index b81713a1a7..3b97028104 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -750,7 +750,7 @@ TEST(SMConvectorTest,FunctionSinh) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"sinh2\u22833"; + std::wstring wsXmlString = L"sinh2\u22833"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -850,7 +850,7 @@ TEST(SMConvectorTest,FunctionArtanhArcoth) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"arcoth30\u2282artanh27"; + std::wstring wsXmlString = L"arcoth30\u2282artanh27"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -940,7 +940,7 @@ TEST(SMConvectorTest,OperatorLllint) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2102+3100"; + std::wstring wsXmlString = L"2102+3100"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -950,61 +950,31 @@ TEST(SMConvectorTest,BracketLdlineAttribute) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"10100+3+10"; + std::wstring wsXmlString = L"10100+3+10"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } -//TEST(SMConvectorTest,FunctionCos) -//{ -// std::wstring wsString = L""; -// StarMath::CParserStarMathString oTemp; -// StarMath::CConversionSMtoOOXML oTest; -// oTest.StartConversion(oTemp.Parse(wsString)); -// std::wstring wsXmlString = L""; -// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); -//} +TEST(SMConvectorTest,Example11) +{ + std::wstring wsString = L"f(x) = sum from { n=0 } to { infinity } { {f^{(n)}(x_0) } over { fact{n} } (x-x_0)^n }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"fx=n=0\u221Efnx0n\u0021x-x0n"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} -//TEST(SMConvectorTest,FunctionCos) -//{ -// std::wstring wsString = L""; -// StarMath::CParserStarMathString oTemp; -// StarMath::CConversionSMtoOOXML oTest; -// oTest.StartConversion(oTemp.Parse(wsString)); -// std::wstring wsXmlString = L""; -// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); -//} +TEST(SMConvectorTest,AttributeGrade) +{ + std::wstring wsString = L"color green bold evaluate {E = color black m c^ color yellow 2} from {color crimson b over color teal a} to color navy overstrike infinity"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"E=mc2ba\u221E"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} -//TEST(SMConvectorTest,FunctionCos) -//{ -// std::wstring wsString = L""; -// StarMath::CParserStarMathString oTemp; -// StarMath::CConversionSMtoOOXML oTest; -// oTest.StartConversion(oTemp.Parse(wsString)); -// std::wstring wsXmlString = L""; -// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); -//} - -//TEST(SMConvectorTest,FunctionCos) -//{ -// std::wstring wsString = L""; -// StarMath::CParserStarMathString oTemp; -// StarMath::CConversionSMtoOOXML oTest; -// oTest.StartConversion(oTemp.Parse(wsString)); -// std::wstring wsXmlString = L""; -// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); -//} - -//TEST(SMConvectorTest,FunctionCos) -//{ -// std::wstring wsString = L""; -// StarMath::CParserStarMathString oTemp; -// StarMath::CConversionSMtoOOXML oTest; -// oTest.StartConversion(oTemp.Parse(wsString)); -// std::wstring wsXmlString = L""; -// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); -//} - -//TEST(SMConvectorTest,FunctionCos) +//TEST(SMConvectorTest,AttributeMatrix) //{ // std::wstring wsString = L""; // StarMath::CParserStarMathString oTemp; @@ -1016,3 +986,5 @@ TEST(SMConvectorTest,BracketLdlineAttribute) + + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index a29aa78430..4173b638d7 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -54,7 +54,7 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"w:val",L"40"); pXmlWrite->WriteNodeEnd(L"w",true,true); } - else + else if(pAttribute->GetSize() != 0) { pXmlWrite->WriteNodeBegin(L"w:sz",true); pXmlWrite->WriteAttribute(L"w:val",std::to_wstring(pAttribute->GetSize())); @@ -63,13 +63,17 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"w:val",std::to_wstring(pAttribute->GetSize())); pXmlWrite->WriteNodeEnd(L"w",true,true); } - if(!pAttribute->EmptyColor() && pAttribute != nullptr) + if(!pAttribute->EmptyColor()) { pXmlWrite->WriteNodeBegin(L"w:color",true); pXmlWrite->WriteAttribute(L"w:val",pAttribute->GetColor()); pXmlWrite->WriteNodeEnd(L"w",true,true); } - if(pAttribute->GetBold()) + if(pAttribute->GetBold() && pAttribute->GetItal()) + { + WriteStyNode(pXmlWrite,L"bi"); + } + else if(pAttribute->GetBold()) { pXmlWrite->WriteNodeBegin(L"m:sty", true); pXmlWrite->WriteAttribute(L"m:val",L"b"); @@ -79,11 +83,8 @@ namespace StarMath { pXmlWrite->WriteNodeBegin(L"w:bCs",true); pXmlWrite->WriteNodeEnd(L"w",true,true); } - if(pAttribute->GetItal()) + else if(pAttribute->GetItal()) { - pXmlWrite->WriteNodeBegin(L"m:sty", true); - pXmlWrite->WriteAttribute(L"m:val",L"i"); - pXmlWrite->WriteNodeEnd(L"w",true,true); pXmlWrite->WriteNodeBegin(L"w:i",true); pXmlWrite->WriteNodeEnd(L"w",true,true); } @@ -105,22 +106,6 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"w",true,true); } WriteCtrlPrNode(pXmlWrite,pAttribute); -// pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); -// pXmlWrite->WriteNodeBegin(L"w:rPr",false); -// pXmlWrite->WriteNodeBegin(L"w:rFonts",true); -// pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); -// pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); -// pXmlWrite->WriteNodeEnd(L"w",true,true); -// pXmlWrite->WriteNode(L"w:i",L""); -// //m_pXmlWrite->WriteNode(L"w:iCs",L""); -// pXmlWrite->WriteNodeBegin(L"w:sz",true); -// pXmlWrite->WriteAttribute(L"w:val",L"40"); -// pXmlWrite->WriteNodeEnd(L"w",true,true); -// pXmlWrite->WriteNodeBegin(L"w:szCs",true); -// pXmlWrite->WriteAttribute(L"w:val",L"40"); -// pXmlWrite->WriteNodeEnd(L"w",true,true); -// pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); -// pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); pXmlWrite->WriteNodeEnd(L"m:fPr",false,false); } void CConversionSMtoOOXML::PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) @@ -306,7 +291,7 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"m:val",wsTypeLimLock); pXmlWrite->WriteNodeEnd(L"w",true,true); } - void CConversionSMtoOOXML::WrtieRPrFName(const TypeElement &enTypeOp, XmlUtils::CXmlWriter *pXmlWrite,CAttribute* pAttribute) + void CConversionSMtoOOXML::WriteRPrFName(const TypeElement &enTypeOp, XmlUtils::CXmlWriter *pXmlWrite,CAttribute* pAttribute) { pXmlWrite->WriteNodeBegin(L"m:r",false); pXmlWrite->WriteNodeBegin(L"m:rPr",false); @@ -333,5 +318,11 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"m:t",false,false); pXmlWrite->WriteNodeEnd(L"m:r",false,false); } + void CConversionSMtoOOXML::WriteStyNode(XmlUtils::CXmlWriter *pXmlWrite, const std::wstring &wsAttributeNode) + { + pXmlWrite->WriteNodeBegin(L"m:sty", true); + pXmlWrite->WriteAttribute(L"m:val",wsAttributeNode); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index c7f8a59938..692a672291 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -23,7 +23,8 @@ namespace StarMath { static void WriteCtrlPrNode(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void WriteChrNode(const std::wstring& wsTypeOp,XmlUtils::CXmlWriter* pXmlWrite); static void WriteLimLocNode(const std::wstring& wsTypeLimLock,XmlUtils::CXmlWriter* pXmlWrite); - static void WrtieRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void WriteRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void WriteStyNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsAttributeNode); void EndConversion(); std::wstring GetOOXML(); private: diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index fe620a13be..12584ca4a3 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -42,12 +42,14 @@ namespace StarMath if(pElement != nullptr) { - if(pReader->GetAttribute() != nullptr) - pElement->SetAttribute(pReader->GetAttribute()); - else if(pReader->GetAttributeTemp() != nullptr) - pElement->SetAttribute(pReader->GetAttributeTemp()); + if(pReader->GetAttribute() != nullptr && !CheckForLeftArgument(pReader->GetGlobalType())) + pElement->SetBaseAttribute(pReader->GetAttribute()); + else if(pReader->GetAttribute() != nullptr && (pReader->GetLocalType() == TypeElement::plus || TypeElement::minus == pReader->GetLocalType())) + pElement->SetBaseAttribute(pReader->GetAttribute()); pReader->ClearReader(); pElement->Parse(pReader); + if(pElement->GetAttribute() != nullptr && TypeElement::Function != pElement->GetBaseType()) + pElement->SetAttribute(pElement->GetAttribute()); return pElement; } else return pElement; @@ -100,7 +102,7 @@ namespace StarMath pReader->SetTypesToken(); while(CheckForLeftArgument(pReader->GetGlobalType())) { - pReader->SetAttributeTemp(pAttribute); +// pReader->SetAttributeTemp(pAttribute); CElement* pSecondTempElement = CParserStarMathString::ParseElement(pReader); if(pFirstTempElement != nullptr) { @@ -113,7 +115,7 @@ namespace StarMath pReader->SetTypesToken(); } } - pReader->ClearAttributeTemp(); +// pReader->ClearAttributeTemp(); return pFirstTempElement; } bool CParserStarMathString::CheckForLeftArgument(const TypeElement &enType) @@ -245,6 +247,10 @@ namespace StarMath } } } + void CAttribute::SetColor(const std::wstring &wsColor) + { + m_wsColor = wsColor; + } void CAttribute::SetFont(const TypeElement &enFont) { switch (enFont) { @@ -298,9 +304,15 @@ namespace StarMath switch(enTempColor) { case TypeElement::hex: - pReader->GetToken(); - m_wsColor = pReader->GetString(); + { + std::wstring wsTempHex; + do + { + wsTempHex += pReader->GetElement(); + }while(wsTempHex.size()< 6); + m_wsColor = wsTempHex; break; + } case TypeElement::rgb: { const int iTempLen = 7; @@ -433,10 +445,6 @@ namespace StarMath return nullptr; } } - void CElement::SetAttribute(CAttribute* pAttribute) - { - m_pAttribute = pAttribute; - } const TypeElement& CElement::GetBaseType() { return m_enBaseType; @@ -445,6 +453,26 @@ namespace StarMath { m_enBaseType = enType; } + void CElement::SetBaseAttribute(CAttribute *pAttribute) + { + if(m_pAttribute == nullptr && pAttribute != nullptr) + m_pAttribute = pAttribute; + else if(pAttribute != nullptr && pAttribute != m_pAttribute) + { + if(!m_pAttribute->GetBold() && pAttribute->GetBold()) + m_pAttribute->SetBold(); + if(!m_pAttribute->GetItal() && pAttribute->GetItal()) + m_pAttribute->SetItal(); + if(!m_pAttribute->GetPhantom() && pAttribute->GetPhantom()) + m_pAttribute->SetPhantom(); + if(!m_pAttribute->GetStrike() && pAttribute->GetStrike()) + m_pAttribute->SetStrike(); + if(m_pAttribute->EmptyColor() && !pAttribute->EmptyColor()) + m_pAttribute->SetColor(pAttribute->GetColor()); + if(m_pAttribute->GetSize() == 0 && pAttribute->GetSize() != 0) + m_pAttribute->SetSize(pAttribute->GetSize()); + } + } CAttribute* CElement::GetAttribute() { return m_pAttribute; @@ -465,14 +493,14 @@ namespace StarMath { pReader->ClearReader(); } - void CElementString::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) + void CElementString::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) { - oXmlWrite->WriteNodeBegin(L"m:r",false); - CConversionSMtoOOXML::StandartProperties(oXmlWrite,GetAttribute()); - oXmlWrite->WriteNodeBegin(L"m:t",false); - oXmlWrite->WriteString(m_wsString); - oXmlWrite->WriteNodeEnd(L"m:t",false,false); - oXmlWrite->WriteNodeEnd(L"m:r",false,false); + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(m_wsString); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); } std::wstring CElementString::GetString() { @@ -488,6 +516,20 @@ namespace StarMath } return TypeElement::String; } + TypeElement CElementString::GetWord(const std::wstring &wsToken) + { + if(wsToken.empty()) return TypeElement::undefine; + + for(wchar_t cOneElement: wsToken) + { + if(!isalpha(cOneElement)) return TypeElement::undefine; + } + return TypeElement::String; + } + void CElementString::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + } //class methods CElementBinOperator CElementBinOperator::CElementBinOperator(const TypeElement& enType): m_pLeftArgument(nullptr) , m_pRightArgument(nullptr) { @@ -516,8 +558,6 @@ namespace StarMath } else { - if(m_enTypeBinOp == TypeElement::plus || TypeElement::minus == m_enTypeBinOp) - pReader->SetAttribute(GetAttribute()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); @@ -529,6 +569,8 @@ namespace StarMath } else SetRightArg(pTempElement); +// if(TypeElement::plus == m_enTypeBinOp || TypeElement::minus == m_enTypeBinOp) +// m_pRightArgument->SetAttribute(GetAttribute()); } } void CElementBinOperator::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) @@ -586,7 +628,7 @@ namespace StarMath default: break; } - if(m_pRightArgument->GetBaseType() == TypeElement::String) + if(m_pRightArgument->GetBaseType() == TypeElement::String && GetAttribute() == m_pRightArgument->GetAttribute()) { CElementString* oNumber = dynamic_cast (m_pRightArgument); oXmlWrite->WriteString(oNumber->GetString()); @@ -644,6 +686,14 @@ namespace StarMath return false; } } + void CElementBinOperator::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pLeftArgument !=nullptr) + m_pLeftArgument->SetAttribute(pAttribute); + if(m_pRightArgument!=nullptr) + m_pRightArgument->SetAttribute(pAttribute); + } //class methods CElementBracket CElementBracket::CElementBracket(const TypeElement& enType) { @@ -701,7 +751,6 @@ namespace StarMath } while(enBracketClose == TypeElement::undefine) { - pReader->SetAttributeTemp(GetAttribute()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); if(!m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType())) { @@ -721,7 +770,7 @@ namespace StarMath else enBracketClose = GetBracketClose(pReader->GetString()); } //доработать() - pReader->ClearAttributeTemp(); + SetAttribute(GetAttribute()); pReader->ClearReader(); } void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) @@ -747,16 +796,41 @@ namespace StarMath } } + void CElementBracket::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + for(CElement* pTempElement:m_arBrecketValue) + { + if(pTempElement!=nullptr) + pTempElement->SetAttribute(pAttribute); + } + } //class methods CElementSpecialSymbol - CElementSpecialSymbol::CElementSpecialSymbol(const TypeElement &enType) + CElementSpecialSymbol::CElementSpecialSymbol(const TypeElement &enType):m_pValue(nullptr) { m_enTypeSpecial = enType; SetBaseType(TypeElement::SpecialSymbol); } CElementSpecialSymbol::~CElementSpecialSymbol() - {} + { + delete m_pValue; + } void CElementSpecialSymbol::Parse(CStarMathReader* pReader) { + switch(m_enTypeSpecial) + { + case TypeElement::fact: + { + SetValue(CParserStarMathString::ParseElement(pReader)); + break; + } + default: + break; + } + } + void CElementSpecialSymbol::SetValue(CElement* pValue) + { + m_pValue = pValue; } TypeElement CElementSpecialSymbol::GetSpecialSymbol(const std::wstring &wsToken) { @@ -769,15 +843,47 @@ namespace StarMath else if(L"setQ" == wsToken) return TypeElement::setQ; else if(L"setR" == wsToken) return TypeElement::setR; else if(L"setc" == wsToken) return TypeElement::setC; + else if(L"infinity" == wsToken) return TypeElement::infinity; + else if(L"fact" == wsToken) return TypeElement::fact; + else if(L"abs" == wsToken) return TypeElement::abs; else return TypeElement::undefine; } void CElementSpecialSymbol::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - if(m_enTypeSpecial == TypeElement::transition) + switch(m_enTypeSpecial) + { + case TypeElement::transition: { pXmlWrite->WriteNodeEnd(L"m:mr",false,false); pXmlWrite->WriteNodeBegin(L"m:mr",false); + break; } + case TypeElement::infinity: + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(L"\u221E"); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + break; + } + case TypeElement::fact: + { + if(m_pValue!= nullptr) + m_pValue->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(L"\u0021"); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } + } + } + void CElementSpecialSymbol::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); } //class methods CElementSetOperations CElementSetOperations::CElementSetOperations(const TypeElement &enType): m_pRightArgument(nullptr), m_pLeftArgument(nullptr) @@ -898,6 +1004,14 @@ namespace StarMath else if(L"owns" == wsToken) return TypeElement::owns; else return TypeElement::undefine; } + void CElementSetOperations::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pLeftArgument!= nullptr) + m_pLeftArgument->SetAttribute(pAttribute); + if(m_pRightArgument != nullptr) + m_pRightArgument->SetAttribute(pAttribute); + } //class methods CElementConnection CElementConnection::CElementConnection(const TypeElement& enType): m_pLeftArgument(nullptr), m_pRightArgument(nullptr) { @@ -1090,6 +1204,14 @@ namespace StarMath else if(L"drarrow" == wsToken) return TypeElement::drarrow; else return TypeElement::undefine; } + void CElementConnection::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pLeftArgument!= nullptr) + m_pLeftArgument->SetAttribute(pAttribute); + if(m_pRightArgument != nullptr) + m_pRightArgument->SetAttribute(pAttribute); + } //class methods CIndex CElementIndex::CElementIndex(const TypeElement& enType): m_pValueIndex(nullptr),m_pValue(nullptr) { @@ -1107,7 +1229,8 @@ namespace StarMath } void CElementIndex::SetLeftArg(CElement *pElement) { - m_pValue = pElement; + if(m_pValue == nullptr) + m_pValue = pElement; } CElement* CElementIndex::GetValueIndex() { @@ -1121,11 +1244,19 @@ namespace StarMath else if(L"lsub" == wsCheckToken) return TypeElement::lsub; else if(L"csup" == wsCheckToken) return TypeElement::csup; else if(L"csub" == wsCheckToken) return TypeElement::csub; + else if(L"nroot" == wsCheckToken) return TypeElement::nroot; + else if(L"sqrt" == wsCheckToken) return TypeElement::sqrt; else return TypeElement::undefine; } void CElementIndex::Parse(CStarMathReader *pReader) { - SetValueIndex(CParserStarMathString::ParseElement(pReader)); + if(m_enTypeIndex == TypeElement::nroot) + { + SetLeftArg(CParserStarMathString::ParseElement(pReader)); + SetValueIndex(CParserStarMathString::ParseElement(pReader)); + } + else + SetValueIndex(CParserStarMathString::ParseElement(pReader)); } void CElementIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -1178,6 +1309,26 @@ namespace StarMath CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValue,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); } + else if(m_enTypeIndex == TypeElement::nroot || TypeElement::sqrt == m_enTypeIndex) + { + pXmlWrite->WriteNodeBegin(L"m:rad",false); + pXmlWrite->WriteNodeBegin(L"m:radPr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:radPr",false,false); + if(m_pValue != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:deg",false); + m_pValue->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:deg",false,false); + } + else + { + pXmlWrite->WriteNodeBegin(L"m:deg",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValueIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:rad",false,false); + } // else if(m_enTypeIndex == TypeElement::csup || TypeElement::csub == m_enTypeIndex) // { // pXmlWrite->WriteNodeBegin(L"m:acc",false); @@ -1188,6 +1339,14 @@ namespace StarMath // pXmlWrite->WriteNodeEnd(L"m:acc",false,false); // } } + void CElementIndex::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValue != nullptr) + m_pValue->SetAttribute(pAttribute); + if(m_pValueIndex != nullptr) + m_pValueIndex->SetAttribute(pAttribute); + } //class methods CElementFunction CElementFunction::CElementFunction(const TypeElement &enType): m_pValue(nullptr) { @@ -1212,11 +1371,11 @@ namespace StarMath CElement* pTemp = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::Index) + if(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) { - CElement* pBinOp = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTemp,pBinOp); - pTemp = pBinOp; + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTemp,pTempElement); + pTemp = pTempElement; } SetValueFunction(pTemp); //pReader->ClearReader(); @@ -1283,6 +1442,15 @@ namespace StarMath case TypeElement::arcoth: pXmlWrite->WriteString(L"arcoth"); break; + case TypeElement::log: + pXmlWrite->WriteString(L"log"); + break; + case TypeElement::ln: + pXmlWrite->WriteString(L"ln"); + break; + case TypeElement::exp: + pXmlWrite->WriteString(L"exp"); + break; default: break; } @@ -1296,10 +1464,7 @@ namespace StarMath } TypeElement CElementFunction::GetFunction(const std::wstring &wsToken) { - if(L"abs" == wsToken) return TypeElement::abs; - else if(L"fact" == wsToken) return TypeElement::fact; - else if(L"sqrt" == wsToken) return TypeElement::sqrt; - else if(L"sin" == wsToken) return TypeElement::sin; + if(L"sin" == wsToken) return TypeElement::sin; else if(L"cos" == wsToken) return TypeElement::cos; else if(L"tan" == wsToken) return TypeElement::tan; else if(L"cot" == wsToken) return TypeElement::cot; @@ -1320,6 +1485,12 @@ namespace StarMath else if(L"log" == wsToken) return TypeElement::log; else return TypeElement::undefine; } + void CElementFunction::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValue != nullptr) + m_pValue->SetAttribute(pAttribute); + } //class methods CElementOperation CElementOperator::CElementOperator(const TypeElement &enType): m_pValueFrom(nullptr), m_pValueTo(nullptr), m_pValueOperator(nullptr) { @@ -1380,7 +1551,7 @@ namespace StarMath } void CElementOperator::Parse(CStarMathReader* pReader) { - pReader->SetAttributeTemp(GetAttribute()); +// pReader->SetAttributeTemp(GetAttribute()); pReader->GetToken(); pReader->SetTypesToken(); if(pReader->GetLocalType() == TypeElement::from) @@ -1393,9 +1564,9 @@ namespace StarMath pReader->ClearReader(); SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); } - pReader->SetAttributeTemp(GetAttribute()); +// pReader->SetAttributeTemp(GetAttribute()); SetValueOperator(CParserStarMathString::ParseElement(pReader)); - pReader->ClearAttributeTemp(); +// pReader->ClearAttributeTemp(); } void CElementOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) { @@ -1410,7 +1581,7 @@ namespace StarMath CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:fName",false); if(m_pValueFrom == nullptr && m_pValueTo == nullptr) - CConversionSMtoOOXML::WrtieRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute()); else { pXmlWrite->WriteNodeBegin(wsTempNameNode,false); @@ -1418,7 +1589,7 @@ namespace StarMath CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr); pXmlWrite->WriteNodeEnd(wsTempNameNode+L"Pr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); - CConversionSMtoOOXML::WrtieRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeBegin(L"m:lim",false); if(wsTempNameNode == L"m:limLow") @@ -1452,8 +1623,18 @@ namespace StarMath pXmlWrite->WriteNodeEnd(L"m:nary",false,false); } } + void CElementOperator::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValueOperator!= nullptr) + m_pValueOperator->SetAttribute(pAttribute); + if(m_pValueFrom!= nullptr) + m_pValueFrom->SetAttribute(pAttribute); + if(m_pValueTo!=nullptr) + m_pValueTo->SetAttribute(pAttribute); + } // class methods CStarMathReader - CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd): m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr),m_pAttributeTemp(nullptr) + CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd): m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr) { m_itStart = itStart; m_itEnd = itEnd; @@ -1575,6 +1756,12 @@ namespace StarMath m_enGlobalType = TypeElement::Operation; return; } + m_enUnderType = CElementString::GetWord(m_wsToken); + if(m_enUnderType != TypeElement::undefine) + { + m_enGlobalType = TypeElement::String; + return; + } if(m_enUnderType == TypeElement::undefine) { m_enGlobalType = TypeElement::Empty; @@ -1609,10 +1796,6 @@ namespace StarMath if(m_itStart !=m_itEnd) return false; else return true; } - void CStarMathReader::SetAttributeTemp(CAttribute *pAttribute) - { - m_pAttributeTemp = pAttribute; - } void CStarMathReader::SetAttribute(CAttribute *pAttribute) { m_pAttribute = pAttribute; @@ -1621,14 +1804,6 @@ namespace StarMath { return m_pAttribute; } - CAttribute* CStarMathReader::GetAttributeTemp() - { - return m_pAttributeTemp; - } - void CStarMathReader::ClearAttributeTemp() - { - m_pAttributeTemp = nullptr; - } std::wstring CStarMathReader::GetElement() { std::wstring m_wsElement{}; @@ -1640,11 +1815,11 @@ namespace StarMath m_itStart++; break; } - else if(!m_wsElement.empty() && (*m_itStart == L'[' || *m_itStart == L']' || *m_itStart == L'(' || L')' == *m_itStart || *m_itStart == L'{' || *m_itStart == L'}' || *m_itStart == L'+' || *m_itStart == L'-' || *m_itStart == L'/' || *m_itStart == L'*' || L'^' == *m_itStart || L'_' == *m_itStart || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (iswalpha(*m_itStart) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) + else if(!m_wsElement.empty() && (CheckTokenForGetElement(*m_itStart) || *m_itStart == L'(' || L')' == *m_itStart ||(L'#' == *m_itStart && L'#' != m_wsElement.back()) || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (iswalpha(*m_itStart) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) { return m_wsElement; } - else if(((*m_itStart == L'{' || *m_itStart == L'}' || *m_itStart == L'+' || *m_itStart == L'-' || *m_itStart == L'/' || *m_itStart == L'*' || L'^' == *m_itStart || L'_' == *m_itStart || L'=' == *m_itStart || *m_itStart == L'[' || *m_itStart == L']') && m_wsElement.empty()) || (!m_wsElement.empty() && ((m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) + else if((( CheckTokenForGetElement(*m_itStart) || L'=' == *m_itStart) && m_wsElement.empty()) || (!m_wsElement.empty() && ((L'#' == m_wsElement.back() && L'#' == *m_itStart) || (m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) { m_wsElement.push_back(*m_itStart); m_itStart++; @@ -1658,6 +1833,20 @@ namespace StarMath if(!m_wsElement.empty()) return m_wsElement; else return {}; } + bool CStarMathReader::CheckTokenForGetElement(const char &cToken) + { + if(L'[' == cToken) return true; + else if(L']' == cToken) return true; + else if(L'{' == cToken) return true; + else if(L'}' == cToken) return true; + else if(L'_' == cToken) return true; + else if(L'^' == cToken) return true; + else if(L'*' == cToken) return true; + else if(L'/' == cToken) return true; + else if(L'-' == cToken) return true; + else if(L'+' == cToken) return true; + else return false; + } //class methods CElementBracketWithIndex CElementBracketWithIndex::CElementBracketWithIndex(const TypeElement &enType): m_pLeftArg(nullptr), m_pValue(nullptr) { @@ -1751,6 +1940,14 @@ namespace StarMath else if(L"underbrace" == wsToken) return TypeElement::underbrace; else return TypeElement::undefine; } + void CElementBracketWithIndex::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValue!= nullptr) + m_pValue->SetAttribute(pAttribute); + if(m_pLeftArg != nullptr) + m_pLeftArg->SetAttribute(pAttribute); + } //class methods CElementGrade CElementGrade::CElementGrade(): m_pValueFrom(nullptr), m_pValueGrade(nullptr), m_pValueTo(nullptr) { @@ -1791,6 +1988,8 @@ namespace StarMath pReader->ClearReader(); SetValueTo(CParserStarMathString::ParseElement(pReader)); } + if(GetAttribute() != nullptr) + SetAttribute(GetAttribute()); } void CElementGrade::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -1842,6 +2041,16 @@ namespace StarMath if(L"evaluate" == wsToken) return TypeElement::evaluate; else return TypeElement::undefine; } + void CElementGrade::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValueGrade!=nullptr) + m_pValueGrade->SetAttribute(pAttribute); + if(m_pValueFrom!=nullptr) + m_pValueFrom->SetAttribute(pAttribute); + if(m_pValueTo!=nullptr) + m_pValueTo->SetAttribute(pAttribute); + } //class methods CElementMatrix CElementMatrix::CElementMatrix(const TypeElement &enType): m_pFirstArgument(nullptr), m_pSecondArgument(nullptr) { @@ -1872,16 +2081,15 @@ namespace StarMath { if(m_enTypeMatrix == TypeElement::binom) { - pReader->SetAttribute(GetAttribute()); SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); - pReader->SetAttribute(GetAttribute()); SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); } else { - pReader->SetAttribute(GetAttribute()); SetFirstArgument(CParserStarMathString::ParseElement(pReader)); } + if(GetAttribute() != nullptr) + SetAttribute(GetAttribute()); } void CElementMatrix::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -1936,6 +2144,14 @@ namespace StarMath pXmlWrite->WriteNodeEnd(L"m:mr",false,false); pXmlWrite->WriteNodeEnd(L"m:m",false,false); } + void CElementMatrix::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pFirstArgument != nullptr) + m_pFirstArgument->SetAttribute(pAttribute); + if(m_pSecondArgument != nullptr) + m_pSecondArgument->SetAttribute(pAttribute); + } //class CElementDiacriticalMark CElementDiacriticalMark::CElementDiacriticalMark(const TypeElement& enType):m_pValueMark(nullptr) { @@ -1975,7 +2191,7 @@ namespace StarMath } void CElementDiacriticalMark::Parse(CStarMathReader *pReader) { - pReader->SetAttribute(GetAttribute()); + //pReader->SetAttribute(GetAttribute()); SetValueMark(CParserStarMathString::ParseElement(pReader)); } void CElementDiacriticalMark::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) @@ -2058,6 +2274,12 @@ namespace StarMath pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeEnd(L"m:acc",false,false); } + void CElementDiacriticalMark::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValueMark != nullptr) + m_pValueMark->SetAttribute(pAttribute); + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index e1ff22d467..915c2f646a 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -27,14 +27,15 @@ namespace StarMath bool EmptyColor(); void ParseFontAttribute(const TypeElement& enTypeFont,CStarMathReader* pReader); void ParseColorAttribute(const std::wstring& wsToken,CStarMathReader* pReader); - private: void SetSize(const unsigned int& iSize); void SetBold(); void SetItal(); void SetPhantom(); void SetStrike(); void SetColor(const TypeElement& enColor); + void SetColor(const std::wstring& wsColor); void SetFont(const TypeElement& enFont); + private: std::wstring m_wsColor; bool m_bBold; bool m_bItal; @@ -61,19 +62,16 @@ namespace StarMath bool CheckIteratorPosition(); bool EmptyString(); void SetAttribute(CAttribute* pAttribute); - void SetAttributeTemp(CAttribute* pAttribute); - CAttribute* GetAttributeTemp(); CAttribute* GetAttribute(); - void ClearAttributeTemp(); - private: //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) std::wstring GetElement(); + private: + bool CheckTokenForGetElement(const char& cToken); std::wstring::iterator m_itStart,m_itEnd; TypeElement m_enGlobalType; TypeElement m_enUnderType; std::wstring m_wsToken; CAttribute* m_pAttribute; - CAttribute* m_pAttributeTemp; }; class CElement @@ -85,7 +83,8 @@ namespace StarMath //The function creates the class we need (by determining the class type by a variable m_enGlobalType from the class CStarMathReader) static CElement* CreateElement(CStarMathReader* pReader); virtual void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) = 0; - void SetAttribute(CAttribute* pAttribute); + virtual void SetAttribute(CAttribute* pAttribute) = 0; + void SetBaseAttribute(CAttribute* pAttribute); void SetBaseType(const TypeElement& enType); CAttribute* GetAttribute(); const TypeElement& GetBaseType(); @@ -104,6 +103,7 @@ namespace StarMath CElement* GetValueIndex(); static TypeElement GetIndex(const std::wstring& wsCheckToken); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValueIndex; @@ -119,9 +119,11 @@ namespace StarMath void SetString(const std::wstring& wsTokenString); std::wstring GetString(); static TypeElement GetDigit(const std::wstring& wsCheckToken); + static TypeElement GetWord(const std::wstring& wsToken); + void SetAttribute(CAttribute* pAttribute) override; private: void Parse(CStarMathReader* pReader) override; - void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; std::wstring m_wsString; }; @@ -137,6 +139,7 @@ namespace StarMath CElement* GetLeftArg(); static TypeElement GetBinOperator(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute) override; bool IsBinOperatorLowPrior(); void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; @@ -159,6 +162,7 @@ namespace StarMath static TypeElement GetOperator(const std::wstring& wsToken); static TypeElement GetFromOrTo(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute); void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; CElement* m_pValueOperator; @@ -177,6 +181,7 @@ namespace StarMath void SetValueTo(CElement* pElement); static TypeElement GetGrade(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValueGrade; @@ -193,6 +198,7 @@ namespace StarMath static TypeElement GetBracketOpen(const std::wstring& wsToken); std::vector GetBracketValue(); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override;// TypeElement GetBracketClose(const std::wstring& wsToken); @@ -209,6 +215,7 @@ namespace StarMath void SetBracketValue(CElement* pElement); static TypeElement GetBracketWithIndex(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pLeftArg; @@ -227,6 +234,7 @@ namespace StarMath CElement* GetRightArg(); static TypeElement GetSetOperation(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pLeftArgument; @@ -245,6 +253,7 @@ namespace StarMath CElement* GetLeftArg(); static TypeElement GetConnection(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pLeftArgument; @@ -261,6 +270,7 @@ namespace StarMath CElement* GetValueFunction(); static TypeElement GetFunction(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValue; @@ -273,9 +283,12 @@ namespace StarMath CElementSpecialSymbol(const TypeElement& enType); virtual ~CElementSpecialSymbol(); static TypeElement GetSpecialSymbol(const std::wstring& wsToken); + void SetValue(CElement* pValue); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pValue; TypeElement m_enTypeSpecial; }; @@ -288,6 +301,7 @@ namespace StarMath void SetSecondArgument(CElement* pElement); static TypeElement GetMatrix(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader *pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pFirstArgument; @@ -303,6 +317,7 @@ namespace StarMath void SetValueMark(CElement* pValue); static TypeElement GetMark(const std::wstring& wsToken); private: + void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValueMark; From ec89b34514822c207b8f3ebd99804a7978a5ad6a Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Thu, 18 Jan 2024 13:05:41 +0300 Subject: [PATCH 015/117] editing diacritics, unary marks. bug fixing. --- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 15 +- .../StarMath2OOXML/cconversionsmtoooxml.h | 3 +- .../StarMath2OOXML/cstarmathpars.cpp | 294 +++++++++++++----- .../Converter/StarMath2OOXML/cstarmathpars.h | 10 +- .../Converter/StarMath2OOXML/typeselements.h | 10 +- 5 files changed, 244 insertions(+), 88 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 4173b638d7..cbf8962794 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -158,10 +158,11 @@ namespace StarMath { WriteCtrlPrNode(pXmlWrite,pAttribute); pXmlWrite->WriteNodeEnd(L"m:naryPr",false,false); } - void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *CValueBlock,XmlUtils::CXmlWriter* pXmlWrite) + void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *pValueBlock,XmlUtils::CXmlWriter* pXmlWrite) { pXmlWrite->WriteNodeBegin(wsNameBlock,false); - CValueBlock->ConversionToOOXML(pXmlWrite); + if(pValueBlock != nullptr) + pValueBlock->ConversionToOOXML(pXmlWrite); pXmlWrite->WriteNodeEnd(wsNameBlock,false,false); } std::wstring CConversionSMtoOOXML::GetOOXML() @@ -324,5 +325,15 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"m:val",wsAttributeNode); pXmlWrite->WriteNodeEnd(L"w",true,true); } + void CConversionSMtoOOXML::WritePreserveBlock(XmlUtils::CXmlWriter *pXmlWrite,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeBegin(L"m:t",true); + pXmlWrite->WriteAttribute(L"xml:space",L"preserve"); + pXmlWrite->WriteNodeEnd(L"w",true,false); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 692a672291..7656f54f25 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -16,7 +16,7 @@ namespace StarMath { static void PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); - static void BlockRecording(const std::wstring& wsNameBlock,CElement* CValueBlock,XmlUtils::CXmlWriter* pXmlWrite); + static void BlockRecording(const std::wstring& wsNameBlock,CElement* pValueBlock,XmlUtils::CXmlWriter* pXmlWrite); static void PropertiesDPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeBracket,CAttribute* pAttribute); static void PropertiesMPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeMatrix,CAttribute* pAttribute); static void NodeGrade(XmlUtils::CXmlWriter* pXmlWrite,CElement* pValueGrade,CAttribute* pAttribute); @@ -25,6 +25,7 @@ namespace StarMath { static void WriteLimLocNode(const std::wstring& wsTypeLimLock,XmlUtils::CXmlWriter* pXmlWrite); static void WriteRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void WriteStyNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsAttributeNode); + static void WritePreserveBlock(XmlUtils::CXmlWriter* pXmlWrite, CAttribute *pAttribute); void EndConversion(); std::wstring GetOOXML(); private: diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 12584ca4a3..d35669edb3 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -11,11 +11,11 @@ namespace StarMath { CElement* pTempElement = ParseElement(pReader); if(nullptr == pTempElement) - break; + continue; if(!m_arEquation.empty() && CheckForLeftArgument(pTempElement->GetBaseType()) ) { - AddLeftArgument(m_arEquation.back(),pTempElement); - m_arEquation.pop_back(); + if(AddLeftArgument(m_arEquation.back(),pTempElement)) + m_arEquation.pop_back(); } m_arEquation.push_back(pTempElement); } @@ -52,24 +52,32 @@ namespace StarMath pElement->SetAttribute(pElement->GetAttribute()); return pElement; } - else return pElement; + else + { + pReader->ClearReader(); + return pElement; + } } template - void SetLeft(CElement *pLeftArg, CElement *pElementWhichAdd) + bool SetLeft(CElement *pLeftArg, CElement *pElementWhichAdd) { T* pTempElement = dynamic_cast(pElementWhichAdd); - pTempElement->SetLeftArg(pLeftArg); - pElementWhichAdd = pTempElement; + if(pTempElement->GetLeftArg() == nullptr) + { + pTempElement->SetLeftArg(pLeftArg); + pElementWhichAdd = pTempElement; + return true; + } + else return false; } - void CParserStarMathString::AddLeftArgument(CElement *pLeftArg, CElement *pElementWhichAdd) + bool CParserStarMathString::AddLeftArgument(CElement *pLeftArg, CElement *pElementWhichAdd) { switch(pElementWhichAdd->GetBaseType()) { case TypeElement::BinOperator: { - SetLeft(pLeftArg, pElementWhichAdd); - break; + return SetLeft(pLeftArg, pElementWhichAdd); } case TypeElement::SetOperations: { @@ -78,31 +86,27 @@ namespace StarMath } case TypeElement::Connection: { - SetLeft(pLeftArg,pElementWhichAdd); - break; + return SetLeft(pLeftArg,pElementWhichAdd); } case TypeElement::BracketWithIndex: { - SetLeft(pLeftArg,pElementWhichAdd); - break; + return SetLeft(pLeftArg,pElementWhichAdd); } case TypeElement::Index: { - SetLeft(pLeftArg,pElementWhichAdd); - break; + return SetLeft(pLeftArg,pElementWhichAdd); } default: break; } } - CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader,CAttribute* pAttribute) + CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader) { CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - while(CheckForLeftArgument(pReader->GetGlobalType())) + while(CheckForLeftArgument(pReader->GetGlobalType()) && (pReader->GetLocalType() != TypeElement::frac || pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt)) { -// pReader->SetAttributeTemp(pAttribute); CElement* pSecondTempElement = CParserStarMathString::ParseElement(pReader); if(pFirstTempElement != nullptr) { @@ -115,7 +119,6 @@ namespace StarMath pReader->SetTypesToken(); } } -// pReader->ClearAttributeTemp(); return pFirstTempElement; } bool CParserStarMathString::CheckForLeftArgument(const TypeElement &enType) @@ -553,15 +556,19 @@ namespace StarMath { if(m_enTypeBinOp == TypeElement::frac) { - SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); - SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); + SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader)); + } + else if(m_enTypeBinOp == TypeElement::And || m_enTypeBinOp == TypeElement::neg) + { + SetRightArg(CParserStarMathString::ParseElement(pReader)); } else { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex || pReader->GetGlobalType() == TypeElement::Index) + if((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { CElement* pBinOp = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); @@ -569,8 +576,6 @@ namespace StarMath } else SetRightArg(pTempElement); -// if(TypeElement::plus == m_enTypeBinOp || TypeElement::minus == m_enTypeBinOp) -// m_pRightArgument->SetAttribute(GetAttribute()); } } void CElementBinOperator::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) @@ -584,9 +589,10 @@ namespace StarMath CConversionSMtoOOXML::BlockRecording(L"m:den",m_pRightArgument,oXmlWrite); oXmlWrite->WriteNodeEnd(L"m:f",false,false); } - else if(m_enTypeBinOp == TypeElement::plus ||m_enTypeBinOp == TypeElement::minus || m_enTypeBinOp == TypeElement::multipl || m_enTypeBinOp == TypeElement::cdot || m_enTypeBinOp == TypeElement::times || m_enTypeBinOp == TypeElement::div || m_enTypeBinOp == TypeElement::odivide || m_enTypeBinOp == TypeElement::oplus || m_enTypeBinOp == TypeElement::ominus || m_enTypeBinOp == TypeElement::odot || m_enTypeBinOp == TypeElement::otimes) + else //if(m_enTypeBinOp == TypeElement::plus ||m_enTypeBinOp == TypeElement::minus || m_enTypeBinOp == TypeElement::multipl || m_enTypeBinOp == TypeElement::cdot || m_enTypeBinOp == TypeElement::times || m_enTypeBinOp == TypeElement::div || m_enTypeBinOp == TypeElement::odivide || m_enTypeBinOp == TypeElement::oplus || m_enTypeBinOp == TypeElement::ominus || m_enTypeBinOp == TypeElement::odot || m_enTypeBinOp == TypeElement::otimes) { - m_pLeftArgument->ConversionToOOXML(oXmlWrite); + if(m_pLeftArgument!=nullptr) + m_pLeftArgument->ConversionToOOXML(oXmlWrite); oXmlWrite->WriteNodeBegin(L"m:r",false); CConversionSMtoOOXML::StandartProperties(oXmlWrite,GetAttribute()); oXmlWrite->WriteNodeBegin(L"m:t",false); @@ -625,10 +631,22 @@ namespace StarMath case TypeElement::otimes: oXmlWrite->WriteString(L"\u2297"); break; + case TypeElement::plus_minus: + oXmlWrite->WriteString(L"\u00B1"); + break; + case TypeElement::minus_plus: + oXmlWrite->WriteString(L"\u2213"); + break; + case TypeElement::Or: + oXmlWrite->WriteString(L"\u2228"); + break; + case TypeElement::And: + oXmlWrite->WriteString(L"\u2227"); + break; default: break; } - if(m_pRightArgument->GetBaseType() == TypeElement::String && GetAttribute() == m_pRightArgument->GetAttribute()) + if(m_pRightArgument!=nullptr && m_pRightArgument->GetBaseType() == TypeElement::String && GetAttribute() == m_pRightArgument->GetAttribute()) { CElementString* oNumber = dynamic_cast (m_pRightArgument); oXmlWrite->WriteString(oNumber->GetString()); @@ -639,7 +657,8 @@ namespace StarMath { oXmlWrite->WriteNodeEnd(L"m:t",false,false); oXmlWrite->WriteNodeEnd(L"m:r",false,false); - m_pRightArgument->ConversionToOOXML(oXmlWrite); + if(m_pRightArgument!= nullptr) + m_pRightArgument->ConversionToOOXML(oXmlWrite); } } @@ -667,6 +686,11 @@ namespace StarMath else if(L"odivide" == wsToken) return TypeElement::odivide; else if(L"wideslash" == wsToken) return TypeElement::wideslash; else if(L"widebslash" == wsToken) return TypeElement::widebslash; + else if(L"+-" == wsToken) return TypeElement::plus_minus; + else if(L"-+" == wsToken) return TypeElement::minus_plus; + else if(L"neg" == wsToken) return TypeElement::neg; + else if(L"or" == wsToken) return TypeElement::Or; + else if(L"and" == wsToken) return TypeElement::And; else return TypeElement::undefine; } bool CElementBinOperator::IsBinOperatorLowPrior() @@ -682,6 +706,8 @@ namespace StarMath return true; case TypeElement::circ: return true; + case TypeElement::Or: + return true; default: return false; } @@ -694,6 +720,14 @@ namespace StarMath if(m_pRightArgument!=nullptr) m_pRightArgument->SetAttribute(pAttribute); } + CElement* CElementBinOperator::GetLeftArg() + { + return m_pLeftArgument; + } + CElement* CElementBinOperator::GetRightArg() + { + return m_pRightArgument; + } //class methods CElementBracket CElementBracket::CElementBracket(const TypeElement& enType) { @@ -754,8 +788,8 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); if(!m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType())) { - CParserStarMathString::AddLeftArgument(m_arBrecketValue.back(),pTempElement); - m_arBrecketValue.pop_back(); + if(CParserStarMathString::AddLeftArgument(m_arBrecketValue.back(),pTempElement)) + m_arBrecketValue.pop_back(); } m_arBrecketValue.push_back(pTempElement); if(pReader->EmptyString()) @@ -846,10 +880,26 @@ namespace StarMath else if(L"infinity" == wsToken) return TypeElement::infinity; else if(L"fact" == wsToken) return TypeElement::fact; else if(L"abs" == wsToken) return TypeElement::abs; + else if(L"`" == wsToken) return TypeElement::interval; + else if(L"~" == wsToken) return TypeElement::emptiness; + else if(L"partial" == wsToken) return TypeElement::partial; + else if(L"nabla" == wsToken) return TypeElement::nabla; + else if(L"exists" == wsToken) return TypeElement::exists; + else if(L"notexists" == wsToken) return TypeElement::notexists; + else if(L"forall" == wsToken) return TypeElement::forall; + else if(L"hbar" == wsToken) return TypeElement::hbar; + else if(L"lambdabar" == wsToken) return TypeElement::lambdabar; + else if(L"Re" == wsToken) return TypeElement::Re; + else if(L"Im" == wsToken) return TypeElement::Im; + else if(L"wp" == wsToken) return TypeElement::wp; + else if(L"laplace" == wsToken) return TypeElement::laplace; + else if(L"fourier" == wsToken) return TypeElement::fourier; + else if(L"backepsilon" == wsToken) return TypeElement::backepsilon; else return TypeElement::undefine; } void CElementSpecialSymbol::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { + SetWsTypeSymbol(); switch(m_enTypeSpecial) { case TypeElement::transition: @@ -858,16 +908,6 @@ namespace StarMath pXmlWrite->WriteNodeBegin(L"m:mr",false); break; } - case TypeElement::infinity: - { - pXmlWrite->WriteNodeBegin(L"m:r",false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); - pXmlWrite->WriteNodeBegin(L"m:t",false); - pXmlWrite->WriteString(L"\u221E"); - pXmlWrite->WriteNodeEnd(L"m:t",false,false); - pXmlWrite->WriteNodeEnd(L"m:r",false,false); - break; - } case TypeElement::fact: { if(m_pValue!= nullptr) @@ -878,6 +918,33 @@ namespace StarMath pXmlWrite->WriteString(L"\u0021"); pXmlWrite->WriteNodeEnd(L"m:t",false,false); pXmlWrite->WriteNodeEnd(L"m:r",false,false); + break; + } + case TypeElement::interval: + { + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + break; + } + case TypeElement::emptiness: + { + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + break; + } + default: + { + if(!m_wsType.empty()) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(m_wsType); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } + break; } } } @@ -885,6 +952,56 @@ namespace StarMath { SetBaseAttribute(pAttribute); } + void CElementSpecialSymbol::SetWsTypeSymbol() + { + switch(m_enTypeSpecial) + { + case TypeElement::infinity: + m_wsType = L"\u221E"; + break; + case TypeElement::partial: + m_wsType = L"\u2202"; + break; + case TypeElement::nabla: + m_wsType = L"\u2207"; + break; + case TypeElement::exists: + m_wsType = L"\u2203"; + break; + case TypeElement::notexists: + m_wsType = L"\u2204"; + break; + case TypeElement::forall: + m_wsType = L"\u2200"; + break; + case TypeElement::hbar: + m_wsType = L"\u"; + break; + case TypeElement::lambdabar: + m_wsType = L"\u"; + break; + case TypeElement::Re: + m_wsType = L"\u211C"; + break; + case TypeElement::Im: + m_wsType = L"\u2111"; + break; + case TypeElement::wp: + m_wsType = L"\u"; + break; + case TypeElement::laplace: + m_wsType = L"\u"; + break; + case TypeElement::fourier: + m_wsType = L"\u0192"; + break; + case TypeElement::backepsilon: + m_wsType = L"\u03F6"; + break; + default: + break; + } + } //class methods CElementSetOperations CElementSetOperations::CElementSetOperations(const TypeElement &enType): m_pRightArgument(nullptr), m_pLeftArgument(nullptr) { @@ -917,11 +1034,11 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex || pReader->GetGlobalType() == TypeElement::Index) + if((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { - CElement* pBinOpElement = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTempElement,pBinOpElement); - SetRightArg(pBinOpElement); + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTempElement,pElement); + SetRightArg(pElement); } else SetRightArg(pTempElement); } @@ -1045,7 +1162,7 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->GetToken(); pReader->SetTypesToken(); - if(pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetGlobalType() == TypeElement::BracketWithIndex || pReader->GetGlobalType() == TypeElement::Index) + if((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt))) { pReader->SetAttribute(GetAttribute()); CElement* pBinOp = CParserStarMathString::ParseElement(pReader); @@ -1213,7 +1330,7 @@ namespace StarMath m_pRightArgument->SetAttribute(pAttribute); } //class methods CIndex - CElementIndex::CElementIndex(const TypeElement& enType): m_pValueIndex(nullptr),m_pValue(nullptr) + CElementIndex::CElementIndex(const TypeElement& enType): m_pValueIndex(nullptr),m_pLeftArg(nullptr) { m_enTypeIndex = enType; SetBaseType(TypeElement::Index); @@ -1221,7 +1338,7 @@ namespace StarMath CElementIndex::~CElementIndex() { delete m_pValueIndex; - delete m_pValue; + delete m_pLeftArg; } void CElementIndex::SetValueIndex(CElement *pElement) { @@ -1229,13 +1346,17 @@ namespace StarMath } void CElementIndex::SetLeftArg(CElement *pElement) { - if(m_pValue == nullptr) - m_pValue = pElement; + if(m_pLeftArg == nullptr) + m_pLeftArg = pElement; } CElement* CElementIndex::GetValueIndex() { return m_pValueIndex; } + CElement* CElementIndex::GetLeftArg() + { + return m_pLeftArg; + } TypeElement CElementIndex::GetIndex(const std::wstring &wsCheckToken) { if(L"^" == wsCheckToken) return TypeElement::upper; @@ -1257,6 +1378,8 @@ namespace StarMath } else SetValueIndex(CParserStarMathString::ParseElement(pReader)); + if(m_enTypeIndex == TypeElement::sqrt) + SetLeftArg(GetValueIndex()); } void CElementIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -1278,7 +1401,7 @@ namespace StarMath CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValue,pXmlWrite); + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pLeftArg,pXmlWrite); switch(m_enTypeIndex) { case TypeElement::upper: @@ -1306,7 +1429,7 @@ namespace StarMath { CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueIndex,pXmlWrite); } - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValue,pXmlWrite); + CConversionSMtoOOXML::BlockRecording(L"m:e",m_pLeftArg,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); } else if(m_enTypeIndex == TypeElement::nroot || TypeElement::sqrt == m_enTypeIndex) @@ -1315,10 +1438,10 @@ namespace StarMath pXmlWrite->WriteNodeBegin(L"m:radPr",false); CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:radPr",false,false); - if(m_pValue != nullptr) + if(m_pLeftArg != nullptr && m_enTypeIndex == TypeElement::nroot) { pXmlWrite->WriteNodeBegin(L"m:deg",false); - m_pValue->ConversionToOOXML(pXmlWrite); + m_pLeftArg->ConversionToOOXML(pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:deg",false,false); } else @@ -1342,8 +1465,8 @@ namespace StarMath void CElementIndex::SetAttribute(CAttribute *pAttribute) { SetBaseAttribute(pAttribute); - if(m_pValue != nullptr) - m_pValue->SetAttribute(pAttribute); + if(m_pLeftArg != nullptr) + m_pLeftArg->SetAttribute(pAttribute); if(m_pValueIndex != nullptr) m_pValueIndex->SetAttribute(pAttribute); } @@ -1557,12 +1680,12 @@ namespace StarMath if(pReader->GetLocalType() == TypeElement::from) { pReader->ClearReader(); - SetFromValue(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); + SetFromValue(CParserStarMathString::ReadingWithoutBracket(pReader)); } if(pReader->GetLocalType() == TypeElement::to) { pReader->ClearReader(); - SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); + SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader)); } // pReader->SetAttributeTemp(GetAttribute()); SetValueOperator(CParserStarMathString::ParseElement(pReader)); @@ -1793,7 +1916,7 @@ namespace StarMath } bool CStarMathReader::CheckIteratorPosition() { - if(m_itStart !=m_itEnd) return false; + if(m_itStart != m_itEnd) return false; else return true; } void CStarMathReader::SetAttribute(CAttribute *pAttribute) @@ -1815,11 +1938,11 @@ namespace StarMath m_itStart++; break; } - else if(!m_wsElement.empty() && (CheckTokenForGetElement(*m_itStart) || *m_itStart == L'(' || L')' == *m_itStart ||(L'#' == *m_itStart && L'#' != m_wsElement.back()) || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (iswalpha(*m_itStart) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) + else if(!m_wsElement.empty() && (CheckTokenForGetElement(*m_itStart) || *m_itStart == L'(' || L')' == *m_itStart ||(L'#' == *m_itStart && L'#' != m_wsElement.back()) ||(L'-' == *m_itStart && L'+' != m_wsElement.back()) || (L'+' == *m_itStart && L'-' != m_wsElement.back()) || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (iswalpha(*m_itStart) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) { return m_wsElement; } - else if((( CheckTokenForGetElement(*m_itStart) || L'=' == *m_itStart) && m_wsElement.empty()) || (!m_wsElement.empty() && ((L'#' == m_wsElement.back() && L'#' == *m_itStart) || (m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) + else if((( CheckTokenForGetElement(*m_itStart) || L'=' == *m_itStart) && m_wsElement.empty()) || (!m_wsElement.empty() && ((L'#' == m_wsElement.back() && L'#' == *m_itStart) || (L'-' == *m_itStart && L'+' == m_wsElement.back()) || (L'+' == *m_itStart && L'-' == m_wsElement.back()) || (m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) { m_wsElement.push_back(*m_itStart); m_itStart++; @@ -1843,8 +1966,10 @@ namespace StarMath else if(L'^' == cToken) return true; else if(L'*' == cToken) return true; else if(L'/' == cToken) return true; - else if(L'-' == cToken) return true; - else if(L'+' == cToken) return true; +// else if(L'-' == cToken) return true; +// else if(L'+' == cToken) return true; + else if(L'`' == cToken) return true; + else if(L'~' == cToken) return true; else return false; } //class methods CElementBracketWithIndex @@ -1866,6 +1991,10 @@ namespace StarMath { m_pValue = pElement; } + CElement* CElementBracketWithIndex::GetLeftArg() + { + return m_pLeftArg; + } void CElementBracketWithIndex::Parse(CStarMathReader *pReader) { SetBracketValue(CParserStarMathString::ParseElement(pReader)); @@ -2081,8 +2210,8 @@ namespace StarMath { if(m_enTypeMatrix == TypeElement::binom) { - SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); - SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader,GetAttribute())); + SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader)); } else { @@ -2206,7 +2335,7 @@ namespace StarMath wsTypeMark = L"\u0305"; break; case TypeElement::vec: - wsTypeMark = L"\u279E"; + wsTypeMark = L"\u20D7"; break; case TypeElement::acute: wsTypeMark = L"\u0301"; @@ -2227,10 +2356,10 @@ namespace StarMath wsTypeMark = L"\u0304"; break; case TypeElement::dddot: - wsTypeMark = L"\u0309"; + wsTypeMark = L"\u20DB"; break; case TypeElement::harpoon: - wsTypeMark = L"\u21C0"; + wsTypeMark = L"\u20D1"; break; case TypeElement::tilde: wsTypeMark = L"\u0342"; @@ -2242,31 +2371,34 @@ namespace StarMath wsTypeMark = L"\u030C"; break; case TypeElement::widevec: - wsTypeMark = L"\u27F6"; + wsTypeMark = L"\u20D7"; break; case TypeElement::widetilde: wsTypeMark = L"\u0360"; break; -// case TypeElement::wideharpoon: -// wsTypeMark = L"\u"; -// break; -// case TypeElement::widehat: -// wsTypeMark = L"\u"; -// break; + case TypeElement::wideharpoon: + wsTypeMark = L"\u20D1"; + break; case TypeElement::underline: wsTypeMark = L"\u0332"; break; -// case TypeElement::: -// wsTypeMark = L"\u"; -// break; default: break; } pXmlWrite->WriteNodeBegin(L"m:acc",false); pXmlWrite->WriteNodeBegin(L"m:accPr",false); - pXmlWrite->WriteNodeBegin(L"m:chr",true); - pXmlWrite->WriteAttribute(L"m:val",wsTypeMark); - pXmlWrite->WriteNodeEnd(L"w",true,true); + switch(m_enTypeMark) + { + case TypeElement::widehat: + break; + default: + { + pXmlWrite->WriteNodeBegin(L"m:chr",true); + pXmlWrite->WriteAttribute(L"m:val",wsTypeMark); + pXmlWrite->WriteNodeEnd(L"w",true,true); + break; + } + } CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:accPr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 915c2f646a..2304e4a77e 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -101,13 +101,14 @@ namespace StarMath void SetValueIndex(CElement* pElement); void SetLeftArg(CElement* pElement); CElement* GetValueIndex(); + CElement* GetLeftArg(); static TypeElement GetIndex(const std::wstring& wsCheckToken); private: void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValueIndex; - CElement* m_pValue; + CElement* m_pLeftArg; TypeElement m_enTypeIndex; }; @@ -213,6 +214,7 @@ namespace StarMath virtual ~CElementBracketWithIndex(); void SetLeftArg(CElement* pElement); void SetBracketValue(CElement* pElement); + CElement* GetLeftArg(); static TypeElement GetBracketWithIndex(const std::wstring& wsToken); private: void SetAttribute(CAttribute* pAttribute) override; @@ -285,11 +287,13 @@ namespace StarMath static TypeElement GetSpecialSymbol(const std::wstring& wsToken); void SetValue(CElement* pValue); private: + void SetWsTypeSymbol(); void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValue; TypeElement m_enTypeSpecial; + std::wstring m_wsType; }; class CElementMatrix: public CElement @@ -330,9 +334,9 @@ namespace StarMath std::vector Parse(std::wstring& wsParseString); static CElement* ParseElement(CStarMathReader* pReader); //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). - static void AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); + static bool AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); static bool CheckForLeftArgument(const TypeElement& enType); - static CElement* ReadingWithoutBracket(CStarMathReader* pReader,CAttribute* pAttribute); + static CElement* ReadingWithoutBracket(CStarMathReader* pReader); private: std::vector m_arEquation; }; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index bff250cba0..b59de24931 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -41,6 +41,13 @@ enum class TypeElement{ circ, wideslash, widebslash, + //logic + And, + Or, + neg, + //unary + plus_minus, + minus_plus, //op lim, sum, @@ -184,7 +191,8 @@ enum class TypeElement{ setC, grid, transition, - // + emptiness, + interval, infinity, partial, nabla, From 6537a1998a3d38a2da2677038089a43f4d1658e0 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 23 Jan 2024 19:36:48 +0300 Subject: [PATCH 016/117] add starmath convert --- OdfFile/Projects/Linux/OdfFormatLib.pro | 2 + OdfFile/Projects/Windows/cpodf.vcxproj | 5 +++ .../Projects/Windows/cpodf.vcxproj.filters | 18 ++++++++ .../StarMath2OOXML/cconversionsmtoooxml.cpp | 38 ++++++++++++++-- .../StarMath2OOXML/cconversionsmtoooxml.h | 34 +++++++++++++- .../StarMath2OOXML/cstarmathpars.cpp | 32 +++++++++++++ .../Converter/StarMath2OOXML/cstarmathpars.h | 32 +++++++++++++ .../Converter/StarMath2OOXML/typeselements.h | 33 ++++++++++++++ OdfFile/Reader/Format/math_elements.cpp | 45 ++++++++++++++----- OdfFile/Reader/Format/math_elements.h | 12 ++--- 10 files changed, 227 insertions(+), 24 deletions(-) diff --git a/OdfFile/Projects/Linux/OdfFormatLib.pro b/OdfFile/Projects/Linux/OdfFormatLib.pro index 45e696350e..d3e81ad1de 100644 --- a/OdfFile/Projects/Linux/OdfFormatLib.pro +++ b/OdfFile/Projects/Linux/OdfFormatLib.pro @@ -19,6 +19,8 @@ include(../../../Common/base.pri) #BOOST include($$PWD/../../../Common/3dParty/boost/boost.pri) +include($$PWD/../../Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri) + DEFINES += UNICODE \ _UNICODE \ DONT_WRITE_EMBEDDED_FONTS diff --git a/OdfFile/Projects/Windows/cpodf.vcxproj b/OdfFile/Projects/Windows/cpodf.vcxproj index 9261997573..05f9ae9ddd 100644 --- a/OdfFile/Projects/Windows/cpodf.vcxproj +++ b/OdfFile/Projects/Windows/cpodf.vcxproj @@ -282,6 +282,8 @@ /bigobj %(AdditionalOptions) + + /bigobj %(AdditionalOptions) @@ -675,6 +677,9 @@ + + + diff --git a/OdfFile/Projects/Windows/cpodf.vcxproj.filters b/OdfFile/Projects/Windows/cpodf.vcxproj.filters index 7ab9701d63..9fca4cac95 100644 --- a/OdfFile/Projects/Windows/cpodf.vcxproj.filters +++ b/OdfFile/Projects/Windows/cpodf.vcxproj.filters @@ -25,6 +25,9 @@ {67b2bf43-5673-4a6f-82cb-fe4be01aee5f} + + {7d3e34d2-a224-4d68-9144-4889bbcc3698} + @@ -481,6 +484,12 @@ oox\pptx + + starmath + + + starmath + @@ -934,5 +943,14 @@ oox\pptx + + starmath + + + starmath + + + starmath + \ No newline at end of file diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index cbf8962794..e7bd859a2c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -1,3 +1,34 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ #include "cconversionsmtoooxml.h" #include "../../../../DesktopEditor/common/File.h" #include @@ -16,15 +47,13 @@ namespace StarMath { oTempElement->ConversionToOOXML(m_pXmlWrite); } EndConversion(); - NSFile::CFileBinary oFile; - oFile.CreateFileW(L"Test.txt"); - oFile.WriteStringUTF8(m_pXmlWrite->GetXmlString()); - oFile.CloseFile(); } void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { if(pAttribute == nullptr) { + //тут должны быть базовые свойства шрифта, задаваемые выше + pXmlWrite->WriteNodeBegin(L"w:rPr",false); pXmlWrite->WriteNodeBegin(L"w:rFonts",true); pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); @@ -47,6 +76,7 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"w",true,true); if(pAttribute->GetSize() == 0) { + //тут должны быть базовые свойства шрифта, задаваемые выше - далее везде где не задано - аналогично pXmlWrite->WriteNodeBegin(L"w:sz",true); pXmlWrite->WriteAttribute(L"w:val",L"40"); pXmlWrite->WriteNodeEnd(L"w",true,true); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 7656f54f25..5581cc4742 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -1,10 +1,40 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + #ifndef CCONVERSIONSMTOOOXML_H #define CCONVERSIONSMTOOOXML_H #include "cstarmathpars.h" #include "../../../../DesktopEditor/xml/include/xmlwriter.h" - - namespace StarMath { //delete XmlWrite class CConversionSMtoOOXML diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index d35669edb3..46fad8c507 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -1,3 +1,35 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + #include "cstarmathpars.h" #include "cconversionsmtoooxml.h" namespace StarMath diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 2304e4a77e..30afb326a2 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -1,3 +1,35 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + #ifndef CSTARMATHPARS_H #define CSTARMATHPARS_H #include "typeselements.h" diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index b59de24931..3ed61afb42 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -1,5 +1,38 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + #ifndef TYPESELEMENTS_H #define TYPESELEMENTS_H + namespace StarMath { enum class TypeElement{ diff --git a/OdfFile/Reader/Format/math_elements.cpp b/OdfFile/Reader/Format/math_elements.cpp index 7e68a62abf..aa46882f15 100644 --- a/OdfFile/Reader/Format/math_elements.cpp +++ b/OdfFile/Reader/Format/math_elements.cpp @@ -31,6 +31,7 @@ */ #include "math_elements.h" +#include "../Converter/StarMath2OOXML/cconversionsmtoooxml.h" namespace cpdoccore { @@ -93,10 +94,39 @@ void math_semantics::add_child_element( xml::sax * Reader, const std::wstring & void math_semantics::oox_convert(oox::math_context & Context) { - for (size_t i = 0 ; i < content_.size(); i++) + math_annotation* annotation = dynamic_cast(annotation_.get()); + math_annotation_xml* annotation_xml = dynamic_cast(annotation_.get()); + + std::wstring annotation_text; + if ((annotation) && (annotation->text_)) annotation_text = *annotation->text_; + else if ((annotation_xml) && (annotation_xml->text_)) annotation_text = *annotation_xml->text_; + + bool result = false; + if (!annotation_text.empty()) { - office_math_element* math_element = dynamic_cast(content_[i].get()); - math_element->oox_convert(Context); + result = true; + StarMath::CParserStarMathString parser; + StarMath::CConversionSMtoOOXML converter; + + // базовые свойства шрифта для математики + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_name_; + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_size_; + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_alignment_; + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_italic_; + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_bold_; + + /*result = */converter.StartConversion(parser.Parse(annotation_text)); + + Context.output_stream() << converter.GetOOXML(); + } + + if (!result) + { + for (size_t i = 0; i < content_.size(); i++) + { + office_math_element* math_element = dynamic_cast(content_[i].get()); + math_element->oox_convert(Context); + } } } @@ -126,11 +156,6 @@ void math_annotation::add_text(const std::wstring & Text) text_ = Text; } -void math_annotation::oox_convert(oox::math_context & Context) -{ - -} - //---------------------------------------------------------------------------------------------------- const wchar_t * math_annotation_xml::ns = L"math"; const wchar_t * math_annotation_xml::name = L"annotation-xml"; @@ -157,10 +182,6 @@ void math_annotation_xml::add_text(const std::wstring & Text) text_ = Text; } -void math_annotation_xml::oox_convert(oox::math_context & Context) -{ - -} //---------------------------------------------------------------------------------------------------- } diff --git a/OdfFile/Reader/Format/math_elements.h b/OdfFile/Reader/Format/math_elements.h index e7691fa0d5..0c8e49dbec 100644 --- a/OdfFile/Reader/Format/math_elements.h +++ b/OdfFile/Reader/Format/math_elements.h @@ -119,16 +119,16 @@ public: static const xml::NodeType xml_type = xml::typeElement; static const ElementType type = typeMathAnnotation; - virtual void oox_convert(oox::math_context & Context); + virtual void oox_convert(oox::math_context& Context) {} + _CP_OPT(std::wstring) text_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); virtual void add_text(const std::wstring & Text); - office_element_ptr_array content_; - _CP_OPT(std::wstring) text_; - _CP_OPT(std::wstring) encoding_; + office_element_ptr_array content_; + _CP_OPT(std::wstring) encoding_; }; CP_REGISTER_OFFICE_ELEMENT2(math_annotation); @@ -142,15 +142,15 @@ public: static const xml::NodeType xml_type = xml::typeElement; static const ElementType type = typeMathAnnotationXml; - virtual void oox_convert(oox::math_context & Context); + virtual void oox_convert(oox::math_context& Context) {} + _CP_OPT(std::wstring) text_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); virtual void add_text(const std::wstring & Text); office_element_ptr_array content_; - _CP_OPT(std::wstring) text_; _CP_OPT(std::wstring) encoding_; }; From 755ea7761c46d6c6216f3ff1d9ac507ccc4583a8 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Wed, 24 Jan 2024 10:36:31 +0300 Subject: [PATCH 017/117] Conversion of Greek characters, universal input of functions and operators. Writing tests. --- .../StarMath2OOXML/TestSMConverter/main.cpp | 100 ++++ .../StarMath2OOXML/cconversionsmtoooxml.cpp | 8 +- .../StarMath2OOXML/cconversionsmtoooxml.h | 2 +- .../StarMath2OOXML/cstarmathpars.cpp | 523 +++++++++++++++--- .../Converter/StarMath2OOXML/cstarmathpars.h | 24 +- .../Converter/StarMath2OOXML/typeselements.h | 67 +++ 6 files changed, 639 insertions(+), 85 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index 3b97028104..bb314a3935 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -974,6 +974,106 @@ TEST(SMConvectorTest,AttributeGrade) EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } +TEST(SMConvectorTest,Example2) +{ + std::wstring wsString = L"C = %pi cdot d = 2 cdot %pi cdot r"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"C=\u03C0\u00B7d=2\u00B7\u03C0\u00B7r"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example3) +{ + std::wstring wsString = L"c = sqrt{ a^2 + b^2 }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"c=a2+b2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example4) +{ + std::wstring wsString = L"vec F = m times vec a"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"F=m\u00D7a"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example5) +{ + std::wstring wsString = L"E = m c^2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"E=mc2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example6) +{ + std::wstring wsString = L"G_{%mu %nu} + %LAMBDA g_{%mu %nu}= frac{8 %pi G}{c^4} T_{%mu %nu}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"G\u03BC\u03BD+\u039Bg\u03BC\u03BD=8\u03C0Gc4T\u03BC\u03BD"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example8) +{ + std::wstring wsString = L"d over dt left( {partial L}over{partial dot q} right) = {partial L}over{partial q}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"ddt\u2202L\u2202q=\u2202L\u2202q"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example9) +{ + std::wstring wsString = L"int from a to b f'(x) dx = f(b) - f(a)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"abf'xdx=fb-fa"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example10) +{ + std::wstring wsString = L"ldline %delta bold{r}(t) rdline approx e^{%lambda t} ldline %delta { bold{r} }_0 rdline"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"\u03B4rt\u2248e\u03BBt\u03B4r0"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +//TEST(SMConvectorTest,Example13) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString =L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + +//TEST(SMConvectorTest,Example13) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString =L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + //TEST(SMConvectorTest,AttributeMatrix) //{ // std::wstring wsString = L""; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index cbf8962794..74e2af689c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -13,7 +13,8 @@ namespace StarMath { m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); for(CElement* oTempElement:arPars) { - oTempElement->ConversionToOOXML(m_pXmlWrite); + if(oTempElement != nullptr) + oTempElement->ConversionToOOXML(m_pXmlWrite); } EndConversion(); NSFile::CFileBinary oFile; @@ -292,7 +293,7 @@ namespace StarMath { pXmlWrite->WriteAttribute(L"m:val",wsTypeLimLock); pXmlWrite->WriteNodeEnd(L"w",true,true); } - void CConversionSMtoOOXML::WriteRPrFName(const TypeElement &enTypeOp, XmlUtils::CXmlWriter *pXmlWrite,CAttribute* pAttribute) + void CConversionSMtoOOXML::WriteRPrFName(const TypeElement &enTypeOp, XmlUtils::CXmlWriter *pXmlWrite,CAttribute* pAttribute,const std::wstring& wsNameOp) { pXmlWrite->WriteNodeBegin(L"m:r",false); pXmlWrite->WriteNodeBegin(L"m:rPr",false); @@ -313,6 +314,9 @@ namespace StarMath { case TypeElement::limsup: pXmlWrite->WriteString(L"lim sup"); break; + case TypeElement::oper: + pXmlWrite->WriteString(wsNameOp); + break; default: break; } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 7656f54f25..986c18d196 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -23,7 +23,7 @@ namespace StarMath { static void WriteCtrlPrNode(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void WriteChrNode(const std::wstring& wsTypeOp,XmlUtils::CXmlWriter* pXmlWrite); static void WriteLimLocNode(const std::wstring& wsTypeLimLock,XmlUtils::CXmlWriter* pXmlWrite); - static void WriteRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void WriteRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const std::wstring& wsNameOp); static void WriteStyNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsAttributeNode); static void WritePreserveBlock(XmlUtils::CXmlWriter* pXmlWrite, CAttribute *pAttribute); void EndConversion(); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index d35669edb3..498ed730b6 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -415,6 +415,9 @@ namespace StarMath } CElement::CElement(): m_pAttribute(nullptr) {} + CElement::CElement(const TypeElement &enTypeBase): m_pAttribute(nullptr),m_enBaseType(enTypeBase) + { + } CElement* CElement::CreateElement(CStarMathReader* pReader) { switch (pReader->GetGlobalType()) { @@ -427,11 +430,27 @@ namespace StarMath case TypeElement::Connection: return new CElementConnection(pReader->GetLocalType()); case TypeElement::Function: - return new CElementFunction(pReader->GetLocalType()); + { + if(pReader->GetLocalType() == TypeElement::func) + { + pReader->GetToken(); + return new CElementFunction(pReader->GetLocalType(),pReader->GetString()); + } + else + return new CElementFunction(pReader->GetLocalType()); + } case TypeElement::Bracket: return new CElementBracket(pReader->GetLocalType()); case TypeElement::Operation: - return new CElementOperator(pReader->GetLocalType()); + { + if(pReader->GetLocalType() == TypeElement::oper) + { + pReader->GetToken(); + return new CElementOperator(pReader->GetLocalType(),pReader->GetString()); + } + else + return new CElementOperator(pReader->GetLocalType()); + } case TypeElement::BracketWithIndex: return new CElementBracketWithIndex(pReader->GetLocalType()); case TypeElement::Grade: @@ -580,11 +599,13 @@ namespace StarMath } void CElementBinOperator::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) { - if(m_enTypeBinOp == TypeElement::over || m_enTypeBinOp ==TypeElement::division) + if(m_enTypeBinOp == TypeElement::over || m_enTypeBinOp ==TypeElement::division || TypeElement::frac == m_enTypeBinOp) { oXmlWrite->WriteNodeBegin(L"m:f",false); - if(m_enTypeBinOp == TypeElement::division) CConversionSMtoOOXML::PropertiesMFPR(true,L"lin",oXmlWrite,GetAttribute()); - else CConversionSMtoOOXML::PropertiesMFPR(false,L"",oXmlWrite,GetAttribute()); + if(m_enTypeBinOp == TypeElement::division) + CConversionSMtoOOXML::PropertiesMFPR(true,L"lin",oXmlWrite,GetAttribute()); + else + CConversionSMtoOOXML::PropertiesMFPR(false,L"",oXmlWrite,GetAttribute()); CConversionSMtoOOXML::BlockRecording(L"m:num",m_pLeftArgument,oXmlWrite); CConversionSMtoOOXML::BlockRecording(L"m:den",m_pRightArgument,oXmlWrite); oXmlWrite->WriteNodeEnd(L"m:f",false,false); @@ -816,7 +837,8 @@ namespace StarMath pXmlWrite->WriteNodeBegin(L"m:e",false); for(CElement* oTemp:m_arBrecketValue) { - oTemp->ConversionToOOXML(pXmlWrite); + if(oTemp != nullptr) + oTemp->ConversionToOOXML(pXmlWrite); } pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeEnd(L"m:d",false,false); @@ -825,7 +847,8 @@ namespace StarMath { for(CElement* oTemp:m_arBrecketValue) { - oTemp->ConversionToOOXML(pXmlWrite); + if(oTemp != nullptr) + oTemp->ConversionToOOXML(pXmlWrite); } } @@ -866,48 +889,127 @@ namespace StarMath { m_pValue = pValue; } - TypeElement CElementSpecialSymbol::GetSpecialSymbol(const std::wstring &wsToken) + const TypeElement CElementSpecialSymbol::GetType() { - if(L"#" == wsToken) return TypeElement::grid; - else if(L"##" == wsToken) return TypeElement::transition; - else if(L"emptyset" == wsToken) return TypeElement::emptyset; - else if(L"aleph" == wsToken) return TypeElement::aleph; - else if(L"setN" == wsToken) return TypeElement::setN; - else if(L"setZ" == wsToken) return TypeElement::setZ; - else if(L"setQ" == wsToken) return TypeElement::setQ; - else if(L"setR" == wsToken) return TypeElement::setR; - else if(L"setc" == wsToken) return TypeElement::setC; - else if(L"infinity" == wsToken) return TypeElement::infinity; - else if(L"fact" == wsToken) return TypeElement::fact; - else if(L"abs" == wsToken) return TypeElement::abs; - else if(L"`" == wsToken) return TypeElement::interval; - else if(L"~" == wsToken) return TypeElement::emptiness; - else if(L"partial" == wsToken) return TypeElement::partial; - else if(L"nabla" == wsToken) return TypeElement::nabla; - else if(L"exists" == wsToken) return TypeElement::exists; - else if(L"notexists" == wsToken) return TypeElement::notexists; - else if(L"forall" == wsToken) return TypeElement::forall; - else if(L"hbar" == wsToken) return TypeElement::hbar; - else if(L"lambdabar" == wsToken) return TypeElement::lambdabar; - else if(L"Re" == wsToken) return TypeElement::Re; - else if(L"Im" == wsToken) return TypeElement::Im; - else if(L"wp" == wsToken) return TypeElement::wp; - else if(L"laplace" == wsToken) return TypeElement::laplace; - else if(L"fourier" == wsToken) return TypeElement::fourier; - else if(L"backepsilon" == wsToken) return TypeElement::backepsilon; - else return TypeElement::undefine; + return m_enTypeSpecial; + } + TypeElement CElementSpecialSymbol::GetSpecialSymbol(std::wstring &wsToken) + { + if(wsToken[0] != L'%') + { + if(L"#" == wsToken) return TypeElement::grid; + else if(L"##" == wsToken) return TypeElement::transition; + else if(L"emptyset" == wsToken) return TypeElement::emptyset; + else if(L"aleph" == wsToken) return TypeElement::aleph; + else if(L"setN" == wsToken) return TypeElement::setN; + else if(L"setZ" == wsToken) return TypeElement::setZ; + else if(L"setQ" == wsToken) return TypeElement::setQ; + else if(L"setR" == wsToken) return TypeElement::setR; + else if(L"setc" == wsToken) return TypeElement::setC; + else if(L"infinity" == wsToken) return TypeElement::infinity; + else if(L"fact" == wsToken) return TypeElement::fact; + else if(L"abs" == wsToken) return TypeElement::abs; + else if(L"`" == wsToken) return TypeElement::interval; + else if(L"~" == wsToken) return TypeElement::emptiness; + else if(L"partial" == wsToken) return TypeElement::partial; + else if(L"nabla" == wsToken) return TypeElement::nabla; + else if(L"exists" == wsToken) return TypeElement::exists; + else if(L"notexists" == wsToken) return TypeElement::notexists; + else if(L"forall" == wsToken) return TypeElement::forall; + else if(L"hbar" == wsToken) return TypeElement::hbar; + else if(L"lambdabar" == wsToken) return TypeElement::lambdabar; + else if(L"Re" == wsToken) return TypeElement::Re; + else if(L"Im" == wsToken) return TypeElement::Im; + else if(L"wp" == wsToken) return TypeElement::wp; + else if(L"laplace" == wsToken) return TypeElement::laplace; + else if(L"fourier" == wsToken) return TypeElement::fourier; + else if(L"backepsilon" == wsToken) return TypeElement::backepsilon; + else if(L"leftarrow" == wsToken) return TypeElement::leftarrow; + else if(L"rightarrow" == wsToken) return TypeElement::rightarrow; + else if(L"uparrow" == wsToken) return TypeElement::uparrow; + else if(L"downarrow" == wsToken) return TypeElement::downarrow; + else if(L"dotslow" == wsToken) return TypeElement::dotslow; + else if(L"dotsaxis" == wsToken) return TypeElement::dotsaxis; + else if(L"dotsvert" == wsToken) return TypeElement::dotsvert; + else if(L"dotsup" == wsToken) return TypeElement::dotsup; + else if(L"dotsdown" == wsToken) return TypeElement::dotsdown; + } + else if(wsToken[0] == L'%') + { + wsToken = wsToken.substr(1,wsToken.size()-1); + if(L"ALPHA" == wsToken) return TypeElement::alpha; + else if(L"ZETA" == wsToken) return TypeElement::zeta; + else if(L"LAMBDA" == wsToken) return TypeElement::lambda; + else if(L"PI" == wsToken) return TypeElement::pi; + else if(L"PHI" == wsToken) return TypeElement::phi; + else if(L"alpha" == wsToken) return TypeElement::alpha_small; + else if(L"varepsilon" == wsToken) return TypeElement::varepsilon; + else if(L"iota" == wsToken) return TypeElement::iota_small; + else if(L"xi" == wsToken) return TypeElement::xi_small; + else if(L"varrho" == wsToken) return TypeElement::varrho; + else if(L"phi" == wsToken) return TypeElement::phi_small; + else if(L"BETA" == wsToken) return TypeElement::beta; + else if(L"ETA" == wsToken) return TypeElement::eta; + else if(L"MU" == wsToken) return TypeElement::mu; + else if(L"RHO" == wsToken) return TypeElement::rho; + else if(L"CHI" == wsToken) return TypeElement::chi; + else if(L"beta" == wsToken) return TypeElement::beta_small; + else if(L"zeta" == wsToken) return TypeElement::zeta_small; + else if(L"kappa" == wsToken) return TypeElement::kappa_small; + else if(L"omicron" == wsToken) return TypeElement::omicron_small; + else if(L"sigma" == wsToken) return TypeElement::sigma_small; + else if(L"varphi" == wsToken) return TypeElement::varphi; + else if(L"GAMMA" == wsToken) return TypeElement::gamma; + else if(L"THETA" == wsToken) return TypeElement::theta; + else if(L"NU" == wsToken) return TypeElement::nu; + else if(L"SIGMA" == wsToken) return TypeElement::sigma; + else if(L"PSI" == wsToken) return TypeElement::psi; + else if(L"gamma" == wsToken) return TypeElement::gamma_small; + else if(L"eta" == wsToken) return TypeElement::eta_small; + else if(L"lambda" == wsToken) return TypeElement::lambda_small; + else if(L"pi" == wsToken) return TypeElement::pi_small; + else if(L"varsigma" == wsToken) return TypeElement::varsigma; + else if(L"chi" == wsToken) return TypeElement::chi_small; + else if(L"DELTA" == wsToken) return TypeElement::delta; + else if(L"IOTA" == wsToken) return TypeElement::iota; + else if(L"XI" == wsToken) return TypeElement::xi; + else if(L"TAU" == wsToken) return TypeElement::tau; + else if(L"OMEGA" == wsToken) return TypeElement::omega; + else if(L"delta" == wsToken) return TypeElement::delta_small; + else if(L"theta" == wsToken) return TypeElement::theta_small; + else if(L"mu" == wsToken) return TypeElement::mu_small; + else if(L"varpi" == wsToken) return TypeElement::varpi; + else if(L"tau" == wsToken) return TypeElement::tau_small; + else if(L"psi" == wsToken) return TypeElement::psi_small; + else if(L"EPSILON" == wsToken) return TypeElement::epsilon; + else if(L"KAPPA" == wsToken) return TypeElement::kappa; + else if(L"OMICRON" == wsToken) return TypeElement::omicron; + else if(L"UPSILON" == wsToken) return TypeElement::upsilon; + else if(L"epsilon" == wsToken) return TypeElement::epsilon_small; + else if(L"vartheta" == wsToken) return TypeElement::vartheta; + else if(L"nu" == wsToken) return TypeElement::nu_small; + else if(L"rho" == wsToken) return TypeElement::rho_small; + else if(L"upsilon" == wsToken) return TypeElement::upsilon_small; + else if(L"omega" == wsToken) return TypeElement::omega_small; + else if(L"and" == wsToken) return TypeElement::And; + else if(L"infinite" == wsToken) return TypeElement::infinity; + else if(L"perthousand" == wsToken) return TypeElement::perthousand; + else if(L"angle" == wsToken) return TypeElement::notin; + else if(L"strictlygreaterthan" == wsToken) return TypeElement::dlriarrow; + else if(L"element" == wsToken) return TypeElement::in; + else if(L"notequal" == wsToken) return TypeElement::notequals; + else if(L"strictlylessthan" == wsToken) return TypeElement::dllearrow; + else if(L"identical" == wsToken) return TypeElement::equiv; + else if(L"or" == wsToken) return TypeElement::Or; + else if(L"tendto" == wsToken) return TypeElement::rightarrow; + } + return TypeElement::undefine; } void CElementSpecialSymbol::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - SetWsTypeSymbol(); + SetTypeSymbol(); switch(m_enTypeSpecial) { - case TypeElement::transition: - { - pXmlWrite->WriteNodeEnd(L"m:mr",false,false); - pXmlWrite->WriteNodeBegin(L"m:mr",false); - break; - } case TypeElement::fact: { if(m_pValue!= nullptr) @@ -952,7 +1054,7 @@ namespace StarMath { SetBaseAttribute(pAttribute); } - void CElementSpecialSymbol::SetWsTypeSymbol() + void CElementSpecialSymbol::SetTypeSymbol() { switch(m_enTypeSpecial) { @@ -998,6 +1100,225 @@ namespace StarMath case TypeElement::backepsilon: m_wsType = L"\u03F6"; break; + case TypeElement::alpha: + m_wsType = L"\u0391"; + break; + case TypeElement::alpha_small: + m_wsType = L"\u03B1"; + break; + case TypeElement::zeta: + m_wsType = L"\u0396"; + break; + case TypeElement::zeta_small: + m_wsType = L"\u03B6"; + break; + case TypeElement::lambda: + m_wsType = L"\u039B"; + break; + case TypeElement::lambda_small: + m_wsType = L"\u03BB"; + break; + case TypeElement::pi: + m_wsType = L"\u03A0"; + break; + case TypeElement::pi_small: + m_wsType = L"\u03C0"; + break; + case TypeElement::phi: + m_wsType = L"\u03A6"; + break; + case TypeElement::phi_small: + m_wsType = L"\u03C6"; + break; + case TypeElement::varepsilon: + m_wsType = L"\u03B5"; + break; + case TypeElement::iota_small: + m_wsType = L"\u03B9"; + break; + case TypeElement::iota: + m_wsType = L"\u0399"; + break; + case TypeElement::xi_small: + m_wsType = L"\u03BE"; + break; + case TypeElement::xi: + m_wsType = L"\u039E"; + break; + case TypeElement::varrho: + m_wsType = L"\u03F1"; + break; + case TypeElement::beta: + m_wsType = L"\u0392"; + break; + case TypeElement::beta_small: + m_wsType = L"\u03B2"; + break; + case TypeElement::eta: + m_wsType = L"\u0397"; + break; + case TypeElement::eta_small: + m_wsType = L"\u03B7"; + break; + case TypeElement::mu: + m_wsType = L"\u039C"; + break; + case TypeElement::mu_small: + m_wsType = L"\u03BC"; + break; + case TypeElement::rho: + m_wsType = L"\u03A1"; + break; + case TypeElement::rho_small: + m_wsType = L"\u03C1"; + break; + case TypeElement::chi: + m_wsType = L"\u03A7"; + break; + case TypeElement::chi_small: + m_wsType = L"\u03C7"; + break; + case TypeElement::kappa_small: + m_wsType = L"\u03BA"; + break; + case TypeElement::kappa: + m_wsType = L"\u039A"; + break; + case TypeElement::omicron: + m_wsType = L"\u039F"; + break; + case TypeElement::omicron_small: + m_wsType = L"\u03BF"; + break; + case TypeElement::sigma: + m_wsType = L"\u03A3"; + break; + case TypeElement::sigma_small: + m_wsType = L"\u03C3"; + break; + case TypeElement::varphi: + m_wsType = L"\u03C6"; + break; + case TypeElement::gamma: + m_wsType = L"\u0393"; + break; + case TypeElement::gamma_small: + m_wsType = L"\u03B3"; + break; + case TypeElement::theta: + m_wsType = L"\u0398"; + break; + case TypeElement::theta_small: + m_wsType = L"\u03B8"; + break; + case TypeElement::nu: + m_wsType = L"\u039D"; + break; + case TypeElement::nu_small: + m_wsType = L"\u03BD"; + break; + case TypeElement::psi: + m_wsType = L"\u03A8"; + break; + case TypeElement::psi_small: + m_wsType = L"\u03C8"; + break; + case TypeElement::varsigma: + m_wsType = L"\u03DB"; + break; + case TypeElement::delta: + m_wsType = L"\u0394"; + break; + case TypeElement::delta_small: + m_wsType = L"\u03B4"; + break; + case TypeElement::tau: + m_wsType = L"\u03A4"; + break; + case TypeElement::tau_small: + m_wsType = L"\u03C4"; + break; + case TypeElement::omega: + m_wsType = L"\u03A9"; + break; + case TypeElement::omega_small: + m_wsType = L"\u03C9"; + break; + case TypeElement::varpi: + m_wsType = L"\u03D6"; + break; + case TypeElement::epsilon: + m_wsType = L"\u0395"; + break; + case TypeElement::epsilon_small: + m_wsType = L"\u03B5"; + break; + case TypeElement::upsilon: + m_wsType = L"\u03A5"; + break; + case TypeElement::upsilon_small: + m_wsType = L"\u03C5"; + break; + case TypeElement::vartheta: + m_wsType = L"\u03D1"; + break; + case TypeElement::And: + m_wsType = L"\u2227"; + break; + case TypeElement::Or: + m_wsType = L"\u2228"; + break; + case TypeElement::perthousand: + m_wsType = L"\u2030"; + break; + case TypeElement::angle: + m_wsType = L"\u2222"; + break; + case TypeElement::notin: + m_wsType = L"\u2209"; + break; + case TypeElement::dlriarrow: + m_wsType = L"\u\u226B"; + break; + case TypeElement::dllearrow: + m_wsType = L"\u226A"; + break; + case TypeElement::in: + m_wsType = L"\u2208"; + break; + case TypeElement::notequals: + m_wsType = L"\u2260"; + break; + case TypeElement::equiv: + m_wsType = L"\u2261"; + break; + case TypeElement::rightarrow: + m_wsType = L"\u1F872"; + break; + case TypeElement::leftarrow: + m_wsType = L"\u1F870"; + break; + case TypeElement::uparrow: + m_wsType = L"\u1F871"; + break; + case TypeElement::downarrow: + m_wsType = L"\u1F873"; + break; + case TypeElement::dotsaxis: + m_wsType = L"\u22EF"; + break; + case TypeElement::dotsup: + m_wsType = L"\u22F0"; + break; + case TypeElement::dotsdown: + m_wsType = L"\u22F1"; + break; + case TypeElement::dotsvert: + m_wsType = L"\u22EE"; + break; + case TypeElement::dotslow: + m_wsType = L"\u2026"; + break; default: break; } @@ -1032,8 +1353,11 @@ namespace StarMath void CElementSetOperations::Parse(CStarMathReader* pReader) { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - pReader->GetToken(); - pReader->SetTypesToken(); + if(pReader->EmptyString()) + { + pReader->GetToken(); + pReader->SetTypesToken(); + } if((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { CElement* pElement = CParserStarMathString::ParseElement(pReader); @@ -1160,8 +1484,11 @@ namespace StarMath { pReader->SetAttribute(GetAttribute()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - pReader->GetToken(); - pReader->SetTypesToken(); + if(pReader->EmptyString()) + { + pReader->GetToken(); + pReader->SetTypesToken(); + } if((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt))) { pReader->SetAttribute(GetAttribute()); @@ -1471,10 +1798,9 @@ namespace StarMath m_pValueIndex->SetAttribute(pAttribute); } //class methods CElementFunction - CElementFunction::CElementFunction(const TypeElement &enType): m_pValue(nullptr) + CElementFunction::CElementFunction(const TypeElement &enType, const std::wstring &wsNameFunc) + :CElement(TypeElement::Function), m_pValue(nullptr),m_wsNameFunc(wsNameFunc),m_enTypeFunction(enType) { - m_enTypeFunction = enType; - SetBaseType(TypeElement::Function); } CElementFunction::~CElementFunction() { @@ -1488,7 +1814,14 @@ namespace StarMath { return m_pValue; } - + void CElementFunction::SetNameFunc(const std::wstring &wsNameFunc) + { + m_wsNameFunc = wsNameFunc; + } + std::wstring CElementFunction::GetNameFuncInString() + { + return m_wsNameFunc; + } void CElementFunction::Parse(CStarMathReader* pReader) { CElement* pTemp = CParserStarMathString::ParseElement(pReader); @@ -1574,6 +1907,12 @@ namespace StarMath case TypeElement::exp: pXmlWrite->WriteString(L"exp"); break; + case TypeElement::func: + { + if(!m_wsNameFunc.empty()) + pXmlWrite->WriteString(GetNameFuncInString()); + break; + } default: break; } @@ -1606,6 +1945,7 @@ namespace StarMath else if(L"ln" == wsToken) return TypeElement::ln; else if(L"exp" == wsToken) return TypeElement::exp; else if(L"log" == wsToken) return TypeElement::log; + else if(L"func" == wsToken) return TypeElement::func; else return TypeElement::undefine; } void CElementFunction::SetAttribute(CAttribute *pAttribute) @@ -1615,10 +1955,9 @@ namespace StarMath m_pValue->SetAttribute(pAttribute); } //class methods CElementOperation - CElementOperator::CElementOperator(const TypeElement &enType): m_pValueFrom(nullptr), m_pValueTo(nullptr), m_pValueOperator(nullptr) + CElementOperator::CElementOperator(const TypeElement &enType, const std::wstring& wsNameOp) + :CElement(TypeElement::Operator), m_pValueFrom(nullptr), m_pValueTo(nullptr), m_pValueOperator(nullptr),m_enTypeOperator(enType),m_wsName(wsNameOp) { - m_enTypeOperator = enType; - SetBaseType(TypeElement::Operation); } CElementOperator::~CElementOperator() { @@ -1650,6 +1989,14 @@ namespace StarMath { return m_pValueTo; } + void CElementOperator::SetName(const std::wstring &wsNameOp) + { + m_wsName = wsNameOp; + } + std::wstring CElementOperator::GetName() + { + return m_wsName; + } TypeElement CElementOperator::GetFromOrTo(const std::wstring &wsToken) { if(L"from" == wsToken) return TypeElement::from; @@ -1659,17 +2006,18 @@ namespace StarMath TypeElement CElementOperator::GetOperator(const std::wstring &wsToken) { if(L"lim" == wsToken) return TypeElement::lim; - if(L"sum" == wsToken) return TypeElement::sum; - if(L"liminf" == wsToken) return TypeElement::liminf; - if(L"limsup" == wsToken) return TypeElement::limsup; - if(L"prod" == wsToken) return TypeElement::prod; - if(L"coprod" == wsToken) return TypeElement::coprod; - if(L"int" == wsToken) return TypeElement::Int; - if(L"iint" == wsToken) return TypeElement::iint; - if(L"iiint" == wsToken) return TypeElement::iiint; - if(L"lint" == wsToken) return TypeElement::lint; - if(L"llint" == wsToken) return TypeElement::llint; - if(L"lllint" == wsToken) return TypeElement::lllint; + else if(L"sum" == wsToken) return TypeElement::sum; + else if(L"liminf" == wsToken) return TypeElement::liminf; + else if(L"limsup" == wsToken) return TypeElement::limsup; + else if(L"prod" == wsToken) return TypeElement::prod; + else if(L"coprod" == wsToken) return TypeElement::coprod; + else if(L"int" == wsToken) return TypeElement::Int; + else if(L"iint" == wsToken) return TypeElement::iint; + else if(L"iiint" == wsToken) return TypeElement::iiint; + else if(L"lint" == wsToken) return TypeElement::lint; + else if(L"llint" == wsToken) return TypeElement::llint; + else if(L"lllint" == wsToken) return TypeElement::lllint; + else if(L"oper" == wsToken) return TypeElement::oper; else return TypeElement::undefine; } void CElementOperator::Parse(CStarMathReader* pReader) @@ -1693,7 +2041,7 @@ namespace StarMath } void CElementOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) { - if(m_enTypeOperator == TypeElement::lim || TypeElement::liminf == m_enTypeOperator || TypeElement::limsup == m_enTypeOperator) + if(m_enTypeOperator == TypeElement::lim || TypeElement::liminf == m_enTypeOperator || TypeElement::limsup == m_enTypeOperator || TypeElement::oper == m_enTypeOperator) { std::wstring wsTempNameNode; if(m_pValueFrom != nullptr) @@ -1704,7 +2052,7 @@ namespace StarMath CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:fName",false); if(m_pValueFrom == nullptr && m_pValueTo == nullptr) - CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute(),GetName()); else { pXmlWrite->WriteNodeBegin(wsTempNameNode,false); @@ -1712,7 +2060,7 @@ namespace StarMath CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr); pXmlWrite->WriteNodeEnd(wsTempNameNode+L"Pr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); - CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute(),GetName()); pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeBegin(L"m:lim",false); if(wsTempNameNode == L"m:limLow") @@ -1887,7 +2235,7 @@ namespace StarMath } if(m_enUnderType == TypeElement::undefine) { - m_enGlobalType = TypeElement::Empty; + m_enGlobalType = TypeElement::String; return; } } @@ -1938,7 +2286,7 @@ namespace StarMath m_itStart++; break; } - else if(!m_wsElement.empty() && (CheckTokenForGetElement(*m_itStart) || *m_itStart == L'(' || L')' == *m_itStart ||(L'#' == *m_itStart && L'#' != m_wsElement.back()) ||(L'-' == *m_itStart && L'+' != m_wsElement.back()) || (L'+' == *m_itStart && L'-' != m_wsElement.back()) || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (iswalpha(*m_itStart) && !iswalpha(m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) + else if(!m_wsElement.empty() && (CheckTokenForGetElement(*m_itStart) || *m_itStart == L'(' || L')' == *m_itStart || L'%' == *m_itStart||(L'#' == *m_itStart && L'#' != m_wsElement.back()) ||(L'-' == *m_itStart && L'+' != m_wsElement.back()) || (L'+' == *m_itStart && L'-' != m_wsElement.back()) || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (CheckIsalhpaForGetElement(*m_itStart,m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) { return m_wsElement; } @@ -1956,7 +2304,11 @@ namespace StarMath if(!m_wsElement.empty()) return m_wsElement; else return {}; } - bool CStarMathReader::CheckTokenForGetElement(const char &cToken) + void CStarMathReader::FindingTheEndOfParentheses() + { + + } + bool CStarMathReader::CheckTokenForGetElement(const wchar_t &cToken) { if(L'[' == cToken) return true; else if(L']' == cToken) return true; @@ -1972,6 +2324,19 @@ namespace StarMath else if(L'~' == cToken) return true; else return false; } + bool CStarMathReader::CheckIsalhpaForGetElement(const wchar_t &cToken, const wchar_t &cLastToken) + { + if(isalpha(cToken)) + { + if(L'%' == cLastToken) + return false; + if(isalpha(cLastToken)) + return false; + } + else + return false; + return true; + } //class methods CElementBracketWithIndex CElementBracketWithIndex::CElementBracketWithIndex(const TypeElement &enType): m_pLeftArg(nullptr), m_pValue(nullptr) { @@ -2181,10 +2546,9 @@ namespace StarMath m_pValueTo->SetAttribute(pAttribute); } //class methods CElementMatrix - CElementMatrix::CElementMatrix(const TypeElement &enType): m_pFirstArgument(nullptr), m_pSecondArgument(nullptr) + CElementMatrix::CElementMatrix(const TypeElement &enType) + :CElement(TypeElement::Matrix), m_pFirstArgument(nullptr), m_pSecondArgument(nullptr), m_enTypeMatrix(enType) { - m_enTypeMatrix = enType; - SetBaseType(TypeElement::Matrix); } CElementMatrix::~CElementMatrix() { @@ -2239,6 +2603,15 @@ namespace StarMath pOneElement->ConversionToOOXML(pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:e",false,false); } + else if(pOneElement->GetBaseType() == TypeElement::SpecialSymbol) + { + CElementSpecialSymbol* pTempSpecial = dynamic_cast(pOneElement); + if(pTempSpecial->GetType() == TypeElement::transition) + { + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + } + } else if(pOneElement->GetBaseType() != TypeElement::undefine) pOneElement->ConversionToOOXML(pXmlWrite); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 2304e4a77e..b728a1be70 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -65,9 +65,11 @@ namespace StarMath CAttribute* GetAttribute(); //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) std::wstring GetElement(); + void FindingTheEndOfParentheses(); private: - bool CheckTokenForGetElement(const char& cToken); - std::wstring::iterator m_itStart,m_itEnd; + bool CheckTokenForGetElement(const wchar_t& cToken); + bool CheckIsalhpaForGetElement(const wchar_t& cToken,const wchar_t& cLastToken); + std::wstring::iterator m_itStart,m_itEnd,m_itEndBracket; TypeElement m_enGlobalType; TypeElement m_enUnderType; std::wstring m_wsToken; @@ -78,6 +80,7 @@ namespace StarMath { public: CElement(); + CElement(const TypeElement& enTypeBase); virtual ~CElement(); virtual void Parse(CStarMathReader* pReader) = 0; //The function creates the class we need (by determining the class type by a variable m_enGlobalType from the class CStarMathReader) @@ -152,7 +155,7 @@ namespace StarMath class CElementOperator: public CElement { public: - CElementOperator(const TypeElement& enType); + CElementOperator(const TypeElement& enType,const std::wstring& wsNameOp = L""); virtual ~CElementOperator(); void SetValueOperator(CElement* pElement); CElement* GetValueOperator(); @@ -160,6 +163,8 @@ namespace StarMath CElement* GetFromValue(); void SetToValue(CElement* pElement); CElement* GetToValue(); + void SetName(const std::wstring& wsNameOp); + std::wstring GetName(); static TypeElement GetOperator(const std::wstring& wsToken); static TypeElement GetFromOrTo(const std::wstring& wsToken); private: @@ -170,6 +175,7 @@ namespace StarMath CElement* m_pValueFrom; CElement* m_pValueTo; TypeElement m_enTypeOperator; + std::wstring m_wsName; }; class CElementGrade: public CElement @@ -199,10 +205,10 @@ namespace StarMath static TypeElement GetBracketOpen(const std::wstring& wsToken); std::vector GetBracketValue(); private: + TypeElement GetBracketClose(const std::wstring& wsToken); void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override;// - TypeElement GetBracketClose(const std::wstring& wsToken); TypeElement m_enTypeBracket; std::vector m_arBrecketValue; }; @@ -266,16 +272,19 @@ namespace StarMath class CElementFunction: public CElement { public: - CElementFunction(const TypeElement& enType); + CElementFunction(const TypeElement& enType, const std::wstring& wsNameFunc = L""); virtual ~CElementFunction(); void SetValueFunction(CElement* pElement); CElement* GetValueFunction(); + void SetNameFunc(const std::wstring& wsNameFunc); + std::wstring GetNameFuncInString(); static TypeElement GetFunction(const std::wstring& wsToken); private: void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValue; + std::wstring m_wsNameFunc; TypeElement m_enTypeFunction; }; @@ -284,10 +293,11 @@ namespace StarMath public: CElementSpecialSymbol(const TypeElement& enType); virtual ~CElementSpecialSymbol(); - static TypeElement GetSpecialSymbol(const std::wstring& wsToken); + static TypeElement GetSpecialSymbol(std::wstring& wsToken); void SetValue(CElement* pValue); + const TypeElement GetType(); private: - void SetWsTypeSymbol(); + void SetTypeSymbol(); void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index b59de24931..d766c8a753 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -61,6 +61,7 @@ enum class TypeElement{ lint, llint, lllint, + oper, //brace brace, round, @@ -207,6 +208,71 @@ enum class TypeElement{ laplace, fourier, backepsilon, + alpha, + zeta, + lambda, + pi, + phi, + alpha_small, + varepsilon, + iota_small, + xi, + varrho, + phi_small, + beta, + eta, + mu, + rho, + chi, + beta_small, + zeta_small, + kappa, + omicron, + sigma, + varphi, + gamma, + theta, + nu, + sigma_small, + psi, + gamma_small, + eta_small, + lambda_small, + pi_small, + varsigma, + chi_small, + delta, + iota, + xi_small, + tau, + omega, + delta_small, + theta_small, + mu_small, + varpi, + tau_small, + psi_small, + epsilon, + kappa_small, + omicron_small, + upsilon, + epsilon_small, + vartheta, + nu_small, + rho_small, + upsilon_small, + omega_small, + perthousand, + angle, + rightarrow, + leftarrow, + uparrow, + downarrow, + dotsaxis, + dotsvert, + dotsup, + dotsdown, + dotslow, //function abs, fact, @@ -231,6 +297,7 @@ enum class TypeElement{ ln, exp, log, + func, //index upper, lower, From 3fbbf754a2d4535bf5a135113462415f2630ed1c Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 26 Jan 2024 12:22:13 +0300 Subject: [PATCH 018/117] Fixed a bug in reading a function without an element. Adding a base attribute read. Code refactoring. --- .../StarMath2OOXML/TestSMConverter/main.cpp | 10 - .../StarMath2OOXML/cconversionsmtoooxml.cpp | 4 +- .../StarMath2OOXML/cconversionsmtoooxml.h | 2 +- .../StarMath2OOXML/cstarmathpars.cpp | 220 ++++++++++++------ .../Converter/StarMath2OOXML/cstarmathpars.h | 21 +- 5 files changed, 166 insertions(+), 91 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index bb314a3935..b20ec93d2c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -1064,16 +1064,6 @@ TEST(SMConvectorTest,Example10) // EXPECT_EQ(oTest.GetOOXML(),wsXmlString); //} -//TEST(SMConvectorTest,Example13) -//{ -// std::wstring wsString = L""; -// StarMath::CParserStarMathString oTemp; -// StarMath::CConversionSMtoOOXML oTest; -// oTest.StartConversion(oTemp.Parse(wsString)); -// std::wstring wsXmlString =L""; -// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); -//} - //TEST(SMConvectorTest,AttributeMatrix) //{ // std::wstring wsString = L""; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 74e2af689c..4524e27160 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -97,13 +97,13 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); } } - void CConversionSMtoOOXML::PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) + void CConversionSMtoOOXML::PropertiesMFPR(bool bType, XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { pXmlWrite->WriteNodeBegin(L"m:fPr",false); if(bType) { pXmlWrite->WriteNodeBegin(L"m:type",true); - pXmlWrite->WriteAttribute(L"m:val",wsType); + pXmlWrite->WriteAttribute(L"m:val",L"lin"); pXmlWrite->WriteNodeEnd(L"w",true,true); } WriteCtrlPrNode(pXmlWrite,pAttribute); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 986c18d196..4509453546 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -13,7 +13,7 @@ namespace StarMath { CConversionSMtoOOXML(); void StartConversion(std::vector arPars); static void StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); - static void PropertiesMFPR(bool bType,const std::wstring& wsType, XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void PropertiesMFPR(bool bType,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void BlockRecording(const std::wstring& wsNameBlock,CElement* pValueBlock,XmlUtils::CXmlWriter* pXmlWrite); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 498ed730b6..4d6c9a4ad7 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -3,11 +3,12 @@ namespace StarMath { //class methods CParsStarMath - std::vector CParserStarMathString::Parse(std::wstring& wsParseString) + std::vector CParserStarMathString::Parse(std::wstring& wsParseString,const TBaseAttribute* pBaseAttribute) { std::wstring::iterator itStart = wsParseString.begin(),itEnd = wsParseString.end(); CStarMathReader* pReader = new CStarMathReader(itStart,itEnd); - while(!pReader->CheckIteratorPosition()) + pReader->SetBaseAttribute(pBaseAttribute); + while(pReader->CheckIteratorPosition()) { CElement* pTempElement = ParseElement(pReader); if(nullptr == pTempElement) @@ -42,6 +43,8 @@ namespace StarMath if(pElement != nullptr) { + if(pReader->GetBaseAttribute()!=nullptr) + pElement->SetBaseAttribute(pReader->GetBaseAttribute()); if(pReader->GetAttribute() != nullptr && !CheckForLeftArgument(pReader->GetGlobalType())) pElement->SetBaseAttribute(pReader->GetAttribute()); else if(pReader->GetAttribute() != nullptr && (pReader->GetLocalType() == TypeElement::plus || TypeElement::minus == pReader->GetLocalType())) @@ -501,9 +504,8 @@ namespace StarMath } //class methods CElementString CElementString::CElementString(const std::wstring& wsTokenString) + :CElement(TypeElement::String),m_wsString(wsTokenString) { - m_wsString = wsTokenString; - SetBaseType(TypeElement::String); } CElementString::~CElementString() {} @@ -553,10 +555,9 @@ namespace StarMath SetBaseAttribute(pAttribute); } //class methods CElementBinOperator - CElementBinOperator::CElementBinOperator(const TypeElement& enType): m_pLeftArgument(nullptr) , m_pRightArgument(nullptr) + CElementBinOperator::CElementBinOperator(const TypeElement& enType) + :CElement(TypeElement::BinOperator),m_pLeftArgument(nullptr) , m_pRightArgument(nullptr),m_enTypeBinOp(enType) { - m_enTypeBinOp = enType; - SetBaseType(TypeElement::BinOperator); } CElementBinOperator::~CElementBinOperator() { @@ -603,9 +604,9 @@ namespace StarMath { oXmlWrite->WriteNodeBegin(L"m:f",false); if(m_enTypeBinOp == TypeElement::division) - CConversionSMtoOOXML::PropertiesMFPR(true,L"lin",oXmlWrite,GetAttribute()); + CConversionSMtoOOXML::PropertiesMFPR(true,oXmlWrite,GetAttribute()); else - CConversionSMtoOOXML::PropertiesMFPR(false,L"",oXmlWrite,GetAttribute()); + CConversionSMtoOOXML::PropertiesMFPR(false,oXmlWrite,GetAttribute()); CConversionSMtoOOXML::BlockRecording(L"m:num",m_pLeftArgument,oXmlWrite); CConversionSMtoOOXML::BlockRecording(L"m:den",m_pRightArgument,oXmlWrite); oXmlWrite->WriteNodeEnd(L"m:f",false,false); @@ -751,9 +752,8 @@ namespace StarMath } //class methods CElementBracket CElementBracket::CElementBracket(const TypeElement& enType) + :CElement(TypeElement::Bracket),m_enTypeBracket(enType) { - m_enTypeBracket = enType; - SetBaseType(TypeElement::Bracket); } CElementBracket::~CElementBracket() { @@ -798,13 +798,15 @@ namespace StarMath } void CElementBracket::Parse(CStarMathReader* pReader) { - pReader->GetToken(); - TypeElement enBracketClose = GetBracketClose(pReader->GetString()); - if(enBracketClose == TypeElement::undefine) - { - pReader->SetTypesToken(); - } - while(enBracketClose == TypeElement::undefine) + pReader->FindingTheEndOfParentheses(); +// pReader->EndingBrackets(); +// pReader->GetToken(); +// TypeElement enBracketClose = GetBracketClose(pReader->GetString()); +// if(enBracketClose == TypeElement::undefine) +// { +// pReader->SetTypesToken(); +// } + while(pReader->CheckIteratorPosition()) { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); if(!m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType())) @@ -813,20 +815,20 @@ namespace StarMath m_arBrecketValue.pop_back(); } m_arBrecketValue.push_back(pTempElement); - if(pReader->EmptyString()) - { - pReader->GetToken(); - enBracketClose = GetBracketClose(pReader->GetString()); - if(enBracketClose == TypeElement::undefine) - { - pReader->SetTypesToken(); - } - } - else enBracketClose = GetBracketClose(pReader->GetString()); +// if(pReader->EmptyString()) +// { +// pReader->GetToken(); +// enBracketClose = GetBracketClose(pReader->GetString()); +// if(enBracketClose == TypeElement::undefine) +// { +// pReader->SetTypesToken(); +// } +// } +// else enBracketClose = GetBracketClose(pReader->GetString()); } //доработать() SetAttribute(GetAttribute()); - pReader->ClearReader(); + pReader->IteratorNullification(); } void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -863,10 +865,9 @@ namespace StarMath } } //class methods CElementSpecialSymbol - CElementSpecialSymbol::CElementSpecialSymbol(const TypeElement &enType):m_pValue(nullptr) + CElementSpecialSymbol::CElementSpecialSymbol(const TypeElement &enType) + :CElement(TypeElement::SpecialSymbol),m_pValue(nullptr),m_enTypeSpecial(enType),m_wsType(L"") { - m_enTypeSpecial = enType; - SetBaseType(TypeElement::SpecialSymbol); } CElementSpecialSymbol::~CElementSpecialSymbol() { @@ -1324,10 +1325,9 @@ namespace StarMath } } //class methods CElementSetOperations - CElementSetOperations::CElementSetOperations(const TypeElement &enType): m_pRightArgument(nullptr), m_pLeftArgument(nullptr) + CElementSetOperations::CElementSetOperations(const TypeElement &enType) + :CElement(TypeElement::SetOperations),m_pLeftArgument(nullptr), m_pRightArgument(nullptr),m_enTypeSet(enType) { - m_enTypeSet = enType; - SetBaseType(TypeElement::SetOperations); } CElementSetOperations::~CElementSetOperations() { @@ -1454,10 +1454,9 @@ namespace StarMath m_pRightArgument->SetAttribute(pAttribute); } //class methods CElementConnection - CElementConnection::CElementConnection(const TypeElement& enType): m_pLeftArgument(nullptr), m_pRightArgument(nullptr) + CElementConnection::CElementConnection(const TypeElement& enType) + :CElement(TypeElement::Connection),m_pLeftArgument(nullptr), m_pRightArgument(nullptr),m_enTypeCon(enType) { - m_enTypeCon = enType; - SetBaseType(TypeElement::Connection); } CElementConnection::~CElementConnection() { @@ -1657,10 +1656,9 @@ namespace StarMath m_pRightArgument->SetAttribute(pAttribute); } //class methods CIndex - CElementIndex::CElementIndex(const TypeElement& enType): m_pValueIndex(nullptr),m_pLeftArg(nullptr) + CElementIndex::CElementIndex(const TypeElement& enType) + : CElement(TypeElement::Index),m_pValueIndex(nullptr),m_pLeftArg(nullptr),m_enTypeIndex(enType) { - m_enTypeIndex = enType; - SetBaseType(TypeElement::Index); } CElementIndex::~CElementIndex() { @@ -1824,16 +1822,21 @@ namespace StarMath } void CElementFunction::Parse(CStarMathReader* pReader) { - CElement* pTemp = CParserStarMathString::ParseElement(pReader); - pReader->GetToken(); - pReader->SetTypesToken(); - if(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) + if(pReader->CheckIteratorPosition()) { - CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTemp,pTempElement); - pTemp = pTempElement; + CElement* pTemp = CParserStarMathString::ParseElement(pReader); + pReader->GetToken(); + pReader->SetTypesToken(); + if(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) + { + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTemp,pTempElement); + pTemp = pTempElement; + } + SetValueFunction(pTemp); } - SetValueFunction(pTemp); + else + SetValueFunction(nullptr); //pReader->ClearReader(); } void CElementFunction::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) @@ -1919,9 +1922,17 @@ namespace StarMath pXmlWrite->WriteNodeEnd(L"m:t",false,false); pXmlWrite->WriteNodeEnd(L"m:r",false,false); pXmlWrite->WriteNodeEnd(L"m:fName",false,false); + if(m_pValue!=nullptr) + { pXmlWrite->WriteNodeBegin(L"m:e",false); m_pValue->ConversionToOOXML(pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:e",false,false); + } + else + { + pXmlWrite->WriteNodeBegin(L"m:e",true); + pXmlWrite->WriteNodeEnd(L"",true,true); + } pXmlWrite->WriteNodeEnd(L"m:func",false,false); } TypeElement CElementFunction::GetFunction(const std::wstring &wsToken) @@ -2105,7 +2116,8 @@ namespace StarMath m_pValueTo->SetAttribute(pAttribute); } // class methods CStarMathReader - CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd): m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr) + CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd) + : m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr) { m_itStart = itStart; m_itEnd = itEnd; @@ -2118,7 +2130,7 @@ namespace StarMath //TODO :: ParseColor and ParseFont void CStarMathReader::GetToken() { - if(m_itStart != m_itEnd) + if(CheckIteratorPosition()) { m_wsToken = GetElement(); TypeElement enTypeFont =CAttribute::GetTypeFontAttribute(m_wsToken),enTypeColor = CAttribute::GetTypeColorAttribute(m_wsToken); @@ -2264,8 +2276,7 @@ namespace StarMath } bool CStarMathReader::CheckIteratorPosition() { - if(m_itStart != m_itEnd) return false; - else return true; + return (m_itStart != m_itEnd); } void CStarMathReader::SetAttribute(CAttribute *pAttribute) { @@ -2275,6 +2286,29 @@ namespace StarMath { return m_pAttribute; } + void CStarMathReader::SetBaseAttribute(const TBaseAttribute* pAttribute) + { + if(pAttribute!=nullptr) + { + m_pBaseAttribute = new CAttribute; + if(pAttribute->base_font_italic) + m_pBaseAttribute->SetItal(); + if(pAttribute->base_font_bold) + m_pBaseAttribute->SetBold(); + // if(!pAttribute.base_font_name.empty()) + // m_pBaseAttribute->SetFont(); + if(pAttribute->base_font_size != 0) + m_pBaseAttribute->SetSize(pAttribute->base_font_size); + // if(pAttribute.base_alignment != 0) + // m_pBaseAttribute-> + } + else + m_pBaseAttribute = nullptr; + } + CAttribute* CStarMathReader::GetBaseAttribute() + { + return m_pBaseAttribute; + } std::wstring CStarMathReader::GetElement() { std::wstring m_wsElement{}; @@ -2306,23 +2340,61 @@ namespace StarMath } void CStarMathReader::FindingTheEndOfParentheses() { - + std::wstring::iterator itStart = m_itStart,itStartBracketClose; + int inBracketInside = 0; + while(CheckIteratorPosition()) + { + itStartBracketClose = m_itStart; + GetToken(); + if(CElementBracket::GetBracketOpen(m_wsToken) != TypeElement::undefine) + { + inBracketInside +=1; + } + else if(CElementBracket::GetBracketClose(m_wsToken) != TypeElement::undefine && inBracketInside == 0) + { + m_stBracket.push(m_itEnd); + m_itEnd = itStartBracketClose; + break; + } + else if(CElementBracket::GetBracketClose(m_wsToken) != TypeElement::undefine && inBracketInside != 0) + { + inBracketInside -=1; + } + } + ClearReader(); + m_itStart = itStart; + } + void CStarMathReader::IteratorNullification() + { + if(!m_stBracket.empty()) + { + m_itEnd = m_stBracket.top(); + m_stBracket.pop(); + } + while(TypeElement::undefine == CElementBracket::GetBracketClose(GetString()) && CheckIteratorPosition()) + { + GetToken(); + } + ClearReader(); } bool CStarMathReader::CheckTokenForGetElement(const wchar_t &cToken) { - if(L'[' == cToken) return true; - else if(L']' == cToken) return true; - else if(L'{' == cToken) return true; - else if(L'}' == cToken) return true; - else if(L'_' == cToken) return true; - else if(L'^' == cToken) return true; - else if(L'*' == cToken) return true; - else if(L'/' == cToken) return true; -// else if(L'-' == cToken) return true; -// else if(L'+' == cToken) return true; - else if(L'`' == cToken) return true; - else if(L'~' == cToken) return true; - else return false; + switch(cToken) + { + case L'[': + case L']': + case L'{': + case L'}': + case L'_': + case L'^': + case L'*': + case L'/': + case L'`': + case L'~': + return true; + default: + return false; + } } bool CStarMathReader::CheckIsalhpaForGetElement(const wchar_t &cToken, const wchar_t &cLastToken) { @@ -2338,10 +2410,9 @@ namespace StarMath return true; } //class methods CElementBracketWithIndex - CElementBracketWithIndex::CElementBracketWithIndex(const TypeElement &enType): m_pLeftArg(nullptr), m_pValue(nullptr) + CElementBracketWithIndex::CElementBracketWithIndex(const TypeElement &enType) + :CElement(TypeElement::BracketWithIndex),m_pLeftArg(nullptr), m_pValue(nullptr),m_enTypeBracketWithIndex(enType) { - m_enTypeBracketWithIndex = enType; - SetBaseType(TypeElement::BracketWithIndex); } CElementBracketWithIndex::~CElementBracketWithIndex() { @@ -2443,9 +2514,9 @@ namespace StarMath m_pLeftArg->SetAttribute(pAttribute); } //class methods CElementGrade - CElementGrade::CElementGrade(): m_pValueFrom(nullptr), m_pValueGrade(nullptr), m_pValueTo(nullptr) + CElementGrade::CElementGrade() + :CElement(TypeElement::Grade),m_pValueGrade(nullptr), m_pValueFrom(nullptr), m_pValueTo(nullptr) { - SetBaseType(TypeElement::Grade); } CElementGrade::~CElementGrade() { @@ -2655,10 +2726,9 @@ namespace StarMath m_pSecondArgument->SetAttribute(pAttribute); } //class CElementDiacriticalMark - CElementDiacriticalMark::CElementDiacriticalMark(const TypeElement& enType):m_pValueMark(nullptr) + CElementDiacriticalMark::CElementDiacriticalMark(const TypeElement& enType) + :CElement(TypeElement::Mark),m_pValueMark(nullptr),m_enTypeMark(enType) { - m_enTypeMark = enType; - SetBaseType(TypeElement::Mark); } CElementDiacriticalMark::~CElementDiacriticalMark() { diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index b728a1be70..215a5e2e0a 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -5,12 +5,22 @@ #include #include #include +#include #include "../../../../DesktopEditor/xml/include/xmlwriter.h" namespace StarMath { class CStarMathReader; + struct TBaseAttribute + { + int base_font_size = 12; + std::wstring base_font_name; + int base_alignment = 1; + bool base_font_bold = false; + bool base_font_italic = false; + }; + class CAttribute { public: @@ -63,17 +73,22 @@ namespace StarMath bool EmptyString(); void SetAttribute(CAttribute* pAttribute); CAttribute* GetAttribute(); + void SetBaseAttribute(const TBaseAttribute* pAttribute); + CAttribute* GetBaseAttribute(); //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) std::wstring GetElement(); void FindingTheEndOfParentheses(); + void IteratorNullification(); private: bool CheckTokenForGetElement(const wchar_t& cToken); bool CheckIsalhpaForGetElement(const wchar_t& cToken,const wchar_t& cLastToken); - std::wstring::iterator m_itStart,m_itEnd,m_itEndBracket; + std::wstring::iterator m_itStart,m_itEnd; TypeElement m_enGlobalType; TypeElement m_enUnderType; std::wstring m_wsToken; CAttribute* m_pAttribute; + CAttribute* m_pBaseAttribute; + std::stack m_stBracket; }; class CElement @@ -203,9 +218,9 @@ namespace StarMath virtual ~CElementBracket(); void SetBracketValue(const std::vector& arValue); static TypeElement GetBracketOpen(const std::wstring& wsToken); + static TypeElement GetBracketClose(const std::wstring& wsToken); std::vector GetBracketValue(); private: - TypeElement GetBracketClose(const std::wstring& wsToken); void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override;// @@ -341,7 +356,7 @@ namespace StarMath class CParserStarMathString { public: - std::vector Parse(std::wstring& wsParseString); + std::vector Parse(std::wstring& wsParseString, const TBaseAttribute* pBaseAttribute = nullptr); static CElement* ParseElement(CStarMathReader* pReader); //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). static bool AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); From 0d1e5198c45cf600f96bd3abf9b6765c5fcf5ece Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Mon, 5 Feb 2024 21:01:58 +0300 Subject: [PATCH 019/117] Converting lim families with upper and lower indexes. Converting csub and csup. Bug fixing.Code refactoring. --- .../StarMath2OOXML/TestSMConverter/main.cpp | 50 ++- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 51 ++- .../StarMath2OOXML/cconversionsmtoooxml.h | 4 +- .../StarMath2OOXML/cstarmathpars.cpp | 379 +++++++++--------- .../Converter/StarMath2OOXML/cstarmathpars.h | 5 +- .../Converter/StarMath2OOXML/typeselements.h | 2 +- 6 files changed, 290 insertions(+), 201 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index b20ec93d2c..5914ccfd95 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -990,7 +990,7 @@ TEST(SMConvectorTest,Example3) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"c=a2+b2"; + std::wstring wsXmlString =L"c=a2+b2"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1054,15 +1054,45 @@ TEST(SMConvectorTest,Example10) EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } -//TEST(SMConvectorTest,Example13) -//{ -// std::wstring wsString = L""; -// StarMath::CParserStarMathString oTemp; -// StarMath::CConversionSMtoOOXML oTest; -// oTest.StartConversion(oTemp.Parse(wsString)); -// std::wstring wsXmlString =L""; -// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); -//} +TEST(SMConvectorTest,LimAndCsub) +{ + std::wstring wsString = L"{lim from 2 over 10 to 1 5} csub 244"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"lim21015244"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,LimSupAndCsup) +{ + std::wstring wsString = L"limsup from 10 to 2 csup 10 100"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"lim sup10210100"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,OverWithoutLeft) +{ + std::wstring wsString = L"over +- 2_10 5"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"\u00B12105"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Newline) +{ + std::wstring wsString = L"2 over 3 newline 10 csup 2 "; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2323102"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} //TEST(SMConvectorTest,AttributeMatrix) //{ diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 627b7048c5..4c16e63b6c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -48,6 +48,10 @@ namespace StarMath { oTempElement->ConversionToOOXML(m_pXmlWrite); } EndConversion(); + NSFile::CFileBinary oFile; + oFile.CreateFileW(L"Test.txt"); + oFile.WriteStringUTF8(m_pXmlWrite->GetXmlString()); + oFile.CloseFile(); } void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { @@ -70,10 +74,19 @@ namespace StarMath { } else { + std::wstring wsNameFont = pAttribute->GetFontName(); pXmlWrite->WriteNodeBegin(L"w:rPr",false); pXmlWrite->WriteNodeBegin(L"w:rFonts",true); - pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + if(!wsNameFont.empty()) + { + pXmlWrite->WriteAttribute(L"w:hAnsi",wsNameFont); + pXmlWrite->WriteAttribute(L"w:ascii",wsNameFont); + } + else + { + pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + } pXmlWrite->WriteNodeEnd(L"w",true,true); if(pAttribute->GetSize() == 0) { @@ -189,12 +202,23 @@ namespace StarMath { WriteCtrlPrNode(pXmlWrite,pAttribute); pXmlWrite->WriteNodeEnd(L"m:naryPr",false,false); } - void CConversionSMtoOOXML::BlockRecording(const std::wstring &wsNameBlock, CElement *pValueBlock,XmlUtils::CXmlWriter* pXmlWrite) + void CConversionSMtoOOXML::WriteNodeConversion(const std::wstring &wsNameBlock, CElement *pValueBlock,XmlUtils::CXmlWriter* pXmlWrite) { - pXmlWrite->WriteNodeBegin(wsNameBlock,false); + if(pValueBlock != nullptr) + { + pXmlWrite->WriteNodeBegin(wsNameBlock,false); + pValueBlock->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameBlock,false,false); + } + else + { + pXmlWrite->WriteNodeBegin(wsNameBlock,true); + pXmlWrite->WriteNodeEnd(L"",true,true); + } +/* pXmlWrite->WriteNodeBegin(wsNameBlock,false); if(pValueBlock != nullptr) pValueBlock->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(wsNameBlock,false,false); + pXmlWrite->WriteNodeEnd(wsNameBlock,false,false)*/; } std::wstring CConversionSMtoOOXML::GetOOXML() { @@ -369,5 +393,22 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"m:t",false,false); pXmlWrite->WriteNodeEnd(L"m:r",false,false); } + void CConversionSMtoOOXML::WriteLimUpOrLowNode(XmlUtils::CXmlWriter *pXmlWrite,const std::wstring& wsNameNode,CElement* pValue, const TypeElement& enType,CAttribute* pAttribute,const std::wstring& wsName) + { + pXmlWrite->WriteNodeBegin(wsNameNode,false); + pXmlWrite->WriteNodeBegin(wsNameNode+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr); + pXmlWrite->WriteNodeEnd(wsNameNode+L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + CConversionSMtoOOXML::WriteRPrFName(enType,pXmlWrite,pAttribute,wsName); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + WriteNodeConversion(L"m:lim",pValue,pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameNode,false,false); + } + void CConversionSMtoOOXML::ElementConversion(XmlUtils::CXmlWriter *pXmlWrite, CElement *pElement) + { + if(pElement!= nullptr) + pElement->ConversionToOOXML(pXmlWrite); + } } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index b83ec64ab6..7561585039 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -46,7 +46,7 @@ namespace StarMath { static void PropertiesMFPR(bool bType,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); - static void BlockRecording(const std::wstring& wsNameBlock,CElement* pValueBlock,XmlUtils::CXmlWriter* pXmlWrite); + static void WriteNodeConversion(const std::wstring& wsNameBlock,CElement* pValueBlock,XmlUtils::CXmlWriter* pXmlWrite); static void PropertiesDPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeBracket,CAttribute* pAttribute); static void PropertiesMPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeMatrix,CAttribute* pAttribute); static void NodeGrade(XmlUtils::CXmlWriter* pXmlWrite,CElement* pValueGrade,CAttribute* pAttribute); @@ -56,6 +56,8 @@ namespace StarMath { static void WriteRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const std::wstring& wsNameOp); static void WriteStyNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsAttributeNode); static void WritePreserveBlock(XmlUtils::CXmlWriter* pXmlWrite, CAttribute *pAttribute); + static void WriteLimUpOrLowNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsNameNode,CElement* pValue,const TypeElement& enType,CAttribute* pAttribute, const std::wstring& wsName = L"oper"); + static void ElementConversion(XmlUtils::CXmlWriter* pXmlWrite,CElement* pElement); void EndConversion(); std::wstring GetOOXML(); private: diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index c2344dfe08..786a4639a2 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -42,7 +42,14 @@ namespace StarMath pReader->SetBaseAttribute(pBaseAttribute); while(pReader->CheckIteratorPosition()) { - CElement* pTempElement = ParseElement(pReader); + CElement* pTempElement; + if(pReader->GetLocalType() == TypeElement::newline) + { + m_arEquation.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); + pReader->ClearReader(); + } + else + pTempElement = ParseElement(pReader); if(nullptr == pTempElement) continue; if(!m_arEquation.empty() && CheckForLeftArgument(pTempElement->GetBaseType()) ) @@ -54,7 +61,14 @@ namespace StarMath } if(!pReader->EmptyString()) { - CElement* pTempElement = ParseElement(pReader); + CElement* pTempElement; + if(pReader->GetLocalType() == TypeElement::newline) + { + m_arEquation.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); + pReader->ClearReader(); + } + else + pTempElement = ParseElement(pReader); if(nullptr != pTempElement) m_arEquation.push_back(pTempElement); } @@ -65,24 +79,23 @@ namespace StarMath { CElement* pElement; - if(pReader->EmptyString()) - { - pReader->GetToken(); - pReader->SetTypesToken(); - } + pReader->ReadingTheNextToken(); + + if(TypeElement::newline == pReader->GetLocalType()) + return nullptr; pElement = CElement::CreateElement(pReader); if(pElement != nullptr) { - if(pReader->GetBaseAttribute()!=nullptr) - pElement->SetBaseAttribute(pReader->GetBaseAttribute()); if(pReader->GetAttribute() != nullptr && !CheckForLeftArgument(pReader->GetGlobalType())) pElement->SetBaseAttribute(pReader->GetAttribute()); else if(pReader->GetAttribute() != nullptr && (pReader->GetLocalType() == TypeElement::plus || TypeElement::minus == pReader->GetLocalType())) pElement->SetBaseAttribute(pReader->GetAttribute()); pReader->ClearReader(); pElement->Parse(pReader); + if(pReader->GetBaseAttribute()!=nullptr) + pElement->SetBaseAttribute(pReader->GetBaseAttribute()); if(pElement->GetAttribute() != nullptr && TypeElement::Function != pElement->GetBaseType()) pElement->SetAttribute(pElement->GetAttribute()); return pElement; @@ -308,6 +321,10 @@ namespace StarMath break; } } + void CAttribute::SetFontName(const std::wstring &wsNameFont) + { + m_wsNameFont = wsNameFont; + } bool CAttribute::GetBold() { return m_bBold; @@ -328,6 +345,10 @@ namespace StarMath { return m_wsColor; } + const std::wstring& CAttribute::GetFontName() + { + return m_wsNameFont; + } unsigned int CAttribute::GetSize() { return m_iSize; @@ -392,6 +413,15 @@ namespace StarMath } case TypeElement::font: { + pReader->GetToken(); + if(pReader->GetString() == L"sans") + m_wsNameFont = L"Arial"; + else if(pReader->GetString() == L"serif") + m_wsNameFont = L"Times New Roman"; + else if(pReader->GetString() == L"fixed") + m_wsNameFont = L"Times New Roman"; + else + m_wsNameFont = pReader->GetString(); break; } default: @@ -618,8 +648,7 @@ namespace StarMath else { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - pReader->GetToken(); - pReader->SetTypesToken(); + pReader->ReadingTheNextToken(); if((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { CElement* pBinOp = CParserStarMathString::ParseElement(pReader); @@ -630,72 +659,71 @@ namespace StarMath SetRightArg(pTempElement); } } - void CElementBinOperator::ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) + void CElementBinOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) { if(m_enTypeBinOp == TypeElement::over || m_enTypeBinOp ==TypeElement::division || TypeElement::frac == m_enTypeBinOp) { - oXmlWrite->WriteNodeBegin(L"m:f",false); + pXmlWrite->WriteNodeBegin(L"m:f",false); if(m_enTypeBinOp == TypeElement::division) - CConversionSMtoOOXML::PropertiesMFPR(true,oXmlWrite,GetAttribute()); + CConversionSMtoOOXML::PropertiesMFPR(true,pXmlWrite,GetAttribute()); else - CConversionSMtoOOXML::PropertiesMFPR(false,oXmlWrite,GetAttribute()); - CConversionSMtoOOXML::BlockRecording(L"m:num",m_pLeftArgument,oXmlWrite); - CConversionSMtoOOXML::BlockRecording(L"m:den",m_pRightArgument,oXmlWrite); - oXmlWrite->WriteNodeEnd(L"m:f",false,false); + CConversionSMtoOOXML::PropertiesMFPR(false,pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WriteNodeConversion(L"m:num",m_pLeftArgument,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:den",m_pRightArgument,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:f",false,false); } - else //if(m_enTypeBinOp == TypeElement::plus ||m_enTypeBinOp == TypeElement::minus || m_enTypeBinOp == TypeElement::multipl || m_enTypeBinOp == TypeElement::cdot || m_enTypeBinOp == TypeElement::times || m_enTypeBinOp == TypeElement::div || m_enTypeBinOp == TypeElement::odivide || m_enTypeBinOp == TypeElement::oplus || m_enTypeBinOp == TypeElement::ominus || m_enTypeBinOp == TypeElement::odot || m_enTypeBinOp == TypeElement::otimes) + else { - if(m_pLeftArgument!=nullptr) - m_pLeftArgument->ConversionToOOXML(oXmlWrite); - oXmlWrite->WriteNodeBegin(L"m:r",false); - CConversionSMtoOOXML::StandartProperties(oXmlWrite,GetAttribute()); - oXmlWrite->WriteNodeBegin(L"m:t",false); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArgument); + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); switch (m_enTypeBinOp) { case TypeElement::plus: - oXmlWrite->WriteString(L"+"); + pXmlWrite->WriteString(L"+"); break; case TypeElement::minus: - oXmlWrite->WriteString(L"-"); + pXmlWrite->WriteString(L"-"); break; case TypeElement::multipl: - oXmlWrite->WriteString(L"*"); + pXmlWrite->WriteString(L"*"); break; case TypeElement::cdot: - oXmlWrite->WriteString(L"\u00B7"); + pXmlWrite->WriteString(L"\u00B7"); break; case TypeElement::times: - oXmlWrite->WriteString(L"\u00D7"); + pXmlWrite->WriteString(L"\u00D7"); break; case TypeElement::div: - oXmlWrite->WriteString(L"\u00F7"); + pXmlWrite->WriteString(L"\u00F7"); break; case TypeElement::odivide: - oXmlWrite->WriteString(L"\u2298"); + pXmlWrite->WriteString(L"\u2298"); break; case TypeElement::oplus: - oXmlWrite->WriteString(L"\u2295"); + pXmlWrite->WriteString(L"\u2295"); break; case TypeElement::ominus: - oXmlWrite->WriteString(L"\u2296"); + pXmlWrite->WriteString(L"\u2296"); break; case TypeElement::odot: - oXmlWrite->WriteString(L"\u2299"); + pXmlWrite->WriteString(L"\u2299"); break; case TypeElement::otimes: - oXmlWrite->WriteString(L"\u2297"); + pXmlWrite->WriteString(L"\u2297"); break; case TypeElement::plus_minus: - oXmlWrite->WriteString(L"\u00B1"); + pXmlWrite->WriteString(L"\u00B1"); break; case TypeElement::minus_plus: - oXmlWrite->WriteString(L"\u2213"); + pXmlWrite->WriteString(L"\u2213"); break; case TypeElement::Or: - oXmlWrite->WriteString(L"\u2228"); + pXmlWrite->WriteString(L"\u2228"); break; case TypeElement::And: - oXmlWrite->WriteString(L"\u2227"); + pXmlWrite->WriteString(L"\u2227"); break; default: break; @@ -703,16 +731,15 @@ namespace StarMath if(m_pRightArgument!=nullptr && m_pRightArgument->GetBaseType() == TypeElement::String && GetAttribute() == m_pRightArgument->GetAttribute()) { CElementString* oNumber = dynamic_cast (m_pRightArgument); - oXmlWrite->WriteString(oNumber->GetString()); - oXmlWrite->WriteNodeEnd(L"m:t",false,false); - oXmlWrite->WriteNodeEnd(L"m:r",false,false); + pXmlWrite->WriteString(oNumber->GetString()); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); } else { - oXmlWrite->WriteNodeEnd(L"m:t",false,false); - oXmlWrite->WriteNodeEnd(L"m:r",false,false); - if(m_pRightArgument!= nullptr) - m_pRightArgument->ConversionToOOXML(oXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pRightArgument); } } @@ -831,13 +858,6 @@ namespace StarMath void CElementBracket::Parse(CStarMathReader* pReader) { pReader->FindingTheEndOfParentheses(); -// pReader->EndingBrackets(); -// pReader->GetToken(); -// TypeElement enBracketClose = GetBracketClose(pReader->GetString()); -// if(enBracketClose == TypeElement::undefine) -// { -// pReader->SetTypesToken(); -// } while(pReader->CheckIteratorPosition()) { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); @@ -847,19 +867,8 @@ namespace StarMath m_arBrecketValue.pop_back(); } m_arBrecketValue.push_back(pTempElement); -// if(pReader->EmptyString()) -// { -// pReader->GetToken(); -// enBracketClose = GetBracketClose(pReader->GetString()); -// if(enBracketClose == TypeElement::undefine) -// { -// pReader->SetTypesToken(); -// } -// } -// else enBracketClose = GetBracketClose(pReader->GetString()); } //доработать() - SetAttribute(GetAttribute()); pReader->IteratorNullification(); } void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) @@ -869,20 +878,18 @@ namespace StarMath pXmlWrite->WriteNodeBegin(L"m:d",false); CConversionSMtoOOXML::PropertiesDPr(pXmlWrite,m_enTypeBracket,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:e",false); - for(CElement* oTemp:m_arBrecketValue) + for(CElement* pTemp:m_arBrecketValue) { - if(oTemp != nullptr) - oTemp->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,pTemp); } pXmlWrite->WriteNodeEnd(L"m:e",false,false); pXmlWrite->WriteNodeEnd(L"m:d",false,false); } else { - for(CElement* oTemp:m_arBrecketValue) + for(CElement* pTemp:m_arBrecketValue) { - if(oTemp != nullptr) - oTemp->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,pTemp); } } @@ -966,6 +973,7 @@ namespace StarMath else if(L"dotsvert" == wsToken) return TypeElement::dotsvert; else if(L"dotsup" == wsToken) return TypeElement::dotsup; else if(L"dotsdown" == wsToken) return TypeElement::dotsdown; + else if(L"newline" == wsToken) return TypeElement::newline; } else if(wsToken[0] == L'%') { @@ -1045,8 +1053,7 @@ namespace StarMath { case TypeElement::fact: { - if(m_pValue!= nullptr) - m_pValue->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); pXmlWrite->WriteNodeBegin(L"m:r",false); CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:t",false); @@ -1068,6 +1075,16 @@ namespace StarMath CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); break; } + case TypeElement::newline: + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + pXmlWrite->WriteNodeBegin(L"w:br",true); + pXmlWrite->WriteNodeEnd(L"",true,true); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); + pXmlWrite->WriteNodeBegin(L"m:oMath",false); + break; + } default: { if(!m_wsType.empty()) @@ -1385,11 +1402,7 @@ namespace StarMath void CElementSetOperations::Parse(CStarMathReader* pReader) { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - if(pReader->EmptyString()) - { - pReader->GetToken(); - pReader->SetTypesToken(); - } + pReader->ReadingTheNextToken(); if((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { CElement* pElement = CParserStarMathString::ParseElement(pReader); @@ -1400,7 +1413,7 @@ namespace StarMath } void CElementSetOperations::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - m_pLeftArgument->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArgument); pXmlWrite->WriteNodeBegin(L"m:r", false); CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:t",false); @@ -1456,7 +1469,7 @@ namespace StarMath } pXmlWrite->WriteNodeEnd(L"m:t",false,false); pXmlWrite->WriteNodeEnd(L"m:r",false,false); - m_pRightArgument->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pRightArgument); } TypeElement CElementSetOperations::GetSetOperation(const std::wstring &wsToken) { @@ -1513,26 +1526,21 @@ namespace StarMath } void CElementConnection::Parse(CStarMathReader *pReader) { - pReader->SetAttribute(GetAttribute()); +// pReader->SetAttribute(GetAttribute()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - if(pReader->EmptyString()) - { - pReader->GetToken(); - pReader->SetTypesToken(); - } + pReader->ReadingTheNextToken(); if((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt))) { - pReader->SetAttribute(GetAttribute()); +// pReader->SetAttribute(GetAttribute()); CElement* pBinOp = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); SetRightArg(pBinOp); } else SetRightArg(pTempElement); } - //absent leslant,geslant and toward void CElementConnection::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - m_pLeftArgument->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArgument); pXmlWrite->WriteNodeBegin(L"m:r",false); CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:t",false); @@ -1639,7 +1647,7 @@ namespace StarMath } pXmlWrite->WriteNodeEnd(L"m:t", false, false); pXmlWrite->WriteNodeEnd(L"m:r",false ,false); - m_pRightArgument->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pRightArgument); } TypeElement CElementConnection::GetConnection(const std::wstring& wsToken) { @@ -1740,7 +1748,10 @@ namespace StarMath } void CElementIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - if(m_enTypeIndex == TypeElement::upper || m_enTypeIndex == TypeElement::lower) + switch(m_enTypeIndex) + { + case TypeElement::upper: + case TypeElement::lower: { std::wstring wsNameNodeIndex; switch(m_enTypeIndex) @@ -1754,45 +1765,52 @@ namespace StarMath } pXmlWrite->WriteNodeBegin(wsNameNodeIndex,false); pXmlWrite->WriteNodeBegin(wsNameNodeIndex+L"Pr",false); - pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); - pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pLeftArg,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); switch(m_enTypeIndex) { case TypeElement::upper: - CConversionSMtoOOXML::BlockRecording(L"m:sup",m_pValueIndex,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueIndex,pXmlWrite); break; case TypeElement::lower: - CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueIndex,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueIndex,pXmlWrite); break; } pXmlWrite->WriteNodeEnd(wsNameNodeIndex,false,false); + break; } - else if(m_enTypeIndex == TypeElement::lsub || TypeElement::lsup == m_enTypeIndex) + case TypeElement::lsub: + case TypeElement::lsup: { pXmlWrite->WriteNodeBegin(L"m:sPre",false); pXmlWrite->WriteNodeBegin(L"m:sPrePr",false); - pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); - pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:sPrePr",false,false); - if(m_enTypeIndex==TypeElement::lsup) + switch(m_enTypeIndex) { - CConversionSMtoOOXML::BlockRecording(L"m:sup",m_pValueIndex,pXmlWrite); + case TypeElement::lsup: + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueIndex,pXmlWrite); + break; + case TypeElement::lsub: + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueIndex,pXmlWrite); + break; } - else if(m_enTypeIndex == TypeElement::lsub) - { - CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueIndex,pXmlWrite); - } - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pLeftArg,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); + break; } - else if(m_enTypeIndex == TypeElement::nroot || TypeElement::sqrt == m_enTypeIndex) + case TypeElement::nroot: + case TypeElement::sqrt: { pXmlWrite->WriteNodeBegin(L"m:rad",false); pXmlWrite->WriteNodeBegin(L"m:radPr",false); + if(TypeElement::sqrt == m_enTypeIndex) + { + pXmlWrite->WriteNodeBegin(L"m:degHide",true); + pXmlWrite->WriteAttribute(L"m:val",1); + pXmlWrite->WriteNodeEnd(L"",true,true); + } CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:radPr",false,false); if(m_pLeftArg != nullptr && m_enTypeIndex == TypeElement::nroot) @@ -1806,18 +1824,33 @@ namespace StarMath pXmlWrite->WriteNodeBegin(L"m:deg",true); pXmlWrite->WriteNodeEnd(L"w",true,true); } - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValueIndex,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueIndex,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:rad",false,false); + break; + } + case TypeElement::csub: + case TypeElement::csup: + { + std::wstring wsNameLim; + switch(m_enTypeIndex) + { + case TypeElement::csub: + wsNameLim = L"m:limLow"; + break; + case TypeElement::csup: + wsNameLim = L"m:limUpp"; + break; + } + pXmlWrite->WriteNodeBegin(wsNameLim,false); + pXmlWrite->WriteNodeBegin(wsNameLim+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(wsNameLim+L"Pr",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pValueIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameLim,false,false); + break; + } } -// else if(m_enTypeIndex == TypeElement::csup || TypeElement::csub == m_enTypeIndex) -// { -// pXmlWrite->WriteNodeBegin(L"m:acc",false); -// pXmlWrite->WriteNodeBegin(L"m:accPr",false); -// pXmlWrite->WriteNodeBegin(L"m:chr",true); -// pXmlWrite->WriteAttribute(L"m:val",L""); -// pXmlWrite->WriteNodeEnd(L"m:accPr",false,false); -// pXmlWrite->WriteNodeEnd(L"m:acc",false,false); -// } } void CElementIndex::SetAttribute(CAttribute *pAttribute) { @@ -1857,8 +1890,7 @@ namespace StarMath if(pReader->CheckIteratorPosition()) { CElement* pTemp = CParserStarMathString::ParseElement(pReader); - pReader->GetToken(); - pReader->SetTypesToken(); + pReader->ReadingTheNextToken(); if(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); @@ -1956,9 +1988,7 @@ namespace StarMath pXmlWrite->WriteNodeEnd(L"m:fName",false,false); if(m_pValue!=nullptr) { - pXmlWrite->WriteNodeBegin(L"m:e",false); - m_pValue->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValue,pXmlWrite); } else { @@ -2065,9 +2095,7 @@ namespace StarMath } void CElementOperator::Parse(CStarMathReader* pReader) { -// pReader->SetAttributeTemp(GetAttribute()); - pReader->GetToken(); - pReader->SetTypesToken(); + pReader->ReadingTheNextToken(); if(pReader->GetLocalType() == TypeElement::from) { pReader->ClearReader(); @@ -2078,45 +2106,35 @@ namespace StarMath pReader->ClearReader(); SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader)); } -// pReader->SetAttributeTemp(GetAttribute()); SetValueOperator(CParserStarMathString::ParseElement(pReader)); -// pReader->ClearAttributeTemp(); } void CElementOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) { if(m_enTypeOperator == TypeElement::lim || TypeElement::liminf == m_enTypeOperator || TypeElement::limsup == m_enTypeOperator || TypeElement::oper == m_enTypeOperator) { - std::wstring wsTempNameNode; - if(m_pValueFrom != nullptr) - wsTempNameNode = L"m:limLow"; - else if(m_pValueTo != nullptr) - wsTempNameNode = L"m:limUpp"; pXmlWrite->WriteNodeBegin(L"m:func",false); CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:fName",false); - if(m_pValueFrom == nullptr && m_pValueTo == nullptr) - CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute(),GetName()); - else + if(m_pValueFrom != nullptr && m_pValueTo == nullptr) + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName); + else if(m_pValueTo != nullptr && m_pValueFrom == nullptr) + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limUpp",m_pValueTo,m_enTypeOperator,GetAttribute(),m_wsName); + else if(m_pValueFrom != nullptr && m_pValueTo != nullptr) { - pXmlWrite->WriteNodeBegin(wsTempNameNode,false); - pXmlWrite->WriteNodeBegin(wsTempNameNode+L"Pr",false); + pXmlWrite->WriteNodeBegin(L"m:limUpp",false); + pXmlWrite->WriteNodeBegin(L"m:limUppPr",false); CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr); - pXmlWrite->WriteNodeEnd(wsTempNameNode+L"Pr",false,false); + pXmlWrite->WriteNodeEnd(L"m:limUppPr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); - CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute(),GetName()); + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName); pXmlWrite->WriteNodeEnd(L"m:e",false,false); - pXmlWrite->WriteNodeBegin(L"m:lim",false); - if(wsTempNameNode == L"m:limLow") - m_pValueFrom->ConversionToOOXML(pXmlWrite); - else if(wsTempNameNode == L"m:limUpp") - m_pValueTo->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:lim",false,false); - pXmlWrite->WriteNodeEnd(wsTempNameNode,false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pValueTo,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:limUpp",false,false); } + else if(m_pValueFrom == nullptr && m_pValueTo == nullptr) + CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute(),GetName()); pXmlWrite->WriteNodeEnd(L"m:fName",false,false); - pXmlWrite->WriteNodeBegin(L"m:e",false); - m_pValueOperator->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueOperator,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:func",false,false); } else @@ -2126,14 +2144,14 @@ namespace StarMath if(m_pValueFrom == nullptr) pXmlWrite->WriteNode(L"m:sub",L""); else { - CConversionSMtoOOXML::BlockRecording(L"m:sub",m_pValueFrom,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueFrom,pXmlWrite); } if(m_pValueTo == nullptr) pXmlWrite->WriteNode(L"m:sup",L""); else { - CConversionSMtoOOXML::BlockRecording(L"m:sup",m_pValueTo,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueTo,pXmlWrite); } - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pValueOperator,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueOperator,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:nary",false,false); } } @@ -2277,7 +2295,7 @@ namespace StarMath m_enGlobalType = TypeElement::String; return; } - if(m_enUnderType == TypeElement::undefine) + if(m_enUnderType == TypeElement::undefine && !m_wsToken.empty()) { m_enGlobalType = TypeElement::String; return; @@ -2327,8 +2345,8 @@ namespace StarMath m_pBaseAttribute->SetItal(); if(pAttribute->base_font_bold) m_pBaseAttribute->SetBold(); - // if(!pAttribute.base_font_name.empty()) - // m_pBaseAttribute->SetFont(); + if(!pAttribute->base_font_name.empty()) + m_pBaseAttribute->SetFontName(pAttribute->base_font_name); if(pAttribute->base_font_size != 0) m_pBaseAttribute->SetSize(pAttribute->base_font_size); // if(pAttribute.base_alignment != 0) @@ -2409,6 +2427,14 @@ namespace StarMath } ClearReader(); } + void CStarMathReader::ReadingTheNextToken() + { + if(m_wsToken.empty()) + { + GetToken(); + SetTypesToken(); + } + } bool CStarMathReader::CheckTokenForGetElement(const wchar_t &cToken) { switch(cToken) @@ -2505,10 +2531,10 @@ namespace StarMath switch(m_enTypeBracketWithIndex) { case TypeElement::overbrace: - m_pLeftArg->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); break; case TypeElement::underbrace: - m_pValue->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); break; default: break; @@ -2520,10 +2546,10 @@ namespace StarMath switch(m_enTypeBracketWithIndex) { case TypeElement::overbrace: - m_pValue->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); break; case TypeElement::underbrace: - m_pLeftArg->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); break; default: break; @@ -2571,14 +2597,12 @@ namespace StarMath void CElementGrade::Parse(CStarMathReader *pReader) { SetValueGrade(CParserStarMathString::ParseElement(pReader)); - pReader->GetToken(); - pReader->SetTypesToken(); + pReader->ReadingTheNextToken(); if(pReader->GetLocalType() == TypeElement::from) { pReader->ClearReader(); SetValueFrom(CParserStarMathString::ParseElement(pReader)); - pReader->GetToken(); - pReader->SetTypesToken(); + pReader->ReadingTheNextToken(); } if(pReader->GetLocalType() == TypeElement::to) { @@ -2620,15 +2644,11 @@ namespace StarMath pXmlWrite->WriteNodeEnd(L"m:e",false,false); if(m_pValueFrom != nullptr) { - pXmlWrite->WriteNodeBegin(L"m:sub",false); - m_pValueFrom->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:sub",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueFrom,pXmlWrite); } if(m_pValueTo != nullptr) { - pXmlWrite->WriteNodeBegin(L"m:sup",false); - m_pValueTo->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:sup",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueTo,pXmlWrite); } pXmlWrite->WriteNodeEnd(wsNodeGrade,false,false); } @@ -2702,9 +2722,7 @@ namespace StarMath { if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol && pOneElement->GetBaseType()!= TypeElement::undefine) { - pXmlWrite->WriteNodeBegin(L"m:e",false); - pOneElement->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); } else if(pOneElement->GetBaseType() == TypeElement::SpecialSymbol) { @@ -2716,7 +2734,7 @@ namespace StarMath } } else if(pOneElement->GetBaseType() != TypeElement::undefine) - pOneElement->ConversionToOOXML(pXmlWrite); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,pOneElement); } break; } @@ -2728,9 +2746,7 @@ namespace StarMath { if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol) { - pXmlWrite->WriteNodeBegin(L"m:e",false); - pOneElement->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:mr",false,false); pXmlWrite->WriteNodeBegin(L"m:mr",false); } @@ -2739,10 +2755,10 @@ namespace StarMath } case TypeElement::binom: { - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pFirstArgument,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pFirstArgument,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:mr",false,false); pXmlWrite->WriteNodeBegin(L"m:mr",false); - CConversionSMtoOOXML::BlockRecording(L"m:e",m_pSecondArgument,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pSecondArgument,pXmlWrite); break; } } @@ -2795,7 +2811,6 @@ namespace StarMath } void CElementDiacriticalMark::Parse(CStarMathReader *pReader) { - //pReader->SetAttribute(GetAttribute()); SetValueMark(CParserStarMathString::ParseElement(pReader)); } void CElementDiacriticalMark::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) @@ -2876,9 +2891,7 @@ namespace StarMath } CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeEnd(L"m:accPr",false,false); - pXmlWrite->WriteNodeBegin(L"m:e",false); - m_pValueMark->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueMark,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:acc",false,false); } void CElementDiacriticalMark::SetAttribute(CAttribute *pAttribute) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 8ae4b0a98c..1e5d2c77bf 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -47,7 +47,7 @@ namespace StarMath struct TBaseAttribute { int base_font_size = 12; - std::wstring base_font_name; + std::wstring base_font_name = L"Arial"; int base_alignment = 1; bool base_font_bold = false; bool base_font_italic = false; @@ -66,6 +66,7 @@ namespace StarMath bool GetStrike(); unsigned int GetSize(); std::wstring GetColor(); + const std::wstring& GetFontName(); bool EmptyColor(); void ParseFontAttribute(const TypeElement& enTypeFont,CStarMathReader* pReader); void ParseColorAttribute(const std::wstring& wsToken,CStarMathReader* pReader); @@ -77,6 +78,7 @@ namespace StarMath void SetColor(const TypeElement& enColor); void SetColor(const std::wstring& wsColor); void SetFont(const TypeElement& enFont); + void SetFontName(const std::wstring& wsNameFont); private: std::wstring m_wsColor; bool m_bBold; @@ -111,6 +113,7 @@ namespace StarMath std::wstring GetElement(); void FindingTheEndOfParentheses(); void IteratorNullification(); + void ReadingTheNextToken(); private: bool CheckTokenForGetElement(const wchar_t& cToken); bool CheckIsalhpaForGetElement(const wchar_t& cToken,const wchar_t& cLastToken); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index 2de2182bc0..7e24ced39f 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -46,7 +46,6 @@ enum class TypeElement{ BracketWithIndex, Grade, Mark, - //BracketEnd, UnarSign, Attribute, SpecialSymbol, @@ -306,6 +305,7 @@ enum class TypeElement{ dotsup, dotsdown, dotslow, + newline, //function abs, fact, From 8a655f860035789c87e00d995569f4031ec83508 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Tue, 6 Feb 2024 11:17:47 +0300 Subject: [PATCH 020/117] deleting a file entry --- .../Converter/StarMath2OOXML/cconversionsmtoooxml.cpp | 4 ---- OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 4c16e63b6c..4257d35836 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -48,10 +48,6 @@ namespace StarMath { oTempElement->ConversionToOOXML(m_pXmlWrite); } EndConversion(); - NSFile::CFileBinary oFile; - oFile.CreateFileW(L"Test.txt"); - oFile.WriteStringUTF8(m_pXmlWrite->GetXmlString()); - oFile.CloseFile(); } void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 786a4639a2..24d8f13288 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -415,11 +415,11 @@ namespace StarMath { pReader->GetToken(); if(pReader->GetString() == L"sans") - m_wsNameFont = L"Arial"; + m_wsNameFont = L"Liberation Sans"; else if(pReader->GetString() == L"serif") - m_wsNameFont = L"Times New Roman"; + m_wsNameFont = L"Liberation Serif"; else if(pReader->GetString() == L"fixed") - m_wsNameFont = L"Times New Roman"; + m_wsNameFont = L"Liberation Mono"; else m_wsNameFont = pReader->GetString(); break; From 835f4ba89db4bf52993519a88948923821db17be Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 9 Feb 2024 11:20:24 +0300 Subject: [PATCH 021/117] bug fixing --- .../Converter/StarMath2OOXML/.gitignore | 74 ++++++++++++ .../StarMath2OOXML/cstarmathpars.cpp | 107 ++++++++++-------- .../Converter/StarMath2OOXML/cstarmathpars.h | 2 +- 3 files changed, 133 insertions(+), 50 deletions(-) create mode 100644 OdfFile/Reader/Converter/StarMath2OOXML/.gitignore diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/.gitignore b/OdfFile/Reader/Converter/StarMath2OOXML/.gitignore new file mode 100644 index 0000000000..4a0b530afd --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/.gitignore @@ -0,0 +1,74 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +CMakeLists.txt.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 24d8f13288..c256c4e238 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -112,6 +112,12 @@ namespace StarMath T* pTempElement = dynamic_cast(pElementWhichAdd); if(pTempElement->GetLeftArg() == nullptr) { + if(pLeftArg->GetBaseType() == TypeElement::SpecialSymbol) + { + CElementSpecialSymbol* pSpecial = dynamic_cast(pLeftArg); + if(pSpecial->GetType() == TypeElement::newline) + return false; + } pTempElement->SetLeftArg(pLeftArg); pElementWhichAdd = pTempElement; return true; @@ -121,38 +127,41 @@ namespace StarMath bool CParserStarMathString::AddLeftArgument(CElement *pLeftArg, CElement *pElementWhichAdd) { - switch(pElementWhichAdd->GetBaseType()) + if(pElementWhichAdd!=nullptr) { - case TypeElement::BinOperator: + switch(pElementWhichAdd->GetBaseType()) { - return SetLeft(pLeftArg, pElementWhichAdd); + case TypeElement::BinOperator: + { + return SetLeft(pLeftArg, pElementWhichAdd); + } + case TypeElement::SetOperations: + { + SetLeft(pLeftArg, pElementWhichAdd); + break; + } + case TypeElement::Connection: + { + return SetLeft(pLeftArg,pElementWhichAdd); + } + case TypeElement::BracketWithIndex: + { + return SetLeft(pLeftArg,pElementWhichAdd); + } + case TypeElement::Index: + { + return SetLeft(pLeftArg,pElementWhichAdd); + } + default: + return false; } - case TypeElement::SetOperations: - { - SetLeft(pLeftArg, pElementWhichAdd); - break; - } - case TypeElement::Connection: - { - return SetLeft(pLeftArg,pElementWhichAdd); - } - case TypeElement::BracketWithIndex: - { - return SetLeft(pLeftArg,pElementWhichAdd); - } - case TypeElement::Index: - { - return SetLeft(pLeftArg,pElementWhichAdd); - } - default: - break; } + else return false; } CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader) { CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); - pReader->GetToken(); - pReader->SetTypesToken(); + pReader->ReadingTheNextToken(); while(CheckForLeftArgument(pReader->GetGlobalType()) && (pReader->GetLocalType() != TypeElement::frac || pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt)) { CElement* pSecondTempElement = CParserStarMathString::ParseElement(pReader); @@ -161,11 +170,7 @@ namespace StarMath CParserStarMathString::AddLeftArgument(pFirstTempElement,pSecondTempElement); } pFirstTempElement = pSecondTempElement; - if(pReader->EmptyString()) - { - pReader->GetToken(); - pReader->SetTypesToken(); - } + pReader->ReadingTheNextToken(); } return pFirstTempElement; } @@ -430,7 +435,6 @@ namespace StarMath } } -//нет phantom, rgb, 16 , гарнитуры и кегля TypeElement CAttribute::GetTypeColorAttribute(const std::wstring &wsToken) { if(L"color" == wsToken) return TypeElement::color; @@ -649,14 +653,14 @@ namespace StarMath { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - if((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) + while((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { - CElement* pBinOp = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); - SetRightArg(pBinOp); + CElement* pElementWithRightArgument = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTempElement,pElementWithRightArgument); + pTempElement = pElementWithRightArgument; + pReader->ReadingTheNextToken(); } - else - SetRightArg(pTempElement); + SetRightArg(pTempElement); } } void CElementBinOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) @@ -860,8 +864,13 @@ namespace StarMath pReader->FindingTheEndOfParentheses(); while(pReader->CheckIteratorPosition()) { + if(pReader->GetLocalType() == TypeElement::newline) + { + m_arBrecketValue.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); + pReader->ClearReader(); + } CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - if(!m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType())) + if(pTempElement!= nullptr &&( !m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType()))) { if(CParserStarMathString::AddLeftArgument(m_arBrecketValue.back(),pTempElement)) m_arBrecketValue.pop_back(); @@ -1403,13 +1412,14 @@ namespace StarMath { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - if((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) + while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { CElement* pElement = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTempElement,pElement); - SetRightArg(pElement); + pTempElement = pElement; + pReader->ReadingTheNextToken(); } - else SetRightArg(pTempElement); + SetRightArg(pTempElement); } void CElementSetOperations::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -1526,17 +1536,16 @@ namespace StarMath } void CElementConnection::Parse(CStarMathReader *pReader) { -// pReader->SetAttribute(GetAttribute()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - if((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt))) + while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt))) { -// pReader->SetAttribute(GetAttribute()); - CElement* pBinOp = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTempElement,pBinOp); - SetRightArg(pBinOp); + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTempElement,pElement); + pTempElement = pElement; + pReader->ReadingTheNextToken(); } - else SetRightArg(pTempElement); + SetRightArg(pTempElement); } void CElementConnection::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -1891,17 +1900,17 @@ namespace StarMath { CElement* pTemp = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - if(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) + while(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddLeftArgument(pTemp,pTempElement); pTemp = pTempElement; + pReader->ReadingTheNextToken(); } SetValueFunction(pTemp); } else SetValueFunction(nullptr); - //pReader->ClearReader(); } void CElementFunction::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 1e5d2c77bf..954c7e6c49 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -395,7 +395,7 @@ namespace StarMath static CElement* ParseElement(CStarMathReader* pReader); //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). static bool AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); - static bool CheckForLeftArgument(const TypeElement& enType); + static bool CheckForLeftArgument(const TypeElement& enType ); static CElement* ReadingWithoutBracket(CStarMathReader* pReader); private: std::vector m_arEquation; From a91500c4b732c8ba75570cf74ff1a7020b4cd06f Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 26 Feb 2024 21:10:22 +0600 Subject: [PATCH 022/117] Fix table conversion --- .../Logic/Biff_structures/StringPtgParser.cpp | 4 ++++ OOXML/XlsxFormat/Table/Tables.cpp | 16 +++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 1245cd1c0f..03918299b1 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -281,6 +281,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R unsigned int number; unsigned short ixti; PtgList ptgList(PtgList::fixed_id); + ptgList.type_ = 0x00; if(SyntaxPtg::extract_PtgBool(it, itEnd, operand_str)) { @@ -331,6 +332,9 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else if (SyntaxPtg::extract_PtgList(it, itEnd, ptgList))// Shall be placed strongly before PtgArea and PtgRef { + if((ptgList.rowType == 0x10 || ptgList.rowType == 0x08 || ptgList.rowType == 0x02) + && ptgList.columns == 0x01) + ptgList.type_ = 0x01; rgce.addPtg(found_operand = OperandPtgPtr(new PtgList(ptgList))); } else if(SyntaxPtg::extract_PtgArea(it, itEnd, operand_str)) // Sequence is important (in pair with PtgRef) diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index aaa15cc6ff..4d28e8cbfa 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -356,12 +356,14 @@ namespace Spreadsheet if(m_oCalculatedColumnFormula.IsInit()) { auto fmla(new XLSB::ListCCFmla); + fmla->fArray = false; fmla->formula = m_oCalculatedColumnFormula.get(); ptr->m_BrtListCCFmla = XLS::BaseObjectPtr{fmla}; } if(m_oTotalsRowFormula.IsInit()) { auto fmla(new XLSB::ListTrFmla); + fmla->fArray = false; fmla->formula = m_oTotalsRowFormula.get(); ptr->m_BrtListTrFmla = XLS::BaseObjectPtr{fmla}; } @@ -616,15 +618,17 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oTableColumns.IsInit() && !m_oTableColumns->m_arrItems.empty()) { XLS::GlobalWorkbookInfo::mapTableColumnNames_static.emplace(m_oId->GetValue(), - std::vector(m_oTableColumns->m_arrItems.size()+1, L"")); + std::vector(m_oTableColumns->m_arrItems.size())); + auto colInd = 0; for(auto i:m_oTableColumns->m_arrItems) - if(i->m_oName.IsInit() && i->m_oId.IsInit()) + { + if(i->m_oName.IsInit()) { - if(i->m_oId->GetValue()+1 > XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).size()) - XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).resize(i->m_oId->GetValue()+1); i->m_oName = boost::algorithm::erase_all_copy(i->m_oName.get(), L"_x000a_"); - XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).at(i->m_oId->GetValue()) = i->m_oName.get(); + XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).at(colInd) = i->m_oName.get(); } + colInd++; + } } XLS::GlobalWorkbookInfo::mapTableNames_static.emplace(m_oId->GetValue(), m_oName.get()); } @@ -768,6 +772,8 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oTotalsRowShown.IsInit()) ptr1->fShownTotalRow = m_oTotalsRowShown.get(); + else if(m_oTotalsRowCount.IsInit() && m_oTotalsRowCount->GetValue() > 0) + ptr1->fShownTotalRow = true; else ptr1->fShownTotalRow = false; ptr1->fSingleCell = false; From 4dc1751d8989ed3f4f3948d6ae2c98b50c0b4759 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 27 Feb 2024 18:42:33 +0600 Subject: [PATCH 023/117] Fix color conversion --- OOXML/XlsxFormat/Styles/Fills.cpp | 4 ++++ OOXML/XlsxFormat/Styles/rPr.cpp | 1 + 2 files changed, 5 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index 1d8f16f533..242ef9b09c 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -154,7 +154,11 @@ namespace OOX ptr->fls = 0x11; else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeGray0625) ptr->fls = 0x12; + else + ptr->fls = 0x00; } + else + ptr->fls = 0x00; if(m_oBgColor.IsInit()) ptr->brtColorBack = m_oBgColor->toColor(); diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 6c99fa3e12..8fe1bf5a5e 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -494,6 +494,7 @@ namespace OOX ptr.bBlue = m_oRgb->Get_B(); ptr.bGreen = m_oRgb->Get_G(); ptr.bRed = m_oRgb->Get_R(); + ptr.xColorType = 2; } From 0dd978c000e51a7aca90ea2232102215db0e6e76 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Thu, 29 Feb 2024 16:02:38 +0300 Subject: [PATCH 024/117] Exist folder check: Add white list for some folders --- DesktopEditor/common/Directory.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DesktopEditor/common/Directory.cpp b/DesktopEditor/common/Directory.cpp index 66442dbb01..c666396a1f 100644 --- a/DesktopEditor/common/Directory.cpp +++ b/DesktopEditor/common/Directory.cpp @@ -60,6 +60,10 @@ namespace NSDirectory #if !defined(_WIN32) && !defined (_WIN64) static bool is_directory_exist(char* dir) { +#ifdef __ANDROID__ + if (0 == strcmp("/storage/emulated", dir)) + return true; +#endif struct stat st; bool bRes = (0 == stat(dir, &st)) && S_ISDIR(st.st_mode); return bRes; From f5ee86c94e5ae1bf0ef7f745d5a6212e93f8ae1c Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Thu, 29 Feb 2024 19:44:28 +0300 Subject: [PATCH 025/117] Add tests for dictionaries --- Common/3dParty/hunspell/test/main.cpp | 131 +++++++++ .../3dParty/hunspell/test/src/az_Latn_AZ.txt | 213 ++++++++++++++ Common/3dParty/hunspell/test/src/bg_BG.txt | 212 ++++++++++++++ Common/3dParty/hunspell/test/src/ca_ES.txt | 112 ++++++++ .../hunspell/test/src/ca_ES_valencia.txt | 212 ++++++++++++++ Common/3dParty/hunspell/test/src/cs_CZ.txt | 206 ++++++++++++++ Common/3dParty/hunspell/test/src/da_DK.txt | 129 +++++++++ Common/3dParty/hunspell/test/src/de_AT.txt | 131 +++++++++ Common/3dParty/hunspell/test/src/de_CH.txt | 116 ++++++++ Common/3dParty/hunspell/test/src/de_DE.txt | 211 ++++++++++++++ Common/3dParty/hunspell/test/src/el_GR.txt | 123 ++++++++ Common/3dParty/hunspell/test/src/en_AU.txt | 116 ++++++++ Common/3dParty/hunspell/test/src/en_CA.txt | 125 +++++++++ Common/3dParty/hunspell/test/src/en_GB.txt | 122 ++++++++ Common/3dParty/hunspell/test/src/en_US.txt | 213 ++++++++++++++ Common/3dParty/hunspell/test/src/en_ZA.txt | 114 ++++++++ Common/3dParty/hunspell/test/src/es_ES.txt | 208 ++++++++++++++ Common/3dParty/hunspell/test/src/eu_ES.txt | 132 +++++++++ Common/3dParty/hunspell/test/src/fr_FR.txt | 211 ++++++++++++++ Common/3dParty/hunspell/test/src/gl_ES.txt | 120 ++++++++ Common/3dParty/hunspell/test/src/hr_HR.txt | 215 ++++++++++++++ Common/3dParty/hunspell/test/src/hu_HU.txt | 114 ++++++++ Common/3dParty/hunspell/test/src/id_ID.txt | 121 ++++++++ Common/3dParty/hunspell/test/src/it_IT.txt | 200 +++++++++++++ Common/3dParty/hunspell/test/src/kk_KZ.txt | 209 ++++++++++++++ Common/3dParty/hunspell/test/src/ko_KR.txt | 157 +++++++++++ Common/3dParty/hunspell/test/src/lb_LU.txt | 118 ++++++++ Common/3dParty/hunspell/test/src/lt_LT.txt | 127 +++++++++ Common/3dParty/hunspell/test/src/lv_LV.txt | 205 ++++++++++++++ Common/3dParty/hunspell/test/src/mn_MN.txt | 103 +++++++ Common/3dParty/hunspell/test/src/nb_NO.txt | 113 ++++++++ Common/3dParty/hunspell/test/src/nl_NL.txt | 115 ++++++++ Common/3dParty/hunspell/test/src/nn_NO.txt | 116 ++++++++ Common/3dParty/hunspell/test/src/oc_FR.txt | 108 ++++++++ Common/3dParty/hunspell/test/src/pl_PL.txt | 225 +++++++++++++++ Common/3dParty/hunspell/test/src/pt_BR.txt | 108 ++++++++ Common/3dParty/hunspell/test/src/pt_PT.txt | 135 +++++++++ Common/3dParty/hunspell/test/src/ro_RO.txt | 210 ++++++++++++++ Common/3dParty/hunspell/test/src/ru_RU.txt | 197 +++++++++++++ Common/3dParty/hunspell/test/src/sk_SK.txt | 205 ++++++++++++++ Common/3dParty/hunspell/test/src/sl_SI.txt | 210 ++++++++++++++ .../3dParty/hunspell/test/src/sr_Cyrl_RS.txt | 227 +++++++++++++++ .../3dParty/hunspell/test/src/sr_Latn_RS.txt | 173 ++++++++++++ Common/3dParty/hunspell/test/src/sv_SE.txt | 210 ++++++++++++++ Common/3dParty/hunspell/test/src/tr_TR.txt | 205 ++++++++++++++ Common/3dParty/hunspell/test/src/uk_UA.txt | 210 ++++++++++++++ .../3dParty/hunspell/test/src/uz_Cyrl_UZ.txt | 262 ++++++++++++++++++ .../3dParty/hunspell/test/src/uz_Latn_UZ.txt | 200 +++++++++++++ Common/3dParty/hunspell/test/src/vi_VN.txt | 128 +++++++++ Common/3dParty/hunspell/test/test.pro | 29 ++ 50 files changed, 8112 insertions(+) create mode 100644 Common/3dParty/hunspell/test/main.cpp create mode 100644 Common/3dParty/hunspell/test/src/az_Latn_AZ.txt create mode 100644 Common/3dParty/hunspell/test/src/bg_BG.txt create mode 100644 Common/3dParty/hunspell/test/src/ca_ES.txt create mode 100644 Common/3dParty/hunspell/test/src/ca_ES_valencia.txt create mode 100644 Common/3dParty/hunspell/test/src/cs_CZ.txt create mode 100644 Common/3dParty/hunspell/test/src/da_DK.txt create mode 100644 Common/3dParty/hunspell/test/src/de_AT.txt create mode 100644 Common/3dParty/hunspell/test/src/de_CH.txt create mode 100644 Common/3dParty/hunspell/test/src/de_DE.txt create mode 100644 Common/3dParty/hunspell/test/src/el_GR.txt create mode 100644 Common/3dParty/hunspell/test/src/en_AU.txt create mode 100644 Common/3dParty/hunspell/test/src/en_CA.txt create mode 100644 Common/3dParty/hunspell/test/src/en_GB.txt create mode 100644 Common/3dParty/hunspell/test/src/en_US.txt create mode 100644 Common/3dParty/hunspell/test/src/en_ZA.txt create mode 100644 Common/3dParty/hunspell/test/src/es_ES.txt create mode 100644 Common/3dParty/hunspell/test/src/eu_ES.txt create mode 100644 Common/3dParty/hunspell/test/src/fr_FR.txt create mode 100644 Common/3dParty/hunspell/test/src/gl_ES.txt create mode 100644 Common/3dParty/hunspell/test/src/hr_HR.txt create mode 100644 Common/3dParty/hunspell/test/src/hu_HU.txt create mode 100644 Common/3dParty/hunspell/test/src/id_ID.txt create mode 100644 Common/3dParty/hunspell/test/src/it_IT.txt create mode 100644 Common/3dParty/hunspell/test/src/kk_KZ.txt create mode 100644 Common/3dParty/hunspell/test/src/ko_KR.txt create mode 100644 Common/3dParty/hunspell/test/src/lb_LU.txt create mode 100644 Common/3dParty/hunspell/test/src/lt_LT.txt create mode 100644 Common/3dParty/hunspell/test/src/lv_LV.txt create mode 100644 Common/3dParty/hunspell/test/src/mn_MN.txt create mode 100644 Common/3dParty/hunspell/test/src/nb_NO.txt create mode 100644 Common/3dParty/hunspell/test/src/nl_NL.txt create mode 100644 Common/3dParty/hunspell/test/src/nn_NO.txt create mode 100644 Common/3dParty/hunspell/test/src/oc_FR.txt create mode 100644 Common/3dParty/hunspell/test/src/pl_PL.txt create mode 100644 Common/3dParty/hunspell/test/src/pt_BR.txt create mode 100644 Common/3dParty/hunspell/test/src/pt_PT.txt create mode 100644 Common/3dParty/hunspell/test/src/ro_RO.txt create mode 100644 Common/3dParty/hunspell/test/src/ru_RU.txt create mode 100644 Common/3dParty/hunspell/test/src/sk_SK.txt create mode 100644 Common/3dParty/hunspell/test/src/sl_SI.txt create mode 100644 Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt create mode 100644 Common/3dParty/hunspell/test/src/sr_Latn_RS.txt create mode 100644 Common/3dParty/hunspell/test/src/sv_SE.txt create mode 100644 Common/3dParty/hunspell/test/src/tr_TR.txt create mode 100644 Common/3dParty/hunspell/test/src/uk_UA.txt create mode 100644 Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt create mode 100644 Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt create mode 100644 Common/3dParty/hunspell/test/src/vi_VN.txt create mode 100644 Common/3dParty/hunspell/test/test.pro diff --git a/Common/3dParty/hunspell/test/main.cpp b/Common/3dParty/hunspell/test/main.cpp new file mode 100644 index 0000000000..6d9406c53e --- /dev/null +++ b/Common/3dParty/hunspell/test/main.cpp @@ -0,0 +1,131 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#include "../../../../Common/3dParty/hunspell/hunspell/src/hunspell/hunspell.h" +#include "../../../../DesktopEditor/common/StringExt.h" +#include "../../../../DesktopEditor/common/Directory.h" + +bool CheckCaret(std::vector& words) +{ + bool bIsCaret = false; + for (int i = 0, len = (int)words.size(); i < len; ++i) + { + if (words[i].find('\r') == (words[i].length() - 1)) + { + words[i] = words[i].substr(0, words[i].length() - 1); + bIsCaret = true; + } + } + return bIsCaret; +} + +std::wstring CheckWord(Hunhandle* pDic, const std::wstring& sWord, const bool& bIsCaret) +{ + std::wstring sResult = sWord; + + std::string sWordA = U_TO_UTF8(sWord); + int nSpellResult = Hunspell_spell(pDic, sWordA.c_str()); + + if (0 == nSpellResult) + { + char** pSuggest; + int nSuggestCount = Hunspell_suggest(pDic, &pSuggest, sWordA.c_str()); + + sResult += L" ["; + + for (int i = 0; i < nSuggestCount; ++i) + { + std::string sSuggestA(pSuggest[i], strlen(pSuggest[i])); + std::wstring sSuggest = UTF8_TO_U(sSuggestA); + + sResult += sSuggest; + if (i != (nSuggestCount - 1)) + sResult += (L", "); + } + + if (0 < nSuggestCount) + Hunspell_free_list(pDic, &pSuggest, nSuggestCount); + + sResult += L"]"; + } + + if (bIsCaret) + sResult += L"\r"; + sResult += L"\n"; + + return sResult; +} + +int main(int argc, char *argv[]) +{ + std::wstring sSrcDir = NSFile::GetProcessDirectory() + L"/../src"; + std::wstring sDstDir = NSFile::GetProcessDirectory() + L"/../dst"; + std::wstring sDictionariesDir = NSFile::GetProcessDirectory() + L"/../../../../../../dictionaries"; + std::vector arSrcFiles = NSDirectory::GetFiles(sSrcDir); + + for (int i = 0, len = (int)arSrcFiles.size(); i < len; ++i) + { + std::wstring sFileWords = arSrcFiles[i]; + std::wstring sName = NSFile::GetFileName(sFileWords); + std::wstring::size_type sNamePos = sName.find(L"."); + if (std::wstring::npos != sNamePos) + sName = sName.substr(0, sNamePos); + + std::wstring sFileWordsContent = L""; + NSFile::CFileBinary::ReadAllTextUtf8(sFileWords, sFileWordsContent); + + std::vector arWords = NSStringExt::Split(sFileWordsContent, '\n'); + bool bIsCaret = CheckCaret(arWords); + + std::wstring sAff = sDictionariesDir + L"/" + sName + L"/" + sName + L".aff"; + std::wstring sDic = sDictionariesDir + L"/" + sName + L"/" + sName + L".dic"; + + std::string sAffA = U_TO_UTF8(sAff); + std::string sDicA = U_TO_UTF8(sDic); + + Hunhandle* pDictionary = Hunspell_create(sAffA.c_str(), sDicA.c_str()); + + std::wstring sFileDst = sDstDir + L"/" + sName + L".txt"; + + std::wstring sResult = L""; + for (const std::wstring& word : arWords) + { + sResult += CheckWord(pDictionary, word, bIsCaret); + } + + Hunspell_destroy(pDictionary); + + NSFile::CFileBinary::SaveToFile(sFileDst, sResult, true); + } + + return 0; +} diff --git a/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt b/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt new file mode 100644 index 0000000000..4d97adce04 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt @@ -0,0 +1,213 @@ +A +qocalmaq +Alderaan'ın +hamısı +həmçinin +Və +cavab +dir +incəsənət +kimi +da +uzaq +körpə +zirzəmi +ol +olub +doğuldu +bulvar +fasilə +nəsllər +gəlin +lakin +al +ilə +Kaliforniya +Kalifornikasiya +bilər +kartlar +şans +Çin +çənə +klublar +Cobain +bürc +nəzarət +qiymət +edə bilməzdim +yaratmaq +lənət +rəqs +saziş +sövdələşmələr +dağıdıcı +almazlar +etməz +etməyərik +arzu +xülyalar +Şərq +kənar +kənarları +məmnunluq +hamının +uzaq +peri +solğun +üz +son +tap +ilk +üçün +-dan +sərhəd +qız +qızın +yaxşı +gitara +əl +hardcore +var +yoxdur +o +eşitmək +ürək +O'nun +ona +gizli +yüksək +ona +onun +Hollivud +Mən +Mənəm +əgər +içində +məlumat +içində +dir +bu +jack +sadəcə +kral +qohum +bilmək +qoyulmuş +qanun +yerləşdirilmək +qurğuşun +aparmaq +yerləşdirilmə +məkan +sevmək +şans +edilmiş +adam +çox +Evlənmək +maska +o bilər +bəlkə də +mənası +mən +meditasiya +xatirə +ağılın +pul +mənim +heç vaxt +deyil +heç nə +nömrələr +of +of +üstündə +bir +yalnız +və ya +nəticə +öz +Ödə +Şəftəli +yerlər +oynayır +oynamaq +əhali +porno +tərifləmək +ehtimal ki +ehtimal +psixik +kraliça +qaldırmaq +qalan +hörmət +qalxmaq +yol +xam +müqəddəs +Xilas et +elmi +çığırmaq +satılır +şəkil +xəstələnmək +gümüşçü +dəri +əsgər +bir şey +Mahnı +mahnılar +qılınclar +büyü +casuslar +ulduz +Stansiya +oğurlamaq +daşlar +günəş +şübhəli +İsveç +qılınclar +yeniyetmə +test +dandan +bu ki +bu ki +bu +onların +bu +onlar +düşünmək +bu +onlar +gel-git +üçün +deyilmişəm +çox +cəhd et +başa düşdüm +qilin +titrəmək +mübarizə aparır? +istəyirəm +müharibə +idi +dalğalar +geymək +silahlar +yaxşı +idarə olunan +Qərbi +nə +arasında +qalib gəlmək +qalib gəlir +ilə +qadın +dünya +səhv +siz +sizə +sənsən +sənin diff --git a/Common/3dParty/hunspell/test/src/bg_BG.txt b/Common/3dParty/hunspell/test/src/bg_BG.txt new file mode 100644 index 0000000000..a09b554067 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/bg_BG.txt @@ -0,0 +1,212 @@ +A +остаряване +Алдераан +всичко +също +и +отговор +са +изкуство +като +в +далеч +бебе +мазе +бъда +било +роден +булевард +почивка +породи +невеста +но +купувам +от +Калифорния +Калифорникация +може +карти +шанс +Китай +брадичка +клубове +Кобейн +съзвездие +контрол +цена +не можех +създаване +проклятие +танц +сделка +сделки +унищожение +диаманти +не прави +не правим +мечта +мечти +Изток +ръб +ръбове +екстаз +всеки +далеч +приказка +избледнява +лица +краен +намирам +първи +за +от +предел +момиче +момичето +добре +китара +ръка +хардкор +има +няма +той +чуя +сърце +той е +нейни +скрит +висок +него +негов +Холивуд +аз +аз съм +ако +в +информация +вътре +е +това е +вале +просто +крал +родственик +знам +определен +закон +поставям +водя +води +местоположение +обичам +късмет +направен +човек +много +Ожени се +маска +май +може би +означава +аз +медитация +спомен +ума +пари +моя +никога +не +нищо +числа +от +изключен +на +един +само +или +изход +свой +Плати +праскова +места +играе +играя +население +порно +похвала +вероятно +вероятен +психичен +кралица +въздигам +останал +почит +възход +път +груб +светия +Спасявам +наука +крясък +продава +форма +по-болен +златар +кожа +войник +някаква +Песен +песни +пикове +заклинание +шпиони +звезда +стация +крада +камъни +слънце +подозрителен +Швеция +мечове +тийнейджър +тест +отколкото +това +това е +на +техни +тези +те с +мисли +този +той +прилив +до +каза +също +опитайте +разбрано +еднорог +вибрация +водене? +искам +война +беше +вълни +носете +оръжия +Ами +бяха +Западна +какво +докато +победа +победи +със +жена +свят +грешка +ти +ти би +ти си +вашият diff --git a/Common/3dParty/hunspell/test/src/ca_ES.txt b/Common/3dParty/hunspell/test/src/ca_ES.txt new file mode 100644 index 0000000000..3fd8739062 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ca_ES.txt @@ -0,0 +1,112 @@ +amor +llum +lluum +esperança +espirança +llibertat +força +forrça +pau +somni +llibre +mar +amistat +cançó +flor +cel +estrella +temps +camí +vent +muntanya +mumntanya +riu +soroll +silenci +viatge +foc +gel +paraula +vida +dia +nit +tarda +matí +lluna +sol +llac +marbre +ferro +sal +mel +sucre +peix +ocell +oceoll +joc +ritme +melodia +pintura +pentura +teatre +dansa +poema +història +llegenda +mitologia +festa +música +vi +cervesa +cervessa +formatge +pa +ciutat +poble +natura +camp +bosc +platja +sorra +sorrà +pedra +ànima +cos +ment +cor +somriure +somriàre +abraçada +bes +parla +oida +vista +tacte +gust +olfacte +color +forma +número +lletra +sistema +regla +escola +universitat +univversitat +mestre +estudiant +sabiduria +lliçó +pregunta +resposta +risposta +dubte +certesa +veritat +mentida +promesa +secret +descoberta +descaberta +aventura +destinació \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt b/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt new file mode 100644 index 0000000000..8b31af1a39 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt @@ -0,0 +1,212 @@ +A +envellir +Alderaan +tot +també +I +resposta +és +art +com +a +lluny +nadó +celler +ser +ha estat +nat +bulevard +pausa +generacions +núvia +però +comprar +amb +Califòrnia +Californication +pot +cartes +oportunitat +Xina +mentó +clubs +Cobain +signe del zodíac +control +preu +no podria +crear +maleït +ballar +acord +negocis +destructiu +diamants +no fer +no fem +desitjar +somnis +Est +vora +voreres +satisfacció +tots +llunyà +fada +pallid +cara +final +trobar +primer +per +de +frontera +noia +la noia +bé +guitarra +mà +hardcore +hi ha +no hi ha +ell +sentir +cor +ell és +seva +secret +alt +ell +seu +Hollywood +jo +sóc +si +en +informació +interior +és +és +jack +només +rei +parent +saber +fixat +llei +col·locar +plom +portar +col·locació +lloc +estimar +oportunitat +fet +home +molts +casar-se +màscara +podria +potser +sentit +jo +meditació +memòria +ment +diners +meu +mai +no +res +números +de +fora +sobre +un +només +o +resultat +seu +pagar +préssec +llocs +jugar +joc +població +porno +elogiar +probablement +probable +psíquic +reina +elevar +restant +respecte +pujar +camí +cru +sant +salvar +ciència +crit +vendre’s +figura +malalt +joier +pell +soldat +alguna cosa +cançó +cançons +cims +encanteri +espies +estrella +estació +robar +pedres +sol +sospitós +Suècia +espases +adolescent +prova +que +que +això +seu +aqueixos +ells +pensar +aqueix +ells +marees +per +no he estat +molt +intentar +entendre +fer +tremolar +lluitar +desitjar +guerra +va ser +ones +portar +armes +bé +administrat +Oest +què +entre +guanyar +guanya +amb +dona +món +equivocat +tu +vostè +tu ets +teu diff --git a/Common/3dParty/hunspell/test/src/cs_CZ.txt b/Common/3dParty/hunspell/test/src/cs_CZ.txt new file mode 100644 index 0000000000..a76fe6803e --- /dev/null +++ b/Common/3dParty/hunspell/test/src/cs_CZ.txt @@ -0,0 +1,206 @@ +pomaliý +šťstný +smuutný +horcký +studiený +záludnast +náhodillost +úpěnlevý +rozspačitý +svéhllavý +jablko +slunce +voda +dům +pták +káva +chleba +květina +kniha +pes +kočka +město +zelený +modrý +červený +bílý +černý +velký +malý +rychlý +pomalý +šťastný +smutný +horký +studený +nový +starý +hezký +ošklivý +dobrý +špatný +zdravý +nemocný +silný +slabý +chytrý +hloupý +pracovat +jíst +pít +spát +číst +psát +mluvit +smát se +plakat +zpívat +hrát +tančit +učit se +nakupovat +vařit +telefonovat +dívat se +poslouchat +chodit +běžet +létat +plavat +psát +učit se +dělat +mít +být +jít +přijít +odejít +dát +vzít +říct +vidět +slyšet +cítit +myslet +chtít +moct +muset +rád +nerad +ano +ne +prosím +děkuji +na shledanou +omlouvám se +sbohem +ahoj +čau +hej +jo +fakt +super +blbost +paráda +no jo +jasně +takže +vlastně +třeba +snad +leštěnka +pochmurný +živelný +ponaučení +záhada +pochybnost +nádhera +soucit +záludnost +náhodilost +úpěnlivý +rozpačitý +svéhlavý +marnivost +blahodar +rozčarování +odchylka +přelud +vytrvalost +neústupnost +lehkost +souznění +rozmarnost +roztržitost +úskočnost +rozkoš +marasmus +rozpolcenost +neúprosnost +ztřeštěnost +chmurnost +okouzlení +zářivost +vyrovnanost +neochvějnost +neúcta +bizarnost +rozmařilost +nepochopení +nevýslovný +pomíjivost +beznaděj +úzkost +odtažitost +rozerv +rozervanost +vyčerpanost +bezcitnost +záludnost +nezdolnost +rozkošátnost +nezdolatelnost +rozmarnost +živelnost +bezútěšnost +záhadnost +neposkvrnitelnost +rozkošnělost +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +ztracenost +bezbřehost +rozervanost +opojení +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +ztracenost +bezbřehost +opojení +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +bezbřehost \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/da_DK.txt b/Common/3dParty/hunspell/test/src/da_DK.txt new file mode 100644 index 0000000000..1581a61660 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/da_DK.txt @@ -0,0 +1,129 @@ +Hej +Goddag +Tak +Ja +Nej +Måske +Mad +Vand +Hus +Bil +Tog +Cykel +Skole +Børn +Far +Mor +Søster +Bror +Hund +Kat +Fisk +Fugl +Træ +Blomst +Græs +Sol +Måne +Himmel +Regn +Sne +Sommer +Vinter +Forår +Efterår +Aften +Nat +Dag +Uge +Måned +År +Læse +Skrive +Tale +Lære +Arbejde +Sove +Vågne +Løbe +Gå +Sidde +Stå +Lytte +Se +Høre +Spise +Drikke +Kød +Frugt +Grøntsager +Ost +Brød +Vand +Juice +Kaffe +Te +Mælk +Smør +Æg +Salt +Peber +Sukker +Bolle +Smørrebrød +Køkken +Stue +Soveværelse +Badeværelse +Toilet +Bord +Stol +Sofa +Lampe +Vindue +Dør +Gulv +Loft +Væg +Sofa +Pude +Tæppe +Badekar +Håndvask +Spejl +Håndklæde +Seng +Dyne +Dynee +Pude +Pudee +Alarm +Alarmm +Skrivebord +Stol +Hus +Hund +Kat +Katt +Bil +Skole +Skolee +Sol +Soll +Vand +Vandd +Mad +Madd +By +Barn +Barnn +Tørklæde +Skæbne +Uafhængighed +Kærlighed +Kærligheed +overbelastning +Modstandsbevægelsen +Uafhængighedserklæringen +Forårssommertemperaturen +Stabiliseringsperioden diff --git a/Common/3dParty/hunspell/test/src/de_AT.txt b/Common/3dParty/hunspell/test/src/de_AT.txt new file mode 100644 index 0000000000..fccb06c431 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/de_AT.txt @@ -0,0 +1,131 @@ +Ägyptologie +Ährenamt +Ängstlichkeit +Äquatoria +Abarbeiten +Abbild +Abbilden +Abbildungs +Abbreviatur +Abbrüche +Abfassen +Abfertigen +Abfolge +Abfuhr +Ableugnen +Ablichten +Ablöse +Absätze +Abschnitts +Abwechseln +Abwehren +Aktiv +Britannia +Browserfenster +Budgetieren +Bugpartie +Bukarester +Burgundersoße +Butterkrem +Button +Cabriolet +Campanile +Canapé +Caprice +Celsius +Chamäleon +Charakteristik +Chronometer +Chronometrie +Cölln +Connectzustände +Cursorspur +Däne +Dachs +Dahindämmern +Darbringen +Daten +Datenbankserver +Desktopsystem +Detektivfilm +Dichtertum +Dinosaurier +Direktion +Diskantgambe +Diskothek +Druckereicode +Kapsel +Karausche +Katzen +Klinge +Klinke +Kohlrabi +Koinzidenz +Kolleg +Komplott +Meereis +Mehrphasigkeit +Memorieren +Messen +Methode +Metrowaggon +Meute +Migräne +Milieuforschung +Mindern +Mineralien +Mitternacht +Mobiliar +Mohrrübe +Mühelosigkeit +Normativität +Notifikation +Ökonomie +Orangeton +Osten +Subjekt +Subsidiarität +Subsumieren +Tagfalter +Speicher +Spielzeugsammlung +Zahler + +Сложные слова +Zurückgezogenheit +Äquipotentialfläche +Äußerungsbedeutung +Abfassungszeitraum +Abgeschlossenheits +Adjunktionsbeseitigung +Anknüpfungsgrundsätze +Chiffrierschlüssel +Knochenmarktransplantation +Bundeskaderathlet +Carbonsäurechlorid +Cardiazoltherapie +Chancenungleichheit +Charakterisierungsmöglichkeit +Chlorophyllkonzentration +Computerspielemarkt +Deindustrialisieren +Dekodierungsmöglichkeit +Kartoffelschälmesser +Kernspinresonanztomographie +Merkmalskombination +Nachbarschaftszentren +Opportunitätsprinzip +Tiefenstaffelung +Tourismusfachmann +Sequenzbetrachtung + +Слова с ошибками +Dechifrierprogramm +Administratorkenwort +Spigeln +Tätigkeite +Draufgangertum +Abschnit +Komunikation +Drackereicode +Bumeln \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/de_CH.txt b/Common/3dParty/hunspell/test/src/de_CH.txt new file mode 100644 index 0000000000..12c4663080 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/de_CH.txt @@ -0,0 +1,116 @@ +Alpinist +Alteration +Alternative +Alumne +Amateurfilmer +Ambulanz +Amtmänner +Analogie +Analytik +Ananas +Angabe +Ankünfte +Dynastie +Ebenbürtigkeit +Echtheitszertifikat +Editionspläne +Editor +Ehrenamtlichkeit +Eigentümerschaft +Einbau +Eindringling +Eingabequittungsbetrieb +Einhüllen +Einkommen +Einloggen +Einschließen +Einsortier +Elaboration +Elementar +Entertainer +Entkuppeln +Entschädigungs +Enumerator +Erbringen +Erdichten +Erfahrenheit +Erhalt +Erleichtern +Ersparnis +Erstatten +Erzählliteratur +Helikopter +Helpdesk +Herunterladen +Hindeuten +Hinterlassenschaft +Hiob +Landesprache +flexibilität +floristisch +flugbillet +heroben +herrichten +herstellen +herübereilen +herunterzubücken +hie +hieraus +hilfe +himbeere +justiz +kältebeständig +kärtchen +känguru +kaktusgewächs +kalligrafie +kamel +kampagnendirektor +kapazitär +kapitalist +karamell +kardieren +karpfen +katalogdaten +lyzeum +mahagonirot +makkaroni +malerausbildung +management +mangel +maniküre +manneskraft +mansarde +mark +marketingpraktiker +maschinell +massage +massengutschifffahrt +materie +medaille +medizinalshampoo +meeresfrüchte +quotient +salonwagen +satzeinleitend +trilateral +tristesse +tropen +vereisen +verfahren +verfügungs +verhindern +verkäufer + +Слова с ошибками +Anbindungsystem +Anglistikdocent +Ecco +Economclass +Einverstandnis +Electrik +Historique +herüberzurucken +kartofel +salade +sanddornbere \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/de_DE.txt b/Common/3dParty/hunspell/test/src/de_DE.txt new file mode 100644 index 0000000000..3ab503f810 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/de_DE.txt @@ -0,0 +1,211 @@ +Hallo +Guten Morgen +Danke +Bitte +Ja +Nein +Entschuldigung +Tschüss +Liebe +Freund +Familie +Glück +Gesundheit +Schule +Arbeit +Essen +Trinken +Wasser +Brot +Käse +Fleisch +Gemüse +Obst +Kaffee +Tee +Milch +Zucker +Salz +Pfeffer +Haus +Wohnung +Bett +Stuhl +Tisch +Sofa +Fernseher +Telefon +Computer +Buch +Zeitung +Schreiben +Lesen +Hören +Sehen +Fühlen +Laufen +Springen +Schwimmen +Tanzen +Singen +Lachen +Weinen +Freude +Trauer +Angst +Mut +Liebe +Hass +Freundschaft +Beziehung +Familie +Eltern +Kinder +Geschwister +Großeltern +Onkel +Tante +Cousin +Cousine +Ehemann +Ehefrau +Verlobung +Hochzeit +Scheidung +Geburt +Tod +Krankheit +Arzt +Krankenhaus +Medikament +Apotheke +Gesundheit +Wohlbefinden +Fitness +Diät +Schlaf +Ruhe +Entspannung +Sport +Fußball +Tennis +Schwimmen +Laufen +Radfahren +Wandern +Reisen +Urlaub +Strand +Sonne +Meer +Komplementär +Perspektive +Konsens +Integrität +Konsequenz +Authentizität +Korrelation +Charakteristik +Akzeptanz +Flexibilität +Assoziation +Dekomposition +Komplexität +Positivismus +Universalität +Stabilität +Individualität +Konsistenz +Konformität +Dezentralisierung +Kollaboration +Partizipation +Präzision +Transformation +Konkurrenz +Paradoxie +Redundanz +Regeneration +Integration +Isolation +Asymmetrie +Aggregation +Disziplin +Resilienz +Relevanz +Konfusion +Komplikation +Koordination +Harmonie +Ineffizienz +Konstruktion +Konversion +Kollusion +Gerontologie +Differenzierung +Dimensionalität +Inferenz +Fluktuation +Kontraktion +Rezession +Inflation +Dekontamination +Exzellenz +Innovation +Isomorphie +Konnotation +Insuffizienz +Konversion +Kompensation +Koalition +Inkongruenz +Inkontinenz +Kontrahent +Konfiskation +Konjunktur +Aggression +Konfrontation +Kompatibilität +Prognose +Akzeleration +Konstruktion +Diversifikation +Prävention +Sanktion +Indikation +Reduktion +Konkurrenz +Konfiguration +Konnotation +Rezession +Transformation +Interaktion +Kooperation +Innovation +Kollision +Proklamation +Konnotation +Konfrontation +Disposition +Konkordanz +Deklamation +Kollaboration +Isolation +Inflation +Diversifikation +Konnotation +Kompensation +Diffusion +Dekadenz +Konserve +Deklomotion +Kolaboration +Isollation +Infllation +Divirsifikation +Konotation +Kompenssation +Difusion +Dekadens +Kanzerve + diff --git a/Common/3dParty/hunspell/test/src/el_GR.txt b/Common/3dParty/hunspell/test/src/el_GR.txt new file mode 100644 index 0000000000..badd16854f --- /dev/null +++ b/Common/3dParty/hunspell/test/src/el_GR.txt @@ -0,0 +1,123 @@ +Αβαντάζ +Αβασταγά +Αβγάτισες +αβέβαιο +αβέλτερο +αβέλτεροι +αβίαστους +άβλαβοι +αβοκάντο +αβράδιαστης +άβραστη +αβράχυντου +άβρεχτα +αβρή +αβρότης +άβυσσον +αγαθόν +αγαθούς +αγάλακτο +αγγούρι +αγελαδινού +αγέρα +αγεωμέτρητων +αγίνωτοι +άγκυρες +αγορεύσεις +αγόρευσή +αγορίνα +Αγοριού +Αγροληψία +Αρμόνια +βγαίνοντας +βεβαιώσεων +διάθεση +διαίρεση +Διαιρέσου +Διαιτολογίου +διαψεύσουν +διδασκάλισσας +ενασκήσεις +ενασχόληση +ενασχόλησή +ενδείξεις +ενδεχόμενον +ενδιαμέσου +Επιστήθιες +Επιστημο +Επιστολές +Επιστολή +εύπορους +ευρέα +ευρημάτων +ευρύτητά +ευσταθών +εύστροφα +ευσυνειδησία +εύτακτε +ευτελείς +ευτελίζουν +ιδρυτικό +ιεροψάλτες +Ιζόλα +Ιθαγένειάς +ικανότατος +ιλαρότης +κεφαλής +κεφαλιάτικες +κεφαλωτές +κήπε +κήπευση +Κήρυξής +Λεξικογραφιών +Λεξιλογικός +λεοντή +λεοντής +ολιγοχρόνιου +ολικέ +ολικές +ολική +πελαγώνω +πελατών +πελάων +προστατεύει +προστασίας +σούρουπου +σουρούπωμα +σούρτης +Σούρωνα +Σπαγέτα +Σφάλμα +Σφάλματά +σφικτά +σφικτέ +σφοδρότητας +σφοδρού +σφραγίσω +σχεδιάζουμε +σχεδιάζουν +σχηματίσου +σχηματίσουμε +σχολιάζεσαι +Σχολιάζεστε +Ενδιαφέροντα + +Слова с ошибками +Αβασiλευτου +αγαπούσαv +βeβαιωμένοι +εvασxόλησης +επιoτολικέ +ιδιωτικοποιήσειc +λεπταίσθnτη +πρoστιμάρισμα +σφάλμαtα +προστάτεuε +κεxριμπαριού +διαισθnτικότητες +αγκιστpώσουv +αγαθoεργiας +αβεβαιoτητά +αγέρεc +διδαxθούμε +εuσταθειώv \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_AU.txt b/Common/3dParty/hunspell/test/src/en_AU.txt new file mode 100644 index 0000000000..f9404bce0d --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_AU.txt @@ -0,0 +1,116 @@ +Acknowledge +acrophobia +adventurousness +aeronautics +algal +Alligator +allegation +alphabetise +Analogy +appropriable +assembly +attempt +Average +barbecue +bathtub +begun +belongingness +Better +binary +blackberry +boatswain +bow-tie +brambly +bright-eyed +bubble +Calender +cancellous +cantankerousness +carefree +categorized +cellular +chaos +cheerfulise +childlike +circumstance +close-mouthed +Cocoa +coherent +co-located +Colours +controversial +cottage +creditworthiness +cut-down +dedicated +deep-freeze +Definitive +Designs +digital +distensible +dollar +dyslexia +Egyptian +effectively +etiquette +excess +exotica +fairly +feedback +features +figure's +fjord +forty-seven +government +haematomata +helpless +homologous +implant +Indemnify +inexpert +interior +localises +loquaciousness +maelstrom +mechanizable +melodious +mezzo-soprano +mozzie +municipalisation +mystifier +Neoclassicism +newsletter +non-professional +officiation +orientalisation +palaeoanthropography +parrot +pickpocket +pioneer +cryptanalytic +simplifying +sommelier +spicy +steward +subcontinental +swimwear +Technical +trajectory +wholesomeness +Advantageously +interindustry +red-eye +sub-group + +Слова с ошибками +Acredited +agressive +appreciativiness +aritmetical +biosyntesized +lisense +paranoa +fotoelectronic +semi transparent +synonymus +wordprocessing \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_CA.txt b/Common/3dParty/hunspell/test/src/en_CA.txt new file mode 100644 index 0000000000..f3bf6608a7 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_CA.txt @@ -0,0 +1,125 @@ +admire +admittance +aggrandizement +Airmen +Albatross +amateur +angling +apparatus +Architecture +assessment +attempt's +awakening +backgrounder +Balance's +barometric +bashfulness +beautiful +belletristic +blatancy +bonbon +border +Bottom +bountifulness +breakpoints +bulkiness +businesslike +can't +cash +castle +Casual +cauliflower +celebrity +childish +chokecherry +choreographically +chronological +classification +clearheaded +coalesce +Coexistence +collaborative +coloured's +concentration +draconian +drainpipe +demonstrativeness +dependence +dependency +dream +duplication +epidemiological +equitable +Essence +Exemption +exonerate +fainthearted +falsification +ferromagnetic +flammable +fraternization +French +frontier +gadget +galleria +Gallery +gateaux +geocache +ginger +glace +glacier +globalization +hockey +holiday +housemate +intensifier +joystick +Language +leaseholder +non-breakable +northerly +o'clock +oeuvre +openhandedness +oscillation +outface +outlaw +overladen +package +palazzo +panama +Paragraphs +Parliament +particular +pasteurization +pathogen +perception +phenomena +philanthropically +physical +populations +repugnance +request +resplendence +retroactive +rigidity +schedule's +School +scintillation +sensibility +settlement +taxiway +bereft + +Слова с ошибками +acomplishment +anihilate +caprise +chambre +etnographically +horsmanship +innundation +lemongras +omelete +retorical +shepishness \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_GB.txt b/Common/3dParty/hunspell/test/src/en_GB.txt new file mode 100644 index 0000000000..f50273dd01 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_GB.txt @@ -0,0 +1,122 @@ +Abbreviation +Acceptability +acquirable +Addressee +afterthought +airworthiness +all-powerful +amateurishness +amorphousness +anthology +Auspiciousness +Bibliographer +Bilberry +birthday +bodyguard +broadleaved +brontosaurus +bumptiousness +Cabaret +Californian +calumny +cancellation +cantonal +capitalize +careful +carry-on +casino +clown +co-ordinate +cockleshell +decennial +deckchair +decryption +deep-freeze +Democracy +financial +fish-plate +Flamenco +housing +Hybrid +hydroelectricity +iceboat +ichthyology +idiomatic +ill-humoured +imperatrix +individuality +interocular +intrasectoral +ironwoods +Jolliness +Jurisprudent +knowledgable +kopeks +labour-intensive +laboratory +lake +language +larynx +latching +leakiness +License +licensed +licensee +life-threatening +linguistics +long-lived +machinable +mainsheet +Major +malleability +man-hour +Mango +ninety-five +nobody +non-blocking +non-judicial +nonconforming +north-Western +nutritiousness +quasi-synchronous +question +racoon +radish +Railway +Rarity +saucer +Save +Saying +supplely +tallish +target +Taxi +teach-in +technician +ultramodern +umbrae +uncertainness +unconstitutionality +washing +wasn't +waxen +weather +well-formed +what's-his-name +whereupon +Wi-Fi +Wikipedia + +Слова с ошибками +Abstractnes +advantageusness +arhythmical +autosuggestibility +kaptor +coldshouldering +humaneneses +imaginativness +knight-erantry +magasine +night-wachman +qualifidly \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_US.txt b/Common/3dParty/hunspell/test/src/en_US.txt new file mode 100644 index 0000000000..a806686cda --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_US.txt @@ -0,0 +1,213 @@ +apple +banana +cat +dog +egg +fish +gold +house +ice +juice +kite +lion +mouse +night +orange +pencil +queen +rabbit +sun +tea +umbrella +vase +watch +xylophone +yellow +zebra +arrow +book +cake +car +day +elephant +flower +hat +island +jelly +king +lamp +moon +nose +owl +pink +quilt +radio +sunflower +tree +unicorn +violin +water +xylophone +yellow +zoo +apple juice +blue +calculator +desk +elephant +fire +goat +hat +ice cream +jacket +key +lemon +map +notebook +owl +pear +quilt +rose +soccer +table +umbrella +vegetable +whale +xylophone +yellow +zebra +apple pie +beach +computer +drum +elephant +goat cheese +hat +ice skate +juice box +kite festival +lemonade +mountain +notebook paper +orange juice +pizza +queen bee +rainbow +snow +turtle +umbrella hat +valley +Aberration +Absolution +Acquiesce +Adumbrate +Aesthete +Altruistic +Ambivalent +Anomalous +Antediluvian +Antipathy +Aphorism +Apocryphal +Apostasy +Apparition +Arduous +Assiduous +Audacious +Austere +Autonomy +Avaricious +Axiomatic +Baleful +Bellicose +Belligerent +Bereft +Bilious +Bombastic +Cacophony +Capricious +Cartography +Castigate +Clandestine +Coalesce +Cogent +Cognizant +Colloquy +Concomitant +Confabulate +Congenial +Conundrum +Copious +Corpulent +Coven +Credulous +Culpable +Dearth +Debilitate +Deleterious +Denigrate +Despondent +Diatribe +Dilapidated +Disparage +Dissemble +Dissonance +Duplicity +Ebullient +Egregious +Ephemeral +Equanimity +Esoteric +Euphemism +Evanescent +Exacerbate +Exhort +Expatriate +Extol +Facetious +Fatuous +Feckless +Felicitous +Feral +Fervent +Fetter +Flummox +Fractious +Garrulous +Hegemony +Iconoclast +Idiosyncrasy +Ignominious +Impecunious +Ineffable +Inexorable +Inscrutable +Insidious +Intrepid +Intransigent +Invective +Irascible +Juxtapose +Kowtow +Languid +Lassitude +Lurid +Malinger +Maudlin +Mawkish +Mendacious +Metaphysical +Antransigent +Inwective +Iracible +Juxtopose +Kovtow +Langued +Lasitude +Larid +Mallinger +Haudlin +Mavkish +Mendocious +Mitaphysical + diff --git a/Common/3dParty/hunspell/test/src/en_ZA.txt b/Common/3dParty/hunspell/test/src/en_ZA.txt new file mode 100644 index 0000000000..f509809717 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_ZA.txt @@ -0,0 +1,114 @@ +Acceptably +Achievement +administrate +all-day +amount +average +bilayer +blasé +boutique +breezy +byers +cabdriver +carefree +categorised +Chameleon +cheerful +chronology +cliché +cooling-off +courage +crudités +decorates +dooryard +débâcle +electromotive +equalled +Exotica +fellow-traveller +forests +full-timer +graded +habitué +haven't +hide-and-seek +home-building +interaxial +kingdom +largeness +long-distance +Majority +manoeuvre +Matrix +metier +mightn't +multidisciplinary +night-time +officio +old-style +organize +overaggressive +packing +parenthesis +pince-nez +Plaint +play-act +policy-making +Preheat +prohibit +puzzle +queue +quite +re-enact +reason +ready-made +renewal +resize +rooihout +scampi +schoolteacher +sea-green +shop-boy +sidebar +skyscraper +soundless +spelling +stakeout +synchronizing +take-off +Thereof +Trademark +transportable +treatment +tweeness +under-age +unmake +Variate +Visitant +volume +webmaster +well-prepared +window +yesteryear +first-aid +Hydrant +inconstant +network +northernmost +nowhere +souvenir +telecommunicate + +Слова с ошибками +afordable +anthropologie +bagage +comparatif +flammeble +indivizible +jetlag +lettrebox +panoramma +posessor +selfdoubt +abandonner \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/es_ES.txt b/Common/3dParty/hunspell/test/src/es_ES.txt new file mode 100644 index 0000000000..05520c2d2f --- /dev/null +++ b/Common/3dParty/hunspell/test/src/es_ES.txt @@ -0,0 +1,208 @@ +nosotros +vosotros +ellos +ellas +aquí +allí +ahora +antes +después +siempre +nunca +también +solamente +verdad +mentira +bien +mal +grande +pequeño +rápido +lento +nuevo +viejo +bueno +malo +feliz +triste +bonito +feo +caliente +frío +dulce +amargo +fuerte +débil +cerca +lejos +fácil +difícil +cierto +falso +caro +barato +limpio +sucio +fuerte +débil +alto +bajo +claro +oscuro +abierto +cerrado +joven +viejo +corto +largo +alegre +tranquilo +nervioso +amable +grosero +conocido +desconocido +cortés +rudo +agradable +desagradable +sabroso +insípido +difícil +fácil +cansado +descansado +moderno +antiguo +último +primero +posible +imposible +rápido +lento +sencillo +complicado +propio +ajeno +abierto +cerrado +amable +desagradable +seguro +inseguro +correcto +incorrecto +dulce +amargo +Anacoreta +Sobrentender +Embriaguez +Inquebrantable +Empedernido +Derramamiento +Despotricar +Escafandra +Aletargamiento +Estancamiento +Descarado +Exégesis +Contrariedad +Espeluznante +Conspiración +Impedimenta +Deglutir +Engreído +Enmascarado +Exterminio +Embelesar +Permutación +Desesperanza +Impenetrable +Enarbolamiento +Errabundo +Deslinde +Inefable +Soliviantar +Embriaguez +Perdurable +Opulencia +Trémulo +Desembolso +Empedernido +Anquilosar +Enigmático +Inquebrantable +Contrincante +Desmesurado +Vanagloriar +Exasperar +Desvanecer +Perpetuidad +Desbaratar +Ineficaz +Zozobra +Elucubración +Ineludible +Desgarramiento +Atestiguar +Encascarar +Desembozar +Irreverente +Soslayar +Despiadado +Embaucar +Moflete +Endilgar +Desfalco +Embelesamiento +Desestimar +Enajenación +Desavenencia +Inexorable +Atolladero +Egrégoro +Desafiar +Afable +Enervar +Belicoso +Enervar +Descacharrante +Entramado +Inigualable +Perplejidad +Descabellado +Diligencia +Enaltecimiento +Desvergonzado +Arrebato +Empatía +Endiosar +Peripecia +Desidia +Subversión +Desfachatado +Desfalco +Desvirtuar +Errático +Desahuciar +Envilecimiento +Empecinado +Estolidez +Despropósito +Engatusar +Culminante +Sobrentender +Enseñorear +Desacato +segguro +insseguro +correcto +incarrecto +dalce +amergo +Anasoreta +Sobrententter +Embreagues +Inquebranttable +Empidernedo + diff --git a/Common/3dParty/hunspell/test/src/eu_ES.txt b/Common/3dParty/hunspell/test/src/eu_ES.txt new file mode 100644 index 0000000000..9cbd124e59 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/eu_ES.txt @@ -0,0 +1,132 @@ +Abantza +ñabar +abasto +abegikortasun +aberaskeria +aberetzar +abezedario +abialdi +Abiatzaile +abizari +Aboli +abonatu +absenta +absolutibo +accelerando +adabegitsu +adberbio +adiaka +adierazle +adierazkizun +adikuntza +adin +adinaro +adineratu +adin-txikitasun +administratzaile +adoleszentzia +adopzio +adostu +aerolabangailu +Aeroplano +afalordu +agente +agertezin +agiantza +agoran +arradatze +arrakasta +Batata +baterakuntza +baterakor +Bateri +batuar +baud-abiadura +batzuenganako +batzuengandik +batzuengan +batzuengatik +batzuen +baxera +berezi +berezikeria +beritzete +beroa +Beroate +beroatza +berorri +berrabiatu +berra +berresgarri +berripaper +chap +dabilzkidake +dabilzkie +dagitza +dagokik +dagozkieke +erdiondu +galdera +galtzada +garaitiar +garantia +Garaztaketa +garbitasun +gastronomiko +Gaurgero +gaurgoitik +legizkie +legokizue +legozkidake +lehenbizi +nindoakio +publikotasun +publizitate +subsidiario +substantibo +sugestio +superbalorazio +taidun +taldeburu +Talent +Teknografia +xantxa +xerbitor +xerokopia +zabaldura +Zabalkor +Zabaltza +zabilzkieken +zabilzkio +zaharkote +zeneritzeketen +zenerra +zenezagu +zengozkigute +zeniharduke +zenioke +zenioketez +zeniraute +zenizkien +zenizkiguke +Zintut +Zintuzkedan +isiltasun + +Слова с ошибками +abriсot +absenzia +addikzio +administraziozerbizu +bat-bates +bermagari +cataluniar +dakarza +erdemin +garatienetarikoa +ishil +nindezaguane +nintzainaken +summa +technologiko +charmant \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/fr_FR.txt b/Common/3dParty/hunspell/test/src/fr_FR.txt new file mode 100644 index 0000000000..5ab592e094 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/fr_FR.txt @@ -0,0 +1,211 @@ +Bonjour +Merci +Oui +Non +S'il +Excusez-moi +Pardon +Bien +Mal +Grosse +Petit +Beau +Moche +Fort +Faible +Chaud +Froid +Vite +Lent +Haut +Bas +Loin +Près +Heureux +Triste +Facile +Difficile +Simple +Compliqué +Bon +Mauvais +Nouveau +Vieux +Jeune +Âgé +Bienvenue +Amitié +Amour +Famille +Travail +Maison +Voiture +Manger +Boire +Courir +Marcher +Nager +Chanter +Dormir +Jouer +Parler +Écouter +Regarder +Lire +Écrire +Acheter +Vendre +Aller +Venir +Faire +Dire +Voir +Savoir +Apprendre +Aimer +Détester +Partir +Rester +Arriver +Revenir +Partager +Aider +Aimer +Ouvrir +Fermer +Manger +Boire +Avoir +Être +Pouvoir +Vouloir +Devoir +Parler +Écouter +Rire +Pleurer +Danse +Étudier +Travailler +Voyager +Vivre +Connaître +Reconnaître +Voyager +Exister +Choisir +Donner +Recevoir +Aimer +Oser +Phénoménologie +Électroencéphalographie +Parallélépipède +Anticonstitutionnellement +Transsubstantiation +Éclectisme +Anachronisme +Catéchuménat +Démagogie +Fructueux +Ineffable +Hypothèque +Propriété +Procrastination +Complaisance +Réminiscence +Éthique +Équinoxe +Exponentiel +Hétérogénéité +Imbroglio +Incorrigible +Maelström +Métaphysique +Protagoniste +Subliminal +Verrouillage +Volumétrique +Énigmatique +Époustouflant +Immatériel +Infini +Polyglotte +Recrudescence +Prophylactique +Symbiotique +Vestibulaire +Épistémologie +Faramineux +Géopolitique +Hypnotique +Inamovible +Intemporel +Labyrinthe +Pacifiste +Quémandeur +Soporifique +Ubuesque +Volumineux +Effervescence +Électrophorèse +Paradoxe +Prorata +Quadrupède +Sarcophage +Trigonométrie +Vaccinologie +Xenophobe +Zéphyr +Génétique +Labyrintique +Mégalo +Nostalgie +Omniprésent +Pangramme +Périlleux +Quinquennat +Rémunération +Scolopendre +Tautologique +Utopiste +Vexatoire +Wolof +Xanthine +Yacht +Zanzibar +Axiomatique +Chronométrer +Dilettante +Énervement +Facétieux +Générique +Harmonique +Illusoire +Juridique +Kabbaliste +Longetivité +Médiane +Néologisme +Oxygène +Patronymique +Quotidien +Rétorique +Sémantique +Tautologie +Utopique +Vaccinologie +Xénophobie +Yachting +Zoroastrisme +Voager +Exisster +Chaiser +Doner +Resevoir +Aimmer +Osero +Phénoménollogie +Électraencéphallographie +Parallélépepède + diff --git a/Common/3dParty/hunspell/test/src/gl_ES.txt b/Common/3dParty/hunspell/test/src/gl_ES.txt new file mode 100644 index 0000000000..1fa4436b77 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/gl_ES.txt @@ -0,0 +1,120 @@ +ola +tipo +Si +non +nonnr +comida +comidaa +auga +augaa +casa +coche +cochee +un tren +bicicleta +escola +escolaa +niños +pai +paii +nai +naii +irmá +irmán +cachorro +gato +gatoo +peixe +peixee +aves +avess +árbore +flor +herba +o sol +lúa +o ceo +chuvia +neve +vexa +inverno +primavera +outono +noite +noite +día +unha semana +mes +ano +para ler +escribir +fala +ensinar +traballo +durmir +durmir +correr +vai +senta +estado +para escoitar +vexa +escoita +hai +beber +carne +furtas +verduras +queixo +pan +auga +zume +café +té +leite +aceite +ovo +sal +impacienta +azucre +un bocadillo +cociña +sala de estar +dormitorio +baño +batela +sofá +lámpada +fiestra +a porta +piso +teito +parede +sofá +alfombra +baño +afundir +espello +toalla +cama +manta +almofada +reloxo de alarma +escritorio +cadeira +marabilloso +adverbio +obviamente +Dominante +residenciais +convidado +perigo +cuestión +deporte +mina +cordeiro +cabeza +tratar +avogado +intelixente +guapo diff --git a/Common/3dParty/hunspell/test/src/hr_HR.txt b/Common/3dParty/hunspell/test/src/hr_HR.txt new file mode 100644 index 0000000000..6fbcfb98f7 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/hr_HR.txt @@ -0,0 +1,215 @@ +boliestan +jyak +slaby +pameetan +gllup +bezuspješhno +besimeni +bezuzban +blagastanje +bljeskovica +jabuka +sunce +voda +kuća +ptica +kava +kruh +cvijet +knjiga +pas +mačka +grad +zelen +plav +crven +bijel +crn +velik +malen +brz +spor +sretan +tužan +vruć +hladan +nov +star +lijep +ružan +dobar +loš +zdrav +bolestan +jak +slab +pametan +glup +raditi +jesti +piti +spavati +čitati +pisati +govoriti +smijati se +plakati +pjevati +igrati +plesati +učiti se +kupovati +kuhati +telefonirati +gledati +slušati +hodati +trčati +letjeti +plivati +čitati +pisati +raditi +imati +biti +ići +doći +otići +dati +uzeti +reći +vidjeti +čuti +osjetiti +misliti +htjeti +moći +morati +rado +nerado +da +ne +molim +hvala +doviđenja +oprosti +zbogom +zdravo +čau +ej +da +baš +super +glupost +fantastično +jasno +tako +zapravo +možda +lako +teško +prozračnost +usplahirenost +neoblomivost +prezir +proigranost +uznemirenost +besprijekornost +besprizornost +nepredvidivost +beznadnost +promašenost +protivljenje +neizreciv +bezizlaznost +neuspjelost +zbunjenost +neodlučnost +protivština +nepovratnost +bezduhovitost +ravnodušnost +prolaznost +neobaveznost +bezbrižnost +nepovratnost +promašenost +neprepoznatljivost +neukrotivost +bezobzirnost +nevinost +nestalnost +nepostojanost +bezizlaznost +nepovratnost +prolaznost +neodgovornost +bezbrižnost +nevolja +nezadovoljstvo +prolaznost +bezuspješno +bezimeni +bezuzdan +blagostanje +bljeskavica +boren +carovnija +crpeža +dostojanstvo +duhovitost +egzaltacija +gorkoća +histerija +idila +ironija +izdaja +janjetina +kajanje +kavana +krhotina +ljepljivost +lukavstvo +magnutizam +melankolija +misticizam +naivnost +nelagoda +neraspoloženje +obmana +okrutnost +opojenost +prezir +propast +ravnodušnost +sjenka +skitnica +spletka +stid +sudbina +susret +sudbina +šapat +tišina +trepet +utopija +uzaludnost +veličanstvo +zaborav +zanesenost +zanos +zavjera +zbunjenost +zluradost +zloslutnost +žargon +žártva +šaptanje +čarobnost +dileme +hodočasće +lebdjeti +iznimka +preobilje +probuditi se +surov \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/hu_HU.txt b/Common/3dParty/hunspell/test/src/hu_HU.txt new file mode 100644 index 0000000000..aae52a65b7 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/hu_HU.txt @@ -0,0 +1,114 @@ +Szorzótábla +Réges-régen +normálméret +nemeslelkűség +mindegyik +milliós +Mikroflóra +Mezőgazdaságigép +meséskönyv +mennyiség +Memória +kártya +kuráre +Kurzor +jégkorong +jellemesség +Javak +irányzás +iromány +Inkluzíve +hűtőedény +hőmérséklet +hír +hétszázas +hátrány +háromszáz +Hintó +generátor +gavallérság +explozíva +eső +esdeklés +epilógus +Energia +Előélet +előterjesztés +előnézet +elvonás +elszigetelés +ellátmány +Elevátor +egynémelykor +egyenlőség +eddzenek +dzsungel +ananász +akvárium +Szépül +Sztorizik +szobroz +szimbolizál +szemlélődik +sugdolózik +majmol +Macskáz +Létesít +Lokalizálódik +litografál +levelesedik +lepet +közömbösít +kételkedik +kivirágoz +kerekez +kedvez +járkál +jegyzőkönyvez +iskolázik +individualizál +csendesít +borsoz +billentet +bajmolódik +anyagozik +alkonyodik +Aktualizál +színes +szemelt +lassú +hatékony +hasznos +gyúlékony +gyári +abszurd +örökjog +öregkor +ömlő +Zászlaj +Zseblámpa +regényirodalom +realitás +raktárhelyiség +pötty +pótlék +pótdíj +pályafutás +Promóció +Processzus +poloska +pernye +pediáter +parancsnoklás + +Слова с ошибками +sponzorálás +mihamarábiak +idohatár +hypnotizmus +departement +légiesul +kutagat +költségtakkarékos +redukzió +pilanatfelvétel \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/id_ID.txt b/Common/3dParty/hunspell/test/src/id_ID.txt new file mode 100644 index 0000000000..dff2ed986e --- /dev/null +++ b/Common/3dParty/hunspell/test/src/id_ID.txt @@ -0,0 +1,121 @@ +acang-acang +Adiksi +Adventisius +Advokat +afirmatif +agroindustry +agrisilvikultur +akhir-akhir +akomodatif +aksi +aljabar +anggul +anotasi +antusiasme +apoteker +bahagia +bakat +bangkang +Bankir +Barikade +bebaru +belar +beleid +bencana +bentangur +beritawan +besuk +bilingualisme +Cecak +Celempong +cencawan +cengkar +ceremai +cermin +cudang +Dampal +dampan +dansa +datung +debitur +defensi +defisit +demper +dendang +Derivasi +Desember +deskripsi +diskotek +diskusi +distansi +dragon +dramatisasi +Eksamen +Eksistensi +eksperimen +ekstensifikasi +ekuitas +elektron +gelut +Geofisikawan +Gerbang +gerempang +influenza +Informasi +Inisiator +insekta +institusional +instruksional +jelajah +Kamrad +Kapilaritas +kapster +kardiovaskular +karismatik +keranjingan +komunal +Limitatif +Linguistik +lintang +masabodoh +matematikus +medisinal +Melankolia +Memorabilia +nasional +nasionisme +Panen +pangkek +peranti +perian +persekusi +perunjung +regenerasi +reglementer +robotika +runjang +Sabtu +Simbang +simpati +tebing +topi +Unggal +unsuri +urbanisasi +variabel +wahana +warganegara + +Слова с ошибками +Abonement +Abcente +ambivalan +bakteriostatic +cekaw +darmavisata +declarasi +duplex +ecozona +gempur-mengempur +jejengok +transitive \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/it_IT.txt b/Common/3dParty/hunspell/test/src/it_IT.txt new file mode 100644 index 0000000000..02852a870c --- /dev/null +++ b/Common/3dParty/hunspell/test/src/it_IT.txt @@ -0,0 +1,200 @@ +Ciao +Ciaoo +Buongiorno +Buonasera +Buonassera +Grazie +Prego +Arrivederci +Buonanotte +Scusa +Per favore +Amore +Amico +Famiglia +Casa +Città +Strada +Montagna +Montaga +Mare +Sole +Luna +Stelle +Giorno +Notte +Colazione +Clazione +Pranzo +Cena +Acqua +Vino +Caffè +Pane +Formaggio +Pasta +Pizza +Gelato +Dolce +Salato +Frutta +Verdura +Carne +Pesce +Pollo +Uovo +Sale +Pepe +Olio +Burro +Zucchero +Latte +Yogurt +Insalata +Zuppa +Bistecca +Prosciutto +Parmigiano +Biscotti +Cioccolato +Spagggrhetti +Spaghetti +Lasagne +Risotto +Gnocchi +Penne +Ravioli +Cannelloni +Pesto +Caprese +Limoncello +Espresso +Cappuccino +Tiramisù +Panna cotta +Cannoli +Panettone +Brioche +Focaccia +Foacdccia +Crostini +Arancini +Antipasto +Primo piatto +Secondo piatto +Contorno +Pane tostato +Marmellata +Accoglienza +Affascinante +Aggressività +Alleviare +Appassionato +Armonioso +Autonomia +Autovfnomia +Barbarie +Beneficiare +Bizzarro +Burocrazia +Cambiamento +Capriccioso +Cautela +Commemorare +Comportamento +Conseguenza +Controverso +Coraggioso +Debolezza +Decisivo +Delizioso +Desiderare +Destrezza +Determinato +Determin +Difficoltà +Disponibilità +Divertimento +Eccentrico +Efficienza +Elettrizzante +Emergere +Empatia +Energia +Equilibrio +Esperienza +Fantastico +Fenomenale +Generosità +Gratitudine +Immaginazione +Impressionante +Impressiante +Indipendenza +Ingenuità +Innovazione +Intelligenza +Intensità +Intrigante +Ispirazione +Instabilità +Irresistibile +Leggenda +Libertà +Luminoso +Magistrale +Malinconia +Meraviglioso +Metamorfosi +Miracolo +Misterioso +Nostalgia +Opportunità +Originalità +Passione +Pericoloso +Prestigioso +Prodigioso +Prospettiva +Raffinato +Rafinato +Ricchezza +Rispettoso +Sensibilità +Sorprendente +Spontaneità +Spontaneita +Stravagante +Suggestivo +Surreale +Tenerezza +Trasformazione +Unicità +Vibrante +Vittoria +Volontà +Amicizia +Avventura +Bellezza +Calma +Danza +Eleganza +Felicità +Gioia +Incanto +Magia +Natura +Odore +Passatempo +Quotidiano +Relax +Serenità +Tesoro +Umorismo +Vacanza +Zelo +Avventuriero +Speranza +Risate +Armonia +Incanto diff --git a/Common/3dParty/hunspell/test/src/kk_KZ.txt b/Common/3dParty/hunspell/test/src/kk_KZ.txt new file mode 100644 index 0000000000..69010faa9b --- /dev/null +++ b/Common/3dParty/hunspell/test/src/kk_KZ.txt @@ -0,0 +1,209 @@ +сөз +адам +қала +тау +ауа +су +аспан +жер +бала +ата +ана +тамақ +кітап +ұстаз +оқу +тұтыну +тыныш +тұз +ауру +денсаулық +топ +маусым +төс +көз +жүрек +сарғыш +көп +аз +ертең +түн +түс +жас +қара +ақ +көк +қызыл +шай +салт +ыстық +суық +қазақ +жеті +он +жүз +мың +бір +екі +үш +төрт +бес +алты +жеті +сегіз +тоғыз +он +бақша +бұлақ +қиыр +досым +ақша +патша +таң +кеш +тауар +күн +апат +риза +ауырсыну +орман +жаңбыр +бауыр +жел +тұман +үй +бұлақ +көше +айнала +шайыр +тағам +сусын +топ +бас +әрекет +тіл +кеме +сиыр +қой +ешкі +шөп +ит +тұқым +қарындаш +апа +ана +әке +дала +тарлау +дәуір +таңдай +жыл +басқарушылар +басқарушшылар +жауапкер +ерекшеліктерімендерге +тұмылдырықтатқыздан +білімділігінге +білімдарды +алалықсыздар +айырмашылықтарын +тұрақтандырып +сылтауратқандарыңызды +қолдар +байланысқадан +жетілдірілген +зарарсыздандырады +ескеріп +ескеріпп +міндеттемелеріндерге +кезеңдердің +себепсіздік +біреудейлер +беделілерің +кездестіріңіз +шектердің +көңіл +көңл +мол +алайда +мәселе +мәселеу +сендің +келер +келерр +кәне +көпір +күндіз +сана +белгілер +дайын +ез +қайшы +саф +рең +шақ +үміткер +бақыт +бақытт +республика +консервациялау +мемлекеттік +тағатсыздан +адамда +бәрі +бең +беңр +жасағанда +жасағоанда +жабайылық +заманда +көшірдік +мерейі +Мерейій +мөлшерсіздікк +мөлшерсіздік +пенді +тылда +мәртебесімен +аппаратпен +тегінді +кездеме +ересектік +көңілсіздік +тәуекелсіздік +қанағатсыздық +ғаділетсіздік +сайдақы +басым +тәжікеден +тұрғын +қонақ +қауіпсіздік +қадірсіздік +білгішсінбейсіңдер +талқандас +кешікті +қоздырғышы +бас +емдейсіңдер +құқылы +тақылет +әдемі +көткеншектейсіңдер +әжет +қайтар +белсену +түсінбеймін +жағымсыздық +сыздар +мәртебесі +тұрғыны +мезгіл +әлбетте +барысын +оқылған +безге +жаса +аламаңдайсыңдар +кереметті +епетейсіздік diff --git a/Common/3dParty/hunspell/test/src/ko_KR.txt b/Common/3dParty/hunspell/test/src/ko_KR.txt new file mode 100644 index 0000000000..3ef2abd2ce --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ko_KR.txt @@ -0,0 +1,157 @@ +안녕하세요 +감사합니다 +사랑해요 +미안합니다 +음식 +친구 +가방 +집 +학교 +컴퓨터 +물 +밥 +책 +산 +바다 +날씨 +일 +노래 +치킨 +반찬 +꽃 +숙제 +가족 +아이 +게임 +영화 +생일 +시간 +동물 +여행 +차 +쇼핑 +추천 +대화 +전화 +사진 +운동 +잠 +병원 +음료수 +능력 +주말 +전자기기 +고양이 +강아지 +바나나 +가을 +겨울 +봄 +여름 +옷 +신발 +지하철 +택시 +버스 +비행기 +샴푸 +브러시 +삼계탕 +국수 +불고기 +된장 +김치 +먹다 +마시다 +보다 +듣다 +놀다 +하다 +가다 +오다 +서다 +늦다 +일어나다 +자다 +빨갛다 +파랗다 +노랗다 +녹색 +보라색 +맛있다 +시원하다 +덥다 +추운 +기분 +슬프다 +즐겁다 +정신이 +바쁘다 +참새 +나비 +병아리 +돌 +물고기 +향신료 +시장 +기차 +공원 +해변 +지갑 +병원 +대학 +교통 +공항 +천재 +연구 +일본 +중국 +사업 +지식 +성격 +자금 +기술 +정부 +전략 +협력 +혁신 +경제 +철학 +신체 +영감 +현상 +역사 +태양 +설명 +사회 +환경 +자연 +현실 +존경 +정확 +장애 +낙관 +발전 +절망 +일상 +소멸 +도전 +반복 +포기 +파괴 +혁혹 +소외 +식민지 +혐오 +출산 +행복 +불평 +판매 +위험 +안녕하ㅎ요 +감사합ㅅ다 +사랑ㄱ해요 +미안ㅎ합니다 +친ㅔ구 +가ㅎ방 + diff --git a/Common/3dParty/hunspell/test/src/lb_LU.txt b/Common/3dParty/hunspell/test/src/lb_LU.txt new file mode 100644 index 0000000000..e7dd0e3d59 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/lb_LU.txt @@ -0,0 +1,118 @@ +Aarbecht +Aarbechtszäitorganisatioun +Aartgenoss +Abenteuer +abrëll +absence +Abusives +Abzebillercher +Acquéreur +Adjointeë +Affischéiertes +Airbussen +Alldeegleches +Angschtzoustä +Basketballspiller +Baufirme +bauren +bekanntes +Beleg +Berodung +Bewältegung +Datentransfer +Dateschutz +Decisives +Donneschden +Drangsaléiertes +Dränk +Giischtgen +Grondlag +grondreegel +Géies +Handelsdag +hausaufgab +hierschtdag +Häerzi +Industriell +Infrastrukturelles +Interessi +Internetfore +Intervall +Kamell +Kantoner +Karamell +Klenges +Nopeschhaus +Motors +Muer +Muerenter +Musek +Nettoverméige +niess +Protektioun +Prouf +Provisioun +Prozessor +Präis +Präsens +Sanitäres +Schauspiller +Schema +Taxatioun +Telefonsgespréich +termingrë +terrass +Textdatei +Textsprooch +Titulaire +Titel +erausféieren +erausjoe +gëeicht +onglécklecherweis +unzesammelen +unzespille +Approvisionnement + +Сложные слова +Aktiegesellschaft +Aktivitéitsdéclaratioun +Alarmstëmmung +Allgemengverständleches +Bankenoperatioun +Bensinsreserven +Besteierungsofkommes +Diskriminéierungsmoossnam +Dokumentatiounsaarbecht +Haaptrecommandatioun +Héchstgeschwindegkeet +Héichproblematesches +Hëllefsdéngscht +Integratiounsméisseges +Iwwersetzungsprogramm +Kapitaliséierungsdimensioun +Museksinstrument +Publicitéitsmarché +Transportproblem + +Слова с ошибками +Abonnnement +Accomodéiertes +Agrarcenter +Begrennung +Berodunszentren +Deeluung +Dialogue +Dictaten +Inspektor +Iwereileges +Pedagogik +Televisionschaîn +Bechäftegungsméiglechkeet +Gläicheetspolitik +Musekheichschoul +Satelliten +Addressbichelchen +Aarbechtsfield + + diff --git a/Common/3dParty/hunspell/test/src/lt_LT.txt b/Common/3dParty/hunspell/test/src/lt_LT.txt new file mode 100644 index 0000000000..1f04ae6ce1 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/lt_LT.txt @@ -0,0 +1,127 @@ +Abstraktus +šachmatai +žadintoja +agurkas +Aikštė +Akinukai +akmuo +šakoti +aktualinti +aktorius +šalinis +šaltinis +bernystė +beskuo +būgnelis +Bilietas +bilingvizmas +daržavietė +Darbadienis +Darbas +darbuotoja +dargi +daržinė +daugintoja +Daugiaveiksmis +delnė +įdelnis +detalizuoti +šerdelė +erdvėti +šeriškas +šeštadienis +etiketas +Evoliucija +fabrikantė +Fantastika +Fenomenas +fikusas +gaudinėti +gausėja +gūbrinti +geležis +geležtė +gelsvis +geranoris +Gertys +gerviukas +giesmininkė +Gikas +Goža +griaustinis +grįžinys +gėrioja +griozdas +grizijo +gryčia +grožėja +grįžti +grupė +gąstauti +Jaukas +jodinėjo +jodyti +keturnagis +Kiaušina +Kiaurymė +kiausta +kietakaktis +ūkiškas +kilimėlis +kilometrinis +ūkininkaitė +ūkinis +krykti +lapuotis +laukas +laupti +laužtė +Maudulys +Maumedis +mažutėlis +mazgotuvė +mechanikė +medeinė +medikamentinis +meduolinis +Nūdien +nebrendėlė +Negu +neiginys +parudenys +pasakotojas +pasausė +pasieninis +paskyriui +paslapčiom +Pasodas +Pat +Pataikūniškas +patarška +patentinis +proskyna +protekiniais +provizoriškas +rėkčioti +rūmas +rodyklinis +Romanistas +Skylmatis +Skyriklis +skolininkas +skraidžioja +skruzdėda +skėtrus + +Слова с ошибками +Abbreviatūra +alpinismas +amortizacia +daugiamžis +deziderativinis +generazija +keturiasdešimtūkstantas +krivuluoja +Šnaukstai +pazintinis +progresa \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/lv_LV.txt b/Common/3dParty/hunspell/test/src/lv_LV.txt new file mode 100644 index 0000000000..5198404759 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/lv_LV.txt @@ -0,0 +1,205 @@ +Sveiks +Sveikks +Labrīt +Lbrīt +Paldies +Paldiess +Lūdzu +Luzu +Atvainojiet +Atvainvfojiet +Prieks +Perieks +Draugs +Dravfugs +Ģimene +Gimene +Māja +Maja +Pilsēta +Pilseta +Ceļš +Ceļšs +Kalns +Jūra +Sauls +Mēness +Zvaigznes +Diena +Nakts +Brokastis +Pusdienas +Vakariņas +Vīns +Kafija +Maize +Siers +Makaroni +Pica +Saldējums +Deserts +Sāļš +Augļi +Dārzeņi +Gaļa +Zivis +Vistas +Ola +Sāls +Pipari +Eļļa +Sviests +Cukurs +Piens +Jogurts +Salāti +Zupa +Salds +Šokolāde +Spageti +Rīsi +Kakao +Biezpiens +Kūka +Tēja +Karalis +Zelts +Ezis +Tulpe +Lācis +Kaķis +Suns +Putns +Vārna +Zaķis +Pele +Ābols +Aita +Zirgs +Lauva +Pūķis +Lasis +Vilks +Vējš +Uguns +Ūdens +Zeme +Debesis +Saule +Rūpniecība +Aizkustinošs +Izdzīvošana +Nepieciešamība +Atbildība +Lieliski +Apmierināts +Neparasts +Izglītība +Sarežģīts +Atsevišķs +Pamatots +Organizācija +Sadarbība +Efektīvs +Daudzveidīgs +Novērtēt +Pārsteidzošs +Inovatīvs +Vērtība +Aizraujošs +Nopietns +Komunikācija +Māksla +Dzīvība +Ekskluzīvs +Tehnoloģijas +Rezultāts +Atbalsts +Nodrošinātība +Pārbaudīt +Radošs +Sociāls +Izteiksmīgs +Brīvība +Pieredze +Ietekme +Pārmaiņas +Drosmīgs +Racionāls +Empātija +Izpratne +Risinājums +Iespējas +Atklāts +Vadošais +Eksperimentāls +Neatkarība +Tīrība +Samierināšanās +Motivācija +Harmonija +Dinamisks +Iedvesma +Izglītojošs +Komplicēts +Pieejamība +Sadarbība +Tūlītējs +Saprotams +Neizsakāms +Lieliskums +Inovācijas +Aizrautība +Pārdomas +Sapratne +Rezultatīvs +Iespējams +Pārbaude +Sociālais +Izteiksme +Brīvība +Pieredzējis +Ietekmīgs +Pārmaiņu +Racionāla +Izpratni +Risinājumi +Iespējams +Atklāta +Vadošā +Eksperimentāla +Neatkarība +Tīra +Motivējošs +Harmonisks +Dinamika +Iedvesmojošs +Spēks +Mīlestība +Pasaule +Daba +Skaistums +Miers +Sapnis +Prieks +Rītausma +Brīnums +Izcils +Saikne +Dzirksts +Pārmaiņas +Atbalsts +Izcilība +Satriecošs +Dzīvīgums +Pārveidošana +Uzdrīkstēšanās +Uzticamība +Ieguldījums +Vērtība +Līdzsvars +Saskaņa +Izsmalcinātība +Pateicība +Atzinība +Pārsteigums diff --git a/Common/3dParty/hunspell/test/src/mn_MN.txt b/Common/3dParty/hunspell/test/src/mn_MN.txt new file mode 100644 index 0000000000..ac86b087ab --- /dev/null +++ b/Common/3dParty/hunspell/test/src/mn_MN.txt @@ -0,0 +1,103 @@ +Баатар +Багаа +Базар +Барра +Бат-Очир +Баттуул +Батхэсэн +Баярмаа +Билгэх +Бор +Бөөнцагаан +Бүрэнхайрхан +Бямбагар +Бэх +Гарам +Гантиг +Гурвантэс +Гүр +Гэрэлтуяа +Давст +Дангаа +Дансран +Дарь-Эх +Дөргөн +Дундбүрд +Дэмүүл +Дэлгэрцэцэг +Жавзан +Жарантай +Заглул +Зүүнхөвөө +Кир +Корона +Лүн +Лха +Лхаваан +Майхан +Манлай +Мөндөөхөө +Мөнхөт +Мөрөн +Мөнххаан +Мөст +Мэгэд +Мухар +Найдалмаа +Найтингейл +Налайх +Нарантуул +Намтай +Насантогтох +Номин +Нямсамбуу +Нэүдэй +Орог +Очир +Өнөржаргал +Өөдөс +Өргөн +Паган +Пас +Пүрэвдорж +Пүрэвхүү +Сайнаа +Сайхандулаан +Сундуй +Сэлх +Сүүж +Сээр +Тайван +Тарав +Тогтуун +Төрболд +Төхөм +Төмөр +Түргэн +Түшиг +Түгтөмөр +Түшиг +Удвал +Улиастай +Улаандэл +гүедэцгээчих +дэвхэрлүүлсхийчих +дэвхэлцгээчих +дэвшигдүүлгэчих +дэвшилцчих +дэвээ +дэггүйчүүд +наламгардуулалц +налбаруулзна + +Слова с ошибками +Батарчулуун +Баруунхарааа +Даважаргал +Дөрволжин +Мягмараран +Оюунтулхуур +оторчилсхилгэ +Асрамжлулгацгаачих +гүентүүлгэцгэээ +наладаадуулга \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nb_NO.txt b/Common/3dParty/hunspell/test/src/nb_NO.txt new file mode 100644 index 0000000000..7218490a61 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/nb_NO.txt @@ -0,0 +1,113 @@ +Bahamasøyene +Festarrangement +Festarrangemang +Festival +festligheta +festnummer +forhandlernett +forgylle +fotballstyre +Fotgå +fotoamatørene +Fotogalleri +fotokopiere +generalkostnadene +generaltabbe +generøs +Generell +genmodifisertst +handlingsresymeet +hardhet +Harmfull +hastighetsregulering +havbanke +havforskningsundersøkelsene +informasjonsutveksling +Infrarødest +kaffeautomat +kaldslig +kalenderåra +kjekk +kjendisstoffa +kjærlighetslyrikk +kjøkken +Kontantautomat +kontantlån +kontrahere +kontraheringsplikt +Låskasse +læregutt +læreprosess +Museums +museumssamling +musikkorps +myggstikka +myndighetsaldere +omløpstider +omregn +områdeplan +omriss +omsetningsgjeld +omsjaltning +omsetningsvolumer +omslutning +omslyngning +omsonst +omstendeligheta +Omstart +Omstreifende +Omsyn +omtåketheta +oppdagelse +oppbygning +oppebære +oppfølgingsapparat +oppgjørsbank +oppgjørsblankett +opphøringene +partisipere +randverdi +rapportskriver +rasjonalisering +Rate +selsak +selskapsinntekt +selskapsoverskudd +selvbetjeningene +snabbingene +Snadderene +Sytti +søkekriterium +søkemulighetene +søkeargumenter +søkingen +søkne +sølvlaga +sørlandsk +søtningene +tabellrad +Tabellkolonne +Takhalm +taksene +takseringssystema +tal +trolsk +trosinnholdene +utfoldelsesmuligheta +Utformingsmetode +Utgift +vekstfaktor +vekstforhold + +Слова с ошибками +Arbeidstagerorganisasion +festsprel +forhandlingsdirektor +handlingforløpa +kjempeflinktt +lanetilbud +omraming +omsvøpssfull +raportmateriale +serstilt +taksamst \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nl_NL.txt b/Common/3dParty/hunspell/test/src/nl_NL.txt new file mode 100644 index 0000000000..3efaf4df40 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/nl_NL.txt @@ -0,0 +1,115 @@ +Advertentie +Advocate +affirmatie +afgevaardigd +afneemster +allerbekendst +alternatieveling +annulering +anticycloon +Backtrackroute +Bearbeiden +becijfer +bediening +bedrag +beduiden +beïnvloeding +benadeling +bepaaldelijk +Catalogiseer +Catering +cellulair +classificator +collaboreren +collectiviteit +comfortabel +complimenteus +contractant +correctionaliseren +daaraanvolgend +dagelijks +deelgenoot +degelijkheid +demarqueren +Denotative +deposant +dergelijken +detail +deugen +diakritisch +Directioneel +dusgenaamd +eendrachtigheid +Eenzaamheid +eersteklascoupé +Eigenschap +felicitatietelegram +centerkanaal +Chargeer +filiaal +klare +Klassikaal +kleinhandel +evolutie +exemplaar +exequiën +familiaal +fauteuil +luister +magistratelijk +perelaar +Permitteren +Perseveratie +persoonlijk +pictogram +pixel +sloten +sluimer +sneltoets +Soldij +Solliciteren +zegepraal +zelfbeeld +zevendaags +aangeslotene +meermaals +expedieert +jaargetijden +kaderleden +Kapitelen + +Сложные слова +avontuurlijkheid +bedrijfsmaatschappelijk +begrotingstechnisch +belangstellingssfeer +concurrentievoordeel +conferentieganger +democratisch-liberaal +discontoverhoging +doctoraatsverhandeling +dubbeldeksbus +economisch-financieel +energiezuinig +erkentelijkheid +evenwichtigheid +klimaatsverandering +koffiezetmachine +koopmansgebruik +maatschapsovereenkomst +personeelsconsulent +sociaalwetenschappelijk +zelfverzekerdheid +fondsenwervende + +Слова с ошибками +afficher +algorithme +beeindiging +client +consnteren +deactivieren +deblockering +electrisch +certificat +sovereiniteit \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nn_NO.txt b/Common/3dParty/hunspell/test/src/nn_NO.txt new file mode 100644 index 0000000000..6c0c1b48bc --- /dev/null +++ b/Common/3dParty/hunspell/test/src/nn_NO.txt @@ -0,0 +1,116 @@ +Ankeret +Anleggsbedrift +Annandag +annonseavis +annuell +ansats +ansvarsmedviten +Antibiotikai +apal +apoteki +apparattavlor +appetitt +Aprikos +arbeidsdokument +arbeidsmarknad +barndom +bastematte +bautingi +Bedriftsleiar +befolkningi +begynnarkurs +Beheld +belastningi +beredskapsnivå +beredskapsperiode +berglandskapi +berrfrost +beskjedi +beskrivingi +betalingsoppdrag +betalingsplikt +bevismateriale +bildeband +bildebruki +bildespråki +bildeteksti +bilingval +billettlukone +binær +bione +bjørkegreini +bjørnebæri +blenge +blokkeringi +blomsterbordi +blyerts +bogen +bokstavrekningi +bokstavteikni +Borddisk +effektevaluering +elgkalv +Elone +emballer +faktainformasjon +familiebedrifti +familieterapeut +fastbuande +Februar +feili +fisketom +hengelåsi +istandsetjingi +Item +jaguar +jamlig +janen +jarnbanestasjon +kjende +kjentfolki +kjæleri +kjøledisk +kjørety +midli +Mideftnar +midtstrek +multiplikasjonstabell +museumsdirektør +onsdag +operasjon +operasjonskode +opinionsskapingi +opningi +Personalkonsulent +Personligdom +persontryggleik +petroleumspris +redningsaksjon +reduksjon +refusnik +seinst +sekretær +seljande +sendeferd +Standpunkt +støyisolering +støytvis +terminoppgåve +tidløysone +tidsfølgjone +Tilbakebetalingstid +uprofesjonell +upåklageleg + +Слова с ошибками +Anlegsarbeid +anonse +ansversproblematikk +barneforteling +besoksliste +bilophoggingi +effektivitetskontrol +fakturaerklering +miljøbyrad +selskapskat +cement \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/oc_FR.txt b/Common/3dParty/hunspell/test/src/oc_FR.txt new file mode 100644 index 0000000000..23c82dafd0 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/oc_FR.txt @@ -0,0 +1,108 @@ +Ajustaira +alaguiar +alausièr +alberguèri +alcaloïdic +alègrament +alenament +algorisme +Alimentacion +allergologia +alpèstra +amaisament +amorteirar +analista +analogic +atucament +Audicion +auquièr +auscultacion +auscultar +ausèri +autenticament +brilhant +brumós +Burgada +cabelièira +cadeçar +Caducèu +çaicontra +calcièrs +Calmar +camarilha +cambièra +canalhariá +casse +cedar +cendrós +cèrca +cèrtes +cestòdes +chantièr +chartrós +Chassís +dimensionar +diptèrs +dirèctament +discrecionària +discriminar +Distraire +dòler +Enòrme +enqueriái +espicifòrme +esquelèt +Esquèrra +estetic +innocéncia +innocentàs +Maniquèu +mantelejar +Nauchièr +natièr +oxigèn +pacanariá +pagés +pagesiá +Primièirament +requereguèri +requisitòria +saumelèri +S'autodeterminar +sautarèl +scientament +scientologia +secador +secretèri +sècta +sectorial +s'efarcimar +s'endeven +s'engarrar +sentimental +s'entrepausar +shampó +sextant +sòli +Solidament +soquèla +subrejornada +suedés +utilitària +Utilizaire +vacàs +vaisselèri +valiái +validament + +Слова с ошибками +albatros +amistanza +brunonièr +carpentier +centrifugation +estelhad +primaria +s'embractar +sosembrançament +vascularisacion \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pl_PL.txt b/Common/3dParty/hunspell/test/src/pl_PL.txt new file mode 100644 index 0000000000..81c4afafce --- /dev/null +++ b/Common/3dParty/hunspell/test/src/pl_PL.txt @@ -0,0 +1,225 @@ +dom +pies +kot +auto +drzewo +książka +szkoła +przyjaciel +mama +tata +dziecko +jabłko +czekolada +kawa +herbata +telefon +telewizor +komputer +muzyka +sport +zdrowie +piękno +praca +miłość +szczęście +czas +pieniądze +język +kraj +miasto +zima +lato +jesień +wiosna +morze +góry +jezioro +rzeka +park +zwierzę +ptak +ryba +drewno +złoto +srebro +metal +szkło +buty +sukienka +spodnie +koszula +czapka +płaszcz +ręka +noga +oko +ucho +nos +usta +ząb +głowa +serce +mózg +król +królowa +książę +księżniczka +chłopak +dziewczyna +mężczyzna +kobieta +staruszek +staruszka +lekarz +pielęgniarka +nauczyciel +uczennica +student +studentka +kucharz +kelner +wojna +pokój +mapa +flaga +śmiech +płacz +sen +marzenie +praca +nauka +sztuka +teatr +kino +muzeum +kaplica +kościół +zamek +most +droga + +Сложные слова на польском языке + +1. konstantynopolitańczykowianeczka +2. niezadogłębienieńskujący +3. antykontraatakujący +4. supersamoobsługiwalnymi +5. rozpierduchlanoculka +6. nieodezwawiałobyś +7. przystawieniowy +8. nieprzeżyciowakościami +9. nieprzekazywających +10. przeciwzakwaszeniowych +11. nieszczęściodrapańskiego +12. społeczno-wychowawczyniami +13. seledynowo-fioletowymi +14. przeciwdeszczową +15. mikroelektroniczno-kwalitacyjną +16. nieokreślonościowo-losowo-obiektywnie +17. zagubieniecioburakowatej +18. antyneuroleptyzanckim +19. nieupubliczniającymi +20. splądrowałbyś +21. konserwowano-spożywczymi +22. ożelośćiowo-miłosnej +23. nieprzyzwoitolicjią +24. nieodporowościę +25. rzeszołkofiołkowatymi +26. niezakapiactwuja +27. nieoszczędniewczelnianków +28. przekształconowaczkołępów +29. rozwińczywianiu +30. nieprzeskakiwalnościami +31. modernizująco-rewolucyjnego +32. nadzwyczajnieuzdolnionymi +33. przemocno-wsparciański +34. przepyszno-peltzerowskiego +35. kwestionowano-wzmocnieniami +36. nieodczynieństwującą +37. niezasłużonowypasionego +38. likwidującego/zarządzającego +39. szeszcześtoplutowanych +40. niewpadkowościowi +41. antynazizhownemu +42. nieuchronnieprzekroczeniowym +43. niezatrawialnieprzyjemnego +44. kardiopulmonologiczno-angiologów +45. gorączkowointensywnościowego +46. antykonstytucyjnorozpadowego +47. nieobawiamysię/źródleni +48. prerewolucyjnolphillipsowi +49. szóstkaniewygranych +50. nieupadkokogeneracyjnymi +51. społeczno-humanitarnarządzaniami +52. nieodziewowiędzy +53. przemocnochamować +54. społecznosensacyjnosądowym +55. przerażającorzymskiego +56. nieprzemontowanych/zamuzowych +57. referendumkonstytucyjno-reformujące +58. niezniesłowiałszymi +59. niebohaterystycznymi +60. produktodenarodowomenopauzalem +61. odrywającopierdolca +62. niegotowożywione +63. niepostronnynarodzonemu +64. przedniaautochtonicznym +65. nadciągniono-wchodzących +66. promocjostworczym +67. niezapowiadającychkoalicji +68. bezgłupinczłapie +69. wyomjaził +70. wagotonizacyjno-radiofonizowanego +71. gospodarczo-zasadotwórczej +72. skrupulatno-rzeźniczobardziej +73. samokiedy-konstytucyjnej +74. niedomętnością +75. nieoszustamiwykorzystana +76. przeprowadzonoświeckie +77. nieuniknionaobowiązkowo-plastycznej +78. poduszkowo-nicościowych +79. niepowodzeńbutmizeryjewego +80. skojarzeniowocolorowymi +81. przytułkamiwciągarkowych +82. wchodziłoprzeciwniepowszechny +83. karaublicznociągana +84. przedpolitycznilubelskim +85. niezapowiedziano-date-expanded +86. licznościłodziennej +87. niezawinieniomatołek +88. pakujączwobilardowego +89. rewersdopisek +90. przeprosinoworadosną +91. nieakceptacyjnoprospekcyjnymi +92. jedniżużytym +93. ainikopciksemilitechnikowany +94. motszynopiszącym +95. nieprzerejestrowanasezonowanie +96. słupotartackimoblikiem +97. nieodbieraniemniedostępności +98. dorozwinięcówkobiet +99. szybopojabytesłowickiego +100. przystępnoracjmujacych + +Слова с ошибками + +jedniiżużytym + +wiomjaził + +niezzniesłoowiałszymi + +superrsammoobsługiwalnymi + +przemoocnochamować + +staruszzka + +tiatr + +woina + +teleffon + +zołoto \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pt_BR.txt b/Common/3dParty/hunspell/test/src/pt_BR.txt new file mode 100644 index 0000000000..6f39dbef64 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/pt_BR.txt @@ -0,0 +1,108 @@ +que +eu +não +de +você +para +ele +se +é +um +sim +por +isso +em +uma +uuma +está +como +com +bem +na +me +mas +do +era +quando +então +tudo +tydo +aqui +disse +estava +esâtava +lá +fazer +vai +sobre +vamos +homem +hollmem +bom +ok +agora +coisa +coissa +quero +foi +meu +seu +só +eles +as +posso +pocso +estou +mais +mim +certo +dizer +dizdizerr +os +no +sei +ela +vocês +sua +todos +sabe +minha +alguma +algyyma +casa +muito +oh +quallquer +qualquer +da +estamos +até +onde +onede +ao +tenho +nós +tem +tinha +tiinha +quê +ir +ou +pode +quer +vou +seus +dia +estão +nos +cabeça +quem +anos +depois +sou +vez +vá +fez +irmão +câmera +câmeara \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pt_PT.txt b/Common/3dParty/hunspell/test/src/pt_PT.txt new file mode 100644 index 0000000000..ed038092d0 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/pt_PT.txt @@ -0,0 +1,135 @@ +pan +manteiga +menteiga +queijo +salchichón +saуlchichón +óleo +pimenta +pimmenta +sal +baga +mel +geléia +cogumelo +cebola +cóbola +banana +cenoura +pêra +beterraba +frutas +melão +melancia +bolo +chocolate +carne +batatas +salada +salóda +tomate +pepino +pipino +col +mingau +sopa +sanduíche +refrigerante +refrigarante +água +café +chá +leite +suco +scuco +maçã +uvas +laranja +abacaxi +adacaxi +damasco +demasco +açucar +arroz +macarrão +res +porco +frango +costeleta +cãsteleta +limão +ervilha +pão +peixe +caramelo +sorvete +nogueira +ovo +pêssego +xícara +xíícara +vidro +prato +colher +garfo +faca +pires +garrafa +guardanapo +café da manhã +almoço +jantar +avião +carro +bonde +ônibus +trem +bicicleta +janeiro +fevereiro +fevíreiro +março +abril +maio +junho +julho +agosto +setembro +setembra +outubro +novembro +dezembro +desembro +caneta +livro +xadrez +telefone +relógio +pente +televisão +ferro +sabão +rádio +bolsa +cartão +mala +presente +câmera +computador +camputador +filme +flor +vaso +quadro +lenço +bola +balão +brinquedo +brinqueedo +conta +sobre +papel +pepel +jornal +letra +bilhete \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/ro_RO.txt b/Common/3dParty/hunspell/test/src/ro_RO.txt new file mode 100644 index 0000000000..2cd141c941 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ro_RO.txt @@ -0,0 +1,210 @@ +casă +copil +carte +masă +școală +lumină +apă +munte +soare +lună +pâine +fruct +floare +stradă +mașină +aer +timp +zi +noapte +nor +vânt +ochi +gură +nas +mână +picior +inimă +sânge +cap +ureche +voce +melodie +culoare +formă +linie +cerc +dreptunghi +cercetare +știință +limbă +frază +literă +cifră +număr +sunet +zgomot +telefon +internet +computer +program +ecran +tastatură +mouse +joc +sport +muzică +artă +film +televizor +radio +planetă +stea +univers +galaxie +atom +moleculă +substanță +energie +lumină +căldură +frig +aparat +instrument +mașinărie +unelte +hrană +băutură +haine +pantofi +păr +piele +ochelari +ceas +bijuterie +pământ +apă +aer +foc +metal +lemn +piatră +hârtie +cerneală +pix +carte +cadru +tablou +sculptură +model +formă +anticonstituționalitate +dezvoltare +inexpugnabil +nefast +concomitent +antiseptic +recalcitrant +perseverență +extravagant +inexorabil +colosal +plauzibil +efervescent +perspicacitate +superfluu +subversiv +incoruptibil +inefabil +hiperbolic +indefectibil +peremptoriu +ambivalent +paradoxal +heterogen +indiferent +periferic +subliminal +ultraviolet +indeferent +conglomerație +circumstanțial +contraproducător +conglomerat +insurmontabil +intransigent +insidios +inerent +consternant +ambiguitate +inerție +inconsolabil +oniric +remarcabil +repudiat +subiectiv +periculos +infatigabil +abnegare +exuberant +facet +represiune +implacabil +indiferent +infatigabil +insolit +intempestiv +incandescent +letargic +magistral +magnanim +nefast +oblivial +oportun +periculos +plutitor +propice +reprobabil +risipitor +robust +salutar +simetric +solicitant +stringent +sufocant +superficial +tranzitoriu +tributar +trivial +umilitor +unic +vehement +vernal +vicios +victorios +vindicativ +virtuos +vizibil +volatil +vorace +vulnerabil +xenofob +xerofil +yonder +yang +yodel +zonal +zodiac +zoon +zoomorf +zurbagiu +Caaă +Soaare +Cartr +Appă +Coopil +Frumoss +Feriсire +Prietenn +Muziică +Exeplu diff --git a/Common/3dParty/hunspell/test/src/ru_RU.txt b/Common/3dParty/hunspell/test/src/ru_RU.txt new file mode 100644 index 0000000000..28d99377fc --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ru_RU.txt @@ -0,0 +1,197 @@ +должен +доллжен +наш +думаю +думмаю +свою +сам +всем +ни +нас +пока +этом +этой +ваша +всеми +возьми +моей +сама +вся +день +само +всей +бывает +себе +пойду +куда +ими +твоей +всю +своего +твой +пусть +ним +про +точно +иметь +которые +тогда +сюда +наше +самой +взять +наверное +домой +совсем +те +тобой +наверно +что-то +будто +твои +пути +дома +такие +тех +такое +его +самой +вашей +наверное +мои +например +типа +значит +люблю +минут +пор +случае +искусство +лучше +того +такому +ждать +видеть +мною +ждал +имя +важно +чего-то +самому +обычно +представляет +мечтать +стало +помните +взять +моих +самим +своим +вообще +самими +здесь +обратно +сразу +таким +ежели +наоборот +куда +таков +мечтает +значит +покажи +такими +кстати +почти +всякий +научит +вдоль +тогдашний +толком +занимает +Аквапланирование +Барокамера +Библиографирование +Биосинтез +Взаимодействующий +Вибраторный +Виртуальность +Вооруженность +Господствующий +Десантно-штурмовой +Диагностировать +Дипломатический +Дисгармония +Дискриминационный +Достопримечательный +Жизнеустройство +Интернациональный +Инфицированный +Кальцинировать +Ключичный +Коннотация +Лиловатый +Люминесцентный +Метрополитен +Многоплановый +Модернизировать +Наивысший +Наименее +Неопределенный +Нераскрытый +Неоднократный +Неохотно +Непостижимый +Неусыпный +Обезьяноподобный +Обзавестись +Оптический +Оптимизировать +Осуществиться +Очистительный +Парафинировать +Переключатель +Пограничный +Подготовительный +Подрядчик +Полиморфный +Почитать +Преисполниться +Преподаватель +Преследователь +Прирожденный +Проектирование +Профанация +Разграничительный +Распоряжающийся +Реконструктивный +Революционный +Рентгенологический +Рискованный +Роскошествовать +Самоунижение +Сверхъестественный +Светочувствительный +Семантика +Сингулярность +Совершенствовать +Соединительный +Сосуществование +Спорообразующий +Стационарный +Столовая +Сторицей +Сцепной +Трансформирующий +Триумвират +Укротитель +Универсальный +Федеративный +Хронометраж +Целостность +Криумвират +Укратитель +Универссальный +Фидиративный +Хранометраж +Целосность diff --git a/Common/3dParty/hunspell/test/src/sk_SK.txt b/Common/3dParty/hunspell/test/src/sk_SK.txt new file mode 100644 index 0000000000..1bc44a6dda --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sk_SK.txt @@ -0,0 +1,205 @@ +hiša +pes +mačka +avto +drevo +knjiga +šola +prijatelj +mama +oče +otrok +jabolko +čokolada +kava +čaj +telefon +televizija +računalnik +glasba +šport +zdravje +lepota +delo +ljubezen +sreča +čas +denar +jezik +država +mesto +zima +poletje +jesen +pomlad +morje +gore +jezero +reka +park +žival +ptica +riba +les +zlato +srebro +kovina +steklo +čevlji +obleka +hlače +srajca +kapa +plašč +roka +noga +oko +uho +nos +ustnice +zob +glava +srce +možgani +kralj +kraljica +princ +princesa +fant +dekle +moški +ženska +starec +starka +zdravnik +medicinska sestra +učitelj +učenka +študent +študentka +kuhar +natakar +vojna +mir +zemljevid +zastava +smeh +jok +spanje +sanje +delo +učenje +umetnost +gledališče +kino +muzej +kapela +cerkev +grad +most +cesta + +Сложные слова + +1. Neparlamentarna +2. Samozadosten +3. Nepristranski +4. Pretirano +5. Nepredušno +6. Nesreča +7. Razpršeno +8. Nesprejemljiv +9. Prekomeren +10. Prostovoljstvo +11. Izolirati +12. Trmast +13. Brezpogojno +14. Neodvisnost +15. Skupnost +16. Neizvedljiv +17. Nelegitimen +18. Nevzdržen +19. Preobremenjenost +20. Ogrevalni sistem +21. Preoblikovati +22. Nezaslišano +23. Neugoden +24. Prezasedenost +25. Nesreča +26. Neupravičeno +27. Mednaroden +28. Kompatibilnost +29. Neuspeh +30. Neobvladljiv +31. Neskončen +32. Neprimeren +33. Amortizacija +34. Koncentracija +35. Cirkulacija +36. Obremenitev +37. Gromozanski +38. Simbol +39. Vinjeta +40. Digitalizacija +41. Funkcionalnost +42. Rentabilnost +43. Ekshibicionizem +44. Frustracija +45. Neprilagodljiv +46. Severnoameriški +47. Ekskluzivnost +48. Preverjanje +49. Celoživljenjsko +50. Privlačnost +51. Periferija +52. Sokrivda +53. Kompromis +54. Strpnost +55. Racionalizacija +56. Birokracija +57. Odraslost +58. Stabilnost +59. Nepredvidljivost +60. Razkošje +61. Smrtnost +62. Obveščenost +63. Produktivnost +64. Neugodje +65. Zapletenost +66. Hegemonija +67. Umetnost +68. Tranzicija +69. Individualnost +70. Kontaminacija +71. Inkubacija +72. Prikrito +73. Etnični +74. Sovražnost +75. Atraktivnost +76. Nestrpnost +77. Divergenca +78. Digitalna pismenost +79. Stabilizacija +80. Raznolikost + +Слова с ошибками + + Kontamenacija + + Grommozanski + + Neobvladlliv + + Neparlametarna + + Nevrzdržen + + voina + + muzei + + ryba + + serebro + + televiziia \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sl_SI.txt b/Common/3dParty/hunspell/test/src/sl_SI.txt new file mode 100644 index 0000000000..3a2674932d --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sl_SI.txt @@ -0,0 +1,210 @@ +Hiša +Sonce +Miza +Stol +Ptica +Trava +Drevo +Noč +Luna +Morje +Gora +Cvet +Riba +Rdeča +Modra +Zelena +Rumena +Bela +Črna +Kamen +Pes +Mačka +Roka +Noga +Glava +Oči +Uho +Nos +Usta +Jabolko +Hruška +Sliva +Jagoda +Malina +Lubenica +Kruh +Mleko +Sir +Mesnica +Sadje +Zelenjava +Voda +Zrak +Ogenj +Sneg +Dež +Oblak +Veter +Zima +Poletje +Jesen +Pomlad +Zajec +Lisica +Volk +Medved +Lev +Tigrica +Slon +Konj +Krava +Ovca +Piščanec +Jajce +Mleko +Kava +Čaj +Sok +Vino +Pivo +Hrana +Pecivo +Testo +Marmelada +Kruh +Sir +Olje +Sol +Poper +Sladkor +Kava +Čaj +Vino +Pivo +Šola +Učitelj +Učenec +Knjiga +Pisarna +Računalnik +Telefon +Glasba +Slika +Film +Gledališče +Mesto +Vas +Trg +Cesta +Reka +Avtomatizacija +Razvoj +Komunikacija +Kompjuter +Programiranje +Elektronski +Inženiring +Elektrifikacija +Kombinacija +Sistem +Informacija +Univerza +Biblioteka +Univerzitetni +Laboratorij +Raziskava +Razvojna +Inovacija +Intelektualni +Integriteta +Izobraževanje +Izvajanje +Preverjanje +Tehnologija +Implementacija +Program +Sodelovanje +Proizvodnja +Industrija +Organizacija +Administracija +Proaktivnost +Kreativnost +Projektni +Razumevanje +Kvaliteta +Upravljanje +Ocenjevanje +Statistika +Kompetentnost +Konsolidacija +Realizacija +Kapaciteta +Distribucija +Kompatibilnost +Konceptualizacija +Povezava +Posodobitev +Fleksibilnost +Ekonomija +Organiziranje +Konkurenca +Stabilnost +Ekologija +Osebnost +Zavzetost +Entuziazem +Motivacija +Avtorizacija +Kreacija +Akumulacija +Monotonija +Diferenciacija +Transformacija +Koncentracija +Inovativnost +Aktivnost +Vzpostavljanje +Reorganizacija +Kategorizacija +Partikularnost +Homogenost +Izjemenost +Generalizacija +Hierarhija +Koordinacija +Inspiracija +Evaluacija +Ustvarjalnost +Oblikovanje +Kompatibilnost +Konkretizacija +Proaktivnost +Identifikacija +Kapaciteta +Intervencija +Konsolidacija +Realizacija +Eksplozivnost +Abstrakcija +Individualnost +Integracija +Segmentacija +Asimilacija +Artikulacija +Kolaboracija +Asociacija +Stabilizacija +Kooperacija +Transformacija +Hšza +Kmojnikacija +Progrramiranjee +Elektornkski +Inženeirrng +Izzobraževanjee +Infomracija +Razvoojnaa +Proizvdonja +Akitvnostt \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt b/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt new file mode 100644 index 0000000000..9002894db6 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt @@ -0,0 +1,227 @@ +кућа +пас +мачка +аутомобил +дрво +књига +школа +пријатељ +мама +тата +дете +јабука +чоколада +кафа +чај +телефон +телевизија +рачунар +музика +спорт +здравље +лепота +посао +љубав +срећа +време +новац +језик +земља +град +зима +лето +јесен +пролеће +море +планине +језеро +река +парк +животиња +птица +риба +дрво +злато +сребро +метал +стакло +ципеле +одећа +панталоне +кошуља +капа +капут +рука +нога +око +уво +нос +усне +зуб +глава +срце +мозак +краљ +краљица +принц +принцеза +дечак +девојчица +мушкарац +жена +старац +старица +доктор +медицинска сестра +наставник +ученик +студент +студенткиња +кувар +конобар +рат +мир +мапа +застава +смех +плач +сан +сањарење +посао +учење +уметност +позориште +биоскоп +музеј +црква +дворац +мост +улица +пут + +Сложные слова + +Конечно! Вот сто сложных слов на сербском языке на кириллице: + +1. Контраст +2. Компликација +3. Конструкција +4. Диспропорција +5. Корелација +6. Колаборација +7. Консервативан +8. Диференцијација +9. Експерименталан +10. Инвалидитет +11. Легитиман +12. Оптимизација +13. Компетентан +14. Документација +15. Персистентан +16. Апроксимација +17. Екстраваганција +18. Катастрафалан +19. Резервација +20. Прогресиван +21. Идентификација +22. Генерација +23. Криминалистички +24. Дестабилизација +25. Корумпиран +26. Конфронтација +27. Експлозиван +28. Функционалан +29. Релевантан +30. Квалификација +31. Акредитација +32. Петиција +33. Каустичан +34. Периодичан +35. Контроверзан +36. Гигантски +37. Принципијалан +38. Управоливост +39. Имунизација +40. Магнетичан +41. Оперативан +42. Десант +43. Хиерархија +44. Феминистички +45. Сегментација +46. Колоритан +47. Деградација +48. Диверзификација +49. Казуистички +50. Реципрочан +51. Манипулативан +52. Екстензиван +53. Колективни +54. Каузалитет +55. Синхронизација +56. Кампања +57. Товарни +58. Хируршки +59. Шампионат +60. Геостационаран +61. Опустошан +62. Клема +63. Стационарни +64. Секуларни +65. Исегментација +66. Дебелина +67. Прецизан +68. Рафиниран +69. Психолошки +70. Турбулентан +71. Интегритет +72. Идеолошки +73. Манифестација +74. Имплицитан +75. Хомогеност +76. Изолација +77. Хетерогеност +78. Спекулативан +79. Вагу +80. Математички +81. Гематолошки +82. Психијатријски +83. Блокада +84. Заплена +85. Монопол +86. Дисидент +87. Екстрадиција +88. Ревизија +89. Ваидан +90. Колонизација +91. Мотивација +92. Просек +93. Ресурс +94. Хуманизам +95. Дравски +96. Коалиција +97. Картеля +98. Резолуција +99. Менталитет +100. Епидемиологија + +С ошибками + + Колонизакаија + + Епидемиогија + + Казуистикаки + + Хуманкзам + + Манитулативан + + сањваење + + утење + + автомобил + + мекицинска сестра + + стукло \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt b/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt new file mode 100644 index 0000000000..48cd99d072 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt @@ -0,0 +1,173 @@ +ananas +anarhistički +antidepresiv +Anđeo +avion +banana +banka +belina +bespomoćnost +bibliotekar +bibliaoteikar +brod +citat +crkva +cvet +cveće +demokratija +demackratija +demokratizacija +Dobrota +dom +Dragi +ekran +eksperimentalni +eksplozija +epidemiologija +farmakologija +filantropija +flaša +frizura +fudbal +garaža +generalitet +geografski +globalizam +gnezdo +grad +građanstvo +grlo +hamburger +Harmonija +himalaji +hiperbola +hipotermija +hleb +Hrabrost +hrana +Hvala +igra +igračka +individualnost +infrastruktura +internet +inmternet +jabuka +jahač +jastuk +jednakost +jubilej +jurisprudencija +kafa +krevet +kriminalisticki +kriminalistika +kuća +kvantitativni +lampa +latiaratura +Lepota +lingvistika +literatura +ljubav +Ljubavi +ljubavnica +Ljubazan +Ljubim +lubenica +majica +majka +mašina +mikroorganizama +mikroskopija +Milost +Mir +Mirno +nacionalizam +nedopustiv +neurologija +novčanik +noć +nož +oktobar +okultizam +optimističan +optimističnost +ormar +Osoba +oči +pas +peškir +planina +poniženje +Porodica +Prijatelj +psihologija +psihoterapija +Radost +računar +reka +rekonvalescencija +reumatologija +revolucija +sendvič +Slatko +Sloboda +Slobodan +Snaga +socijalizacija +socijalizam +Spreman +Sreća +Srećan +Srećno +sunce +superiornost +Svetlost +tata +tehnologija +telefon +telekomunikacije +top +tradicionalni +ulica +univerzalnost +univerzitet +univirzdalnost +Usmena +Znanje +usta +Vedar +vegetarijanstvo +velikodušnost +voda +voz +Zabava +zavisnost +Zdravlje +zemlja +Zima +zjmlja +zločinački +zoološki +Zvezda +ćilim +čarapa +čarobnjak +časopis +čizme +đak +đevrek +đumbir +šešir +šišmiš +škola +šljiva +šuma +žaba +ženskara +žirafa +život +životinjski +žurka + diff --git a/Common/3dParty/hunspell/test/src/sv_SE.txt b/Common/3dParty/hunspell/test/src/sv_SE.txt new file mode 100644 index 0000000000..99b61d1576 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sv_SE.txt @@ -0,0 +1,210 @@ +Hus +Sol +Mjölk +Vatten +Fisk +Stol +Grön +Blomma +Träd +Katt +Hund +Bok +Cykel +Kaffe +Frukt +Kött +Fönster +Dörr +Säng +Lampa +Bord +Hår +Ögon +Hand +Fötter +Näsa +Mun +Öra +Huvud +Arm +Ben +Kläder +Hatt +Skor +Väska +Papper +Penna +Skrivbord +Telefon +Radio +Musik +Film +Teater +Konst +Sport +Spel +Resa +Bil +Tåg +Buss +Flygplan +Båt +Stad +Land +Hav +Sjö +Flod +Berg +Dal +Park +Skog +Sjukhus +Apotek +Skola +Universitet +Affär +Restaurang +Café +Hotell +Turist +Vän +Familj +Mamma +Pappa +Bror +Syster +Barn +Morfar +Mormor +Vänster +Höger +Framåt +Bakåt +Upp +Ner +Snäll +Osnäll +Glad +Ledsen +Trött +Stark +Svag +Tyst +Bullrig +Ren +Smutsig +Vacker +Ful +Liten +Stor +Komplexitet +Oproportionerlig +Ovillkorlig +Efterklokhet +Komplicerad +Desorientering +Konstellation +Otillgänglighet +Irreversibel +Förlåtelse +Overksamhet +Indifferent +Hierarki +Kombinatorik +Inkompatibilitet +Absorption +Konsekvens +Verklighetsfrånvänd +Retrospektiv +Förändringsbarhet +Ambivalens +Besvikenhet +Ineffektivitet +Intrikat +Dilemma +Hesitation +Absurditet +Kompromisslös +Konsolidering +Föresats +Tillfredsställelse +Delegering +Rekommendation +Detaljrikedom +Oanvändbar +Stagnation +Nostalgi +Hemlighetsfull +Avsaknad +Perseverans +Existentialism +Repetitivitet +Intolerans +Anonymitet +Obetydlig +Paradox +Förvirring +Juxtaposition +Reflektion +Självständighet +Kollision +Kreativitet +Djupgående +Abstraktion +Eufori +Autentisk +Insinuation +Omöjlig +Pessimism +Inkonsekvens +Revisionism +Sensationell +Obeveklig +Subjektivitet +Universalitet +Entropi +Omvälvande +Infiltration +Konservativ +Atypisk +Provokation +Konfrontation +Anarki +Konkurrenskraft +Defensivitet +Nihilism +Konklusion +Apori +Korrespondens +Prioritering +Exponentiell +Fragmentering +Aversion +Harmoni +Vanmakt +Signifikans +Katalysator +Förlust +Enhällighet +Ambition +Tendens +Alienation +Artificiell +Uppfyllelse +Psykosomatisk +Virtuos +Egensinnig +Anpassning +Hållbarhet +Konstitution +Kompleksitet +Oproporsjonerlig +Uvilkorlig +Etterklokhed +Komplisert +Desorientering +Konstelasjon +Utilgjengelighet +Irreversibel +Forlatelse diff --git a/Common/3dParty/hunspell/test/src/tr_TR.txt b/Common/3dParty/hunspell/test/src/tr_TR.txt new file mode 100644 index 0000000000..9ad60f3664 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/tr_TR.txt @@ -0,0 +1,205 @@ +Akşam +Almak +Altın +Anahtar +Anlamak +Araba +Atmak +Ayakkabı +Açmak +Ağaç +Bahçe +Bakır +Bakkal +Bakmak +Balık +Beyaz +Bilgisayar +Bilmek +Binmek +Bulmak +Ceket +Cevaplamak +Deniz +Dinlemek +Doktor +Duyurulmamış +Düzenleştirme +Düşmek +Düşünmek +Ekmek +Elbise +Eldiven +Elma +Erkek +Etek +Etmek +Ev +Eşarp +Gelgit +Geliştiricilikle +Geliştirilebilir +Geliştirme +Gerçekleştirme +Gezmek +Geçmek +Gitar +Gitmek +Giymek +Gri +Gömlek +Görülebilirlik +Görünümlü +Görünüşlü +Gözlük +Gümüş +Günaydın +Hareketlendi +Hareketlilik +Hava +Hayalperest +Hüzün +Kahve +Kahverengi +Kalabalıklar +Kalem +Kalkmak +Kalmak +Kapatmak +Kararlılık +Kararlılıkla +Kararsızlık +Kararsızlıkla +Karpuz +Kedi +Kemer +Kemdkcer +Kırmızı +Kitap +Kız +Kızgınmak +Koklamak +Koalye +Kolye +Konservatuvar +Konuşmak +Korkmak +Koymak +Koşmak +Kravat +Kullanılabilir +Kullanılmış +Kullanılmışlık +Kullanışlılık +Kurumsallaşma +Köpek +Küpe +Kütüphane +Mavi +Mazbut +Melankoli +Merdiven +Merhaba +Merhabalar +Meurhaba +Meydan +Meyhane +Meyve +Mor +Muhafazakar +Muhteşem +Mukadderatlarınızdanmışçasına +Muvaffak +Muzaffer +Muzafferiyet +Muzip +Mükemmeldik +Münasebet +Münzevi +Müsrif +Mütevazi +Müteessir +Mütercim +Mütereddit +Mütevazı +Müzmin +Okul +Okumak +Otobüs +Otoriterlik +Oynamak +Pantolon +Pasta +Pembe +Pembei +Plaj +Platin +Saat +Sandalye +Sarı +Satmak +Sevinmek +Sevmek +Sıcak +Sıradaymışız +Siyah +Sormak +Soymak +Soğuk +Su +Sükûnet +Sürrealist +Süt +Tabak +Tadına bakmak +Tatlı +Tavuk +Telefoncu +Televizyon +Temizlemek +Teşekkürler +Türkuaz +Tuirkuazu +Turuncu +Tutmak +Ulaştırılabilir +Uygulanabilir +Uyumak +Uçak +Yapmak +Yatak +Yazmak +Yemek +Yeşil +Yıkanmak +Yıldız +Yol +Yöneltilmezken +Yüzme +Yüzük +Zenginleştirmek +Çalışamamıştı +Çalışmak +Çalışmamıştır +Çanta +Çay +Çıkarmak +Çiçek +Çorap +Özelleştirilmiş +Özelleştirme +Özgürleştirme +Üzülmek +İnmek +İsteksizlik +İsteksizlikle +İstikrarlı +İstikrarlılık +İstisnai +İslamiyetle +İzlemek +İçmek +İşbirliği +İşitmek +Şapka +Şemsiye diff --git a/Common/3dParty/hunspell/test/src/uk_UA.txt b/Common/3dParty/hunspell/test/src/uk_UA.txt new file mode 100644 index 0000000000..b139dedfbd --- /dev/null +++ b/Common/3dParty/hunspell/test/src/uk_UA.txt @@ -0,0 +1,210 @@ +абдукція +абіогенез +амбівалентнасть +амбівалентність +анахранізм +анахронізм +антропогенез +антропологія +антропоморфізм +апатія +археологія +архетип +аскетизм +астрономія +афект +бачити +бігти +білий +біллий +біологія +бувай +будинок +будь ласка +бути +важко +велиикий +великий +веселка +взяти +вибачте +відчувати +вода +волюнтаризм +втаємниченість +вчитися +гарний +гарячий +гегемонія +географія +герменевтика +герменевтика +гештальт +говорити +гойдалка +готувати +грати +дати +дедукція +деконструктивізм +деконструкція +демаркація +детермінізм +дзвіночок +дивитися +дисгарммонія +дисгармонія +дисфункція +дисфункця +дихотомія +до побачення +добрий +доктрина +думати +дурний +дурня +дякую +евфемізм +езотерика +ей +екзистенціалізм +екзистенціалізм +екзистенцілізм +екзистенція +економіка +емерджентність +ентелехія +епістемологія +ефемерність +ефемерність +занепадництво +звісно +здоровий +зелений +йти +ілюзорність +ілюзорність +імплікація +інвектива +індукція +інтроспекціїя +їсти +історія +каблучка +кава +казус +калюжа +катарсис +каченя +каштани +квітка +кішка +класно +книга +когнітивістика +комаха +консенсус +космогенез +купувати +легко +лінгвістика +літати +маленький +марнослів'я +математика +мати +метаморфоза +метелик +метелиця +містифікація +місто +могти +можливо +мусити +насправді +не радий +незворушність +ні +нігілізм +новий +нонсенс +ностальгія +павучок +парадокс +пес +писати +пити +піти +плавати +плакати +повільний +поганий +політологія +постмодернізм +потворний +працювати +привіт +прийти +психоаналіз +птах +радий +ремінісценція +рефлексія +робити +розбурхання +розумний +сильний +сингулярність +синестезія +синій +синішй +синкретизм +сказати +скатертина +слабкий +слухати +сміятися +сніг +соліпсизм +соломинка +сонечко +сонце +соціологія +спати +співати +справді +старий +структуралізм +сумний +так +так +танцювати +телефонувати +тож +трансцендентність +фантастично +фаталізм +фемінізм +феномен +феноменологія +фізика +філософія +фрактал +хворий +хімія +хліб +хліб +ходити +холодний +хотіти +чао +червонй +червоний +черевики +читати +чорнй +чорний +чути +швидкий +щасливий +яблуко diff --git a/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt b/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt new file mode 100644 index 0000000000..b92bea172f --- /dev/null +++ b/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt @@ -0,0 +1,262 @@ +Mарт +Ёз +Ём +Ёхуд +Август +Адвакат +Адреси +айтган-лирангиз +айқин +амалга +анча +Апрел +арзонроқ +аҳамият +аҳднома +бажарилади +бажарилди +баланд +ихтисослан +банкрот +баҳона +Баҳор +бераман +берасизми +беринг +бериш +бешинчи +биз +Бизга +Бизнинг +билан +Бирор +Бозорнинг +бор +бошқа +Бу +Бугун +будингиз +бунга +бундай +Бухгалтерлик +бўлади +бўладими +бўлиши +бўлмаган +бўлса +бўш +бўшайди +бўшатасиз +вазифасига +вазият +вариант +вақт +газетадаги +газетадан +даромад +Декабрь +Душанба +Эрталаб +Етказиб +Жисмоний +Жуда +Жума +зарур +зиёфат +Ижара +ижарага +икки +Илтимос +Индинга +информатизациялари +Иситгич +иши +ишлатсак +Ишхона +Июль +Июнь +Йўқ +йил +йилдан +кам +Шинамгина +кампанияси +келдим +келишимдан +келмоқчи +келсам +келтириш +керак +керакдир +керакми +кета-ди +кеч +Кеча +кечага +Кечаси +Кечир +Кечирдинг +кирла +кирадими +кондиционер +коррупциядир +кран +Куз +Кун +куни +кўрмоқчи +кўчиб +лойиҳа +Май +маълумоти +маълумотларни +Маъмурият +маъруза +Мен +музлатгич +мумкин +муфмкин +мутахассис +мушовир +муҳим +нарса +нархи +Нархини +нақд +ўшанақасини +неча +Номардлик +Ноябри +интернетдаги +ойнаси +ойнинг +Октябри +олдин +олдиндан +олмаймиз +олмоқчи +орқали +шоти +шорти +Оқшом +пайдо +Панжшанба +пулини +Раҳмат +резюме +реклама +Салом +Сармоядор +Сентябрь +Сешанба +Сиз +сизга +сизда +Сизнинг +синган +сифатида +совуқ +софвуқ +Солиқларни +Статистик +сўм +тажрибали +тайёргарлик +тайёрладик +тайёрладингизми +таклиф +талафот +талафоти +таъминловчилардан +танишинг +таржимон +тарржимон +тахминан +ташкил +Телефонни +технология +Безантирани +тозалан +тозалигига +Тонгда +топширишимиз +топшириқ +турли +турмоқчи +тутсак +Тушлик +ўладиганингиз +тўлай +тўлаймиз +тилдиришинг +тўлиқ +уйингиз +уйни +уч +учун +ўқидим +фақат +Феврал +хабар +Хайрли кун +Мотамхонаси +хонлик +Чек +Чоршанба +Шанба +шарт-номани +шартини +шартлар +шартлари +шартни +шартнома +шахс +шовқин +Шом +Шу +эди +Эртага +Эртадан сўнг +Эшитишимга +эълон +эълонингиз +эълонингизни +эътироф +Юклаш +Якшанба +Январи +Ярим кеча +яхши +қабул +қаерда +Қанақа +қаноатманда +қанча +қачон +қизиқарлидир +қиламиз +қилганим +қилдим +қилинг +қилинди +қилишди +қиммат +қиммати +Қимматидан +қирқ +Қиш +қувонарлими +қўнғироқ +Қўшимча +ҳайвонини +ҳам +ҳамза +Ҳар +ҳафтага +ҳақиқатан +ҳисоблаб +Ҳозир +ҳужжатни +Ўтган кун + + diff --git a/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt b/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt new file mode 100644 index 0000000000..ee6a1d9356 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt @@ -0,0 +1,200 @@ +Salom +Sallom +Rahmat +Rhmat +Iltimos +Iltimo +Kattalar +Kattalarvf +Yaxshi +Yashi +Kelajak +Keljajak +Oilaviy +Oilaaviy +Qarindosh +Qarinndosh +Shahar +Shaha +Dengiz +Dengizzz +Quyosh +Quyyosh +Yulduz +Oyim +Kechqurun +Tushun +Suvchi +Sharob +Choyxona +Nonushta +Tushlik +Muzqaymoq +Desert +Tuzluq +Mevalar +Sabzavot +Baliq +Tuxumli +Sabza +Sariq +Salatlar +Shirinlik +Shokolad +Rishta +Kakao +Pishloq +Tort +Qaymoq +Sutli +Qatiq +Salomatlik +Temir +Zahar +Oqimli +Shamol +Olov +Yer +Osmon +Shanba +Dushanba +Seshanba +Chorshanba +Payshanba +Juma +Yakshanba +Oltin +Tong +Bomdod +Asr +Shom +Kun +Oqsoqol +Shoshqaloq +Kulgili +Muxlislilar +Tavsiflash +Tuzilishga +Mustaqillik +Tushuntirish +Boshqarish +Mashhurlik +Tarkibiy +Tahlil +Ishchi +Xalqaro +Tarjima +Mustahkamlik +Chaqaloq +Istiqbol +Tasvir +Taklif +Tasavvur +Jiddiy +Majburiyat +Asosiy +Tahdid +Tushunmovchilik +Ishonch +Maqomi +Ijodkor +Tadbirkor +Hayotiy +Mashhur +Bemorlik +Tadbir +Jismoniy +Madaniyat +Xavfsizlik +Sifatli +Suvli +Sotuvchi +Chetel +Tashqi +Sotuv +Tarbiyalanish +Murabbo +Sariqcha +Qovun +Shaharlik +Muhimlik +Tarbiyachilik +Xatolik +Balandlik +Yuzaki +Kuyov +Qiziquvchan +Orzular +Mashq +Qalampir +Muammo +Sadoqatli +Yovuzlik +Fikr-mulohaza +Boylik +Tushuncha +Zanjir +Eslatma +Tabassum +Ishonuvchi +Chidamlilik +Ilova +Birodarlik +Oqilona +Ijodiyot +Tayanch +Hurmat +Baxtli +Tajriba +Samimiylik +Shifokor +Ishrat +Baho +Namoyish +Qiyinchilik +Bolalar +Ishonchli +Taqdir +Shovqinli +Xalqaro +Baxt +Fursat +Hurmatli +Qulaylik +Zamonaviy +Sadoqat +Sabr +Nikoh +Jasorat +Barkamollik +Dunyoqarash +Omadli +Foydali +Yorqin +Mehribonlik +Fazilatli +Kutubxona +Istiqomatli +Fido +Bahor +Shafqatsizlik +Tafakkur +Fazilat +Qochish +Laziz +Uzoq +Ilhom +Omad +Hurmatli +Tandir +Sherzod +Bahoriy +Dilshod +Baxtli +Shonli +Nurli +Shafqatsizlik +Oqqush +Boylik +Toza +Sabrli diff --git a/Common/3dParty/hunspell/test/src/vi_VN.txt b/Common/3dParty/hunspell/test/src/vi_VN.txt new file mode 100644 index 0000000000..2982e9eb45 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/vi_VN.txt @@ -0,0 +1,128 @@ +Bánh +Bang +bênh +bướng +bậy +Chanh +chum +chuyện +chép +Chùng +chắp +chệnh +chới +chữ +công +cạc +cột +cứu +Doanh +duyên +dùng +dể +dọng +gia +giày +giêng +Giảng +giềng +hon +Hoẳn +Hài +hôm +hước +hấu +hớt +hữu +Khiển +Khoào +khuya +khuyến +khách +khén +khẩn +khắp +khựng +kẻo +lang +liền +Loàng +Luỗng +lình +lương +lấp +lệnh +lịnh +lốn +lời +lựng +Muộn +Mãnh +mại +mạn +mổ +mởn +nghiễm +nghều +Ngoáy +Nguyên +ngóp +người +ngỏ +ngớp +ngụa +ngửng +nhiếp +nhu +nhà +nhân +Nhóm +nhưỡng +nhắm +nhổn +nhứt +ninh +noi +nãy +nạn +nốt +ong +pao +phiên +phiêu +Phên +Phương tiện +phẩm chất +phố đi bộ +quan trọng +quyền lợi +quán cà phê +quảng cáo +Quốc +Quốc tế +riêng biệt +rưỡi +Rải +Rẻng +rộng rãi +siễn +sum +Sõng +Sưu +sưu tập +sử dụng +Thiệt thòi +Thuộc về +thuộc tính + +Слова с ошибками +thiệte +quốq tế +nguên +khoao +chenh +chhùng +man +doah +khien +ngoay \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/test.pro b/Common/3dParty/hunspell/test/test.pro new file mode 100644 index 0000000000..2dee3f6970 --- /dev/null +++ b/Common/3dParty/hunspell/test/test.pro @@ -0,0 +1,29 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2015-07-21T18:28:42 +# +#------------------------------------------------- + +QT -= core gui + +TARGET = test +CONFIG += console +CONFIG -= app_bundle + +DEFINES += KERNEL_USE_DYNAMIC_LIBRARY + +TEMPLATE = app + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD +include($$CORE_ROOT_DIR/Common/base.pri) +include($$CORE_ROOT_DIR/Common/3dParty/icu/icu.pri) + +ADD_DEPENDENCY(UnicodeConverter kernel hunspell) + +core_windows:LIBS += -lgdi32 -ladvapi32 -luser32 -lshell32 +core_linux:LIBS += -lz + +SOURCES += main.cpp + +DESTDIR = $$PWD/build From 9c2e696710010271b9d332551711d6d317b2e74d Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Thu, 29 Feb 2024 19:59:39 +0300 Subject: [PATCH 026/117] Add words --- Common/3dParty/hunspell/test/src/en_US.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Common/3dParty/hunspell/test/src/en_US.txt b/Common/3dParty/hunspell/test/src/en_US.txt index a806686cda..f910ca76ce 100644 --- a/Common/3dParty/hunspell/test/src/en_US.txt +++ b/Common/3dParty/hunspell/test/src/en_US.txt @@ -210,4 +210,7 @@ Haudlin Mavkish Mendocious Mitaphysical - +timeline +rollout +workshopped +deliverables From b71ed594da18ce1f2a330f4aa9f31bca340cd2e2 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Thu, 29 Feb 2024 20:03:36 +0300 Subject: [PATCH 027/117] Add tests result --- .../3dParty/hunspell/test/dst/az_Latn_AZ.txt | 213 ++++++++++++++ Common/3dParty/hunspell/test/dst/bg_BG.txt | 212 ++++++++++++++ Common/3dParty/hunspell/test/dst/ca_ES.txt | 112 ++++++++ .../hunspell/test/dst/ca_ES_valencia.txt | 212 ++++++++++++++ Common/3dParty/hunspell/test/dst/cs_CZ.txt | 206 ++++++++++++++ Common/3dParty/hunspell/test/dst/da_DK.txt | 129 +++++++++ Common/3dParty/hunspell/test/dst/de_AT.txt | 131 +++++++++ Common/3dParty/hunspell/test/dst/de_CH.txt | 116 ++++++++ Common/3dParty/hunspell/test/dst/de_DE.txt | 211 ++++++++++++++ Common/3dParty/hunspell/test/dst/el_GR.txt | 123 ++++++++ Common/3dParty/hunspell/test/dst/en_AU.txt | 116 ++++++++ Common/3dParty/hunspell/test/dst/en_CA.txt | 125 +++++++++ Common/3dParty/hunspell/test/dst/en_GB.txt | 122 ++++++++ Common/3dParty/hunspell/test/dst/en_US.txt | 218 +++++++++++++++ Common/3dParty/hunspell/test/dst/en_ZA.txt | 114 ++++++++ Common/3dParty/hunspell/test/dst/es_ES.txt | 208 ++++++++++++++ Common/3dParty/hunspell/test/dst/eu_ES.txt | 132 +++++++++ Common/3dParty/hunspell/test/dst/fr_FR.txt | 211 ++++++++++++++ Common/3dParty/hunspell/test/dst/gl_ES.txt | 120 ++++++++ Common/3dParty/hunspell/test/dst/hr_HR.txt | 215 ++++++++++++++ Common/3dParty/hunspell/test/dst/hu_HU.txt | 114 ++++++++ Common/3dParty/hunspell/test/dst/id_ID.txt | 121 ++++++++ Common/3dParty/hunspell/test/dst/it_IT.txt | 200 +++++++++++++ Common/3dParty/hunspell/test/dst/kk_KZ.txt | 209 ++++++++++++++ Common/3dParty/hunspell/test/dst/ko_KR.txt | 157 +++++++++++ Common/3dParty/hunspell/test/dst/lb_LU.txt | 118 ++++++++ Common/3dParty/hunspell/test/dst/lt_LT.txt | 127 +++++++++ Common/3dParty/hunspell/test/dst/lv_LV.txt | 205 ++++++++++++++ Common/3dParty/hunspell/test/dst/mn_MN.txt | 103 +++++++ Common/3dParty/hunspell/test/dst/nb_NO.txt | 113 ++++++++ Common/3dParty/hunspell/test/dst/nl_NL.txt | 115 ++++++++ Common/3dParty/hunspell/test/dst/nn_NO.txt | 116 ++++++++ Common/3dParty/hunspell/test/dst/oc_FR.txt | 108 ++++++++ Common/3dParty/hunspell/test/dst/pl_PL.txt | 225 +++++++++++++++ Common/3dParty/hunspell/test/dst/pt_BR.txt | 108 ++++++++ Common/3dParty/hunspell/test/dst/pt_PT.txt | 135 +++++++++ Common/3dParty/hunspell/test/dst/ro_RO.txt | 210 ++++++++++++++ Common/3dParty/hunspell/test/dst/ru_RU.txt | 197 +++++++++++++ Common/3dParty/hunspell/test/dst/sk_SK.txt | 205 ++++++++++++++ Common/3dParty/hunspell/test/dst/sl_SI.txt | 210 ++++++++++++++ .../3dParty/hunspell/test/dst/sr_Cyrl_RS.txt | 227 +++++++++++++++ .../3dParty/hunspell/test/dst/sr_Latn_RS.txt | 173 ++++++++++++ Common/3dParty/hunspell/test/dst/sv_SE.txt | 210 ++++++++++++++ Common/3dParty/hunspell/test/dst/tr_TR.txt | 205 ++++++++++++++ Common/3dParty/hunspell/test/dst/uk_UA.txt | 210 ++++++++++++++ .../3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt | 262 ++++++++++++++++++ .../3dParty/hunspell/test/dst/uz_Latn_UZ.txt | 200 +++++++++++++ Common/3dParty/hunspell/test/dst/vi_VN.txt | 128 +++++++++ 48 files changed, 7957 insertions(+) create mode 100644 Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt create mode 100644 Common/3dParty/hunspell/test/dst/bg_BG.txt create mode 100644 Common/3dParty/hunspell/test/dst/ca_ES.txt create mode 100644 Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt create mode 100644 Common/3dParty/hunspell/test/dst/cs_CZ.txt create mode 100644 Common/3dParty/hunspell/test/dst/da_DK.txt create mode 100644 Common/3dParty/hunspell/test/dst/de_AT.txt create mode 100644 Common/3dParty/hunspell/test/dst/de_CH.txt create mode 100644 Common/3dParty/hunspell/test/dst/de_DE.txt create mode 100644 Common/3dParty/hunspell/test/dst/el_GR.txt create mode 100644 Common/3dParty/hunspell/test/dst/en_AU.txt create mode 100644 Common/3dParty/hunspell/test/dst/en_CA.txt create mode 100644 Common/3dParty/hunspell/test/dst/en_GB.txt create mode 100644 Common/3dParty/hunspell/test/dst/en_US.txt create mode 100644 Common/3dParty/hunspell/test/dst/en_ZA.txt create mode 100644 Common/3dParty/hunspell/test/dst/es_ES.txt create mode 100644 Common/3dParty/hunspell/test/dst/eu_ES.txt create mode 100644 Common/3dParty/hunspell/test/dst/fr_FR.txt create mode 100644 Common/3dParty/hunspell/test/dst/gl_ES.txt create mode 100644 Common/3dParty/hunspell/test/dst/hr_HR.txt create mode 100644 Common/3dParty/hunspell/test/dst/hu_HU.txt create mode 100644 Common/3dParty/hunspell/test/dst/id_ID.txt create mode 100644 Common/3dParty/hunspell/test/dst/it_IT.txt create mode 100644 Common/3dParty/hunspell/test/dst/kk_KZ.txt create mode 100644 Common/3dParty/hunspell/test/dst/ko_KR.txt create mode 100644 Common/3dParty/hunspell/test/dst/lb_LU.txt create mode 100644 Common/3dParty/hunspell/test/dst/lt_LT.txt create mode 100644 Common/3dParty/hunspell/test/dst/lv_LV.txt create mode 100644 Common/3dParty/hunspell/test/dst/mn_MN.txt create mode 100644 Common/3dParty/hunspell/test/dst/nb_NO.txt create mode 100644 Common/3dParty/hunspell/test/dst/nl_NL.txt create mode 100644 Common/3dParty/hunspell/test/dst/nn_NO.txt create mode 100644 Common/3dParty/hunspell/test/dst/oc_FR.txt create mode 100644 Common/3dParty/hunspell/test/dst/pl_PL.txt create mode 100644 Common/3dParty/hunspell/test/dst/pt_BR.txt create mode 100644 Common/3dParty/hunspell/test/dst/pt_PT.txt create mode 100644 Common/3dParty/hunspell/test/dst/ro_RO.txt create mode 100644 Common/3dParty/hunspell/test/dst/ru_RU.txt create mode 100644 Common/3dParty/hunspell/test/dst/sk_SK.txt create mode 100644 Common/3dParty/hunspell/test/dst/sl_SI.txt create mode 100644 Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt create mode 100644 Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt create mode 100644 Common/3dParty/hunspell/test/dst/sv_SE.txt create mode 100644 Common/3dParty/hunspell/test/dst/tr_TR.txt create mode 100644 Common/3dParty/hunspell/test/dst/uk_UA.txt create mode 100644 Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt create mode 100644 Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt create mode 100644 Common/3dParty/hunspell/test/dst/vi_VN.txt diff --git a/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt b/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt new file mode 100644 index 0000000000..5365bb7974 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt @@ -0,0 +1,213 @@ +A [Ü, Ha, Ağ, Ac, Ad, Da, Fa, Ah, Ka, Al, An, Na, Qa] +qocalmaq [almayacaq, almamaq] +Alderaan'ın [Federasiyanın] +hamısı +həmçinin +Və +cavab +dir +incəsənət +kimi +da +uzaq +körpə +zirzəmi [zəmində] +ol +olub +doğuldu [doğulduğu, doğurduğu] +bulvar [bunlar] +fasilə +nəsllər [nəsillər, nəsnələri, nəslə, nələrlə, səslər] +gəlin +lakin +al +ilə +Kaliforniya [Kanalizasiya] +Kalifornikasiya [Kommunikasiya] +bilər +kartlar +şans +Çin +çənə [dənə, çəkə, mənə, nənə, sənə, tənə, çənəyə] +klublar +Cobain [] +bürc [borc, gürcü] +nəzarət +qiymət +edə bilməzdim [bilməzdim] +yaratmaq +lənət +rəqs +saziş +sövdələşmələr [məsləhətləşmələr] +dağıdıcı +almazlar [almanlar, almaz lar, almaz-lar, almaları, marallar, mallara] +etməz +etməyərik [etmərik, etmədikləri] +arzu +xülyalar [yalanlar] +Şərq +kənar +kənarları [kənar ları, kənar-ları, kənarına, kənarında, kəlamları, aparılarkən] +məmnunluq +hamının +uzaq +peri [şeri, geri, meri, yeri] +solğun [dolğun] +üz +son +tap +ilk +üçün +-dan [-dam, -da, -an, -dana, -adan, -nda, -daş, -dən, -dağ, -can, -dad, -din, -lan, -don, -qan, adan, andan] +sərhəd +qız +qızın +yaxşı +gitara [artaraq] +əl +hardcore [hardadır] +var +yoxdur +o [od, ol, on, ot, ov, ox, ü, ı] +eşitmək +ürək +O'nun [Onun, Oyununu] +ona +gizli +yüksək +ona +onun +Hollivud [Holland] +Mən +Mənəm +əgər +içində +məlumat +içində +dir +bu +jack [janra] +sadəcə +kral +qohum +bilmək +qoyulmuş +qanun +yerləşdirilmək [yerləşdirilməsi, yerləşdirilmiş, yerləşdirilib, yerləşdirildiyini] +qurğuşun [quruluşunun] +aparmaq +yerləşdirilmə [yerləşdirilməsi, yerləşdirilmiş, yerləşdirilib, yerləşdirildiyini] +məkan +sevmək +şans +edilmiş +adam +çox +Evlənmək +maska [masa, marka] +o bilər [bilərlər, bilər] +bəlkə də [bəlkə] +mənası +mən +meditasiya [dissertasiya] +xatirə +ağılın +pul +mənim +heç vaxt [vaxtsa] +deyil +heç nə [heçə] +nömrələr [nömrələri, nömrə lər, nömrə-lər, nömrəli, nömrə] +of [od, əf, ol, on, ot, ov, ox, ofis] +of [od, əf, ol, on, ot, ov, ox, ofis] +üstündə +bir +yalnız +və ya [vəla] +nəticə +öz +Ödə [Də, Ədə, Adə, Edə, Idə, Öndə, Ölə, Önə] +Şəftəli [Həftəlik] +yerlər +oynayır +oynamaq +əhali +porno [sponsor] +tərifləmək [təriflər, təklifləri, təkliflərlə, təkliflərə] +ehtimal ki [ehtimal] +ehtimal +psixik [psixi, psixoloji] +kraliça [kralı] +qaldırmaq +qalan +hörmət +qalxmaq +yol +xam +müqəddəs +Xilas et [Xilası] +elmi +çığırmaq [çağırmaq, çıxarmaq] +satılır +şəkil +xəstələnmək [xəstələnməyi, dəstəklənməsi] +gümüşçü [gümüş] +dəri +əsgər +bir şey [şeydir] +Mahnı +mahnılar +qılınclar [qılınc lar, qılınc-lar, qılıncı] +büyü [böyüyü] +casuslar [ruslar] +ulduz +Stansiya +oğurlamaq [vurğulamaq] +daşlar +günəş +şübhəli +İsveç +qılınclar [qılınc lar, qılınc-lar, qılıncı] +yeniyetmə +test +dandan [andan, candan, qandan, yandan, danışanda, adından, yanından, canından] +bu ki [builki] +bu ki [builki] +bu +onların +bu +onlar +düşünmək +bu +onlar +gel-git [get-gedə] +üçün +deyilmişəm [deyilmiş əm, deyilmiş-əm, deyilmişdi, deyilmiş, deyilmi, deyiləm] +çox +cəhd et [cəhdlər] +başa düşdüm [] +qilin [ilin, bilin, dilin] +titrəmək [itirməmək, itirmək] +mübarizə aparır? [] +istəyirəm +müharibə +idi +dalğalar [qadağalar, dağlarda, adalar, dağlar] +geymək [getmək, getməmək] +silahlar +yaxşı +idarə olunan [olunanlardan] +Qərbi [Hərbi, Qəbri, Qərb, Qərbin, Qəbir, Qərbə, Qəlbi] +nə +arasında +qalib gəlmək [qaliblərin] +qalib gəlir [qalibləri] +ilə +qadın +dünya +səhv +siz +sizə +sənsən [səndən, sən sən, sən-sən, nədənsə, mənsə, sənə, səslənən] +sənin diff --git a/Common/3dParty/hunspell/test/dst/bg_BG.txt b/Common/3dParty/hunspell/test/dst/bg_BG.txt new file mode 100644 index 0000000000..57cc73c5c7 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/bg_BG.txt @@ -0,0 +1,212 @@ +A [А, Е, О, И, В, С, Я, У] +остаряване +Алдераан [Дерайлиран] +всичко +също +и +отговор +са +изкуство +като +в +далеч +бебе +мазе +бъда +било +роден +булевард +почивка +породи +невеста +но +купувам +от +Калифорния +Калифорникация [Калифорнийския, Калифорнийка, Калифорния] +може +карти +шанс +Китай +брадичка +клубове +Кобейн [Кобен] +съзвездие +контрол +цена +не можех [можехме] +създаване +проклятие +танц +сделка +сделки +унищожение +диаманти +не прави [неправи, неуправии, неправдиви] +не правим [непоправим] +мечта +мечти +Изток +ръб +ръбове +екстаз +всеки +далеч +приказка +избледнява +лица +краен +намирам +първи +за +от +предел +момиче +момичето +добре +китара +ръка +хардкор [хардуер] +има +няма +той +чуя +сърце +той е [той] +нейни +скрит +висок +него +негов +Холивуд +аз +аз съм [разсъмна] +ако +в +информация +вътре +е +това е [товарен] +вале +просто +крал +родственик +знам +определен +закон +поставям +водя +води +местоположение +обичам +късмет +направен +човек +много +Ожени се [Брожение] +маска +май +може би [можещи] +означава +аз +медитация +спомен +ума +пари +моя +никога +не +нищо +числа +от +изключен +на +един +само +или +изход +свой +Плати +праскова +места +играе +играя +население +порно [бурно, орно, порено, опорно, спорно, упорно, порна, парно, порне, поено, порни, потно, торно, морно, горно] +похвала +вероятно +вероятен +психичен +кралица +въздигам +останал +почит +възход +път +груб +светия +Спасявам +наука +крясък +продава +форма +по-болен +златар +кожа +войник +някаква +Песен +песни +пикове +заклинание +шпиони +звезда +стация [станция, стария, статия, стадия, атестация, стагнация] +крада +камъни +слънце +подозрителен +Швеция +мечове +тийнейджър [тинейджър, пейджър] +тест +отколкото +това +това е [товарен] +на +техни +тези +те с [тесте] +мисли +този +той +прилив +до +каза +също +опитайте +разбрано +еднорог [едно рог, еднороден] +вибрация +водене? [водене, неводен, воден] +искам +война +беше +вълни +носете +оръжия +Ами +бяха +Западна +какво +докато +победа +победи +със +жена +свят +грешка +ти +ти би [табиети] +ти си [тифуси] +вашият diff --git a/Common/3dParty/hunspell/test/dst/ca_ES.txt b/Common/3dParty/hunspell/test/dst/ca_ES.txt new file mode 100644 index 0000000000..be726d0d8a --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ca_ES.txt @@ -0,0 +1,112 @@ +amor +llum +lluum [lluu, llum, lluus, lluïm, lluu m] +esperança +espirança [esperança, espirant, espinçadora, espinça, espira] +llibertat +força +forrça [forra, força, forçar] +pau +somni +llibre +mar +amistat +cançó +flor +cel +estrella +temps +camí +vent +muntanya +mumntanya [muntanya, muntanyà, muntant] +riu +soroll +silenci +viatge +foc +gel +paraula +vida +dia +nit +tarda +matí +lluna +sol +llac +marbre +ferro +sal +mel +sucre +peix +ocell +oceoll [ocell] +joc +ritme +melodia +pintura +pentura [puntera, entura, pintura, puntura, ventura, penetrant, apertura, parapent] +teatre +dansa +poema +història +llegenda +mitologia +festa +música +vi +cervesa +cervessa [cervesa, cer vessa, cer-vessa, cerves sa, cerves-sa, cervesera, cerveseria, cerveser, cessava] +formatge +pa +ciutat +poble +natura +camp +bosc +platja +sorra +sorrà +pedra +ànima +cos +ment +cor +somriure +somriàre [somriure, somrient] +abraçada +bes +parla +oida [oidà, oïda, ioda, odia, aido, oia, oda, oiada, oxida, aida, sida, onda, mida, dida, vida] +vista +tacte +gust +olfacte +color +forma +número +lletra +sistema +regla +escola +universitat +univversitat [universitat, universitari, universalitat, universalitzat, universalista] +mestre +estudiant +sabiduria [sabuderia] +lliçó +pregunta +resposta +risposta [resposta, disposta, ris posta, ris-posta, risp osta, risp-osta, trasposta, posteritat, riosta, polvorista] +dubte +certesa +veritat +mentida +promesa +secret +descoberta +descaberta [descoberta, desca berta, desca-berta, descabestrat, descartable, descabota, descarta] +aventura +destinació diff --git a/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt b/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt new file mode 100644 index 0000000000..87fc1cc63b --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt @@ -0,0 +1,212 @@ +A +envellir +Alderaan [Aldebaran, Aldebrand, Aldeana, Anedera] +tot +també +I +resposta +és +art +com +a +lluny +nadó +celler +ser +ha estat [hastat] +nat +bulevard +pausa +generacions +núvia +però +comprar +amb +Califòrnia +Californication [Californiana, Californita] +pot +cartes +oportunitat +Xina +mentó +clubs +Cobain [Cobai, Cobais, Cobrin, Cob ain, Cob-ain, Cobalamina] +signe del zodíac [signé del zodíac, signè del zodíac, sígne del zodíac, sïgne del zodíac, signE del zodíac, Signe del zodíac, sIgne del zodíac, sigNe del zodíac, siGne del zodíac] +control +preu +no podria [nodriria, podriria, nodria] +crear +maleït +ballar +acord +negocis +destructiu +diamants +no fer [noosfera] +no fem [nomenem] +desitjar +somnis +Est +vora +voreres +satisfacció +tots +llunyà +fada +pallid [pallis, palli, pallin, pali] +cara +final +trobar +primer +per +de +frontera +noia +la noia [la noïa, la Noia] +bé +guitarra +mà +hardcore [recordar] +hi ha [hifa] +no hi ha [nó hi ha, nò hi ha, nO hi ha, No hi ha] +ell +sentir +cor +ell és [estellés] +seva +secret +alt +ell +seu +Hollywood +jo +sóc +si +en +informació +interior +és +és +jack +només +rei +parent +saber +fixat +llei +col·locar +plom +portar +col·locació +lloc +estimar +oportunitat +fet +home +molts +casar-se +màscara +podria +potser +sentit +jo +meditació +memòria +ment +diners +meu +mai +no +res +números +de +fora +sobre +un +només +o +resultat +seu +pagar +préssec +llocs +jugar +joc +població +porno +elogiar +probablement +probable +psíquic +reina +elevar +restant +respecte +pujar +camí +cru +sant +salvar +ciència +crit +vendre’s [vendre's, vendre] +figura +malalt +joier +pell +soldat +alguna cosa [glucosamina] +cançó +cançons +cims +encanteri +espies +estrella +estació +robar +pedres +sol +sospitós +Suècia +espases +adolescent +prova +que +que +això +seu +aqueixos +ells +pensar +aqueix +ells +marees +per +no he estat [nó he estat, nò he estat, nO he estat, No he estat] +molt +intentar +entendre +fer +tremolar +lluitar +desitjar +guerra +va ser [vaser, serva] +ones +portar +armes +bé +administrat +Oest +què +entre +guanyar +guanya +amb +dona +món +equivocat +tu +vostè +tu ets [tubets] +teu diff --git a/Common/3dParty/hunspell/test/dst/cs_CZ.txt b/Common/3dParty/hunspell/test/dst/cs_CZ.txt new file mode 100644 index 0000000000..916cc8419c --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/cs_CZ.txt @@ -0,0 +1,206 @@ +pomaliý [pomalý, pomaličku] +šťstný [šťastný] +smuutný [smutný, smutnu] +horcký [horký, horácký, horecký, horský, hornický, horňácký] +studiený [studený, studie] +záludnast [záludnost, záludný] +náhodillost [nahodilost, náhodnost] +úpěnlevý [úpěnlivý, úpletový] +rozspačitý [rozpačitý, rozpačitěný] +svéhllavý [svéhlavý, svéhlavička] +jablko +slunce +voda +dům +pták +káva +chleba +květina +kniha +pes +kočka +město +zelený +modrý +červený +bílý +černý +velký +malý +rychlý +pomalý +šťastný +smutný +horký +studený +nový +starý +hezký +ošklivý +dobrý +špatný +zdravý +nemocný +silný +slabý +chytrý +hloupý +pracovat +jíst +pít +spát +číst +psát +mluvit +smát se [smát] +plakat +zpívat +hrát +tančit +učit se [učitele] +nakupovat +vařit +telefonovat +dívat se [sedívat] +poslouchat +chodit +běžet +létat +plavat +psát +učit se [učitele] +dělat +mít +být +jít +přijít +odejít +dát +vzít +říct +vidět +slyšet +cítit +myslet +chtít +moct +muset +rád +nerad +ano +ne +prosím +děkuji +na shledanou [shledanou, dohledanou, shledávanou, ohledanou] +omlouvám se [omlouvání] +sbohem +ahoj +čau +hej +jo +fakt +super +blbost +paráda +no jo [nojo] +jasně +takže +vlastně +třeba +snad +leštěnka +pochmurný +živelný +ponaučení +záhada +pochybnost +nádhera +soucit +záludnost +náhodilost [nahodilost, náhodnost] +úpěnlivý +rozpačitý +svéhlavý +marnivost +blahodar [blaho dar, blaho-dar, lahoda] +rozčarování +odchylka +přelud +vytrvalost +neústupnost +lehkost +souznění +rozmarnost +roztržitost +úskočnost +rozkoš +marasmus +rozpolcenost +neúprosnost +ztřeštěnost +chmurnost +okouzlení +zářivost +vyrovnanost +neochvějnost +neúcta +bizarnost +rozmařilost +nepochopení +nevýslovný +pomíjivost +beznaděj +úzkost +odtažitost +rozerv [rozerve, rozervi, rozervu, rezerv, rozervat] +rozervanost +vyčerpanost +bezcitnost +záludnost +nezdolnost +rozkošátnost [rozkošnost, rozkošatěnost, rozkošnickost, rozkoktanost] +nezdolatelnost +rozmarnost +živelnost +bezútěšnost +záhadnost +neposkvrnitelnost [nepotiskovatelnost, nepopisovatelnost, nepřemostitelnost, nezvratitelnost] +rozkošnělost [rozkošatělost, rozkošnost, rozkošnickost, rozkošatěnost] +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +ztracenost +bezbřehost +rozervanost +opojení +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +ztracenost +bezbřehost +opojení +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +bezbřehost diff --git a/Common/3dParty/hunspell/test/dst/da_DK.txt b/Common/3dParty/hunspell/test/dst/da_DK.txt new file mode 100644 index 0000000000..b7a362e12d --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/da_DK.txt @@ -0,0 +1,129 @@ +Hej +Goddag +Tak +Ja +Nej +Måske +Mad +Vand +Hus +Bil +Tog +Cykel +Skole +Børn +Far +Mor +Søster +Bror +Hund +Kat +Fisk +Fugl +Træ +Blomst +Græs +Sol +Måne +Himmel +Regn +Sne +Sommer +Vinter +Forår +Efterår +Aften +Nat +Dag +Uge +Måned +År +Læse +Skrive +Tale +Lære [Lære, Læres, Lærer, Læren, Læreø, Læreå, læreå] +Arbejde +Sove +Vågne +Løbe +Gå +Sidde +Stå +Lytte +Se +Høre [Høre, Høres, Hører, Høreø, Høreå, høreå] +Spise +Drikke +Kød +Frugt +Grøntsager +Ost +Brød +Vand +Juice +Kaffe +Te +Mælk +Smør [Smør, Smøre, Smørs, Smør'] +Æg +Salt +Peber +Sukker +Bolle +Smørrebrød +Køkken +Stue +Soveværelse +Badeværelse +Toilet +Bord +Stol +Sofa +Lampe +Vindue +Dør +Gulv +Loft +Væg +Sofa +Pude +Tæppe +Badekar +Håndvask +Spejl +Håndklæde +Seng +Dyne +Dynee [Dynes, Dyner, Dyne, Dynen, Dynge, Dynees, Dynete, Dyneel, Dynele, Dyneed, Dyneeg, Dyneem, Dynefe, Dyneve] +Pude +Pudee [Pudene, Pudre, Puder, Pude, Pudes, Pudse, Puden, Pudet, Pudel] +Alarm +Alarmm [Alarm, Alarms] +Skrivebord +Stol +Hus +Hund +Kat +Katt [Kett, Katy, Katty, Kate, Kitt, Kata, Kato, Matt, Watt, Kat, Kast, Kats, Takt, Kart, Katte] +Bil +Skole +Skolee [Skolie, Skolede, Skoler, Skole, Skoles, Skolen, Skolet, Skolde] +Sol +Soll [Sol, Sole, Sols, Soli, Sola, Sall, Sold, Solo, Soul] +Vand +Vandd [Vanda, Vandy, Vandt, Vand, Vands, Vande, Vandr] +Mad +Madd [Mads, Maud, Mad, Made, Mand] +By +Barn +Barnn [Barni, Baran, Barny, Barn, Baren, Barns, Baron] +Tørklæde +Skæbne +Uafhængighed +Kærlighed +Kærligheed [Kærlighed, Ærlighed, Hæderlighed, Herlighed, Liderlighed] +overbelastning +Modstandsbevægelsen +Uafhængighedserklæringen +Forårssommertemperaturen +Stabiliseringsperioden diff --git a/Common/3dParty/hunspell/test/dst/de_AT.txt b/Common/3dParty/hunspell/test/dst/de_AT.txt new file mode 100644 index 0000000000..060081d011 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/de_AT.txt @@ -0,0 +1,131 @@ +Ägyptologie +Ährenamt [Ährensamt, Ährenast, Ährenart, Ährenact, Ährenabt, Ährenakt, Ährenaxt, Ehrenamt, Ohrenamt, -ährenamt, Ährenartig] +Ängstlichkeit +Äquatoria +Abarbeiten +Abbild +Abbilden +Abbildungs [Abbildung, Abbildungs-, Bildungsnah, Unbildung] +Abbreviatur +Abbrüche +Abfassen +Abfertigen +Abfolge +Abfuhr +Ableugnen +Ablichten +Ablöse +Absätze +Abschnitts +Abwechseln +Abwehren +Aktiv +Britannia +Browserfenster +Budgetieren +Bugpartie +Bukarester +Burgundersoße +Butterkrem +Button +Cabriolet +Campanile +Canapé +Caprice +Celsius +Chamäleon +Charakteristik +Chronometer +Chronometrie +Cölln +Connectzustände +Cursorspur +Däne +Dachs +Dahindämmern +Darbringen +Daten +Datenbankserver +Desktopsystem +Detektivfilm +Dichtertum +Dinosaurier +Direktion +Diskantgambe +Diskothek +Druckereicode +Kapsel +Karausche +Katzen +Klinge +Klinke +Kohlrabi +Koinzidenz +Kolleg +Komplott +Meereis +Mehrphasigkeit +Memorieren +Messen +Methode +Metrowaggon +Meute +Migräne +Milieuforschung +Mindern +Mineralien +Mitternacht +Mobiliar +Mohrrübe +Mühelosigkeit +Normativität +Notifikation +Ökonomie +Orangeton +Osten +Subjekt +Subsidiarität +Subsumieren +Tagfalter +Speicher +Spielzeugsammlung +Zahler + +Сложные слова [] +Zurückgezogenheit +Äquipotentialfläche +Äußerungsbedeutung +Abfassungszeitraum +Abgeschlossenheits [Abgeschlossenheit, Abgeschlossenheits-, Unabgeschlossenheit, Aufgeschlossenheit, Abgeschlagenheit, Geschlossenheit] +Adjunktionsbeseitigung +Anknüpfungsgrundsätze +Chiffrierschlüssel +Knochenmarktransplantation +Bundeskaderathlet +Carbonsäurechlorid +Cardiazoltherapie +Chancenungleichheit +Charakterisierungsmöglichkeit +Chlorophyllkonzentration +Computerspielemarkt +Deindustrialisieren +Dekodierungsmöglichkeit +Kartoffelschälmesser +Kernspinresonanztomographie +Merkmalskombination +Nachbarschaftszentren +Opportunitätsprinzip +Tiefenstaffelung +Tourismusfachmann +Sequenzbetrachtung + +Слова с ошибками [] +Dechifrierprogramm [Dechiffrierprogramm, Liederprogramm] +Administratorkenwort [Administratorkennwort, Administratorkonto, Administratorrecht, Distriktadministrator, Distriktsadministrator] +Spigeln [Spiegeln] +Tätigkeite [Tätigkeit, Tätigkeiten, Untätigkeit, Nagetätigkeit, Mildtätigkeit, Regietätigkeit] +Draufgangertum [Draufgängertum, Draufgänger] +Abschnit [Abschnitt, Abschritt] +Komunikation [Kommunikation, Exkommunikation, Kommunikativ, Kommunikator, Komplikation] +Drackereicode [Druckereicode, Dreidecker] +Bumeln [Baumeln, Bummeln, Blumen, Brummeln, Bummel] diff --git a/Common/3dParty/hunspell/test/dst/de_CH.txt b/Common/3dParty/hunspell/test/dst/de_CH.txt new file mode 100644 index 0000000000..196e03636b --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/de_CH.txt @@ -0,0 +1,116 @@ +Alpinist +Alteration +Alternative +Alumne +Amateurfilmer +Ambulanz +Amtmänner +Analogie +Analytik +Ananas +Angabe +Ankünfte +Dynastie +Ebenbürtigkeit +Echtheitszertifikat +Editionspläne +Editor +Ehrenamtlichkeit +Eigentümerschaft +Einbau +Eindringling +Eingabequittungsbetrieb +Einhüllen +Einkommen +Einloggen +Einschließen [Einschliessen, Einschliefen] +Einsortier [Einsortier-, Einsorter, Eintortier, Einportier, Einvortier, Einsortiere, Einsortiert, Unsortierter, Unsortiert, Einzusortieren, Sortieren] +Elaboration +Elementar +Entertainer +Entkuppeln +Entschädigungs [Entschädigung, Entschädigungs-, Entschädigungslos, Entschädigens, Entschädigen] +Enumerator +Erbringen +Erdichten +Erfahrenheit +Erhalt +Erleichtern +Ersparnis +Erstatten +Erzählliteratur +Helikopter +Helpdesk +Herunterladen +Hindeuten +Hinterlassenschaft +Hiob +Landesprache [Landessprache, Landesrache, Landsprache, Ladesprache, -landesprache] +flexibilität [Flexibilität, -flexibilität, flexibilisiert] +floristisch +flugbillet [Flugbillet, -flugbillet, flugbereit] +heroben +herrichten +herstellen +herübereilen +herunterzubücken +hie +hieraus +hilfe [Hilfe, hilf, hilfe-, -hilfe, helfe, hilft, hälfe] +himbeere [Himbeere, -himbeere, himbeer-, himbeerrot] +justiz [Justiz, justiz-, -justiz, justiziell] +kältebeständig +kärtchen [Kärtchen, -kärtchen, Gärtchen, Bärtchen, kärglichen] +känguru [Känguru, -känguru] +kaktusgewächs [Kaktusgewächs, -kaktusgewächs, ausgewechselt] +kalligrafie [Kalligrafie, -kalligrafie, kalligrafiere, kalligrafische, kalligrafisch] +kamel [Kamel, kamel-, -kamel, kamen, rammel] +kampagnendirektor [Kampagnendirektor, -kampagnendirektor, kampagnenartig] +kapazitär +kapitalist [Kapitalist, -kapitalist, kapital ist, kapital-ist, kapitalistisch, kapitalisierst, kapitalisiert, kapitalstark] +karamell [Karamell, karamell-, -karamell, lamellar] +kardieren +karpfen [Karpfen, -karpfen, krampfen] +katalogdaten [Katalogdaten, -katalogdaten, katalogartigen] +lyzeum [Lyzeum, -lyzeum] +mahagonirot +makkaroni [Makkaroni, -makkaroni, marokkanisch] +malerausbildung [Malerausbildung, -malerausbildung, ausbildungsreif] +management [Management, -management, managen, gemanagt, angemahnt] +mangel +maniküre +manneskraft [Manneskraft, -manneskraft, maskenhaft] +mansarde [Mansarde, -mansarde, ansparende] +mark [Mark, -mark, merk, park, Sark, Park, Bark, markig] +marketingpraktiker [Marketingpraktiker, -marketingpraktiker, marketingorientiert, marketingwirksamer] +maschinell +massage [Massage, massage-, -massage, massige, Passage, Gassage, passagere] +massengutschifffahrt [Massengutschifffahrt, -massengutschifffahrt, maschinenschriftlich] +materie [Materie, -materie, materiell, materiefrei, maturiere, mattier] +medaille [Medaille, -medaille, medaillenlos] +medizinalshampoo [Medizinalshampoo, -medizinalshampoo, sozialmedizinisch] +meeresfrüchte [Meeresfrüchte, -meeresfrüchte, Heeresfrüchte, meeresfeuchte, meeresfeucht, früchtereiche, früchtereich] +quotient [Quotient, -quotient, quotiert, quotieren, quotiere, quotisieren] +salonwagen [Salonwagen, -salonwagen, lossagen] +satzeinleitend +trilateral +tristesse [Tristesse, -tristesse, tristeste, trist esse, trist-esse, triste, rissfeste, stresse, rissfest] +tropen [Tropen, tropfen, tropen-, -tropen, trogen, tropenfest] +vereisen +verfahren +verfügungs [verfügungs-, verfügen] +verhindern +verkäufer [Verkäufer, -verkäufer, verkämpfe, verkaufe, verkupfer] + +Слова с ошибками [] +Anbindungsystem [Anbindungssystem] +Anglistikdocent [Anglistikdozent, Anglistikstudent, Linguistikdozent] +Ecco [Echo, Codec] +Economclass [Economyclass, Economyklasse] +Einverstandnis [Einverständnis, Einverstandanis, Einverstandnils, Einverstandeis, Einverstandnil, Einverstanden, Seinsverständnis, Koranverständnis, Unverständnis] +Electrik [Elektrik, Electrabel] +Historique [Historisiere, Historie] +herüberzurucken [herüberzugucken, herüberzurücken, herüberzulocken, herüberzustrecken, herüberzublicken, herüberzuschicken] +kartofel [kartoniere] +salade [malade, lade] +sanddornbere [versandbereite] diff --git a/Common/3dParty/hunspell/test/dst/de_DE.txt b/Common/3dParty/hunspell/test/dst/de_DE.txt new file mode 100644 index 0000000000..36cde4a624 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/de_DE.txt @@ -0,0 +1,211 @@ +Hallo +Guten Morgen [Morgenläuten, Morgenröten] +Danke +Bitte +Ja +Nein +Entschuldigung +Tschüss +Liebe +Freund +Familie +Glück +Gesundheit +Schule +Arbeit +Essen +Trinken +Wasser +Brot +Käse +Fleisch +Gemüse +Obst +Kaffee +Tee +Milch +Zucker +Salz +Pfeffer +Haus +Wohnung +Bett +Stuhl +Tisch +Sofa +Fernseher +Telefon +Computer +Buch +Zeitung +Schreiben +Lesen +Hören +Sehen +Fühlen +Laufen +Springen +Schwimmen +Tanzen +Singen +Lachen +Weinen +Freude +Trauer +Angst +Mut +Liebe +Hass +Freundschaft +Beziehung +Familie +Eltern +Kinder +Geschwister +Großeltern +Onkel +Tante +Cousin +Cousine +Ehemann +Ehefrau +Verlobung +Hochzeit +Scheidung +Geburt +Tod +Krankheit +Arzt +Krankenhaus +Medikament +Apotheke +Gesundheit +Wohlbefinden +Fitness +Diät +Schlaf +Ruhe +Entspannung +Sport +Fußball +Tennis +Schwimmen +Laufen +Radfahren +Wandern +Reisen +Urlaub +Strand +Sonne +Meer +Komplementär +Perspektive +Konsens +Integrität +Konsequenz +Authentizität +Korrelation +Charakteristik +Akzeptanz +Flexibilität +Assoziation +Dekomposition +Komplexität +Positivismus +Universalität +Stabilität +Individualität +Konsistenz +Konformität +Dezentralisierung +Kollaboration +Partizipation +Präzision +Transformation +Konkurrenz +Paradoxie +Redundanz +Regeneration +Integration +Isolation +Asymmetrie +Aggregation +Disziplin +Resilienz +Relevanz +Konfusion +Komplikation +Koordination +Harmonie +Ineffizienz +Konstruktion +Konversion +Kollusion +Gerontologie +Differenzierung +Dimensionalität +Inferenz +Fluktuation +Kontraktion +Rezession +Inflation +Dekontamination +Exzellenz +Innovation +Isomorphie +Konnotation +Insuffizienz +Konversion +Kompensation +Koalition +Inkongruenz +Inkontinenz +Kontrahent +Konfiskation +Konjunktur +Aggression +Konfrontation +Kompatibilität +Prognose +Akzeleration +Konstruktion +Diversifikation +Prävention +Sanktion +Indikation +Reduktion +Konkurrenz +Konfiguration +Konnotation +Rezession +Transformation +Interaktion +Kooperation +Innovation +Kollision +Proklamation +Konnotation +Konfrontation +Disposition +Konkordanz +Deklamation +Kollaboration +Isolation +Inflation +Diversifikation +Konnotation +Kompensation +Diffusion +Dekadenz +Konserve +Deklomotion [Deklamation, Deklination, Deletionsklon] +Kolaboration [Kollaboration, Kollaborativ, Elaboration, Korporation, Inkorporation] +Isollation [Isolation, Installation, Kollation, Solmisation, Spallation] +Infllation [Inflation, Inflationär, Inflammation, Inflationiere, Installation] +Divirsifikation [Diversifikation, Ossifikation, Kodifikation, Ratifikation] +Konotation [Konnotation, Korotation, Kinotation, Kontotation, Ökonotation, Konnotativ, Annotation, Notation, Konfrontation] +Kompenssation [Kompensation] +Difusion [Diffusion, Gasdiffusion, Infusion, Diskussion, Fusion] +Dekadens [Dekaden, Dekadenz, Dekadent, Dekade, Dekans, Dekagons, Dekkans] +Kanzerve [Verwanze] + diff --git a/Common/3dParty/hunspell/test/dst/el_GR.txt b/Common/3dParty/hunspell/test/dst/el_GR.txt new file mode 100644 index 0000000000..cc8cf011f2 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/el_GR.txt @@ -0,0 +1,123 @@ +Αβαντάζ +Αβασταγά +Αβγάτισες +αβέβαιο +αβέλτερο +αβέλτεροι +αβίαστους +άβλαβοι +αβοκάντο +αβράδιαστης +άβραστη +αβράχυντου +άβρεχτα +αβρή +αβρότης +άβυσσον +αγαθόν +αγαθούς +αγάλακτο +αγγούρι +αγελαδινού +αγέρα +αγεωμέτρητων +αγίνωτοι +άγκυρες +αγορεύσεις +αγόρευσή +αγορίνα +Αγοριού +Αγροληψία +Αρμόνια +βγαίνοντας +βεβαιώσεων +διάθεση +διαίρεση +Διαιρέσου +Διαιτολογίου +διαψεύσουν +διδασκάλισσας +ενασκήσεις +ενασχόληση +ενασχόλησή +ενδείξεις +ενδεχόμενον +ενδιαμέσου +Επιστήθιες +Επιστημο [Επιστημοσύνη] +Επιστολές +Επιστολή +εύπορους +ευρέα +ευρημάτων +ευρύτητά +ευσταθών +εύστροφα +ευσυνειδησία +εύτακτε +ευτελείς +ευτελίζουν +ιδρυτικό +ιεροψάλτες +Ιζόλα +Ιθαγένειάς +ικανότατος +ιλαρότης +κεφαλής +κεφαλιάτικες +κεφαλωτές +κήπε +κήπευση +Κήρυξής +Λεξικογραφιών +Λεξιλογικός +λεοντή +λεοντής +ολιγοχρόνιου +ολικέ +ολικές +ολική +πελαγώνω +πελατών +πελάων +προστατεύει +προστασίας +σούρουπου +σουρούπωμα +σούρτης +Σούρωνα +Σπαγέτα +Σφάλμα +Σφάλματά +σφικτά +σφικτέ +σφοδρότητας +σφοδρού +σφραγίσω +σχεδιάζουμε +σχεδιάζουν +σχηματίσου +σχηματίσουμε +σχολιάζεσαι +Σχολιάζεστε +Ενδιαφέροντα + +Слова с ошибками [] +Αβασiλευτου [Αβασίλευτου, Αβασίλευτο, Αβόλευτου] +αγαπούσαv [αγαπούσα, αγαπούσαν, αγαπούσε] +βeβαιωμένοι [βεβαιωμένοι, βεβαιωμένο] +εvασxόλησης [ενασχόλησης] +επιoτολικέ [επιστολικέ, επιστολικό] +ιδιωτικοποιήσειc [ιδιωτικοποιήσει, ιδιωτικοποιήσεις, ιδιωτικοποιήσετε, ιδιωτικοποιήσεως, ιδιωτικοποιήσεων, ιδιωτικοποιήστε] +λεπταίσθnτη [λεπταίσθητη, λεπταίσθητα, λεπταίσθητε, λεπταίσθητο] +πρoστιμάρισμα [προστιμάρισμα, στιμάρισμα] +σφάλμαtα [σφάλματα, σφάλμα] +προστάτεuε [προστάτευε, προστάτεψε, προστάτευσε, προστάτες, προστάτευα, προστάτευσα] +κεxριμπαριού [κεχριμπαριού, κεχριμπαρένιο] +διαισθnτικότητες [διαισθητικότητες, διαισθητικότητας, διαισθητικότητα, διαισθητικότης, αισθητικότητες] +αγκιστpώσουv [αγκιστρώσουν] +αγαθoεργiας [αγαθοεργίας] +αβεβαιoτητά [αβεβαιότητά, βεβαιότητά] +αγέρεc [αγέρες] +διδαxθούμε [διδαχθούμε, διδαχτούμε] +εuσταθειώv [ευσταθειών] diff --git a/Common/3dParty/hunspell/test/dst/en_AU.txt b/Common/3dParty/hunspell/test/dst/en_AU.txt new file mode 100644 index 0000000000..55691a415f --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_AU.txt @@ -0,0 +1,116 @@ +Acknowledge +acrophobia +adventurousness +aeronautics +algal +Alligator +allegation +alphabetise +Analogy +appropriable +assembly +attempt +Average +barbecue +bathtub +begun +belongingness +Better +binary +blackberry +boatswain +bow-tie +brambly +bright-eyed +bubble +Calender +cancellous +cantankerousness +carefree +categorized [categorised, categorise, categorisation, category, decorticated, cauterised, avant-grist] +cellular +chaos +cheerfulise +childlike +circumstance +close-mouthed +Cocoa +coherent +co-located +Colours +controversial +cottage +creditworthiness +cut-down +dedicated +deep-freeze +Definitive +Designs +digital +distensible +dollar +dyslexia +Egyptian +effectively +etiquette +excess +exotica +fairly +feedback +features +figure's +fjord +forty-seven +government +haematomata +helpless +homologous +implant +Indemnify +inexpert +interior +localises +loquaciousness +maelstrom +mechanizable +melodious +mezzo-soprano +mozzie +municipalisation +mystifier +Neoclassicism +newsletter +non-professional +officiation +orientalisation +palaeoanthropography +parrot +pickpocket +pioneer +cryptanalytic +simplifying +sommelier +spicy +steward +subcontinental +swimwear +Technical +trajectory +wholesomeness +Advantageously +interindustry +red-eye +sub-group + +Слова с ошибками [] +Acredited [Credited, A credited, Accredited, Accredit, Accreted, Creditable, Discredit, Acridity, Aegritude] +agressive [aggressive, regressive, digressive, progressive, transgressive, aggressor, expressive] +appreciativiness [appreciativeness, appreciatively, appreciative, appreciation, apprehensiveness, operativeness, provocativeness] +aritmetical [arithmetical, arithmetica, arithmetic, hermetical, antithetical, paramedical, grammatical] +biosyntesized [biosynthesized, nonsynthesised, synthesised, amniocenteses, amniocentesis] +lisense [license, senilise, linenise, sensualise, sensise, licence, licensable] +paranoa [paranoia, paranoid, paranormal, paragon, panorama, Paringa, parental] +fotoelectronic [photoelectronic] +semi transparent [semitransparent, transparentise, non-transparent, transparency, semi-permanent, transpiration, superintendence] +synonymus [synonyms, synonymous, synonym's, synonym us, synonym-us, synonym, anonymous, synchronous, synoecious, anonymise, unanimous] +wordprocessing [word-processing] diff --git a/Common/3dParty/hunspell/test/dst/en_CA.txt b/Common/3dParty/hunspell/test/dst/en_CA.txt new file mode 100644 index 0000000000..a23012fcfa --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_CA.txt @@ -0,0 +1,125 @@ +admire +admittance +aggrandizement +Airmen +Albatross +amateur +angling +apparatus +Architecture +assessment +attempt's +awakening +backgrounder +Balance's +barometric +bashfulness +beautiful +belletristic +blatancy +bonbon +border +Bottom +bountifulness +breakpoints +bulkiness +businesslike +can't +cash +castle +Casual +cauliflower +celebrity +childish +chokecherry +choreographically +chronological +classification +clearheaded +coalesce +Coexistence +collaborative +coloured's +concentration +draconian +drainpipe +demonstrativeness +dependence +dependency +dream +duplication +epidemiological +equitable +Essence +Exemption +exonerate +fainthearted +falsification +ferromagnetic +flammable +fraternization +French +frontier +gadget +galleria +Gallery +gateaux +geocache +ginger +glace +glacier +globalization +hockey +holiday +housemate +intensifier +joystick +Language +leaseholder +non-breakable +northerly +o'clock +oeuvre +openhandedness +oscillation +outface +outlaw +overladen +package +palazzo +panama +Paragraphs +Parliament +particular +pasteurization +pathogen +perception +phenomena +philanthropically +physical +populations +repugnance +request +resplendence +retroactive +rigidity +schedule's +School +scintillation +sensibility +settlement +taxiway +bereft + +Слова с ошибками [] +acomplishment [accomplishment, accomplish, compliment] +anihilate [annihilate, annihilator, annihilation] +caprise [caprice, cap rise, cap-rise, apprise] +chambre [chamber, chambray] +etnographically [ethnographically, pornographically, photographically, typographically, topographically] +horsmanship [horsemanship, sportsmanship, swordsmanship, marksmanship, showmanship] +innundation [inundation, foundation, annunciation, insinuation, intimidation] +lemongras [lemongrass, lemonades] +omelete [omelette, telemeter] +retorical [rhetorical, oratorical, categorical, theoretical, reportorial] +shepishness [sheepishness, snappishness, waspishness, impishness, foppishness] diff --git a/Common/3dParty/hunspell/test/dst/en_GB.txt b/Common/3dParty/hunspell/test/dst/en_GB.txt new file mode 100644 index 0000000000..3b8b7a1426 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_GB.txt @@ -0,0 +1,122 @@ +Abbreviation +Acceptability +acquirable +Addressee +afterthought +airworthiness +all-powerful +amateurishness +amorphousness +anthology +Auspiciousness +Bibliographer +Bilberry +birthday +bodyguard +broadleaved +brontosaurus +bumptiousness +Cabaret +Californian +calumny +cancellation +cantonal +capitalize +careful +carry-on +casino +clown +co-ordinate +cockleshell +decennial +deckchair +decryption +deep-freeze +Democracy +financial +fish-plate +Flamenco +housing +Hybrid +hydroelectricity +iceboat +ichthyology +idiomatic +ill-humoured +imperatrix +individuality +interocular +intrasectoral +ironwoods +Jolliness +Jurisprudent +knowledgable +kopeks +labour-intensive +laboratory +lake +language +larynx +latching +leakiness +License +licensed +licensee +life-threatening +linguistics +long-lived +machinable +mainsheet +Major +malleability +man-hour +Mango +ninety-five +nobody +non-blocking +non-judicial +nonconforming +north-Western +nutritiousness +quasi-synchronous +question +racoon [raccoon, racoon's, contra] +radish +Railway +Rarity +saucer +Save +Saying +supplely +tallish +target +Taxi +teach-in +technician +ultramodern +umbrae +uncertainness +unconstitutionality +washing +wasn't +waxen +weather +well-formed +what's-his-name +whereupon +Wi-Fi +Wikipedia + +Слова с ошибками [] +Abstractnes [Abstractness, Abstractedness, Abstracter, Abstraction, Abstracted] +advantageusness [advantageousness, advantageous] +arhythmical [rhythmical, arrhythmical, a rhythmical, arrhythmic, arrhythmia] +autosuggestibility [auto-suggestibility] +kaptor [captor] +coldshouldering [cold-shouldering] +humaneneses [humaneness, humanenesses, humannesses, humanness, humanises, humblenesses] +imaginativness [imaginativeness, imaginative, imaginableness, imitativeness] +knight-erantry [knight-errantry, straight-eight] +magasine [magazine, magnesia, imagine] +night-wachman [night-watchman, nightmarish] +qualifidly [qualifiedly, qualified, squalidly] diff --git a/Common/3dParty/hunspell/test/dst/en_US.txt b/Common/3dParty/hunspell/test/dst/en_US.txt new file mode 100644 index 0000000000..a1cd136a72 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_US.txt @@ -0,0 +1,218 @@ +apple +banana +cat +dog +egg +fish +gold +house +ice +juice +kite +lion +mouse +night +orange +pencil +queen +rabbit +sun +tea +umbrella +vase +watch +xylophone +yellow +zebra +arrow +book +cake +car +day +elephant +flower +hat +island +jelly +king +lamp +moon +nose +owl +pink +quilt +radio +sunflower +tree +unicorn +violin +water +xylophone +yellow +zoo +apple juice [applesauce] +blue +calculator +desk +elephant +fire +goat +hat +ice cream [creamer] +jacket +key +lemon +map +notebook +owl +pear +quilt +rose +soccer +table +umbrella +vegetable +whale +xylophone +yellow +zebra +apple pie [pineapple] +beach +computer +drum +elephant +goat cheese [headcheese] +hat +ice skate [cheapskate] +juice box [jukebox] +kite festival [quite festival] +lemonade +mountain +notebook paper [] +orange juice [orangeade] +pizza +queen bee [quin bee, queen bi, keen bee, ween bee] +rainbow +snow +turtle +umbrella hat [umbrella] +valley +Aberration +Absolution +Acquiesce +Adumbrate +Aesthete +Altruistic +Ambivalent +Anomalous +Antediluvian +Antipathy +Aphorism +Apocryphal +Apostasy +Apparition +Arduous +Assiduous +Audacious +Austere +Autonomy +Avaricious +Axiomatic +Baleful +Bellicose +Belligerent +Bereft +Bilious +Bombastic +Cacophony +Capricious +Cartography +Castigate +Clandestine +Coalesce +Cogent +Cognizant +Colloquy +Concomitant +Confabulate +Congenial +Conundrum +Copious +Corpulent +Coven +Credulous +Culpable +Dearth +Debilitate +Deleterious +Denigrate +Despondent +Diatribe +Dilapidated +Disparage +Dissemble +Dissonance +Duplicity +Ebullient +Egregious +Ephemeral +Equanimity +Esoteric +Euphemism +Evanescent +Exacerbate +Exhort +Expatriate +Extol +Facetious +Fatuous +Feckless +Felicitous +Feral +Fervent +Fetter +Flummox +Fractious +Garrulous +Hegemony +Iconoclast +Idiosyncrasy +Ignominious +Impecunious +Ineffable +Inexorable +Inscrutable +Insidious +Intrepid +Intransigent +Invective +Irascible +Juxtapose +Kowtow +Languid +Lassitude +Lurid +Malinger +Maudlin +Mawkish +Mendacious +Metaphysical +Antransigent [Intransigent, Intransigence, Transient, Intransitive, Transcendent] +Inwective [Infective, Invective, Ineffective, Instinctive, Inactive] +Iracible [Irascible, Acquirable] +Juxtopose [Juxtapose, Juxtaposition] +Kovtow [Kowtow, Kowloon] +Langued [Languid, Languished] +Lasitude [Lassitude, Latitude] +Larid [Arid, L arid, La rid, La-rid, Laird, Lard, Laid, Lurid] +Mallinger [Malinger, Salinger, Lingering, Lingerer, Germinal] +Haudlin [Maudlin, Handling] +Mavkish [Mawkish, Mavis] +Mendocious [Mendacious, Mendocino] +Mitaphysical [Metaphysical, Physicality, Physical] +timeline [time line, time-line, timberline] +rollout [roll out, roll-out, rollover] +workshopped [work shopped, work-shopped, works hopped, works-hopped, workshop] +deliverables [deliverable, deliverable s, deliverers, deliberative, desirable] + + diff --git a/Common/3dParty/hunspell/test/dst/en_ZA.txt b/Common/3dParty/hunspell/test/dst/en_ZA.txt new file mode 100644 index 0000000000..89bb91d321 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_ZA.txt @@ -0,0 +1,114 @@ +Acceptably +Achievement +administrate +all-day +amount +average +bilayer +blasé +boutique +breezy +byers +cabdriver +carefree +categorised +Chameleon +cheerful +chronology +cliché +cooling-off +courage +crudités +decorates +dooryard +débâcle +electromotive +equalled +Exotica +fellow-traveller +forests +full-timer +graded +habitué +haven't +hide-and-seek +home-building +interaxial +kingdom +largeness +long-distance +Majority +manoeuvre +Matrix +metier +mightn't +multidisciplinary +night-time +officio +old-style +organize +overaggressive +packing +parenthesis +pince-nez +Plaint +play-act +policy-making +Preheat +prohibit +puzzle +queue +quite +re-enact +reason +ready-made +renewal +resize +rooihout +scampi +schoolteacher +sea-green +shop-boy +sidebar +skyscraper +soundless +spelling +stakeout +synchronizing +take-off +Thereof +Trademark +transportable +treatment +tweeness +under-age +unmake +Variate +Visitant +volume +webmaster +well-prepared +window +yesteryear +first-aid +Hydrant +inconstant +network +northernmost +nowhere +souvenir +telecommunicate + +Слова с ошибками [] +afordable [fordable, affordable, a fordable, formidable, recordable, foreseeable, adorable, avoidable, avoidably] +anthropologie [anthropology, anthropologies] +bagage [baggage, bag age, bag-age, Babbage, garbage, bagged, bagel, bakgat, ribcage] +comparatif [comparative, comparator, compatriot, comparable, comparability, comparably] +flammeble [flammable, flamelike, lamentable, blameless, flamed, flammability, flamboyance] +indivizible [indivisible, individualize, indiscernible, divisible, invincible, indefeasible, inadvisability] +jetlag [jet-lag] +lettrebox [letterbox, treble, storybook, legislature] +panoramma [panorama, Panorama, panoramic, paranormal, Panamanian, pentagram, paramagnet] +posessor [possessor, possess, assessor, processor, professor, poses, posses] +selfdoubt [self-doubt] +abandonner [abandoner, abandon, bandoleer, Ndondondwane, Bannerman, abundance, abundant] diff --git a/Common/3dParty/hunspell/test/dst/es_ES.txt b/Common/3dParty/hunspell/test/dst/es_ES.txt new file mode 100644 index 0000000000..c68b9446d3 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/es_ES.txt @@ -0,0 +1,208 @@ +nosotros +vosotros +ellos +ellas +aquí +allí +ahora +antes +después +siempre +nunca +también +solamente +verdad +mentira +bien +mal +grande +pequeño +rápido +lento +nuevo +viejo +bueno +malo +feliz +triste +bonito +feo +caliente +frío +dulce +amargo +fuerte +débil +cerca +lejos +fácil +difícil +cierto +falso +caro +barato +limpio +sucio +fuerte +débil +alto +bajo +claro +oscuro +abierto +cerrado +joven +viejo +corto +largo +alegre +tranquilo +nervioso +amable +grosero +conocido +desconocido +cortés +rudo +agradable +desagradable +sabroso +insípido +difícil +fácil +cansado +descansado +moderno +antiguo +último +primero +posible +imposible +rápido +lento +sencillo +complicado +propio +ajeno +abierto +cerrado +amable +desagradable +seguro +inseguro +correcto +incorrecto +dulce +amargo +Anacoreta +Sobrentender +Embriaguez +Inquebrantable +Empedernido +Derramamiento +Despotricar +Escafandra +Aletargamiento +Estancamiento +Descarado +Exégesis [Génesis] +Contrariedad +Espeluznante +Conspiración +Impedimenta +Deglutir +Engreído +Enmascarado +Exterminio +Embelesar +Permutación [Permutan] +Desesperanza +Impenetrable +Enarbolamiento [Enarbola miento, Enarbola-miento, Enrollamiento, Arrollamiento, Encarcelamiento, Eslabonamiento] +Errabundo +Deslinde +Inefable +Soliviantar +Embriaguez +Perdurable +Opulencia +Trémulo +Desembolso +Empedernido +Anquilosar +Enigmático +Inquebrantable +Contrincante +Desmesurado +Vanagloriar +Exasperar +Desvanecer +Perpetuidad +Desbaratar +Ineficaz +Zozobra +Elucubración +Ineludible +Desgarramiento +Atestiguar +Encascarar [Encascara, Encascaran, Encascaras, Enmascarar, Encascar, Encascar ar, Encascar-ar, Encascabelar, Encascotar, Enmascaran, Enmascara] +Desembozar +Irreverente +Soslayar +Despiadado +Embaucar +Moflete +Endilgar +Desfalco +Embelesamiento +Desestimar +Enajenación +Desavenencia +Inexorable +Atolladero +Egrégoro [Negror] +Desafiar +Afable +Enervar +Belicoso +Enervar +Descacharrante +Entramado +Inigualable +Perplejidad +Descabellado +Diligencia +Enaltecimiento +Desvergonzado +Arrebato +Empatía [Empata, Empate] +Endiosar +Peripecia +Desidia +Subversión +Desfachatado +Desfalco +Desvirtuar +Errático +Desahuciar +Envilecimiento +Empecinado +Estolidez +Despropósito +Engatusar +Culminante +Sobrentender +Enseñorear +Desacato +segguro [seguro, seg guro, seg-guro, seguiros, segur] +insseguro [inseguro, insegura] +correcto +incarrecto [incorrecto, insurrecto] +dalce [salce, dale, alce, dance, calce, dalle, dulce, d alce, cendal, cebadal, celda] +amergo [amero, mergo, amargo, amelgo, a mergo, amorgone] +Anasoreta [Anacoreta, Masoreta, Trasfretana, Asotanas, Asotanara] +Sobrententter [Sobrestante, Soberanamente, Sobriamente, Soberbiamente] +Embreagues [Embregues, Embragues, Embriagues, Embriaguemos, Embragares, Embrague, Embriague] +Inquebranttable [Inquebrantable, Quebrantable, Infranqueable, Intransitable] +Empidernedo [Empedernido, Empedernecer, Empedernir] + diff --git a/Common/3dParty/hunspell/test/dst/eu_ES.txt b/Common/3dParty/hunspell/test/dst/eu_ES.txt new file mode 100644 index 0000000000..a0335c41c0 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/eu_ES.txt @@ -0,0 +1,132 @@ +Abantza +ñabar +abasto +abegikortasun +aberaskeria +aberetzar +abezedario +abialdi +Abiatzaile +abizari +Aboli +abonatu +absenta +absolutibo +accelerando +adabegitsu +adberbio +adiaka +adierazle +adierazkizun +adikuntza +adin +adinaro +adineratu +adin-txikitasun +administratzaile +adoleszentzia +adopzio +adostu +aerolabangailu +Aeroplano +afalordu +agente +agertezin +agiantza +agoran +arradatze +arrakasta +Batata +baterakuntza +baterakor +Bateri +batuar +baud-abiadura +batzuenganako +batzuengandik +batzuengan +batzuengatik +batzuen +baxera +berezi +berezikeria +beritzete +beroa +Beroate +beroatza +berorri +berrabiatu +berra +berresgarri +berripaper +chap +dabilzkidake +dabilzkie +dagitza +dagokik +dagozkieke +erdiondu +galdera +galtzada +garaitiar +garantia +Garaztaketa +garbitasun +gastronomiko +Gaurgero +gaurgoitik +legizkie +legokizue +legozkidake +lehenbizi +nindoakio +publikotasun +publizitate +subsidiario +substantibo +sugestio +superbalorazio +taidun +taldeburu +Talent +Teknografia +xantxa +xerbitor +xerokopia +zabaldura +Zabalkor +Zabaltza +zabilzkieken +zabilzkio +zaharkote +zeneritzeketen +zenerra +zenezagu +zengozkigute +zeniharduke +zenioke +zenioketez +zeniraute +zenizkien +zenizkiguke +Zintut +Zintuzkedan +isiltasun + +Слова с ошибками [] +abriсot [abrikot, abrigo] +absenzia [absentzia] +addikzio [adikzio, dikzio, adukzio, adizio] +administraziozerbizu [administrazio-zerbitzu, administrazio-zuzenbide, administraziopean] +bat-bates [bat-batez] +bermagari [bermagarri, bermagailuari, bermagailuri, armagaberi, bermaguneari] +cataluniar [kataluniar, catalunyar, kataluniera] +dakarza [dakartza, dakarna, dakarzu] +erdemin [erremin, erdimin, iminerdi] +garatienetarikoa [garatuenetarikoa, ugarienetarikoa, gogoratuenetarikoa, argienetarikoa, aberatsenetarikoa] +ishil [isil, istil] +nindezaguane [nindezaguena, nindezaguan, nindezaguanez, nindezaguanek, nindezaguanen, nindezaguanei, nindezaguana, nindezagunan, nindezagutean, nindezagutenan, nindezaguzue] +nintzainaken [nintzainanek, nintzainake, nintzainakeen, nintzainanen, nintzaiakeenen, nintzaiakeen, nintzakenanen, nintzaiekenan] +summa [suma, susma, sumoa] +technologiko [teknologikoko, teknologiko, terminologiko, etnologikoko] +charmant [charmat, xarmant] diff --git a/Common/3dParty/hunspell/test/dst/fr_FR.txt b/Common/3dParty/hunspell/test/dst/fr_FR.txt new file mode 100644 index 0000000000..9b4428ca52 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/fr_FR.txt @@ -0,0 +1,211 @@ +Bonjour +Merci +Oui +Non +S'il +Excusez-moi +Pardon +Bien +Mal +Grosse +Petit +Beau +Moche +Fort +Faible +Chaud +Froid +Vite +Lent +Haut +Bas +Loin +Près +Heureux +Triste +Facile +Difficile +Simple +Compliqué +Bon +Mauvais +Nouveau +Vieux +Jeune +Âgé +Bienvenue +Amitié +Amour +Famille +Travail +Maison +Voiture +Manger +Boire +Courir +Marcher +Nager +Chanter +Dormir +Jouer +Parler +Écouter +Regarder +Lire +Écrire +Acheter +Vendre +Aller +Venir +Faire +Dire +Voir +Savoir +Apprendre +Aimer +Détester +Partir +Rester +Arriver +Revenir +Partager +Aider +Aimer +Ouvrir +Fermer +Manger +Boire +Avoir +Être +Pouvoir +Vouloir +Devoir +Parler +Écouter +Rire +Pleurer +Danse +Étudier +Travailler +Voyager +Vivre +Connaître +Reconnaître +Voyager +Exister +Choisir +Donner +Recevoir +Aimer +Oser +Phénoménologie +Électroencéphalographie +Parallélépipède +Anticonstitutionnellement +Transsubstantiation +Éclectisme +Anachronisme +Catéchuménat +Démagogie +Fructueux +Ineffable +Hypothèque +Propriété +Procrastination +Complaisance +Réminiscence +Éthique +Équinoxe +Exponentiel +Hétérogénéité +Imbroglio +Incorrigible +Maelström +Métaphysique +Protagoniste +Subliminal +Verrouillage +Volumétrique +Énigmatique +Époustouflant +Immatériel +Infini +Polyglotte +Recrudescence +Prophylactique +Symbiotique +Vestibulaire +Épistémologie +Faramineux +Géopolitique +Hypnotique +Inamovible +Intemporel +Labyrinthe +Pacifiste +Quémandeur +Soporifique +Ubuesque +Volumineux +Effervescence +Électrophorèse +Paradoxe +Prorata +Quadrupède +Sarcophage +Trigonométrie +Vaccinologie [Carcinologie, Actinologie, Vaccinogène, Accidentologie] +Xenophobe [Xénophobe, Technophobe] +Zéphyr +Génétique +Labyrintique [Labyrinthique] +Mégalo +Nostalgie +Omniprésent +Pangramme +Périlleux +Quinquennat +Rémunération +Scolopendre +Tautologique +Utopiste +Vexatoire +Wolof +Xanthine +Yacht +Zanzibar +Axiomatique +Chronométrer +Dilettante +Énervement +Facétieux +Générique +Harmonique +Illusoire +Juridique +Kabbaliste +Longetivité [Longévité] +Médiane +Néologisme +Oxygène +Patronymique +Quotidien +Rétorique [Rétorque, Rhétorique, Rotorique, Ré torique, Ré-torique, Météorique, Torique, Théorétique, Théorique] +Sémantique +Tautologie +Utopique +Vaccinologie [Carcinologie, Actinologie, Vaccinogène, Accidentologie] +Xénophobie +Yachting +Zoroastrisme +Voager [Viager, Voyager, Ouvrager] +Exisster [Exister] +Chaiser [Chaires, Chaise, Chaisier, Chaises, Chasser, Chaise r, Chamoiser, Tchadiser] +Doner [Toner, Zoner, Donner, Drone, Doser, Doter, Dorer, Douer, Doler, Doper, Dîner] +Resevoir [Redevoir, Recevoir, Revoir, Reversoir, Ivoire, Voire] +Aimmer [Aimer] +Osero [Oser, Osera, Oser o, Rosser, Roeser, Rose] +Phénoménollogie [Phénoménologie] +Électraencéphallographie [] +Parallélépepède [Parallélépipède] + diff --git a/Common/3dParty/hunspell/test/dst/gl_ES.txt b/Common/3dParty/hunspell/test/dst/gl_ES.txt new file mode 100644 index 0000000000..74cc688633 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/gl_ES.txt @@ -0,0 +1,120 @@ +ola +tipo +Si +non +nonnr [nono] +comida +comidaa [comídaa, comidas, comida, comidan] +auga +augaa [áugaa, augas, auga, augaba, augada, augala, augara, augar] +casa +coche +cochee [coches, coche, chochee, cachee, checo] +un tren [oin tren] +bicicleta +escola +escolaa [escóraa, escoala, escolas, escola, escálaa, escolla, escolma, escolar, escolta] +niños +pai +paii [paio, pai, pii, aii, pali, pais] +nai +naii [nai, nii, aii, naif, nais, nazi] +irmá +irmán +cachorro +gato +gatoo [gato, atoo, gateo, gatos] +peixe +peixee [peidee, peixes, peixe, peitee] +aves +avess [aveas, avesa, aves, avesas, avesos, vesas, aveso, aveces, escave] +árbore +flor +herba +o sol [ou sol] +lúa +o ceo [ou ceo, o ceou] +chuvia +neve +vexa +inverno +primavera +outono +noite +noite +día +unha semana [semanalmente] +mes +ano +para ler [parable] +escribir +fala +ensinar +traballo +durmir +durmir +correr +vai +senta +estado +para escoitar [parasitario] +vexa +escoita +hai +beber +carne +furtas +verduras +queixo +pan +auga +zume +café +té +leite +aceite +ovo +sal +impacienta +azucre +un bocadillo [oin bocadillo] +cociña +sala de estar [sala dei estar] +dormitorio +baño +batela +sofá +lámpada +fiestra +a porta [aporta, portara, portador, porta] +piso +teito +parede +sofá +alfombra +baño +afundir +espello +toalla +cama +manta +almofada +reloxo de alarma [riloxo de alarma, ríloxo de alarma, reiloxo de alarma, reloxo dei alarma, relouxo de alarma, reloxou de alarma, relollo de alarma] +escritorio +cadeira +marabilloso +adverbio +obviamente +Dominante +residenciais +convidado +perigo +cuestión +deporte +mina +cordeiro +cabeza +tratar +avogado +intelixente +guapo diff --git a/Common/3dParty/hunspell/test/dst/hr_HR.txt b/Common/3dParty/hunspell/test/dst/hr_HR.txt new file mode 100644 index 0000000000..6ce3b0a071 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/hr_HR.txt @@ -0,0 +1,215 @@ +boliestan [bolestan, obijestan] +jyak [jak] +slaby [slabu, slab, slaba, slabe, slabi, slabo] +pameetan [pametan, pametna, napamet] +gllup [glup] +bezuspješhno [bezuspješno, bezuspješnih, bezuspješan, bezuspješna] +besimeni [besi meni, besi-meni, bezimeni, besanim] +bezuzban [bezuman, bezuba] +blagastanje [blagostanje, blaga stanje, blaga-stanje, blagostanja, blistanje, oblaganje] +bljeskovica [bljeskovima, bljeskovi, bljeskova, bljeskalica, bljeskavi] +jabuka +sunce +voda +kuća +ptica +kava +kruh +cvijet +knjiga +pas +mačka +grad +zelen +plav +crven +bijel +crn +velik +malen +brz +spor +sretan +tužan +vruć +hladan +nov +star +lijep +ružan +dobar +loš +zdrav +bolestan +jak +slab +pametan +glup +raditi +jesti +piti +spavati +čitati +pisati +govoriti +smijati se [smijati] +plakati +pjevati +igrati +plesati +učiti se [učiti] +kupovati +kuhati +telefonirati +gledati +slušati +hodati +trčati +letjeti +plivati +čitati +pisati +raditi +imati +biti +ići +doći +otići +dati +uzeti +reći +vidjeti +čuti +osjetiti +misliti +htjeti +moći +morati +rado +nerado +da +ne +molim +hvala +doviđenja +oprosti +zbogom +zdravo +čau [ča, ču, čađu, čaju, čamu, času, čađ, čaj, čak, čar, čas, ča u] +ej +da +baš +super +glupost +fantastično +jasno +tako +zapravo +možda +lako +teško +prozračnost +usplahirenost +neoblomivost [neslomivom] +prezir +proigranost [prostranost, programiranosti, razigranosti, pristranost] +uznemirenost +besprijekornost +besprizornost [besprizornom, besprizornoj, besprijekornost, besprizorni] +nepredvidivost +beznadnost +promašenost [promašenosti, promašen, osiromašenom, raspršenost] +protivljenje +neizreciv +bezizlaznost +neuspjelost [neuspjeloj, neuspješnost, neuspjelog, neuspjelom] +zbunjenost +neodlučnost +protivština +nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] +bezduhovitost [bez duhovitost, bez-duhovitost, duhovitostu, duhovitosti, duhovitosta, duhovitost] +ravnodušnost +prolaznost +neobaveznost [neobaveznosti, neobaveznom, neobaveznoj, neobavezna, neobavezni] +bezbrižnost +nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] +promašenost [promašenosti, promašen, osiromašenom, raspršenost] +neprepoznatljivost [neprepoznatljivosti, ne prepoznatljivost, ne-prepoznatljivost, prepoznatljivosti, prepoznatljivost, neprepoznatljiva, neraspoznatljivosti] +neukrotivost [neukrotivog, neukrotiv, neučtivost, neotuđivosti] +bezobzirnost +nevinost +nestalnost +nepostojanost +bezizlaznost +nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] +prolaznost +neodgovornost +bezbrižnost +nevolja +nezadovoljstvo +prolaznost +bezuspješno +bezimeni +bezuzdan [bez uzdan, bez-uzdan, bezdan, bezdušan, beznadan] +blagostanje +bljeskavica [bljeskalica, bljeskavima, bljeska vica, bljeska-vica, bljeskavi, bljeskalici, bljeskava, bljeskalicu] +boren [borne, obrne, bore, oboren, borbena] +carovnija [otrovnija, darovnica] +crpeža [crteža] +dostojanstvo +duhovitost +egzaltacija +gorkoća [gorkoga, gorkošću] +histerija +idila +ironija +izdaja +janjetina +kajanje +kavana +krhotina +ljepljivost +lukavstvo +magnutizam [zategnutima, zamahnutima, izdignutima, vagnutima] +melankolija +misticizam +naivnost +nelagoda +neraspoloženje +obmana +okrutnost +opojenost [opojnost, obojenost, opojenoj, popunjenost, podvojenost, opčinjenost] +prezir +propast +ravnodušnost +sjenka +skitnica +spletka +stid +sudbina +susret +sudbina +šapat +tišina +trepet +utopija +uzaludnost +veličanstvo +zaborav +zanesenost +zanos +zavjera +zbunjenost +zluradost [zluradosti, zlu radost, zlu-radost, zlurad] +zloslutnost [zloslutnoj, zloslutnom, zloslutnu, zloslutna] +žargon +žártva [žrtva] +šaptanje +čarobnost +dileme +hodočasće [hodočaste, hodočašće] +lebdjeti +iznimka +preobilje [preobilne, preoblikuje] +probuditi se [probuditi] +surov diff --git a/Common/3dParty/hunspell/test/dst/hu_HU.txt b/Common/3dParty/hunspell/test/dst/hu_HU.txt new file mode 100644 index 0000000000..c925ed03d0 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/hu_HU.txt @@ -0,0 +1,114 @@ +Szorzótábla +Réges-régen +normálméret +nemeslelkűség +mindegyik +milliós +Mikroflóra +Mezőgazdaságigép +meséskönyv +mennyiség +Memória +kártya +kuráre +Kurzor +jégkorong +jellemesség +Javak +irányzás +iromány +Inkluzíve +hűtőedény +hőmérséklet +hír +hétszázas +hátrány +háromszáz +Hintó +generátor +gavallérság +explozíva +eső +esdeklés +epilógus +Energia +Előélet +előterjesztés +előnézet +elvonás +elszigetelés +ellátmány +Elevátor +egynémelykor +egyenlőség +eddzenek +dzsungel +ananász +akvárium +Szépül +Sztorizik +szobroz +szimbolizál +szemlélődik +sugdolózik +majmol +Macskáz +Létesít +Lokalizálódik +litografál +levelesedik +lepet +közömbösít +kételkedik +kivirágoz +kerekez +kedvez +járkál +jegyzőkönyvez +iskolázik +individualizál +csendesít +borsoz +billentet +bajmolódik +anyagozik +alkonyodik +Aktualizál +színes +szemelt +lassú +hatékony +hasznos +gyúlékony +gyári +abszurd +örökjog +öregkor +ömlő +Zászlaj [Zászlajú, Zászlaja, Zászlai, Zászlóalj] +Zseblámpa +regényirodalom +realitás +raktárhelyiség +pötty +pótlék +pótdíj +pályafutás +Promóció +Processzus +poloska +pernye +pediáter +parancsnoklás + +Слова с ошибками [] +sponzorálás [szponzorálás, szponzorál, zongorálás] +mihamarábiak [mihamarábbiak, mihamarabbiak, mihamarábbi, hamarábbiak, mihamarább] +idohatár [időhatár] +hypnotizmus [hipnotizmus, nepotizmus] +departement [département] +légiesul [légiesül, légiósul] +kutagat [kutatgat, kutazgat, kutasat, kutakat, kutadat, kutamat, kútagát, kútágat, kútágát, kutat] +költségtakkarékos [költségtakarékos, költségtakarékkos, költséghatékony] +redukzió [redukció, redukáló] +pilanatfelvétel [pillanatfelvétel, pialantfelvétel, adatfelvétel] diff --git a/Common/3dParty/hunspell/test/dst/id_ID.txt b/Common/3dParty/hunspell/test/dst/id_ID.txt new file mode 100644 index 0000000000..2d95d3b740 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/id_ID.txt @@ -0,0 +1,121 @@ +acang-acang +Adiksi +Adventisius +Advokat +afirmatif +agroindustry [agroindustri, nonindustri] +agrisilvikultur +akhir-akhir +akomodatif +aksi +aljabar +anggul +anotasi +antusiasme +apoteker +bahagia +bakat +bangkang +Bankir +Barikade +bebaru +belar +beleid +bencana +bentangur +beritawan +besuk +bilingualisme +Cecak +Celempong +cencawan +cengkar +ceremai +cermin +cudang +Dampal +dampan +dansa +datung +debitur +defensi +defisit +demper +dendang +Derivasi +Desember +deskripsi +diskotek +diskusi +distansi +dragon +dramatisasi +Eksamen +Eksistensi +eksperimen +ekstensifikasi +ekuitas +elektron +gelut +Geofisikawan +Gerbang +gerempang +influenza +Informasi +Inisiator +insekta +institusional +instruksional +jelajah +Kamrad +Kapilaritas +kapster +kardiovaskular +karismatik +keranjingan +komunal +Limitatif +Linguistik +lintang +masabodoh [masa bodoh, masa-bodoh, mastodon] +matematikus +medisinal +Melankolia +Memorabilia +nasional +nasionisme +Panen +pangkek +peranti +perian +persekusi +perunjung +regenerasi +reglementer +robotika +runjang +Sabtu +Simbang +simpati +tebing +topi +Unggal +unsuri +urbanisasi +variabel +wahana +warganegara [warga negara, warga-negara, negarawan, antarnegara, mancanegara, waranggana] + +Слова с ошибками [] +Abonement [Abonemen, Bombardemen] +Abcente [Absente, Centet] +ambivalan [ambivalen, ambilan, ambalan] +bakteriostatic [bakteriostatik, bakteriolisis] +cekaw [cekat, cekak, cekau, cekam, cekal, cekah, kacek] +darmavisata [darmawisata, darmatirta, mandataris] +declarasi [deklarasi, deflagrasi] +duplex [dupleks] +ecozona [ekozona, eco zona, eco-zona] +gempur-mengempur [gempur-menggempur, gempul-gempul] +jejengok [jejengkok, jengkeng] +transitive [transitif, transvetisme, transit, transisi] diff --git a/Common/3dParty/hunspell/test/dst/it_IT.txt b/Common/3dParty/hunspell/test/dst/it_IT.txt new file mode 100644 index 0000000000..5b9d3363bd --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/it_IT.txt @@ -0,0 +1,200 @@ +Ciao +Ciaoo [Ciao, Ciano, Ciao o, Ciocia] +Buongiorno +Buonasera +Buonassera [Buonasera, Buon assera, Buon-assera, Buonalbergo] +Grazie +Prego +Arrivederci +Buonanotte +Scusa +Per favore [Favorevole] +Amore +Amico +Famiglia +Casa +Città +Strada +Montagna +Montaga [Montagna, Montata, Montana, Montala, Montava, Montaggi, Montaguto, Montano, Montato] +Mare +Sole +Luna +Stelle +Giorno +Notte +Colazione +Clazione [Colazione, Coazione, Cl azione, Cl-azione, Clonazione, Collazione, Clorazione, Chelazione] +Pranzo +Cena +Acqua +Vino +Caffè +Pane +Formaggio +Pasta +Pizza +Gelato +Dolce +Salato +Frutta +Verdura +Carne +Pesce +Pollo +Uovo +Sale +Pepe +Olio +Burro +Zucchero +Latte +Yogurt +Insalata +Zuppa +Bistecca +Prosciutto +Parmigiano +Biscotti +Cioccolato +Spagggrhetti [Spaghetti, Spaghetteria] +Spaghetti +Lasagne +Risotto +Gnocchi +Penne +Ravioli +Cannelloni +Pesto +Caprese +Limoncello +Espresso +Cappuccino +Tiramisù +Panna cotta [Panbiscotto] +Cannoli +Panettone +Brioche +Focaccia +Foacdccia [Focaccia] +Crostini +Arancini +Antipasto +Primo piatto [Rimpiattato, Primariato, Rimpiatto, Rimpatriato] +Secondo piatto [Attosecondo] +Contorno +Pane tostato [Tostapane] +Marmellata +Accoglienza +Affascinante +Aggressività +Alleviare +Appassionato +Armonioso +Autonomia +Autovfnomia [Autonomia, Autotomia] +Barbarie +Beneficiare +Bizzarro +Burocrazia +Cambiamento +Capriccioso +Cautela +Commemorare +Comportamento +Conseguenza +Controverso +Coraggioso +Debolezza +Decisivo +Delizioso +Desiderare +Destrezza +Determinato +Determin [Determina, Determini, Determino, Determinò, Termine] +Difficoltà +Disponibilità +Divertimento +Eccentrico +Efficienza +Elettrizzante +Emergere +Empatia +Energia +Equilibrio +Esperienza +Fantastico +Fenomenale +Generosità +Gratitudine +Immaginazione +Impressionante +Impressiante [Impressi ante, Impressi-ante, Impressionante, Impressionate, Imprestante, Impressioniste] +Indipendenza +Ingenuità +Innovazione +Intelligenza +Intensità +Intrigante +Ispirazione +Instabilità +Irresistibile +Leggenda +Libertà +Luminoso +Magistrale +Malinconia +Meraviglioso +Metamorfosi +Miracolo +Misterioso +Nostalgia +Opportunità +Originalità +Passione +Pericoloso +Prestigioso +Prodigioso +Prospettiva +Raffinato +Rafinato [Raffinato, Rapinato, Affinato, Trainato, Raffrenato, Raffilato] +Ricchezza +Rispettoso +Sensibilità +Sorprendente +Spontaneità +Spontaneita [Spontaneità, Spontaneista] +Stravagante +Suggestivo +Surreale +Tenerezza +Trasformazione +Unicità +Vibrante +Vittoria +Volontà +Amicizia +Avventura +Bellezza +Calma +Danza +Eleganza +Felicità +Gioia +Incanto +Magia +Natura +Odore +Passatempo +Quotidiano +Relax +Serenità +Tesoro +Umorismo +Vacanza +Zelo +Avventuriero +Speranza +Risate +Armonia +Incanto diff --git a/Common/3dParty/hunspell/test/dst/kk_KZ.txt b/Common/3dParty/hunspell/test/dst/kk_KZ.txt new file mode 100644 index 0000000000..3547d29f05 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/kk_KZ.txt @@ -0,0 +1,209 @@ +сөз +адам +қала +тау +ауа +су +аспан +жер +бала +ата +ана +тамақ +кітап +ұстаз +оқу +тұтыну +тыныш +тұз +ауру +денсаулық +топ +маусым +төс +көз +жүрек +сарғыш +көп +аз +ертең +түн +түс +жас +қара +ақ +көк +қызыл +шай +салт +ыстық +суық +қазақ +жеті +он +жүз +мың +бір +екі +үш +төрт +бес +алты +жеті +сегіз +тоғыз +он +бақша +бұлақ +қиыр +досым +ақша +патша +таң +кеш +тауар +күн +апат +риза +ауырсыну +орман +жаңбыр +бауыр +жел +тұман +үй +бұлақ +көше +айнала +шайыр +тағам +сусын +топ +бас +әрекет +тіл +кеме +сиыр +қой +ешкі +шөп +ит +тұқым +қарындаш +апа +ана +әке +дала +тарлау +дәуір +таңдай +жыл +басқарушылар +басқарушшылар [басқарушылар, басқарушы, басқармасылар, басқаруғалар, бақылаушыларлар] +жауапкер +ерекшеліктерімендерге +тұмылдырықтатқыздан +білімділігінге +білімдарды +алалықсыздар +айырмашылықтарын +тұрақтандырып +сылтауратқандарыңызды +қолдар +байланысқадан +жетілдірілген +зарарсыздандырады +ескеріп +ескеріпп [ескеріп, ескеріпі, ескеріле] +міндеттемелеріндерге +кезеңдердің +себепсіздік +біреудейлер +беделілерің +кездестіріңіз +шектердің +көңіл +көңл [көң, көл, көңіл, көңі] +мол +алайда +мәселе +мәселеу [мәселе, мәселең, мәселен, мәселес, мәпелеу, мәуелеу, мәселем, мә селеу, селеу] +сендің +келер +келерр [келер, керлер, келері, кереле, еркеле, кермеле, келекеле] +кәне +көпір +күндіз +сана +белгілер +дайын +ез +қайшы +саф +рең +шақ +үміткер +бақыт +бақытт [бақыт, бақытта, бақытты, бақырт, бақыты] +республика +консервациялау +мемлекеттік +тағатсыздан +адамда +бәрі +бең +беңр [бең, бер] +жасағанда +жасағоанда [жасағанда, жасалғанда, жасасқанда, жасаманда, жасақанда] +жабайылық +заманда +көшірдік +мерейі +Мерейій [Мерейі, Мерейің, Мерейім, Мерейлі, Мерей, Мейір] +мөлшерсіздікк [мөлшерсіздік, өлшемсіздік, мөлшерсіз, өлшеусіздік] +мөлшерсіздік +пенді +тылда +мәртебесімен +аппаратпен +тегінді +кездеме +ересектік +көңілсіздік +тәуекелсіздік +қанағатсыздық +ғаділетсіздік +сайдақы +басым +тәжікеден +тұрғын +қонақ +қауіпсіздік +қадірсіздік +білгішсінбейсіңдер +талқандас +кешікті +қоздырғышы +бас +емдейсіңдер +құқылы +тақылет +әдемі +көткеншектейсіңдер +әжет +қайтар +белсену +түсінбеймін +жағымсыздық +сыздар +мәртебесі +тұрғыны +мезгіл +әлбетте +барысын +оқылған +безге +жаса +аламаңдайсыңдар +кереметті +епетейсіздік diff --git a/Common/3dParty/hunspell/test/dst/ko_KR.txt b/Common/3dParty/hunspell/test/dst/ko_KR.txt new file mode 100644 index 0000000000..5d30797f0c --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ko_KR.txt @@ -0,0 +1,157 @@ +안녕하세요 +감사합니다 +사랑해요 +미안합니다 +음식 +친구 +가방 +집 +학교 +컴퓨터 +물 +밥 +책 +산 +바다 +날씨 +일 +노래 +치킨 +반찬 +꽃 +숙제 +가족 +아이 +게임 +영화 +생일 +시간 +동물 +여행 +차 +쇼핑 +추천 +대화 +전화 +사진 +운동 +잠 +병원 +음료수 +능력 +주말 +전자기기 +고양이 +강아지 +바나나 +가을 +겨울 +봄 +여름 +옷 +신발 +지하철 +택시 +버스 +비행기 +샴푸 +브러시 +삼계탕 +국수 +불고기 +된장 +김치 +먹다 +마시다 +보다 +듣다 +놀다 +하다 +가다 +오다 +서다 +늦다 +일어나다 +자다 +빨갛다 +파랗다 +노랗다 +녹색 +보라색 +맛있다 +시원하다 +덥다 +추운 +기분 +슬프다 +즐겁다 +정신이 +바쁘다 +참새 +나비 +병아리 +돌 +물고기 +향신료 +시장 +기차 +공원 +해변 +지갑 +병원 +대학 +교통 +공항 +천재 +연구 +일본 +중국 +사업 +지식 +성격 +자금 +기술 +정부 +전략 +협력 +혁신 +경제 +철학 +신체 +영감 +현상 +역사 +태양 +설명 +사회 +환경 +자연 +현실 +존경 +정확 +장애 +낙관 +발전 +절망 +일상 +소멸 +도전 +반복 +포기 +파괴 +혁혹 [현혹, 혈족] +소외 [쇠오, 소아, 시외, 소오, 소에, 소의, 소와, 소요, 소유, 소위, 소야, 소되, 소뇌, 소 외, 소외감] +식민지 +혐오 +출산 +행복 +불평 +판매 +위험 +안녕하ㅎ요 [안녕하다] +감사합ㅅ다 [감사하다, 감사하여가다, 감사해가다] +사랑ㄱ해요 [사랑해요, 사랑해내요] +미안ㅎ합니다 [미안합니다, 미안한체합니다, 미안할만합니다, 미안해갑니다, 미안하여갑니다] +친ㅔ구 [친구] +가ㅎ방 [가방, 감방] + diff --git a/Common/3dParty/hunspell/test/dst/lb_LU.txt b/Common/3dParty/hunspell/test/dst/lb_LU.txt new file mode 100644 index 0000000000..37c698dbc9 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/lb_LU.txt @@ -0,0 +1,118 @@ +Aarbecht +Aarbechtszäitorganisatioun +Aartgenoss +Abenteuer +abrëll [Abrëll, brëll] +absence [Absence] +Abusives +Abzebillercher +Acquéreur +Adjointeë +Affischéiertes +Airbussen +Alldeegleches +Angschtzoustä +Basketballspiller +Baufirme +bauren [Bauren, bauen, brauen] +bekanntes +Beleg +Berodung +Bewältegung +Datentransfer +Dateschutz +Decisives +Donneschden +Drangsaléiertes +Dränk +Giischtgen +Grondlag +grondreegel [Grondreegel, grondleeënd] +Géies +Handelsdag +hausaufgab [Hausaufgab, ausbaufäheg] +hierschtdag [Hierschtdag, hierarchescht] +Häerzi +Industriell +Infrastrukturelles +Interessi +Internetfore +Intervall +Kamell +Kantoner +Karamell +Klenges +Nopeschhaus +Motors +Muer +Muerenter +Musek +Nettoverméige +niess [miess, Niess, iess, giess, Siess, Fiess] +Protektioun +Prouf +Provisioun +Prozessor +Präis +Präsens +Sanitäres +Schauspiller +Schema +Taxatioun +Telefonsgespréich +termingrë [Termingrë, verminnte] +terrass [Terrass, zerrass] +Textdatei +Textsprooch +Titulaire +Titel +erausféieren +erausjoe +gëeicht +onglécklecherweis +unzesammelen +unzespille +Approvisionnement + +Сложные слова [] +Aktiegesellschaft +Aktivitéitsdéclaratioun +Alarmstëmmung +Allgemengverständleches +Bankenoperatioun +Bensinsreserven +Besteierungsofkommes +Diskriminéierungsmoossnam +Dokumentatiounsaarbecht +Haaptrecommandatioun +Héchstgeschwindegkeet +Héichproblematesches +Hëllefsdéngscht +Integratiounsméisseges +Iwwersetzungsprogramm +Kapitaliséierungsdimensioun +Museksinstrument +Publicitéitsmarché +Transportproblem + +Слова с ошибками [] +Abonnnement [Abonnement, Joresabonnement, Abonnenti, Abonnent, Agebonnent] +Accomodéiertes [Accommodéiertes, Accommodéiert, Accordéiertes, Accommodéiers] +Agrarcenter [Agrarzenter, Agrozenter] +Begrennung [Begrënnung, Begrenzung, Benennung, Verbrennung, Begrenzen, Trennung] +Berodunszentren [Berodungszentren, Berodungszentre, Berodungszentr, Berodungszenter] +Deeluung [Deelung, Andeelung, Opdeelung, Verdeelung, Zelldeelung] +Dialogue [Dialoge, Dialog] +Dictaten [Diktaten, Dichten] +Inspektor +Iwereileges [Iwwereileges, Iwwereilegtes, Iwwereileg, Iwwerfälleges] +Pedagogik +Televisionschaîn [Televisiounschaîn, Televisiounsgeschäft] +Bechäftegungsméiglechkeet [Beschäftegungsméiglechkeet] +Gläicheetspolitik [Gläichheetspolitik, Sécherheetspolitik, Gesondheetspolitik, Geschäftspolitik, Dechetspolitik] +Musekheichschoul [Musekhéichschoul, Museksschoul] +Satelliten [Satellitten, Satellitte, Satellit] +Addressbichelchen [Adressbichelchen, Reklammbichelchen] +Aarbechtsfield [Aarbechtsfeld, Aarbechtsgefier, Aarbechtsblieder, Aarbechtsatelier, Aarbechtsalldag] + + diff --git a/Common/3dParty/hunspell/test/dst/lt_LT.txt b/Common/3dParty/hunspell/test/dst/lt_LT.txt new file mode 100644 index 0000000000..09068f6d85 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/lt_LT.txt @@ -0,0 +1,127 @@ +Abstraktus +šachmatai +žadintoja +agurkas +Aikštė +Akinukai +akmuo +šakoti +aktualinti +aktorius +šalinis +šaltinis +bernystė +beskuo +būgnelis +Bilietas +bilingvizmas +daržavietė +Darbadienis +Darbas +darbuotoja +dargi +daržinė +daugintoja +Daugiaveiksmis +delnė +įdelnis +detalizuoti +šerdelė +erdvėti +šeriškas +šeštadienis +etiketas +Evoliucija +fabrikantė +Fantastika +Fenomenas +fikusas +gaudinėti +gausėja +gūbrinti +geležis +geležtė +gelsvis +geranoris +Gertys +gerviukas +giesmininkė +Gikas +Goža +griaustinis +grįžinys +gėrioja +griozdas +grizijo +gryčia +grožėja +grįžti +grupė +gąstauti +Jaukas +jodinėjo +jodyti +keturnagis +Kiaušina +Kiaurymė +kiausta +kietakaktis +ūkiškas +kilimėlis +kilometrinis +ūkininkaitė +ūkinis +krykti +lapuotis +laukas +laupti +laužtė +Maudulys +Maumedis +mažutėlis +mazgotuvė +mechanikė +medeinė +medikamentinis +meduolinis +Nūdien +nebrendėlė +Negu +neiginys +parudenys +pasakotojas +pasausė +pasieninis +paskyriui +paslapčiom +Pasodas +Pat +Pataikūniškas +patarška +patentinis +proskyna +protekiniais +provizoriškas +rėkčioti +rūmas +rodyklinis +Romanistas +Skylmatis +Skyriklis +skolininkas +skraidžioja +skruzdėda +skėtrus + +Слова с ошибками [] +Abbreviatūra [Abreviatūra, Klaviatūra] +alpinismas [alpinsimas, alpinimas, alpinistas, alpinizmas, alpinistinis, alpinistini, alpinamas, alpinariumas] +amortizacia [amortizacija, amortizacini, amortizavo, amortizuoti] +daugiamžis [daugiaamžis, daugiaamži, daugiamatis, daugiametis, daugiažiedis] +deziderativinis [dezideratyvinis, dezideratyvini, prezidentinis, rezidentinis] +generazija [generacija, energija] +keturiasdešimtūkstantas [keturiasdešimttūkstantas, keturiasdešimttūkstanta, aštuoniasdešimttūkstantas, šešiasdešimttūkstantas, aštuoniasdešimttūkstanta] +krivuluoja [krivuliuoja, kreivuliuoja, kultivuoja] +Šnaukstai [Šnaukštai, Niaukstai, Šniauktai, Šniaukštai, Auksintai] +pazintinis [pažintinis, parazitinis, pantinis, patentinis, panteistinis] +progresa [progresai, progresas, progreso, progrese, progresu, progresą, progresų, progresavo, progresija] diff --git a/Common/3dParty/hunspell/test/dst/lv_LV.txt b/Common/3dParty/hunspell/test/dst/lv_LV.txt new file mode 100644 index 0000000000..6cd9ccc2a0 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/lv_LV.txt @@ -0,0 +1,205 @@ +Sveiks +Sveikks [Sveiks, Sveikas, Sveikās, Sveikts, Sveikus, Sveikos, Sveikt, Saveiks, Ieveiks, Veiks] +Labrīt +Lbrīt [Larīt, Lorīt, Labrīt] +Paldies +Paldiess [Paldies, Paliess, Palaidies] +Lūdzu +Luzu [Lizu, Ludzu, Auzu, Zuzu, Guzu, Lauzu, Lupu, Lubu, Lugu, Lūzu, Luču] +Atvainojiet +Atvainvfojiet [Atvaimanājiet] +Prieks +Perieks [Peries, Prieks, Persiks] +Draugs +Dravfugs [Draugs] +Ģimene +Gimene [Ķimene, Ģimene] +Māja +Maja [Maija, Paja, Raja, Laja, Maža, Maka, Mija, Mana, Masa, Māja, Mata, Maša, Maza, Mala] +Pilsēta +Pilseta [Pilsēta, Pil seta, Pil-seta, Piebilsta] +Ceļš +Ceļšs [Ceļš, Ceļošs, Ceļas, Ceļus, Ceļos] +Kalns +Jūra +Sauls [Auls, Kauls, Rauls, Pauls, Salus, Sauks, Sals, Saules, Sakuls, Saulēs, Saguls, Sulas, Salsu, Sauli, Sauss] +Mēness +Zvaigznes +Diena +Nakts +Brokastis +Pusdienas +Vakariņas +Vīns +Kafija +Maize +Siers +Makaroni +Pica +Saldējums +Deserts +Sāļš +Augļi +Dārzeņi +Gaļa +Zivis +Vistas +Ola +Sāls +Pipari +Eļļa +Sviests +Cukurs +Piens +Jogurts +Salāti +Zupa +Salds +Šokolāde +Spageti +Rīsi +Kakao +Biezpiens +Kūka +Tēja +Karalis +Zelts +Ezis +Tulpe +Lācis +Kaķis +Suns +Putns +Vārna +Zaķis +Pele +Ābols +Aita +Zirgs +Lauva +Pūķis +Lasis +Vilks +Vējš +Uguns +Ūdens +Zeme +Debesis +Saule +Rūpniecība +Aizkustinošs +Izdzīvošana +Nepieciešamība +Atbildība +Lieliski +Apmierināts +Neparasts +Izglītība +Sarežģīts +Atsevišķs +Pamatots +Organizācija +Sadarbība +Efektīvs +Daudzveidīgs +Novērtēt +Pārsteidzošs +Inovatīvs +Vērtība +Aizraujošs +Nopietns +Komunikācija +Māksla +Dzīvība +Ekskluzīvs +Tehnoloģijas +Rezultāts +Atbalsts +Nodrošinātība +Pārbaudīt +Radošs +Sociāls +Izteiksmīgs +Brīvība +Pieredze +Ietekme +Pārmaiņas +Drosmīgs +Racionāls +Empātija +Izpratne +Risinājums +Iespējas +Atklāts +Vadošais +Eksperimentāls +Neatkarība +Tīrība +Samierināšanās +Motivācija +Harmonija +Dinamisks +Iedvesma +Izglītojošs +Komplicēts +Pieejamība +Sadarbība +Tūlītējs +Saprotams +Neizsakāms +Lieliskums +Inovācijas +Aizrautība +Pārdomas +Sapratne +Rezultatīvs +Iespējams +Pārbaude +Sociālais +Izteiksme +Brīvība +Pieredzējis +Ietekmīgs +Pārmaiņu +Racionāla +Izpratni +Risinājumi +Iespējams +Atklāta +Vadošā +Eksperimentāla +Neatkarība +Tīra +Motivējošs +Harmonisks +Dinamika +Iedvesmojošs +Spēks +Mīlestība +Pasaule +Daba +Skaistums +Miers +Sapnis +Prieks +Rītausma +Brīnums +Izcils +Saikne +Dzirksts +Pārmaiņas +Atbalsts +Izcilība +Satriecošs +Dzīvīgums +Pārveidošana +Uzdrīkstēšanās +Uzticamība +Ieguldījums +Vērtība +Līdzsvars +Saskaņa +Izsmalcinātība +Pateicība +Atzinība +Pārsteigums diff --git a/Common/3dParty/hunspell/test/dst/mn_MN.txt b/Common/3dParty/hunspell/test/dst/mn_MN.txt new file mode 100644 index 0000000000..b590811bfc --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/mn_MN.txt @@ -0,0 +1,103 @@ +Баатар +Багаа +Базар +Барра +Бат-Очир +Баттуул +Батхэсэн +Баярмаа +Билгэх +Бор +Бөөнцагаан +Бүрэнхайрхан +Бямбагар +Бэх +Гарам +Гантиг +Гурвантэс +Гүр +Гэрэлтуяа +Давст +Дангаа +Дансран +Дарь-Эх +Дөргөн +Дундбүрд +Дэмүүл +Дэлгэрцэцэг +Жавзан +Жарантай +Заглул +Зүүнхөвөө +Кир +Корона +Лүн +Лха +Лхаваан +Майхан +Манлай +Мөндөөхөө +Мөнхөт +Мөрөн +Мөнххаан +Мөст +Мэгэд +Мухар +Найдалмаа +Найтингейл +Налайх +Нарантуул +Намтай +Насантогтох +Номин +Нямсамбуу +Нэүдэй +Орог +Очир +Өнөржаргал +Өөдөс +Өргөн +Паган +Пас +Пүрэвдорж +Пүрэвхүү +Сайнаа +Сайхандулаан +Сундуй +Сэлх +Сүүж +Сээр +Тайван +Тарав +Тогтуун +Төрболд +Төхөм +Төмөр +Түргэн +Түшиг +Түгтөмөр +Түшиг +Удвал +Улиастай +Улаандэл +гүедэцгээчих +дэвхэрлүүлсхийчих +дэвхэлцгээчих +дэвшигдүүлгэчих +дэвшилцчих +дэвээ +дэггүйчүүд +наламгардуулалц +налбаруулзна + +Слова с ошибками [] +Батарчулуун [Баатарчулуун, Батар чулуун, Батарч улуун] +Баруунхарааа [Баруунхарааг, Баруунхараа, Баруунхараагаа, Баруунхараад] +Даважаргал [Даваажаргал] +Дөрволжин [Дөрвөлжин] +Мягмараран [Мягмараар, Мягмарнаран] +Оюунтулхуур [Унтуурхуул] +оторчилсхилгэ [оторчилсхийлгэ, оторчилсхийчих, оторчилсхий, отогчилсхийлгэ, хорчилсхийлгэ] +Асрамжлулгацгаачих [Асрамжлуулгацгаачих] +гүентүүлгэцгэээ [гүентүүлгэцгээе, гүентүүлгэцгээ, гүентүүлгэцгээгээ, гүентүүлгэцгээж, гүентүүлгэцгээн, гүентүүлгэцгээнэ, гүентүүлгэцгээв, гүентүүлгэцгээг, гүентүүлгэцгээх, гүентүүлгэцгээм] +наладаадуулга [налдаадуулга, наадалдуулгаа, наадалдуулга, налдаадуулцгаа, наадамдуулгаа] diff --git a/Common/3dParty/hunspell/test/dst/nb_NO.txt b/Common/3dParty/hunspell/test/dst/nb_NO.txt new file mode 100644 index 0000000000..37cb4b46e6 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/nb_NO.txt @@ -0,0 +1,113 @@ +Bahamasøyene +Festarrangement +Festarrangemang [Festarrangement, Festarrangør, Fellesarrangement, Storarrangementa] +Festival +festligheta +festnummer +forhandlernett +forgylle +fotballstyre +Fotgå +fotoamatørene +Fotogalleri +fotokopiere +generalkostnadene +generaltabbe +generøs +Generell +genmodifisertst +handlingsresymeet +hardhet +Harmfull +hastighetsregulering +havbanke +havforskningsundersøkelsene +informasjonsutveksling +Infrarødest +kaffeautomat +kaldslig +kalenderåra +kjekk +kjendisstoffa +kjærlighetslyrikk +kjøkken +Kontantautomat +kontantlån +kontrahere +kontraheringsplikt +Låskasse +læregutt +læreprosess +Museums +museumssamling +musikkorps +myggstikka +myndighetsaldere +omløpstider +omregn +områdeplan +omriss +omsetningsgjeld +omsjaltning +omsetningsvolumer +omslutning +omslyngning +omsonst +omstendeligheta +Omstart +Omstreifende +Omsyn +omtåketheta +oppdagelse +oppbygning +oppebære +oppfølgingsapparat +oppgjørsbank +oppgjørsblankett +opphøringene +partisipere +randverdi +rapportskriver +rasjonalisering +Rate +selsak +selskapsinntekt +selskapsoverskudd +selvbetjeningene +snabbingene +Snadderene +Sytti +søkekriterium +søkemulighetene +søkeargumenter +søkingen +søkne +sølvlaga +sørlandsk +søtningene +tabellrad +Tabellkolonne +Takhalm +taksene +takseringssystema +tal +trolsk +trosinnholdene +utfoldelsesmuligheta +Utformingsmetode +Utgift +vekstfaktor +vekstforhold + +Слова с ошибками [] +Arbeidstagerorganisasion [Arbeidstagerorganisasjon, Arbeidstakerorganisasjon, Arbeidsgiverorganisasjon, Sosialarbeiderorganisasjon, Arbeiderorganisasjon] +festsprel [festsprell, festsprek, festsprelt, festspell, feltprest, fengselsprest] +forhandlingsdirektor [forhandlingsdirektør, forhandlingssekretær, forhandlingstekniskere, forhandlingstaktiskere, forhandlingskontor] +handlingforløpa [handlingsforløpa, handling forløpa, handling-forløpa, handlingsforløp, lønnsforhandlinga, lønnsforhandling, forhandlingspart] +kjempeflinktt [kjempeflinkt, kjempeflinkest, kjempeflink, kjempeflott, kjempefint] +lanetilbud [lånetilbud, langetilbud, landetilbud, linetilbud, laketilbud, langtilbud, lagetilbud, landtilbud, danetilbud, lunetilbud, vanetilbud, fanetilbud, banetilbud, hanetilbud, kantinetilbud] +omraming [omramming, omringing, omringning, ramming, omring] +omsvøpssfull [omsvøpsfull, omsvøpslaus] +raportmateriale [rapportmateriale, kartmaterialer, kartmateriale, programmateriale, skrapmateriale] +serstilt [særstilt, ser stilt, ser-stilt, seerstilt, tverrstilt, storstilt, lederstil, stiliser] +taksamst [takksamst, takksamt, takksam, samletakst, samstav] diff --git a/Common/3dParty/hunspell/test/dst/nl_NL.txt b/Common/3dParty/hunspell/test/dst/nl_NL.txt new file mode 100644 index 0000000000..ce7cdbafcc --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/nl_NL.txt @@ -0,0 +1,115 @@ +Advertentie +Advocate +affirmatie +afgevaardigd +afneemster +allerbekendst +alternatieveling +annulering +anticycloon +Backtrackroute [Jacktrackroute, Backtrackrouten, Baktrackroute, Backtrackroute-, Backtrack-route, Back-trackroute, Backtrackroutes] +Bearbeiden +becijfer +bediening +bedrag +beduiden +beïnvloeding +benadeling +bepaaldelijk +Catalogiseer +Catering +cellulair +classificator +collaboreren +collectiviteit +comfortabel +complimenteus +contractant +correctionaliseren +daaraanvolgend +dagelijks +deelgenoot +degelijkheid +demarqueren +Denotative [Denotatie, Denominatieve] +deposant +dergelijken +detail +deugen +diakritisch +Directioneel +dusgenaamd +eendrachtigheid +Eenzaamheid +eersteklascoupé +Eigenschap +felicitatietelegram +centerkanaal [centerkabaal, enterkanaal, centerkanaal-, center-kanaal, callcenter] +Chargeer +filiaal +klare +Klassikaal +kleinhandel +evolutie +exemplaar +exequiën +familiaal +fauteuil +luister +magistratelijk +perelaar +Permitteren +Perseveratie +persoonlijk +pictogram +pixel +sloten +sluimer +sneltoets +Soldij +Solliciteren +zegepraal +zelfbeeld +zevendaags +aangeslotene +meermaals +expedieert +jaargetijden +kaderleden +Kapitelen + +Сложные слова [] +avontuurlijkheid +bedrijfsmaatschappelijk +begrotingstechnisch +belangstellingssfeer +concurrentievoordeel +conferentieganger +democratisch-liberaal +discontoverhoging +doctoraatsverhandeling +dubbeldeksbus +economisch-financieel +energiezuinig +erkentelijkheid +evenwichtigheid +klimaatsverandering +koffiezetmachine +koopmansgebruik +maatschapsovereenkomst +personeelsconsulent +sociaalwetenschappelijk +zelfverzekerdheid +fondsenwervende + +Слова с ошибками [] +afficher [affiche, afficheer, affiche-, affiches] +algorithme [algoritme, algoritmiek] +beeindiging [beëindiging] +client [cliënt] +consnteren [consenteren, contesteren, constateren, consulteren, confronteren] +deactivieren [deactiveren, deactiveerde, reactiveren, deactiveert, geactiveerden] +deblockering [deblokkering] +electrisch [elektrisch] +certificat [certificaat, certificatie, certificeert, certificeer, certificeren] +sovereiniteit [soevereiniteit, suzereiniteit, sereniteit, universiteit] diff --git a/Common/3dParty/hunspell/test/dst/nn_NO.txt b/Common/3dParty/hunspell/test/dst/nn_NO.txt new file mode 100644 index 0000000000..90d328d8e3 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/nn_NO.txt @@ -0,0 +1,116 @@ +Ankeret +Anleggsbedrift +Annandag +annonseavis +annuell +ansats +ansvarsmedviten +Antibiotikai +apal +apoteki +apparattavlor +appetitt +Aprikos +arbeidsdokument +arbeidsmarknad +barndom +bastematte +bautingi +Bedriftsleiar +befolkningi +begynnarkurs +Beheld +belastningi +beredskapsnivå +beredskapsperiode +berglandskapi +berrfrost +beskjedi +beskrivingi +betalingsoppdrag +betalingsplikt +bevismateriale +bildeband +bildebruki +bildespråki +bildeteksti +bilingval +billettlukone +binær +bione +bjørkegreini +bjørnebæri +blenge +blokkeringi +blomsterbordi +blyerts +bogen +bokstavrekningi +bokstavteikni +Borddisk +effektevaluering +elgkalv +Elone +emballer +faktainformasjon +familiebedrifti +familieterapeut +fastbuande +Februar +feili +fisketom +hengelåsi +istandsetjingi +Item +jaguar +jamlig +janen +jarnbanestasjon +kjende +kjentfolki +kjæleri +kjøledisk +kjørety +midli +Mideftnar +midtstrek +multiplikasjonstabell +museumsdirektør +onsdag +operasjon +operasjonskode +opinionsskapingi +opningi +Personalkonsulent +Personligdom +persontryggleik +petroleumspris +redningsaksjon +reduksjon +refusnik +seinst +sekretær +seljande +sendeferd +Standpunkt +støyisolering +støytvis +terminoppgåve +tidløysone +tidsfølgjone +Tilbakebetalingstid +uprofesjonell +upåklageleg + +Слова с ошибками [] +Anlegsarbeid [Anleggsarbeid, Tvangsarbeid, Grunnlagsarbeid, Føregangsarbeid, Bergingsarbeid] +anonse [annonse, nonsens, anse] +ansversproblematikk [ansvarsproblematikk, vurderingsproblematikk, ventelisteproblematikk, valdsproblematikk, drivhusproblematikk] +barneforteling [barneforteljing, barnefordeling, barneforsking, barnefarforelegg, barnebefolkning, barnebortføring] +besoksliste [besøksliste, sortsliste] +bilophoggingi [bilopphoggingi, bilopphogging, opphogging] +effektivitetskontrol [effektivitetskontroll, effektivitetsforskjell, effektivitetsproblem, effektivitetsnøytral, effektivitetsforbetring] +fakturaerklering [fakturaerklæring, faktureringsliste, overfakturering] +miljøbyrad [miljøbyråd, miljøby rad, miljøby-rad, miljøbragd] +selskapskat [selskap skat, selskap-skat, selskaps kat, selskaps-kat, selskapsskatt, selskapskapital, selskapsrett, selskapstype] +cement [sement, dement, centime, cent] diff --git a/Common/3dParty/hunspell/test/dst/oc_FR.txt b/Common/3dParty/hunspell/test/dst/oc_FR.txt new file mode 100644 index 0000000000..26c580cdf5 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/oc_FR.txt @@ -0,0 +1,108 @@ +Ajustaira +alaguiar +alausièr +alberguèri +alcaloïdic +alègrament +alenament +algorisme +Alimentacion +allergologia +alpèstra +amaisament +amorteirar +analista +analogic +atucament +Audicion +auquièr +auscultacion +auscultar +ausèri +autenticament +brilhant +brumós +Burgada +cabelièira +cadeçar +Caducèu +çaicontra +calcièrs +Calmar +camarilha +cambièra +canalhariá +casse +cedar +cendrós +cèrca +cèrtes +cestòdes +chantièr +chartrós +Chassís +dimensionar +diptèrs +dirèctament +discrecionària +discriminar +Distraire +dòler +Enòrme +enqueriái +espicifòrme +esquelèt +Esquèrra +estetic +innocéncia +innocentàs +Maniquèu +mantelejar +Nauchièr +natièr +oxigèn +pacanariá +pagés +pagesiá +Primièirament +requereguèri +requisitòria +saumelèri +S'autodeterminar +sautarèl +scientament +scientologia +secador +secretèri +sècta +sectorial +s'efarcimar +s'endeven +s'engarrar +sentimental +s'entrepausar +shampó +sextant +sòli +Solidament +soquèla [soquèla, roquèla] +subrejornada +suedés +utilitària +Utilizaire +vacàs +vaisselèri +valiái +validament + +Слова с ошибками [] +albatros [albatròs] +amistanza [amistança, amistat, animista] +brunonièr [brunhonièr, prunhonièr] +carpentier [carpentièr] +centrifugation [centrifugacion, centrifugadoira, centrifugador, centrifugar, centrifuga] +estelhad [estelhas, estelha, estelhada, estelhar, estelhan, estelhat, estelham, estrelhada, estervelhada, estenalhada, estendalha] +primaria [primariá, primària, primarai, primaris, primari, primariam, primacia, primarga] +s'embractar [s'embracetar, s'embraceta, s'embodracar, s'embarrassar, embracetar] +sosembrançament [sosembrancament, embraçament, asombrament] +vascularisacion [vascularizacion, secularizacion, cardiovascular] diff --git a/Common/3dParty/hunspell/test/dst/pl_PL.txt b/Common/3dParty/hunspell/test/dst/pl_PL.txt new file mode 100644 index 0000000000..3cb6dba99f --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/pl_PL.txt @@ -0,0 +1,225 @@ +dom +pies +kot +auto +drzewo +książka +szkoła +przyjaciel +mama +tata +dziecko +jabłko +czekolada +kawa +herbata +telefon +telewizor +komputer +muzyka +sport +zdrowie +piękno +praca +miłość +szczęście +czas +pieniądze +język +kraj +miasto +zima +lato +jesień +wiosna +morze +góry +jezioro +rzeka +park +zwierzę +ptak +ryba +drewno +złoto +srebro +metal +szkło +buty +sukienka +spodnie +koszula +czapka +płaszcz +ręka +noga +oko +ucho +nos +usta +ząb +głowa +serce +mózg +król +królowa +książę +księżniczka +chłopak +dziewczyna +mężczyzna +kobieta +staruszek +staruszka +lekarz +pielęgniarka +nauczyciel +uczennica +student +studentka +kucharz +kelner +wojna +pokój +mapa +flaga +śmiech +płacz +sen +marzenie +praca +nauka +sztuka +teatr +kino +muzeum +kaplica +kościół +zamek +most +droga + +Сложные слова на польском языке [] + +1. konstantynopolitańczykowianeczka [nicejsko-konstantynopolitańskiego] +2. niezadogłębienieńskujący [] +3. antykontraatakujący [finansująco-kontraktujący] +4. supersamoobsługiwalnymi [kancelaryjno-archiwalnymi] +5. rozpierduchlanoculka [nieporozpierdzielanie] +6. nieodezwawiałobyś [nieodprzedmiotawiany] +7. przystawieniowy [przedstawieniowy, nieprzystawienie, niepoprzystawianie, nieprzystawianie] +8. nieprzeżyciowakościami [nieprzewartościowywaniami, nieprzewartościowaniami] +9. nieprzekazywających [nieprzekrzywiających, nieprzejednywających, nieprzywdziewających, nieprzepoczwarzających] +10. przeciwzakwaszeniowych [zatokowo-przedsionkowych] +11. nieszczęściodrapańskiego [ogrodniczo-pszczelarskiego] +12. społeczno-wychowawczyniami [socjalizacyjno-wychowawczymi] +13. seledynowo-fioletowymi [mięśniowo-szkieletowymi] +14. przeciwdeszczową [przeciwdeszczową, przeciwdeszczowy] +15. mikroelektroniczno-kwalitacyjną [reumatologiczno-rehabilitacyjną] +16. nieokreślonościowo-losowo-obiektywnie [] +17. zagubieniecioburakowatej [] +18. antyneuroleptyzanckim [] +19. nieupubliczniającymi [nieuwieloznaczniającymi] +20. splądrowałbyś [wyeksplorowałbyś] +21. konserwowano-spożywczymi [konserwiarsko-zamrażalniczymi] +22. ożelośćiowo-miłosnej [] +23. nieprzyzwoitolicjią [nieprzypieczętowującą] +24. nieodporowościę [nieodpoliturowanie] +25. rzeszołkofiołkowatymi [] +26. niezakapiactwuja [niezakatrupiająca] +27. nieoszczędniewczelnianków [oszczędnościowo-rozliczeniowa] +28. przekształconowaczkołępów [] +29. rozwińczywianiu [nieporozwiązywaniu] +30. nieprzeskakiwalnościami [nieprzewartościowywaniami] +31. modernizująco-rewolucyjnego [reumatologiczno-rehabilitacyjnego] +32. nadzwyczajnieuzdolnionymi [] +33. przemocno-wsparciański [warciańsko-odrzańskiemu] +34. przepyszno-peltzerowskiego [faszystowsko-hitlerowskiego] +35. kwestionowano-wzmocnieniami [] +36. nieodczynieństwującą [nieodrzeczywistniającą] +37. niezasłużonowypasionego [] +38. likwidującego/zarządzającego [odchudzająco-oczyszczającego] +39. szeszcześtoplutowanych [nieprzeinstrumentowanych] +40. niewpadkowościowi [wielonarodowościowi] +41. antynazizhownemu [niebizantynizowanemu] +42. nieuchronnieprzekroczeniowym [oszczędnościowo-rozliczeniowym] +43. niezatrawialnieprzyjemnego [] +44. kardiopulmonologiczno-angiologów [endokrynologiczno-ginekologicznemu] +45. gorączkowointensywnościowego [wydolnościowo-sprawnościowego] +46. antykonstytucyjnorozpadowego [konstytucyjno-monarchicznego] +47. nieobawiamysię/źródleni [] +48. prerewolucyjnolphillipsowi [] +49. szóstkaniewygranych [niewykrystalizowywanych] +50. nieupadkokogeneracyjnymi [korekcyjno-kompensacyjnymi] +51. społeczno-humanitarnarządzaniami [] +52. nieodziewowiędzy [nieumiędzynarodowienie] +53. przemocnochamować [] +54. społecznosensacyjnosądowym [kompensacyjno-wyrównawczymi] +55. przerażającorzymskiego [kobylińsko-borzymskiego] +56. nieprzemontowanych/zamuzowych [] +57. referendumkonstytucyjno-reformujące [] +58. niezniesłowiałszymi [niezesłowiańszczonymi] +59. niebohaterystycznymi [charakterystyczniejszymi] +60. produktodenarodowomenopauzalem [] +61. odrywającopierdolca [niedopierdzielająca] +62. niegotowożywione [żywieniowo-noclegowi] +63. niepostronnynarodzonemu [kilkudziesięciostronicowemu] +64. przedniaautochtonicznym [urbanistyczno-architektonicznym] +65. nadciągniono-wchodzących [] +66. promocjostworczym [czteromocarstwowym] +67. niezapowiadającychkoalicji [] +68. bezgłupinczłapie [] +69. wyomjaził [] +70. wagotonizacyjno-radiofonizowanego [] +71. gospodarczo-zasadotwórczej [organizacyjno-gospodarczej] +72. skrupulatno-rzeźniczobardziej [] +73. samokiedy-konstytucyjnej [konstytucyjno-monarchicznej] +74. niedomętnością [nieumiejętnością] +75. nieoszustamiwykorzystana [] +76. przeprowadzonoświeckie [nieprzeprojektowywanie] +77. nieuniknionaobowiązkowo-plastycznej [] +78. poduszkowo-nicościowych [porządkowo-czystościowych] +79. niepowodzeńbutmizeryjewego [] +80. skojarzeniowocolorowymi [wypoczynkowo-szkoleniowymi] +81. przytułkamiwciągarkowych [] +82. wchodziłoprzeciwniepowszechny [] +83. karaublicznociągana [publiczno-prywatnego] +84. przedpolitycznilubelskim [hemolityczno-mocznicowemu] +85. niezapowiedziano-date-expanded [] +86. licznościłodziennej [termiczno-wilgotnościowej] +87. niezawinieniomatołek [] +88. pakujączwobilardowego [] +89. rewersdopisek [] +90. przeprosinoworadosną [nieprzeprojektowywaną] +91. nieakceptacyjnoprospekcyjnymi [adaptacyjno-rehabilitacyjnymi] +92. jedniżużytym [nienadużytymi] +93. ainikopciksemilitechnikowany [] +94. motszynopiszącym [niewspółtowarzyszącym] +95. nieprzerejestrowanasezonowanie [] +96. słupotartackimoblikiem [] +97. nieodbieraniemniedostępności [] +98. dorozwinięcówkobiet [] +99. szybopojabytesłowickiego [] +100. przystępnoracjmujacych [] + +Слова с ошибками [] + +jedniiżużytym [nienadużytymi] + +wiomjaził [jaziowy] + +niezzniesłoowiałszymi [niezesłowiańszczonymi, niezesłowiańszczanymi, niezesłowiańszczającymi, najniesłowniejszymi] + +superrsammoobsługiwalnymi [muzealno-archiwalnymi] + +przemoocnochamować [przeprogramować] + +staruszzka [staruszka, staruszeczka, staruszek, staroruska, starszaka] + +tiatr [tiar, titr, tatr, teatr, wiatr, otiatra, otiatria, tristia] + +woina [wpina, wona, wina, wozina, dwoina, wolina, wonna, wcina, toina, wodna, doina, wolna, wojna, wgina, woźna] + +teleffon [telefon, telef fon, telef-fon, telefoto] + +zołoto [złoto, gołoto, hołoto, Gołoto, Hołoto, zołotnik] diff --git a/Common/3dParty/hunspell/test/dst/pt_BR.txt b/Common/3dParty/hunspell/test/dst/pt_BR.txt new file mode 100644 index 0000000000..1f66fc5565 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/pt_BR.txt @@ -0,0 +1,108 @@ +que +eu +não +de +você +para +ele +se +é +um +sim +por +isso +em +uma +uuma [u uma, uma, usma, suma, numa, ruma, duma, puma, fuma, juma] +está +como +com +bem +na +me +mas +do +era +quando +então +tudo +tydo [tudo, tido, todo] +aqui +disse +estava +esâtava [estava, tavares] +lá +fazer +vai +sobre +vamos +homem +hollmem [homem-gol] +bom +ok [o k, o, k, oó, os, oi, oc, ou, om, oh] +agora +coisa +coissa [coisca, coiça, coisas, coisa, cossa, comissa, cisosa, cissoa, cossai] +quero +foi +meu +seu +só +eles +as +posso +pocso [posso, poco, poso, psoco, poiso, pouso, pocho] +estou +mais +mim +certo +dizer +dizdizerr [dizer] +os +no +sei +ela +vocês +sua +todos +sabe +minha +alguma +algyyma [amalgama] +casa +muito +oh +quallquer [qualquer, alquerque, malquerer, alqueria, alquermes] +qualquer +da +estamos +até +onde +onede [enode, onde, monede, neode, onere, olede, nedendo] +ao +tenho +nós +tem +tinha +tiinha [tinão ha, tiazinha, toinha, tinha, tirinha, tidinha, tipinha, tianha, tainha] +quê +ir +ou +pode +quer +vou +seus +dia +estão +nos +cabeça +quem +anos +depois +sou +vez +vá +fez +irmão +câmera +câmeara [cameara, cameará, câmera, câmara, acâmera, comeara] diff --git a/Common/3dParty/hunspell/test/dst/pt_PT.txt b/Common/3dParty/hunspell/test/dst/pt_PT.txt new file mode 100644 index 0000000000..9477e3d006 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/pt_PT.txt @@ -0,0 +1,135 @@ +pan [pana, pane, pano, pen, par, pai, pau, paz, San, Van, Dan, pança] +manteiga +menteiga [manteiga, antigamente] +queijo +salchichón [salsicha] +saуlchichón [] +óleo +pimenta +pimmenta [pimenta, pigmenta, pimenteira, pavimenta, implementa, impiamente] +sal +baga +mel +geléia [geleia] +cogumelo +cebola +cóbola [cebola] +banana +cenoura +pêra [pera, para, pira, pura] +beterraba +frutas +melão +melancia +bolo +chocolate +carne +batatas +salada +salóda [salda, salada, salsada] +tomate +pepino +pipino [pepino, pi pino, pi-pino, pipi no, pipi-no, filipino, pino] +col [cola, cole, colo, coa, cal, coe, cor, rol, sol, coo, com] +mingau [mingua, mingai, minga, mingar, mingas, mingou, mingam] +sopa +sanduíche +refrigerante +refrigarante [refrigerante, refrigerar, intrigante] +água +café +chá +leite +suco +scuco [suco, cuco, cucos] +maçã +uvas +laranja +abacaxi +adacaxi [abacaxi, cacada] +damasco +demasco [damasco, demarco, remasco, de masco, de-masco, descasco] +açucar [açúcar, açucara, açucare, açucaro, açudar] +arroz +macarrão +res [rés, ser, ares, reis, ires, ores, dres, rei, ris, ses, rãs, rês] +porco +frango +costeleta +cãsteleta [costeleta, chapeleta] +limão +ervilha +pão +peixe +caramelo +sorvete +nogueira +ovo +pêssego +xícara +xíícara [xícara, caraíba] +vidro +prato +colher +garfo +faca +pires +garrafa +guardanapo +café da manhã [ssafé da manhã] +almoço +jantar +avião +carro +bonde +ônibus [ónibus] +trem +bicicleta +janeiro +fevereiro +fevíreiro [fevereiro, ferreiro] +março +abril +maio +junho +julho +agosto +setembro +setembra [setembro, seteara] +outubro +novembro +dezembro +desembro [desmembro, dezembro, deslumbro, setembro, desdobro] +caneta +livro +xadrez +telefone +relógio +pente +televisão +ferro +sabão +rádio +bolsa +cartão +mala +presente +câmera [câmara, comera] +computador +camputador [computador, captador] +filme +flor +vaso +quadro +lenço +bola +balão +brinquedo +brinqueedo [brinquedo, branqueado] +conta +sobre +papel +pepel [papel, repele, pele] +jornal +letra +bilhete diff --git a/Common/3dParty/hunspell/test/dst/ro_RO.txt b/Common/3dParty/hunspell/test/dst/ro_RO.txt new file mode 100644 index 0000000000..b1bd892905 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ro_RO.txt @@ -0,0 +1,210 @@ +casă +copil +carte +masă +școală +lumină +apă +munte +soare +lună +pâine +fruct +floare +stradă +mașină +aer +timp +zi +noapte +nor +vânt +ochi +gură +nas +mână +picior +inimă +sânge +cap +ureche +voce +melodie +culoare +formă +linie +cerc +dreptunghi +cercetare +știință +limbă +frază +literă +cifră +număr +sunet +zgomot +telefon +internet +computer +program +ecran +tastatură +mouse +joc +sport +muzică +artă +film +televizor +radio +planetă +stea +univers +galaxie +atom +moleculă +substanță +energie +lumină +căldură +frig +aparat +instrument +mașinărie +unelte +hrană +băutură +haine +pantofi +păr +piele +ochelari +ceas +bijuterie +pământ +apă +aer +foc +metal +lemn +piatră +hârtie +cerneală +pix +carte +cadru +tablou +sculptură +model +formă +anticonstituționalitate [anti constituționalitate, anti-constituționalitate, anticonstituționali tate, anticonstituționali-tate, anticonstituționale, neconstituționalitate, anticonstituțională, constituționalitate] +dezvoltare +inexpugnabil +nefast +concomitent +antiseptic +recalcitrant +perseverență +extravagant +inexorabil +colosal +plauzibil +efervescent +perspicacitate +superfluu [superfluă, superfulger] +subversiv +incoruptibil +inefabil +hiperbolic +indefectibil [indestructibil, indefinibil] +peremptoriu +ambivalent +paradoxal +heterogen [eterogen, heterogonie] +indiferent +periferic +subliminal +ultraviolet +indeferent [indiferent, interferent, deferent, inaderent, independent] +conglomerație +circumstanțial +contraproducător [contra producător, contra-producător, contraproductivă, contraproductiv, neproducător] +conglomerat +insurmontabil +intransigent +insidios +inerent +consternant +ambiguitate +inerție +inconsolabil +oniric +remarcabil +repudiat +subiectiv +periculos +infatigabil +abnegare +exuberant +facet [face, falet, facem] +represiune +implacabil +indiferent +infatigabil +insolit +intempestiv +incandescent +letargic +magistral +magnanim [magnaliu] +nefast +oblivial [bolivian] +oportun +periculos +plutitor +propice +reprobabil +risipitor +robust +salutar +simetric +solicitant +stringent +sufocant +superficial +tranzitoriu +tributar +trivial +umilitor +unic +vehement +vernal +vicios +victorios +vindicativ +virtuos +vizibil +volatil +vorace +vulnerabil +xenofob +xerofil +yonder [pondere] +yang +yodel [model] +zonal +zodiac +zoon [ozon, zono, zoom, zoo, zon, zobon, zovon, zvon, zoo n] +zoomorf +zurbagiu +Caaă [Casă, Cară, Cată, Cală, Cană, Cauă, Camă, Capă, Cadă, Cață, Cază, Cavă, Cașă] +Soaare [Soare, Sotare, Solare, Sonare, Somare, Soțioare] +Cartr [Carte, Cart, Carter, Carta, Carto, Cartu, Cartă] +Appă [Papă, Apă, Arpă, Aptă] +Coopil [Copil, Copilo, Copiilor] +Frumoss [Frumos, Frumos s, Frumoasă] +Feriсire [Fericire, Rereferire, Ferire] +Prietenn [Prieten, Prieteni, Prietena, Prietene, Prieteno, Prietenu, Prietenă, Prieten n, Prietinie, Prietin, Pretenție] +Muziică [Muzică, Muzic, Muică] +Exeplu [Exemplu] diff --git a/Common/3dParty/hunspell/test/dst/ru_RU.txt b/Common/3dParty/hunspell/test/dst/ru_RU.txt new file mode 100644 index 0000000000..938369e89b --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ru_RU.txt @@ -0,0 +1,197 @@ +должен +доллжен [должен, доложен] +наш +думаю +думмаю [думаю] +свою +сам +всем +ни +нас +пока +этом +этой +ваша +всеми +возьми +моей +сама +вся +день +само +всей +бывает +себе +пойду +куда +ими +твоей +всю +своего +твой +пусть +ним +про +точно +иметь +которые +тогда +сюда +наше +самой +взять +наверное +домой +совсем +те +тобой +наверно +что-то +будто +твои +пути +дома +такие +тех +такое +его +самой +вашей +наверное +мои +например +типа +значит +люблю +минут +пор +случае +искусство +лучше +того +такому +ждать +видеть +мною +ждал +имя +важно +чего-то +самому +обычно +представляет +мечтать +стало +помните +взять +моих +самим +своим +вообще +самими +здесь +обратно +сразу +таким +ежели +наоборот +куда +таков +мечтает +значит +покажи +такими +кстати +почти +всякий +научит +вдоль +тогдашний +толком +занимает +Аквапланирование +Барокамера +Библиографирование +Биосинтез +Взаимодействующий +Вибраторный +Виртуальность +Вооруженность +Господствующий +Десантно-штурмовой +Диагностировать +Дипломатический +Дисгармония +Дискриминационный +Достопримечательный +Жизнеустройство +Интернациональный +Инфицированный +Кальцинировать +Ключичный +Коннотация +Лиловатый +Люминесцентный +Метрополитен +Многоплановый +Модернизировать +Наивысший +Наименее +Неопределенный +Нераскрытый +Неоднократный +Неохотно +Непостижимый +Неусыпный +Обезьяноподобный +Обзавестись +Оптический +Оптимизировать +Осуществиться +Очистительный +Парафинировать +Переключатель +Пограничный +Подготовительный +Подрядчик +Полиморфный +Почитать +Преисполниться +Преподаватель +Преследователь +Прирожденный +Проектирование +Профанация +Разграничительный +Распоряжающийся +Реконструктивный +Революционный +Рентгенологический +Рискованный +Роскошествовать +Самоунижение +Сверхъестественный +Светочувствительный +Семантика +Сингулярность +Совершенствовать +Соединительный +Сосуществование +Спорообразующий +Стационарный +Столовая +Сторицей +Сцепной +Трансформирующий +Триумвират +Укротитель +Универсальный +Федеративный +Хронометраж +Целостность +Криумвират [Триумвират] +Укратитель [Укротитель] +Универссальный [Универсальный] +Фидиративный [] +Хранометраж [Хронометраж] +Целосность [Целостность] diff --git a/Common/3dParty/hunspell/test/dst/sk_SK.txt b/Common/3dParty/hunspell/test/dst/sk_SK.txt new file mode 100644 index 0000000000..d8167476c9 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sk_SK.txt @@ -0,0 +1,205 @@ +hiša [šiša, Riša, Miša, hi ša, hi-ša] +pes +mačka +avto [atto, asto, auto, zavito] +drevo +knjiga [kvadriga] +šola [šila, šoka, šla, švola, škola, šosa, vola, šora, rola, kola, mola, dola, šopa, pola, hola] +prijatelj [prijatej, prijate, prijatie] +mama +oče [očne, otče, toče, očke, koče, moče, očeš, oči, one, ose, oke, oje, obe, očí, očú] +otrok +jabolko [jablko] +čokolada [čokoláda] +kava +čaj +telefon [telefón, telefot] +televizija [televízia] +računalnik [račianski] +glasba [glasnosť] +šport +zdravje [zdravej, zdravie, zdravte, zdravme, zdrav je, zdrav-je] +lepota [pelota, slepota, lopota, lehota, klepotať, epoleta, poleptať] +delo +ljubezen [lezeniu] +sreča [srnča, skeča, smeča] +čas +denar [denár, nedar] +jezik [veziko] +država [držiava, držala, dŕžava, dĺžava] +mesto +zima +poletje [polejte, poleje, poletuje, polje] +jesen [jeseň, jesne, nesej, jeden, jesene, jeseni, jesení] +pomlad [omlad, poklad, p omlad, pomlka] +morje [morke, more, moje, morte, morme, mor je, mor-je, morčej] +gore [hore, gofre, nore, kore, more, zore, bore, šore, Nore, Tore, Lore, Zore, gágore] +jezero [jazero, je zero, je-zero, zero] +reka [areka, rieka, rekta, repka, rezka, raka, roka, rekt, seka, reva, veka, deka, repa, reku, ruka] +park +žival [žuval, živa, živel, živil, rival, ži val, ži-val, živ al, živ-al, živa l, žičieval] +ptica [pica, pätica, psica, štica] +riba [rabi, roba, ria, iba, raba, ribi, ryba, rúba, róba, Tiba, r iba, babri] +les +zlato +srebro [rebro, s rebro, striebro] +kovina [okovina, krovina, ovinka, konina, novina, korina, rovina, kozina, košina, kofina, rakovina, kávovina] +steklo [šteklo, seklo, stekalo, stieklo, stenklo, streklo, stoklo, steblo, stĺklo] +čevlji [nevlhči] +obleka +hlače [hláče, tlače, hlase, hlave, hlade, plače] +srajca [rajca, krajca, s rajca] +kapa +plašč [plaš, plač, plaší, plaš č] +roka +noga [noha, nota, nosa, nova, nora, loga, koga, doga, joga, noža, noša, noxa, Toga, neogab] +oko +uho [ujo, ho, tuho, uhor, uhol, uhlo, ucho, uhoľ, uňho, hou, oho, uto, uhm, cho, uhú] +nos +ustnice [ustrice, kapustnice] +zob +glava [hlava, Ilava, Slava] +srce [drce, srnce, srdce, srne, srde, síce, súce] +možgani [moganie] +kralj [kraj, kraal] +kraljica [kraslica] +princ +princesa +fant +dekle [deke, dele, pekle, de kle, de-kle, debakle] +moški [košmi, kamoši] +ženska [ženská, ženiska, žensky, ženskí, ženský, ženskú, ženské] +starec +starka [starká, straka, statka, starla, stara, ostarka, staríka, starca, starkí, starký, starkú, starké] +zdravnik [zdrav nik, zdrav-nik, zdravenia] +medicinska sestra [medicínska sestra] +učitelj [učitelík] +učenka [učeníka, učenia, učenca, utečenka] +študent +študentka +kuhar [kurare] +natakar [katakana, katarakta, katarakt] +vojna +mir [mri, mor, mi, mira, mire, mier, emir, miri, miru, mar, air, mer, min, sir, mil] +zemljevid [zemediel] +zastava [zástava, zastáva, zastav, zastavia, zastaval, zastavaj, zastavať, zostava, zastala, zastaví] +smeh [sneh, smej, sme, steh, smer, smel, smeč, smeť, sme h] +jok [koj, kok, joj, jol, ojok, jak, jot, tok, sok, vok, rok, lok, mok, dok, job] +spanje [spanie] +sanje [sane, saje, sanuje, banje] +delo +učenje [učenej, učene, učenie] +umetnost [etnosti] +gledališče [nepojedali] +kino +muzej [mušej, muzeálnej] +kapela +cerkev +grad [grád, gard, hrad, graf, rad, grand, gram, gray, úrad, Arad] +most +cesta + +Сложные слова [] + +1. Neparlamentarna [parlamentarizmus] +2. Samozadosten [rozradostene] +3. Nepristranski [protistranícki] +4. Pretirano [pretrénovanosti] +5. Nepredušno [nepriedušnosť] +6. Nesreča [] +7. Razpršeno [zhoršenou] +8. Nesprejemljiv [nesprejazdňujeme] +9. Prekomeren [rekompenzovať] +10. Prostovoljstvo [sprostredkovateľstvo] +11. Izolirati [] +12. Trmast [] +13. Brezpogojno [] +14. Neodvisnost [neodôvodnenosti] +15. Skupnost [ústupnosti] +16. Neizvedljiv [] +17. Nelegitimen [nelegitimizuje] +18. Nevzdržen [] +19. Preobremenjenost [] +20. Ogrevalni sistem [] +21. Preoblikovati [aplikovateľnosti] +22. Nezaslišano [nezasluhujúci] +23. Neugoden [] +24. Prezasedenost [prezamestnanosť] +25. Nesreča [] +26. Neupravičeno [nenapraviteľnosť] +27. Mednaroden [mŕtvonarodeným] +28. Kompatibilnost [najkompatibilnejšom] +29. Neuspeh [neusporte] +30. Neobvladljiv [] +31. Neskončen [neskončenej] +32. Neprimeren [neprimeranie] +33. Amortizacija [amortizovaných] +34. Koncentracija [dekoncentrácia] +35. Cirkulacija [recirkulácia] +36. Obremenitev [odbremenenie] +37. Gromozanski [] +38. Simbol [] +39. Vinjeta [] +40. Digitalizacija [digitalizovaný] +41. Funkcionalnost [funkcionalistické] +42. Rentabilnost [nerentabilnosti] +43. Ekshibicionizem [exhibicionizmus] +44. Frustracija [frustrujúci] +45. Neprilagodljiv [] +46. Severnoameriški [] +47. Ekskluzivnost [] +48. Preverjanje [preverovanej] +49. Celoživljenjsko [] +50. Privlačnost [neprivlastňovala] +51. Periferija [periferický] +52. Sokrivda [dokrivkať] +53. Kompromis [kompromisník] +54. Strpnost [ostrovtipnosť] +55. Racionalizacija [zracionalizovania] +56. Birokracija [gerontokracia] +57. Odraslost [odrastenými] +58. Stabilnost [nestabilnosti] +59. Nepredvidljivost [najnepredstaviteľnejšou] +60. Razkošje [] +61. Smrtnost [úmrtnostným] +62. Obveščenost [presvedčenosti] +63. Produktivnost [neproduktívnosti] +64. Neugodje [] +65. Zapletenost [zakrpatenosti] +66. Hegemonija [] +67. Umetnost [menostatikum] +68. Tranzicija [tranzitivita] +69. Individualnost [individualisticky] +70. Kontaminacija [kontaminantmi] +71. Inkubacija [] +72. Prikrito [prikrátko] +73. Etnični [Letničie] +74. Sovražnost [samovražednosť] +75. Atraktivnost [abstraktnosti] +76. Nestrpnost [nepriestupnosti] +77. Divergenca [divergencia] +78. Digitalna pismenost [] +79. Stabilizacija [autostabilizácia] +80. Raznolikost [] + +Слова с ошибками [] + + Kontamenacija [Kontaminácia] + + Grommozanski [Grobianski] + + Neobvladlliv [Neobkradli] + + Neparlametarna [Neparlamentný, Parlamentárnej, Parlamentne] + + Nevrzdržen [Združene, Zdražene] + + voina [vonia, vina, vojna, voľna, voština] + + muzei [muzeálni] + + ryba + + serebro [se rebro, se-rebro, rebro] + + televiziia [televízia] diff --git a/Common/3dParty/hunspell/test/dst/sl_SI.txt b/Common/3dParty/hunspell/test/dst/sl_SI.txt new file mode 100644 index 0000000000..6bd9384141 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sl_SI.txt @@ -0,0 +1,210 @@ +Hiša +Sonce +Miza +Stol +Ptica +Trava +Drevo +Noč +Luna +Morje +Gora +Cvet +Riba +Rdeča +Modra +Zelena +Rumena +Bela +Črna +Kamen +Pes +Mačka +Roka +Noga +Glava +Oči +Uho +Nos +Usta +Jabolko +Hruška +Sliva +Jagoda +Malina +Lubenica +Kruh +Mleko +Sir +Mesnica +Sadje +Zelenjava +Voda +Zrak +Ogenj +Sneg +Dež +Oblak +Veter +Zima +Poletje +Jesen +Pomlad +Zajec +Lisica +Volk +Medved +Lev +Tigrica +Slon +Konj +Krava +Ovca +Piščanec +Jajce +Mleko +Kava +Čaj +Sok +Vino +Pivo +Hrana +Pecivo +Testo +Marmelada +Kruh +Sir +Olje +Sol +Poper +Sladkor +Kava +Čaj +Vino +Pivo +Šola +Učitelj +Učenec +Knjiga +Pisarna +Računalnik +Telefon +Glasba +Slika +Film +Gledališče +Mesto +Vas +Trg +Cesta +Reka +Avtomatizacija +Razvoj +Komunikacija +Kompjuter [Juterškov] +Programiranje +Elektronski +Inženiring +Elektrifikacija +Kombinacija +Sistem +Informacija +Univerza +Biblioteka +Univerzitetni +Laboratorij +Raziskava +Razvojna +Inovacija +Intelektualni +Integriteta +Izobraževanje +Izvajanje +Preverjanje +Tehnologija +Implementacija +Program +Sodelovanje +Proizvodnja +Industrija +Organizacija +Administracija +Proaktivnost [Retroaktivnost, Produktivnosti, Produktivnost, Provokativnost] +Kreativnost +Projektni +Razumevanje +Kvaliteta +Upravljanje +Ocenjevanje +Statistika +Kompetentnost +Konsolidacija +Realizacija +Kapaciteta +Distribucija +Kompatibilnost +Konceptualizacija [Konceptualizem] +Povezava +Posodobitev +Fleksibilnost +Ekonomija +Organiziranje +Konkurenca +Stabilnost +Ekologija +Osebnost +Zavzetost +Entuziazem [Entuziast] +Motivacija +Avtorizacija +Kreacija +Akumulacija +Monotonija +Diferenciacija +Transformacija +Koncentracija +Inovativnost +Aktivnost +Vzpostavljanje +Reorganizacija +Kategorizacija +Partikularnost +Homogenost +Izjemenost [Izjemnost, Izjemen ost, Izjemen-ost, Zmenjenosti, Izrojenost, Izmišljenost, Izrinjenost] +Generalizacija +Hierarhija +Koordinacija +Inspiracija +Evaluacija +Ustvarjalnost +Oblikovanje +Kompatibilnost +Konkretizacija +Proaktivnost [Retroaktivnost, Produktivnosti, Produktivnost, Provokativnost] +Identifikacija +Kapaciteta +Intervencija +Konsolidacija +Realizacija +Eksplozivnost +Abstrakcija +Individualnost +Integracija +Segmentacija [Sedimentacija, Sedimentacij, Argumentacija, Alimentacija] +Asimilacija +Artikulacija [Artikuliranja, Artikulirala, Cirkulacija, Kalkulacija] +Kolaboracija +Asociacija +Stabilizacija +Kooperacija +Transformacija +Hšza [Hrza] +Kmojnikacija [Komunikacija] +Progrramiranjee [Programiranje, Reprogramiranj, Programiranega, Programiranj] +Elektornkski [Elektorski, Elektorkin, Elektronski, Elektorki] +Inženeirrng [Inženiring] +Izzobraževanjee [Izobraževanje, Izobraževanj, Izobraževanega, Izobraževane] +Infomracija [Informacija, Informacij, Rafinacijam] +Razvoojnaa [Razvojen] +Proizvdonja [Proizvodnja, Proizvajanja, Proizvajanj, Proizvaja] +Akitvnostt [Aktivnost] diff --git a/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt b/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt new file mode 100644 index 0000000000..ef1ecd7824 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt @@ -0,0 +1,227 @@ +кућа +пас +мачка +аутомобил +дрво +књига +школа +пријатељ +мама +тата +дете +јабука +чоколада +кафа +чај +телефон +телевизија +рачунар +музика +спорт +здравље +лепота +посао +љубав +срећа +време +новац +језик +земља +град +зима +лето +јесен +пролеће +море +планине +језеро +река +парк +животиња +птица +риба +дрво +злато +сребро +метал +стакло +ципеле +одећа +панталоне +кошуља +капа +капут +рука +нога +око +уво +нос +усне +зуб +глава +срце +мозак +краљ +краљица +принц +принцеза +дечак +девојчица +мушкарац +жена +старац +старица +доктор +медицинска сестра [војномедицинска] +наставник +ученик +студент +студенткиња +кувар +конобар +рат +мир +мапа +застава +смех +плач +сан +сањарење +посао +учење +уметност +позориште +биоскоп +музеј +црква +дворац +мост +улица +пут + +Сложные слова [Словенства] + +Конечно! Вот сто сложных слов на сербском языке на кириллице: [] + +1. Контраст [контрастира, контраста, контрастно, контрастна] +2. Компликација [компликацијама, компликација, компликације] +3. Конструкција [реконструкција, конструкцијама, конструкција, конструкцију] +4. Диспропорција [пропорцијалном] +5. Корелација [корелацијама, корелација] +6. Колаборација [колаборација] +7. Консервативан [конзервативан] +8. Диференцијација [диференцијације, диференцијацијом, диференцијална, диференцијални] +9. Експерименталан [експерименталним, експериментална, експериментални, експерименталне] +10. Инвалидитет [инвалидитет] +11. Легитиман [нелегитиман] +12. Оптимизација [аклиматизација] +13. Компетентан [некомпетентан, компетентан] +14. Документација [документација, документацијом, документацију, документације] +15. Персистентан [асистенткиња] +16. Апроксимација [апроксимације] +17. Екстраваганција [екстравагантност] +18. Катастрафалан [катастрофалан] +19. Резервација [резервација] +20. Прогресиван [прогресиван] +21. Идентификација [идентификација, идентификације] +22. Генерација [регенерација, генерација] +23. Криминалистички [криминалистички, криминалистичка, криминалистичке] +24. Дестабилизација [индустријализација] +25. Корумпиран [корумпирана, корумпиран] +26. Конфронтација [контаминација] +27. Експлозиван [експлозиван] +28. Функционалан [функционалности] +29. Релевантан [релевантан] +30. Квалификација [квалификацијама, дисквалификација, квалификација] +31. Акредитација [рехабилитација] +32. Петиција [петицијама] +33. Каустичан [аутистичан] +34. Периодичан [периодичан] +35. Контроверзан [контроверзна] +36. Гигантски [гигантских] +37. Принципијалан [беспринципијелан] +38. Управоливост [расположивости] +39. Имунизација [имунизација] +40. Магнетичан [магнетично] +41. Оперативан [оперативан] +42. Десант [десантне] +43. Хиерархија [хијерархија] +44. Феминистички [феминистичког] +45. Сегментација [сегментацијом] +46. Колоритан [колорисан] +47. Деградација [деградација] +48. Диверзификација [диверсификацију] +49. Казуистички [карикатуристички] +50. Реципрочан [реципрочан] +51. Манипулативан [манипулативна] +52. Екстензиван [екстензивна] +53. Колективни [колективни] +54. Каузалитет [локалитету] +55. Синхронизација [синхронизација] +56. Кампања [кампањама] +57. Товарни [товарника] +58. Хируршки [хируршких] +59. Шампионат [шампионати] +60. Геостационаран [револуционарност] +61. Опустошан [опустошености] +62. Клема [] +63. Стационарни [стационарна] +64. Секуларни [секуларних] +65. Исегментација [сегментацијом] +66. Дебелина [дебелића] +67. Прецизан [непрецизан] +68. Рафиниран [рафинирани] +69. Психолошки [психолошких, психолошки] +70. Турбулентан [корпулентан] +71. Интегритет [интегритет] +72. Идеолошки [идеолошких] +73. Манифестација [манифестација] +74. Имплицитан [имплицитан] +75. Хомогеност [хомогеност] +76. Изолација [хидроизолација] +77. Хетерогеност [] +78. Спекулативан [спекулативна] +79. Вагу [превагу] +80. Математички [математичким, математички] +81. Гематолошки [стоматолошки] +82. Психијатријски [психијатријске] +83. Блокада [блокадама] +84. Заплена [заплетена] +85. Монопол [монополом] +86. Дисидент [дисидентски] +87. Екстрадиција [екстрадиција] +88. Ревизија [ревизијама] +89. Ваидан [] +90. Колонизација [колонизација] +91. Мотивација [мотивација] +92. Просек [просектор] +93. Ресурс [ресурсу] +94. Хуманизам [хуманизам] +95. Дравски [Подравских] +96. Коалиција [коалиција] +97. Картеля [картелима] +98. Резолуција [резолуција] +99. Менталитет [менталитет] +100. Епидемиологија [дијалектологија] + +С ошибками [] + + Колонизакаија [Колонизација, Колонизацији, Колонијализам, Колонијализма] + + Епидемиогија [Епидемија, Епидемијом, Демагогија] + + Казуистикаки [Казуистика, Казуистике, Статистика] + + Хуманкзам [Хуманизам, Хуманизма] + + Манитулативан [Манипулативна, Ултимативан, Ултимативни] + + сањваење [сањање] + + утење [хтење, утање, стење, умење, утеше, утече, учење, утехе, утеже, уђење, утезање] + + автомобил [аутомобил, обилатом] + + мекицинска сестра [војномедицинска] + + стукло [стукли, тукло, стукла, стакло, стекло, свукло] diff --git a/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt b/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt new file mode 100644 index 0000000000..8996675c19 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt @@ -0,0 +1,173 @@ +ananas +anarhistički +antidepresiv [depresivan, depresivna, represivan, depresivne] +Anđeo +avion +banana +banka +belina +bespomoćnost +bibliotekar +bibliaoteikar [bibliotekarka, bibliotekar, biblioteka] +brod +citat +crkva +cvet +cveće +demokratija +demackratija [demokratija, demokratizacija, demokratiji, demokratije] +demokratizacija +Dobrota +dom +Dragi +ekran +eksperimentalni +eksplozija +epidemiologija [epistemologija, ideologija] +farmakologija +filantropija +flaša +frizura +fudbal [fudbal, fudbala, fudbalu] +garaža +generalitet +geografski +globalizam +gnezdo +grad +građanstvo +grlo +hamburger +Harmonija +himalaji [Himalaji, malajski] +hiperbola +hipotermija [hidroterapija] +hleb +Hrabrost +hrana [hrana] +Hvala +igra +igračka +individualnost +infrastruktura +internet +inmternet [internet, interne] +jabuka +jahač +jastuk +jednakost +jubilej +jurisprudencija +kafa +krevet +kriminalisticki [kriminalistički, kriminalistika, kriminalistička, kriminalistiku, kriminalističke] +kriminalistika +kuća +kvantitativni +lampa +latiaratura [mlatarati, rasturati, maturirala, landarati] +Lepota +lingvistika +literatura +ljubav +Ljubavi +ljubavnica +Ljubazan +Ljubim +lubenica +majica +majka +mašina +mikroorganizama +mikroskopija [mikroskop ija, mikroskop-ija, mikroskopi ja, mikroskopi-ja, mikroskopi, mikroskopska, mikroskopa, mikroskopski] +Milost +Mir +Mirno +nacionalizam +nedopustiv +neurologija +novčanik +noć +nož +oktobar +okultizam +optimističan [optimistička, optimistički, optimističke, optimističku] +optimističnost [optimistički, optimističke, optimistička, optimističku] +ormar +Osoba +oči +pas +peškir +planina [planina, planinar, planinac, planinčina, planini, planinčini, planin] +poniženje +Porodica +Prijatelj +psihologija +psihoterapija +Radost +računar +reka +rekonvalescencija +reumatologija [dermatologija, hematologija, stomatologija] +revolucija +sendvič +Slatko +Sloboda +Slobodan +Snaga +socijalizacija [socijalizam, specijalizacija, specijalizacijom, socijalizma] +socijalizam +Spreman +Sreća +Srećan +Srećno +sunce +superiornost +Svetlost +tata +tehnologija +telefon +telekomunikacije +top +tradicionalni +ulica +univerzalnost +univerzitet +univirzdalnost [univerzalnost] +Usmena +Znanje +usta +Vedar +vegetarijanstvo +velikodušnost +voda +voz +Zabava +zavisnost +Zdravlje +zemlja +Zima +zjmlja [zemlja] +zločinački +zoološki +Zvezda +ćilim +čarapa +čarobnjak +časopis +čizme +đak +đevrek +đumbir +šešir +šišmiš +škola +šljiva +šuma +žaba +ženskara +žirafa +život +životinjski +žurka + diff --git a/Common/3dParty/hunspell/test/dst/sv_SE.txt b/Common/3dParty/hunspell/test/dst/sv_SE.txt new file mode 100644 index 0000000000..408fca774d --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sv_SE.txt @@ -0,0 +1,210 @@ +Hus +Sol +Mjölk +Vatten +Fisk +Stol +Grön +Blomma +Träd +Katt +Hund +Bok +Cykel +Kaffe +Frukt +Kött +Fönster +Dörr +Säng +Lampa +Bord +Hår +Ögon +Hand +Fötter +Näsa +Mun +Öra +Huvud +Arm +Ben +Kläder +Hatt +Skor +Väska +Papper +Penna +Skrivbord +Telefon +Radio +Musik +Film +Teater +Konst +Sport +Spel +Resa +Bil +Tåg +Buss +Flygplan +Båt +Stad +Land +Hav +Sjö +Flod +Berg +Dal +Park +Skog +Sjukhus +Apotek +Skola +Universitet +Affär +Restaurang +Café +Hotell +Turist +Vän +Familj +Mamma +Pappa +Bror +Syster +Barn +Morfar +Mormor +Vänster +Höger +Framåt +Bakåt +Upp +Ner +Snäll +Osnäll [Snäll, Osäll] +Glad +Ledsen +Trött +Stark +Svag +Tyst +Bullrig +Ren +Smutsig +Vacker +Ful +Liten +Stor +Komplexitet +Oproportionerlig +Ovillkorlig +Efterklokhet +Komplicerad +Desorientering +Konstellation +Otillgänglighet +Irreversibel +Förlåtelse +Overksamhet +Indifferent +Hierarki +Kombinatorik [Kombinatorisk, Kombination] +Inkompatibilitet +Absorption +Konsekvens +Verklighetsfrånvänd +Retrospektiv +Förändringsbarhet [Förändringsbarnet, Förhandlingsbart, Förhandlingsbar] +Ambivalens +Besvikenhet [Besviken, Besviket] +Ineffektivitet +Intrikat +Dilemma +Hesitation +Absurditet +Kompromisslös +Konsolidering +Föresats +Tillfredsställelse +Delegering +Rekommendation +Detaljrikedom +Oanvändbar +Stagnation +Nostalgi +Hemlighetsfull +Avsaknad +Perseverans [Perseverera, Reverseras, Reversera] +Existentialism +Repetitivitet [Repetitivt, Receptivitet, Repetitiv, Representativitet] +Intolerans +Anonymitet +Obetydlig +Paradox +Förvirring +Juxtaposition +Reflektion +Självständighet +Kollision +Kreativitet +Djupgående +Abstraktion +Eufori +Autentisk +Insinuation +Omöjlig +Pessimism +Inkonsekvens +Revisionism +Sensationell +Obeveklig +Subjektivitet +Universalitet +Entropi +Omvälvande +Infiltration +Konservativ +Atypisk +Provokation +Konfrontation +Anarki +Konkurrenskraft +Defensivitet [Defensivt, Sensitivitet, Defensiv, Densitet] +Nihilism +Konklusion +Apori [Apor, Apors, Porig] +Korrespondens +Prioritering +Exponentiell +Fragmentering +Aversion +Harmoni +Vanmakt +Signifikans +Katalysator +Förlust +Enhällighet +Ambition +Tendens +Alienation +Artificiell +Uppfyllelse +Psykosomatisk +Virtuos +Egensinnig +Anpassning +Hållbarhet +Konstitution +Kompleksitet [Komplexitet, Komplementet] +Oproporsjonerlig [Oproportionerlig, Proportionerlig] +Uvilkorlig [Villkorlig] +Etterklokhed [Efterklok] +Komplisert [Komplicerat] +Desorientering +Konstelasjon [Konstellation] +Utilgjengelighet [Tillgänglighet] +Irreversibel +Forlatelse [Förlåtelse] diff --git a/Common/3dParty/hunspell/test/dst/tr_TR.txt b/Common/3dParty/hunspell/test/dst/tr_TR.txt new file mode 100644 index 0000000000..0ea601fe67 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/tr_TR.txt @@ -0,0 +1,205 @@ +Akşam +Almak +Altın +Anahtar +Anlamak +Araba +Atmak +Ayakkabı +Açmak +Ağaç +Bahçe +Bakır +Bakkal +Bakmak +Balık +Beyaz +Bilgisayar +Bilmek +Binmek +Bulmak +Ceket +Cevaplamak +Deniz +Dinlemek +Doktor +Duyurulmamış +Düzenleştirme +Düşmek +Düşünmek +Ekmek +Elbise +Eldiven +Elma +Erkek +Etek +Etmek +Ev +Eşarp +Gelgit +Geliştiricilikle +Geliştirilebilir +Geliştirme +Gerçekleştirme +Gezmek +Geçmek +Gitar +Gitmek +Giymek +Gri +Gömlek +Görülebilirlik +Görünümlü +Görünüşlü +Gözlük +Gümüş +Günaydın +Hareketlendi +Hareketlilik +Hava +Hayalperest +Hüzün +Kahve +Kahverengi +Kalabalıklar +Kalem +Kalkmak +Kalmak +Kapatmak +Kararlılık +Kararlılıkla +Kararsızlık +Kararsızlıkla +Karpuz +Kedi +Kemer +Kemdkcer [Kemerler] +Kırmızı +Kitap +Kız +Kızgınmak [Kızgın] +Koklamak +Koalye [Kolye, Kavalye] +Kolye +Konservatuvar +Konuşmak +Korkmak +Koymak +Koşmak +Kravat +Kullanılabilir +Kullanılmış +Kullanılmışlık +Kullanışlılık +Kurumsallaşma +Köpek +Küpe +Kütüphane +Mavi +Mazbut +Melankoli +Merdiven +Merhaba +Merhabalar +Meurhaba [Merhaba, Murabaha] +Meydan +Meyhane +Meyve +Mor +Muhafazakar +Muhteşem +Mukadderatlarınızdanmışçasına [] +Muvaffak +Muzaffer +Muzafferiyet +Muzip +Mükemmeldik +Münasebet +Münzevi +Müsrif +Mütevazi +Müteessir +Mütercim +Mütereddit +Mütevazı +Müzmin +Okul +Okumak +Otobüs +Otoriterlik +Oynamak +Pantolon +Pasta +Pembe +Pembei [Pembe, Pembeyi, Pembeli, Pembeci, Pembe i, Pembesi, Pemben] +Plaj +Platin +Saat +Sandalye +Sarı +Satmak +Sevinmek +Sevmek +Sıcak +Sıradaymışız +Siyah +Sormak +Soymak +Soğuk +Su +Sükûnet [Sükunet, Sünnet] +Sürrealist +Süt +Tabak +Tadına bakmak [Alınamamaktadır] +Tatlı +Tavuk +Telefoncu +Televizyon +Temizlemek +Teşekkürler +Türkuaz +Tuirkuazu [Türkuaz] +Turuncu +Tutmak +Ulaştırılabilir +Uygulanabilir +Uyumak +Uçak +Yapmak +Yatak +Yazmak +Yemek +Yeşil +Yıkanmak +Yıldız +Yol +Yöneltilmezken +Yüzme +Yüzük +Zenginleştirmek +Çalışamamıştı +Çalışmak +Çalışmamıştır +Çanta +Çay +Çıkarmak +Çiçek +Çorap +Özelleştirilmiş +Özelleştirme +Özgürleştirme +Üzülmek +İnmek +İsteksizlik +İsteksizlikle +İstikrarlı +İstikrarlılık +İstisnai +İslamiyetle +İzlemek +İçmek +İşbirliği +İşitmek +Şapka +Şemsiye diff --git a/Common/3dParty/hunspell/test/dst/uk_UA.txt b/Common/3dParty/hunspell/test/dst/uk_UA.txt new file mode 100644 index 0000000000..be4941540b --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/uk_UA.txt @@ -0,0 +1,210 @@ +абдукція +абіогенез +амбівалентнасть [амбівалентність, амбівалентний, бівалентність, біоеквівалентність, внівалентність] +амбівалентність +анахранізм [анахронізм, брахманізм, анархізм, нанізм] +анахронізм +антропогенез +антропологія +антропоморфізм +апатія +археологія +архетип +аскетизм +астрономія +афект +бачити +бігти +білий +біллий [білий, збілілий] +біологія +бувай +будинок +будь ласка [будь ласку] +бути +важко +велиикий [великий, великоокий] +великий +веселка +взяти +вибачте +відчувати +вода +волюнтаризм +втаємниченість +вчитися +гарний +гарячий +гегемонія +географія +герменевтика +герменевтика +гештальт [штатгальтер] +говорити +гойдалка +готувати +грати +дати +дедукція +деконструктивізм [де конструктивізм, де-конструктивізм, конструктивізм, неконструктивно] +деконструкція +демаркація +детермінізм +дзвіночок +дивитися +дисгарммонія [дисгармонія, дисгармоніям, дисгармонійний, фісгармонія] +дисгармонія +дисфункція +дисфункця [дисфункція, дистинкція] +дихотомія +до побачення [побачення] +добрий +доктрина +думати +дурний +дурня +дякую +евфемізм +езотерика +ей +екзистенціалізм +екзистенціалізм +екзистенцілізм [екзистенціалізм, екзистенціаліст, екзистенція] +екзистенція +економіка +емерджентність +ентелехія +епістемологія +ефемерність +ефемерність +занепадництво +звісно +здоровий +зелений +йти +ілюзорність +ілюзорність +імплікація +інвектива +індукція +інтроспекціїя [інтроспекції, інтроспекція, інтроспекції я, ретроспекція] +їсти +історія +каблучка +кава +казус +калюжа +катарсис +каченя +каштани +квітка +кішка +класно +книга +когнітивістика [когнітивність, когнітивна] +комаха +консенсус +космогенез [номогенез, екогенез] +купувати +легко +лінгвістика +літати +маленький +марнослів'я +математика +мати +метаморфоза +метелик +метелиця +містифікація +місто +могти +можливо +мусити +насправді +не радий [нерадий, незрадний] +незворушність +ні +нігілізм +новий +нонсенс +ностальгія +павучок +парадокс +пес +писати +пити +піти +плавати +плакати +повільний +поганий +політологія +постмодернізм +потворний +працювати +привіт +прийти +психоаналіз +птах +радий +ремінісценція +рефлексія +робити +розбурхання [розбухання, розбурханий, розпухання, бурхання] +розумний +сильний +сингулярність +синестезія [кінестезія, анестезія] +синій +синішй [синій, синішай, синішати] +синкретизм +сказати +скатертина +слабкий +слухати +сміятися +сніг +соліпсизм +соломинка +сонечко +сонце +соціологія +спати +співати +справді +старий +структуралізм +сумний +так +так +танцювати +телефонувати +тож +трансцендентність +фантастично +фаталізм +фемінізм +феномен +феноменологія +фізика +філософія +фрактал +хворий +хімія +хліб +хліб +ходити +холодний +хотіти +чао [чадо, чан, чат, чар, час, чад, дао, чаш, чай, чаї, чаю] +червонй [червоний, червоній, червоно, червона, червоні, червону, червоне, червоню, червонявий] +червоний +черевики +читати +чорнй [чорний, чорній, чорно, чорна, чорни, чорні, чорну, чорне, чорню] +чорний +чути +швидкий +щасливий +яблуко diff --git a/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt b/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt new file mode 100644 index 0000000000..7aee309965 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt @@ -0,0 +1,262 @@ +Mарт [Арт, Ғарт, Қарт, Карт, Шарт, Фарт, Варт, Парт, Сарт, Март] +Ёз +Ём +Ёхуд +Август +Адвакат [Адвокат, Адэкват] +Адреси +айтган-лирангиз +айқин +амалга +анча +Апрел +арзонроқ +аҳамият [аҳамият, аҳамияти, ҳамият, ҳамжамият] +аҳднома +бажарилади +бажарилди +баланд +ихтисослан +банкрот +баҳона +Баҳор +бераман +берасизми +беринг +бериш +бешинчи +биз +Бизга +Бизнинг +билан [билан, биланг, билани] +Бирор +Бозорнинг +бор +бошқа +Бу +Бугун +будингиз +бунга +бундай +Бухгалтерлик +бўлади +бўладими +бўлиши +бўлмаган +бўлса +бўш +бўшайди +бўшатасиз +вазифасига +вазият +вариант +вақт +газетадаги +газетадан +даромад +Декабрь +Душанба +Эрталаб +Етказиб +Жисмоний +Жуда +Жума +зарур +зиёфат +Ижара +ижарага +икки +Илтимос +Индинга +информатизациялари +Иситгич +иши +ишлатсак +Ишхона +Июль +Июнь +Йўқ +йил +йилдан +кам +Шинамгина +кампанияси +келдим +келишимдан +келмоқчи +келсам +келтириш +керак +керакдир +керакми +кета-ди [кетади, кетарди, кета-чи, кета-кета, дискета] +кеч +Кеча +кечага +Кечаси +Кечир +Кечирдинг +кирла +кирадими +кондиционер +коррупциядир +кран +Куз +Кун +куни +кўрмоқчи +кўчиб +лойиҳа +Май +маълумоти +маълумотларни +Маъмурият +маъруза +Мен +музлатгич +мумкин +муфмкин [мумкин] +мутахассис +мушовир +муҳим +нарса +нархи +Нархини +нақд +ўшанақасини +неча +Номардлик +Ноябри +интернетдаги +ойнаси +ойнинг +Октябри +олдин +олдиндан +олмаймиз +олмоқчи +орқали +шоти +шорти [шоти, орти, ортиш, шотир, корти, форти, шарти, порти, сорти, ширти, торти, борти, шомурти] +Оқшом +пайдо +Панжшанба +пулини +Раҳмат +резюме +реклама +Салом +Сармоядор +Сентябрь +Сешанба +Сиз +сизга +сизда +Сизнинг +синган +сифатида +совуқ +софвуқ [совуқ] +Солиқларни +Статистик +сўм +тажрибали +тайёргарлик +тайёрладик +тайёрладингизми +таклиф +талафот +талафоти +таъминловчилардан +танишинг +таржимон +тарржимон [таржимон, тарраксимон] +тахминан +ташкил +Телефонни +технология +Безантирани +тозалан +тозалигига [тозалигига, газтозалагич] +Тонгда +топширишимиз +топшириқ +турли +турмоқчи +тутсак +Тушлик +ўладиганингиз +тўлай +тўлаймиз +тилдиришинг +тўлиқ +уйингиз +уйни +уч +учун +ўқидим +фақат +Феврал +хабар +Хайрли кун [Хайрли кўн] +Мотамхонаси +хонлик +Чек +Чоршанба +Шанба +шарт-номани +шартини +шартлар +шартлари +шартни +шартнома +шахс +шовқин +Шом +Шу +эди +Эртага +Эртадан сўнг [Эртасиганг] +Эшитишимга +эълон +эълонингиз +эълонингизни +эътироф +Юклаш +Якшанба +Январи +Ярим кеча [Яримкеча, Яримчиликча] +яхши +қабул +қаерда +Қанақа +қаноатманда +қанча +қачон +қизиқарлидир +қиламиз +қилганим [қилганим, қилганими, қилгандайин] +қилдим +қилинг +қилинди +қилишди +қиммат +қиммати +Қимматидан +қирқ +Қиш +қувонарлими +қўнғироқ +Қўшимча +ҳайвонини +ҳам +ҳамза +Ҳар +ҳафтага +ҳақиқатан +ҳисоблаб +Ҳозир +ҳужжатни +Ўтган кун [Ўтган кўн] + + diff --git a/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt b/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt new file mode 100644 index 0000000000..0b2717d0ce --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt @@ -0,0 +1,200 @@ +Salom +Sallom [Slalom, Salom, Musallo, Alloma, Salo] +Rahmat +Rhmat [Rahmat, Marhamat] +Iltimos +Iltimo [Iltimos, Tilsimot, Timol] +Kattalar +Kattalarvf [Kattalashtir] +Yaxshi +Yashi [Ayshi, Tashi, Yash, Yasashi, Yarashish, Yalashish, Yaxshi] +Kelajak +Keljajak [Kelajak] +Oilaviy +Oilaaviy [Oilaviy, Hosilaviy] +Qarindosh +Qarinndosh [Qarindosh, Qayindoshlar, Oqarinish] +Shahar +Shaha [Shah, Shalha] +Dengiz +Dengizzz [Dengiz] +Quyosh +Quyyosh [Quyosh, Quysh] +Yulduz +Oyim +Kechqurun +Tushun +Suvchi +Sharob +Choyxona +Nonushta +Tushlik +Muzqaymoq +Desert +Tuzluq +Mevalar +Sabzavot +Baliq +Tuxumli +Sabza +Sariq +Salatlar +Shirinlik +Shokolad +Rishta +Kakao +Pishloq +Tort +Qaymoq +Sutli +Qatiq +Salomatlik +Temir +Zahar +Oqimli +Shamol +Olov +Yer +Osmon +Shanba +Dushanba +Seshanba +Chorshanba +Payshanba +Juma +Yakshanba +Oltin +Tong +Bomdod +Asr +Shom +Kun +Oqsoqol +Shoshqaloq +Kulgili +Muxlislilar +Tavsiflash +Tuzilishga +Mustaqillik +Tushuntirish +Boshqarish +Mashhurlik +Tarkibiy +Tahlil +Ishchi +Xalqaro +Tarjima +Mustahkamlik +Chaqaloq +Istiqbol +Tasvir +Taklif +Tasavvur +Jiddiy +Majburiyat +Asosiy +Tahdid +Tushunmovchilik +Ishonch +Maqomi +Ijodkor +Tadbirkor +Hayotiy +Mashhur +Bemorlik +Tadbir +Jismoniy +Madaniyat +Xavfsizlik +Sifatli +Suvli +Sotuvchi +Chetel +Tashqi +Sotuv +Tarbiyalanish +Murabbo +Sariqcha +Qovun +Shaharlik +Muhimlik +Tarbiyachilik +Xatolik +Balandlik +Yuzaki +Kuyov +Qiziquvchan +Orzular +Mashq +Qalampir +Muammo +Sadoqatli +Yovuzlik +Fikr-mulohaza +Boylik +Tushuncha +Zanjir +Eslatma +Tabassum +Ishonuvchi +Chidamlilik +Ilova +Birodarlik +Oqilona +Ijodiyot +Tayanch +Hurmat +Baxtli +Tajriba +Samimiylik +Shifokor +Ishrat +Baho +Namoyish +Qiyinchilik +Bolalar +Ishonchli +Taqdir +Shovqinli +Xalqaro +Baxt +Fursat +Hurmatli +Qulaylik +Zamonaviy +Sadoqat +Sabr +Nikoh +Jasorat +Barkamollik +Dunyoqarash +Omadli +Foydali +Yorqin +Mehribonlik +Fazilatli +Kutubxona +Istiqomatli +Fido +Bahor +Shafqatsizlik +Tafakkur +Fazilat +Qochish +Laziz +Uzoq +Ilhom +Omad +Hurmatli +Tandir +Sherzod +Bahoriy +Dilshod +Baxtli +Shonli +Nurli +Shafqatsizlik +Oqqush +Boylik +Toza +Sabrli diff --git a/Common/3dParty/hunspell/test/dst/vi_VN.txt b/Common/3dParty/hunspell/test/dst/vi_VN.txt new file mode 100644 index 0000000000..bcc3ab3150 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/vi_VN.txt @@ -0,0 +1,128 @@ +Bánh +Bang +bênh +bướng +bậy +Chanh +chum +chuyện +chép +Chùng +chắp +chệnh +chới +chữ +công +cạc +cột +cứu +Doanh +duyên +dùng +dể +dọng +gia +giày +giêng +Giảng +giềng +hon +Hoẳn +Hài +hôm +hước +hấu +hớt +hữu +Khiển +Khoào +khuya +khuyến +khách +khén +khẩn +khắp +khựng +kẻo +lang +liền +Loàng +Luỗng +lình +lương +lấp +lệnh +lịnh +lốn +lời +lựng +Muộn +Mãnh +mại +mạn +mổ +mởn +nghiễm +nghều +Ngoáy +Nguyên +ngóp +người +ngỏ +ngớp +ngụa +ngửng +nhiếp +nhu +nhà +nhân +Nhóm +nhưỡng +nhắm +nhổn +nhứt +ninh +noi +nãy +nạn +nốt +ong +pao +phiên +phiêu +Phên +Phương tiện [] +phẩm chất [] +phố đi bộ [phố đì bộ, phố đĩ bộ] +quan trọng [quàn trọng, quản trọng, quán trọng, quăn trọng, quằn trọng, quắn trọng, quặn trọng, quân trọng, quần trọng, quẩn trọng, quẫn trọng, quấn trọng, quận trọng] +quyền lợi [quyền] +quán cà phê [qùán cà phê, qủán cà phê, qũán cà phê, qúán cà phê, qụán cà phê, qưán cà phê, qừán cà phê, qửán cà phê, qữán cà phê, qứán cà phê, qựán cà phê] +quảng cáo [quảng] +Quốc +Quốc tế [Quốc] +riêng biệt [triêng] +rưỡi +Rải +Rẻng +rộng rãi [rộng] +siễn +sum +Sõng +Sưu +sưu tập [] +sử dụng [sử đụng] +Thiệt thòi [] +Thuộc về [Thuộc] +thuộc tính [] + +Слова с ошибками [] +thiệte [thiệt, thiệt e, thiện] +quốq tế [] +nguên [nguyên, nguồn] +khoao [khoào, khoai, khoa, khao, khoeo, khoèo, khoan] +chenh [chênh, chềnh, chểnh, chễnh, chếnh, chệnh, cheng, chen, chanh, chành, chảnh, chánh, chạnh, chinh, chình] +chhùng [chùng, chùn, hùng] +man +doah [doa, doanh, doan, doa h] +khien [khiên, khiền, khiển, khiến, khin, khen] +ngoay From 0476dedbac2269b8fdd4a2560bd2990226c36897 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 29 Feb 2024 21:54:50 +0300 Subject: [PATCH 028/117] fix bug #66656 --- OdfFile/Reader/Format/documentcontext.cpp | 2 +- OdfFile/Reader/Format/documentcontext.h | 1 + OdfFile/Reader/Format/styles.cpp | 31 +++++++++++++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/OdfFile/Reader/Format/documentcontext.cpp b/OdfFile/Reader/Format/documentcontext.cpp index a5549a3045..a74e425205 100644 --- a/OdfFile/Reader/Format/documentcontext.cpp +++ b/OdfFile/Reader/Format/documentcontext.cpp @@ -36,7 +36,7 @@ namespace cpdoccore { namespace odf_reader { -document_context::document_context() : last_paragraph(NULL) +document_context::document_context() : last_paragraph(NULL), is_old_version(false) { } diff --git a/OdfFile/Reader/Format/documentcontext.h b/OdfFile/Reader/Format/documentcontext.h index 4e1bf4bcbb..b37fde3163 100644 --- a/OdfFile/Reader/Format/documentcontext.h +++ b/OdfFile/Reader/Format/documentcontext.h @@ -49,6 +49,7 @@ public: office_element* get_last_element(); std::wstring office_class_; //openoffice xml 1.0 + bool is_old_version; //openoffice xml 1.0 std::vector levels; office_element* last_paragraph; diff --git a/OdfFile/Reader/Format/styles.cpp b/OdfFile/Reader/Format/styles.cpp index 6276981d8a..75cdd7736f 100644 --- a/OdfFile/Reader/Format/styles.cpp +++ b/OdfFile/Reader/Format/styles.cpp @@ -279,6 +279,8 @@ void style_content::add_child_element( xml::sax * Reader, const std::wstring & N } else if CP_CHECK_NAME(L"style", L"properties") { + Context->is_old_version = true; + office_element_ptr element; CP_CREATE_ELEMENT_SIMPLE(element); @@ -1775,16 +1777,41 @@ void style_master_page::pptx_convert(oox::pptx_conversion_context & Context) if (attlist_.draw_style_name_) { std::wstring style_name = attlist_.draw_style_name_.get(); - style_instance * style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::DrawingPage, true); + graphic_format_properties* default_properties = NULL; + + if (getContext()->is_old_version) + { + style_instance* style_inst_def = Context.root()->odf_context().styleContainer().style_by_name(L"standard", style_family::Graphic, true); + if ((style_inst_def) && (style_inst_def->content())) + { + default_properties = style_inst_def->content()->get_graphic_properties(); + } + } + else + { + style_instance* style_inst_def = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic); + if ((style_inst_def) && (style_inst_def->content())) + { + default_properties = style_inst_def->content()->get_graphic_properties(); + } + } + style_instance * style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::DrawingPage, true); if ((style_inst) && (style_inst->content())) { style_drawing_page_properties * properties = style_inst->content()->get_style_drawing_page_properties(); if (properties) { + odf_types::common_draw_fill_attlist calc_props; + if (default_properties) + { + calc_props.apply_from(default_properties->common_draw_fill_attlist_); + } + calc_props.apply_from(properties->content().common_draw_fill_attlist_); + oox::_oox_fill fill; - Compute_GraphicFill(properties->content().common_draw_fill_attlist_, office_element_ptr(), Context.root(), fill); + Compute_GraphicFill(calc_props, office_element_ptr(), Context.root(), fill); Context.get_slide_context().add_background(fill); } } From c649de088aa789056bcdf593c27fd72c77ebf198 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 29 Feb 2024 15:54:56 +0300 Subject: [PATCH 029/117] . (cherry picked from commit bba6d180dcbb95143a4b997054444f6feb7cd09f) --- OOXML/Binary/Sheets/Reader/BinaryWriter.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index 71ec17e991..073c3f05a0 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -8020,26 +8020,26 @@ void BinaryWorksheetTableWriter::WriteUserProtectedRange(const OOX::Spreadsheet: if (oUserProtectedRange.m_oName.IsInit()) { int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::Name); - m_oBcw.m_oStream.WriteStringW(*oUserProtectedRange.m_oName); + m_oBcw.m_oStream.WriteStringW3(*oUserProtectedRange.m_oName); m_oBcw.WriteItemEnd(nCurPos); } if (oUserProtectedRange.m_oSqref.IsInit()) { int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::Sqref); - m_oBcw.m_oStream.WriteStringW(*oUserProtectedRange.m_oSqref); + m_oBcw.m_oStream.WriteStringW3(*oUserProtectedRange.m_oSqref); m_oBcw.WriteItemEnd(nCurPos); } if (oUserProtectedRange.m_oText.IsInit()) { int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::Text); - m_oBcw.m_oStream.WriteStringW(*oUserProtectedRange.m_oText); + m_oBcw.m_oStream.WriteStringW3(*oUserProtectedRange.m_oText); m_oBcw.WriteItemEnd(nCurPos); } if (oUserProtectedRange.m_oType.IsInit()) { - m_oBcw.m_oStream.WriteBYTE(c_oSer_UserProtectedRange::Type); - m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte); + int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::Type); m_oBcw.m_oStream.WriteBYTE(oUserProtectedRange.m_oType->GetValue()); + m_oBcw.WriteItemEnd(nCurPos); } for (size_t i = 0; i < oUserProtectedRange.m_arUsers.size(); ++i) { From c9aad72ecc4f32dc35b4dbf9f260f1cbea954a16 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 1 Mar 2024 18:00:36 +0600 Subject: [PATCH 030/117] Fix bug 66671 --- OOXML/XlsxFormat/Styles/Borders.cpp | 31 +++++++++++++++++++---------- OOXML/XlsxFormat/Styles/NumFmts.cpp | 4 ++++ OOXML/XlsxFormat/Styles/rPr.cpp | 1 + 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index 5350fe6b44..f3d7e40e97 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -140,6 +140,13 @@ namespace OOX void CBorderProp::toBin(XLS::BiffStructure* obj) { auto ptr = static_cast(obj); + if(this == nullptr) + { + CColor color; + ptr->brtColor = color.GetDefaultColor(); + ptr->dg = 0x00; + return; + } if(m_oColor.IsInit()) ptr->brtColor = m_oColor->toColor(); else @@ -356,17 +363,21 @@ namespace OOX { auto ptr(new XLSB::Border); XLS::BaseObjectPtr objectPtr(ptr); - if(m_oBottom.IsInit()) - m_oBottom->toBin(&ptr->blxfBottom); - if(m_oDiagonal.IsInit()) - m_oDiagonal->toBin(&ptr->blxfDiag); - if(m_oTop.IsInit()) - m_oTop->toBin(&ptr->blxfTop); - if(m_oStart.IsInit()) - m_oStart->toBin(&ptr->blxfLeft); - if(m_oEnd.IsInit()) - m_oEnd->toBin(&ptr->blxfRight); + + m_oBottom->toBin(&ptr->blxfBottom); + m_oDiagonal->toBin(&ptr->blxfDiag); + m_oTop->toBin(&ptr->blxfTop); + m_oStart->toBin(&ptr->blxfLeft); + m_oEnd->toBin(&ptr->blxfRight); + if(m_oDiagonalDown.IsInit()) + ptr->fBdrDiagDown = m_oDiagonalDown->GetValue(); + else + ptr->fBdrDiagDown = false; + if(m_oDiagonalUp.IsInit()) + ptr->fBdrDiagUp = m_oDiagonalUp->GetValue(); + else + ptr->fBdrDiagUp = false; return objectPtr; } EElementType CBorder::getType () const diff --git a/OOXML/XlsxFormat/Styles/NumFmts.cpp b/OOXML/XlsxFormat/Styles/NumFmts.cpp index 9109cf6fe9..77a1f6b0b7 100644 --- a/OOXML/XlsxFormat/Styles/NumFmts.cpp +++ b/OOXML/XlsxFormat/Styles/NumFmts.cpp @@ -37,6 +37,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_unions/FMTS.h" +#include "../../XlsbFormat/Biff12_records/BeginFmts.h" namespace OOX { @@ -202,12 +203,15 @@ namespace OOX XLS::BaseObjectPtr CNumFmts::toBin() { auto fmts(new XLSB::FMTS); + auto beginfmt(new XLSB::BeginFmts); + fmts->m_BrtBeginFmts = XLS::BaseObjectPtr{beginfmt}; XLS::BaseObjectPtr objectPtr(fmts); std::vector objectVector; for(auto i:m_arrItems) { fmts->m_arBrtFmt.push_back(i->toBin()); } + beginfmt->cfmts = fmts->m_arBrtFmt.size(); return objectPtr; } EElementType CNumFmts::getType () const diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 6c99fa3e12..8fe1bf5a5e 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -494,6 +494,7 @@ namespace OOX ptr.bBlue = m_oRgb->Get_B(); ptr.bGreen = m_oRgb->Get_G(); ptr.bRed = m_oRgb->Get_R(); + ptr.xColorType = 2; } From 1ff92a8e7104c1a01da0714c261966c66dc3822e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 1 Mar 2024 19:33:15 +0600 Subject: [PATCH 031/117] Fix def name conversion --- MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp | 2 +- OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp index 6bf66b4a28..cc3fad865b 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp @@ -80,7 +80,7 @@ void PtgName::writeFields(CFRecord& record) { record.reserveNunBytes(12); } - else + else if(record.getGlobalWorkbookInfo()->Version < 0x0800 ) { record.reserveNunBytes(2); } diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index e5e1ce607f..bb0287e391 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -73,6 +73,8 @@ namespace OOX return; m_oRef = oReader.GetText3(); + if(m_oName.IsInit()) + XLS::GlobalWorkbookInfo::arDefineNames_static.push_back(m_oName.get()); } XLS::BaseObjectPtr CDefinedName::toBin() { From 3d1b8e64ac92a204ccab73919e13a183e7d6ce4b Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 1 Mar 2024 22:25:03 +0600 Subject: [PATCH 032/117] Fix shared formula conversion --- .../Biff_structures/SharedParsedFormula.cpp | 2 +- .../Logic/Biff_structures/StringPtgParser.cpp | 2 +- .../Worksheets/ConditionalFormatting.cpp | 2 +- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 57 +++++++------------ OOXML/XlsxFormat/Worksheets/SheetData.h | 2 +- 5 files changed, 23 insertions(+), 42 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SharedParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SharedParsedFormula.cpp index 066752eb2a..14d90b2532 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SharedParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SharedParsedFormula.cpp @@ -44,7 +44,7 @@ SharedParsedFormula::SharedParsedFormula(const bool is_part_of_a_revision, const SharedParsedFormula& SharedParsedFormula::operator=(const std::wstring& value) { - ParsedFormula::operator = (value); + parseStringFormula(value, L"SharedParsedFormula"); return *this; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 03918299b1..d040528506 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -341,7 +341,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R { if(L"SharedParsedFormula" == tag_name || L"CFParsedFormulaNoCCE" == tag_name) { - found_operand = OperandPtgPtr(new PtgAreaN(operand_str, OperandPtg::ptg_VALUE, rgce.getLocation())); + found_operand = OperandPtgPtr(new PtgAreaN(operand_str, OperandPtg::ptg_REFERENCE, rgce.getLocation())); } else { diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 954ac25be5..169bac34e4 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -2642,7 +2642,7 @@ XLS::BaseObjectPtr CConditionalFormatting::toBin() XLS::CellRef formatingfirstCell; if(m_oSqRef.IsInit()) { - auto conditionPtr(new XLSB::BeginConditionalFormatting);// + auto conditionPtr(new XLSB::BeginConditionalFormatting); ptr->m_BrtBeginConditionalFormatting = XLS::BaseObjectPtr{conditionPtr}; conditionPtr->ccf = m_arrItems.size(); conditionPtr->sqrfx.strValue = m_oSqRef.get(); diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index fc00ce1b7a..1e887b7667 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -2183,53 +2183,34 @@ namespace OOX if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeShared) { - m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeNormal; - ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + pSHRFMLACELL = new XLSB::SHRFMLACELL(0,0, refs); + ptr->m_source = XLS::BaseObjectPtr{pSHRFMLACELL}; pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + pSHRFMLACELL->_fmlacell = XLS::BaseObjectPtr{pFMLACELL}; if(!m_oFormula->m_sText.empty()) { - m_oFormula->toBin(pFMLACELL->m_source); + auto shrFmla(new XLSB::ShrFmla(cellref)); + pSHRFMLACELL->m_source = XLS::BaseObjectPtr{shrFmla}; + m_oFormula->toBin(pSHRFMLACELL->m_source); - sharedFormulas.shrFmla.push_back(std::make_pair(cellref, m_oFormula->m_sText)); + sharedFormulas.shrFmla.push_back(cellref); } - else if(m_oFormula->m_oSi.IsInit() && sharedFormulas.shrFmla.size() > m_oFormula->m_oSi->GetValue() ) + if(m_oFormula->m_oSi.IsInit() && sharedFormulas.shrFmla.size() > m_oFormula->m_oSi->GetValue() ) { - - auto fmla = dynamic_cast(pSource); - - auto dataPair = sharedFormulas.shrFmla[m_oFormula->m_oSi->GetValue()]; - sourceCellRef = dataPair.first; - int coldiff = 0; - if(sourceCellRef.colRelative) - coldiff = cellref.column - dataPair.first.column; - int rowdiff = 0; - if(sourceCellRef.rowRelative) - rowdiff = cellref.row - dataPair.first.row; - fmla->formula = dataPair.second; - if(rowdiff || coldiff) - { - for(auto i:fmla->formula.rgce.sequence) - { - if(i->ptg_id.is_initialized() && i->ptg_id.get() == 37) - { - auto area(static_cast(i.get())); - area->areaXlsb.columnFirst += coldiff; - area->areaXlsb.columnLast += coldiff; - area->areaXlsb.rowFirst += rowdiff; - area->areaXlsb.rowLast += rowdiff; - } - else if(i->ptg_id.is_initialized() && i->ptg_id.get() == 36) - { - auto area(static_cast(i.get())); - area->loc_xlsb.column += coldiff; - area->loc_xlsb.row += rowdiff; - } - } - } - + sourceCellRef = sharedFormulas.shrFmla[m_oFormula->m_oSi->GetValue()]; } + + auto rowPos = new XLS::PtgExp; + rowPos->rowXlsb = sourceCellRef.row; + auto colPos = new XLS::PtgExtraCol; + colPos->col = sourceCellRef.column; + auto cellFmla = dynamic_cast(pSource); + cellFmla->formula.rgce.addPtg(PtgPtr{rowPos}); + cellFmla->formula.rgcb.addPtg(PtgPtr{colPos}); + + } else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeArray) { diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.h b/OOXML/XlsxFormat/Worksheets/SheetData.h index 1b18f455f1..ea9e1f145b 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.h +++ b/OOXML/XlsxFormat/Worksheets/SheetData.h @@ -128,7 +128,7 @@ namespace OOX struct sharedFormula { - std::vector> shrFmla; + std::vector shrFmla; std::vector> arrfmla; }; class CFormula : public WritingElement From 6bbf1190a7b0b543a50530d64d9ddaad10be5ea5 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 1 Mar 2024 22:25:33 +0600 Subject: [PATCH 033/117] Fix reference limits --- MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp | 8 ++++---- .../XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp | 8 ++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp index d1b3cbb4e7..4050d9f541 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp @@ -130,9 +130,9 @@ const int str2column(std::wstring::const_iterator& str_begin, std::wstring::cons column = (column + 1) * radix + (symb - L'A'); } - if(column > 255) + if(column > 16384) { - column = 255; + column = 16384; } return column; @@ -152,9 +152,9 @@ const int str2row(std::wstring::const_iterator& str_begin, std::wstring::const_i row = row * 10 + (symb - L'0'); } --row; - if(row > 65535) + if(row > 1048576) { - row = 65535; + row = 1048576; } return row; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp index dd5354f3ce..4de86dbffc 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp @@ -186,12 +186,16 @@ void CellRangeRef::fromString(const std::wstring& str) } rowFirst = 0; - rowLast = 65535; + rowLast = 1048576; + rowFirstRelative = false; + rowLastRelative = false; } if(-1 == columnFirst || -1 == columnLast) // no column specified - means whole row or range of rows { columnFirst = 0; - columnLast = 255; + columnLast = 16384; + columnFirstRelative = false; + columnLastRelative = false; } to_string_cache.clear(); } From aad25c3da835869201370c34af9d572e6ad33e88 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Sat, 2 Mar 2024 15:22:30 +0300 Subject: [PATCH 034/117] fix bug #66699 --- OdfFile/Reader/Format/draw_shapes_pptx.cpp | 5 +---- OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h | 3 ++- OdfFile/Writer/Format/draw_shapes.cpp | 1 + OdfFile/Writer/Format/draw_shapes.h | 3 ++- OdfFile/Writer/Format/odf_drawing_context.cpp | 12 +++++++----- OdfFile/Writer/Format/oox_shape_defines.h | 5 +++-- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/OdfFile/Reader/Format/draw_shapes_pptx.cpp b/OdfFile/Reader/Format/draw_shapes_pptx.cpp index e3e2cd70ba..04bc9eb8ed 100644 --- a/OdfFile/Reader/Format/draw_shapes_pptx.cpp +++ b/OdfFile/Reader/Format/draw_shapes_pptx.cpp @@ -397,10 +397,7 @@ void draw_connector::pptx_convert(oox::pptx_conversion_context & Context) } void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context) { - find_draw_type_oox(); - - bool set_shape = oox_convert(Context.get_slide_context().get_properties()); - + bool set_shape = oox_convert(Context.get_slide_context().get_properties()); if (!set_shape) { diff --git a/OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h b/OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h index 6845f5e1e9..0bce887856 100644 --- a/OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h +++ b/OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h @@ -404,7 +404,8 @@ public: view_box = L"0 0 21600 21600"; modifiers = L"6300 24300"; glue_points = L"?f40 ?f41"; - + glue_points_leaving_directions = L"180"; + add(L"f0", L"$0 -10800"); add(L"f1", L"$1 -10800"); add(L"f2", L"if(?f18 ,$0 ,0)"); diff --git a/OdfFile/Writer/Format/draw_shapes.cpp b/OdfFile/Writer/Format/draw_shapes.cpp index 7149a8fed2..49b8c3dc91 100644 --- a/OdfFile/Writer/Format/draw_shapes.cpp +++ b/OdfFile/Writer/Format/draw_shapes.cpp @@ -428,6 +428,7 @@ void draw_enhanced_geometry_attlist::serialize(CP_ATTR_NODE) //CP_XML_ATTR_OPT(L"drawooo:enhanced-path", draw_enhanced_path_); CP_XML_ATTR_OPT(L"draw:enhanced-path", draw_enhanced_path_); CP_XML_ATTR_OPT(L"draw:glue-points", draw_glue_points_); + CP_XML_ATTR_OPT(L"draw:glue-point-leaving-directions", glue_points_leaving_directions_); CP_XML_ATTR_OPT(L"draw:mirror-vertical", draw_mirror_vertical_); CP_XML_ATTR_OPT(L"draw:mirror-horizontal", draw_mirror_horizontal_); diff --git a/OdfFile/Writer/Format/draw_shapes.h b/OdfFile/Writer/Format/draw_shapes.h index ba79801a85..de272fb8e2 100644 --- a/OdfFile/Writer/Format/draw_shapes.h +++ b/OdfFile/Writer/Format/draw_shapes.h @@ -311,7 +311,8 @@ public: _CP_OPT(std::wstring) draw_enhanced_path_; _CP_OPT(std::wstring) draw_text_areas_; _CP_OPT(std::wstring) draw_glue_points_; - + _CP_OPT(std::wstring) glue_points_leaving_directions_; + _CP_OPT(std::wstring) draw_sub_view_size_; _CP_OPT(odf_types::Bool) draw_mirror_vertical_; diff --git a/OdfFile/Writer/Format/odf_drawing_context.cpp b/OdfFile/Writer/Format/odf_drawing_context.cpp index 6492c82691..ead1b31063 100644 --- a/OdfFile/Writer/Format/odf_drawing_context.cpp +++ b/OdfFile/Writer/Format/odf_drawing_context.cpp @@ -1178,15 +1178,17 @@ void odf_drawing_context::end_shape() enhanced->attlist_.draw_glue_points_ = shape_define->glue_points; enhanced->attlist_.draw_sub_view_size_ = shape_define->sub_view_size; + enhanced->attlist_.glue_points_leaving_directions_ = shape_define->glue_points_leaving_directions; enhanced->attlist_.draw_path_stretchpoint_x_ = shape_define->path_stretchpoint_x; enhanced->attlist_.draw_path_stretchpoint_y_ = shape_define->path_stretchpoint_y; - if (!shape_define->modifiers.empty()) - { - enhanced->attlist_.draw_modifiers_ = shape_define->modifiers; - } - else if (impl_->current_drawing_state_.oox_shape_ && !impl_->current_drawing_state_.oox_shape_->modifiers.empty()) + //if (!shape_define->modifiers.empty()) + //{ + // enhanced->attlist_.draw_modifiers_ = shape_define->modifiers; + //} + + if (impl_->current_drawing_state_.oox_shape_ && !impl_->current_drawing_state_.oox_shape_->modifiers.empty()) { enhanced->attlist_.draw_modifiers_ = impl_->current_drawing_state_.oox_shape_->modifiers; } diff --git a/OdfFile/Writer/Format/oox_shape_defines.h b/OdfFile/Writer/Format/oox_shape_defines.h index 01b987f855..f281c352aa 100644 --- a/OdfFile/Writer/Format/oox_shape_defines.h +++ b/OdfFile/Writer/Format/oox_shape_defines.h @@ -82,9 +82,10 @@ namespace cpdoccore _CP_OPT(std::wstring) view_box; _CP_OPT(std::wstring) sub_view_size; _CP_OPT(std::wstring) glue_points; + _CP_OPT(std::wstring) glue_points_leaving_directions; - std::wstring path_stretchpoint_x; - std::wstring path_stretchpoint_y; + _CP_OPT(std::wstring) path_stretchpoint_x; + _CP_OPT(std::wstring) path_stretchpoint_y; std::wstring odf_type_name; }; From d88fc239b8d446d18be402c443129fa89458f8d5 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Sat, 2 Mar 2024 15:42:11 +0300 Subject: [PATCH 035/117] fix convert to xlsb --- X2tConverter/src/lib/xlsx.h | 61 +++++++++++++------------------------ 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/X2tConverter/src/lib/xlsx.h b/X2tConverter/src/lib/xlsx.h index 396b6233c5..fdd8a159e7 100644 --- a/X2tConverter/src/lib/xlsx.h +++ b/X2tConverter/src/lib/xlsx.h @@ -157,41 +157,36 @@ namespace NExtractTools convertParams.m_bTempIsXmlOptions = false; return nRes; } + _UINT32 xlsx_dir2xlsb_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + const OOX::CPath oox_path(sFrom); + + OOX::Spreadsheet::CXlsb oXlsb; + oXlsb.m_bWriteToXlsb = true; + oXlsb.Read(oox_path); + + OOX::CContentTypes oContentTypes; + _UINT32 nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } _UINT32 xlst_bin2xlsb_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSX); + _UINT32 nRes = 0; + + std::wstring sTempUnpackedXLSB = convertParams.m_sTempResultOOXMLDirectory; - std::wstring sTargetBin; - if (params.getFromChanges()) - { - params.setFromChanges(false); - nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::XLST, sTargetBin, params, convertParams); - } - else - sTargetBin = sFrom; - - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - - oCXlsxSerializer.setMacroEnabled(params.m_bMacro); - oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); - oCXlsxSerializer.setFontDir(params.getFontPath()); - - std::wstring sXmlOptions = params.getXmlOptions(); - - std::wstring sMediaPath; // will be filled by 'CreateXlsxFolders' method - std::wstring sEmbedPath; // will be filled by 'CreateXlsxFolders' method - - oCXlsxSerializer.CreateXlsxFolders(sXmlOptions, convertParams.m_sTempResultOOXMLDirectory, sMediaPath, sEmbedPath); + convertParams.m_sTempResultOOXMLDirectory = sTempUnpackedXLSX; + nRes = xlst_bin2xlsx_dir(sFrom, sTempUnpackedXLSX, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = oCXlsxSerializer.loadFromFile(sTargetBin, convertParams.m_sTempResultOOXMLDirectory, sXmlOptions, sMediaPath, sEmbedPath); + convertParams.m_sTempResultOOXMLDirectory = sTempUnpackedXLSB; + nRes = xlsx_dir2xlsb_dir(sTempUnpackedXLSX, sTempUnpackedXLSB, params, convertParams); } - // удаляем EditorWithChanges, потому что он не в Temp - if (sFrom != sTargetBin) - NSFile::CFileBinary::Remove(sTargetBin); - - convertParams.m_sTempResultOOXMLDirectory = L""; return nRes; } _UINT32 xlst_bin2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) @@ -358,19 +353,7 @@ namespace NExtractTools } return nRes; } - _UINT32 xlsx_dir2xlsb_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) - { - const OOX::CPath oox_path(sFrom); - OOX::Spreadsheet::CXlsb oXlsb; - oXlsb.m_bWriteToXlsb = true; - oXlsb.Read(oox_path); - - OOX::CContentTypes oContentTypes; - _UINT32 nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; - - return nRes; - } _UINT32 xlsx_dir2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { return NSCommon::ooxml2ooxml(sFrom, sTo, params, convertParams, L"xlsb", xlsx_dir2xlsb_dir); From f369715c55060d89da45876e9c2463ab2a704376 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 4 Mar 2024 18:12:00 +0600 Subject: [PATCH 036/117] Fix book view conversion --- OOXML/XlsxFormat/Workbook/BookViews.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/BookViews.cpp b/OOXML/XlsxFormat/Workbook/BookViews.cpp index cc2cc8a740..77c8a1a9ae 100644 --- a/OOXML/XlsxFormat/Workbook/BookViews.cpp +++ b/OOXML/XlsxFormat/Workbook/BookViews.cpp @@ -76,18 +76,16 @@ namespace OOX } XLS::BaseObjectPtr CWorkbookView::toBin() { - auto ptr(new XLS::Window1); + auto ptr(new XLSB::BookView); XLS::BaseObjectPtr objectPtr(ptr); if (m_oActiveTab.IsInit()) { ptr->itabCur = m_oActiveTab->GetValue(); - ptr->ctabSel = m_oActiveTab->GetValue(); } else { ptr->itabCur = 0; - ptr->ctabSel = 0; } if (m_oAutoFilterDateGrouping.IsInit()) From b88d303cebc8c7ecaa5ba39b6a1d1850886a5f3f Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 4 Mar 2024 19:43:28 +0300 Subject: [PATCH 037/117] fix bug #66722 --- OdfFile/Reader/Format/styles_lite_container.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OdfFile/Reader/Format/styles_lite_container.cpp b/OdfFile/Reader/Format/styles_lite_container.cpp index 0b74c34cd9..0381d1d016 100644 --- a/OdfFile/Reader/Format/styles_lite_container.cpp +++ b/OdfFile/Reader/Format/styles_lite_container.cpp @@ -114,16 +114,17 @@ std::wstring doc_props_container::dump_user_defined() CP_XML_WRITER(output) { + int pid = 2; for (std::map::iterator it = impl_->map_user_defineds.begin(); it != impl_->map_user_defineds.end(); ++it) { CP_XML_NODE(L"property") { CP_XML_ATTR(L"fmtid", L"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"); - CP_XML_ATTR(L"name", it->first); - CP_XML_ATTR(L"pid", 2); + CP_XML_ATTR(L"pid", pid++); + CP_XML_ATTR(L"name", XmlUtils::EncodeXmlString(it->first)); CP_XML_NODE(L"vt:lpwstr") { - CP_XML_STREAM() << it->second; + CP_XML_STREAM() << XmlUtils::EncodeXmlString(it->second); } } } From 46fc80f423cee0e1501fc8d650e2a14ceeaade3e Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 6 Mar 2024 10:15:20 +0300 Subject: [PATCH 038/117] fix bug #45218 --- .../Format/odf_number_styles_context.cpp | 37 ++++++++++++------- .../Writer/Format/odf_number_styles_context.h | 9 ++--- OdfFile/Writer/Format/ods_table_state.cpp | 24 +++++------- 3 files changed, 38 insertions(+), 32 deletions(-) diff --git a/OdfFile/Writer/Format/odf_number_styles_context.cpp b/OdfFile/Writer/Format/odf_number_styles_context.cpp index e4c383a6ee..1520be6bed 100644 --- a/OdfFile/Writer/Format/odf_number_styles_context.cpp +++ b/OdfFile/Writer/Format/odf_number_styles_context.cpp @@ -929,31 +929,42 @@ void odf_number_styles_context::detect_format(number_format_state & state) std::wstring strFormatCode = boost::regex_replace(state.format_code[0], re_unwanted, &replace_unwanted, boost::match_any | boost::format_all); //find [$-]. - boost::wregex re(L"(?=(\\[{1}\\${1}(\\w*)\\-(\\d*)\\]{1}))"); + boost::wregex re(L"(\\[\\$.*\-[\\w\\d]+\\])"); std::vector result; std::wstring tmp = strFormatCode; bool b = boost::regex_split(std::back_inserter(result), tmp, re); - if (b && result.size() >= 3) - { - state.currency_str = result[1]; - - int code = -1; - try + if (b && result.size() > 0) + {//split Currency String + tmp = result[0].substr(1, result[0].size() - 2); + size_t sep = tmp.find(L"-"); + if (sep != std::wstring::npos) { - std::wstringstream ss; - ss << std::hex << result[2]; - ss >> state.language_code; - }catch(...){} + state.currency_str = tmp.substr(1, sep - 1); + + try + { + std::wstringstream ss; + ss << std::hex << tmp.substr(sep + 1); + ss >> state.language_code; + } + catch (...) {} + } + if (false == state.currency_str.empty()) + { + size_t pos_digit = (std::min)(strFormatCode.find(L"0"), strFormatCode.find(L"#")); + size_t pos_currency = strFormatCode.find(state.currency_str); + if (pos_digit != std::wstring::npos) state.currency_pos = pos_digit < pos_currency ? 1 : 2; + } XmlUtils::replace_all(strFormatCode, result[0], L""); } if (state.format_code.size() > 0) //any { - boost::wregex re1(L"([mM]{2,}|[hH]{2,}|[sS]{2,})"); - boost::wregex re2(L"([mM]{1,}|[dD]{1,}|[yY]{2,})"); + boost::wregex re1(L"([mM]{2,}|[hH]{1,}|[sS]{2,})"); + boost::wregex re2(L"([M]{2,}|[m]{1,}|[dD]{1,}|[yY]{2,})"); tmp = strFormatCode; diff --git a/OdfFile/Writer/Format/odf_number_styles_context.h b/OdfFile/Writer/Format/odf_number_styles_context.h index 3dca3db10f..0fffa3d735 100644 --- a/OdfFile/Writer/Format/odf_number_styles_context.h +++ b/OdfFile/Writer/Format/odf_number_styles_context.h @@ -49,7 +49,7 @@ typedef shared_ptr::Type office_element_ptr; struct number_format_state { - int oox_num_fmt;//дефолтные (по документации - номера 0-163, за исключением некоторых) + int oox_num_fmt;//дефолтные odf_types::office_value_type::type ods_type; @@ -59,6 +59,7 @@ struct number_format_state unsigned int language_code; std::wstring currency_str; + unsigned int currency_pos = 0; }; class odf_number_styles_context @@ -67,7 +68,7 @@ public: odf_number_styles_context(); void set_odf_context(odf_conversion_context * Context); - number_format_state & add_or_find(int oox_num_fmt, std::wstring formatCode = L""); + number_format_state & add_or_find(int oox_num_fmt, std::wstring formatCode = L""); void process_styles(office_element_ptr root ); private: @@ -81,7 +82,7 @@ private: void detect_format(number_format_state & state); //////////////// - odf_conversion_context *odf_context_; + odf_conversion_context *odf_context_; std::vector styles_elments; ////////////////// @@ -94,8 +95,6 @@ private: void create_percentage_style(number_format_state & state, office_element_ptr & root_elm); void create_numbers(number_format_state & state, office_element_ptr & elm, office_element_ptr & root_elm); - - }; } } diff --git a/OdfFile/Writer/Format/ods_table_state.cpp b/OdfFile/Writer/Format/ods_table_state.cpp index e51324774f..df7a0d1ad4 100644 --- a/OdfFile/Writer/Format/ods_table_state.cpp +++ b/OdfFile/Writer/Format/ods_table_state.cpp @@ -100,9 +100,9 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен } return convert_date(iDate); } - std::wstring convert_time(double dTime) + std::wstring convert_time(double dTime, bool bPT) { - //12H15M42S + //12H15M42S - pt int hours = 0, minutes = 0; double sec = 0; @@ -110,23 +110,20 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен double millisec = day.total_milliseconds() * dTime; - sec = millisec / 1000.; hours = (int)(sec / 60. / 60.); - minutes = (int)((sec - (hours * 60 * 60)) / 60.); - sec = sec - (hours * 60 + minutes) * 60.; + minutes = (int)((sec - (hours * (int)60 * (int)60)) / 60.); + sec = sec - (hours * (int)60 + minutes) * 60.; int sec1 = (int)sec; std::wstring time_str = (hours < 10 ? L"0" : L"") + boost::lexical_cast(hours) - //+ std::wstring(L"H") + - + std::wstring(L":") + + + (bPT ? std::wstring(L"H") : std::wstring(L":")) + (minutes < 10 ? L"0" : L"") + boost::lexical_cast(minutes) - //+ std::wstring(L"M") + - + std::wstring(L":") + - (sec1 < 10 ? L"0" : L"") + boost::lexical_cast(sec1); - //+ std::wstring(L"S"); + + (bPT ? std::wstring(L"M") : std::wstring(L":")) + + (sec1 < 10 ? L"0" : L"") + boost::lexical_cast(sec1) + + (bPT ? std::wstring(L"S") : std::wstring(L"")); return time_str; } @@ -148,7 +145,7 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен std::wstring sDate, sTime; if (dTime > 0) { - sTime = convert_time(dTime); + sTime = convert_time(dTime, false); } if (nDate > 0) { @@ -173,8 +170,7 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен { return oox_time; } - //PT12H15M42S - return std::wstring(L"PT") + convert_time(dTime); + return std::wstring(L"PT") + convert_time(dTime, true); } }; From f6713d751b29705a097ee07fa3168920b7bd8522 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 6 Mar 2024 11:41:39 +0300 Subject: [PATCH 039/117] fix bug #66750 --- OOXML/Common/SimpleTypes_Spreadsheet.h | 22 +++++++++++----------- OdfFile/Writer/Format/ods_table_state.cpp | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/OOXML/Common/SimpleTypes_Spreadsheet.h b/OOXML/Common/SimpleTypes_Spreadsheet.h index 97c7808f93..70de28e593 100644 --- a/OOXML/Common/SimpleTypes_Spreadsheet.h +++ b/OOXML/Common/SimpleTypes_Spreadsheet.h @@ -808,18 +808,18 @@ namespace SimpleTypes //---------------------------------------------------- // 18.18.82 ST_TimePeriod (Conditional Format Value Object Type) //---------------------------------------------------- - enum ETimePeriod + enum ETimePeriod { - last7Days = 0, - lastMonth = 1, - lastWeek = 2, - nextMonth = 3, - nextWeek = 4, - thisMonth = 5, - thisWeek = 6, - today = 7, - tomorrow = 8, - yesterday = 9 + last7Days = 0, + lastMonth = 1, + lastWeek = 2, + nextMonth = 3, + nextWeek = 4, + thisMonth = 5, + thisWeek = 6, + today = 7, + tomorrow = 8, + yesterday = 9 }; DEFINE_SIMPLE_TYPE(ST_TimePeriod, ETimePeriod, last7Days) diff --git a/OdfFile/Writer/Format/ods_table_state.cpp b/OdfFile/Writer/Format/ods_table_state.cpp index df7a0d1ad4..eda4086706 100644 --- a/OdfFile/Writer/Format/ods_table_state.cpp +++ b/OdfFile/Writer/Format/ods_table_state.cpp @@ -2080,18 +2080,18 @@ void ods_table_state::set_conditional_time(int period) { switch (period) { - case 1: date_is->attr_.calcext_date_ = odf_types::time_period::yesterday; break; - case 2: date_is->attr_.calcext_date_ = odf_types::time_period::tomorrow; break; - case 3: date_is->attr_.calcext_date_ = odf_types::time_period::last7Days; break; - case 4: date_is->attr_.calcext_date_ = odf_types::time_period::thisMonth; break; - case 5: date_is->attr_.calcext_date_ = odf_types::time_period::lastMonth; break; - case 6: date_is->attr_.calcext_date_ = odf_types::time_period::nextMonth; break; - case 7: date_is->attr_.calcext_date_ = odf_types::time_period::thisWeek; break; - case 8: date_is->attr_.calcext_date_ = odf_types::time_period::lastWeek; break; - case 9: date_is->attr_.calcext_date_ = odf_types::time_period::nextWeek; break; + case 1: date_is->attr_.calcext_date_ = odf_types::time_period::lastMonth; break; + case 2: date_is->attr_.calcext_date_ = odf_types::time_period::lastWeek; break; + case 3: date_is->attr_.calcext_date_ = odf_types::time_period::nextMonth; break; + case 4: date_is->attr_.calcext_date_ = odf_types::time_period::nextWeek; break; + case 5: date_is->attr_.calcext_date_ = odf_types::time_period::thisMonth; break; + case 6: date_is->attr_.calcext_date_ = odf_types::time_period::thisWeek; break; + case 7: date_is->attr_.calcext_date_ = odf_types::time_period::today; break; + case 8: date_is->attr_.calcext_date_ = odf_types::time_period::tomorrow; break; + case 9: date_is->attr_.calcext_date_ = odf_types::time_period::yesterday; break; case 0: default: - date_is->attr_.calcext_date_ = odf_types::time_period::today; + date_is->attr_.calcext_date_ = odf_types::time_period::last7Days; } } } From 296383bd6f4658bd033c8d466cc0bb3b49a1afeb Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 6 Mar 2024 12:05:45 +0300 Subject: [PATCH 040/117] fix bug #66744 --- MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp b/MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp index 29bf29e884..036ac05124 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp @@ -111,7 +111,7 @@ void BulletsConverter::ConvertPFRun(PPTX::Logic::TextParagraphPr &oPPr, CTextPFR pLnSpc->m_name = L"a:lnSpc"; if (val > 0) - pLnSpc->spcPct = val * 12.5; + pLnSpc->spcPts = val * 12.5; else if (val < 0 && val > -13200) pLnSpc->spcPct = val * -1000; From 422f0736c44df096eb83b7e7ddd4d29af976996b Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Mar 2024 17:45:57 +0600 Subject: [PATCH 041/117] Fix colot conversion --- OOXML/XlsxFormat/Styles/Fills.cpp | 26 +++++++++++--------------- OOXML/XlsxFormat/Styles/Fonts.cpp | 3 +++ OOXML/XlsxFormat/Styles/rPr.cpp | 6 +++++- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index 242ef9b09c..7b123660f5 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -163,26 +163,15 @@ namespace OOX if(m_oBgColor.IsInit()) ptr->brtColorBack = m_oBgColor->toColor(); else - { - ptr->brtColorBack.bAlpha = 255; - ptr->brtColorBack.bBlue = 0; - ptr->brtColorBack.bGreen = 0; - ptr->brtColorBack.bRed = 0; - ptr->brtColorBack.index = 64; - ptr->brtColorBack.nTintAndShade = 0; - ptr->brtColorBack.xColorType = 0; + { m_oBgColor.Init(); + ptr->brtColorBack = m_oBgColor->GetDefaultColor(); } if(m_oFgColor.IsInit()) ptr->brtColorFore = m_oFgColor->toColor(); else { - ptr->brtColorFore.bAlpha = 255; - ptr->brtColorFore.bBlue = 255; - ptr->brtColorFore.bGreen = 255; - ptr->brtColorFore.bRed = 255; - ptr->brtColorFore.index = 64; - ptr->brtColorFore.nTintAndShade = 0; - ptr->brtColorFore.xColorType = 0; + m_oFgColor.Init(); + ptr->brtColorFore = m_oFgColor->GetDefaultColor(); } } EElementType CPatternFill::getType () const @@ -530,6 +519,13 @@ namespace OOX { m_oPatternFill->toBin(objectPtr); } + else + { + CColor color; + ptr->fls = 0; + ptr->brtColorBack = color.GetDefaultColor(); + ptr->brtColorFore = color.GetDefaultColor(); + } if(m_oGradientFill.IsInit()) { diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index fd18d078e3..0eb205ecf3 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -241,6 +241,8 @@ namespace OOX ptr->uls = 34; } } + else + ptr->uls = 0; if(m_oFamily.IsInit()) ptr->bFamily = m_oFamily->m_oFontFamily->GetValue(); @@ -252,6 +254,7 @@ namespace OOX ptr->brtColor = m_oColor->toColor(); else { + m_oColor.Init(); ptr->brtColor = m_oColor->GetDefaultColor(); } diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 8fe1bf5a5e..63be11df16 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -460,7 +460,7 @@ namespace OOX ptr.xColorType = 0; ptr.nTintAndShade = 0; ptr.index = 0; - ptr.fValidRGB = true; + ptr.fValidRGB = 0; return ptr; } @@ -472,6 +472,7 @@ namespace OOX ptr.bBlue = 0; ptr.bGreen = 0; ptr.bRed = 0; + ptr.fValidRGB = false; if(m_oAuto.IsInit()) { @@ -495,7 +496,10 @@ namespace OOX ptr.bGreen = m_oRgb->Get_G(); ptr.bRed = m_oRgb->Get_R(); ptr.xColorType = 2; + ptr.fValidRGB = true; } + else + ptr.xColorType = 0; if ( m_oTint.IsInit()) From e787102046f8406c44b774288f50d78f1bf789c9 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Mar 2024 18:47:52 +0600 Subject: [PATCH 042/117] Fix bug #27583 --- OOXML/Binary/Sheets/Reader/CSVReader.cpp | 3 ++ .../CellFormatController.cpp | 35 ++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/OOXML/Binary/Sheets/Reader/CSVReader.cpp b/OOXML/Binary/Sheets/Reader/CSVReader.cpp index e9f32647fc..29aba988e6 100644 --- a/OOXML/Binary/Sheets/Reader/CSVReader.cpp +++ b/OOXML/Binary/Sheets/Reader/CSVReader.cpp @@ -219,6 +219,8 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C smart_ptr pWorksheet(new OOX::Spreadsheet::CWorksheet(NULL)); pWorksheet->m_oSheetData.Init(); + pWorksheet->m_oSheetFormatPr.Init(); + pWorksheet->m_oSheetFormatPr->m_oBaseColWidth = 9; //----------------------------------------------------------------------------------- DWORD nFileSize = 0; @@ -311,6 +313,7 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C INT nIndexRow = 0; INT nIndexCol = 0; OOX::Spreadsheet::CRow *pRow = new OOX::Spreadsheet::CRow(); + pRow->m_oR.Init(); pRow->m_oR->SetValue(nIndexRow + 1); diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp index 265c6ae7f8..353c032162 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp @@ -42,10 +42,21 @@ #include #include + const std::wstring DefaultDateFormat = L"dd.mm.yyyy"; const std::wstring DefaultPercentFormat = L"0.0%"; const std::wstring DefaultDollarFormat = L"#,##0.00$"; +std::map defaultDataFormats +{ + {DefaultDateFormat, 14}, + {L"d-mmm-yy", 15}, + {L"d-mmm", 16}, + {L"mmm-yy", 17}, + {L"m/d/yy h:mm", 22}, + {L"h:mm", 20} +}; + CellFormatController::CellFormatController(OOX::Spreadsheet::CStyles *styles): m_pStyles{styles} { @@ -170,23 +181,29 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const void CellFormatController::createFormatStyle(const std::wstring &format) { - if (!m_pStyles->m_oNumFmts.IsInit()) + auto prepareFormat = defaultDataFormats.find(format); + if(prepareFormat == defaultDataFormats.end()) { - m_pStyles->m_oNumFmts.Init(); + if (!m_pStyles->m_oNumFmts.IsInit()) + { + m_pStyles->m_oNumFmts.Init(); + } + m_pStyles->m_oNumFmts->m_arrItems.push_back(new OOX::Spreadsheet::CNumFmt()); + m_pStyles->m_oNumFmts->m_arrItems.back()->m_oFormatCode = format; + m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId.Init(); + m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId->SetValue(164 + m_pStyles->m_oNumFmts->m_arrItems.size()); } - m_pStyles->m_oNumFmts->m_arrItems.push_back(new OOX::Spreadsheet::CNumFmt()); - m_pStyles->m_oNumFmts->m_arrItems.back()->m_oFormatCode = format; - m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId.Init(); - m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId->SetValue(164 + m_pStyles->m_oNumFmts->m_arrItems.size()); - // Normal + data format OOX::Spreadsheet::CXfs* pXfs = new OOX::Spreadsheet::CXfs(); pXfs->m_oBorderId.Init(); pXfs->m_oBorderId->SetValue(0); pXfs->m_oFillId.Init(); pXfs->m_oFillId->SetValue(0); pXfs->m_oFontId.Init(); pXfs->m_oFontId->SetValue(0); - pXfs->m_oNumFmtId.Init(); pXfs->m_oNumFmtId->SetValue(m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId->GetValue()); - + pXfs->m_oNumFmtId.Init(); + if(prepareFormat == defaultDataFormats.end()) + pXfs->m_oNumFmtId->SetValue(m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId->GetValue()); + else + pXfs->m_oNumFmtId->SetValue(prepareFormat->second); m_pStyles->m_oCellXfs->m_arrItems.push_back(pXfs); auto styleNum = (unsigned int)(m_pStyles->m_oCellXfs->m_arrItems.size() - 1); From 82cd32aa858bdb91838faefae1c97bc0b0f8926a Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 6 Mar 2024 19:38:20 +0300 Subject: [PATCH 043/117] fix bug #66772 --- .../Converter/xlsx_conditionalFormatting.cpp | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp index 8a1dada7ba..ecb0c857c8 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp @@ -339,11 +339,13 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) } else if (0 <= (pos = f.find(L"is-between("))) { + val = f.substr(11, f.size() - 12); impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression"; impl_->conditionalFormattings_.back().rules.back().formula = converter.convert_named_expr(val); } else if (0 <= (pos = f.find(L"is-time("))) { + val = f.substr(8, f.size() - 9); impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression"; impl_->conditionalFormattings_.back().rules.back().formula = converter.convert_named_expr(val); } @@ -464,6 +466,28 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) { val = converter.convert_named_expr( f ); } + else if (0 <= (pos = f.find(L"between"))) + { + if (0 <= (pos = f.find(L"not-between"))) + { + impl_->conditionalFormattings_.back().rules.back().operator_ = L"notBetween"; + val = f.substr(12, f.length() - 13); + } + else + { + impl_->conditionalFormattings_.back().rules.back().operator_ = L"between"; + val = f.substr(8, f.length() - 9); + } + + XmlUtils::replace_all(val, L"(", L""); + XmlUtils::replace_all(val, L")", L""); + if (0 <= (pos = val.find(L","))) + { + impl_->conditionalFormattings_.back().rules.back().formula2 = converter.convert_named_expr(val.substr(pos + 1)); + val = val.substr(0, pos); + } + val = converter.convert_named_expr(val); + } else if (0 <= (pos = f.find(L"!="))) { impl_->conditionalFormattings_.back().rules.back().operator_ = L"notEqual"; @@ -494,20 +518,6 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) impl_->conditionalFormattings_.back().rules.back().operator_ = L"greaterThan"; val = converter.convert_named_expr( f.substr(1) ); } - else if (0 <= (pos = f.find(L"between"))) - { - impl_->conditionalFormattings_.back().rules.back().operator_ = L"between"; - val = f.substr(8, f.length() - 9); - - XmlUtils::replace_all(val, L"(", L""); - XmlUtils::replace_all(val, L")", L""); - if (0 <= (pos = val.find(L","))) - { - impl_->conditionalFormattings_.back().rules.back().formula2 = converter.convert_named_expr( val.substr(pos + 1) ); - val = val.substr(0, pos); - } - val = converter.convert_named_expr( val ); - } else { val = converter.convert( f ); From 04480bb9eb06e3f7dd534821af89e5f2083cb94e Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 6 Mar 2024 20:06:43 +0300 Subject: [PATCH 044/117] fix bug #66766 --- X2tConverter/src/ASCConverters.cpp | 39 ++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index bd83aeae93..3e1e861c08 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -462,18 +462,26 @@ namespace NExtractTools NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); } - else if (0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nFormatTo)) + else if (0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nFormatTo) || + AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo || + AVS_OFFICESTUDIO_FILE_OTHER_ODF == nFormatTo) { std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); if (true == NSDirectory::CreateDirectory(sDocxDir)) { - params.m_bMacro = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo; + params.m_bMacro = AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo; convertParams.m_sTempResultOOXMLDirectory = sDocxDir; nRes = doct_bin2docx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = fromDocxDir(sDocxDir, sTo, nFormatTo, params, convertParams); + std::wstring sFileToCurrent = *params.m_sFileTo; + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + + nRes = fromDocxDir(sDocxDir, *params.m_sFileTo, nFormatTo, params, convertParams); } } else @@ -832,7 +840,9 @@ namespace NExtractTools NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::XLST; nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); } - else if (0 != (AVS_OFFICESTUDIO_FILE_SPREADSHEET & nFormatTo)) + else if (0 != (AVS_OFFICESTUDIO_FILE_SPREADSHEET & nFormatTo) || + AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo || + AVS_OFFICESTUDIO_FILE_OTHER_ODF == nFormatTo) { std::wstring sXlsxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); if (true == NSDirectory::CreateDirectory(sXlsxDir)) @@ -842,8 +852,13 @@ namespace NExtractTools nRes = xlst_bin2xlsx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - std::wstring sXlsxFile; - nRes = fromXlsxDir(sXlsxDir, sTo, nFormatTo, params, convertParams); + std::wstring sFileToCurrent = *params.m_sFileTo; + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + + nRes = fromXlsxDir(sXlsxDir, *params.m_sFileTo, nFormatTo, params, convertParams); } } else @@ -1158,7 +1173,9 @@ namespace NExtractTools NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT; nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); } - else if (0 != (AVS_OFFICESTUDIO_FILE_PRESENTATION & nFormatTo)) + else if (0 != (AVS_OFFICESTUDIO_FILE_PRESENTATION & nFormatTo) || + AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo || + AVS_OFFICESTUDIO_FILE_OTHER_ODF == nFormatTo) { std::wstring sPptxDir = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); @@ -1172,7 +1189,13 @@ namespace NExtractTools nRes = pptt_bin2pptx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = fromPptxDir(sPptxDir, sTo, nFormatTo, params, convertParams); + std::wstring sFileToCurrent = *params.m_sFileTo; + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + + nRes = fromPptxDir(sPptxDir, *params.m_sFileTo, nFormatTo, params, convertParams); } } else From 57e06222c723b94962865f1a98c3d21d31df74c8 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 7 Mar 2024 15:52:13 +0300 Subject: [PATCH 045/117] fix bug #66773 --- .../Converter/xlsx_conditionalFormatting.cpp | 30 +++++++++++++++++-- .../Converter/xlsx_conditionalFormatting.h | 1 + OdfFile/Reader/Format/calcext_elements.cpp | 4 +++ OdfFile/Reader/Format/calcext_elements.h | 2 +- OdfFile/Writer/Converter/XlsxConverter.cpp | 12 +++++--- OdfFile/Writer/Format/calcext_elements.cpp | 1 + OdfFile/Writer/Format/calcext_elements.h | 2 +- OdfFile/Writer/Format/ods_table_state.cpp | 15 ++++++++-- OdfFile/Writer/Format/ods_table_state.h | 2 +- 9 files changed, 57 insertions(+), 12 deletions(-) diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp index ecb0c857c8..83d560e849 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp @@ -90,6 +90,9 @@ namespace oox { _CP_OPT(std::wstring) formula2; _CP_OPT(int) rank; _CP_OPT(bool) bottom; + _CP_OPT(bool) equal; + _CP_OPT(bool) above; + _CP_OPT(int) stdDev; //color scale icon set data_bar std::vector<_cfvo> cfvo; //color scale data_bar(1 element) @@ -152,8 +155,10 @@ public: if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text); if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank); if (c.rules[j].bottom) CP_XML_ATTR(L"bottom", *c.rules[j].bottom); - //CP_XML_ATTR(L"equalAverage" , 0); - //CP_XML_ATTR(L"aboveAverage" , 0); + if (c.rules[j].above) CP_XML_ATTR(L"aboveAverage",*c.rules[j].above); + if (c.rules[j].equal) CP_XML_ATTR(L"equalAverage",*c.rules[j].equal); + if (c.rules[j].stdDev) CP_XML_ATTR(L"stdDev", *c.rules[j].stdDev); + if (c.rules[j].type == 1) { if (c.rules[j].formula_type) @@ -324,6 +329,22 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) { impl_->conditionalFormattings_.back().rules.back().formula_type = L"aboveAverage"; } + else if (f == L"below-average") + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"aboveAverage"; + impl_->conditionalFormattings_.back().rules.back().above = false; + } + else if (f == L"above-equal-average") + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"aboveAverage"; + impl_->conditionalFormattings_.back().rules.back().equal = true; + } + else if (f == L"below-equal-average") + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"aboveAverage"; + impl_->conditionalFormattings_.back().rules.back().above = false; + impl_->conditionalFormattings_.back().rules.back().equal = true; + } else if ( 0 <= (pos = f.find(L"formula-is("))) { impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression"; @@ -584,5 +605,10 @@ void xlsx_conditionalFormatting_context::set_time_period(int val) { impl_->conditionalFormattings_.back().rules.back().time_period = val; } +void xlsx_conditionalFormatting_context::set_stdDev(int val) +{ + impl_->conditionalFormattings_.back().rules.back().stdDev = val; +} + } } diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h index 9176225541..cfbbde04a1 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h @@ -55,6 +55,7 @@ public: void set_dxf (int dxf_id); void set_showVal(bool val); void set_time_period(int val); + void set_stdDev(int val); void add_sfv (int type, std::wstring value); void add_color (std::wstring col); diff --git a/OdfFile/Reader/Format/calcext_elements.cpp b/OdfFile/Reader/Format/calcext_elements.cpp index d8b152833f..0cf91a8721 100644 --- a/OdfFile/Reader/Format/calcext_elements.cpp +++ b/OdfFile/Reader/Format/calcext_elements.cpp @@ -72,6 +72,7 @@ void calcext_condition_attr::add_attributes( const xml::attributes_wc_ptr & Attr CP_APPLY_ATTR(L"calcext:base-cell-address", base_cell_address_); CP_APPLY_ATTR(L"calcext:apply-style-name", apply_style_name_); CP_APPLY_ATTR(L"calcext:value", value_); + CP_APPLY_ATTR(L"loext:stdDev", loext_stdDev_); } void calcext_date_is_attr::add_attributes( const xml::attributes_wc_ptr & Attributes ) { @@ -309,6 +310,9 @@ void calcext_condition::xlsx_convert(oox::xlsx_conversion_context & Context) if (dxfId >= 0) Context.get_conditionalFormatting_context().set_dxf(dxfId); + + if (attr_.loext_stdDev_) + Context.get_conditionalFormatting_context().set_stdDev(*attr_.loext_stdDev_); } // calcext_condition //--------------------------------------------------------------------------------------------------------- diff --git a/OdfFile/Reader/Format/calcext_elements.h b/OdfFile/Reader/Format/calcext_elements.h index 987d9150f7..146f8dd442 100644 --- a/OdfFile/Reader/Format/calcext_elements.h +++ b/OdfFile/Reader/Format/calcext_elements.h @@ -69,6 +69,7 @@ public: _CP_OPT(std::wstring) base_cell_address_; _CP_OPT(std::wstring) apply_style_name_; _CP_OPT(std::wstring) value_; + _CP_OPT(int) loext_stdDev_; }; class calcext_icon_set_attr @@ -77,7 +78,6 @@ public: void add_attributes( const xml::attributes_wc_ptr & Attributes ); _CP_OPT(odf_types::iconset_type) icon_set_type_; - }; class calcext_date_is_attr diff --git a/OdfFile/Writer/Converter/XlsxConverter.cpp b/OdfFile/Writer/Converter/XlsxConverter.cpp index 31edbefe00..330958e14e 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.cpp +++ b/OdfFile/Writer/Converter/XlsxConverter.cpp @@ -3431,13 +3431,17 @@ void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_co if (false == oox_cond_rule->m_oType.IsInit()) return; _CP_OPT(unsigned int) rank; - _CP_OPT(bool) bottom, percent; - + _CP_OPT(bool) bottom, percent, above, equal; + _CP_OPT(int) stdDev; + if (oox_cond_rule->m_oRank.IsInit()) rank = oox_cond_rule->m_oRank->GetValue(); if (oox_cond_rule->m_oBottom.IsInit()) bottom = oox_cond_rule->m_oBottom->ToBool(); if (oox_cond_rule->m_oPercent.IsInit()) percent = oox_cond_rule->m_oPercent->ToBool(); + if (oox_cond_rule->m_oAboveAverage.IsInit()) above = oox_cond_rule->m_oAboveAverage->ToBool(); + if (oox_cond_rule->m_oEqualAverage.IsInit()) equal = oox_cond_rule->m_oEqualAverage->ToBool(); + if (oox_cond_rule->m_oStdDev.IsInit()) stdDev = oox_cond_rule->m_oStdDev->GetValue(); - ods_context->current_table()->start_conditional_rule(oox_cond_rule->m_oType->GetValue(), rank, bottom, percent); + ods_context->current_table()->start_conditional_rule(oox_cond_rule->m_oType->GetValue(), rank, bottom, percent, above, equal, stdDev); { if (oox_cond_rule->m_oDxfId.IsInit()) { @@ -3460,7 +3464,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_co if (oox_cond_rule->m_oTimePeriod.IsInit()) ods_context->current_table()->set_conditional_time(oox_cond_rule->m_oTimePeriod->GetValue()); - + convert(oox_cond_rule->m_oIconSet.GetPointer()); convert(oox_cond_rule->m_oColorScale.GetPointer()); convert(oox_cond_rule->m_oDataBar.GetPointer()); diff --git a/OdfFile/Writer/Format/calcext_elements.cpp b/OdfFile/Writer/Format/calcext_elements.cpp index 406b401543..57ffb5166e 100644 --- a/OdfFile/Writer/Format/calcext_elements.cpp +++ b/OdfFile/Writer/Format/calcext_elements.cpp @@ -60,6 +60,7 @@ void calcext_condition_attr::serialize(CP_ATTR_NODE) CP_XML_ATTR_OPT_ENCODE_STRING(L"calcext:base-cell-address", calcext_base_cell_address_); CP_XML_ATTR_OPT(L"calcext:apply-style-name", calcext_apply_style_name_); CP_XML_ATTR_OPT_ENCODE_STRING(L"calcext:value", calcext_value_); + CP_XML_ATTR_OPT(L"loext:stdDev", loext_stdDev_); } void calcext_date_is_attr::serialize(CP_ATTR_NODE) { diff --git a/OdfFile/Writer/Format/calcext_elements.h b/OdfFile/Writer/Format/calcext_elements.h index 593e0a6018..45f30c80cb 100644 --- a/OdfFile/Writer/Format/calcext_elements.h +++ b/OdfFile/Writer/Format/calcext_elements.h @@ -70,7 +70,7 @@ public: _CP_OPT(std::wstring) calcext_base_cell_address_; _CP_OPT(std::wstring) calcext_apply_style_name_; _CP_OPT(std::wstring) calcext_value_; - + _CP_OPT(int) loext_stdDev_; }; class calcext_icon_set_attr { diff --git a/OdfFile/Writer/Format/ods_table_state.cpp b/OdfFile/Writer/Format/ods_table_state.cpp index eda4086706..d0f7bafe5d 100644 --- a/OdfFile/Writer/Format/ods_table_state.cpp +++ b/OdfFile/Writer/Format/ods_table_state.cpp @@ -1948,7 +1948,7 @@ void ods_table_state::end_conditional_format() { current_level_.pop_back(); } -void ods_table_state::start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent) +void ods_table_state::start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent, _CP_OPT(bool) above, _CP_OPT(bool) equal, _CP_OPT(int) stdDev) { office_element_ptr elm; @@ -1991,11 +1991,20 @@ void ods_table_state::start_conditional_rule(int rule_type, _CP_OPT(unsigned int table = L"'" + table + L"'"; } } - condition->attr_.calcext_base_cell_address_ = table + col + row; + condition->attr_.calcext_base_cell_address_ = (table.empty() ? L"" : (table + L".")) + col + row; } switch(rule_type) { - case 0: condition->attr_.calcext_value_ = L"above-average"; break; + case 0: + { + if (equal) condition->attr_.calcext_value_ = above.get_value_or(true) ? L"above-equal-average" : L"below-equal-average"; + else condition->attr_.calcext_value_ = above.get_value_or(true) ? L"above-average" : L"below-average"; + + if (stdDev) + { + condition->attr_.loext_stdDev_ = *stdDev; + } + }break; case 1: condition->attr_.calcext_value_ = L"begins-with()"; break; case 4: condition->attr_.calcext_value_ = L"contains-text()"; break; case 5: condition->attr_.calcext_value_ = L"is-error"; break; diff --git a/OdfFile/Writer/Format/ods_table_state.h b/OdfFile/Writer/Format/ods_table_state.h index fccbe0efa1..85a5f6a86b 100644 --- a/OdfFile/Writer/Format/ods_table_state.h +++ b/OdfFile/Writer/Format/ods_table_state.h @@ -384,7 +384,7 @@ public: void start_conditional_formats(); void start_conditional_format(const std::wstring& ref); - void start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent); + void start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent, _CP_OPT(bool) above, _CP_OPT(bool) equal, _CP_OPT(int) stdDev); void set_conditional_formula(const std::wstring& formula); void set_conditional_value(int type, const std::wstring& value ); From e30c5fb79db66f0e33fa898bef7c5a6ee353a3ca Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 7 Mar 2024 15:59:01 +0300 Subject: [PATCH 046/117] fix bug #66777 --- OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp index 83d560e849..189a9ec139 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp @@ -405,7 +405,9 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) } else if (0 <= (pos = f.find(L"contains-text"))) { - impl_->conditionalFormattings_.back().rules.back().formula_type = L"containsText"; + if (std::wstring::npos != f.find(L"not-contains-text")) + impl_->conditionalFormattings_.back().rules.back().formula_type = L"notContainsText"; + else impl_->conditionalFormattings_.back().rules.back().formula_type = L"containsText"; std::wstring text = f.substr(pos + 14, f.length() - pos - 15); From e2ebe6a6d353172646d9d5cd2d54654721e53dd0 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 7 Mar 2024 16:39:55 +0300 Subject: [PATCH 047/117] fix bug #66783 --- OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp | 4 ++++ OdfFile/Writer/Format/ods_table_state.cpp | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp index 189a9ec139..7ab8a319b8 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp @@ -375,6 +375,10 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) impl_->conditionalFormattings_.back().rules.back().formula_type = L"containsErrors"; impl_->conditionalFormattings_.back().rules.back().formula = L"0"; } + else if (0 <= (pos = f.find(L"is-no-error"))) + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"notContainsErrors"; + } else if (0 <= (pos = f.find(L"duplicate"))) { impl_->conditionalFormattings_.back().rules.back().formula_type = L"duplicateValues"; diff --git a/OdfFile/Writer/Format/ods_table_state.cpp b/OdfFile/Writer/Format/ods_table_state.cpp index d0f7bafe5d..497aca2ad6 100644 --- a/OdfFile/Writer/Format/ods_table_state.cpp +++ b/OdfFile/Writer/Format/ods_table_state.cpp @@ -2044,17 +2044,18 @@ void ods_table_state::end_conditional_rule() void ods_table_state::set_conditional_formula(const std::wstring& formula) { calcext_condition* condition = dynamic_cast (current_level_.back().get()); - if (!condition) return; std::wstring odfFormula = formulas_converter_table.convert_conditional_formula(formula); - std::wstring operator_; + std::wstring operator_ = condition->attr_.calcext_value_.get_value_or(L""); + + if (std::wstring::npos != operator_.find(L"is-no-error")) + return; + bool s = false; bool split = false; - operator_ = condition->attr_.calcext_value_.get_value_or(L""); - size_t f_start = operator_.find(L"("); size_t f_end = operator_.rfind(L")"); if (f_start != std::wstring::npos && f_end != std::wstring::npos) From 26658a71898fab291279cd844320375cb3299d28 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Sat, 9 Mar 2024 16:20:20 +0300 Subject: [PATCH 048/117] fix bug #66796 --- OdfFile/Writer/Format/ods_table_state.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OdfFile/Writer/Format/ods_table_state.cpp b/OdfFile/Writer/Format/ods_table_state.cpp index 497aca2ad6..2d45a6c37e 100644 --- a/OdfFile/Writer/Format/ods_table_state.cpp +++ b/OdfFile/Writer/Format/ods_table_state.cpp @@ -2006,12 +2006,12 @@ void ods_table_state::start_conditional_rule(int rule_type, _CP_OPT(unsigned int } }break; case 1: condition->attr_.calcext_value_ = L"begins-with()"; break; - case 4: condition->attr_.calcext_value_ = L"contains-text()"; break; + case 4: condition->attr_.calcext_value_ = L"formula-is()"; break; case 5: condition->attr_.calcext_value_ = L"is-error"; break; case 6: condition->attr_.calcext_value_ = L"contains-text()"; break; case 8: condition->attr_.calcext_value_ = L"duplicate"; break; case 9: condition->attr_.calcext_value_ = L"formula-is()"; break; - case 11: condition->attr_.calcext_value_ = L"not-contains-text()"; break; + case 11: condition->attr_.calcext_value_ = L"formula-is()"; break; case 12: condition->attr_.calcext_value_ = L"is-no-error"; break; case 13: condition->attr_.calcext_value_ = L"not-contains-text()"; break; case 15: @@ -2050,7 +2050,8 @@ void ods_table_state::set_conditional_formula(const std::wstring& formula) std::wstring operator_ = condition->attr_.calcext_value_.get_value_or(L""); - if (std::wstring::npos != operator_.find(L"is-no-error")) + if (std::wstring::npos != operator_.find(L"is-no-error") || + std::wstring::npos != operator_.find(L"is-error")) return; bool s = false; From d81e70cfee7dc3976855dbb634a83f4b56dc94d3 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Sun, 10 Mar 2024 14:37:48 +0300 Subject: [PATCH 049/117] fix bug #66798 --- .../DataTypes/custom_shape_types_convert.h | 1 + OdfFile/DataTypes/referenceformat.cpp | 104 +++++++++++++ OdfFile/DataTypes/referenceformat.h | 76 +++++++++ OdfFile/Projects/Linux/OdfFormatLib.pro | 6 +- OdfFile/Projects/Linux/odf_datatypes.cpp | 1 + OdfFile/Projects/Windows/cpcommon.vcxproj | 2 + .../Projects/Windows/cpcommon.vcxproj.filters | 146 ++++++++++++++++-- OdfFile/Reader/Format/paragraph_elements.cpp | 106 ++++++++++--- OdfFile/Reader/Format/paragraph_elements.h | 43 ++++-- OdfFile/Writer/Format/odf_text_context.cpp | 12 ++ OdfFile/Writer/Format/odf_text_context.h | 1 + .../Writer/Format/odt_conversion_context.cpp | 27 ++++ OdfFile/Writer/Format/paragraph_elements.cpp | 36 +++++ OdfFile/Writer/Format/paragraph_elements.h | 36 ++++- 14 files changed, 538 insertions(+), 59 deletions(-) create mode 100644 OdfFile/DataTypes/referenceformat.cpp create mode 100644 OdfFile/DataTypes/referenceformat.h diff --git a/OdfFile/DataTypes/custom_shape_types_convert.h b/OdfFile/DataTypes/custom_shape_types_convert.h index b61cb44710..97b7e0e436 100644 --- a/OdfFile/DataTypes/custom_shape_types_convert.h +++ b/OdfFile/DataTypes/custom_shape_types_convert.h @@ -30,6 +30,7 @@ * */ #pragma once +#include struct _shape_converter { diff --git a/OdfFile/DataTypes/referenceformat.cpp b/OdfFile/DataTypes/referenceformat.cpp new file mode 100644 index 0000000000..c5795d8b19 --- /dev/null +++ b/OdfFile/DataTypes/referenceformat.cpp @@ -0,0 +1,104 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#include "referenceformat.h" +#include +#include + +namespace cpdoccore { +namespace odf_types { +std::wostream & operator << (std::wostream & _Wostream, const reference_format & _Val) +{ + switch(_Val.get_type()) + { + case reference_format::chapter: + _Wostream << L"chapter"; + break; + case reference_format::direction: + _Wostream << L"direction"; + break; + case reference_format::caption: + _Wostream << L"caption"; + break; + case reference_format::category_and_value: + _Wostream << L"category-and-value"; + break; + case reference_format::value: + _Wostream << L"value"; + break; + case reference_format::number: + _Wostream << L"number"; + break; + case reference_format::number_all_superior: + _Wostream << L"number-all-superior"; + break; + case reference_format::number_no_superior: + _Wostream << L"number-no-superior"; + break; + default: + case reference_format::text: + _Wostream << L"text"; + break; + } + return _Wostream; +} + +reference_format reference_format::parse(const std::wstring & Str) +{ + std::wstring tmp = Str; + boost::algorithm::to_lower(tmp); + + if (tmp == L"chapter") + return reference_format(chapter); + else if (tmp == L"direction") + return reference_format(direction); + else if (tmp == L"text") + return reference_format(text); + else if (tmp == L"caption") + return reference_format(caption); + else if (tmp == L"category-and-value") + return reference_format(category_and_value); + else if (tmp == L"value") + return reference_format(value); + else if (tmp == L"number") + return reference_format(number); + else if (tmp == L"number-all-superior") + return reference_format(number_all_superior); + else if (tmp == L"number-no-superior") + return reference_format(number_no_superior); + else + { + return reference_format(text); + } +} +} +} diff --git a/OdfFile/DataTypes/referenceformat.h b/OdfFile/DataTypes/referenceformat.h new file mode 100644 index 0000000000..54e679f516 --- /dev/null +++ b/OdfFile/DataTypes/referenceformat.h @@ -0,0 +1,76 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#pragma once + +#include +#include +#include "odfattributes.h" + + +namespace cpdoccore { +namespace odf_types { + +class reference_format +{ +public: + enum type + { + chapter, + direction, + text, + caption, + category_and_value, + value, + number, + number_all_superior, + number_no_superior + }; + + reference_format() {} + reference_format(type _Type) : type_(_Type) + {} + + type get_type() const + { + return type_; + }; + static reference_format parse(const std::wstring & Str); + +private: + type type_; + +}; +std::wostream & operator << (std::wostream & _Wostream, const reference_format& _Val); +} +APPLY_PARSE_XML_ATTRIBUTES(odf_types::reference_format); + +} diff --git a/OdfFile/Projects/Linux/OdfFormatLib.pro b/OdfFile/Projects/Linux/OdfFormatLib.pro index 45e696350e..a2138f65f3 100644 --- a/OdfFile/Projects/Linux/OdfFormatLib.pro +++ b/OdfFile/Projects/Linux/OdfFormatLib.pro @@ -40,7 +40,8 @@ SOURCES += \ core_debug { SOURCES += \ - ../../DataTypes/mathvariant.cpp \ + ../../DataTypes/referenceformat.cpp \ + ../../DataTypes/mathvariant.cpp \ ../../DataTypes/anchortype.cpp \ ../../DataTypes/animation_attlists.cpp \ ../../DataTypes/backgroundcolor.cpp \ @@ -445,7 +446,8 @@ HEADERS += \ ../../Common/xml/xmlchar.h \ ../../Common/xml/xmlelement.h \ \ - ../../DataTypes/mathvariant.h \ + ../../DataTypes/referenceformat.h \ + ../../DataTypes/mathvariant.h \ ../../DataTypes/anchortype.h \ ../../DataTypes/animation_attlists.h \ ../../DataTypes/backgroundcolor.h \ diff --git a/OdfFile/Projects/Linux/odf_datatypes.cpp b/OdfFile/Projects/Linux/odf_datatypes.cpp index b13da53e57..ca12641c14 100644 --- a/OdfFile/Projects/Linux/odf_datatypes.cpp +++ b/OdfFile/Projects/Linux/odf_datatypes.cpp @@ -153,3 +153,4 @@ #include "../../DataTypes/sparklines.cpp" #include "../../DataTypes/tabledatatype.cpp" #include "../../DataTypes/tableoperator.cpp" +#include "../../DataTypes/referenceformat.cpp" diff --git a/OdfFile/Projects/Windows/cpcommon.vcxproj b/OdfFile/Projects/Windows/cpcommon.vcxproj index 55607999e5..e4890c3f57 100644 --- a/OdfFile/Projects/Windows/cpcommon.vcxproj +++ b/OdfFile/Projects/Windows/cpcommon.vcxproj @@ -253,6 +253,7 @@ + @@ -383,6 +384,7 @@ + diff --git a/OdfFile/Projects/Windows/cpcommon.vcxproj.filters b/OdfFile/Projects/Windows/cpcommon.vcxproj.filters index 41ae74406d..909e9e65ba 100644 --- a/OdfFile/Projects/Windows/cpcommon.vcxproj.filters +++ b/OdfFile/Projects/Windows/cpcommon.vcxproj.filters @@ -126,6 +126,10 @@ + + + + @@ -143,15 +147,133 @@ - - datatypes odf - - - datatypes odf - - - datatypes odf - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -489,11 +611,5 @@ datatypes odf - - datatypes odf - - - datatypes odf - \ No newline at end of file diff --git a/OdfFile/Reader/Format/paragraph_elements.cpp b/OdfFile/Reader/Format/paragraph_elements.cpp index dd5bc730bf..57e4549b0d 100644 --- a/OdfFile/Reader/Format/paragraph_elements.cpp +++ b/OdfFile/Reader/Format/paragraph_elements.cpp @@ -91,6 +91,31 @@ void paragraph_content_element::docx_serialize_field(const std::wstring & field_ strm << L""; } } + +void paragraph_content_element::docx_serialize_field(const std::wstring& field_name, office_element_ptr_array& content, + oox::docx_conversion_context& Context, bool bLock) +{ + std::wostream& strm = Context.output_stream(); + Context.finish_run(); + + if (false == field_name.empty()) + { + strm << L""; + strm << L"" << field_name << L""; + } + + docx_serialize_run(content, Context); + + if (false == field_name.empty()) + { + strm << L""; + } +} void paragraph_content_element::docx_serialize_sdt_placeholder(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context) { std::wostream & strm = Context.output_stream(); @@ -105,7 +130,20 @@ void paragraph_content_element::docx_serialize_sdt_placeholder(const std::wstrin strm << L""; } +void paragraph_content_element::docx_serialize_sdt_placeholder(const std::wstring& name, office_element_ptr_array& content, oox::docx_conversion_context& Context) +{ + std::wostream& strm = Context.output_stream(); + Context.finish_run(); + strm << L""; + strm << L""; + + docx_serialize_run(content, Context); + + strm << L""; +} void paragraph_content_element::docx_serialize_run(office_element_ptr & text, oox::docx_conversion_context & Context) { Context.add_new_run(); @@ -115,6 +153,13 @@ void paragraph_content_element::docx_serialize_run(office_element_ptr & text, oo } Context.finish_run(); } +void paragraph_content_element::docx_serialize_run(office_element_ptr_array& content, oox::docx_conversion_context& Context) +{ + for (size_t i = 0; i < content.size(); ++i) + { + docx_serialize_run(content[i], Context); + } +} //------------------------------------------------------------------------------------------------------------ const wchar_t * text::ns = L""; @@ -396,7 +441,26 @@ void bookmark_ref::add_attributes( const xml::attributes_wc_ptr & Attributes ) } void bookmark_ref::add_text(const std::wstring & Text) { - content_ = Text; + office_element_ptr elm = text::create(Text); + content_.push_back( elm ); +} +void bookmark_ref::add_child_element(xml::sax* Reader, const std::wstring& Ns, const std::wstring& Name) +{ + CP_CREATE_ELEMENT(content_); +} +void bookmark_ref::docx_convert(oox::docx_conversion_context& Context) +{ + std::wstring field_name = (ref_name_ ? L"REF " + *ref_name_ : L"REF") + L" \\h"; + + if (reference_format_) + { + switch (reference_format_->get_type()) + { + case reference_format::direction: field_name += L" \\p"; break; + case reference_format::number: field_name += L" \\n"; break; + } + } + docx_serialize_field(field_name, content_, Context); } // text:reference-ref ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1088,30 +1152,32 @@ void chapter::pptx_convert(oox::pptx_conversion_context & Context) const wchar_t * text_placeholder::ns = L"text"; const wchar_t * text_placeholder::name = L"placeholder"; -std::wostream & text_placeholder::text_to_stream(std::wostream & _Wostream, bool bXmlEncode) const -{ - CP_SERIALIZE_TEXT(text_, bXmlEncode); - return _Wostream; -} - void text_placeholder::add_attributes( const xml::attributes_wc_ptr & Attributes ) { } +std::wostream & text_placeholder::text_to_stream(std::wostream & _Wostream, bool bXmlEncode) const +{ + CP_SERIALIZE_TEXT(content_, bXmlEncode); + return _Wostream; +} +void text_placeholder::add_child_element(xml::sax* Reader, const std::wstring& Ns, const std::wstring& Name) +{ + CP_CREATE_ELEMENT(content_); +} void text_placeholder::add_text(const std::wstring & Text) { - text_ = text::create(Text) ; + office_element_ptr text = text::create(Text) ; + content_.push_back(text); } - void text_placeholder::docx_convert(oox::docx_conversion_context & Context) { - docx_serialize_sdt_placeholder(L"Click placeholder and overwrite", text_, Context); + docx_serialize_sdt_placeholder(L"Click placeholder and overwrite", content_, Context); } - void text_placeholder::pptx_convert(oox::pptx_conversion_context & Context) { - if (text_) + for (size_t i = 0; i < content_.size(); ++i) { - text_->pptx_convert(Context); + content_[i]->pptx_convert(Context); } } @@ -1424,18 +1490,18 @@ void sequence::add_attributes( const xml::attributes_wc_ptr & Attributes ) } std::wostream & sequence::text_to_stream(std::wostream & _Wostream, bool bXmlEncode) const { - CP_SERIALIZE_TEXT(text_, bXmlEncode); + CP_SERIALIZE_TEXT(content_, bXmlEncode); return _Wostream; } void sequence::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) { - CP_CREATE_ELEMENT(text_); + CP_CREATE_ELEMENT(content_); } void sequence::add_text(const std::wstring & Text) { office_element_ptr elm = text::create(Text) ; - text_.push_back( elm ); + content_.push_back( elm ); } void sequence::docx_convert(oox::docx_conversion_context & Context) @@ -1485,9 +1551,9 @@ void sequence::docx_convert(oox::docx_conversion_context & Context) Context.start_bookmark(name); Context.output_stream() << L""; Context.add_new_run(); - for (size_t i = 0; i < text_.size(); i++) + for (size_t i = 0; i < content_.size(); i++) { - text_[i]->docx_convert(Context); + content_[i]->docx_convert(Context); } Context.finish_run(); @@ -1502,9 +1568,9 @@ void sequence::docx_convert(oox::docx_conversion_context & Context) } void sequence::pptx_convert(oox::pptx_conversion_context & Context) { - for (size_t i = 0; i < text_.size(); i++) + for (size_t i = 0; i < content_.size(); i++) { - text_[i]->pptx_convert(Context); + content_[i]->pptx_convert(Context); } } //------------------------------------------------------------------------------------------------------------ diff --git a/OdfFile/Reader/Format/paragraph_elements.h b/OdfFile/Reader/Format/paragraph_elements.h index d690b77546..19be7cc8da 100644 --- a/OdfFile/Reader/Format/paragraph_elements.h +++ b/OdfFile/Reader/Format/paragraph_elements.h @@ -42,6 +42,7 @@ #include "../../DataTypes/noteclass.h" #include "../../DataTypes/bool.h" #include "../../DataTypes/bibliography.h" +#include "../../DataTypes/referenceformat.h" #include "../../Reader/Converter/docx_conversion_context.h" @@ -67,9 +68,14 @@ public: virtual void xlsx_convert(oox::xlsx_conversion_context & Context){} virtual void pptx_convert(oox::pptx_conversion_context & Context){} - virtual void docx_serialize_sdt_placeholder(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context); - virtual void docx_serialize_field(const std::wstring & field_name, office_element_ptr & text, oox::docx_conversion_context & Context, bool bLock = false); - virtual void docx_serialize_run(office_element_ptr & text, oox::docx_conversion_context & Context); + virtual void docx_serialize_sdt_placeholder(const std::wstring& name, office_element_ptr_array& content, oox::docx_conversion_context& Context); + virtual void docx_serialize_sdt_placeholder(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context); + + virtual void docx_serialize_field(const std::wstring & field_name, office_element_ptr & content, oox::docx_conversion_context & Context, bool bLock = false); + virtual void docx_serialize_field(const std::wstring& field_name, office_element_ptr_array& text, oox::docx_conversion_context& Context, bool bLock = false); + + virtual void docx_serialize_run(office_element_ptr & text, oox::docx_conversion_context & Context); + virtual void docx_serialize_run(office_element_ptr_array& content, oox::docx_conversion_context& Context); virtual void xlsx_serialize(std::wostream & _Wostream, oox::xlsx_conversion_context & Context) { @@ -245,7 +251,6 @@ private: virtual void add_text(const std::wstring & Text) {} }; - CP_REGISTER_OFFICE_ELEMENT2(bookmark); //------------------------------------------------------------------------------------------------------------------- // text:bookmark-start @@ -314,12 +319,15 @@ public: CPDOCCORE_DEFINE_VISITABLE(); CPDOCCORE_OFFICE_DOCUMENT_IMPL_NAME_FUNCS_; - _CP_OPT(std::wstring) ref_name_; - _CP_OPT(std::wstring) reference_format_; - std::wstring content_; + virtual void docx_convert(oox::docx_conversion_context& Context); + + _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + + office_element_ptr_array content_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); - virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {} + virtual void add_child_element(xml::sax* Reader, const std::wstring& Ns, const std::wstring& Name); virtual void add_text(const std::wstring & Text); }; CP_REGISTER_OFFICE_ELEMENT2(bookmark_ref); @@ -337,9 +345,10 @@ public: CPDOCCORE_DEFINE_VISITABLE(); CPDOCCORE_OFFICE_DOCUMENT_IMPL_NAME_FUNCS_; - _CP_OPT(std::wstring) ref_name_; - _CP_OPT(std::wstring) reference_format_; - std::wstring content_; + _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + + std::wstring content_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); @@ -699,10 +708,10 @@ public: _CP_OPT(std::wstring) text_description_; _CP_OPT(std::wstring) text_placeholder_type_; - office_element_ptr text_; + office_element_ptr_array content_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); - virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){} + virtual void add_child_element(xml::sax* Reader, const std::wstring& Ns, const std::wstring& Name); virtual void add_text(const std::wstring & Text); }; @@ -1007,7 +1016,7 @@ public: _CP_OPT(std::wstring) ref_name_; _CP_OPT(std::wstring) template_; - office_element_ptr_array text_; + office_element_ptr_array content_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); @@ -1086,10 +1095,10 @@ public: void docx_convert(oox::docx_conversion_context & Context); - _CP_OPT(std::wstring) reference_format_;//caption, category-and-value, value, chapter, direction, page, text, number, number-all-superior, number-no-superior - _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + _CP_OPT(std::wstring) ref_name_; - office_element_ptr text_; + office_element_ptr text_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); diff --git a/OdfFile/Writer/Format/odf_text_context.cpp b/OdfFile/Writer/Format/odf_text_context.cpp index 771b4347ee..aafce02d4c 100644 --- a/OdfFile/Writer/Format/odf_text_context.cpp +++ b/OdfFile/Writer/Format/odf_text_context.cpp @@ -602,6 +602,18 @@ bool odf_text_context::start_field(int type, const std::wstring& value, const st { create_element(L"text", L"text-input", elm, odf_context_); }break; + case fieldRef: + { + create_element(L"text", L"bookmark-ref", elm, odf_context_); + text_bookmark_ref* ref = dynamic_cast(elm.get()); + if (ref) + { + if (false == value.empty()) ref->ref_name_ = value; + + ref->reference_format_ = odf_types::reference_format::parse(format.empty() ? L"text" : format); + + } + }break; } if (elm) diff --git a/OdfFile/Writer/Format/odf_text_context.h b/OdfFile/Writer/Format/odf_text_context.h index 9bfb87c793..960a18d382 100644 --- a/OdfFile/Writer/Format/odf_text_context.h +++ b/OdfFile/Writer/Format/odf_text_context.h @@ -58,6 +58,7 @@ namespace odf_writer fieldDropDown, fieldDate, fieldTime, + fieldRef, fieldBibliography = 0xff + 1, fieldIndex, diff --git a/OdfFile/Writer/Format/odt_conversion_context.cpp b/OdfFile/Writer/Format/odt_conversion_context.cpp index da0f3a5fc7..89c8a3a133 100644 --- a/OdfFile/Writer/Format/odt_conversion_context.cpp +++ b/OdfFile/Writer/Format/odt_conversion_context.cpp @@ -767,6 +767,33 @@ void odt_conversion_context::set_field_instr() if (instr.length() > 9) current_fields.back().value = instr.substr(9, instr.length() - 5); } + res1 = instr.find(L"REF"); + if (std::wstring::npos != res1 && current_fields.back().type == 0) + { + current_fields.back().type = fieldRef; + std::map options = parse_instr_options(instr.substr(4)); + + for (std::map::iterator it = options.begin(); it != options.end(); ++it) + { + if (it->first == L" ")//field-argument + { + current_fields.back().value = it->second; + boost::algorithm::trim(current_fields.back().value); + } + else if (it->first == L"h") + { + current_fields.back().bHyperlinks = true; + } + else if (it->first == L"p") + { + current_fields.back().format = L"direction"; + } + else if (it->first == L"r" || it->first == L"n") + { + current_fields.back().format = L"number"; + } + } + } res1 = instr.find(L"PAGE"); if (std::wstring::npos != res1 && current_fields.back().type == 0) { diff --git a/OdfFile/Writer/Format/paragraph_elements.cpp b/OdfFile/Writer/Format/paragraph_elements.cpp index 6df4f4a83d..7be3984343 100644 --- a/OdfFile/Writer/Format/paragraph_elements.cpp +++ b/OdfFile/Writer/Format/paragraph_elements.cpp @@ -188,6 +188,42 @@ void text_bookmark_end::serialize(std::wostream & _Wostream) } } } +//---------------------------------------------------------------------------------- +// text:bookmark-ref +//---------------------------------------------------------------------------------- +const wchar_t* text_bookmark_ref::ns = L"text"; +const wchar_t* text_bookmark_ref::name = L"bookmark-ref"; + +void text_bookmark_ref::create_child_element(const std::wstring& Ns, const std::wstring& Name) +{ + CP_CREATE_ELEMENT(content_); +} +void text_bookmark_ref::add_child_element(const office_element_ptr& child_element) +{ + content_.push_back(child_element); +} +void text_bookmark_ref::add_text(const std::wstring& Text) +{ + office_element_ptr elm = text_text::create(Text); + content_.push_back(elm); +} +void text_bookmark_ref::serialize(std::wostream& _Wostream) +{ + CP_XML_WRITER(_Wostream) + { + CP_XML_NODE_SIMPLE() + { + CP_XML_ATTR_OPT_ENCODE_STRING(L"text:ref-name", ref_name_); + CP_XML_ATTR_OPT(L"text:reference-format", reference_format_); + + for (size_t i = 0; i < content_.size(); i++) + { + content_[i]->serialize(CP_XML_STREAM()); + } + } + } +} + //---------------------------------------------------------------------------------- // text:reference-mark //---------------------------------------------------------------------------------- diff --git a/OdfFile/Writer/Format/paragraph_elements.h b/OdfFile/Writer/Format/paragraph_elements.h index 78e345513d..9b1fb663fd 100644 --- a/OdfFile/Writer/Format/paragraph_elements.h +++ b/OdfFile/Writer/Format/paragraph_elements.h @@ -42,6 +42,7 @@ #include "../../DataTypes/targetframename.h" #include "../../DataTypes/noteclass.h" #include "../../DataTypes/bibliography.h" +#include "../../DataTypes/referenceformat.h" #include "../../DataTypes/common_attlists.h" @@ -211,7 +212,33 @@ public: std::wstring text_name_; }; CP_REGISTER_OFFICE_ELEMENT2(text_bookmark_end); +//------------------------------------------------------------------------------------------------------------------- +// text:bookmark-ref +//------------------------------------------------------------------------------------------------------------------- +class text_bookmark_ref : public office_element_impl +{ +public: + static const wchar_t* ns; + static const wchar_t* name; + static const ElementType type = typeTextBookmarkRef; + + text_bookmark_ref() {}; + text_bookmark_ref(const std::wstring& Name) : ref_name_(Name) {}; + + virtual void create_child_element(const std::wstring& Ns, const std::wstring& Name); + virtual void add_child_element(const office_element_ptr& child_element); + virtual void add_text(const std::wstring& Text); + + virtual void serialize(std::wostream& _Wostream); + + _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + + _CP_OPT(std::wstring) text_; + office_element_ptr_array content_; +}; +CP_REGISTER_OFFICE_ELEMENT2(text_bookmark_ref); // text:reference-mark //--------------------------------------------------------------------------------------------------- class text_reference_mark : public office_element_impl @@ -920,18 +947,17 @@ public: static const wchar_t * ns; static const wchar_t * name; - static const ElementType type = typeTextSequenceRef; - + static const ElementType type = typeTextSequenceRef; virtual void create_child_element (const std::wstring & Ns, const std::wstring & Name){} virtual void add_child_element ( const office_element_ptr & child_element){} virtual void serialize(std::wostream & _Wostream); - _CP_OPT(std::wstring) reference_format_;//caption, category-and-value, value, chapter, direction, page, text, number, number-all-superior, number-no-superior - _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + _CP_OPT(std::wstring) ref_name_; - std::wstring content_; + std::wstring content_; }; CP_REGISTER_OFFICE_ELEMENT2(text_sequence_ref); //------------------------------------------------------------------------------------------------------------------- From f93a628c24a429f124be117a3a77cc884bb7ae4f Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Sun, 10 Mar 2024 21:58:34 +0300 Subject: [PATCH 050/117] Refactoring build --- Common/3dParty/boost/boost.pri | 4 + Common/3dParty/boost/boost_android.sh | 326 ------------------ Common/3dParty/curl/build-android-common.sh | 220 ------------ Common/3dParty/curl/build-android-curl.sh | 128 ------- Common/3dParty/curl/curl.pri | 18 +- Common/3dParty/icu/icu.pri | 5 +- Common/3dParty/openssl/openssl.pri | 11 +- Common/3dParty/v8/android/build.py | 2 +- Common/3dParty/v8/v8.pri | 2 + Common/base.pri | 6 + DesktopEditor/cximage/raw/libdcr.h | 2 +- .../doctrenderer/js_internal/v8/v8_base.h | 36 +- DesktopEditor/graphics/Timer.cpp | 78 ++--- DesktopEditor/graphics/Timer.h | 58 ++-- DesktopEditor/graphics/pro/raster.pri | 4 + 15 files changed, 121 insertions(+), 779 deletions(-) delete mode 100755 Common/3dParty/boost/boost_android.sh delete mode 100755 Common/3dParty/curl/build-android-common.sh delete mode 100755 Common/3dParty/curl/build-android-curl.sh diff --git a/Common/3dParty/boost/boost.pri b/Common/3dParty/boost/boost.pri index e590f9c27d..dcc0e87b70 100644 --- a/Common/3dParty/boost/boost.pri +++ b/Common/3dParty/boost/boost.pri @@ -4,6 +4,10 @@ CORE_BOOST_LIBS = $$PWD/build/$$CORE_BUILDS_PLATFORM_PREFIX/lib core_android { INCLUDEPATH += $$PWD/build/android/include CORE_BOOST_LIBS = $$PWD/build/android/lib/$$CORE_BUILDS_PLATFORM_PREFIX + + DEFINES += "_HAS_AUTO_PTR_ETC=0" + QMAKE_CFLAGS += -Wno-enum-constexpr-conversion + QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion } bundle_xcframeworks { diff --git a/Common/3dParty/boost/boost_android.sh b/Common/3dParty/boost/boost_android.sh deleted file mode 100755 index e5510d2811..0000000000 --- a/Common/3dParty/boost/boost_android.sh +++ /dev/null @@ -1,326 +0,0 @@ -#!/bin/bash - -cd boost_1_72_0 -OUTPUT_DIR="../build/android" - -BOOST_LIBS="filesystem system date_time regex" - -CPPSTD="-std=c++11 -frtti -fexceptions" - -# Must set these after parseArgs to fill in overriden values -# Todo: -g -DNDEBUG are for debug builds only... -# Boost.test defines are needed to build correct instrumentable boost_unit_test_framework static lib -# it does not affect the functionality of single-header usage. -# See http://www.boost.org/doc/libs/1_66_0/libs/test/doc/html/boost_test/adv_scenarios/static_lib_customizations/entry_point.html -EXTRA_FLAGS="-DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS \ - -DBOOST_TEST_NO_MAIN -DBOOST_TEST_ALTERNATIVE_INIT_API -DANDROID_STL=c++_static \ - -Wno-unused-local-typedef" -EXTRA_ANDROID_FLAGS="$EXTRA_FLAGS" - -if [[ -n "$USE_CXX11_ABI" ]]; then - EXTRA_LINUX_FLAGS="$EXTRA_FLAGS -D_GLIBCXX_USE_CXX11_ABI=$USE_CXX11_ABI" -else - EXTRA_LINUX_FLAGS="$EXTRA_FLAGS" -fi - -doneSection() -{ - echo - echo "Done" - echo "=================================================================" - echo -} - -bootstrapBoost() -{ - BOOTSTRAP_LIBS=$BOOST_LIBS - BOOST_LIBS_COMMA=$(echo $BOOTSTRAP_LIBS | sed -e "s/ /,/g") - echo "Bootstrapping for $1 (with libs $BOOST_LIBS_COMMA)" - ./bootstrap.sh --with-libraries=$BOOST_LIBS_COMMA - - doneSection -} - -generateAndroidUserConfig() -{ - HOSTOS="$(uname | awk '{ print $1}' | tr [:upper:] [:lower:])-" # darwin or linux - OSARCH="$(uname -m)" - - # Boost doesn't build with -Werror - # Reported to boost-users@lists.boost.org - - cat > "./tools/build/src/user-config.jam" <x86 android ---target=i686-none-linux-android ---gcc-toolchain=$ANDROID_NDK_ROOT/toolchains/x86-4.9/prebuilt/$HOSTOS$OSARCH ---sysroot=$ANDROID_NDK_ROOT/sysroot --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/include --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include --isystem $ANDROID_NDK_ROOT/sources/android/support/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include/i686-linux-android --DANDROID --D__ANDROID_API__=19 --ffunction-sections --funwind-tables --fstack-protector-strong --fno-limit-debug-info --fPIC --no-canonical-prefixes --mstackrealign --Wa,--noexecstack --Wformat --Werror=format-security --Wall --Wshadow -; -using clang : 5.0~x86_64 -: $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$HOSTOS$OSARCH/bin/clang++ $EXTRA_ANDROID_FLAGS -: -x86 android ---target=x86_64-none-linux-android ---gcc-toolchain=$ANDROID_NDK_ROOT/toolchains/x86_64-4.9/prebuilt/$HOSTOS$OSARCH ---sysroot=$ANDROID_NDK_ROOT/sysroot --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/include --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include --isystem $ANDROID_NDK_ROOT/sources/android/support/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include/x86_64-linux-android --DANDROID --D__ANDROID_API__=21 --ffunction-sections --funwind-tables --fstack-protector-strong --fno-limit-debug-info --fPIC --no-canonical-prefixes --mstackrealign --Wa,--noexecstack --Wformat --Werror=format-security --Wall --Wshadow -; -using clang : 5.0~arm -: $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$HOSTOS$OSARCH/bin/clang++ $EXTRA_ANDROID_FLAGS -: -arm android ---target=armv7-none-linux-androideabi ---gcc-toolchain=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/$HOSTOS$OSARCH ---sysroot=$ANDROID_NDK_ROOT/sysroot --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/include --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include --isystem $ANDROID_NDK_ROOT/sources/android/support/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include/arm-linux-androideabi --DANDROID --D__ANDROID_API__=19 --ffunction-sections --funwind-tables --fstack-protector-strong --fno-limit-debug-info --fPIC --fno-integrated-as --no-canonical-prefixes --Wa,--noexecstack --Wformat --Werror=format-security --Wall --Wshadow --march=armv7-a --mfloat-abi=softfp --mfpu=vfpv3-d16 --mthumb -; -using clang : 5.0~arm64 -: $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$HOSTOS$OSARCH/bin/clang++ $EXTRA_ANDROID_FLAGS -: -arm android ---target=aarch64-none-linux-android ---gcc-toolchain=$ANDROID_NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/$HOSTOS$OSARCH ---sysroot=$ANDROID_NDK_ROOT/sysroot --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/include --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include --isystem $ANDROID_NDK_ROOT/sources/android/support/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include/aarch64-linux-android --DANDROID --D__ANDROID_API__=21 --ffunction-sections --funwind-tables --fstack-protector-strong --fno-limit-debug-info --fPIC --no-canonical-prefixes --Wa,--noexecstack --Wformat --Werror=format-security --Wall --Wshadow -; -EOF -} - -buildBoost_Android() -{ - mkdir -p $OUTPUT_DIR - echo > ${OUTPUT_DIR}/android-build.log - - if [[ -z "$ANDROID_NDK_ROOT" ]]; then - echo "Must specify ANDROID_NDK_ROOT" - exit 1 - fi - - export NO_BZIP2=1 - - # build libicu if locale requested but not provided - # if echo $LIBRARIES | grep locale; then - # if [ -e libiconv-libicu-android ]; then - # echo "ICONV and ICU already compiled" - # else - # echo "boost_locale selected - compiling ICONV and ICU" - # git clone https://github.com/pelya/libiconv-libicu-android.git - # cd libiconv-libicu-android - # ./build.sh || exit 1 - # cd .. - # fi - # fi - - echo clean - ./b2 --clean - - echo Building release x86 Boost for Android Emulator - - ./b2 --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/x86" toolset=clang-5.0~x86 \ - architecture=x86 target-os=android define=_LITTLE_ENDIAN \ - optimization=speed \ - address-model=32 variant=release cxxflags="${CPPSTD}" \ - link=static threading=multi install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error staging Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building release x86_64 Boost for Android Emulator - - ./b2 --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/x86_64" toolset=clang-5.0~x86_64 \ - architecture=x86 target-os=android define=_LITTLE_ENDIAN \ - optimization=speed \ - address-model=64 variant=release cxxflags="${CPPSTD}" \ - link=static threading=multi install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error staging Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building release armv7 Boost for Android - - ./b2 --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/armeabi-v7a" toolset=clang-5.0~arm \ - abi=aapcs architecture=arm address-model=32 binary-format=elf threading=multi \ - optimization=space \ - target-os=android variant=release cxxflags="${CPPSTD}" \ - link=static install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error installing Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building release arm64 Boost for Android - - ./b2 --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/arm64-v8a" toolset=clang-5.0~arm64 \ - abi=aapcs architecture=arm address-model=64 binary-format=elf threading=multi \ - optimization=space \ - target-os=android variant=release cxxflags="${CPPSTD}" \ - link=static install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error installing Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection -} - -buildBoost_Android_debug() -{ - mkdir -p $OUTPUT_DIR - echo > ${OUTPUT_DIR}/android-build.log - - export NO_BZIP2=1 - - # build libicu if locale requested but not provided - # if echo $LIBRARIES | grep locale; then - # if [ -e libiconv-libicu-android ]; then - # echo "ICONV and ICU already compiled" - # else - # echo "boost_locale selected - compiling ICONV and ICU" - # git clone https://github.com/pelya/libiconv-libicu-android.git - # cd libiconv-libicu-android - # ./build.sh || exit 1 - # cd .. - # fi - # fi - - echo Building debug x86 Boost for Android Emulator - - ./b2 $THREADS --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/debug/x86" toolset=clang-5.0~x86 \ - architecture=x86 target-os=android define=_LITTLE_ENDIAN \ - optimization=speed \ - address-model=32 variant=debug cxxflags="${CPPSTD}" \ - link=static threading=multi install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error staging Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building debug x86_64 Boost for Android Emulator - - ./b2 $THREADS --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/debug/x86_64" toolset=clang-5.0~x86_64 \ - architecture=x86 target-os=android define=_LITTLE_ENDIAN \ - optimization=speed \ - address-model=64 variant=debug cxxflags="${CPPSTD}" \ - link=static threading=multi install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error staging Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building debug armv7 Boost for Android - - ./b2 $THREADS --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/debug/armeabi-v7a" toolset=clang-5.0~arm \ - abi=aapcs architecture=arm address-model=32 binary-format=elf threading=multi \ - optimization=space \ - target-os=android variant=debug cxxflags="${CPPSTD}" \ - link=static install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error installing Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building debug arm64 Boost for Android - - ./b2 $THREADS --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/debug/arm64-v8a" toolset=clang-5.0~arm64 \ - abi=aapcs architecture=arm address-model=64 binary-format=elf threading=multi \ - optimization=space \ - target-os=android variant=debug cxxflags="${CPPSTD}" \ - link=static install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error installing Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection -} - -bootstrapBoost -generateAndroidUserConfig -buildBoost_Android -#buildBoost_Android_debug - -echo "Completed successfully" diff --git a/Common/3dParty/curl/build-android-common.sh b/Common/3dParty/curl/build-android-common.sh deleted file mode 100755 index d1b069c047..0000000000 --- a/Common/3dParty/curl/build-android-common.sh +++ /dev/null @@ -1,220 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 leenjewel -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source ./build-common.sh - -export PLATFORM_TYPE="Android" -export ARCHS=("arm" "arm64" "x86" "x86_64") -export ABIS=("armeabi-v7a" "arm64-v8a" "x86" "x86_64") -export ABI_TRIPLES=("arm-linux-androideabi" "aarch64-linux-android" "i686-linux-android" "x86_64-linux-android") -export ANDROID_API=21 - -# for test -# export ARCHS=("x86_64") -# export ABIS=("x86_64") -# export ABI_TRIPLES=("x86_64-linux-android") - -if [[ -z ${ANDROID_NDK_ROOT} ]]; then - echo "ANDROID_NDK_ROOT not defined" - exit 1 -fi - -function get_toolchain() { - HOST_OS=$(uname -s) - case ${HOST_OS} in - Darwin) HOST_OS=darwin ;; - Linux) HOST_OS=linux ;; - FreeBsd) HOST_OS=freebsd ;; - CYGWIN* | *_NT-*) HOST_OS=cygwin ;; - esac - - HOST_ARCH=$(uname -m) - case ${HOST_ARCH} in - i?86) HOST_ARCH=x86 ;; - x86_64 | amd64) HOST_ARCH=x86_64 ;; - esac - - echo "${HOST_OS}-${HOST_ARCH}" -} - -function get_android_arch() { - local common_arch=$1 - case ${common_arch} in - arm) - echo "arm-v7a" - ;; - arm64) - echo "arm64-v8a" - ;; - x86) - echo "x86" - ;; - x86_64) - echo "x86-64" - ;; - esac -} - -function get_target_build() { - local arch=$1 - case ${arch} in - arm-v7a) - echo "arm" - ;; - arm64-v8a) - echo "arm64" - ;; - x86) - echo "x86" - ;; - x86-64) - echo "x86_64" - ;; - esac -} - -function get_build_host_internal() { - local arch=$1 - case ${arch} in - arm-v7a | arm-v7a-neon) - echo "arm-linux-androideabi" - ;; - arm64-v8a) - echo "aarch64-linux-android" - ;; - x86) - echo "i686-linux-android" - ;; - x86-64) - echo "x86_64-linux-android" - ;; - esac -} - -function android_get_build_host() { - local arch=$(get_android_arch $1) - get_build_host_internal $arch -} - -function get_clang_target_host() { - local arch=$1 - local api=$2 - case ${arch} in - arm-v7a | arm-v7a-neon) - echo "armv7a-linux-androideabi${api}" - ;; - arm64-v8a) - echo "aarch64-linux-android${api}" - ;; - x86) - echo "i686-linux-android${api}" - ;; - x86-64) - echo "x86_64-linux-android${api}" - ;; - esac -} - -function set_android_toolchain_bin() { - export PATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/$(get_toolchain)/bin:$PATH - echo PATH=$PATH -} - -function set_android_toolchain() { - local name=$1 - local arch=$(get_android_arch $2) - local api=$3 - local build_host=$(get_build_host_internal "$arch") - local clang_target_host=$(get_clang_target_host "$arch" "$api") - - export AR=${build_host}-ar - export CC=${clang_target_host}-clang - export CXX=${clang_target_host}-clang++ - export AS=${build_host}-as - export LD=${build_host}-ld - export RANLIB=${build_host}-ranlib - export STRIP=${build_host}-strip -} - -function get_common_includes() { - local toolchain=$(get_toolchain) - echo "-I${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/include -I${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/local/include" -} -function get_common_linked_libraries() { - local api=$1 - local arch=$2 - local toolchain=$(get_toolchain) - local build_host=$(get_build_host_internal "$arch") - echo "-L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/${build_host}/lib -L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/lib/${build_host}/${api} -L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/lib" -} - -function set_android_cpu_feature() { - local name=$1 - local arch=$(get_android_arch $2) - local api=$3 - case ${arch} in - arm-v7a | arm-v7a-neon) - export CFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - arm64-v8a) - export CFLAGS="-march=armv8-a -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=armv8-a -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - x86) - export CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=i686 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - x86-64) - export CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=x86-64 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - esac -} - -function android_printf_global_params() { - local arch=$1 - local abi=$2 - local abi_triple=$3 - local in_dir=$4 - local out_dir=$5 - echo -e "arch = $arch" - echo -e "abi = $abi" - echo -e "abi_triple = $abi_triple" - echo -e "PLATFORM_TYPE = $PLATFORM_TYPE" - echo -e "ANDROID_API = $ANDROID_API" - echo -e "in_dir = $in_dir" - echo -e "out_dir = $out_dir" - echo -e "AR = $AR" - echo -e "CC = $CC" - echo -e "CXX = $CXX" - echo -e "AS = $AS" - echo -e "LD = $LD" - echo -e "RANLIB = $RANLIB" - echo -e "STRIP = $STRIP" - echo -e "CFLAGS = $CFLAGS" - echo -e "CXXFLAGS = $CXXFLAGS" - echo -e "LDFLAGS = $LDFLAGS" - echo -e "CPPFLAGS = $CPPFLAGS" -} diff --git a/Common/3dParty/curl/build-android-curl.sh b/Common/3dParty/curl/build-android-curl.sh deleted file mode 100755 index 697e8845b9..0000000000 --- a/Common/3dParty/curl/build-android-curl.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 leenjewel -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# # read -n1 -p "Press any key to continue..." - -set -u - -source ./build-android-common.sh - -init_log_color - -TOOLS_ROOT=$(pwd) - -SOURCE="$0" -while [ -h "$SOURCE" ]; do - DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" -done -pwd_path="$(cd -P "$(dirname "$SOURCE")" && pwd)" - -echo pwd_path=${pwd_path} -echo TOOLS_ROOT=${TOOLS_ROOT} - -LIB_VERSION="curl-7_68_0" -LIB_NAME="curl-7.68.0" -LIB_DEST_DIR="${pwd_path}/build/android/curl-universal" - -echo "https://github.com/curl/curl/releases/download/${LIB_VERSION}/${LIB_NAME}.tar.gz" - -# https://curl.haxx.se/download/${LIB_NAME}.tar.gz -# https://github.com/curl/curl/releases/download/curl-7_69_0/curl-7.69.0.tar.gz -# https://github.com/curl/curl/releases/download/curl-7_68_0/curl-7.68.0.tar.gz -rm -rf "${LIB_DEST_DIR}" "${LIB_NAME}" -[ -f "${LIB_NAME}.tar.gz" ] || curl -L -o ${LIB_NAME}.tar.gz https://github.com/curl/curl/releases/download/${LIB_VERSION}/${LIB_NAME}.tar.gz -s -[ -f "${LIB_NAME}.tar.gz" ] || log_error "curl download error!" - -set_android_toolchain_bin - -function configure_make() { - - ARCH=$1 - ABI=$2 - ABI_TRIPLE=$3 - - log_info "configure $ABI start..." - - if [ -d "${LIB_NAME}" ]; then - rm -fr "${LIB_NAME}" - fi - tar xfz "${LIB_NAME}.tar.gz" - pushd . - cd "${LIB_NAME}" - - PREFIX_DIR="${pwd_path}/build/android/${ABI}" - if [ -d "${PREFIX_DIR}" ]; then - rm -fr "${PREFIX_DIR}" - fi - mkdir -p "${PREFIX_DIR}" - - OUTPUT_ROOT=${TOOLS_ROOT}/build/android/${ABI} - mkdir -p ${OUTPUT_ROOT}/log - - set_android_toolchain "curl" "${ARCH}" "${ANDROID_API}" - set_android_cpu_feature "curl" "${ARCH}" "${ANDROID_API}" - - export ANDROID_NDK_HOME=${ANDROID_NDK_ROOT} - echo ANDROID_NDK_HOME=${ANDROID_NDK_HOME} - - OPENSSL_OUT_DIR="${pwd_path}/../openssl/build/android/${ABI}" - - export LDFLAGS="${LDFLAGS} -L${OPENSSL_OUT_DIR}/lib" - # export LDFLAGS="-Wl,-rpath-link,-L${OPENSSL_OUT_DIR}/lib $LDFLAGS " - - android_printf_global_params "$ARCH" "$ABI" "$ABI_TRIPLE" "$PREFIX_DIR" "$OUTPUT_ROOT" - - if [[ "${ARCH}" == "x86_64" ]]; then - - ./configure --host=$(android_get_build_host "${ARCH}") --prefix="${PREFIX_DIR}" --enable-ipv6 --with-ssl=${OPENSSL_OUT_DIR} --enable-static --disable-shared >"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - - elif [[ "${ARCH}" == "x86" ]]; then - - ./configure --host=$(android_get_build_host "${ARCH}") --prefix="${PREFIX_DIR}" --enable-ipv6 --with-ssl=${OPENSSL_OUT_DIR} --enable-static --disable-shared >"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - - elif [[ "${ARCH}" == "arm" ]]; then - - ./configure --host=$(android_get_build_host "${ARCH}") --prefix="${PREFIX_DIR}" --enable-ipv6 --with-ssl=${OPENSSL_OUT_DIR} --enable-static --disable-shared >"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - - elif [[ "${ARCH}" == "arm64" ]]; then - - ./configure --host=$(android_get_build_host "${ARCH}") --prefix="${PREFIX_DIR}" --enable-ipv6 --with-ssl=${OPENSSL_OUT_DIR} --enable-static --disable-shared >"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - - else - log_error "not support" && exit 1 - fi - - log_info "make $ABI start..." - - make clean >>"${OUTPUT_ROOT}/log/${ABI}.log" - if make -j$(get_cpu_count) >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1; then - make install >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - fi - - popd -} - -log_info "${PLATFORM_TYPE} ${LIB_NAME} start..." - -for ((i = 0; i < ${#ARCHS[@]}; i++)); do - if [[ $# -eq 0 || "$1" == "${ARCHS[i]}" ]]; then - configure_make "${ARCHS[i]}" "${ABIS[i]}" "${ABI_TRIPLES[i]}" - fi -done - -log_info "${PLATFORM_TYPE} ${LIB_NAME} end..." diff --git a/Common/3dParty/curl/curl.pri b/Common/3dParty/curl/curl.pri index d1178d404e..6d24ea212d 100644 --- a/Common/3dParty/curl/curl.pri +++ b/Common/3dParty/curl/curl.pri @@ -1,18 +1,10 @@ core_android { - - ABI_PATH = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "") - contains(ABI_PATH, "armv7" ) { - ABI_PATH = $$replace(ABI_PATH, "armv7", "armeabi-v7a") - } - contains(ABI_PATH, "arm64_v8a" ) { - ABI_PATH = $$replace(ABI_PATH, "arm64_v8a", "arm64-v8a") - } INCLUDEPATH += \ - $$PWD/build/android/$$ABI_PATH/include \ - $$PWD/../openssl/build/android/$$ABI_PATH/include \ + $$PWD/build/android/include \ + $$PWD/../openssl/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/include LIBS += \ - $$PWD/build/android/$$ABI_PATH/lib/libcurl.a \ - $$PWD/../openssl/build/android/$$ABI_PATH/lib/libssl.a \ - $$PWD/../openssl/build/android/$$ABI_PATH/lib/libcrypto.a \ + $$PWD/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/libcurl.a \ + $$PWD/../openssl/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/lib/libssl.a \ + $$PWD/../openssl/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/lib/libcrypto.a \ } diff --git a/Common/3dParty/icu/icu.pri b/Common/3dParty/icu/icu.pri index d63020fa5c..c5ae929f8a 100644 --- a/Common/3dParty/icu/icu.pri +++ b/Common/3dParty/icu/icu.pri @@ -43,8 +43,7 @@ core_ios { core_android { INCLUDEPATH += $$PWD/android/build/include - ICU_LIBS_PATH = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "") - LIBS += $$PWD/android/build/$$ICU_LIBS_PATH/libicuuc.a - LIBS += $$PWD/android/build/$$ICU_LIBS_PATH/libicudata.a + LIBS += $$PWD/android/build/$$CORE_BUILDS_PLATFORM_PREFIX_DST/libicuuc.a + LIBS += $$PWD/android/build/$$CORE_BUILDS_PLATFORM_PREFIX_DST/libicudata.a } diff --git a/Common/3dParty/openssl/openssl.pri b/Common/3dParty/openssl/openssl.pri index 861eb4d343..cb565d4621 100644 --- a/Common/3dParty/openssl/openssl.pri +++ b/Common/3dParty/openssl/openssl.pri @@ -11,16 +11,7 @@ open_ssl_common { OPENSSL_LIBS_DIRECTORY = $$PWD/build/$$OPEN_SSL_PLATFORM/lib core_android { - - OPENSSL_ABI_PATH = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "") - contains(OPENSSL_ABI_PATH, "armv7" ) { - OPENSSL_ABI_PATH = $$replace(OPENSSL_ABI_PATH, "armv7", "armeabi-v7a") - } - contains(OPENSSL_ABI_PATH, "arm64_v8a" ) { - OPENSSL_ABI_PATH = $$replace(OPENSSL_ABI_PATH, "arm64_v8a", "arm64-v8a") - } - - OPENSSL_LIBS_DIRECTORY = $$PWD/build/android/$$OPENSSL_ABI_PATH/lib + OPENSSL_LIBS_DIRECTORY = $$PWD/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/lib } core_ios { diff --git a/Common/3dParty/v8/android/build.py b/Common/3dParty/v8/android/build.py index 14129064c6..0c31835c77 100644 --- a/Common/3dParty/v8/android/build.py +++ b/Common/3dParty/v8/android/build.py @@ -123,7 +123,7 @@ def get_android_args(platform, sdk_ver=21): "v8_static_library=true", "v8_monolithic=true", "use_custom_libcxx=false", - "android_ndk_version=\\\"21.1.6352462\\\"", + "android_ndk_version=\\\"26.2.11394342\\\"", "android_sdk_version=\\\"" + str(sdk_ver) + "\\\"", "clang_use_chrome_plugins=false", "v8_use_external_startup_data=false", diff --git a/Common/3dParty/v8/v8.pri b/Common/3dParty/v8/v8.pri index 24f6fe1afb..1148ffb566 100644 --- a/Common/3dParty/v8/v8.pri +++ b/Common/3dParty/v8/v8.pri @@ -30,6 +30,8 @@ core_android { isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_armv7): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_LIBS/armeabi-v7a isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_x86): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_LIBS/x86 isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_x86_64): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_LIBS/x86_64 + + LIBS += -ldl } INCLUDEPATH += \ diff --git a/Common/base.pri b/Common/base.pri index 59a3bb0e2a..eb6a1ec793 100644 --- a/Common/base.pri +++ b/Common/base.pri @@ -19,6 +19,11 @@ isEmpty(PUBLISHER_NAME){ PUBLISHER_NAME = $$cat(copyright.txt) } +DEST_MAKEFILE_NAME = $$(DEST_MAKEFILE_NAME) +!isEmpty(DEST_MAKEFILE_NAME){ + MAKEFILE = $${DEST_MAKEFILE_NAME} +} + APPLICATION_NAME_DEFAULT = $$(APPLICATION_NAME_DEFAULT) !isEmpty(APPLICATION_NAME_DEFAULT){ DEFINES += "APPLICATION_NAME_DEFAULT=$${APPLICATION_NAME_DEFAULT}" @@ -366,6 +371,7 @@ core_android { CORE_BUILDS_PLATFORM_PREFIX = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "-", "_") CORE_BUILDS_PLATFORM_PREFIX = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "armeabi_v7", "armv7") CORE_BUILDS_PLATFORM_PREFIX = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "armv7a", "armv7") + CORE_BUILDS_PLATFORM_PREFIX_DST = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "") !isEmpty(OO_DESTDIR_BUILD_OVERRIDE) { isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_arm64_v8a):OO_DESTDIR_BUILD_OVERRIDE=$$OO_DESTDIR_BUILD_OVERRIDE/arm64-v8a diff --git a/DesktopEditor/cximage/raw/libdcr.h b/DesktopEditor/cximage/raw/libdcr.h index 0b828454aa..6d74732a87 100644 --- a/DesktopEditor/cximage/raw/libdcr.h +++ b/DesktopEditor/cximage/raw/libdcr.h @@ -58,7 +58,7 @@ #ifdef __ANDROID__ #include -#if __ANDROID_API__ < 28 +#if __ANDROID_API__ < 22 static void swab(const char* __src, char* __dst, ssize_t __byte_count) { ssize_t len = __byte_count; diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index 01c6d1bc37..7842fed0e8 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -52,26 +52,33 @@ v8::Local CreateV8String(v8::Isolate* i, const char* str, const int& len = -1); v8::Local CreateV8String(v8::Isolate* i, const std::string& str); +#define ANDROID_LOGS #ifdef ANDROID_LOGS -#include +//#define ANDROID_LOGS_ALL_FUNCTIONS +#include +#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, "js", __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, "js", __VA_ARGS__) #endif -#ifdef V8_OS_XP +#if 1 class MallocArrayBufferAllocator : public v8::ArrayBuffer::Allocator { public: virtual void* Allocate(size_t length) { + LOGW("allocate: %d\n", (int)length); void* ret = malloc(length); memset(ret, 0, length); return ret; } virtual void* AllocateUninitialized(size_t length) { + LOGW("allocate_uninitialized: %d\n", (int)length); return malloc(length); } virtual void Free(void* data, size_t length) { + LOGW("free: %d\n", (int)length); free(data); } }; @@ -114,7 +121,9 @@ public: v8::V8::InitializeICUDefaultLocation(sPrA.c_str()); v8::V8::InitializeExternalStartupData(sPrA.c_str()); #ifdef V8_VERSION_89_PLUS - m_platform = v8::platform::NewDefaultPlatform(); + //m_platform = v8::platform::NewDefaultPlatform(); + v8::V8::SetFlagsFromString("--single-threaded"); + m_platform = v8::platform::NewSingleThreadedDefaultPlatform(); v8::V8::InitializePlatform(m_platform.get()); #else m_platform = v8::platform::CreateDefaultPlatform(); @@ -481,9 +490,15 @@ namespace NSJSBase CInspectorPool::get().getInspector(V8IsolateOneArg).startAgent(false); #endif +#ifdef ANDROID_LOGS_ALL_FUNCTIONS + std::string sFuncName(name); + std::string sFunc = "[JS call_func: " + sFuncName + "]"; + LOGW(sFunc.c_str()); +#endif + LOGGER_START - v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); + v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); v8::Handle _func = value->Get(V8ContextFirstArg _name).ToLocalChecked(); CJSValueV8* _return = new CJSValueV8(); @@ -514,7 +529,12 @@ namespace NSJSBase LOGGER_LAP_NAME(name) - JSSmart _ret = _return; +#ifdef ANDROID_LOGS_ALL_FUNCTIONS + sFunc = "[JS call_func_end: " + sFuncName + "]"; + LOGW(sFunc.c_str()); +#endif + + JSSmart _ret = _return; return _ret; } @@ -804,10 +824,8 @@ namespace NSJSBase #endif #ifdef ANDROID_LOGS - LOGE("NSJSBase::CV8TryCatch::Check() - error:"); - LOGE(std::to_string(nLineNumber).c_str()); - LOGE(strCode.c_str()); - LOGE(strException.c_str()); + std::string sLog = "[JS (" + std::to_string(nLineNumber) + ")]: " + strCode + ", " + strException; + LOGE(sLog.c_str()); #endif return true; } diff --git a/DesktopEditor/graphics/Timer.cpp b/DesktopEditor/graphics/Timer.cpp index 832c591009..a81bbdad8c 100644 --- a/DesktopEditor/graphics/Timer.cpp +++ b/DesktopEditor/graphics/Timer.cpp @@ -39,8 +39,8 @@ namespace NSTimers { - // CLOCK_MONOTONIC defined ONLY since macOS 10.12!!! (crash on earlier version) - DWORD GetTickCount() + // CLOCK_MONOTONIC defined ONLY since macOS 10.12!!! (crash on earlier version) + DWORD GetTickCount() { #if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE) return ::GetTickCount(); @@ -49,55 +49,55 @@ namespace NSTimers struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); - return (ts.tv_sec * 1000 + (DWORD)(ts.tv_nsec / 1000000)); + return (ts.tv_sec * 1000 + (DWORD)(ts.tv_nsec / 1000000)); #else - //uint64_t nano = mach_absolute_time(); - //return nano / 1000000; - return getUptimeInMilliseconds(); + //uint64_t nano = mach_absolute_time(); + //return nano / 1000000; + return getUptimeInMilliseconds(); #endif #endif } - CTimer::CTimer() : NSThreads::CBaseThread() - { - m_dwInterval = 40; - m_bIsCOMNeed = FALSE; - } - CTimer::~CTimer() - { - } + CTimer::CTimer() : NSThreads::CBaseThread() + { + m_dwInterval = 40; + m_bIsCOMNeed = FALSE; + } + CTimer::~CTimer() + { + } - void CTimer::SetInterval(const DWORD& dwInterval) { m_dwInterval = dwInterval; } - void CTimer::SetCOMNeed(const INT& bIsCOM) { m_bIsCOMNeed = bIsCOM; } + void CTimer::SetInterval(const DWORD& dwInterval) { m_dwInterval = dwInterval; } + void CTimer::SetCOMNeed(const INT& bIsCOM) { m_bIsCOMNeed = bIsCOM; } - DWORD CTimer::ThreadProc() - { + DWORD CTimer::ThreadProc() + { #ifdef _CAN_USE_COM_THREADS - if (m_bIsCOMNeed) - CoInitialize(NULL); + if (m_bIsCOMNeed) + CoInitialize(NULL); #endif - DWORD m_startTime, m_curTime; - m_startTime = NSTimers::GetTickCount(); + DWORD m_startTime, m_curTime; + m_startTime = NSTimers::GetTickCount(); - while (m_bRunThread) - { - m_curTime = NSTimers::GetTickCount(); - while (m_curTime - m_startTime < m_dwInterval) - { - NSThreads::Sleep(10); - if (!m_bRunThread) - break; - m_curTime = NSTimers::GetTickCount(); - } + while (m_bRunThread) + { + m_curTime = NSTimers::GetTickCount(); + while (m_curTime - m_startTime < m_dwInterval) + { + NSThreads::Sleep(10); + if (!m_bRunThread) + break; + m_curTime = NSTimers::GetTickCount(); + } - m_startTime = NSTimers::GetTickCount(); - OnTimer(); - } + m_startTime = NSTimers::GetTickCount(); + OnTimer(); + } #ifdef _CAN_USE_COM_THREADS - if (m_bIsCOMNeed) - CoUninitialize(); + if (m_bIsCOMNeed) + CoUninitialize(); #endif - return 0; - } + return 0; + } } diff --git a/DesktopEditor/graphics/Timer.h b/DesktopEditor/graphics/Timer.h index 5e21823599..62ef2ba626 100644 --- a/DesktopEditor/graphics/Timer.h +++ b/DesktopEditor/graphics/Timer.h @@ -41,51 +41,51 @@ namespace NSTimers { - KERNEL_DECL DWORD GetTickCount(); + KERNEL_DECL DWORD GetTickCount(); - class KERNEL_DECL CTimer : public NSThreads::CBaseThread + class KERNEL_DECL CTimer : public NSThreads::CBaseThread { private: DWORD m_dwInterval; - INT m_bIsCOMNeed; + INT m_bIsCOMNeed; public: - CTimer(); - virtual ~CTimer(); + CTimer(); + virtual ~CTimer(); - void SetInterval(const DWORD& dwInterval); - void SetCOMNeed(const INT& bIsCOM); + void SetInterval(const DWORD& dwInterval); + void SetCOMNeed(const INT& bIsCOM); protected: - virtual DWORD ThreadProc(); + virtual DWORD ThreadProc(); virtual void OnTimer() = 0; }; - - inline static unsigned long getUptimeInMilliseconds() - { + + inline static unsigned long getUptimeInMilliseconds() + { #if defined(_IOS) || defined(_MAC) - const int64_t kOneMillion = 1000 * 1000; - static mach_timebase_info_data_t s_timebase_info; - - if (s_timebase_info.denom == 0) { - (void) mach_timebase_info(&s_timebase_info); - } - - // mach_absolute_time() returns billionth of seconds, - // so divide by one million to get milliseconds - return (unsigned long)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom)); + const int64_t kOneMillion = 1000 * 1000; + static mach_timebase_info_data_t s_timebase_info; + + if (s_timebase_info.denom == 0) { + (void) mach_timebase_info(&s_timebase_info); + } + + // mach_absolute_time() returns billionth of seconds, + // so divide by one million to get milliseconds + return (unsigned long)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom)); #endif - + #ifdef __ANDROID__ - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - - return (ts.tv_sec * 1000 + (DWORD)(ts.tv_nsec / 1000000)); + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + + return (ts.tv_sec * 1000 + (DWORD)(ts.tv_nsec / 1000000)); #endif - - return 0; - } + + return 0; + } } #endif diff --git a/DesktopEditor/graphics/pro/raster.pri b/DesktopEditor/graphics/pro/raster.pri index feaaad1e2d..f5e54810fc 100644 --- a/DesktopEditor/graphics/pro/raster.pri +++ b/DesktopEditor/graphics/pro/raster.pri @@ -28,6 +28,10 @@ core_windows { LIBS += -lUser32 } +core_android { + QMAKE_CFLAGS += -Wno-incompatible-function-pointer-types +} + INCLUDEPATH += \ $$LIB_GRAPHICS_PRI_PATH/cximage/jasper/include \ $$LIB_GRAPHICS_PRI_PATH/cximage/jpeg \ From 76e05db9da3f5dbb97726230aea8a6b06be225b1 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 11 Mar 2024 13:54:41 +0600 Subject: [PATCH 051/117] Fix bug #66657 --- .../Format/Logic/Biff_structures/SyntaxPtg.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index fdd9920eec..2511efa6bc 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -427,7 +427,7 @@ const bool SyntaxPtg::extract_PtgStr(std::wstring::const_iterator& first, std::w // static const bool SyntaxPtg::extract_PtgName(std::wstring::const_iterator& first, std::wstring::const_iterator last, unsigned int& out_num) { - static boost::wregex reg_name(L"^(\\w[\\w\\d.]*)([-+*/^&%<=>: ;),]|$)"); + static boost::wregex reg_name(L"^([\\w[:Unicode:]][\\w[:Unicode:]\\d.]*)([-+*/^&%<=>: ;),]|$)"); boost::match_results results; if(boost::regex_search(first, last, results, reg_name)) @@ -447,7 +447,7 @@ const bool SyntaxPtg::extract_PtgName(std::wstring::const_iterator& first, std:: // static const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std::wstring::const_iterator last, PtgList& ptgList, unsigned short ixti) { - static boost::wregex reg_table_name(L"^(\\w[\\w\\d.]*)\\["); //tableName '=SUM(tblName[Total])' + static boost::wregex reg_table_name(L"^([\\w[:Unicode:]][[:Unicode:]\\w\\d.]*)\\["); //tableName '=SUM(tblName[Total])' boost::match_results results; if (boost::regex_search(first, last, results, reg_table_name)) @@ -464,9 +464,9 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: ptgList.invalid = false; ptgList.nonresident = false; ptgList.ixti = ixti; - static boost::wregex reg_inside_table1(L"\\[#?[\\s\\w\\d.]+\\]"); - static boost::wregex reg_inside_table2(L"\\[#\\w[\\s\\w\\d.]*\\],\\[#\\w[\\s\\w\\d.]*\\]"); - static boost::wregex reg_inside_table3(L"^[,;:]?\\[#?[\\s\\w\\d.]+\\]"); + static boost::wregex reg_inside_table1(L"\\[#?[\\s\\w[:Unicode:]\\d.]+\\]"); + static boost::wregex reg_inside_table2(L"\\[#[\\w[:Unicode:]][\\s\\w[:Unicode:]\\d.]*\\],\\[#[\\w[:Unicode:]][[:Unicode:]\\s\\w\\d.]*\\]"); + static boost::wregex reg_inside_table3(L"^[,;:]?\\[#?[[:Unicode:]\\s\\w\\d.]+\\]"); static boost::wregex reg_inside_table4(L"\\[#?(\\[.+?\\]\\,)?(\\[.+?\\])?.+?\\]"); static boost::wregex reg_inside_table5(L"^[,;:]?\\[.+?\\]"); static boost::wregex reg_inside_table6(L"\\[\\]"); @@ -713,7 +713,7 @@ const bool SyntaxPtg::extract_PtgRef(std::wstring::const_iterator& first, std::w // static const bool SyntaxPtg::extract_3D_part(std::wstring::const_iterator& first, std::wstring::const_iterator last, unsigned short& ixti) { - static boost::wregex reg_sheets(L"^(\\w[\\w\\d.]*(:\\w[\\w\\d.]*)?)!"); + static boost::wregex reg_sheets(L"^([\\w[:Unicode:]][[:Unicode:]\\w\\d.]*(:[\\w[:Unicode:]][[:Unicode:]\\w\\d.]*)?)!"); static boost::wregex reg_quoted(L"^'((''|[^]['\\/*?])*)'!"); boost::match_results results; if (boost::regex_search(first, last, results, reg_sheets) || @@ -736,7 +736,7 @@ const bool SyntaxPtg::extract_3D_part(std::wstring::const_iterator& first, std:: // static const bool SyntaxPtg::extract_UndefinedName(std::wstring::const_iterator& first, std::wstring::const_iterator last) { - static boost::wregex reg_undef(L"^([\\w\\d.]+)([-+*/^&%<=>: ;),]|$)"); + static boost::wregex reg_undef(L"^([[:Unicode:]\\w\\d.]+)([-+*/^&%<=>: ;),]|$)"); boost::match_results results; if(boost::regex_search(first, last, results, reg_undef)) { From db3d665f8cc04bc78bca5903ac93975bccf8adaf Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 11 Mar 2024 19:27:53 +0300 Subject: [PATCH 052/117] fix bug #66821 --- .../Converter/pptx_conversion_context.cpp | 1251 +++++++++-------- 1 file changed, 627 insertions(+), 624 deletions(-) diff --git a/OdfFile/Reader/Converter/pptx_conversion_context.cpp b/OdfFile/Reader/Converter/pptx_conversion_context.cpp index f857f0e1d0..49f975a0eb 100644 --- a/OdfFile/Reader/Converter/pptx_conversion_context.cpp +++ b/OdfFile/Reader/Converter/pptx_conversion_context.cpp @@ -53,675 +53,678 @@ namespace cpdoccore { } namespace oox { + namespace package + { + class pptx_document; + } - namespace package + pptx_conversion_context::pptx_conversion_context(odf_reader::odf_document* odfDocument) + :output_document_(NULL) + , odf_document_(odfDocument) + , pptx_text_context_(odf_document_->odf_context(), *this) + , pptx_table_context_(*this) + , pptx_comments_context_(comments_context_handle_) + , pptx_slide_context_(*this/*, pptx_text_context_*/) + , math_context_(odf_document_->odf_context().fontContainer(), true) + , last_idx_placeHolder(1) + , last_uniq_big_id(1) + { + } + + pptx_conversion_context::~pptx_conversion_context() + { + } + + void pptx_conversion_context::set_output_document(package::pptx_document* document) + { + output_document_ = document; + } + + void pptx_conversion_context::set_font_directory(std::wstring pathFonts) + { + pptx_slide_context_.get_mediaitems()->set_font_directory(pathFonts); + } + void pptx_conversion_context::add_page_name(const std::wstring& page_name) + { + page_names_.push_back(page_name); + } + + const std::vector& pptx_conversion_context::get_page_names() const + { + return page_names_; + } + + void pptx_conversion_context::process_layouts() + { + odf_reader::presentation_layouts_instance& layouts = root()->odf_context().styleContainer().presentation_layouts(); + + get_text_context().set_process_layouts(true); + + //актуальные + for (size_t layout_index = 0; layout_index < layouts.content.size(); layout_index++) { - class pptx_document; - } + start_layout(layout_index); - pptx_conversion_context::pptx_conversion_context(odf_reader::odf_document* odfDocument) - :output_document_(NULL) - , odf_document_(odfDocument) - , pptx_text_context_(odf_document_->odf_context(), *this) - , pptx_table_context_(*this) - , pptx_comments_context_(comments_context_handle_) - , pptx_slide_context_(*this/*, pptx_text_context_*/) - , math_context_(odf_document_->odf_context().fontContainer(), true) - , last_idx_placeHolder(1) - , last_uniq_big_id(1) - { - } + odf_reader::style_presentation_page_layout* layout = + root()->odf_context().pageLayoutContainer().presentation_page_layout_by_name(layouts.content[layout_index].layout_name); - pptx_conversion_context::~pptx_conversion_context() - { - } - - void pptx_conversion_context::set_output_document(package::pptx_document* document) - { - output_document_ = document; - } - - void pptx_conversion_context::set_font_directory(std::wstring pathFonts) - { - pptx_slide_context_.get_mediaitems()->set_font_directory(pathFonts); - } -void pptx_conversion_context::add_page_name(const std::wstring& page_name) -{ - page_names_.push_back(page_name); -} - -const std::vector& pptx_conversion_context::get_page_names() const -{ - return page_names_; -} - - void pptx_conversion_context::process_layouts() - { - odf_reader::presentation_layouts_instance& layouts = root()->odf_context().styleContainer().presentation_layouts(); - - get_text_context().set_process_layouts(true); - - //актуальные - for (size_t layout_index = 0; layout_index < layouts.content.size(); layout_index++) + if (layout) { - start_layout(layout_index); + layout->pptx_convert(*this); + } + //нужно вытащить footers + odf_reader::style_master_page* master = + root()->odf_context().pageLayoutContainer().master_page_by_name(layouts.content[layout_index].master_name); - odf_reader::style_presentation_page_layout* layout = - root()->odf_context().pageLayoutContainer().presentation_page_layout_by_name(layouts.content[layout_index].layout_name); - - if (layout) + if (master) + { + for (size_t i = 0; i < master->content_.size(); i++) { - layout->pptx_convert(*this); - } - //нужно вытащить footers - odf_reader::style_master_page* master = - root()->odf_context().pageLayoutContainer().master_page_by_name(layouts.content[layout_index].master_name); - - if (master) - { - for (size_t i = 0; i < master->content_.size(); i++) + odf_reader::draw_frame* frame = dynamic_cast(master->content_[i].get()); + if (frame) { - odf_reader::draw_frame* frame = dynamic_cast(master->content_[i].get()); - if (frame) + odf_types::common_presentation_attlist& common_presentation_attlist_ = frame->common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_; + + if (common_presentation_attlist_.presentation_class_) { - odf_types::common_presentation_attlist& common_presentation_attlist_ = frame->common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_; + odf_types::presentation_class::type type = common_presentation_attlist_.presentation_class_->get_type(); - if (common_presentation_attlist_.presentation_class_) + if (type == odf_types::presentation_class::footer || + type == odf_types::presentation_class::date_time || + type == odf_types::presentation_class::header || + type == odf_types::presentation_class::page_number) { - odf_types::presentation_class::type type = common_presentation_attlist_.presentation_class_->get_type(); + if (frame->idx_in_owner < 0) + frame->idx_in_owner = last_idx_placeHolder++; - if (type == odf_types::presentation_class::footer || - type == odf_types::presentation_class::date_time || - type == odf_types::presentation_class::header || - type == odf_types::presentation_class::page_number) - { - if (frame->idx_in_owner < 0) - frame->idx_in_owner = last_idx_placeHolder++; - - frame->pptx_convert_placeHolder(*this); - } + frame->pptx_convert_placeHolder(*this); } } } } - end_layout(); } - get_text_context().set_process_layouts(false); + end_layout(); } - void pptx_conversion_context::process_master_pages() + get_text_context().set_process_layouts(false); + } + void pptx_conversion_context::process_master_pages() + { + odf_reader::presentation_masters_instance& masters = root()->odf_context().styleContainer().presentation_masters(); + + process_masters_ = true; + get_text_context().set_process_layouts(true); + + //берем только актуальные + odf_reader::office_element_ptr master_notes_; + + for (size_t master_index = 0; master_index < masters.content.size(); master_index++) { - odf_reader::presentation_masters_instance& masters = root()->odf_context().styleContainer().presentation_masters(); + start_master(master_index); - process_masters_ = true; - get_text_context().set_process_layouts(true); + odf_reader::style_master_page* master = + root()->odf_context().pageLayoutContainer().master_page_by_name(masters.content[master_index].master_name); - //берем только актуальные - odf_reader::office_element_ptr master_notes_; - - for (size_t master_index = 0; master_index < masters.content.size(); master_index++) + if (master) { - start_master(master_index); + master->pptx_convert(*this); - odf_reader::style_master_page* master = - root()->odf_context().pageLayoutContainer().master_page_by_name(masters.content[master_index].master_name); + if (!master_notes_ && master->presentation_notes_) + master_notes_ = master->presentation_notes_; + } - if (master) + + end_master(); + } + + if (master_notes_) + { + start_master_notes(); + master_notes_->pptx_convert(*this); + end_master_notes(); + } + process_masters_ = false; + get_text_context().set_process_layouts(false); + + } + + void pptx_conversion_context::process_styles() + { + + } + void pptx_conversion_context::process_theme(std::wstring name) + { + int current = themes_.size() + 1; + + if (name.empty()) + { + name = L"User Theme: " + std::to_wstring(current); + } + start_theme(name); + // + pptx_serialize_clrScheme(current_theme().clrSchemeData()); + pptx_serialize_fmtScheme(current_theme().fmtSchemeData()); + pptx_serialize_fontScheme(current_theme().fontSchemeData()); + // + end_theme(); + + } + void pptx_conversion_context::start_document() + { + odf_reader::odf_read_context& odfContext = root()->odf_context(); + std::vector instances; + + instances.push_back(odfContext.styleContainer().style_default_by_type(odf_types::style_family::Presentation)); + instances.push_back(odfContext.styleContainer().style_by_name(L"Default", odf_types::style_family::Presentation, false)); + + odf_reader::text_format_properties_ptr textFormatProperties = calc_text_properties_content(instances); + odf_reader::paragraph_format_properties parFormatProperties = calc_paragraph_properties_content(instances); + + process_masters_ = false; + } + + void pptx_conversion_context::end_document() + { + for (size_t i = 0; i < slideMasters_.size(); i++) + { + pptx_xml_slideMaster_ptr& slideM = slideMasters_[i]; + + package::slide_content_ptr content = package::slide_content::create(); + + slideM->write_to(content->content()); + content->add_rels(slideM->Rels());//media & links rels + + output_document_->get_ppt_files().add_slideMaster(content);//slideMaster.xml + + CP_XML_WRITER(presentation_.slideMastersData())//presentation.xml + { + CP_XML_NODE(L"p:sldMasterId") { - master->pptx_convert(*this); - - if (!master_notes_ && master->presentation_notes_) - master_notes_ = master->presentation_notes_; - } - - - end_master(); - } - - if (master_notes_) - { - start_master_notes(); - master_notes_->pptx_convert(*this); - end_master_notes(); - } - process_masters_ = false; - get_text_context().set_process_layouts(false); - - } - - void pptx_conversion_context::process_styles() - { - - } - void pptx_conversion_context::process_theme(std::wstring name) - { - int current = themes_.size() + 1; - - if (name.empty()) - { - name = L"User Theme: " + std::to_wstring(current); - } - start_theme(name); - // - pptx_serialize_clrScheme(current_theme().clrSchemeData()); - pptx_serialize_fmtScheme(current_theme().fmtSchemeData()); - pptx_serialize_fontScheme(current_theme().fontSchemeData()); - // - end_theme(); - - } - void pptx_conversion_context::start_document() - { - odf_reader::odf_read_context& odfContext = root()->odf_context(); - std::vector instances; - - instances.push_back(odfContext.styleContainer().style_default_by_type(odf_types::style_family::Presentation)); - instances.push_back(odfContext.styleContainer().style_by_name(L"Default", odf_types::style_family::Presentation, false)); - - odf_reader::text_format_properties_ptr textFormatProperties = calc_text_properties_content(instances); - odf_reader::paragraph_format_properties parFormatProperties = calc_paragraph_properties_content(instances); - - process_masters_ = false; - } - - void pptx_conversion_context::end_document() - { - for (size_t i = 0; i < slideMasters_.size(); i++) - { - pptx_xml_slideMaster_ptr& slideM = slideMasters_[i]; - - package::slide_content_ptr content = package::slide_content::create(); - - slideM->write_to(content->content()); - content->add_rels(slideM->Rels());//media & links rels - - output_document_->get_ppt_files().add_slideMaster(content);//slideMaster.xml - - CP_XML_WRITER(presentation_.slideMastersData())//presentation.xml - { - CP_XML_NODE(L"p:sldMasterId") - { - CP_XML_ATTR(L"id", 0x80000000 + last_uniq_big_id++); - CP_XML_ATTR(L"r:id", slideM->rId()); - } + CP_XML_ATTR(L"id", 0x80000000 + last_uniq_big_id++); + CP_XML_ATTR(L"r:id", slideM->rId()); } } - if (!slideMasters_.empty()) - presentation_.slidesProperties() << slideMasters_[0]->Sizes().str(); + } + if (!slideMasters_.empty()) + presentation_.slidesProperties() << slideMasters_[0]->Sizes().str(); - //////////////////////////////////////////////////////////////////////////////////////////////////// - for (size_t i = 0; i < slides_.size(); i++) + //////////////////////////////////////////////////////////////////////////////////////////////////// + for (size_t i = 0; i < slides_.size(); i++) + { + pptx_xml_slide_ptr& slide = slides_[i]; + + package::slide_content_ptr content = package::slide_content::create(); + + slide->write_to(content->content()); + content->add_rels(slide->Rels());//media & links rels + + output_document_->get_ppt_files().add_slide(content);//slide.xml + + CP_XML_WRITER(presentation_.slidesData())//presentation.xml { - pptx_xml_slide_ptr& slide = slides_[i]; - - package::slide_content_ptr content = package::slide_content::create(); - - slide->write_to(content->content()); - content->add_rels(slide->Rels());//media & links rels - - output_document_->get_ppt_files().add_slide(content);//slide.xml - - CP_XML_WRITER(presentation_.slidesData())//presentation.xml + CP_XML_NODE(L"p:sldId") { - CP_XML_NODE(L"p:sldId") - { - CP_XML_ATTR(L"id", 0x100 + i); - CP_XML_ATTR(L"r:id", slide->rId()); - } + CP_XML_ATTR(L"id", 0x100 + i); + CP_XML_ATTR(L"r:id", slide->rId()); } } - //---------------------------------------------------------------------------------- - for (size_t i = 0; i < slideLayouts_.size(); i++) + } + //---------------------------------------------------------------------------------- + for (size_t i = 0; i < slideLayouts_.size(); i++) + { + pptx_xml_slideLayout_ptr& slideL = slideLayouts_[i]; + + package::slide_content_ptr content = package::slide_content::create(); + + slideL->write_to(content->content()); + content->add_rels(slideL->Rels());//media & links rels + + output_document_->get_ppt_files().add_slideLayout(content);//slideMaster.xml + } + //---------------------------------------------------------------------------------- + for (size_t i = 0; i < notes_.size(); i++) + { + pptx_xml_slideNotes_ptr& slideN = notes_[i]; + + package::slide_content_ptr content = package::slide_content::create(); + + slideN->write_to(content->content()); + content->add_rels(slideN->Rels());//media & links rels + + output_document_->get_ppt_files().add_notes(content); + } + if (slideNotesMaster_) + { + package::slide_content_ptr content = package::slide_content::create(); + + slideNotesMaster_->write_to(content->content()); + content->add_rels(slideNotesMaster_->Rels());//media & links rels + + output_document_->get_ppt_files().add_notesMaster(content); + + CP_XML_WRITER(presentation_.slideNotesMastersData())//presentation.xml { - pptx_xml_slideLayout_ptr& slideL = slideLayouts_[i]; - - package::slide_content_ptr content = package::slide_content::create(); - - slideL->write_to(content->content()); - content->add_rels(slideL->Rels());//media & links rels - - output_document_->get_ppt_files().add_slideLayout(content);//slideMaster.xml - } - //---------------------------------------------------------------------------------- - for (size_t i = 0; i < notes_.size(); i++) - { - pptx_xml_slideNotes_ptr& slideN = notes_[i]; - - package::slide_content_ptr content = package::slide_content::create(); - - slideN->write_to(content->content()); - content->add_rels(slideN->Rels());//media & links rels - - output_document_->get_ppt_files().add_notes(content); - } - if (slideNotesMaster_) - { - package::slide_content_ptr content = package::slide_content::create(); - - slideNotesMaster_->write_to(content->content()); - content->add_rels(slideNotesMaster_->Rels());//media & links rels - - output_document_->get_ppt_files().add_notesMaster(content); - - CP_XML_WRITER(presentation_.slideNotesMastersData())//presentation.xml + CP_XML_NODE(L"p:notesMasterId") { - CP_XML_NODE(L"p:notesMasterId") - { - CP_XML_ATTR(L"r:id", slideNotesMaster_->rId()); - } + CP_XML_ATTR(L"r:id", slideNotesMaster_->rId()); } } - //else - pptx_serialize_size(current_presentation().slidesNotesProperties(), 6858000, 9144000, L"p:notesSz"); - - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - - for (size_t i = 0; i < charts_.size(); i++) - { - package::chart_content_ptr content = package::chart_content::create(); - - charts_[i]->serialize(content->content()); - charts_[i]->dump_rels(content->get_rel_file()->get_rels()); - - output_document_->get_ppt_files().add_charts(content); - - } - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - for (size_t i = 0; i < themes_.size(); i++) - { - output_document_->get_ppt_files().add_theme(themes_[i]); - - } - package::ppt_comments_files_ptr comments = package::ppt_comments_files::create(comments_context_handle_.content()); - - output_document_->get_ppt_files().set_presentation(presentation_); - output_document_->get_ppt_files().set_comments(comments); - output_document_->get_ppt_files().set_authors_comments(authors_comments_); - output_document_->get_ppt_files().set_media(get_mediaitems()); - - output_document_->get_content_types_file().set_media(get_mediaitems()); } + //else + pptx_serialize_size(current_presentation().slidesNotesProperties(), 6858000, 9144000, L"p:notesSz"); - void pptx_conversion_context::start_body() + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + + for (size_t i = 0; i < charts_.size(); i++) { + package::chart_content_ptr content = package::chart_content::create(); + + charts_[i]->serialize(content->content()); + charts_[i]->dump_rels(content->get_rel_file()->get_rels()); + + output_document_->get_ppt_files().add_charts(content); } - - void pptx_conversion_context::end_body() + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + for (size_t i = 0; i < themes_.size(); i++) { - } - pptx_xml_slideNotesMaster& pptx_conversion_context::current_notesMaster() - { - if (slideNotesMaster_) - { - return *slideNotesMaster_; - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_slideNotes& pptx_conversion_context::current_notes() - { - if (!notes_.empty()) - { - return *notes_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_slide& pptx_conversion_context::current_slide() - { - if (!slides_.empty()) - { - return *slides_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_slideLayout& pptx_conversion_context::current_layout() - { - if (!slideLayouts_.empty()) - { - return *slideLayouts_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_theme& pptx_conversion_context::current_theme() - { - if (!themes_.empty()) - { - return *themes_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_presentation& pptx_conversion_context::current_presentation() - { - return presentation_; - } - - oox_chart_context& pptx_conversion_context::current_chart() - { - if (!charts_.empty()) - { - return *charts_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_slideMaster& pptx_conversion_context::current_master() - { - if (!slideMasters_.empty()) - { - return *slideMasters_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - void pptx_conversion_context::create_new_slide(std::wstring const& name) - { - pptx_xml_slide_ptr s = pptx_xml_slide::create(name, slides_.size() + 1); - slides_.push_back(s); - } - void pptx_conversion_context::create_new_slideNotes() - { - pptx_xml_slideNotes_ptr s = pptx_xml_slideNotes::create(notes_.size() + 1); - notes_.push_back(s); - } - void pptx_conversion_context::create_new_slideNotesMaster() - { - slideNotesMaster_ = pptx_xml_slideNotesMaster::create(); - } - void pptx_conversion_context::create_new_slideLayout(int id) - { - pptx_xml_slideLayout_ptr s = pptx_xml_slideLayout::create(id); - slideLayouts_.push_back(s); - } - void pptx_conversion_context::create_new_slideMaster(int id) - { - pptx_xml_slideMaster_ptr s = pptx_xml_slideMaster::create(id); - slideMasters_.push_back(s); - } - bool pptx_conversion_context::start_page(const std::wstring& pageName, const std::wstring& pageStyleName, - const std::wstring& pageLayoutName, - const std::wstring& pageMasterName) - { - create_new_slide(pageName); - get_slide_context().start_slide();//pageName, pageStyleName); - get_slide_context().get_animation_context().clear(); - - current_master_page_name_ = pageMasterName; - current_layout_page_name_ = pageLayoutName; - - //const std::wstring masterPageNameLayout = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(current_master_page_name_); - - std::pair layout_id = - root()->odf_context().styleContainer().presentation_layouts().add_or_find(pageLayoutName, pageMasterName); - - current_slide().Rels().add(relationship(layout_id.second, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout", - std::wstring(L"../slideLayouts/slideLayout") + std::to_wstring(layout_id.first) + L".xml")); - - return true; - } - - bool pptx_conversion_context::start_layout(int layout_index) - { - if (layout_index >= 0) - { - odf_reader::presentation_layouts_instance& layouts = root()->odf_context().styleContainer().presentation_layouts(); - - create_new_slideLayout(layouts.content[layout_index].Id); - - get_slide_context().start_slide();//layouts.content[layout_index].layout_name, L"");//????? - - current_master_page_name_ = layouts.content[layout_index].master_name; - current_layout_page_name_ = L""; - - std::pair master_id = //std::pair(1, L"smId1"); - root()->odf_context().styleContainer().presentation_masters().add_or_find(layouts.content[layout_index].master_name); - - root()->odf_context().styleContainer().presentation_masters().add_layout_to(layouts.content[layout_index].master_name, layouts.content[layout_index]); - - current_layout().Rels().add(relationship(L"smId1"/*master_id.second*/, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster", - std::wstring(L"../slideMasters/slideMaster") + std::to_wstring(master_id.first) + L".xml")); - - // - } - else//общий шаблон (насильно пропишем к темам несоответствующие шалоны) - { - } - - //layout type - - // - //1375 - //1376 - //1377 - //1378 - //1379 - //1380 - //1381 - //1382 - //1383 - //1384 - //1385 - //1386 - //1387 - //1388 - //1389 - //1390 - //1391 - //1392 - //1393 - //1394 - //1395 - //1396 - //1397 - //1398 - //1399 - //1400 - //1401 - //1402 - //1403 - //1404 - //1405 ---------------------------------- !!!!!!!!!!!!! - //1406 - //1407 - //1408 - //1409 - - return true; - } - bool pptx_conversion_context::start_master(int master_index) - { - odf_reader::presentation_masters_instance& masters = root()->odf_context().styleContainer().presentation_masters(); - - create_new_slideMaster(masters.content[master_index].Id); - - get_slide_context().start_slide(); - - current_master_page_name_ = L""; - current_layout_page_name_ = L""; - - process_theme(masters.content[master_index].master_name);//add default theme - одинаковые но под разными именами - current_master().add_theme(current_theme().id(), L"tId1"); - - for (size_t i = 0; i < masters.content[master_index].layouts.size(); i++) - { - current_master().add_layout(masters.content[master_index].layouts[i].Id, masters.content[master_index].layouts[i].rId, 0x80000000 + last_uniq_big_id++); - } - - //---------------------------------------------------------------------------------- - //размеры страниц в презентации - const std::wstring pageProperties = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(masters.content[master_index].master_name); - - odf_reader::page_layout_instance* pages_layouts = root()->odf_context().pageLayoutContainer().page_layout_by_name(pageProperties); - - if (pages_layouts) - pages_layouts->pptx_serialize(current_master().Sizes(), *this); - - return true; - } - void pptx_conversion_context::end_page() - { - if (!get_comments_context().empty()) - { - std::wstringstream strm; - get_comments_context().serialize(strm); - - const std::pair commentsName = - comments_context_handle_.add_comments_xml(strm.str(), get_comments_context().get_comments()); - - get_slide_context().add_rels(false, commentsName.second, L"../comments/" + commentsName.first, typeComment); - } - - get_slide_context().serialize_background(current_slide().Background()); - get_slide_context().serialize_objects(current_slide().Data()); - get_slide_context().serialize_animations(current_slide().Timing()); - - { - // NOTE: При использовании operator<< потока буст пушит туда лишний пробел перед значением. - // С этим пробелом наш редактор onlyoffice на распознает значение. - // Example: - // ppt_y - // ppt_y - // TODO: Figure out how to push value without redundant space character - current_slide().remove_timing_redundant_space(); - } - - get_slide_context().dump_rels(current_slide().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - } - bool pptx_conversion_context::start_page_notes() - { - create_new_slideNotes(); - - current_slide().Rels().add(relationship(notes_.back()->rId(), L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide", - L"../notesSlides/notesSlide" + std::to_wstring(notes_.size()) + L".xml")); - - get_slide_context().start_slide(); - - current_notes().Rels().add(relationship(L"nId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide", - L"../slides/slide" + std::to_wstring(slides_.size()) + L".xml")); - - return true; - } - - void pptx_conversion_context::end_page_notes() - { - get_slide_context().serialize_background(current_notes().Background()); - get_slide_context().serialize_objects(current_notes().Data()); - - get_slide_context().dump_rels(current_notes().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - } - bool pptx_conversion_context::start_master_notes() - { - create_new_slideNotesMaster(); - - get_slide_context().start_slide(); - - process_theme(L"");//add default theme - одинаковые но под разными именами - current_notesMaster().add_theme(current_theme().id(), L"tId1"); - - get_slide_context().start_slide(); - return true; - } - - void pptx_conversion_context::end_master_notes() - { - get_slide_context().serialize_background(current_notesMaster().Background()); - get_slide_context().serialize_objects(current_notesMaster().Data()); - - get_slide_context().dump_rels(current_notesMaster().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - - for (size_t i = 0; i < notes_.size(); i++) - { - notes_[i]->Rels().add(relationship(L"nmId1", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster", - L"../notesMasters/notesMaster1.xml")); - } - } - void pptx_conversion_context::end_layout() - { - get_slide_context().serialize_objects(current_layout().Data()); - - get_slide_context().dump_rels(current_layout().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - } - - std::pair pptx_conversion_context::add_author_comments(std::wstring author) - { - if (!authors_comments_) - { - authors_comments_ = pptx_xml_authors_comments::create(); - if (!authors_comments_)return std::pair(-1, -1); - } - - return authors_comments_->add_or_find(author); - } - - void pptx_conversion_context::end_master() - { - get_slide_context().serialize_background(current_master().Background(), true); - get_slide_context().serialize_objects(current_master().Data()); - get_slide_context().serialize_HeaderFooter(current_master().DataExtra()); - - get_slide_context().dump_rels(current_master().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - } - void pptx_conversion_context::start_theme(std::wstring& name) - { - themes_.push_back(pptx_xml_theme::create(name, themes_.size() + 1)); - } - void pptx_conversion_context::end_theme() - { - } - void pptx_conversion_context::start_office_presentation() - { - } - - void pptx_conversion_context::end_office_presentation() - { - } - void pptx_conversion_context::start_chart(std::wstring name) - { - charts_.push_back(oox_chart_context_ptr(new oox_chart_context(get_mediaitems(), name))); - //добавляем новую форму для диаграммы - //в ней будет информационная часть - и она пишется каждый раз в свою xml (их - по числу диаграмм) - //этот контекст нужно передавать в файл + output_document_->get_ppt_files().add_theme(themes_[i]); } - void pptx_conversion_context::end_chart() - { - //current_chart().set_drawing_link(current_sheet().get_drawing_link()); - //излишняя инфа - } - void pptx_conversion_context::add_jsaProject(const std::string& content) - { - if (content.empty()) return; + package::ppt_comments_files_ptr comments = package::ppt_comments_files::create(comments_context_handle_.content()); - output_document_->get_ppt_files().add_jsaProject(content); - output_document_->get_content_types_file().add_or_find_default(L"bin"); + output_document_->get_ppt_files().set_presentation(presentation_); + output_document_->get_ppt_files().set_comments(comments); + output_document_->get_ppt_files().set_authors_comments(authors_comments_); + output_document_->get_ppt_files().set_media(get_mediaitems()); + + output_document_->get_content_types_file().set_media(get_mediaitems()); + } + + void pptx_conversion_context::start_body() + { + + } + + void pptx_conversion_context::end_body() + { + } + pptx_xml_slideNotesMaster& pptx_conversion_context::current_notesMaster() + { + if (slideNotesMaster_) + { + return *slideNotesMaster_; + } + else + { + throw std::runtime_error("internal error"); } } + pptx_xml_slideNotes& pptx_conversion_context::current_notes() + { + if (!notes_.empty()) + { + return *notes_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_slide& pptx_conversion_context::current_slide() + { + if (!slides_.empty()) + { + return *slides_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_slideLayout& pptx_conversion_context::current_layout() + { + if (!slideLayouts_.empty()) + { + return *slideLayouts_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_theme& pptx_conversion_context::current_theme() + { + if (!themes_.empty()) + { + return *themes_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_presentation& pptx_conversion_context::current_presentation() + { + return presentation_; + } + + oox_chart_context& pptx_conversion_context::current_chart() + { + if (!charts_.empty()) + { + return *charts_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_slideMaster& pptx_conversion_context::current_master() + { + if (!slideMasters_.empty()) + { + return *slideMasters_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + void pptx_conversion_context::create_new_slide(std::wstring const& name) + { + pptx_xml_slide_ptr s = pptx_xml_slide::create(name, slides_.size() + 1); + slides_.push_back(s); + } + void pptx_conversion_context::create_new_slideNotes() + { + pptx_xml_slideNotes_ptr s = pptx_xml_slideNotes::create(notes_.size() + 1); + notes_.push_back(s); + } + void pptx_conversion_context::create_new_slideNotesMaster() + { + slideNotesMaster_ = pptx_xml_slideNotesMaster::create(); + } + void pptx_conversion_context::create_new_slideLayout(int id) + { + pptx_xml_slideLayout_ptr s = pptx_xml_slideLayout::create(id); + slideLayouts_.push_back(s); + } + void pptx_conversion_context::create_new_slideMaster(int id) + { + pptx_xml_slideMaster_ptr s = pptx_xml_slideMaster::create(id); + slideMasters_.push_back(s); + } + bool pptx_conversion_context::start_page(const std::wstring& pageName, const std::wstring& pageStyleName, + const std::wstring& pageLayoutName, + const std::wstring& pageMasterName) + { + create_new_slide(pageName); + get_slide_context().start_slide();//pageName, pageStyleName); + get_slide_context().get_animation_context().clear(); + + current_master_page_name_ = pageMasterName; + current_layout_page_name_ = pageLayoutName; + + //const std::wstring masterPageNameLayout = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(current_master_page_name_); + + std::pair layout_id = + root()->odf_context().styleContainer().presentation_layouts().add_or_find(pageLayoutName, pageMasterName); + + current_slide().Rels().add(relationship(layout_id.second, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout", + std::wstring(L"../slideLayouts/slideLayout") + std::to_wstring(layout_id.first) + L".xml")); + + return true; + } + + bool pptx_conversion_context::start_layout(int layout_index) + { + if (layout_index >= 0) + { + odf_reader::presentation_layouts_instance& layouts = root()->odf_context().styleContainer().presentation_layouts(); + + create_new_slideLayout(layouts.content[layout_index].Id); + + get_slide_context().start_slide();//layouts.content[layout_index].layout_name, L"");//????? + + current_master_page_name_ = layouts.content[layout_index].master_name; + current_layout_page_name_ = L""; + + std::pair master_id = //std::pair(1, L"smId1"); + root()->odf_context().styleContainer().presentation_masters().add_or_find(layouts.content[layout_index].master_name); + + root()->odf_context().styleContainer().presentation_masters().add_layout_to(layouts.content[layout_index].master_name, layouts.content[layout_index]); + + current_layout().Rels().add(relationship(L"smId1"/*master_id.second*/, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster", + std::wstring(L"../slideMasters/slideMaster") + std::to_wstring(master_id.first) + L".xml")); + + // + } + else//общий шаблон (насильно пропишем к темам несоответствующие шалоны) + { + } + + //layout type + + // + //1375 + //1376 + //1377 + //1378 + //1379 + //1380 + //1381 + //1382 + //1383 + //1384 + //1385 + //1386 + //1387 + //1388 + //1389 + //1390 + //1391 + //1392 + //1393 + //1394 + //1395 + //1396 + //1397 + //1398 + //1399 + //1400 + //1401 + //1402 + //1403 + //1404 + //1405 ---------------------------------- !!!!!!!!!!!!! + //1406 + //1407 + //1408 + //1409 + + return true; + } + bool pptx_conversion_context::start_master(int master_index) + { + odf_reader::presentation_masters_instance& masters = root()->odf_context().styleContainer().presentation_masters(); + + create_new_slideMaster(masters.content[master_index].Id); + + get_slide_context().start_slide(); + + current_master_page_name_ = L""; + current_layout_page_name_ = L""; + + process_theme(masters.content[master_index].master_name);//add default theme - одинаковые но под разными именами + current_master().add_theme(current_theme().id(), L"tId1"); + + for (size_t i = 0; i < masters.content[master_index].layouts.size(); i++) + { + current_master().add_layout(masters.content[master_index].layouts[i].Id, masters.content[master_index].layouts[i].rId, 0x80000000 + last_uniq_big_id++); + } + + //---------------------------------------------------------------------------------- + //размеры страниц в презентации + const std::wstring pageProperties = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(masters.content[master_index].master_name); + + odf_reader::page_layout_instance* pages_layouts = root()->odf_context().pageLayoutContainer().page_layout_by_name(pageProperties); + + if (pages_layouts) + pages_layouts->pptx_serialize(current_master().Sizes(), *this); + + return true; + } + void pptx_conversion_context::end_page() + { + if (!get_comments_context().empty()) + { + std::wstringstream strm; + get_comments_context().serialize(strm); + + const std::pair commentsName = + comments_context_handle_.add_comments_xml(strm.str(), get_comments_context().get_comments()); + + get_slide_context().add_rels(false, commentsName.second, L"../comments/" + commentsName.first, typeComment); + } + + get_slide_context().serialize_background(current_slide().Background()); + get_slide_context().serialize_objects(current_slide().Data()); + get_slide_context().serialize_animations(current_slide().Timing()); + + { + // NOTE: При использовании operator<< потока буст пушит туда лишний пробел перед значением. + // С этим пробелом наш редактор onlyoffice на распознает значение. + // Example: + // ppt_y + // ppt_y + // TODO: Figure out how to push value without redundant space character + current_slide().remove_timing_redundant_space(); + } + + get_slide_context().dump_rels(current_slide().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + } + bool pptx_conversion_context::start_page_notes() + { + create_new_slideNotes(); + + current_slide().Rels().add(relationship(notes_.back()->rId(), L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide", + L"../notesSlides/notesSlide" + std::to_wstring(notes_.size()) + L".xml")); + + get_slide_context().start_slide(); + + current_notes().Rels().add(relationship(L"nId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide", + L"../slides/slide" + std::to_wstring(slides_.size()) + L".xml")); + + return true; + } + + void pptx_conversion_context::end_page_notes() + { + get_slide_context().serialize_background(current_notes().Background()); + get_slide_context().serialize_objects(current_notes().Data()); + + get_slide_context().dump_rels(current_notes().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + } + bool pptx_conversion_context::start_master_notes() + { + create_new_slideNotesMaster(); + + get_slide_context().start_slide(); + + process_theme(L"");//add default theme - одинаковые но под разными именами + current_notesMaster().add_theme(current_theme().id(), L"tId1"); + + get_slide_context().start_slide(); + return true; + } + + void pptx_conversion_context::end_master_notes() + { + get_slide_context().serialize_background(current_notesMaster().Background()); + get_slide_context().serialize_objects(current_notesMaster().Data()); + + get_slide_context().dump_rels(current_notesMaster().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + + for (size_t i = 0; i < notes_.size(); i++) + { + notes_[i]->Rels().add(relationship(L"nmId1", + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster", + L"../notesMasters/notesMaster1.xml")); + } + } + void pptx_conversion_context::end_layout() + { + get_slide_context().process_drawings(); + + get_slide_context().serialize_objects(current_layout().Data()); + + get_slide_context().dump_rels(current_layout().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + } + + std::pair pptx_conversion_context::add_author_comments(std::wstring author) + { + if (!authors_comments_) + { + authors_comments_ = pptx_xml_authors_comments::create(); + if (!authors_comments_)return std::pair(-1, -1); + } + + return authors_comments_->add_or_find(author); + } + + void pptx_conversion_context::end_master() + { + get_slide_context().process_drawings(); + + get_slide_context().serialize_background(current_master().Background(), true); + get_slide_context().serialize_objects(current_master().Data()); + get_slide_context().serialize_HeaderFooter(current_master().DataExtra()); + + get_slide_context().dump_rels(current_master().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + } + void pptx_conversion_context::start_theme(std::wstring& name) + { + themes_.push_back(pptx_xml_theme::create(name, themes_.size() + 1)); + } + void pptx_conversion_context::end_theme() + { + } + void pptx_conversion_context::start_office_presentation() + { + } + + void pptx_conversion_context::end_office_presentation() + { + } + void pptx_conversion_context::start_chart(std::wstring name) + { + charts_.push_back(oox_chart_context_ptr(new oox_chart_context(get_mediaitems(), name))); + //добавляем новую форму для диаграммы + //в ней будет информационная часть - и она пишется каждый раз в свою xml (их - по числу диаграмм) + //этот контекст нужно передавать в файл + + } + void pptx_conversion_context::end_chart() + { + //current_chart().set_drawing_link(current_sheet().get_drawing_link()); + //излишняя инфа + } + void pptx_conversion_context::add_jsaProject(const std::string& content) + { + if (content.empty()) return; + + output_document_->get_ppt_files().add_jsaProject(content); + output_document_->get_content_types_file().add_or_find_default(L"bin"); + } + } } From 69a71d78ed98d29e76005da9b5c11782dd34fb2f Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Tue, 12 Mar 2024 01:33:24 +0300 Subject: [PATCH 053/117] [x2t] For bug 66819 --- X2tConverter/src/ASCConverters.cpp | 8 +++----- X2tConverter/src/lib/csv.h | 3 +++ X2tConverter/src/lib/html.h | 20 +++++++++++++++++--- X2tConverter/src/lib/xlsx.h | 14 +++++++++++++- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 3e1e861c08..613b2605ef 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -536,7 +536,6 @@ namespace NExtractTools } else { - std::wstring sDocxFile; std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sDocxDir); @@ -544,14 +543,13 @@ namespace NExtractTools AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM == nFormatFrom || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF == nFormatFrom) { - sDocxFile = sFrom; - convertParams.m_sTempParamOOXMLFile = sDocxFile; + convertParams.m_sTempParamOOXMLFile = sFrom; if (params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sDocxFile, params, convertParams); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, convertParams.m_sTempParamOOXMLFile, params, convertParams); } - nRes = zip2dir(sDocxFile, sDocxDir); + nRes = zip2dir(convertParams.m_sTempParamOOXMLFile, sDocxDir); if (false == SUCCEEDED_X2T(nRes)) { diff --git a/X2tConverter/src/lib/csv.h b/X2tConverter/src/lib/csv.h index cd01472e47..0ce635462e 100644 --- a/X2tConverter/src/lib/csv.h +++ b/X2tConverter/src/lib/csv.h @@ -136,6 +136,9 @@ namespace NExtractTools nRes = oCXlsxSerializer.loadFromFile(sTargetBin, sTo, sXmlOptions, sMediaPath, sEmbedPath); } + // удаляем EditorWithChanges, потому что он не в Temp + if (sFrom != sTargetBin) + NSFile::CFileBinary::Remove(sTargetBin); return nRes; } diff --git a/X2tConverter/src/lib/html.h b/X2tConverter/src/lib/html.h index 1b0129f594..2a9b8d7aa7 100644 --- a/X2tConverter/src/lib/html.h +++ b/X2tConverter/src/lib/html.h @@ -152,7 +152,17 @@ namespace NExtractTools // doct_bin => html _UINT32 doct_bin2html_internal(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sFileFromDir = NSDirectory::GetFolderPath(sFrom); + _UINT32 nRes = 0; + std::wstring sTargetBin; + if (params.getFromChanges()) + { + params.setFromChanges(false); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sTargetBin, params, convertParams); + } + else + sTargetBin = sFrom; + + std::wstring sFileFromDir = NSDirectory::GetFolderPath(sTargetBin); std::wstring sImagesDirectory = combinePath(sFileFromDir, L"media"); std::wstring sHtmlFile = combinePath(convertParams.m_sTempDir, L"index.html"); if (!NSDirectory::Exists(sImagesDirectory)) @@ -161,17 +171,21 @@ namespace NExtractTools NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); std::wstring sXml = getDoctXml(NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, NSDoctRenderer::DoctRendererFormat::FormatFile::HTML, - sFrom, sHtmlFile, sImagesDirectory, convertParams.m_sThemesDir, -1, L"", params); + sTargetBin, sHtmlFile, sImagesDirectory, convertParams.m_sThemesDir, -1, L"", params); std::wstring sResult; oDoctRenderer.Execute(sXml, sResult); + + // удаляем EditorWithChanges, потому что он не в Temp + if (sFrom != sTargetBin) + NSFile::CFileBinary::Remove(sTargetBin); if (sResult.find(L"error") != std::wstring::npos) { std::wcerr << L"DoctRenderer:" << sResult << std::endl; return AVS_FILEUTILS_ERROR_CONVERT; } - return 0; + return nRes; } // doct_bin -> epub diff --git a/X2tConverter/src/lib/xlsx.h b/X2tConverter/src/lib/xlsx.h index fdd8a159e7..42d3876244 100644 --- a/X2tConverter/src/lib/xlsx.h +++ b/X2tConverter/src/lib/xlsx.h @@ -177,16 +177,28 @@ namespace NExtractTools _UINT32 nRes = 0; + std::wstring sTargetBin; + if (params.getFromChanges()) + { + params.setFromChanges(false); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::XLST, sTargetBin, params, convertParams); + } + else + sTargetBin = sFrom; + std::wstring sTempUnpackedXLSB = convertParams.m_sTempResultOOXMLDirectory; convertParams.m_sTempResultOOXMLDirectory = sTempUnpackedXLSX; - nRes = xlst_bin2xlsx_dir(sFrom, sTempUnpackedXLSX, params, convertParams); + nRes = xlst_bin2xlsx_dir(sTargetBin, sTempUnpackedXLSX, params, convertParams); if (SUCCEEDED_X2T(nRes)) { convertParams.m_sTempResultOOXMLDirectory = sTempUnpackedXLSB; nRes = xlsx_dir2xlsb_dir(sTempUnpackedXLSX, sTempUnpackedXLSB, params, convertParams); } + // удаляем EditorWithChanges, потому что он не в Temp + if (sFrom != sTargetBin) + NSFile::CFileBinary::Remove(sTargetBin); return nRes; } _UINT32 xlst_bin2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) From 29a41195461c3aad0e7ede8b25394f4755a23e9e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 12 Mar 2024 15:04:00 +0600 Subject: [PATCH 054/117] Fix inline string conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 5a2e0d941b..76225939f1 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -2141,6 +2141,26 @@ namespace OOX pSource = str; } } + else if(m_oRichText.IsInit()) + { + if(m_oFormula.IsInit()) + { + auto str(new XLSB::FmlaString); + if(m_oValue.IsInit()) + str->value = m_oRichText->ToString(); + oCell = &str->cell; + + pSource = str; + + } + else + { + auto str(new XLSB::CellSt); + str->value = m_oRichText->ToString(); + oCell = &str->cell; + pSource = str; + } + } else { auto pCellblank = new(XLSB::CellBlank); From 4a22b26ac1eefde697a6fea2ba247a5c5d9cd315 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 12 Mar 2024 20:24:02 +0600 Subject: [PATCH 055/117] Fix connection conversion --- .../Biff12_records/BeginExtConnection.cpp | 1 + OOXML/XlsxFormat/Table/Connections.cpp | 47 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsbFormat/Biff12_records/BeginExtConnection.cpp b/OOXML/XlsbFormat/Biff12_records/BeginExtConnection.cpp index d3382ca305..02040d7c56 100644 --- a/OOXML/XlsbFormat/Biff12_records/BeginExtConnection.cpp +++ b/OOXML/XlsbFormat/Biff12_records/BeginExtConnection.cpp @@ -107,6 +107,7 @@ namespace XLSB SETBIT(flags, 16, fLoadSourceDataFile) SETBIT(flags, 17, fLoadSourceConnectionFile) SETBIT(flags, 18, fLoadConnectionDesc) + SETBIT(flags, 19, 1) SETBIT(flags, 20, fLoadSSOApplicationID) record << wInterval << flags; diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index f1211d7066..9230e71979 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -604,28 +604,52 @@ namespace OOX if(m_oUrl.IsInit()) ptr->stURL = m_oUrl.get(); + else + ptr->fLoadURL = false; if(m_oPost.IsInit()) ptr->stWebPost = m_oPost.get(); + else + ptr->fLoadWebPost = false; if(m_oEditPage.IsInit()) ptr->stEditWebPage = m_oEditPage.get(); + else + ptr->fLoadEditWebPage = false; if(m_oXml.IsInit()) ptr->fSrcIsXML = m_oXml.get(); + else + ptr->fSrcIsXML = false; if(m_oSourceData.IsInit()) ptr->fImportSourceData = m_oSourceData.get(); + else + ptr->fImportSourceData = false; if(m_oConsecutive.IsInit()) ptr->fConsecDelim = m_oConsecutive.get(); + else + ptr->fConsecDelim = false; if(m_oFirstRow.IsInit()) ptr->fSameSettings = m_oFirstRow.get(); + else + ptr->fSameSettings = false; if(m_oXl97.IsInit()) ptr->fXL97Format = m_oXl97.get(); + else + ptr->fXL97Format = false; if(m_oTextDates.IsInit()) ptr->fNoDateRecog = m_oTextDates.get(); + else + ptr->fNoDateRecog = false; if(m_oXl2000.IsInit()) ptr->fRefreshedInXL9 = m_oXl2000.get(); + else + ptr->fRefreshedInXL9 = false; if(m_oHtmlTables.IsInit()) ptr->fTablesOnlyHTML = m_oHtmlTables.get(); + else + ptr->fRefreshedInXL9 = false; if(m_oHtmlFormat.IsInit()) ptr->wHTMLFmt = m_oHtmlFormat->GetValue(); + else + ptr->wHTMLFmt = false; return XLS::BaseObjectPtr{ptr1}; } EElementType CWebPr::getType() const @@ -1005,24 +1029,38 @@ namespace OOX ptr1->dwConnID = m_oId->GetValue(); if(m_oCredentials.IsInit()) ptr1->iCredMethod = m_oCredentials->GetValue(); + else + ptr1->iCredMethod = 0; if(m_oBackground.IsInit()) ptr1->fBackgroundQuery = m_oBackground.get(); else ptr1->fBackgroundQuery = false; if(m_oDeleted.IsInit()) ptr1->fDeleted = m_oDeleted.get(); + else + ptr1->fDeleted = false; if(m_oDescription.IsInit()) ptr1->stConnDesc = m_oDescription.get(); else ptr1->fLoadConnectionDesc = false; if(m_oInterval.IsInit()) ptr1->wInterval = m_oInterval.get(); + else + ptr1->wInterval = 0; if(m_oKeepAlive.IsInit()) ptr1->fMaintain = m_oKeepAlive.get(); + else + ptr1->fMaintain = false; if(m_oMinRefreshableVersion.IsInit()) ptr1->bVerRefreshableMin = m_oMinRefreshableVersion.get(); + else if(m_oRefreshedVersion.IsInit()) + ptr1->bVerRefreshableMin = m_oRefreshedVersion.get(); + else + ptr1->bVerRefreshableMin = 0; if(m_oNew.IsInit()) ptr1->fNewQuery = m_oNew.get(); + else + ptr1->fNewQuery = false; if(m_oOdcFile.IsInit()) ptr1->stConnectionFile = m_oOdcFile.get(); else @@ -1033,16 +1071,20 @@ namespace OOX ptr1->fAlwaysUseConnectionFile = false; if(m_oReconnectionMethod.IsInit()) ptr1->irecontype = m_oReconnectionMethod.get(); + else + ptr1->irecontype = 1; if(m_oRefreshedVersion.IsInit()) ptr1->bVerRefreshed = m_oRefreshedVersion.get(); if(m_oRefreshOnLoad.IsInit()) ptr1->fRefreshOnLoad = m_oRefreshOnLoad.get(); + else + ptr1->fRefreshOnLoad = false; if(m_oSaveData.IsInit()) ptr1->fSaveData = m_oSaveData.get(); if(m_oSavePassword.IsInit()) - { ptr1->pc = m_oSavePassword.get(); - } + else + ptr1->pc = 0; if(m_oSingleSignOnId.IsInit()) ptr1->stSso = m_oSingleSignOnId.get(); else @@ -1293,6 +1335,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr object = WriteBin(); xlsb->WriteBin(oPath, object.get()); } + else { NSStringUtils::CStringBuilder sXml; From 65112e860e19d6c7051d5695cdb3ed07ab9ffe06 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 12 Mar 2024 21:46:19 +0600 Subject: [PATCH 056/117] Fix query table conversion --- OOXML/XlsxFormat/Table/Tables.cpp | 53 +++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 4d28e8cbfa..d1ed94f2de 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -1142,18 +1142,28 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oId.IsInit()) ptr->idField = m_oId->GetValue(); + else + ptr->idField = 0; if(m_oTableColumnId.IsInit()) ptr->idList = m_oTableColumnId->GetValue(); + else + ptr->idList = 0; if(m_oName.IsInit()) ptr->name = m_oName.get(); if(m_oRowNumbers.IsInit()) ptr->fRowNums = m_oRowNumbers.get(); if(m_oFillFormulas.IsInit()) ptr->fFillDown = m_oFillFormulas.get(); + else + ptr->fFillDown = false; if(m_oDataBound.IsInit()) ptr->fUserIns = m_oDataBound.get(); + else + ptr->fUserIns = false; if(m_oClipped.IsInit()) ptr->fClipped = m_oClipped.get(); + else + ptr->fClipped = false; return XLS::BaseObjectPtr{ptr1}; } @@ -1437,6 +1447,8 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") ptr->wVerBeforeRefreshAlert = m_oMinimumVersion->GetValue(); if(m_FieldIdWrapped.IsInit()) ptr->fidWrapped = m_FieldIdWrapped.get(); + else + ptr->fidWrapped = false; if(m_HeadersInLastRefresh.IsInit()) ptr->fTitlesOld = m_HeadersInLastRefresh.get(); if(m_PreserveSortFilterLayout.IsInit()) @@ -1573,33 +1585,61 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oAdjustColumnWidth.IsInit()) ptr->fAutoFit = m_oAdjustColumnWidth.get(); + else + ptr->fAutoFit = true; if(m_oApplyAlignmentFormats.IsInit()) ptr->fibitAtrAlc = m_oApplyAlignmentFormats.get(); + else + ptr->fibitAtrAlc = false; if(m_oApplyBorderFormats.IsInit()) ptr->fibitAtrBdr = m_oApplyBorderFormats.get(); + else + ptr->fibitAtrBdr = false; if(m_oApplyFontFormats.IsInit()) ptr->fibitAtrFnt = m_oApplyFontFormats.get(); + else + ptr->fibitAtrFnt = false; if(m_oApplyNumberFormats.IsInit()) ptr->fibitAtrNum = m_oApplyNumberFormats.get(); + else + ptr->fibitAtrNum = false; if(m_oApplyPatternFormats.IsInit()) ptr->fibitAtrPat = m_oApplyPatternFormats.get(); + else + ptr->fibitAtrPat = false; if(m_oApplyWidthHeightFormats.IsInit()) ptr->fibitAtrProt = m_oApplyWidthHeightFormats.get(); + else + ptr->fibitAtrProt = false; if(m_oBackgroundRefresh.IsInit()) ptr->fAsync = m_oBackgroundRefresh.get(); + else + ptr->fAsync = true; if(m_oAutoFormatId.IsInit()) ptr->itblAutoFmt = m_oAutoFormatId->GetValue(); + else + ptr->itblAutoFmt = 0; if(m_oConnectionId.IsInit()) ptr->dwConnID = m_oConnectionId->GetValue(); + else + ptr->dwConnID = 0; if(m_oDisableEdit.IsInit()) ptr->fDisableEdit = m_oDisableEdit.get(); + else + ptr->fDisableEdit = false; if(m_oDisableRefresh.IsInit()) ptr->fDisableRefresh = m_oDisableRefresh.get(); + else + ptr->fDisableRefresh = false; if(m_oFillFormulas.IsInit()) ptr->fFill = m_oFillFormulas.get(); + else + ptr->fFill = false; if(m_oFirstBackgroundRefresh.IsInit()) ptr->fNewAsync = m_oFirstBackgroundRefresh.get(); + else + ptr->fNewAsync = true; ptr->fOverwrite = false; ptr->fShrink = false; @@ -1611,17 +1651,25 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->fTitles = m_oHeaders.get(); if(m_oIntermediate.IsInit()) ptr->fDummyList = m_oIntermediate.get(); + else + ptr->fDummyList = 0; - if(!ptr->name.empty()) - m_oName = ptr->name; + if(m_oName.IsInit()) + ptr->name = m_oName.get(); if(m_oPreserveFormatting.IsInit()) ptr->fPreserveFmt = m_oPreserveFormatting.get(); if(m_oRefreshOnLoad.IsInit()) ptr->fAutoRefresh = m_oRefreshOnLoad.get(); + else + ptr->fAutoRefresh = false; if(m_oRemoveDataOnSave.IsInit()) ptr->fSaveData = !m_oRemoveDataOnSave.get(); + else + ptr->fSaveData = true; if(m_oRowNumbers.IsInit()) ptr->fRowNums = m_oRowNumbers.get(); + else + ptr->fRowNums = false; if(m_oQueryTableRefresh.IsInit()) ptr1->m_QSIR = m_oQueryTableRefresh->toBin(); @@ -1771,6 +1819,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr object = WriteBin(); xlsb->WriteBin(oPath, object.get()); } + else { NSStringUtils::CStringBuilder sXml; From 48c1478374a2fd5ee23473777b9a3cf7a457f297 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 12 Mar 2024 19:58:47 +0300 Subject: [PATCH 057/117] fix bug #66840 --- .../Converter/xlsx_conditionalFormatting.cpp | 522 +++++++++++++----- .../Converter/xlsx_conditionalFormatting.h | 5 +- OdfFile/Reader/Converter/xlsx_output_xml.cpp | 21 +- OdfFile/Reader/Converter/xlsx_output_xml.h | 1 + OdfFile/Reader/Converter/xlsx_table_state.cpp | 6 +- OdfFile/Reader/Converter/xlsx_table_state.h | 3 +- .../Reader/Converter/xlsx_tablecontext.cpp | 8 +- OdfFile/Reader/Converter/xlsx_tablecontext.h | 3 +- .../Converter/xlsxconversioncontext.cpp | 3 +- OdfFile/Reader/Format/calcext_elements.cpp | 4 + OdfFile/Reader/Format/calcext_elements.h | 13 +- OdfFile/Writer/Converter/XlsxConverter.cpp | 87 ++- OdfFile/Writer/Converter/XlsxConverter.h | 6 +- OdfFile/Writer/Format/calcext_elements.cpp | 11 +- OdfFile/Writer/Format/calcext_elements.h | 11 +- OdfFile/Writer/Format/ods_table_state.cpp | 34 +- OdfFile/Writer/Format/ods_table_state.h | 3 + 17 files changed, 548 insertions(+), 193 deletions(-) diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp index 7ab8a319b8..197b67eef3 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp @@ -74,6 +74,34 @@ namespace oox { } } } + void serializeEx(std::wostream& _Wostream) + { + CP_XML_WRITER(_Wostream) + { + CP_XML_NODE(L"x14:cfvo") + { + switch (type) + { + case 0: CP_XML_ATTR(L"type", L"percent"); break; + case 1: CP_XML_ATTR(L"type", L"num"); break; + case 2: CP_XML_ATTR(L"type", L"max"); break; + case 3: CP_XML_ATTR(L"type", L"min"); break; + case 4: CP_XML_ATTR(L"type", L"autoMax"); break; + case 5: CP_XML_ATTR(L"type", L"autoMin"); break; + case 6: CP_XML_ATTR(L"type", L"formula"); break; + case 7: CP_XML_ATTR(L"type", L"percentile"); break;//BOA PARA ESTUDAR - JOGAR LOTOFACIL minha predileta 1.ods + + } + if (val) + { + CP_XML_NODE(L"xm:f") + { + CP_XML_CONTENT(*val); + } + } + } + } + } }; struct rule @@ -100,11 +128,12 @@ namespace oox { //data bar icon_set _CP_OPT(bool) showValue; //data bar - _CP_OPT(int) minLength; - _CP_OPT(int) maxLength; + _CP_OPT(unsigned int) minLength; + _CP_OPT(unsigned int) maxLength; _CP_OPT(std::wstring) axis_position; _CP_OPT(std::wstring) axis_color; _CP_OPT(std::wstring) negative_color; + _CP_OPT(bool) gradient; //icon set _CP_OPT(int) icon_set_type; _CP_OPT(bool) reverse; @@ -112,9 +141,19 @@ namespace oox { _CP_OPT(int) iconset_type; //date is _CP_OPT(int) time_period; + + bool isExtended() + { + if (gradient || axis_color || axis_position || negative_color) + { + return true; + } + return false; + } }; struct conditionalFormatting { + bool bUsed = false; std::wstring ref; std::vector rules; }; @@ -125,161 +164,349 @@ public: void serialize(std::wostream & _Wostream) { - if (!conditionalFormattings_.empty()) - { - int priority = 1; - CP_XML_WRITER(_Wostream) - { - for (size_t i = 0 ; i < conditionalFormattings_.size(); i++) - { - conditionalFormatting & c = conditionalFormattings_[i]; - - if (c.rules.size() < 1) continue; - - CP_XML_NODE(L"conditionalFormatting") - { - CP_XML_ATTR(L"sqref", c.ref); + if (conditionalFormattings_.empty()) return; - for (size_t j = 0 ; j < c.rules.size(); j++) + int priority = 1; + CP_XML_WRITER(_Wostream) + { + for (size_t i = 0; i < conditionalFormattings_.size(); i++) + { + conditionalFormatting& c = conditionalFormattings_[i]; + + if (c.bUsed) continue; + if (c.rules.size() < 1) continue; + + CP_XML_NODE(L"conditionalFormatting") + { + CP_XML_ATTR(L"sqref", c.ref); + + for (size_t j = 0; j < c.rules.size(); j++) + { + if (c.rules[j].type < 1 || c.rules[j].type > 5) continue; + + CP_XML_NODE(L"cfRule") { - if (c.rules[j].type < 1 || c.rules[j].type > 5) continue; + CP_XML_ATTR(L"priority", priority++); - CP_XML_NODE(L"cfRule") - { - CP_XML_ATTR(L"priority", priority++); - - if (c.rules[j].dxfId) CP_XML_ATTR(L"dxfId", *c.rules[j].dxfId); - if (c.rules[j].percent) CP_XML_ATTR(L"percent", *c.rules[j].percent); - if (c.rules[j].operator_) CP_XML_ATTR(L"operator", *c.rules[j].operator_); - if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue); - if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text); - if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank); - if (c.rules[j].bottom) CP_XML_ATTR(L"bottom", *c.rules[j].bottom); - if (c.rules[j].above) CP_XML_ATTR(L"aboveAverage",*c.rules[j].above); - if (c.rules[j].equal) CP_XML_ATTR(L"equalAverage",*c.rules[j].equal); - if (c.rules[j].stdDev) CP_XML_ATTR(L"stdDev", *c.rules[j].stdDev); + if (c.rules[j].dxfId) CP_XML_ATTR(L"dxfId", *c.rules[j].dxfId); + if (c.rules[j].percent) CP_XML_ATTR(L"percent", *c.rules[j].percent); + if (c.rules[j].operator_) CP_XML_ATTR(L"operator", *c.rules[j].operator_); + if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue); + if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text); + if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank); + if (c.rules[j].bottom) CP_XML_ATTR(L"bottom", *c.rules[j].bottom); + if (c.rules[j].above) CP_XML_ATTR(L"aboveAverage", *c.rules[j].above); + if (c.rules[j].equal) CP_XML_ATTR(L"equalAverage", *c.rules[j].equal); + if (c.rules[j].stdDev) CP_XML_ATTR(L"stdDev", *c.rules[j].stdDev); - if (c.rules[j].type == 1) + if (c.rules[j].type == 1) + { + if (c.rules[j].formula_type) + CP_XML_ATTR(L"type", *c.rules[j].formula_type); + else + CP_XML_ATTR(L"type", L"cellIs"); + if ((c.rules[j].formula) && (!c.rules[j].formula->empty())) { - if (c.rules[j].formula_type) - CP_XML_ATTR(L"type", *c.rules[j].formula_type); - else - CP_XML_ATTR(L"type", L"cellIs"); - if ((c.rules[j].formula) && (!c.rules[j].formula->empty())) + CP_XML_NODE(L"formula") { - CP_XML_NODE(L"formula") - { - CP_XML_CONTENT(*c.rules[j].formula); - } - } - if ((c.rules[j].formula2) && (!c.rules[j].formula2->empty())) - { - CP_XML_NODE(L"formula") - { - CP_XML_CONTENT(*c.rules[j].formula2); - } + CP_XML_CONTENT(*c.rules[j].formula); } } - else if (c.rules[j].type == 2) + if ((c.rules[j].formula2) && (!c.rules[j].formula2->empty())) { - CP_XML_ATTR(L"type", L"dataBar"); - CP_XML_NODE(L"dataBar") + CP_XML_NODE(L"formula") { - if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); - if (c.rules[j].minLength) CP_XML_ATTR(L"minLength", *c.rules[j].minLength); - if (c.rules[j].maxLength) CP_XML_ATTR(L"maxLength", *c.rules[j].maxLength); - - for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) - { - c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); - } - - CP_XML_NODE(L"color") - { - CP_XML_ATTR(L"rgb", !c.rules[j].color.empty() ? c.rules[j].color[0] : L"FF000000"); - } - } - } - else if (c.rules[j].type == 3) - { - CP_XML_ATTR(L"type", L"colorScale"); - CP_XML_NODE(L"colorScale") - { - for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) - { - c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); - } - for (size_t k = 0; k < c.rules[j].color.size(); k++) - { - CP_XML_NODE(L"color") - { - CP_XML_ATTR(L"rgb", c.rules[j].color[k]); - } - } - } - } - else if (c.rules[j].type == 4) - { - CP_XML_ATTR(L"type", L"iconSet"); - CP_XML_NODE(L"iconSet") - { - if (c.rules[j].icon_set_type) - { - switch (*c.rules[j].icon_set_type) - { - case 1: CP_XML_ATTR(L"iconSet", L"3ArrowsGray"); break; - case 2: CP_XML_ATTR(L"iconSet", L"3Flags"); break; - case 3: CP_XML_ATTR(L"iconSet", L"3Signs"); break; - case 4: CP_XML_ATTR(L"iconSet", L"3Symbols"); break; - case 5: CP_XML_ATTR(L"iconSet", L"3Symbols2"); break; - case 6: CP_XML_ATTR(L"iconSet", L"3TrafficLights1"); break; - case 7: CP_XML_ATTR(L"iconSet", L"3TrafficLights2"); break; - case 8: CP_XML_ATTR(L"iconSet", L"4Arrows"); break; - case 9: CP_XML_ATTR(L"iconSet", L"4ArrowsGray"); break; - case 10: CP_XML_ATTR(L"iconSet", L"4Rating"); break; - case 11: CP_XML_ATTR(L"iconSet", L"4RedToBlack"); break; - case 12: CP_XML_ATTR(L"iconSet", L"4TrafficLights"); break; - case 13: CP_XML_ATTR(L"iconSet", L"5Arrows"); break; - case 14: CP_XML_ATTR(L"iconSet", L"5ArrowsGray"); break; - case 15: CP_XML_ATTR(L"iconSet", L"5Quarters"); break; - case 16: CP_XML_ATTR(L"iconSet", L"5Rating"); break; - case 0: - default: CP_XML_ATTR(L"iconSet", L"3Arrows"); break; - break; - } - } - if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); - - for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) - { - c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); - } - } - } - else if (c.rules[j].type == 5) - { - CP_XML_ATTR(L"type", L"timePeriod"); - switch (*c.rules[j].time_period) - { - case 0: CP_XML_ATTR(L"timePeriod", L"today"); break; - case 1: CP_XML_ATTR(L"timePeriod", L"yesterday"); break; - case 2: CP_XML_ATTR(L"timePeriod", L"tomorrow"); break; - case 3: CP_XML_ATTR(L"timePeriod", L"last7Days"); break; - case 4: CP_XML_ATTR(L"timePeriod", L"thisMonth"); break; - case 5: CP_XML_ATTR(L"timePeriod", L"lastMonth"); break; - case 6: CP_XML_ATTR(L"timePeriod", L"nextMonth"); break; - case 7: CP_XML_ATTR(L"timePeriod", L"thisWeek"); break; - case 8: CP_XML_ATTR(L"timePeriod", L"lastWeek"); break; - case 9: CP_XML_ATTR(L"timePeriod", L"nextWeek"); break; + CP_XML_CONTENT(*c.rules[j].formula2); } } } + else if (c.rules[j].type == 2) + { + CP_XML_ATTR(L"type", L"dataBar"); + CP_XML_NODE(L"dataBar") + { + if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); + if (c.rules[j].minLength) CP_XML_ATTR(L"minLength", *c.rules[j].minLength); + if (c.rules[j].maxLength) CP_XML_ATTR(L"maxLength", *c.rules[j].maxLength); + if (c.rules[j].gradient) CP_XML_ATTR(L"gradient", *c.rules[j].gradient); + + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + + CP_XML_NODE(L"color") + { + CP_XML_ATTR(L"rgb", !c.rules[j].color.empty() ? c.rules[j].color[0] : L"FF000000"); + } + } + } + else if (c.rules[j].type == 3) + { + CP_XML_ATTR(L"type", L"colorScale"); + CP_XML_NODE(L"colorScale") + { + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + for (size_t k = 0; k < c.rules[j].color.size(); k++) + { + CP_XML_NODE(L"color") + { + CP_XML_ATTR(L"rgb", c.rules[j].color[k]); + } + } + } + } + else if (c.rules[j].type == 4) + { + CP_XML_ATTR(L"type", L"iconSet"); + CP_XML_NODE(L"iconSet") + { + if (c.rules[j].icon_set_type) + { + switch (*c.rules[j].icon_set_type) + { + case 1: CP_XML_ATTR(L"iconSet", L"3ArrowsGray"); break; + case 2: CP_XML_ATTR(L"iconSet", L"3Flags"); break; + case 3: CP_XML_ATTR(L"iconSet", L"3Signs"); break; + case 4: CP_XML_ATTR(L"iconSet", L"3Symbols"); break; + case 5: CP_XML_ATTR(L"iconSet", L"3Symbols2"); break; + case 6: CP_XML_ATTR(L"iconSet", L"3TrafficLights1"); break; + case 7: CP_XML_ATTR(L"iconSet", L"3TrafficLights2"); break; + case 8: CP_XML_ATTR(L"iconSet", L"4Arrows"); break; + case 9: CP_XML_ATTR(L"iconSet", L"4ArrowsGray"); break; + case 10: CP_XML_ATTR(L"iconSet", L"4Rating"); break; + case 11: CP_XML_ATTR(L"iconSet", L"4RedToBlack"); break; + case 12: CP_XML_ATTR(L"iconSet", L"4TrafficLights"); break; + case 13: CP_XML_ATTR(L"iconSet", L"5Arrows"); break; + case 14: CP_XML_ATTR(L"iconSet", L"5ArrowsGray"); break; + case 15: CP_XML_ATTR(L"iconSet", L"5Quarters"); break; + case 16: CP_XML_ATTR(L"iconSet", L"5Rating"); break; + case 0: + default: CP_XML_ATTR(L"iconSet", L"3Arrows"); break; + break; + } + } + if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); + + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + } + } + else if (c.rules[j].type == 5) + { + CP_XML_ATTR(L"type", L"timePeriod"); + switch (*c.rules[j].time_period) + { + case 0: CP_XML_ATTR(L"timePeriod", L"today"); break; + case 1: CP_XML_ATTR(L"timePeriod", L"yesterday"); break; + case 2: CP_XML_ATTR(L"timePeriod", L"tomorrow"); break; + case 3: CP_XML_ATTR(L"timePeriod", L"last7Days"); break; + case 4: CP_XML_ATTR(L"timePeriod", L"thisMonth"); break; + case 5: CP_XML_ATTR(L"timePeriod", L"lastMonth"); break; + case 6: CP_XML_ATTR(L"timePeriod", L"nextMonth"); break; + case 7: CP_XML_ATTR(L"timePeriod", L"thisWeek"); break; + case 8: CP_XML_ATTR(L"timePeriod", L"lastWeek"); break; + case 9: CP_XML_ATTR(L"timePeriod", L"nextWeek"); break; + } + } } - } - } - } - } + } + } + } + } } + void serializeEx(std::wostream& _Wostream) + { + if (conditionalFormattings_.empty()) return; + + int priority = 1; + CP_XML_WRITER(_Wostream) + { + for (size_t i = 0; i < conditionalFormattings_.size(); i++) + { + conditionalFormatting& c = conditionalFormattings_[i]; + + if (c.bUsed) continue; + if (c.rules.size() < 1) continue; + + for (size_t j = 0; j < c.rules.size(); j++) + { + if (c.rules[j].isExtended()) + { + c.bUsed = true; + break; + } + } + if (!c.bUsed) continue; + + CP_XML_NODE(L"x14:conditionalFormatting") + { + CP_XML_ATTR(L"xmlns:xm", L"http://schemas.microsoft.com/office/excel/2006/main"); + + for (size_t j = 0; j < c.rules.size(); j++) + { + if (c.rules[j].type < 1 || c.rules[j].type > 5) continue; + + CP_XML_NODE(L"x14:cfRule") + { + CP_XML_ATTR(L"priority", priority++); + + if (c.rules[j].dxfId) CP_XML_ATTR(L"dxfId", *c.rules[j].dxfId); + if (c.rules[j].percent) CP_XML_ATTR(L"percent", *c.rules[j].percent); + if (c.rules[j].operator_) CP_XML_ATTR(L"operator", *c.rules[j].operator_); + if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue); + if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text); + if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank); + if (c.rules[j].bottom) CP_XML_ATTR(L"bottom", *c.rules[j].bottom); + if (c.rules[j].above) CP_XML_ATTR(L"aboveAverage", *c.rules[j].above); + if (c.rules[j].equal) CP_XML_ATTR(L"equalAverage", *c.rules[j].equal); + if (c.rules[j].stdDev) CP_XML_ATTR(L"stdDev", *c.rules[j].stdDev); + + if (c.rules[j].type == 1) + { + if (c.rules[j].formula_type) + CP_XML_ATTR(L"type", *c.rules[j].formula_type); + else + CP_XML_ATTR(L"type", L"cellIs"); + if ((c.rules[j].formula) && (!c.rules[j].formula->empty())) + { + CP_XML_NODE(L"formula") + { + CP_XML_CONTENT(*c.rules[j].formula); + } + } + if ((c.rules[j].formula2) && (!c.rules[j].formula2->empty())) + { + CP_XML_NODE(L"formula") + { + CP_XML_CONTENT(*c.rules[j].formula2); + } + } + } + else if (c.rules[j].type == 2) + { + CP_XML_ATTR(L"type", L"dataBar"); + CP_XML_NODE(L"x14:dataBar") + { + if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); + if (c.rules[j].minLength) CP_XML_ATTR(L"minLength", *c.rules[j].minLength); + if (c.rules[j].maxLength) CP_XML_ATTR(L"maxLength", *c.rules[j].maxLength); + if (c.rules[j].gradient) CP_XML_ATTR(L"gradient", *c.rules[j].gradient); + if (c.rules[j].axis_position) CP_XML_ATTR(L"axisPosition", *c.rules[j].axis_position); + + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serializeEx(CP_XML_STREAM()); + } + CP_XML_NODE(L"x14:fillColor") + { + CP_XML_ATTR(L"rgb", !c.rules[j].color.empty() ? c.rules[j].color[0] : L"FF000000"); + } + if (c.rules[j].negative_color) + { + CP_XML_NODE(L"x14:negativeFillColor") + { + CP_XML_ATTR(L"rgb", *c.rules[j].negative_color); + } + } + if (c.rules[j].axis_color) + { + CP_XML_NODE(L"x14:axisColor") + { + CP_XML_ATTR(L"rgb", *c.rules[j].axis_color); + } + } + } + } + else if (c.rules[j].type == 3) + { + CP_XML_ATTR(L"type", L"colorScale"); + CP_XML_NODE(L"x14:colorScale") + { + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + for (size_t k = 0; k < c.rules[j].color.size(); k++) + { + CP_XML_NODE(L"x14:color") + { + CP_XML_ATTR(L"rgb", c.rules[j].color[k]); + } + } + } + } + else if (c.rules[j].type == 4) + { + CP_XML_ATTR(L"type", L"iconSet"); + CP_XML_NODE(L"x14:iconSet") + { + if (c.rules[j].icon_set_type) + { + switch (*c.rules[j].icon_set_type) + { + case 1: CP_XML_ATTR(L"iconSet", L"3ArrowsGray"); break; + case 2: CP_XML_ATTR(L"iconSet", L"3Flags"); break; + case 3: CP_XML_ATTR(L"iconSet", L"3Signs"); break; + case 4: CP_XML_ATTR(L"iconSet", L"3Symbols"); break; + case 5: CP_XML_ATTR(L"iconSet", L"3Symbols2"); break; + case 6: CP_XML_ATTR(L"iconSet", L"3TrafficLights1"); break; + case 7: CP_XML_ATTR(L"iconSet", L"3TrafficLights2"); break; + case 8: CP_XML_ATTR(L"iconSet", L"4Arrows"); break; + case 9: CP_XML_ATTR(L"iconSet", L"4ArrowsGray"); break; + case 10: CP_XML_ATTR(L"iconSet", L"4Rating"); break; + case 11: CP_XML_ATTR(L"iconSet", L"4RedToBlack"); break; + case 12: CP_XML_ATTR(L"iconSet", L"4TrafficLights"); break; + case 13: CP_XML_ATTR(L"iconSet", L"5Arrows"); break; + case 14: CP_XML_ATTR(L"iconSet", L"5ArrowsGray"); break; + case 15: CP_XML_ATTR(L"iconSet", L"5Quarters"); break; + case 16: CP_XML_ATTR(L"iconSet", L"5Rating"); break; + case 0: + default: CP_XML_ATTR(L"iconSet", L"3Arrows"); break; + break; + } + } + if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); + + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + } + } + else if (c.rules[j].type == 5) + { + CP_XML_ATTR(L"type", L"timePeriod"); + switch (*c.rules[j].time_period) + { + case 0: CP_XML_ATTR(L"timePeriod", L"today"); break; + case 1: CP_XML_ATTR(L"timePeriod", L"yesterday"); break; + case 2: CP_XML_ATTR(L"timePeriod", L"tomorrow"); break; + case 3: CP_XML_ATTR(L"timePeriod", L"last7Days"); break; + case 4: CP_XML_ATTR(L"timePeriod", L"thisMonth"); break; + case 5: CP_XML_ATTR(L"timePeriod", L"lastMonth"); break; + case 6: CP_XML_ATTR(L"timePeriod", L"nextMonth"); break; + case 7: CP_XML_ATTR(L"timePeriod", L"thisWeek"); break; + case 8: CP_XML_ATTR(L"timePeriod", L"lastWeek"); break; + case 9: CP_XML_ATTR(L"timePeriod", L"nextWeek"); break; + } + } + } + } + + CP_XML_NODE(L"xm:sqref") + { + CP_XML_CONTENT(c.ref); + } + } + } + } + } std::vector conditionalFormattings_; }; @@ -295,7 +522,10 @@ void xlsx_conditionalFormatting_context::serialize(std::wostream & _Wostream) { return impl_->serialize(_Wostream); } - +void xlsx_conditionalFormatting_context::serializeEx(std::wostream& _Wostream) +{ + return impl_->serializeEx(_Wostream); +} void xlsx_conditionalFormatting_context::start(std::wstring ref) { formulasconvert::odf2oox_converter converter; @@ -554,7 +784,11 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) impl_->conditionalFormattings_.back().rules.back().formula = val; } } -void xlsx_conditionalFormatting_context::set_dataBar(_CP_OPT(int) min, _CP_OPT(int) max) +void xlsx_conditionalFormatting_context::set_gradient(bool val) +{ + impl_->conditionalFormattings_.back().rules.back().gradient = val; +} +void xlsx_conditionalFormatting_context::set_dataBar(_CP_OPT(unsigned int) min, _CP_OPT(unsigned int) max) { impl_->conditionalFormattings_.back().rules.back().minLength = min; impl_->conditionalFormattings_.back().rules.back().maxLength = max; diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h index cfbbde04a1..ae3183febe 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h @@ -50,7 +50,9 @@ public: void add_rule(int type); void set_formula(std::wstring f); - void set_dataBar(_CP_OPT(int) min, _CP_OPT(int) max); + + void set_dataBar(_CP_OPT(unsigned int) min, _CP_OPT(unsigned int) max); + void set_gradient(bool val); void set_dxf (int dxf_id); void set_showVal(bool val); @@ -67,6 +69,7 @@ public: void set_icon_set_type(int type); void serialize(std::wostream & _Wostream); + void serializeEx(std::wostream& _Wostream); private: class Impl; _CP_SCOPED_PTR(Impl) impl_; diff --git a/OdfFile/Reader/Converter/xlsx_output_xml.cpp b/OdfFile/Reader/Converter/xlsx_output_xml.cpp index b5c4379d32..3b983b9276 100644 --- a/OdfFile/Reader/Converter/xlsx_output_xml.cpp +++ b/OdfFile/Reader/Converter/xlsx_output_xml.cpp @@ -78,6 +78,7 @@ public: std::wstringstream tableParts_; std::wstringstream autofilter_; std::wstringstream conditionalFormatting_; + std::wstringstream conditionalFormattingEx_; std::wstringstream picture_background_; std::wstringstream dataValidations_; std::wstringstream dataValidationsX14_; @@ -148,6 +149,10 @@ std::wostream & xlsx_xml_worksheet::conditionalFormatting() { return impl_->conditionalFormatting_; } +std::wostream& xlsx_xml_worksheet::conditionalFormattingEx() +{ + return impl_->conditionalFormattingEx_; +} std::wostream & xlsx_xml_worksheet::sort() { return impl_->sort_; @@ -312,8 +317,9 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm) std::wstring dataValidations14 = impl_->dataValidationsX14_.str(); std::wstring sparklines = impl_->sparklines_.str(); + std::wstring condFormattings = impl_->conditionalFormattingEx_.str(); - if (false == dataValidations14.empty() || false == sparklines.empty()) + if (false == dataValidations14.empty() || false == sparklines.empty() || false == condFormattings.empty()) { CP_XML_NODE(L"extLst") { @@ -337,6 +343,19 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm) CP_XML_STREAM() << sparklines; } } + if (false == condFormattings.empty()) + { + CP_XML_NODE(L"ext") + { + CP_XML_ATTR(L"uri", L"{78C0D931-6437-407d-A8EE-F0AAD7539E65}"); + CP_XML_ATTR(L"xmlns:x14", L"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + + CP_XML_NODE(L"x14:conditionalFormattings") + { + CP_XML_STREAM() << condFormattings; + } + } + } } } } diff --git a/OdfFile/Reader/Converter/xlsx_output_xml.h b/OdfFile/Reader/Converter/xlsx_output_xml.h index ba49392a97..62c487b600 100644 --- a/OdfFile/Reader/Converter/xlsx_output_xml.h +++ b/OdfFile/Reader/Converter/xlsx_output_xml.h @@ -61,6 +61,7 @@ public: std::wostream & autofilter(); std::wostream & tableParts(); std::wostream & conditionalFormatting(); + std::wostream & conditionalFormattingEx(); std::wostream & picture_background(); std::wostream & dataValidations(); std::wostream & dataValidationsX14(); diff --git a/OdfFile/Reader/Converter/xlsx_table_state.cpp b/OdfFile/Reader/Converter/xlsx_table_state.cpp index 1c3249a2d9..445c20d353 100644 --- a/OdfFile/Reader/Converter/xlsx_table_state.cpp +++ b/OdfFile/Reader/Converter/xlsx_table_state.cpp @@ -794,10 +794,14 @@ void xlsx_table_state::serialize_hyperlinks(std::wostream & strm) { return xlsx_hyperlinks_.xlsx_serialize(strm); } -void xlsx_table_state::serialize_conditionalFormatting(std::wostream & strm) +void xlsx_table_state::serialize_condFormatting(std::wostream & strm) { return xlsx_conditionalFormatting_context_.serialize(strm); } +void xlsx_table_state::serialize_condFormattingEx(std::wostream& strm) +{ + return xlsx_conditionalFormatting_context_.serializeEx(strm); +} void xlsx_table_state::dump_rels_hyperlinks(rels & Rels) { return xlsx_hyperlinks_.dump_rels(Rels); diff --git a/OdfFile/Reader/Converter/xlsx_table_state.h b/OdfFile/Reader/Converter/xlsx_table_state.h index 69f48a37b4..b0ca244f7b 100644 --- a/OdfFile/Reader/Converter/xlsx_table_state.h +++ b/OdfFile/Reader/Converter/xlsx_table_state.h @@ -203,7 +203,8 @@ public: void set_background (std::wstring rId) { tableBackground_ = rId; } - void serialize_conditionalFormatting (std::wostream & _Wostream); + void serialize_condFormatting (std::wostream & _Wostream); + void serialize_condFormattingEx (std::wostream& _Wostream); void serialize_table_format (std::wostream & _Wostream); void serialize_merge_cells (std::wostream & _Wostream); void serialize_hyperlinks (std::wostream & _Wostream); diff --git a/OdfFile/Reader/Converter/xlsx_tablecontext.cpp b/OdfFile/Reader/Converter/xlsx_tablecontext.cpp index ed345d18d9..57897738b0 100644 --- a/OdfFile/Reader/Converter/xlsx_tablecontext.cpp +++ b/OdfFile/Reader/Converter/xlsx_tablecontext.cpp @@ -621,9 +621,13 @@ namespace oox { { return state()->serialize_protection(_Wostream); } - void xlsx_table_context::serialize_conditionalFormatting(std::wostream& _Wostream) + void xlsx_table_context::serialize_condFormatting(std::wostream& _Wostream) { - return state()->serialize_conditionalFormatting(_Wostream); + return state()->serialize_condFormatting(_Wostream); + } + void xlsx_table_context::serialize_condFormattingEx(std::wostream& _Wostream) + { + return state()->serialize_condFormattingEx(_Wostream); } void xlsx_table_context::serialize_merge_cells(std::wostream& _Wostream) { diff --git a/OdfFile/Reader/Converter/xlsx_tablecontext.h b/OdfFile/Reader/Converter/xlsx_tablecontext.h index 86b1408841..7cde938de7 100644 --- a/OdfFile/Reader/Converter/xlsx_tablecontext.h +++ b/OdfFile/Reader/Converter/xlsx_tablecontext.h @@ -88,7 +88,8 @@ public: void serialize_autofilter (std::wostream & _Wostream); void serialize_merge_cells (std::wostream & _Wostream); void serialize_table_format (std::wostream & _Wostream); - void serialize_conditionalFormatting(std::wostream & _Wostream); + void serialize_condFormatting (std::wostream & _Wostream); + void serialize_condFormattingEx (std::wostream& _Wostream); void serialize_hyperlinks (std::wostream & _Wostream); void serialize_ole_objects (std::wostream & _Wostream); void serialize_controls (std::wostream & _Wostream); diff --git a/OdfFile/Reader/Converter/xlsxconversioncontext.cpp b/OdfFile/Reader/Converter/xlsxconversioncontext.cpp index acdbf41768..7c7b79323c 100644 --- a/OdfFile/Reader/Converter/xlsxconversioncontext.cpp +++ b/OdfFile/Reader/Converter/xlsxconversioncontext.cpp @@ -520,7 +520,8 @@ void xlsx_conversion_context::end_table() get_table_context().serialize_table_format (current_sheet().sheetFormat()); get_table_context().serialize_page_properties (current_sheet().page_properties()); get_table_context().serialize_header_footer (current_sheet().header_footer()); - get_table_context().serialize_conditionalFormatting (current_sheet().conditionalFormatting()); + get_table_context().serialize_condFormattingEx (current_sheet().conditionalFormattingEx()); + get_table_context().serialize_condFormatting (current_sheet().conditionalFormatting()); get_table_context().serialize_tableParts (current_sheet().tableParts(), current_sheet().sheet_rels()); get_table_context().serialize_autofilter (current_sheet().autofilter()); get_table_context().serialize_sort (current_sheet().sort()); diff --git a/OdfFile/Reader/Format/calcext_elements.cpp b/OdfFile/Reader/Format/calcext_elements.cpp index 0cf91a8721..7460fde492 100644 --- a/OdfFile/Reader/Format/calcext_elements.cpp +++ b/OdfFile/Reader/Format/calcext_elements.cpp @@ -60,6 +60,7 @@ void calcext_data_bar_attr::add_attributes( const xml::attributes_wc_ptr & Attri CP_APPLY_ATTR(L"calcext:min-length", min_length_); CP_APPLY_ATTR(L"calcext:max-length", max_length_); CP_APPLY_ATTR(L"calcext:axis-position", axis_position_); + CP_APPLY_ATTR(L"calcext:gradient", gradient_); } void calcext_icon_set_attr::add_attributes( const xml::attributes_wc_ptr & Attributes ) @@ -181,6 +182,9 @@ void calcext_data_bar::xlsx_convert(oox::xlsx_conversion_context & Context) if (attr_.axis_position_) Context.get_conditionalFormatting_context().set_axis_position(*attr_.axis_position_); + if (attr_.gradient_) + Context.get_conditionalFormatting_context().set_gradient(*attr_.gradient_); + Context.get_conditionalFormatting_context().set_dataBar(attr_.min_length_, attr_.max_length_); for (size_t i = 0 ; i < content_.size(); i++) diff --git a/OdfFile/Reader/Format/calcext_elements.h b/OdfFile/Reader/Format/calcext_elements.h index 146f8dd442..d001359329 100644 --- a/OdfFile/Reader/Format/calcext_elements.h +++ b/OdfFile/Reader/Format/calcext_elements.h @@ -53,12 +53,13 @@ class calcext_data_bar_attr public: void add_attributes( const xml::attributes_wc_ptr & Attributes ); - _CP_OPT(odf_types::color) axis_color_; - _CP_OPT(odf_types::color) positive_color_; - _CP_OPT(odf_types::color) negative_color_; - _CP_OPT(std::wstring) axis_position_; - _CP_OPT(int) max_length_; - _CP_OPT(int) min_length_; + _CP_OPT(odf_types::color) axis_color_; + _CP_OPT(odf_types::color) positive_color_; + _CP_OPT(odf_types::color) negative_color_; + _CP_OPT(std::wstring) axis_position_; + _CP_OPT(bool) gradient_; + _CP_OPT(unsigned int) min_length_; + _CP_OPT(unsigned int) max_length_; }; class calcext_condition_attr diff --git a/OdfFile/Writer/Converter/XlsxConverter.cpp b/OdfFile/Writer/Converter/XlsxConverter.cpp index 330958e14e..fee7de8d10 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.cpp +++ b/OdfFile/Writer/Converter/XlsxConverter.cpp @@ -445,9 +445,10 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet) if (!oox_sheet->m_arrConditionalFormatting.empty() || oox_sheet->m_oExtLst.IsInit()) { - std::multimap mapSorted; + std::multimap> mapSorted; - std::vector arUnsorted; + std::vector> arUnsorted; + std::vector> arUnsortedEx; // sort by prioritet for (size_t fmt = 0; fmt < oox_sheet->m_arrConditionalFormatting.size(); fmt++) @@ -465,9 +466,9 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet) } } if (priority >= 0) - mapSorted.insert(std::make_pair(priority, cond_fmt)); + mapSorted.insert(std::make_pair(priority, std::make_pair(cond_fmt, false))); else - arUnsorted.push_back(cond_fmt); + arUnsorted.push_back(std::make_pair(cond_fmt, false)); } } @@ -492,27 +493,32 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet) } } if (priority >= 0) - mapSorted.insert(std::make_pair(priority, cond_fmt)); + mapSorted.insert(std::make_pair(priority, std::make_pair(cond_fmt, true))); else - arUnsorted.push_back(cond_fmt); + arUnsortedEx.push_back(std::make_pair(cond_fmt, true)); } } } } //-------------------------------------------------------------------------- - if (arUnsorted.size() + mapSorted.size() > 0) + if (arUnsorted.size() + mapSorted.size() + arUnsortedEx.size() > 0) { ods_context->start_conditional_formats(); for (size_t fmt = 0; fmt < arUnsorted.size(); fmt++) { - convert(arUnsorted[fmt]); + convert(arUnsorted[fmt].first, oox_sheet->m_mapConditionalFormattingEx, arUnsorted[fmt].second); } - for (std::multimap::iterator it = mapSorted.begin(); it != mapSorted.end(); ++it) + for (std::multimap>::iterator it = mapSorted.begin(); it != mapSorted.end(); ++it) { - convert(it->second); + convert(it->second.first, oox_sheet->m_mapConditionalFormattingEx, it->second.second); + } + + for (size_t fmt = 0; fmt < arUnsortedEx.size(); fmt++) + { + convert(arUnsortedEx[fmt].first, oox_sheet->m_mapConditionalFormattingEx, arUnsortedEx[fmt].second); } ods_context->end_conditional_formats(); } @@ -3409,24 +3415,51 @@ void XlsxConverter::convert(OOX::Spreadsheet::CAltTextTable *alt_text) if (!alt_text) return; } -void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmt) +void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmt, + std::map& mapCFRuleEx, bool isExt) { if (!oox_cond_fmt)return; - if (oox_cond_fmt->m_oSqRef.IsInit()) + bool bRule = false; + for (size_t i = 0; i < oox_cond_fmt->m_arrItems.size(); i++) + { + if (oox_cond_fmt->m_arrItems[i]->bUsage) continue; + bRule = true; + break; + } + if (!bRule) return; + + if (oox_cond_fmt->m_oSqRef.IsInit()) { ods_context->current_table()->start_conditional_format(oox_cond_fmt->m_oSqRef.get()); for (size_t i = 0; i < oox_cond_fmt->m_arrItems.size(); i++) { - convert(oox_cond_fmt->m_arrItems[i]);//rule + convert(oox_cond_fmt->m_arrItems[i], mapCFRuleEx, isExt);//rule } ods_context->current_table()->end_conditional_format(); } } -void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule) +void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule, + std::map& mapCFRuleEx, bool isExt) { - if (!oox_cond_rule)return; + if (!oox_cond_rule) return; + + std::map::iterator pFind; + if (oox_cond_rule->m_oExtId.IsInit()) + { + pFind = mapCFRuleEx.find(*oox_cond_rule->m_oExtId); + + if (pFind != mapCFRuleEx.end()) + { + OOX::Spreadsheet::CConditionalFormattingRule newRule = + OOX::Spreadsheet::CConditionalFormattingRule::Merge(*oox_cond_rule, *pFind->second); + + pFind->second->bUsage = true; + convert(&newRule, mapCFRuleEx, true); + return; + } + } if (false == oox_cond_rule->m_oType.IsInit()) return; @@ -3480,26 +3513,38 @@ void XlsxConverter::convert(OOX::Spreadsheet::CDataBar *oox_cond_databar) _CP_OPT(odf_types::color) color; - if (oox_cond_databar->m_oBorderColor.IsInit()) - convert(oox_cond_databar->m_oBorderColor.GetPointer(), color); - else + if (oox_cond_databar->m_oColor.IsInit()) convert(oox_cond_databar->m_oColor.GetPointer(), color); + else if (oox_cond_databar->m_oBorderColor.IsInit()) // ???? + convert(oox_cond_databar->m_oBorderColor.GetPointer(), color); ods_context->current_table()->set_conditional_databar_color(color); convert(oox_cond_databar->m_oAxisColor.GetPointer(), color); ods_context->current_table()->set_conditional_databar_axis_color(color); - convert(oox_cond_databar->m_oNegativeBorderColor.GetPointer(), color); + if (oox_cond_databar->m_oNegativeFillColor.IsInit()) + convert(oox_cond_databar->m_oNegativeFillColor.GetPointer(), color); + else if (oox_cond_databar->m_oNegativeBorderColor.IsInit()) // ???? + convert(oox_cond_databar->m_oNegativeBorderColor.GetPointer(), color); + ods_context->current_table()->set_conditional_databar_negative_color(color); + if (oox_cond_databar->m_oGradient.IsInit()) + ods_context->current_table()->set_conditional_databar_gradient(oox_cond_databar->m_oGradient->ToBool()); + if (oox_cond_databar->m_oAxisPosition.IsInit()) ods_context->current_table()->set_conditional_databar_axis_position(oox_cond_databar->m_oAxisPosition->ToString()); if (oox_cond_databar->m_oShowValue.IsInit()) ods_context->current_table()->set_conditional_show_value(oox_cond_databar->m_oShowValue->ToBool()); - //nullable> m_oMaxLength; - //nullable> m_oMinLength; + + if (oox_cond_databar->m_oMaxLength.IsInit()) + ods_context->current_table()->set_conditional_databar_max(oox_cond_databar->m_oMaxLength->GetValue()); + + if (oox_cond_databar->m_oMinLength.IsInit()) + ods_context->current_table()->set_conditional_databar_min(oox_cond_databar->m_oMinLength->GetValue()); + for (size_t i=0; i< oox_cond_databar->m_arrValues.size(); i++) convert(oox_cond_databar->m_arrValues[i].GetPointer()); } diff --git a/OdfFile/Writer/Converter/XlsxConverter.h b/OdfFile/Writer/Converter/XlsxConverter.h index 39a268bfff..1266979c11 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.h +++ b/OdfFile/Writer/Converter/XlsxConverter.h @@ -233,8 +233,10 @@ namespace Oox2Odf void convert(OOX::Spreadsheet::CSheetProtection *oox_prot); void convert(OOX::Spreadsheet::CDataValidations *oox_validations); void convert(OOX::Spreadsheet::CDataValidation *oox_validation); - void convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmt); - void convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule); + void convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmtc, + std::map& mapCFRuleEx, bool isExt); + void convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule, + std::map& mapCFRuleEx, bool isExt); void convert(OOX::Spreadsheet::CAutofilter *oox_filter); void convert(OOX::Spreadsheet::CFilterColumn *oox_filter_column); void convert(OOX::Spreadsheet::CDataBar *oox_cond_databar); diff --git a/OdfFile/Writer/Format/calcext_elements.cpp b/OdfFile/Writer/Format/calcext_elements.cpp index 57ffb5166e..49efa3a4b4 100644 --- a/OdfFile/Writer/Format/calcext_elements.cpp +++ b/OdfFile/Writer/Format/calcext_elements.cpp @@ -44,10 +44,13 @@ namespace odf_writer { void calcext_data_bar_attr::serialize(CP_ATTR_NODE) { - CP_XML_ATTR_OPT(L"calcext:axis-color", calcext_axis_color_); - CP_XML_ATTR_OPT(L"calcext:positive-color", calcext_positive_color_); - CP_XML_ATTR_OPT(L"calcext:negative-color", calcext_negative_color_); - CP_XML_ATTR_OPT(L"calcext:axis-position", calcext_axis_position_); + CP_XML_ATTR_OPT(L"calcext:axis-color", axis_color_); + CP_XML_ATTR_OPT(L"calcext:positive-color", positive_color_); + CP_XML_ATTR_OPT(L"calcext:negative-color", negative_color_); + CP_XML_ATTR_OPT(L"calcext:axis-position", axis_position_); + CP_XML_ATTR_OPT(L"calcext:gradient", gradient_); + CP_XML_ATTR_OPT(L"calcext:min-length", min_length_); + CP_XML_ATTR_OPT(L"calcext:max-length", max_length_); } void calcext_icon_set_attr::serialize(CP_ATTR_NODE) diff --git a/OdfFile/Writer/Format/calcext_elements.h b/OdfFile/Writer/Format/calcext_elements.h index 45f30c80cb..9885064689 100644 --- a/OdfFile/Writer/Format/calcext_elements.h +++ b/OdfFile/Writer/Format/calcext_elements.h @@ -56,10 +56,13 @@ class calcext_data_bar_attr public: void serialize(CP_ATTR_NODE); - _CP_OPT(odf_types::color) calcext_axis_color_; - _CP_OPT(odf_types::color) calcext_positive_color_; - _CP_OPT(odf_types::color) calcext_negative_color_; - _CP_OPT(std::wstring) calcext_axis_position_; + _CP_OPT(odf_types::color) axis_color_; + _CP_OPT(odf_types::color) positive_color_; + _CP_OPT(odf_types::color) negative_color_; + _CP_OPT(std::wstring) axis_position_; + _CP_OPT(odf_types::Bool) gradient_; + _CP_OPT(unsigned int) min_length_; + _CP_OPT(unsigned int) max_length_; }; class calcext_condition_attr diff --git a/OdfFile/Writer/Format/ods_table_state.cpp b/OdfFile/Writer/Format/ods_table_state.cpp index 2d45a6c37e..adb678bf35 100644 --- a/OdfFile/Writer/Format/ods_table_state.cpp +++ b/OdfFile/Writer/Format/ods_table_state.cpp @@ -2257,7 +2257,7 @@ void ods_table_state::set_conditional_databar_color(_CP_OPT(color)& color) if (cond_format) { - cond_format->attr_.calcext_positive_color_ = color; + cond_format->attr_.positive_color_ = color; } } void ods_table_state::set_conditional_databar_axis_color(_CP_OPT(color)& color) @@ -2266,7 +2266,7 @@ void ods_table_state::set_conditional_databar_axis_color(_CP_OPT(color)& color) if (cond_format) { - cond_format->attr_.calcext_axis_color_ = color; + cond_format->attr_.axis_color_ = color; } } void ods_table_state::set_conditional_databar_negative_color(_CP_OPT(color)& color) @@ -2275,7 +2275,7 @@ void ods_table_state::set_conditional_databar_negative_color(_CP_OPT(color)& col if (cond_format) { - cond_format->attr_.calcext_negative_color_ = color; + cond_format->attr_.negative_color_ = color; } } void ods_table_state::set_conditional_databar_axis_position(const std::wstring& type) @@ -2284,9 +2284,35 @@ void ods_table_state::set_conditional_databar_axis_position(const std::wstring& if (cond_format) { - cond_format->attr_.calcext_axis_position_ = type; + cond_format->attr_.axis_position_ = type; } +} +void ods_table_state::set_conditional_databar_gradient(bool val) +{ + calcext_data_bar* cond_format = dynamic_cast(current_level_.back().get()); + if (cond_format) + { + cond_format->attr_.gradient_ = val; + } +} +void ods_table_state::set_conditional_databar_max(unsigned int val) +{ + calcext_data_bar* cond_format = dynamic_cast(current_level_.back().get()); + + if (cond_format) + { + cond_format->attr_.max_length_ = val; + } +} +void ods_table_state::set_conditional_databar_min(unsigned int val) +{ + calcext_data_bar* cond_format = dynamic_cast(current_level_.back().get()); + + if (cond_format) + { + cond_format->attr_.min_length_ = val; + } } } diff --git a/OdfFile/Writer/Format/ods_table_state.h b/OdfFile/Writer/Format/ods_table_state.h index 85a5f6a86b..af32f5c59e 100644 --- a/OdfFile/Writer/Format/ods_table_state.h +++ b/OdfFile/Writer/Format/ods_table_state.h @@ -398,6 +398,9 @@ public: void set_conditional_databar_negative_color(_CP_OPT(odf_types::color) & color); void set_conditional_databar_axis_color(_CP_OPT(odf_types::color) & color); void set_conditional_databar_axis_position(const std::wstring& value); + void set_conditional_databar_gradient(bool val); + void set_conditional_databar_max(unsigned int val); + void set_conditional_databar_min(unsigned int val); void set_conditional_style_name(const std::wstring &style_name); void set_conditional_operator(int _operator); From 245ba212c43e130988cebe6437071debf3718802 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 12 Mar 2024 23:55:01 +0300 Subject: [PATCH 058/117] fix bug #66849 --- OOXML/XlsxFormat/Table/Tables.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 4d28e8cbfa..1f53cb3ba6 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -625,7 +625,14 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(i->m_oName.IsInit()) { i->m_oName = boost::algorithm::erase_all_copy(i->m_oName.get(), L"_x000a_"); - XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).at(colInd) = i->m_oName.get(); + std::unordered_map>::iterator pFind = XLS::GlobalWorkbookInfo::mapTableColumnNames_static.find(m_oId->GetValue()); + if (pFind != XLS::GlobalWorkbookInfo::mapTableColumnNames_static.end()) + { + if (colInd < pFind->second.size()) + { + pFind->second[colInd] = i->m_oName.get(); + } + } } colInd++; } From a6370ec0a657a4f66101cae1b530021be58abfc4 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 13 Mar 2024 10:37:33 +0300 Subject: [PATCH 059/117] fix bug #66842 --- OdfFile/DataTypes/iconset_type.cpp | 18 +++++++++++++++++- OdfFile/DataTypes/iconset_type.h | 5 ++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/OdfFile/DataTypes/iconset_type.cpp b/OdfFile/DataTypes/iconset_type.cpp index e33365eb07..8239ab3a77 100644 --- a/OdfFile/DataTypes/iconset_type.cpp +++ b/OdfFile/DataTypes/iconset_type.cpp @@ -92,8 +92,18 @@ std::wostream & operator << (std::wostream & _Wostream, const iconset_type & _Va case iconset_type::Rating5: _Wostream << L"5Rating"; break; - default: + case iconset_type::Boxes5: + _Wostream << L"5Boxes"; break; + case iconset_type::Triangles3: + _Wostream << L"3Triangles"; + break; + case iconset_type::Stars3: + _Wostream << L"3Stars"; + break; + default: + _Wostream << L"3Arrows"; + break; } return _Wostream; } @@ -137,6 +147,12 @@ iconset_type iconset_type::parse(const std::wstring & Str) return iconset_type( Quarters5 ); else if (tmp == L"5rating") return iconset_type( Rating5 ); + else if (tmp == L"5Boxes") + return iconset_type( Boxes5 ); + else if (tmp == L"3Stars") + return iconset_type(Stars3); + else if (tmp == L"3Triangles") + return iconset_type(Triangles3); else { return iconset_type( Arrows3 ); diff --git a/OdfFile/DataTypes/iconset_type.h b/OdfFile/DataTypes/iconset_type.h index 71f4dfd20c..e06745520c 100644 --- a/OdfFile/DataTypes/iconset_type.h +++ b/OdfFile/DataTypes/iconset_type.h @@ -59,7 +59,10 @@ public: Arrows5, Arrows5Gray, Quarters5, - Rating5 + Rating5, + Stars3, + Triangles3, + Boxes5 }; iconset_type() {} From b065aff618ded70da1a4d2929b3b250693e9b00a Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Wed, 13 Mar 2024 10:57:11 +0300 Subject: [PATCH 060/117] Fixes for android --- Common/3dParty/v8/android/howto.txt | 46 ++++++++++++++++++ .../doctrenderer/js_internal/v8/v8_base.h | 10 ++-- .../src/main/cpp/jni/objects/JniBaseObjects.h | 48 +++++++------------ X2tConverter/src/main.cpp | 2 +- 4 files changed, 70 insertions(+), 36 deletions(-) create mode 100644 Common/3dParty/v8/android/howto.txt diff --git a/Common/3dParty/v8/android/howto.txt b/Common/3dParty/v8/android/howto.txt new file mode 100644 index 0000000000..099db5a4a7 --- /dev/null +++ b/Common/3dParty/v8/android/howto.txt @@ -0,0 +1,46 @@ +Fixes for build 12.1 version for android with use_custom_libcxx: + +1) src/build/config/BUILD.gn + +group("common_deps") { ... } + +if (use_custom_libcxx) { + public_deps += [ "//buildtools/third_party/libc++" ] +} + +=> + +if (use_custom_libcxx) { + public_deps += [ "//buildtools/third_party/libc++" ] +} else { + # ONLYOFFICE-HACK + public_deps += [ "//buildtools/third_party/libunwind" ] +} + +2) src/buildtools/third_party/libunbind/BUILD.gn + +visibility = [ "//buildtools/third_party/libc++abi" ] + +=> +visibility = [ "//buildtools/third_party/libc++abi" ] +# ONLYOFFICE-HACK +visibility += ["//build/config:common_deps"] + +3) src/zone/zone.h + +all records: +static_assert(alignof(T) <= kAlignmentInBytes); + +=> + +// ONLYOFFICE-HACK +//static_assert(alignof(T) <= kAlignmentInBytes); + +Fixes for link static library WITH custom libc++: + +v8.pri: +v8_custom_libcxx { + LIBS += $$CORE_V8_PATH_LIBS/third_party/libc++/libc++/*.o + LIBS += $$CORE_V8_PATH_LIBS/third_party/libc++abi/libc++abi/*.o + LIBS += $$CORE_V8_PATH_LIBS/third_party/libunwind/libunwind/*.o +} diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index 7842fed0e8..fe200c07df 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -60,7 +60,7 @@ v8::Local CreateV8String(v8::Isolate* i, const std::string& str); #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, "js", __VA_ARGS__) #endif -#if 1 +#if V8_OS_XP class MallocArrayBufferAllocator : public v8::ArrayBuffer::Allocator { public: @@ -121,9 +121,7 @@ public: v8::V8::InitializeICUDefaultLocation(sPrA.c_str()); v8::V8::InitializeExternalStartupData(sPrA.c_str()); #ifdef V8_VERSION_89_PLUS - //m_platform = v8::platform::NewDefaultPlatform(); - v8::V8::SetFlagsFromString("--single-threaded"); - m_platform = v8::platform::NewSingleThreadedDefaultPlatform(); + m_platform = v8::platform::NewDefaultPlatform(); v8::V8::InitializePlatform(m_platform.get()); #else m_platform = v8::platform::CreateDefaultPlatform(); @@ -153,7 +151,11 @@ public: #endif v8::V8::Dispose(); + #ifdef V8_VERSION_121_PLUS + v8::V8::DisposePlatform(); + #else v8::V8::ShutdownPlatform(); + #endif if (m_pAllocator) delete m_pAllocator; diff --git a/X2tConverter/build/Android/libx2t/src/main/cpp/jni/objects/JniBaseObjects.h b/X2tConverter/build/Android/libx2t/src/main/cpp/jni/objects/JniBaseObjects.h index 4522a3f1fc..ba56a04086 100644 --- a/X2tConverter/build/Android/libx2t/src/main/cpp/jni/objects/JniBaseObjects.h +++ b/X2tConverter/build/Android/libx2t/src/main/cpp/jni/objects/JniBaseObjects.h @@ -3,10 +3,9 @@ #include #include -#include -#include #include #include +#include "../../../../../../../../../DesktopEditor/common/File.h" #define DELETE_LOCAL_REF(ENV, REFERENCE) \ if (REFERENCE != NULL && !ENV->IsSameObject(REFERENCE, NULL)) { \ @@ -140,8 +139,8 @@ class JniBaseObjects { static std::string jstringToString(JNIEnv* env, jstring jstr) { jboolean isCopy; const char * charPath = env->GetStringUTFChars(jstr, &isCopy); - const int size = env->GetStringLength(jstr); - const std::string str(charPath, charPath + size); + const int size = env->GetStringUTFLength(jstr); + const std::string str(charPath, (size_t)size); env->ReleaseStringUTFChars(jstr, charPath); return str; } @@ -149,23 +148,28 @@ class JniBaseObjects { static std::string* jstringToPString(JNIEnv* env, jstring jstr) { jboolean isCopy; const char * charPath = env->GetStringUTFChars(jstr, &isCopy); - const int size = env->GetStringLength(jstr); - std::string* pStr = new std::string(charPath, charPath + size); + const int size = env->GetStringUTFLength(jstr); + std::string* pStr = new std::string(charPath, (size_t)size); env->ReleaseStringUTFChars(jstr, charPath); return pStr; } static std::wstring jstringToWString(JNIEnv* env, jstring jstr) { jboolean isCopy; - const char * cstr = env->GetStringUTFChars(jstr, &isCopy); - const int size = env->GetStringLength(jstr); - const std::wstring wstr = charsToWString(cstr); - env->ReleaseStringUTFChars(jstr, cstr); - return wstr; + const char * charPath = env->GetStringUTFChars(jstr, &isCopy); + const int size = env->GetStringUTFLength(jstr); + std::wstring pStr = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)charPath, (LONG)size); + env->ReleaseStringUTFChars(jstr, charPath); + return pStr; } - static jstring wStringToJString(JNIEnv* env, const std::wstring wstr) { - return env->NewStringUTF(wStringToString(wstr).c_str()); + static jstring wStringToJString(JNIEnv* env, const std::wstring& wstr) { + std::string sTmp = U_TO_UTF8(wstr); + return stringToJString(env, sTmp); + } + + static jstring stringToJString(JNIEnv* env, const std::string& str) { + return env->NewStringUTF(str.c_str()); } static jstring charToJString(JNIEnv* env, const char * str) { @@ -184,24 +188,6 @@ class JniBaseObjects { return jArray; } - static std::wstring charsToWString(const char * str) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - return converterX.from_bytes(str); - } - - static std::wstring stringToWString(const std::string & str) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - return converterX.from_bytes(str); - } - - static std::string wStringToString(const std::wstring & str) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - return converterX.to_bytes(str); - } - static jobjectArray wStringToObjectArray(JNIEnv *jEnv, std::wstring *data, int length) { jobjectArray jObjectArray = NULL; jsize len = length; diff --git a/X2tConverter/src/main.cpp b/X2tConverter/src/main.cpp index 6b19ec11c7..c615cb5cdb 100644 --- a/X2tConverter/src/main.cpp +++ b/X2tConverter/src/main.cpp @@ -98,7 +98,7 @@ int wmain_lib(int argc, wchar_t *argv[]) if (sMemoryLimit.empty()) sMemoryLimit = NSSystemUtils::gc_EnvMemoryLimitDefault; -#if !defined(_DEBUG) +#if !defined(_DEBUG) && !defined(__ANDROID__) && !defined(_IOS) long long nMemoryLimit; if (NSStringExt::FromHumanReadableByteCount(sMemoryLimit, nMemoryLimit) && nMemoryLimit > 0) limit_memory((size_t)nMemoryLimit); From 53677bf8ccff17a044411c33a6ac436754f432e4 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Wed, 13 Mar 2024 11:04:55 +0300 Subject: [PATCH 061/117] Revert test changes --- Common/3dParty/v8/android/build.py | 2 +- Common/3dParty/v8/v8.pri | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Common/3dParty/v8/android/build.py b/Common/3dParty/v8/android/build.py index 0c31835c77..14129064c6 100644 --- a/Common/3dParty/v8/android/build.py +++ b/Common/3dParty/v8/android/build.py @@ -123,7 +123,7 @@ def get_android_args(platform, sdk_ver=21): "v8_static_library=true", "v8_monolithic=true", "use_custom_libcxx=false", - "android_ndk_version=\\\"26.2.11394342\\\"", + "android_ndk_version=\\\"21.1.6352462\\\"", "android_sdk_version=\\\"" + str(sdk_ver) + "\\\"", "clang_use_chrome_plugins=false", "v8_use_external_startup_data=false", diff --git a/Common/3dParty/v8/v8.pri b/Common/3dParty/v8/v8.pri index 1148ffb566..24f6fe1afb 100644 --- a/Common/3dParty/v8/v8.pri +++ b/Common/3dParty/v8/v8.pri @@ -30,8 +30,6 @@ core_android { isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_armv7): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_LIBS/armeabi-v7a isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_x86): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_LIBS/x86 isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_x86_64): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_LIBS/x86_64 - - LIBS += -ldl } INCLUDEPATH += \ From e518efc5e1cbb6a545d44fdab97eeb7a677ac615 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Wed, 13 Mar 2024 11:10:31 +0300 Subject: [PATCH 062/117] . --- .../doctrenderer/js_internal/v8/v8_base.h | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index fe200c07df..671407ac7e 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -52,33 +52,36 @@ v8::Local CreateV8String(v8::Isolate* i, const char* str, const int& len = -1); v8::Local CreateV8String(v8::Isolate* i, const std::string& str); +#ifdef __ANDROID__ + +#ifdef _DEBUG #define ANDROID_LOGS +#endif + #ifdef ANDROID_LOGS -//#define ANDROID_LOGS_ALL_FUNCTIONS #include #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, "js", __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, "js", __VA_ARGS__) #endif +#endif + #if V8_OS_XP class MallocArrayBufferAllocator : public v8::ArrayBuffer::Allocator { public: virtual void* Allocate(size_t length) { - LOGW("allocate: %d\n", (int)length); void* ret = malloc(length); memset(ret, 0, length); return ret; } virtual void* AllocateUninitialized(size_t length) { - LOGW("allocate_uninitialized: %d\n", (int)length); return malloc(length); } virtual void Free(void* data, size_t length) { - LOGW("free: %d\n", (int)length); free(data); } }; @@ -492,12 +495,6 @@ namespace NSJSBase CInspectorPool::get().getInspector(V8IsolateOneArg).startAgent(false); #endif -#ifdef ANDROID_LOGS_ALL_FUNCTIONS - std::string sFuncName(name); - std::string sFunc = "[JS call_func: " + sFuncName + "]"; - LOGW(sFunc.c_str()); -#endif - LOGGER_START v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); @@ -531,11 +528,6 @@ namespace NSJSBase LOGGER_LAP_NAME(name) -#ifdef ANDROID_LOGS_ALL_FUNCTIONS - sFunc = "[JS call_func_end: " + sFuncName + "]"; - LOGW(sFunc.c_str()); -#endif - JSSmart _ret = _return; return _ret; } From 38ce36fa7563154cb3e011142cf1d328b9e2e0a6 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Wed, 13 Mar 2024 11:11:58 +0300 Subject: [PATCH 063/117] . --- DesktopEditor/doctrenderer/js_internal/v8/v8_base.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index 671407ac7e..a6b5e332c3 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -66,7 +66,7 @@ v8::Local CreateV8String(v8::Isolate* i, const std::string& str); #endif -#if V8_OS_XP +#ifdef V8_OS_XP class MallocArrayBufferAllocator : public v8::ArrayBuffer::Allocator { public: From 6995a5ef34f70772b8018b5f3d72615013e0e387 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 13 Mar 2024 14:42:40 +0600 Subject: [PATCH 064/117] Fix endless formula conversion --- .../XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index d040528506..14d55c2e1e 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -401,6 +401,10 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R else { + //add error name to prevent endless formula conversion + rgce.sequence.clear(); + rgce.addPtg(found_operand = OperandPtgPtr(new PtgErr(L"#NAME?"))); + break; // EXCEPT::RT::WrongFormulaString("Unknown operand format in formula.", assembled_formula); } last_ptg = found_operand; From 9832010dd7150d93d345724f9d927399ebb603c8 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 13 Mar 2024 19:22:40 +0600 Subject: [PATCH 065/117] Add xti reading while xml read --- OOXML/XlsxFormat/Workbook/Sheets.cpp | 16 +++++++ OOXML/XlsxFormat/Workbook/Sheets.h | 1 + OOXML/XlsxFormat/Workbook/Workbook.cpp | 59 ++++++++++++-------------- OOXML/XlsxFormat/Workbook/Workbook.h | 1 + 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/Sheets.cpp b/OOXML/XlsxFormat/Workbook/Sheets.cpp index 6fc2a4616d..e4309a7c55 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.cpp +++ b/OOXML/XlsxFormat/Workbook/Sheets.cpp @@ -178,6 +178,12 @@ namespace OOX } } + auto sheetIndex = 0; + for(auto i:m_arrItems) + { if(i->m_oName.IsInit()) + AddSheetRef(i->m_oName.get(), sheetIndex); + sheetIndex++; + } } void CSheets::fromBin(std::vector& obj) { @@ -205,6 +211,16 @@ namespace OOX void CSheets::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { } + void CSheets::AddSheetRef(const std::wstring& link, const _INT32& sheetIndex) + { + XLS::GlobalWorkbookInfo::_xti val_1; + val_1.iSup = sheetIndex; + val_1.itabFirst = sheetIndex; + val_1.itabLast = sheetIndex; + val_1.link = link; + + XLS::GlobalWorkbookInfo::arXti_External_static.push_back(val_1); + } } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Workbook/Sheets.h b/OOXML/XlsxFormat/Workbook/Sheets.h index fc1956be6a..fcb5b5af0a 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.h +++ b/OOXML/XlsxFormat/Workbook/Sheets.h @@ -100,6 +100,7 @@ namespace OOX virtual EElementType getType () const; private: + void AddSheetRef(const std::wstring& link, const _INT32& sheetIndex); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); }; diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 9342b0ac08..3c23b8f636 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -297,36 +297,6 @@ namespace OOX auto ptr(new XLSB::BUNDLESHS); ptr->m_arBrtBundleSh = m_oSheets->toBin(); workBookStream->m_BUNDLESHS = XLS::BaseObjectPtr{ptr}; - - auto ptr1(new XLSB::EXTERNALS); - workBookStream->m_EXTERNALS = XLS::BaseObjectPtr{ptr1}; - auto externSheet(new XLSB::ExternSheet); - ptr1->m_BrtExternSheet = XLS::BaseObjectPtr{externSheet}; - externSheet->cXTI = ptr->m_arBrtBundleSh.size(); - for(auto i = 0; i < ptr->m_arBrtBundleSh.size(); i++) - { - auto sup(new XLSB::SUP); - auto supSelf(new XLSB::SupSelf); - sup->m_source = XLS::BaseObjectPtr{supSelf}; - ptr1->m_arSUP.push_back(XLS::BaseObjectPtr{sup}); - auto xti(new XLS::XTI); - xti->iSupBook = i; - xti->itabFirst = i; - xti->itabLast = i; - - auto biffStructPtr = XLS::BiffStructurePtr(xti); - externSheet->rgXTI.push_back(biffStructPtr); - - XLS::GlobalWorkbookInfo::_xti val_1; - val_1.iSup = xti->iSupBook; - val_1.itabFirst = i; - val_1.itabLast = i; - auto sheet = static_cast(ptr->m_arBrtBundleSh[i].get()); - val_1.link = sheet->strName; - - XLS::GlobalWorkbookInfo::arXti_External_static.push_back(val_1); - - } } if (m_oWorkbookPr.IsInit()) workBookStream->m_BrtWbProp = m_oWorkbookPr->toBin(); @@ -339,13 +309,13 @@ namespace OOX if (m_oWorkbookProtection.IsInit()) workBookStream->m_BrtBookProtection = m_oWorkbookProtection->toBin(); + workBookStream->m_EXTERNALS = WriteXtiRefs(); if (m_oExternalReferences.IsInit()) { auto ptr = static_cast(workBookStream->m_EXTERNALS.get()); auto sups = m_oExternalReferences->toBin(); if(!sups.empty()) ptr->m_arSUP.insert(ptr->m_arSUP.end(), sups.begin(), sups.end()); - } @@ -632,6 +602,33 @@ xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"\ return lActiveSheet; } + XLS::BaseObjectPtr CWorkbook::WriteXtiRefs() const + { + auto ptr(new XLSB::EXTERNALS); + + + auto externSheet(new XLSB::ExternSheet); + ptr->m_BrtExternSheet = XLS::BaseObjectPtr{externSheet}; + + for(auto i:XLS::GlobalWorkbookInfo::arXti_External_static) + { + auto sup(new XLSB::SUP); + auto supSelf(new XLSB::SupSelf); + sup->m_source = XLS::BaseObjectPtr{supSelf}; + ptr->m_arSUP.push_back(XLS::BaseObjectPtr{sup}); + + auto xti(new XLS::XTI); + xti->iSupBook = i.iSup; + xti->itabFirst = i.itabFirst; + xti->itabLast = i.itabLast; + + auto biffStructPtr = XLS::BiffStructurePtr(xti); + externSheet->rgXTI.push_back(biffStructPtr); + } + externSheet->cXTI = externSheet->rgXTI.size(); + return XLS::BaseObjectPtr{ptr}; + } + } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Workbook/Workbook.h b/OOXML/XlsxFormat/Workbook/Workbook.h index a3b31d97db..a5046deada 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.h +++ b/OOXML/XlsxFormat/Workbook/Workbook.h @@ -141,6 +141,7 @@ namespace OOX void PrepareToWrite(); LONG GetActiveSheetIndex(); + XLS::BaseObjectPtr WriteXtiRefs() const; CPath m_oReadPath; From 0053b72656e419e4f161559709defb9d7d996146 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Wed, 13 Mar 2024 17:13:25 +0300 Subject: [PATCH 066/117] Remove unused files --- .../3dParty/openssl/build-android-common.sh | 220 ------------------ .../3dParty/openssl/build-android-openssl.sh | 126 ---------- 2 files changed, 346 deletions(-) delete mode 100755 Common/3dParty/openssl/build-android-common.sh delete mode 100755 Common/3dParty/openssl/build-android-openssl.sh diff --git a/Common/3dParty/openssl/build-android-common.sh b/Common/3dParty/openssl/build-android-common.sh deleted file mode 100755 index d1b069c047..0000000000 --- a/Common/3dParty/openssl/build-android-common.sh +++ /dev/null @@ -1,220 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 leenjewel -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source ./build-common.sh - -export PLATFORM_TYPE="Android" -export ARCHS=("arm" "arm64" "x86" "x86_64") -export ABIS=("armeabi-v7a" "arm64-v8a" "x86" "x86_64") -export ABI_TRIPLES=("arm-linux-androideabi" "aarch64-linux-android" "i686-linux-android" "x86_64-linux-android") -export ANDROID_API=21 - -# for test -# export ARCHS=("x86_64") -# export ABIS=("x86_64") -# export ABI_TRIPLES=("x86_64-linux-android") - -if [[ -z ${ANDROID_NDK_ROOT} ]]; then - echo "ANDROID_NDK_ROOT not defined" - exit 1 -fi - -function get_toolchain() { - HOST_OS=$(uname -s) - case ${HOST_OS} in - Darwin) HOST_OS=darwin ;; - Linux) HOST_OS=linux ;; - FreeBsd) HOST_OS=freebsd ;; - CYGWIN* | *_NT-*) HOST_OS=cygwin ;; - esac - - HOST_ARCH=$(uname -m) - case ${HOST_ARCH} in - i?86) HOST_ARCH=x86 ;; - x86_64 | amd64) HOST_ARCH=x86_64 ;; - esac - - echo "${HOST_OS}-${HOST_ARCH}" -} - -function get_android_arch() { - local common_arch=$1 - case ${common_arch} in - arm) - echo "arm-v7a" - ;; - arm64) - echo "arm64-v8a" - ;; - x86) - echo "x86" - ;; - x86_64) - echo "x86-64" - ;; - esac -} - -function get_target_build() { - local arch=$1 - case ${arch} in - arm-v7a) - echo "arm" - ;; - arm64-v8a) - echo "arm64" - ;; - x86) - echo "x86" - ;; - x86-64) - echo "x86_64" - ;; - esac -} - -function get_build_host_internal() { - local arch=$1 - case ${arch} in - arm-v7a | arm-v7a-neon) - echo "arm-linux-androideabi" - ;; - arm64-v8a) - echo "aarch64-linux-android" - ;; - x86) - echo "i686-linux-android" - ;; - x86-64) - echo "x86_64-linux-android" - ;; - esac -} - -function android_get_build_host() { - local arch=$(get_android_arch $1) - get_build_host_internal $arch -} - -function get_clang_target_host() { - local arch=$1 - local api=$2 - case ${arch} in - arm-v7a | arm-v7a-neon) - echo "armv7a-linux-androideabi${api}" - ;; - arm64-v8a) - echo "aarch64-linux-android${api}" - ;; - x86) - echo "i686-linux-android${api}" - ;; - x86-64) - echo "x86_64-linux-android${api}" - ;; - esac -} - -function set_android_toolchain_bin() { - export PATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/$(get_toolchain)/bin:$PATH - echo PATH=$PATH -} - -function set_android_toolchain() { - local name=$1 - local arch=$(get_android_arch $2) - local api=$3 - local build_host=$(get_build_host_internal "$arch") - local clang_target_host=$(get_clang_target_host "$arch" "$api") - - export AR=${build_host}-ar - export CC=${clang_target_host}-clang - export CXX=${clang_target_host}-clang++ - export AS=${build_host}-as - export LD=${build_host}-ld - export RANLIB=${build_host}-ranlib - export STRIP=${build_host}-strip -} - -function get_common_includes() { - local toolchain=$(get_toolchain) - echo "-I${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/include -I${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/local/include" -} -function get_common_linked_libraries() { - local api=$1 - local arch=$2 - local toolchain=$(get_toolchain) - local build_host=$(get_build_host_internal "$arch") - echo "-L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/${build_host}/lib -L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/lib/${build_host}/${api} -L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/lib" -} - -function set_android_cpu_feature() { - local name=$1 - local arch=$(get_android_arch $2) - local api=$3 - case ${arch} in - arm-v7a | arm-v7a-neon) - export CFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - arm64-v8a) - export CFLAGS="-march=armv8-a -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=armv8-a -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - x86) - export CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=i686 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - x86-64) - export CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=x86-64 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - esac -} - -function android_printf_global_params() { - local arch=$1 - local abi=$2 - local abi_triple=$3 - local in_dir=$4 - local out_dir=$5 - echo -e "arch = $arch" - echo -e "abi = $abi" - echo -e "abi_triple = $abi_triple" - echo -e "PLATFORM_TYPE = $PLATFORM_TYPE" - echo -e "ANDROID_API = $ANDROID_API" - echo -e "in_dir = $in_dir" - echo -e "out_dir = $out_dir" - echo -e "AR = $AR" - echo -e "CC = $CC" - echo -e "CXX = $CXX" - echo -e "AS = $AS" - echo -e "LD = $LD" - echo -e "RANLIB = $RANLIB" - echo -e "STRIP = $STRIP" - echo -e "CFLAGS = $CFLAGS" - echo -e "CXXFLAGS = $CXXFLAGS" - echo -e "LDFLAGS = $LDFLAGS" - echo -e "CPPFLAGS = $CPPFLAGS" -} diff --git a/Common/3dParty/openssl/build-android-openssl.sh b/Common/3dParty/openssl/build-android-openssl.sh deleted file mode 100755 index e710b6fb6e..0000000000 --- a/Common/3dParty/openssl/build-android-openssl.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 leenjewel -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# # read -n1 -p "Press any key to continue..." - -set -u - -source ./build-android-common.sh - -init_log_color - -TOOLS_ROOT=$(pwd) - -SOURCE="$0" -while [ -h "$SOURCE" ]; do - DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" -done -pwd_path="$(cd -P "$(dirname "$SOURCE")" && pwd)" - -echo pwd_path=${pwd_path} -echo TOOLS_ROOT=${TOOLS_ROOT} - -# openssl-1.1.0f has a configure bug -# openssl-1.1.1d has fix configure bug -LIB_VERSION="OpenSSL_1_1_1i" -LIB_NAME="openssl-1.1.1i" - -echo "https://www.openssl.org/source/${LIB_NAME}.tar.gz" - -# https://github.com/openssl/openssl/archive/OpenSSL_1_1_1d.tar.gz -# https://github.com/openssl/openssl/archive/OpenSSL_1_1_1f.tar.gz -[ -f "${LIB_NAME}.tar.gz" ] || curl -L -o ${LIB_NAME}.tar.gz https://www.openssl.org/source/${LIB_NAME}.tar.gz -s -[ -f "${LIB_NAME}.tar.gz" ] || log_error "openssl download error!" - -set_android_toolchain_bin - -function configure_make() { - - ARCH=$1 - ABI=$2 - ABI_TRIPLE=$3 - - log_info "configure $ABI start..." - - if [ -d "${LIB_NAME}" ]; then - rm -fr "${LIB_NAME}" - fi - tar xfz "${LIB_NAME}.tar.gz" - pushd . - cd "${LIB_NAME}" - - PREFIX_DIR="${pwd_path}/build/android/${ABI}" - if [ -d "${PREFIX_DIR}" ]; then - rm -fr "${PREFIX_DIR}" - fi - mkdir -p "${PREFIX_DIR}" - - OUTPUT_ROOT=${TOOLS_ROOT}/build/android/${ABI} - mkdir -p ${OUTPUT_ROOT}/log - - set_android_toolchain "openssl" "${ARCH}" "${ANDROID_API}" - set_android_cpu_feature "openssl" "${ARCH}" "${ANDROID_API}" - - export ANDROID_NDK_HOME=${ANDROID_NDK_ROOT} - echo ANDROID_NDK_HOME=${ANDROID_NDK_HOME} - - android_printf_global_params "$ARCH" "$ABI" "$ABI_TRIPLE" "$PREFIX_DIR" "$OUTPUT_ROOT" - - if [[ "${ARCH}" == "x86_64" ]]; then - - ./Configure android-x86_64 --prefix="${PREFIX_DIR}" no-shared no-tests enable-ssl3 enable-ssl3-method enable-md2 no-asm - - elif [[ "${ARCH}" == "x86" ]]; then - - ./Configure android-x86 --prefix="${PREFIX_DIR}" no-shared no-tests enable-ssl3 enable-ssl3-method enable-md2 no-asm - - elif [[ "${ARCH}" == "arm" ]]; then - - ./Configure android-arm --prefix="${PREFIX_DIR}" no-shared no-tests enable-ssl3 enable-ssl3-method enable-md2 no-asm - - elif [[ "${ARCH}" == "arm64" ]]; then - - ./Configure android-arm64 --prefix="${PREFIX_DIR}" no-shared no-tests enable-ssl3 enable-ssl3-method enable-md2 no-asm - - else - log_error "not support" && exit 1 - fi - - log_info "make $ABI start..." - - sed -ie 's/LIB_CFLAGS=/LIB_CFLAGS=-fvisibility=hidden /g' ./Makefile - sed -ie 's/LIB_CXXFLAGS=/LIB_CXXFLAGS=-fvisibility=hidden /g' ./Makefile - - make clean >"${OUTPUT_ROOT}/log/${ABI}.log" - if make -j$(get_cpu_count) >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1; then - make install_sw >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - make install_ssldirs >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - fi - - popd -} - -log_info "${PLATFORM_TYPE} ${LIB_NAME} start..." - -for ((i = 0; i < ${#ARCHS[@]}; i++)); do - if [[ $# -eq 0 || "$1" == "${ARCHS[i]}" ]]; then - configure_make "${ARCHS[i]}" "${ABIS[i]}" "${ABI_TRIPLES[i]}" - fi -done - -log_info "${PLATFORM_TYPE} ${LIB_NAME} end..." From 1a676ace8bdc6ef3894efe39b4ebd977524dad73 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 13 Mar 2024 18:43:13 +0300 Subject: [PATCH 067/117] fix bug #66857 --- Common/OfficeFileFormatChecker2.cpp | 2 +- OOXML/Binary/Sheets/Reader/BinaryWriter.cpp | 2 +- OdfFile/DataTypes/iconset_type.h | 2 +- OdfFile/Reader/Format/calcext_elements.cpp | 2 +- OdfFile/Writer/Format/calcext_elements.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index 1fdb6b6f34..2ee7f1bede 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -299,7 +299,7 @@ bool COfficeFileFormatChecker::isOleObjectFile(POLE::Storage *storage) std::string UserType, ClipboardFormat, Program; POLE::Stream streamCompObject(storage, L"CompObj"); - if (false == streamCompObject.fail()) + if (false == streamCompObject.fail() && streamCompObject.size() >= 28) { streamCompObject.seek(28); // skip Header diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index 073c3f05a0..cbec1638f2 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -5867,7 +5867,7 @@ void BinaryWorksheetTableWriter::WriteOleObjects(const OOX::Spreadsheet::CWorksh } } } - if (pImageFileCache.IsInit() && pOleObject->m_oObjectPr.IsInit() && pOleObject->m_oObjectPr->m_oRid.IsInit()) + if (false == pImageFileCache.IsInit() && pOleObject->m_oObjectPr.IsInit() && pOleObject->m_oObjectPr->m_oRid.IsInit()) { sIdImageFileCache = pOleObject->m_oObjectPr->m_oRid->GetValue(); diff --git a/OdfFile/DataTypes/iconset_type.h b/OdfFile/DataTypes/iconset_type.h index e06745520c..cfee13fb15 100644 --- a/OdfFile/DataTypes/iconset_type.h +++ b/OdfFile/DataTypes/iconset_type.h @@ -60,8 +60,8 @@ public: Arrows5Gray, Quarters5, Rating5, - Stars3, Triangles3, + Stars3, Boxes5 }; diff --git a/OdfFile/Reader/Format/calcext_elements.cpp b/OdfFile/Reader/Format/calcext_elements.cpp index 7460fde492..2eee236ec8 100644 --- a/OdfFile/Reader/Format/calcext_elements.cpp +++ b/OdfFile/Reader/Format/calcext_elements.cpp @@ -238,7 +238,7 @@ void calcext_icon_set::xlsx_convert(oox::xlsx_conversion_context & Context) } } -// calcext_formatting_entry +/// calcext:formatting-entry //--------------------------------------------------------------------------------------------------------- const wchar_t * calcext_formatting_entry::ns = L"calcext"; const wchar_t * calcext_formatting_entry::name = L"formatting-entry"; diff --git a/OdfFile/Writer/Format/calcext_elements.cpp b/OdfFile/Writer/Format/calcext_elements.cpp index 49efa3a4b4..2e2fda1e7a 100644 --- a/OdfFile/Writer/Format/calcext_elements.cpp +++ b/OdfFile/Writer/Format/calcext_elements.cpp @@ -239,7 +239,7 @@ void calcext_icon_set::serialize(std::wostream & _Wostream) } } -// calcext_formatting_entry +// calcext:formatting-entry ////////////////////////////////////////////////////////////////////////////////////////////////// const wchar_t * calcext_formatting_entry::ns = L"calcext"; const wchar_t * calcext_formatting_entry::name = L"formatting-entry"; From 00769d01c12c338a8757a709b58250dd60ae7422 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 14 Mar 2024 11:42:25 +0300 Subject: [PATCH 068/117] Fix bug 66537 --- PdfFile/SrcReader/RendererOutputDev.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PdfFile/SrcReader/RendererOutputDev.cpp b/PdfFile/SrcReader/RendererOutputDev.cpp index e9943ad7bd..552d99bc6f 100644 --- a/PdfFile/SrcReader/RendererOutputDev.cpp +++ b/PdfFile/SrcReader/RendererOutputDev.cpp @@ -1608,7 +1608,7 @@ namespace PdfReader nLen = 0; } } - else if (L"" != wsFileName && (pFont8bit = dynamic_cast(pFont)) && pFont8bit->getHasEncoding()) + else if (L"" != wsFileName && (pFont8bit = dynamic_cast(pFont))) { char **ppEncoding = pFont8bit->getEncoding(); if (!ppEncoding) From 7d15bbc7c28e915b0b857a0a50f44a7a2eb5c9ea Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 14 Mar 2024 12:17:51 +0300 Subject: [PATCH 069/117] Fix build --- DesktopEditor/graphics/pro/js/wasm/src/metafile.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/DesktopEditor/graphics/pro/js/wasm/src/metafile.cpp b/DesktopEditor/graphics/pro/js/wasm/src/metafile.cpp index 2379a2b3e7..cf6435762c 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/metafile.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/metafile.cpp @@ -39,6 +39,7 @@ namespace MetaFile CMetaFile(NSFonts::IApplicationFonts *pAppFonts) : IMetaFile(pAppFonts) {} virtual ~CMetaFile() {} + virtual void SetImageSize(int nWidth, int nHeight) {} virtual bool LoadFromFile(const wchar_t* wsFilePath) { return false; } virtual bool LoadFromBuffer(BYTE* pBuffer, unsigned int unSize) { return false; } virtual bool DrawOnRenderer(IRenderer* pRenderer, double dX, double dY, double dWidth, double dHeight) { return false; } From 08ae2f5d2e41b40676fa02526012487611418b42 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 14 Mar 2024 15:37:38 +0300 Subject: [PATCH 070/117] Fix bug 66721 --- PdfFile/SrcReader/RendererOutputDev.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PdfFile/SrcReader/RendererOutputDev.cpp b/PdfFile/SrcReader/RendererOutputDev.cpp index 552d99bc6f..867f9e20d8 100644 --- a/PdfFile/SrcReader/RendererOutputDev.cpp +++ b/PdfFile/SrcReader/RendererOutputDev.cpp @@ -3945,8 +3945,8 @@ namespace PdfReader pNewTm[1] = pTm[1] * dITextScale * pGState->getHorizScaling(); pNewTm[2] = -pTm[2] * dITextScale; pNewTm[3] = -pTm[3] * dITextScale; - pNewTm[4] = dX; - pNewTm[5] = dY; + pNewTm[4] = dX - dOriginX; + pNewTm[5] = dY - dOriginY; } else { From 94ceab0a03e137561430f3a354513d1b6a80a5a4 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 14 Mar 2024 19:33:07 +0600 Subject: [PATCH 071/117] Add multysheet xti using --- .../XlsFile/Format/Auxiliary/HelpFunc.cpp | 22 +++++++++ .../XlsFile/Format/Auxiliary/HelpFunc.h | 1 + .../Logic/Biff_structures/SyntaxPtg.cpp | 45 +++++++++++++------ OOXML/XlsxFormat/Workbook/Workbook.cpp | 2 +- 4 files changed, 55 insertions(+), 15 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp index 4050d9f541..8659502a69 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp @@ -692,6 +692,28 @@ unsigned short sheetsnames2ixti(std::wstring name) return 0xFFFF; } + unsigned short AddMultysheetXti(const std::wstring& name, const _INT32& firstIxti, const _INT32& secondIxti) + { + auto pos1 = std::find_if(XLS::GlobalWorkbookInfo::arXti_External_static.cbegin(), XLS::GlobalWorkbookInfo::arXti_External_static.cend(), + [&](XLS::GlobalWorkbookInfo::_xti i) { + return i.iSup == firstIxti; + }); + + auto pos2 = std::find_if(XLS::GlobalWorkbookInfo::arXti_External_static.cbegin(), XLS::GlobalWorkbookInfo::arXti_External_static.cend(), + [&](XLS::GlobalWorkbookInfo::_xti i) { + return i.iSup == secondIxti; + }); + if (pos1 == XLS::GlobalWorkbookInfo::arXti_External_static.cend() || pos2 == XLS::GlobalWorkbookInfo::arXti_External_static.cend()) + return 0; + XLS::GlobalWorkbookInfo::_xti newXti; + newXti.iSup = XLS::GlobalWorkbookInfo::arXti_External_static.size(); + newXti.itabFirst = pos1->itabFirst; + newXti.itabFirst = pos1->itabLast; + newXti.link = name; + XLS::GlobalWorkbookInfo::arXti_External_static.push_back(newXti); + return newXti.iSup; + } + unsigned int definenames2index(std::wstring name) { unsigned int index; diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h index a7a06f1e93..f839fa0f1f 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h @@ -96,5 +96,6 @@ unsigned int definenames2index(std::wstring name); bool isTableFmla(const std::wstring& tableName, _UINT32& listIndex); bool isColumn(const std::wstring& columnName, _UINT32 listIndex, _UINT16& indexColumn); unsigned int getColumnsCount(_UINT32 listIndex); +unsigned short AddMultysheetXti(const std::wstring& name, const _INT32& firstIxti, const _INT32& secondIxti); } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index 2511efa6bc..f24f5e7ad2 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -714,22 +714,39 @@ const bool SyntaxPtg::extract_PtgRef(std::wstring::const_iterator& first, std::w const bool SyntaxPtg::extract_3D_part(std::wstring::const_iterator& first, std::wstring::const_iterator last, unsigned short& ixti) { static boost::wregex reg_sheets(L"^([\\w[:Unicode:]][[:Unicode:]\\w\\d.]*(:[\\w[:Unicode:]][[:Unicode:]\\w\\d.]*)?)!"); - static boost::wregex reg_quoted(L"^'((''|[^]['\\/*?])*)'!"); - boost::match_results results; - if (boost::regex_search(first, last, results, reg_sheets) || - boost::regex_search(first, last, results, reg_quoted)) - { + static boost::wregex reg_sheet(L"^([^:]+):(.*)$"); + static boost::wregex reg_quoted(L"^'((''|[^]['\\/*?])*)'!"); + boost::match_results results; + if (boost::regex_search(first, last, results, reg_sheets) || + boost::regex_search(first, last, results, reg_quoted)) + { - std::wstring sheets_names = results.str(1); + std::wstring sheets_names = results.str(1); - ixti = XMLSTUFF::sheetsnames2ixti(boost::algorithm::replace_all_copy(sheets_names, L"''", L"'")); - if(0xFFFF != ixti) - { - first = results[0].second; - return true; - } - } - return false; + ixti = XMLSTUFF::sheetsnames2ixti(boost::algorithm::replace_all_copy(sheets_names, L"''", L"'")); + if(0xFFFF != ixti) + { + first = results[0].second; + return true; + } + boost::match_results results2; + if (boost::regex_search(sheets_names, results2, reg_sheet)) + { + auto firstSheetName = results2.str(1); + auto secondSheetName = results2.str(2); + auto xti1 = XMLSTUFF::sheetsnames2ixti(boost::algorithm::replace_all_copy(firstSheetName, L"''", L"'")); + auto xti2 = XMLSTUFF::sheetsnames2ixti(boost::algorithm::replace_all_copy(secondSheetName, L"''", L"'")); + if(0xFFFF != xti1 && 0xFFFF != xti2) + { + ixti = XMLSTUFF::AddMultysheetXti(sheets_names, xti1, xti2); + if(!ixti) + return false; + first = results[0].second; + return true; + } + } + } + return false; } diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 3c23b8f636..38f7695e6c 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -309,7 +309,7 @@ namespace OOX if (m_oWorkbookProtection.IsInit()) workBookStream->m_BrtBookProtection = m_oWorkbookProtection->toBin(); - workBookStream->m_EXTERNALS = WriteXtiRefs(); + workBookStream->m_EXTERNALS = WriteXtiRefs(); if (m_oExternalReferences.IsInit()) { auto ptr = static_cast(workBookStream->m_EXTERNALS.get()); From c3ef38b1e169e82bceaae17cf0ab4092bd30512e Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 14 Mar 2024 18:53:22 +0300 Subject: [PATCH 072/117] For bug 66933 --- PdfFile/PdfWriter.cpp | 14 +++++++++++--- PdfFile/PdfWriter.h | 2 +- PdfFile/SrcWriter/Document.cpp | 24 ++++++++++++++++++++++++ PdfFile/SrcWriter/Document.h | 18 ++++++++++++++++++ 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/PdfFile/PdfWriter.cpp b/PdfFile/PdfWriter.cpp index 5ff8a24dc3..1e40ee0a51 100644 --- a/PdfFile/PdfWriter.cpp +++ b/PdfFile/PdfWriter.cpp @@ -2666,7 +2666,7 @@ void CPdfWriter::Sign(const double& dX, const double& dY, const double& dW, cons //---------------------------------------------------------------------------------------- // Внутренние функции //---------------------------------------------------------------------------------------- -PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, const BYTE& nAlpha) +PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, BYTE nAlpha) { TColor oColor; int nImageW = abs((int)pImage->GetWidth()); @@ -3041,12 +3041,17 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w if (c_BrushTypeTexture == lBrushType) { std::wstring wsTexturePath = m_oBrush.GetTexturePath(); + BYTE nAlpha = m_oBrush.GetTextureAlpha(); CImageFileFormatChecker oImageFormat(wsTexturePath); PdfWriter::CImageDict* pImage = NULL; int nImageW = 0; int nImageH = 0; - if (_CXIMAGE_FORMAT_JPG == oImageFormat.eFileType || _CXIMAGE_FORMAT_JP2 == oImageFormat.eFileType) + if (m_pDocument->HasImage(wsTexturePath, nAlpha)) + { + pImage = m_pDocument->GetImage(wsTexturePath, nAlpha); + } + else if (_CXIMAGE_FORMAT_JPG == oImageFormat.eFileType || _CXIMAGE_FORMAT_JP2 == oImageFormat.eFileType) { pImage = m_pDocument->CreateImage(); CBgraFrame oFrame; @@ -3060,6 +3065,8 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w pImage->LoadJpeg(wsTexturePath.c_str(), nImageW, nImageH, oFrame.IsGrayScale()); else pImage->LoadJpx(wsTexturePath.c_str(), nImageW, nImageH); + + m_pDocument->AddImage(wsTexturePath, nAlpha, pImage); } } else if (_CXIMAGE_FORMAT_WMF == oImageFormat.eFileType || @@ -3103,6 +3110,7 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w nImageW = abs((int)oImage.GetWidth()); nImageH = abs((int)oImage.GetHeight()); pImage = LoadImage(&oImage, 255); + m_pDocument->AddImage(wsTexturePath, nAlpha, pImage); } else { @@ -3110,11 +3118,11 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w nImageW = abs((int)oImage.GetWidth()); nImageH = abs((int)oImage.GetHeight()); pImage = LoadImage(&oImage, 255); + m_pDocument->AddImage(wsTexturePath, nAlpha, pImage); } if (pImage) { - BYTE nAlpha = m_oBrush.GetTextureAlpha(); if (0xFF != nAlpha) pImage->AddTransparency(nAlpha); diff --git a/PdfFile/PdfWriter.h b/PdfFile/PdfWriter.h index ab64292c35..8d6c48a061 100644 --- a/PdfFile/PdfWriter.h +++ b/PdfFile/PdfWriter.h @@ -221,7 +221,7 @@ public: PdfWriter::CPage* m_pPage; private: - PdfWriter::CImageDict* LoadImage(Aggplus::CImage* pImage, const BYTE& nAlpha); + PdfWriter::CImageDict* LoadImage(Aggplus::CImage* pImage, BYTE nAlpha); bool DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha); bool DrawText(unsigned char* pCodes, const unsigned int& unLen, const double& dX, const double& dY); bool DrawTextToRenderer(const unsigned int* unGid, const unsigned int& unLen, const double& dX, const double& dY); diff --git a/PdfFile/SrcWriter/Document.cpp b/PdfFile/SrcWriter/Document.cpp index 94097d7d41..cfdc7d5bbb 100644 --- a/PdfFile/SrcWriter/Document.cpp +++ b/PdfFile/SrcWriter/Document.cpp @@ -172,6 +172,7 @@ namespace PdfWriter m_vFillAlpha.clear(); m_vStrokeAlpha.clear(); m_vRadioGroups.clear(); + m_vImages.clear(); m_pTransparencyGroup = NULL; @@ -212,6 +213,7 @@ namespace PdfWriter m_vTTFonts.clear(); m_vFreeTypeFonts.clear(); m_vSignatures.clear(); + m_vImages.clear(); if (m_pFreeTypeLibrary) { FT_Done_FreeType(m_pFreeTypeLibrary); @@ -1236,6 +1238,28 @@ namespace PdfWriter return pField; } + bool CDocument::HasImage(const std::wstring& wsImagePath, BYTE nAlpha) + { + for (size_t i = 0, nSize = m_vImages.size(); i < nSize; ++i) + { + if (m_vImages[i].wsImagePath == wsImagePath && m_vImages[i].nAlpha == nAlpha) + return true; + } + return false; + } + CImageDict* CDocument::GetImage(const std::wstring& wsImagePath, BYTE nAlpha) + { + for (size_t i = 0, nSize = m_vImages.size(); i < nSize; ++i) + { + if (m_vImages[i].wsImagePath == wsImagePath && m_vImages[i].nAlpha == nAlpha) + return m_vImages[i].pImage; + } + return NULL; + } + void CDocument::AddImage(const std::wstring& wsImagePath, BYTE nAlpha, CImageDict* pImage) + { + m_vImages.push_back({wsImagePath, nAlpha, pImage}); + } bool CDocument::CheckFieldName(CFieldBase* pField, const std::string& sName) { CFieldBase* pBase = m_mFields[sName]; diff --git a/PdfFile/SrcWriter/Document.h b/PdfFile/SrcWriter/Document.h index f8a1dbead2..464b90b357 100644 --- a/PdfFile/SrcWriter/Document.h +++ b/PdfFile/SrcWriter/Document.h @@ -178,6 +178,10 @@ namespace PdfWriter CSignatureField* CreateSignatureField(); CDateTimeField* CreateDateTimeField(); bool CheckFieldName(CFieldBase* pField, const std::string& sName); + + bool HasImage(const std::wstring& wsImagePath, BYTE nAlpha); + CImageDict* GetImage(const std::wstring& wsImagePath, BYTE nAlpha); + void AddImage(const std::wstring& wsImagePath, BYTE nAlpha, CImageDict* pImage); bool CreatePageTree(CXref* pXref, CPageTree* pPageTree); bool EditPdf(const std::wstring& wsPath, int nPosLastXRef, int nSizeXRef, CXref* pXref, CCatalog* pCatalog, CEncryptDict* pEncrypt, int nFormField); @@ -245,6 +249,19 @@ namespace PdfWriter CImageDict* pImage; ICertificate* pCertificate; }; + struct TImageInfo + { + TImageInfo(const std::wstring& _wsImagePath, BYTE _nAlpha, CImageDict* _pImage) + { + wsImagePath = _wsImagePath; + nAlpha = _nAlpha; + pImage = _pImage; + } + + std::wstring wsImagePath; + BYTE nAlpha; + CImageDict* pImage; + }; CCatalog* m_pCatalog; COutline* m_pOutlines; @@ -260,6 +277,7 @@ namespace PdfWriter bool m_bEncrypt; CEncryptDict* m_pEncryptDict; std::vector m_vSignatures; + std::vector m_vImages; unsigned int m_unFormFields; unsigned int m_unCompressMode; std::vector m_vExtGrStates; From a684336b7205753fb30aac240a16865708704e6c Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Thu, 14 Mar 2024 20:06:20 +0300 Subject: [PATCH 073/117] Fix build --- Common/3dParty/boost/boost.pri | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Common/3dParty/boost/boost.pri b/Common/3dParty/boost/boost.pri index dcc0e87b70..919b60a42b 100644 --- a/Common/3dParty/boost/boost.pri +++ b/Common/3dParty/boost/boost.pri @@ -10,6 +10,11 @@ core_android { QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion } +core_ios { + QMAKE_CFLAGS += -Wno-enum-constexpr-conversion + QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion +} + bundle_xcframeworks { xcframework_platform_ios_simulator { CORE_BOOST_LIBS = $$PWD/build/ios_xcframework/ios_simulator/lib/$$CORE_BUILDS_PLATFORM_PREFIX From 933741ca88d65ee11e9d6138d733bb29b55dde95 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Fri, 15 Mar 2024 12:12:53 +0300 Subject: [PATCH 074/117] Fix ios build --- Common/3dParty/boost/boost.pri | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Common/3dParty/boost/boost.pri b/Common/3dParty/boost/boost.pri index dcc0e87b70..919b60a42b 100644 --- a/Common/3dParty/boost/boost.pri +++ b/Common/3dParty/boost/boost.pri @@ -10,6 +10,11 @@ core_android { QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion } +core_ios { + QMAKE_CFLAGS += -Wno-enum-constexpr-conversion + QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion +} + bundle_xcframeworks { xcframework_platform_ios_simulator { CORE_BOOST_LIBS = $$PWD/build/ios_xcframework/ios_simulator/lib/$$CORE_BUILDS_PLATFORM_PREFIX From f682f5148105762523431972f6e4eaf3c2246f32 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Fri, 15 Mar 2024 12:17:11 +0300 Subject: [PATCH 075/117] Fix bug 66933 --- PdfFile/PdfWriter.cpp | 20 ++++++++++++++++---- PdfFile/PdfWriter.h | 2 +- PdfFile/PdfWriter_empty.cpp | 4 ++-- PdfFile/SrcWriter/Document.cpp | 2 ++ PdfFile/lib/xpdf/Stream.cc | 2 +- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/PdfFile/PdfWriter.cpp b/PdfFile/PdfWriter.cpp index 1e40ee0a51..d069ee202e 100644 --- a/PdfFile/PdfWriter.cpp +++ b/PdfFile/PdfWriter.cpp @@ -1027,6 +1027,16 @@ HRESULT CPdfWriter::DrawImageFromFile(NSFonts::IApplicationFonts* pAppFonts, con if (!IsPageValid()) return S_OK; + if (m_pDocument->HasImage(wsImagePathSrc, nAlpha)) + { + PdfWriter::CImageDict* pPdfImage = m_pDocument->GetImage(wsImagePathSrc, nAlpha); + m_pPage->GrSave(); + UpdateTransform(); + m_pPage->DrawImage(pPdfImage, MM_2_PT(dX), MM_2_PT(m_dPageHeight - dY - dH), MM_2_PT(dW), MM_2_PT(dH)); + m_pPage->GrRestore(); + return S_OK; + } + std::wstring sTempImagePath = GetDownloadFile(wsImagePathSrc, wsTempDirectory); std::wstring wsImagePath = sTempImagePath.empty() ? wsImagePathSrc : sTempImagePath; @@ -1057,8 +1067,10 @@ HRESULT CPdfWriter::DrawImageFromFile(NSFonts::IApplicationFonts* pAppFonts, con } HRESULT hRes = S_OK; - if (!pAggImage || !DrawImage(pAggImage, dX, dY, dW, dH, nAlpha)) + PdfWriter::CImageDict* pPdfImage = NULL; + if (!pAggImage || !(pPdfImage = DrawImage(pAggImage, dX, dY, dW, dH, nAlpha))) hRes = S_FALSE; + m_pDocument->AddImage(wsImagePathSrc, nAlpha, pPdfImage); if (NSFile::CFileBinary::Exists(sTempImagePath)) NSFile::CFileBinary::Remove(sTempImagePath); @@ -2761,18 +2773,18 @@ PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, BYTE nAlph return pPdfImage; } -bool CPdfWriter::DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha) +PdfWriter::CImageDict* CPdfWriter::DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha) { PdfWriter::CImageDict* pPdfImage = LoadImage(pImage, nAlpha); if (!pPdfImage) - return false; + return NULL; m_pPage->GrSave(); UpdateTransform(); m_pPage->DrawImage(pPdfImage, MM_2_PT(dX), MM_2_PT(m_dPageHeight - dY - dH), MM_2_PT(dW), MM_2_PT(dH)); m_pPage->GrRestore(); - return true; + return pPdfImage; } bool CPdfWriter::DrawText(unsigned char* pCodes, const unsigned int& unLen, const double& dX, const double& dY) { diff --git a/PdfFile/PdfWriter.h b/PdfFile/PdfWriter.h index 8d6c48a061..22da5bb145 100644 --- a/PdfFile/PdfWriter.h +++ b/PdfFile/PdfWriter.h @@ -222,7 +222,7 @@ public: private: PdfWriter::CImageDict* LoadImage(Aggplus::CImage* pImage, BYTE nAlpha); - bool DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha); + PdfWriter::CImageDict* DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha); bool DrawText(unsigned char* pCodes, const unsigned int& unLen, const double& dX, const double& dY); bool DrawTextToRenderer(const unsigned int* unGid, const unsigned int& unLen, const double& dX, const double& dY); bool PathCommandDrawText(unsigned int* pUnicodes, unsigned int unLen, const double& dX, const double& dY, const unsigned int* pGids = NULL); diff --git a/PdfFile/PdfWriter_empty.cpp b/PdfFile/PdfWriter_empty.cpp index 0552f1f71d..3060af7bb4 100644 --- a/PdfFile/PdfWriter_empty.cpp +++ b/PdfFile/PdfWriter_empty.cpp @@ -143,8 +143,8 @@ bool CPdfWriter::AddPage(int nPageIndex) { return false; } bool CPdfWriter::EditClose() { return false; } void CPdfWriter::PageRotate(int nRotate) {} void CPdfWriter::Sign(const double& dX, const double& dY, const double& dW, const double& dH, const std::wstring& wsPicturePath, ICertificate* pCertificate) {} -PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, const BYTE& nAlpha) { return NULL; } -bool CPdfWriter::DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha) { return false; } +PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, BYTE nAlpha) { return NULL; } +PdfWriter::CImageDict* CPdfWriter::DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha) { return NULL; } bool CPdfWriter::DrawText(unsigned char* pCodes, const unsigned int& unLen, const double& dX, const double& dY) { return false; } bool CPdfWriter::DrawTextToRenderer(const unsigned int* unGid, const unsigned int& unLen, const double& dX, const double& dY) { return false; } bool CPdfWriter::PathCommandDrawText(unsigned int* pUnicodes, unsigned int unLen, const double& dX, const double& dY, const unsigned int* pGids) { return false; } diff --git a/PdfFile/SrcWriter/Document.cpp b/PdfFile/SrcWriter/Document.cpp index cfdc7d5bbb..8277f5c4eb 100644 --- a/PdfFile/SrcWriter/Document.cpp +++ b/PdfFile/SrcWriter/Document.cpp @@ -1258,6 +1258,8 @@ namespace PdfWriter } void CDocument::AddImage(const std::wstring& wsImagePath, BYTE nAlpha, CImageDict* pImage) { + if (!pImage) + return; m_vImages.push_back({wsImagePath, nAlpha, pImage}); } bool CDocument::CheckFieldName(CFieldBase* pField, const std::string& sName) diff --git a/PdfFile/lib/xpdf/Stream.cc b/PdfFile/lib/xpdf/Stream.cc index 0d2d284bb5..5a7b0eefd0 100644 --- a/PdfFile/lib/xpdf/Stream.cc +++ b/PdfFile/lib/xpdf/Stream.cc @@ -5252,7 +5252,7 @@ void FlateStream::readSome() { totalOut += remain; // check for a 'decompression bomb' - if (totalOut > 50000000 && totalIn < totalOut / 250) { + if (totalOut > 100000000 && totalIn < totalOut / 250) { error(errSyntaxError, getPos(), "Decompression bomb in flate stream"); endOfBlock = eof = gTrue; remain = 0; From d0adabc5f7ee99de8cf6a817e5560aece3a80aa5 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Fri, 15 Mar 2024 17:04:33 +0500 Subject: [PATCH 076/117] Fix bug #66795 --- OdfFile/Reader/Format/draw_frame_pptx.cpp | 15 +++++++++++++++ OdfFile/Writer/Format/odf_drawing_context.cpp | 9 ++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 55df515d82..47831d9ec9 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -197,6 +197,21 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) Context.root()->odf_context().styleContainer().style_by_name(textStyleName, odf_types::style_family::Paragraph, Context.process_masters_); paragraph_format_properties paragraph_properties = calc_paragraph_properties_content(textStyleInst); + + if (paragraph_properties.style_writing_mode_) + { + const odf_types::writing_mode& mode = *paragraph_properties.style_writing_mode_; + if (mode.get_type() == odf_types::writing_mode::TbRl) + { + _property vert = _property(L"text_vert", 1); + Context.get_slide_context().set_property(vert); + } + else if (mode.get_type() == odf_types::writing_mode::TbLr) + { + _property vert270 = _property(L"text_vert", 2); + Context.get_slide_context().set_property(vert270); + } + } } if (office_event_listeners_) office_event_listeners_->pptx_convert(Context); diff --git a/OdfFile/Writer/Format/odf_drawing_context.cpp b/OdfFile/Writer/Format/odf_drawing_context.cpp index ead1b31063..adc1d3b981 100644 --- a/OdfFile/Writer/Format/odf_drawing_context.cpp +++ b/OdfFile/Writer/Format/odf_drawing_context.cpp @@ -2761,12 +2761,13 @@ void odf_drawing_context::set_textarea_writing_mode(int mode) { switch(mode) { + case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст + paragraph_properties->style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbLr); + break; case 5://textverticaltypeWordArtVert: case 6://textverticaltypeWordArtVertRtl: - case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст case 3://SimpleTypes::textverticaltypeVert: case 2://SimpleTypes::textverticaltypeMongolianVert: - paragraph_properties->style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl); break; case 0://SimpleTypes::textverticaltypeEaVert: @@ -2782,9 +2783,11 @@ void odf_drawing_context::set_textarea_writing_mode(int mode) { switch(mode) { + case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст + impl_->current_paragraph_properties->style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbLr); + break; case 5://textverticaltypeWordArtVert: case 6://textverticaltypeWordArtVertRtl: - case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст case 3://SimpleTypes::textverticaltypeVert: case 2://SimpleTypes::textverticaltypeMongolianVert: impl_->current_paragraph_properties->style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl); From 1a92ec57e1b46703ca9a4f5084eb108ea7557061 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 15 Mar 2024 18:09:36 +0600 Subject: [PATCH 077/117] Fix multisheet reference conversion --- MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp | 2 +- .../Format/Logic/Biff_structures/StringPtgParser.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp index 8659502a69..49cd1496ec 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp @@ -708,7 +708,7 @@ unsigned short sheetsnames2ixti(std::wstring name) XLS::GlobalWorkbookInfo::_xti newXti; newXti.iSup = XLS::GlobalWorkbookInfo::arXti_External_static.size(); newXti.itabFirst = pos1->itabFirst; - newXti.itabFirst = pos1->itabLast; + newXti.itabLast = pos2->itabFirst; newXti.link = name; XLS::GlobalWorkbookInfo::arXti_External_static.push_back(newXti); return newXti.iSup; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 14d55c2e1e..1f3544d4d8 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -307,7 +307,14 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else if(SyntaxPtg::extract_PtgRef(it, itEnd, operand_str)) { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgRef3d(ixti, operand_str, OperandPtg::ptg_VALUE, rgce.getLocation()))); + auto pos = std::find_if(XLS::GlobalWorkbookInfo::arXti_External_static.cbegin(), XLS::GlobalWorkbookInfo::arXti_External_static.cend(), + [&](XLS::GlobalWorkbookInfo::_xti i) { + return i.iSup == ixti; + }); + if(pos->itabFirst == pos->itabLast) + rgce.addPtg(found_operand = OperandPtgPtr(new PtgRef3d(ixti, operand_str, OperandPtg::ptg_VALUE, rgce.getLocation()))); + else + rgce.addPtg(found_operand = OperandPtgPtr(new PtgRef3d(ixti, operand_str, OperandPtg::ptg_REFERENCE, rgce.getLocation()))); } else if(SyntaxPtg::extract_PtgRefErr(it, itEnd)) { From e53416e934ebb8eed38bd308c96db7ed94049b8a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 15 Mar 2024 18:10:58 +0600 Subject: [PATCH 078/117] Add worksheet write before another parts --- OOXML/XlsbFormat/Xlsb.cpp | 16 ++++++++++++++++ OOXML/XlsbFormat/Xlsb.h | 1 + X2tConverter/src/lib/xlsx.h | 2 ++ 3 files changed, 19 insertions(+) diff --git a/OOXML/XlsbFormat/Xlsb.cpp b/OOXML/XlsbFormat/Xlsb.cpp index 74a9c26ce7..2a511c3f05 100644 --- a/OOXML/XlsbFormat/Xlsb.cpp +++ b/OOXML/XlsbFormat/Xlsb.cpp @@ -122,6 +122,22 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oFilePath, XLS::BaseObject* return true; } +void OOX::Spreadsheet::CXlsb::WriteSheetData() +{ + for(auto &worksheet : m_arWorksheets) + { + + //для оптимизации по памяти сразу записываем в файл все листы + if(m_bWriteToXlsb) + { + WriteSheet(worksheet); + }// + + //cell_table_temlate.reset(); + //reader.reset(); + } +} + XLS::GlobalWorkbookInfo* OOX::Spreadsheet::CXlsb::GetGlobalinfo() { return xls_global_info.get(); diff --git a/OOXML/XlsbFormat/Xlsb.h b/OOXML/XlsbFormat/Xlsb.h index 065dc60d28..40a8689541 100644 --- a/OOXML/XlsbFormat/Xlsb.h +++ b/OOXML/XlsbFormat/Xlsb.h @@ -70,6 +70,7 @@ namespace OOX void PrepareSi(); void PrepareTableFormula(); void ReadSheetData(); + void WriteSheetData(); void SetPropForWriteSheet(const std::wstring &sPath, OOX::CContentTypes& oContentTypes); void WriteSheet(CWorksheet* worksheet); diff --git a/X2tConverter/src/lib/xlsx.h b/X2tConverter/src/lib/xlsx.h index fdd8a159e7..f2c96a298f 100644 --- a/X2tConverter/src/lib/xlsx.h +++ b/X2tConverter/src/lib/xlsx.h @@ -166,6 +166,8 @@ namespace NExtractTools oXlsb.Read(oox_path); OOX::CContentTypes oContentTypes; + oXlsb.SetPropForWriteSheet(sTo, oContentTypes); + oXlsb.WriteSheetData(); _UINT32 nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; return nRes; From 4364f95fb6f8394cde58a7213674b9b89f4e959c Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Fri, 15 Mar 2024 16:30:12 +0300 Subject: [PATCH 079/117] Fix bug 66947 --- PdfFile/lib/xpdf/XRef.cc | 10 +++++++--- PdfFile/lib/xpdf/XRef.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/PdfFile/lib/xpdf/XRef.cc b/PdfFile/lib/xpdf/XRef.cc index 3b0f2fe998..1b2721be13 100644 --- a/PdfFile/lib/xpdf/XRef.cc +++ b/PdfFile/lib/xpdf/XRef.cc @@ -946,6 +946,7 @@ GBool XRef::constructXRef() { } // read each stream object, check for xref or object stream + GBool bRoot = gFalse; for (int i = 0; i < streamObjNumsLen; ++i) { Object obj; fetch(streamObjNums[i], entries[streamObjNums[i]].gen, &obj); @@ -953,8 +954,8 @@ GBool XRef::constructXRef() { Dict *dict = obj.streamGetDict(); Object type; dict->lookup("Type", &type); - if (type.isName("XRef")) { - saveTrailerDict(dict, gTrue); + if (type.isName("XRef") && !bRoot) { + bRoot = saveTrailerDict(dict, gTrue); } else if (type.isName("ObjStm")) { constructObjectStreamEntries(&obj, streamObjNums[i]); } @@ -991,7 +992,8 @@ void XRef::constructTrailerDict(GFileOffset pos) { // If [dict] "looks like" a trailer dict (i.e., has a Root entry), // save it as the trailer dict. -void XRef::saveTrailerDict(Dict *dict, GBool isXRefStream) { +GBool XRef::saveTrailerDict(Dict *dict, GBool isXRefStream) { + GBool bRes = gFalse; Object obj; dict->lookupNF("Root", &obj); if (obj.isRef()) { @@ -1005,9 +1007,11 @@ void XRef::saveTrailerDict(Dict *dict, GBool isXRefStream) { trailerDict.free(); } trailerDict.initDict(dict); + bRes = gTrue; } } obj.free(); + return bRes; } // Look for an object header ("nnn ggg obj") at [p]. The first diff --git a/PdfFile/lib/xpdf/XRef.h b/PdfFile/lib/xpdf/XRef.h index 9eb93eb396..3ea5ba7a39 100644 --- a/PdfFile/lib/xpdf/XRef.h +++ b/PdfFile/lib/xpdf/XRef.h @@ -174,7 +174,7 @@ private: GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n); GBool constructXRef(); void constructTrailerDict(GFileOffset pos); - void saveTrailerDict(Dict *dict, GBool isXRefStream); + GBool saveTrailerDict(Dict *dict, GBool isXRefStream); char *constructObjectEntry(char *p, GFileOffset pos, int *objNum); void constructObjectStreamEntries(Object *objStr, int objStrObjNum); GBool constructXRefEntry(int num, int gen, GFileOffset pos, From be0c6b13e75718743db5301bb6f455624745f30f Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 15 Mar 2024 17:56:17 +0400 Subject: [PATCH 080/117] Strings unify --- DesktopEditor/doctrenderer/json/json.cpp | 13 ++++------ DesktopEditor/doctrenderer/json/json.h | 6 +---- .../doctrenderer/json/json_values.cpp | 17 ++++++++++++ .../doctrenderer/json/serialization.h | 8 ++---- DesktopEditor/doctrenderer/test/json/main.cpp | 26 +++++-------------- 5 files changed, 31 insertions(+), 39 deletions(-) diff --git a/DesktopEditor/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index 4639bab11a..88b4825f60 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -66,16 +66,13 @@ namespace NSJSON static_cast(m_internal->m_value.get())->isDouble()); } - bool IValue::IsStringA() const + bool IValue::IsString() const { - return (m_internal->m_type == CTypedValue::vtPrimitive && - static_cast(m_internal->m_value.get())->isStringA()); - } + if (m_internal->m_type != CTypedValue::vtPrimitive) + return false; - bool IValue::IsStringW() const - { - return (m_internal->m_type == CTypedValue::vtPrimitive && - static_cast(m_internal->m_value.get())->isStringW()); + CPrimitive* pPrimitive = static_cast(m_internal->m_value.get()); + return (pPrimitive->isStringA() || pPrimitive->isStringW()); } bool IValue::IsArray() const diff --git a/DesktopEditor/doctrenderer/json/json.h b/DesktopEditor/doctrenderer/json/json.h index e2de0b4e43..179fb2b3a5 100644 --- a/DesktopEditor/doctrenderer/json/json.h +++ b/DesktopEditor/doctrenderer/json/json.h @@ -73,11 +73,7 @@ namespace NSJSON /** * Returns true if the value is a string. */ - bool IsStringA() const; - /** - * Returns true if the value is a wstring. - */ - bool IsStringW() const; + bool IsString() const; /** * Returns true if the value is an array. */ diff --git a/DesktopEditor/doctrenderer/json/json_values.cpp b/DesktopEditor/doctrenderer/json/json_values.cpp index 8b15705622..d0d7b27d4a 100644 --- a/DesktopEditor/doctrenderer/json/json_values.cpp +++ b/DesktopEditor/doctrenderer/json/json_values.cpp @@ -1,5 +1,8 @@ #include "json_values.h" +#include +#include + namespace NSJSON { IBaseValue::IBaseValue() @@ -113,6 +116,13 @@ namespace NSJSON { if (m_type == ptStringA) return m_string; + + if (m_type == ptStringW) + { + std::wstring_convert> converter; + return std::string(converter.to_bytes(m_wstring)); + } + #ifdef JSON_DEBUG throw std::bad_cast(); #endif @@ -123,6 +133,13 @@ namespace NSJSON { if (m_type == ptStringW) return m_wstring; + + if (m_type == ptStringA) + { + std::wstring_convert> converter; + return std::wstring(converter.from_bytes(m_string)); + } + #ifdef JSON_DEBUG throw std::bad_cast(); #endif diff --git a/DesktopEditor/doctrenderer/json/serialization.h b/DesktopEditor/doctrenderer/json/serialization.h index 844d625633..d7a8a11f38 100644 --- a/DesktopEditor/doctrenderer/json/serialization.h +++ b/DesktopEditor/doctrenderer/json/serialization.h @@ -29,13 +29,9 @@ namespace NSJSON { ret = NSJSBase::CJSContext::createDouble((double)value); } - else if (value.IsStringA()) + else if (value.IsString()) { - ret = NSJSBase::CJSContext::createString((std::string)value); - } - else if (value.IsStringW()) - { - ret = NSJSBase::CJSContext::createString((std::wstring)value); + ret = NSJSBase::CJSContext::createString(value.ToStringA()); } // arrays else if (value.IsArray()) diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index e527566b62..2a1661fbd6 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -180,32 +180,18 @@ public: return false; } } - else if (value.IsStringA()) - { - if (makeExpects) - EXPECT_TRUE(jsValue->isString()); - if (!jsValue->isString()) - return false; - - std::string val = value.ToStringA(); - std::string jsVal = jsValue->toStringA(); - if (makeExpects) - EXPECT_EQ(val, jsVal); - if (val != jsVal) - return false; - } else { if (makeExpects) { - EXPECT_TRUE(value.IsStringW()); + EXPECT_TRUE(value.IsString()); EXPECT_TRUE(jsValue->isString()); } if (!jsValue->isString()) return false; - std::wstring val = value.ToStringW(); - std::wstring jsVal = jsValue->toStringW(); + std::string val = value.ToStringA(); + std::string jsVal = jsValue->toStringA(); if (makeExpects) EXPECT_EQ(val, jsVal); if (val != jsVal) @@ -569,10 +555,10 @@ TEST_F(CJSONTest, wrong_usage) EXPECT_EQ((bool)val, false); EXPECT_EQ((int)val, 0); EXPECT_EQ((double)val, 0.0); - EXPECT_EQ((std::wstring)val, L""); + EXPECT_EQ((std::wstring)val, L"test"); #endif - val = L"тест"; + val = L"test"; #ifdef JSON_DEBUG EXPECT_THROW((bool)val, std::bad_cast); EXPECT_THROW((int)val, std::bad_cast); @@ -582,7 +568,7 @@ TEST_F(CJSONTest, wrong_usage) EXPECT_EQ((bool)val, false); EXPECT_EQ((int)val, 0); EXPECT_EQ((double)val, 0.0); - EXPECT_EQ((std::string)val, ""); + EXPECT_EQ((std::string)val, "test"); #endif val = CValue::CreateObject(); From b2c8696d1da85c7520c8ac284c46bd6d66e8d2e0 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 15 Mar 2024 18:16:58 +0400 Subject: [PATCH 081/117] Change strings conversion function --- DesktopEditor/doctrenderer/json/json_values.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/DesktopEditor/doctrenderer/json/json_values.cpp b/DesktopEditor/doctrenderer/json/json_values.cpp index d0d7b27d4a..049ef75531 100644 --- a/DesktopEditor/doctrenderer/json/json_values.cpp +++ b/DesktopEditor/doctrenderer/json/json_values.cpp @@ -1,7 +1,7 @@ #include "json_values.h" -#include -#include +// for string <=> wstring conversion +#include "../../common/File.h" namespace NSJSON { @@ -119,8 +119,7 @@ namespace NSJSON if (m_type == ptStringW) { - std::wstring_convert> converter; - return std::string(converter.to_bytes(m_wstring)); + return U_TO_UTF8(m_wstring); } #ifdef JSON_DEBUG @@ -136,8 +135,7 @@ namespace NSJSON if (m_type == ptStringA) { - std::wstring_convert> converter; - return std::wstring(converter.from_bytes(m_string)); + return UTF8_TO_U(m_string); } #ifdef JSON_DEBUG From ce9d61a3aaf1e0c32b8a5ff684036bf4e42cb655 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 15 Mar 2024 18:31:42 +0400 Subject: [PATCH 082/117] Fixed json test --- DesktopEditor/doctrenderer/test/json/main.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index 2a1661fbd6..021e7341d9 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -550,26 +550,24 @@ TEST_F(CJSONTest, wrong_usage) EXPECT_THROW((bool)val, std::bad_cast); EXPECT_THROW((int)val, std::bad_cast); EXPECT_THROW((double)val, std::bad_cast); - EXPECT_THROW((std::wstring)val, std::bad_cast); #else EXPECT_EQ((bool)val, false); EXPECT_EQ((int)val, 0); EXPECT_EQ((double)val, 0.0); - EXPECT_EQ((std::wstring)val, L"test"); #endif + EXPECT_EQ((std::wstring)val, L"test"); val = L"test"; #ifdef JSON_DEBUG EXPECT_THROW((bool)val, std::bad_cast); EXPECT_THROW((int)val, std::bad_cast); EXPECT_THROW((double)val, std::bad_cast); - EXPECT_THROW((std::string)val, std::bad_cast); #else EXPECT_EQ((bool)val, false); EXPECT_EQ((int)val, 0); EXPECT_EQ((double)val, 0.0); - EXPECT_EQ((std::string)val, "test"); #endif + EXPECT_EQ((std::string)val, "test"); val = CValue::CreateObject(); #ifdef JSON_DEBUG From b20e29daaf711d5642a5bbfc9e113f00488edc8d Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Sun, 17 Mar 2024 09:24:24 +0300 Subject: [PATCH 083/117] fix bug #66960 --- OdfFile/Writer/Converter/ConvertDrawing.cpp | 4 +-- OdfFile/Writer/Converter/ConvertVml.cpp | 4 +-- OdfFile/Writer/Converter/DocxConverter.cpp | 4 +-- OdfFile/Writer/Converter/XlsxConverter.cpp | 4 +-- .../Writer/Format/odf_conversion_context.cpp | 30 ++++++++++++++----- .../Writer/Format/odf_conversion_context.h | 4 +-- 6 files changed, 32 insertions(+), 18 deletions(-) diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 7f9ee702cb..3965a23bd7 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -397,7 +397,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) { pathOle = find_link_by_id(oox_picture->oleObject->m_oId->get(), 4, bExternal); } - std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle); + std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle, bExternal); if (!odf_ref_ole.empty()) { @@ -442,7 +442,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) } - odf_ref_image = bExternal ? pathImage : odf_context()->add_imageobject(pathImage); + odf_ref_image = odf_context()->add_imageobject(pathImage, bExternal); odf_context()->drawing_context()->set_image_replacement(odf_ref_image); odf_context()->drawing_context()->end_object_ole(); diff --git a/OdfFile/Writer/Converter/ConvertVml.cpp b/OdfFile/Writer/Converter/ConvertVml.cpp index de66957c09..3fd42d093f 100644 --- a/OdfFile/Writer/Converter/ConvertVml.cpp +++ b/OdfFile/Writer/Converter/ConvertVml.cpp @@ -332,7 +332,7 @@ namespace Oox2Odf { pathOle = find_link_by_id(vml_object->m_oId->GetValue(), 4, bExternal); } - std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle); + std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle, bExternal); if (!odf_ref_ole.empty()) { @@ -345,7 +345,7 @@ namespace Oox2Odf std::wstring sIdImageFileCache = GetImageIdFromVmlShape(vml_shape); std::wstring pathImage = find_link_by_id(sIdImageFileCache, 1, bExternal); - std::wstring odf_ref_image = odf_context()->add_imageobject(pathImage); + std::wstring odf_ref_image = odf_context()->add_imageobject(pathImage, bExternal); odf_context()->drawing_context()->set_image_replacement(odf_ref_image); diff --git a/OdfFile/Writer/Converter/DocxConverter.cpp b/OdfFile/Writer/Converter/DocxConverter.cpp index 7bceddb829..8f349f14d6 100644 --- a/OdfFile/Writer/Converter/DocxConverter.cpp +++ b/OdfFile/Writer/Converter/DocxConverter.cpp @@ -3143,7 +3143,7 @@ void DocxConverter::convert(OOX::Logic::CObject* oox_obj) { pathOle = find_link_by_id(oox_obj->m_oOleObject->m_oId->GetValue(), 4, bExternal); } - std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle); + std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle, bExternal); if (!odf_ref_ole.empty()) { @@ -3156,7 +3156,7 @@ void DocxConverter::convert(OOX::Logic::CObject* oox_obj) std::wstring sIdImageFileCache = GetImageIdFromVmlShape(oox_obj->m_oShape.GetPointer()); std::wstring pathImage = find_link_by_id(sIdImageFileCache, 1, bExternal); - std::wstring odf_ref_image = odf_context()->add_imageobject(pathImage); + std::wstring odf_ref_image = odf_context()->add_imageobject(pathImage, bExternal); OoxConverter::convert(oox_obj->m_oShape.GetPointer(), NULL); odf_context()->drawing_context()->set_image_replacement(odf_ref_image); diff --git a/OdfFile/Writer/Converter/XlsxConverter.cpp b/OdfFile/Writer/Converter/XlsxConverter.cpp index fee7de8d10..893a2abb37 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.cpp +++ b/OdfFile/Writer/Converter/XlsxConverter.cpp @@ -2962,7 +2962,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::COleObjects *oox_objects, OOX::Spr std::wstring pathOle = find_link_by_id(sID, 4, bExternal); - odf_ref_object = odf_context()->add_oleobject(pathOle); + odf_ref_object = odf_context()->add_oleobject(pathOle, bExternal); } if ((object->m_oObjectPr.IsInit()) && (object->m_oObjectPr->m_oRid.IsInit())) { @@ -2970,7 +2970,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::COleObjects *oox_objects, OOX::Spr std::wstring pathImage = find_link_by_id(sID, 1, bExternal); - odf_ref_image = odf_context()->add_imageobject(pathImage); + odf_ref_image = odf_context()->add_imageobject(pathImage, bExternal); } //-------------------------------------------------------------------------------------------------- if ((!bAnchor || odf_ref_image.empty()) && object->m_oShapeId.IsInit()) diff --git a/OdfFile/Writer/Format/odf_conversion_context.cpp b/OdfFile/Writer/Format/odf_conversion_context.cpp index 3415af65cb..849724ada1 100644 --- a/OdfFile/Writer/Format/odf_conversion_context.cpp +++ b/OdfFile/Writer/Format/odf_conversion_context.cpp @@ -565,23 +565,37 @@ std::wstring odf_conversion_context::add_media(const std::wstring & file_name, b return odf_ref_name; } } -std::wstring odf_conversion_context::add_imageobject(const std::wstring & file_name) +std::wstring odf_conversion_context::add_imageobject(const std::wstring & file_name, bool bExternal) { if (file_name.empty()) return L""; - std::wstring odf_ref_name ; - mediaitems()->add_or_find(file_name,_mediaitems::typeObjectReplacement, odf_ref_name); + if (bExternal) + { + return file_name; + } + else + { + std::wstring odf_ref_name; + mediaitems()->add_or_find(file_name, _mediaitems::typeObjectReplacement, odf_ref_name); - return odf_ref_name; + return odf_ref_name; + } } -std::wstring odf_conversion_context::add_oleobject(const std::wstring & file_name) +std::wstring odf_conversion_context::add_oleobject(const std::wstring & file_name, bool bExternal) { if (file_name.empty()) return L""; - std::wstring odf_ref_name ; - mediaitems()->add_or_find(file_name,_mediaitems::typeOleObject, odf_ref_name); + if (bExternal) + { + return file_name; + } + else + { + std::wstring odf_ref_name; + mediaitems()->add_or_find(file_name, _mediaitems::typeOleObject, odf_ref_name); - return odf_ref_name; + return odf_ref_name; + } } void odf_conversion_context::add_tab(_CP_OPT(int) type, _CP_OPT(length) _length, _CP_OPT(int) leader) { diff --git a/OdfFile/Writer/Format/odf_conversion_context.h b/OdfFile/Writer/Format/odf_conversion_context.h index 1a163f5e48..c16098f3c5 100644 --- a/OdfFile/Writer/Format/odf_conversion_context.h +++ b/OdfFile/Writer/Format/odf_conversion_context.h @@ -123,8 +123,8 @@ public: std::wstring add_image (const std::wstring & image_file_name, bool bExternal = false); std::wstring add_media (const std::wstring & file_name, bool bExternal = false); - std::wstring add_oleobject (const std::wstring & ole_file_name); - std::wstring add_imageobject(const std::wstring & ole_file_name); + std::wstring add_oleobject (const std::wstring & ole_file_name, bool bExternal = false); + std::wstring add_imageobject(const std::wstring & ole_file_name, bool bExternal = false); void add_meta(const std::wstring & ns, const std::wstring & name, const std::wstring & content); From 88008a9e7efbb063dd2a60a93d093d22e604821b Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Sun, 17 Mar 2024 11:34:53 +0300 Subject: [PATCH 084/117] fix bug #66959 --- OdfFile/Reader/Converter/mediaitems.cpp | 1 + OdfFile/Reader/Format/draw_frame_docx.cpp | 45 +++++++++++++++-------- OdfFile/Reader/Format/draw_frame_pptx.cpp | 27 +++++++++----- OdfFile/Reader/Format/draw_frame_xlsx.cpp | 29 ++++++++++----- 4 files changed, 66 insertions(+), 36 deletions(-) diff --git a/OdfFile/Reader/Converter/mediaitems.cpp b/OdfFile/Reader/Converter/mediaitems.cpp index 66207875b4..dc07512d82 100644 --- a/OdfFile/Reader/Converter/mediaitems.cpp +++ b/OdfFile/Reader/Converter/mediaitems.cpp @@ -270,6 +270,7 @@ std::wstring mediaitems::add_or_find(const std::wstring & href, _rels_type type, } else if ( type == typeMsObject || type == typeOleObject) { + isMediaInternal = is_internal(href, odf_packet_); sub_path = L"embeddings/"; } else if ( type == typeControlProps) diff --git a/OdfFile/Reader/Format/draw_frame_docx.cpp b/OdfFile/Reader/Format/draw_frame_docx.cpp index 64e4e50bf5..567d4eca62 100644 --- a/OdfFile/Reader/Format/draw_frame_docx.cpp +++ b/OdfFile/Reader/Format/draw_frame_docx.cpp @@ -1644,18 +1644,21 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context) try { std::wstring href = xlink_attlist_.href_.get_value_or(L""); - std::wstring tempPath = Context.root()->get_temp_folder(); std::wstring odfPath = Context.root()->get_folder(); - + std::wstring tempPath = Context.root()->get_temp_folder(); + if (!odf_document_ && false == href.empty()) { if (href[0] == L'#') href = href.substr(1); - std::wstring objectPath = odfPath + FILE_SEPARATOR_STR + href; - // normalize path ???? todooo - XmlUtils::replace_all( objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); + if (Context.get_mediaitems()->is_internal_path(href, odfPath)) + { + std::wstring objectPath = odfPath + FILE_SEPARATOR_STR + href; + // normalize path ???? todooo - odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + XmlUtils::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); + odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + } } //--------------------------------------------------------------------------------------------------------------------- office_element* contentSubDoc = odf_document_ ? odf_document_->get_impl()->get_content() : NULL; @@ -1807,25 +1810,35 @@ void draw_object_ole::docx_convert(oox::docx_conversion_context & Context) //------------------------------------------------ std::wstring href = xlink_attlist_.href_.get_value_or(L""); - std::wstring folderPath = Context.root()->get_folder(); - std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; - if (href.empty()) return; draw_frame* frame = Context.get_drawing_context().get_current_frame(); //owner if (!frame) return; - oox::_docx_drawing * drawing = dynamic_cast(frame->oox_drawing_.get()); + if (href.empty()) return; + + oox::_docx_drawing* drawing = dynamic_cast(frame->oox_drawing_.get()); if (!drawing) return; - - std::wstring extension; - detectObject(objectPath, drawing->objectProgId, extension, drawing->type); - NSFile::CFileBinary::Copy(objectPath, objectPath + extension); + std::wstring folderPath = Context.root()->get_folder(); + if (Context.get_mediaitems()->is_internal_path(href, folderPath)) + { + std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; - bool isMediaInternal = true; - drawing->objectId = Context.get_mediaitems()->add_or_find(href + extension, drawing->type, isMediaInternal, href, Context.get_type_place()); + std::wstring extension; + detectObject(objectPath, drawing->objectProgId, extension, drawing->type); + NSFile::CFileBinary::Copy(objectPath, objectPath + extension); + + bool isMediaInternal = true; + drawing->objectId = Context.get_mediaitems()->add_or_find(href + extension, drawing->type, isMediaInternal, href, Context.get_type_place()); + } + else + { + bool isMediaInternal = false; + drawing->objectId = Context.get_mediaitems()->add_or_find(href, oox::typeOleObject, isMediaInternal, href, Context.get_type_place()); + + } } void draw_control::docx_convert(oox::docx_conversion_context & Context) { diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 55df515d82..2145dfd07f 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -341,12 +341,13 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context) { if (href[0] == L'#') href = href.substr(1); - std::wstring objectPath = odfPath + FILE_SEPARATOR_STR + href; - - // normalize path ???? todooo - XmlUtils::replace_all( objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); - - odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + if (Context.get_mediaitems()->is_internal_path(href, odfPath)) + { + std::wstring objectPath = odfPath + FILE_SEPARATOR_STR + href; + // normalize path ???? todooo + XmlUtils::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); + odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + } } //--------------------------------------------------------------------------------------------------------------------- office_element *contentSubDoc = odf_document_ ? odf_document_->get_impl()->get_content() : NULL; @@ -465,12 +466,14 @@ void draw_object_ole::pptx_convert(oox::pptx_conversion_context & Context) { Context.get_slide_context().set_use_image_replacement(); - std::wstring href = xlink_attlist_.href_.get_value_or(L""); - std::wstring folderPath = Context.root()->get_folder(); - std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + std::wstring href = xlink_attlist_.href_.get_value_or(L""); + if (href.empty()) return; - if (!href.empty()) + std::wstring folderPath = Context.root()->get_folder(); + if (Context.get_mediaitems()->is_internal_path(href, folderPath)) { + std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + std::wstring prog, extension; oox::_rels_type relsType; detectObject(objectPath, prog, extension, relsType); @@ -482,6 +485,10 @@ void draw_object_ole::pptx_convert(oox::pptx_conversion_context & Context) else Context.get_slide_context().set_ole_object(href + extension, prog); } + else + { + Context.get_slide_context().set_ole_object(href, L""); + } } void draw_param::pptx_convert(oox::pptx_conversion_context & Context) diff --git a/OdfFile/Reader/Format/draw_frame_xlsx.cpp b/OdfFile/Reader/Format/draw_frame_xlsx.cpp index ab7ee9bacf..5aabe7921e 100644 --- a/OdfFile/Reader/Format/draw_frame_xlsx.cpp +++ b/OdfFile/Reader/Format/draw_frame_xlsx.cpp @@ -340,19 +340,22 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context) try { std::wstring href = xlink_attlist_.href_.get_value_or(L""); - + std::wstring tempPath = Context.root()->get_temp_folder(); + if (!odf_document_ && false == href.empty()) { if (href[0] == L'#') href = href.substr(1); - - std::wstring tempPath = Context.root()->get_temp_folder(); + std::wstring folderPath = Context.root()->get_folder(); - std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + if (Context.get_mediaitems()->is_internal_path(href, folderPath)) + { + std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; - // normalize path ???? todooo - XmlUtils::replace_all( objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); + // normalize path ???? todooo + XmlUtils::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); - odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + } } office_element *contentSubDoc = odf_document_ ? odf_document_->get_impl()->get_content() : NULL; if (!contentSubDoc) @@ -439,11 +442,13 @@ void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context) Context.get_drawing_context().set_use_image_replacement(); std::wstring href = xlink_attlist_.href_.get_value_or(L""); - std::wstring folderPath = Context.root()->get_folder(); - std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + if (href.empty()) return; - if (!href.empty()) + std::wstring folderPath = Context.root()->get_folder(); + if (Context.get_mediaitems()->is_internal_path(href, folderPath)) { + std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + std::wstring prog, extension; oox::_rels_type relsType; detectObject(objectPath, prog, extension, relsType); @@ -455,6 +460,10 @@ void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context) else Context.get_drawing_context().set_ole_object(href + extension, prog); } + else + { + Context.get_drawing_context().set_ole_object(href, L""); + } } } From 13542b13884c29c6dfea9a596223825a2716782e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 18 Mar 2024 22:38:46 +0600 Subject: [PATCH 085/117] fIx content types writing for worksheets and pivot tables --- OOXML/XlsbFormat/Xlsb.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OOXML/XlsbFormat/Xlsb.cpp b/OOXML/XlsbFormat/Xlsb.cpp index 2a511c3f05..3aa80e3b93 100644 --- a/OOXML/XlsbFormat/Xlsb.cpp +++ b/OOXML/XlsbFormat/Xlsb.cpp @@ -101,6 +101,10 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oDirPath, OOX::CContentTypes return false; m_bWriteToXlsb = true; + if(!m_oContentTypes.m_mapDefaults.empty() && !m_oContentTypes.m_mapOverrides.empty()) + { + oContentTypes.Merge(&m_oContentTypes); + } IFileContainer::Write(oDirPath / L"", OOX::CPath(_T("")), oContentTypes); From ad2c6b67f18d034be47e86d3887fc4e862a7a561 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 19 Mar 2024 11:00:37 +0300 Subject: [PATCH 086/117] fix bug #66864 --- .../PptFile/Reader/PPTDocumentInfo.cpp | 30 ++++++++++++++- MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h | 3 +- .../PptFile/Reader/PPTDocumentInfoOneUser.cpp | 37 +------------------ .../PptFile/Reader/PPTDocumentInfoOneUser.h | 2 - 4 files changed, 33 insertions(+), 39 deletions(-) diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp index 54e0eb5f52..8814c00b2e 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp @@ -109,6 +109,34 @@ bool CPPTDocumentInfo::ReadFromStream(CRecordCurrentUserAtom *pCurrentUser, POLE return true; } +std::wstring CPPTDocumentInfo::GetBinFromStg(const std::wstring& name, _UINT32 nRef) +{ + for (size_t i = 0; i < m_arUsers.size(); ++i) + { + std::map<_UINT32, _UINT32>::iterator nIndexPsrRef = m_arUsers[i]->m_mapOffsetInPIDs.find(nRef); + if (m_arUsers[i]->m_mapOffsetInPIDs.end() != nIndexPsrRef) + { + std::wstring result; + _UINT32 offset_stream = nIndexPsrRef->second; + StreamUtils::StreamSeek(offset_stream, m_pStream); + + SRecordHeader oHeader; + oHeader.ReadFromStream(m_pStream); + + CRecordExObjStg* pExObjStg = new CRecordExObjStg(name, m_pCommonInfo->tempPath); + + if (pExObjStg) + { + pExObjStg->ReadFromStream(oHeader, m_pStream); + result = pExObjStg->m_sFileName; + + RELEASEOBJECT(pExObjStg); + } + return result; + } + } + return L""; +} bool CPPTDocumentInfo::LoadDocument() { @@ -116,7 +144,7 @@ bool CPPTDocumentInfo::LoadDocument() try { - m_arUsers[0]->ReadExtenalObjects(); + m_arUsers[0]->ReadExtenalObjects(); // todooo ???? прочитать по всем (см 66864) m_arUsers[0]->FromDocument(); } catch(int) //error code diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h index 880447f4ee..40dde44c55 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h @@ -59,7 +59,8 @@ public: bool ReadFromStream(CRecordCurrentUserAtom* pCurrentUser, POLE::Stream* pStream); bool LoadDocument(); - + + std::wstring GetBinFromStg(const std::wstring& name, _UINT32 nRef); private: POLE::Stream* m_pStream; }; diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp index 39c18081a2..bb3ed69f99 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp @@ -423,7 +423,7 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) { if (pVbaAtom->m_nHasMacros) { - m_sVbaProjectFile = GetBinFromStg(L"vbaProject.bin", pVbaAtom->m_nObjStgDataRef); + m_sVbaProjectFile = m_pDocumentInfo->GetBinFromStg(L"vbaProject.bin", pVbaAtom->m_nObjStgDataRef); m_bMacros = (false == m_sVbaProjectFile.empty()); } @@ -431,39 +431,6 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) } return true; } -std::wstring CPPTUserInfo::GetBinFromStg(const std::wstring& name, _UINT32 nRef) -{ - POLE::Stream* pStream = m_pDocumentInfo->m_pStream; - - std::map<_UINT32, _UINT32>::iterator nIndexPsrRef = m_mapOffsetInPIDs.find(nRef); - - std::wstring result; - if (m_mapOffsetInPIDs.end() != nIndexPsrRef) - { - _UINT32 offset_stream = nIndexPsrRef->second; - StreamUtils::StreamSeek(offset_stream, pStream); - - POLE::Stream* pStreamTmp = pStream; - if (m_pDecryptor) - { - DecryptStream(pStream, nRef); - pStreamTmp = m_arStreamDecrypt.back()->stream_; - } - SRecordHeader oHeader; - oHeader.ReadFromStream(pStreamTmp); - - CRecordExObjStg *pExObjStg = new CRecordExObjStg(name, m_pDocumentInfo->m_pCommonInfo->tempPath); - - if (pExObjStg) - { - pExObjStg->ReadFromStream(oHeader, pStreamTmp); - result = pExObjStg->m_sFileName; - - RELEASEOBJECT(pExObjStg); - } - } - return result; -} //-------------------------------------------------------------------------------------------- void CPPTUserInfo::ReadExtenalObjects() { @@ -2570,7 +2537,7 @@ void CPPTUserInfo::LoadExOleObject(CRecordsContainer* pExObject) if (oArrayCString.size() > 1) oInfo.m_progName = oArrayCString[1]->m_strText; - oInfo.m_strFilePath = GetBinFromStg(L"", oArrayExOleObj[0]->m_nPersistID); // ExOleObjStg || ExControlStg + oInfo.m_strFilePath = m_pDocumentInfo->GetBinFromStg(L"", oArrayExOleObj[0]->m_nPersistID); // ExOleObjStg || ExControlStg m_oExMedia.m_arOleObjects.push_back(oInfo); } diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h index d8c584403a..3812682dff 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h @@ -132,8 +132,6 @@ public: bool ReadDocumentPersists(POLE::Stream* pStream); void ReadExtenalObjects(); - std::wstring GetBinFromStg(const std::wstring& name, _UINT32 nRef); - void DecryptStream(POLE::Stream *pStream, int block); void FromDocument(); From 4943193ef780a0727fd09e14c67132b56c54ad52 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 19 Mar 2024 16:44:26 +0300 Subject: [PATCH 087/117] fix bug #66868 --- OOXML/XlsxFormat/Workbook/Metadata.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Workbook/Metadata.cpp b/OOXML/XlsxFormat/Workbook/Metadata.cpp index 7da7a64c2c..74cf59e79c 100644 --- a/OOXML/XlsxFormat/Workbook/Metadata.cpp +++ b/OOXML/XlsxFormat/Workbook/Metadata.cpp @@ -824,7 +824,7 @@ namespace OOX writer.WriteString(L""); for (size_t i = 0; i < m_arrItems.size(); ++i) From 70a4e3e792080abc7f89ae3af6897d685e673447 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 20 Mar 2024 10:55:55 +0300 Subject: [PATCH 088/117] fix bug #67008 --- .../XlsFile/Converter/xlsx_drawing_context.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp b/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp index 98d5f9a8f6..7ecadb8da0 100644 --- a/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp +++ b/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp @@ -997,7 +997,7 @@ void xlsx_drawing_context::serialize_group() if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } if (drawing_state->hidden) { @@ -1373,7 +1373,7 @@ void xlsx_drawing_context::serialize_pic(_drawing_state_ptr & drawing_state) if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } if (drawing_state->hidden) { @@ -1448,7 +1448,7 @@ void xlsx_drawing_context::serialize_chart(_drawing_state_ptr & drawing_state) CP_XML_ATTR(L"name", drawing_state->name); if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } if (drawing_state->hidden) { @@ -1500,7 +1500,7 @@ void xlsx_drawing_context::serialize_control(_drawing_state_ptr & drawing_state) if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } CP_XML_ATTR(L"hidden", 1); @@ -1601,7 +1601,7 @@ void xlsx_drawing_context::serialize_shape(_drawing_state_ptr & drawing_state) if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } if (drawing_state->hidden) { From 475d0be0bf2a4f8f66d4b63450e7648d2444c16f Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 20 Mar 2024 11:54:48 +0300 Subject: [PATCH 089/117] fix bug #59931 --- OdfFile/Writer/Format/ods_table_state.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OdfFile/Writer/Format/ods_table_state.cpp b/OdfFile/Writer/Format/ods_table_state.cpp index adb678bf35..2ca0c6170b 100644 --- a/OdfFile/Writer/Format/ods_table_state.cpp +++ b/OdfFile/Writer/Format/ods_table_state.cpp @@ -69,7 +69,7 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен { std::wstring convert_date(int date) { - boost::gregorian::date date_ = boost::gregorian::date(1900, 1, 1) + boost::gregorian::date_duration(date - 2); + boost::gregorian::date date_ = boost::gregorian::date(1900, 1, 1) + boost::gregorian::date_duration( date - (date < 60 ? 1 : 2)); //29.02.1900 std::wstring date_str; From bb84209b055e85879a0872224c3c1ff613f7432e Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 21 Mar 2024 12:02:59 +0300 Subject: [PATCH 090/117] Fix cropbox offset for AP annots --- PdfFile/SrcReader/PdfAnnot.cpp | 13 ++++++++----- PdfFile/SrcReader/PdfAnnot.h | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/PdfFile/SrcReader/PdfAnnot.cpp b/PdfFile/SrcReader/PdfAnnot.cpp index 9b1ebff9f0..249110293e 100644 --- a/PdfFile/SrcReader/PdfAnnot.cpp +++ b/PdfFile/SrcReader/PdfAnnot.cpp @@ -2529,6 +2529,9 @@ void CAnnotAP::Clear() void CAnnotAP::Init(PDFDoc* pdfDoc, NSFonts::IFontManager* pFontManager, CFontList* pFontList, int nRasterW, int nRasterH, int nBackgroundColor, int nPageIndex) { Page* pPage = pdfDoc->getCatalog()->getPage(nPageIndex + 1); + PDFRectangle* pCropBox = pPage->getCropBox(); + m_dCropX = pCropBox->x1; + m_dCropY = pCropBox->y1; double dWidth = pdfDoc->getPageCropWidth(nPageIndex + 1); double dHeight = pdfDoc->getPageCropHeight(nPageIndex + 1); @@ -2579,8 +2582,8 @@ void CAnnotAP::Init(PDFDoc* pdfDoc, NSFonts::IFontManager* pFontManager, CFontLi m_gfx = new Gfx(pdfDoc, m_pRendererOut, nPageIndex + 1, pPage->getAttrs()->getResourceDict(), 72.0, 72.0, &box, crop ? cropBox : (PDFRectangle *)NULL, 0, NULL, NULL); // Координаты внешнего вида - m_nRx1 = (int)round(m_dx1 * m_dWScale) - 1; - m_nRy1 = nRasterH - (int)round(m_dy2 * m_dHScale) - 1; + m_nRx1 = (int)round((m_dx1 - m_dCropX) * m_dWScale) - 1; + m_nRy1 = nRasterH - (int)round((m_dy2 - m_dCropY) * m_dHScale) - 1; } void CAnnotAP::Init(AcroFormField* pField) { @@ -2644,7 +2647,7 @@ void CAnnotAP::Draw(PDFDoc* pdfDoc, Object* oAP, int nRasterH, int nBackgroundCo pView->sASName = oObj.dictGetKey(k); if ((oType == acroFormFieldRadioButton || oType == acroFormFieldCheckbox) && pView->sASName != "Off") pView->sASName = "Yes"; - m_pRenderer->SetCoordTransformOffset(-m_dx1 * m_dWScale + 1 + m_dWTale / 2, m_dy2 * m_dHScale - nRasterH + 1 + m_dHTale / 2); + m_pRenderer->SetCoordTransformOffset(-(m_dx1 - m_dCropX) * m_dWScale + 1 + m_dWTale / 2, (m_dy2 - m_dCropY) * m_dHScale - nRasterH + 1 + m_dHTale / 2); DrawAppearance(pdfDoc, nPageIndex + 1, pField, m_gfx, arrAPName[j], pView->sASName.c_str()); WriteAppearance(nBackgroundColor, pView); pView->nBlendMode = GetBlendMode(); @@ -2655,7 +2658,7 @@ void CAnnotAP::Draw(PDFDoc* pdfDoc, Object* oAP, int nRasterH, int nBackgroundCo { CAnnotAPView* pView = new CAnnotAPView(); pView->sAPName = arrAPName[j]; - m_pRenderer->SetCoordTransformOffset(-m_dx1 * m_dWScale + 1 + m_dWTale / 2, m_dy2 * m_dHScale - nRasterH + 1 + m_dHTale / 2); + m_pRenderer->SetCoordTransformOffset(-(m_dx1 - m_dCropX) * m_dWScale + 1 + m_dWTale / 2, (m_dy2 - m_dCropY) * m_dHScale - nRasterH + 1 + m_dHTale / 2); DrawAppearance(pdfDoc, nPageIndex + 1, pField, m_gfx, arrAPName[j], NULL); WriteAppearance(nBackgroundColor, pView); pView->nBlendMode = GetBlendMode(); @@ -2686,7 +2689,7 @@ void CAnnotAP::Draw(PDFDoc* pdfDoc, Object* oAP, int nRasterH, int nBackgroundCo pView = new CAnnotAPView(); pView->sAPName = arrAPName[j]; - m_pRenderer->SetCoordTransformOffset(-m_dx1 * m_dWScale + 1 + m_dWTale / 2, m_dy2 * m_dHScale - nRasterH + 1 + m_dHTale / 2); + m_pRenderer->SetCoordTransformOffset(-(m_dx1 - m_dCropX) * m_dWScale + 1 + m_dWTale / 2, (m_dy2 - m_dCropY) * m_dHScale - nRasterH + 1 + m_dHTale / 2); Ref ref = oAnnotRef->getRef(); Annot* annot = new Annot(pdfDoc, oAnnot.getDict(), &ref, arrAPName[j]); diff --git a/PdfFile/SrcReader/PdfAnnot.h b/PdfFile/SrcReader/PdfAnnot.h index 4d05329169..683afc759e 100644 --- a/PdfFile/SrcReader/PdfAnnot.h +++ b/PdfFile/SrcReader/PdfAnnot.h @@ -143,6 +143,7 @@ private: unsigned int m_unRefNum; // Номер ссылки на объект double m_dx1, m_dy1, m_dx2, m_dy2; + double m_dCropX, m_dCropY; double m_dWScale, m_dHScale; double m_dWTale; double m_dHTale; From aad7f089e4ea3278af15901141c7e5acf42f26fc Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 21 Mar 2024 20:31:04 +0600 Subject: [PATCH 091/117] Fix pivot tables conversion --- .../Pivot/PivotCacheDefinitionExt.cpp | 18 ++ OOXML/XlsxFormat/Pivot/Pivots.cpp | 215 ++++++++++++------ 2 files changed, 169 insertions(+), 64 deletions(-) diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp index 22d57d25a4..4b13e626f4 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp @@ -59,9 +59,27 @@ XLS::BaseObjectPtr CPivotCacheDefinitionExt::toBin() auto ptr(new XLSB::PCD14); XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::BeginPCD14); + if(m_oSlicerData.IsInit()) + ptr1->fSlicerData = m_oSlicerData.get(); + else + ptr1->fSlicerData = false; + if(m_oSrvSupportAddCalcMems.IsInit()) + ptr1->fSrvSupportAddCalcMems = m_oSrvSupportAddCalcMems.get(); + else + ptr1->fSrvSupportAddCalcMems = false; + if(m_oSrvSupportSubQueryCalcMem.IsInit()) + ptr1->fSrvSupportSubQueryCalcMem = m_oSrvSupportSubQueryCalcMem.get(); + else + ptr1->fSrvSupportSubQueryCalcMem = false; + if(m_oSrvSupportSubQueryNonVisual.IsInit()) + ptr1->fSrvSupportSubQueryNonVisual = m_oSrvSupportSubQueryNonVisual.get(); + else + ptr1->fSrvSupportSubQueryNonVisual = false; ptr->m_BrtBeginPCD14 = XLS::BaseObjectPtr{ptr1}; if(m_oPivotCacheId.IsInit()) ptr1->icacheId = m_oPivotCacheId.get(); + else + ptr1->icacheId = 0; return objectPtr; } void CPivotCacheDefinitionExt::fromBin(XLS::BaseObjectPtr& obj) diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 684274ac5b..b9a3d456c7 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -400,25 +400,25 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->m_BrtBeginSXView = writeAttributes(); if(m_oLocation.IsInit()) ptr->m_SXLOCATION = m_oLocation->toBin(); - if(m_oPivotFields.IsInit()) - ptr->m_SXVDS = m_oPivotFields->toBin(); - if(m_oRowFields.IsInit()) + if(m_oPivotFields.IsInit()) + ptr->m_SXVDS = m_oPivotFields->toBin(); + if(m_oRowFields.IsInit()) ptr->m_ISXVDRWS = m_oRowFields->toBinRows(); - if(m_oColFields.IsInit()) - ptr->m_ISXVDCOLS = m_oColFields->toBinCols(); + if(m_oColFields.IsInit()) + ptr->m_ISXVDCOLS = m_oColFields->toBinCols(); if(m_oRowItems.IsInit()) ptr->m_SXLIRWS = m_oRowItems->toBinRows(); if(m_oColItems.IsInit()) ptr->m_SXLICOLS = m_oColItems->toBinCols(); - if(m_oDataFields.IsInit()) - ptr->m_SXDIS = m_oDataFields->toBin(); - if(m_oFormats.IsInit()) - ptr->m_SXFORMATS = m_oFormats->toBin(); - if(m_oPivotTableStyleInfo.IsInit()) - ptr->m_BrtTableStyleClient = m_oPivotTableStyleInfo->toBin(); - if(m_oPageFields.IsInit()) - ptr->m_SXPIS = m_oPageFields->toBin(); + if(m_oDataFields.IsInit()) + ptr->m_SXDIS = m_oDataFields->toBin(); + if(m_oFormats.IsInit()) + ptr->m_SXFORMATS = m_oFormats->toBin(); + if(m_oPivotTableStyleInfo.IsInit()) + ptr->m_BrtTableStyleClient = m_oPivotTableStyleInfo->toBin(); + if(m_oPageFields.IsInit()) + ptr->m_SXPIS = m_oPageFields->toBin(); /*auto frt(new XLSB::FRTSXVIEW); auto sxview14(new XLSB::SXVIEW14); @@ -1143,18 +1143,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr CColumnRowItem::toBin() { auto ptr(new XLSB::SXLI); - auto size = 0; - - for(auto i:m_arrItems) - { - if(i->m_oV.IsInit()) - size++; - - } XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::BeginSXLI); - ptr1->cisxvis = size; + ptr1->cisxvis = m_arrItems.size(); ptr->m_BrtBeginSXLI = XLS::BaseObjectPtr{ptr1}; if(m_oI.IsInit()) ptr1->iData = m_oI->GetValue(); @@ -1199,18 +1191,17 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } else { - ptr1->itmtype = XLSB::PivotItemType::PITDATA; + ptr1->itmtype = XLSB::PivotItemType::PITDEFAULT; } if(ptr1->cisxvis > 0) { - auto ptr2(new XLSB::ISXVIS(size)); - ptr2->_cisxvis = size; + auto ptr2(new XLSB::ISXVIS(ptr1->cisxvis)); + ptr2->_cisxvis = ptr1->cisxvis; ptr->m_ISXVIS = XLS::BaseObjectPtr{ptr2}; - auto ptr3(new XLSB::BeginISXVIs(size)); - ptr3->_cisxvis = size; + auto ptr3(new XLSB::BeginISXVIs(ptr1->cisxvis)); ptr2->m_BrtBeginISXVIs = XLS::BaseObjectPtr{ptr3}; for(auto i:m_arrItems) @@ -1423,10 +1414,16 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oBaseField.IsInit()) ptr->isxvd = m_oBaseField.get(); + else + ptr->isxvd = 0; if(m_oBaseItem.IsInit()) ptr->isxvi = m_oBaseItem->GetValue(); + else + ptr->isxvi = 0; if(m_oFld.IsInit()) ptr->isxvdData = m_oFld->GetValue(); + else + ptr->isxvdData = false; if(m_oNumFmtId.IsInit()) ptr->ifmt.ifmt = m_oNumFmtId->GetValue(); else @@ -1859,16 +1856,28 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oChild.IsInit()) ptr->fHasChildrenEst = m_oChild.get(); + else + ptr->fHasChildrenEst = false; if(m_oExpanded.IsInit()) ptr->fDrilledMember = m_oExpanded.get(); + else + ptr->fDrilledMember = false; if(m_oDrillAcross.IsInit()) ptr->fCollapsedMember = m_oDrillAcross.get(); + else + ptr->fCollapsedMember = false; if(m_oCalculated.IsInit()) ptr->fFormula = m_oCalculated.get(); + else + ptr->fFormula = false; if(m_oHidden.IsInit()) ptr->fHidden = m_oHidden.get(); + else + ptr->fHidden = false; if(m_oMissing.IsInit()) ptr->fMissing = m_oMissing.get(); + else + ptr->fMissing = false; if(m_oUserCaption.IsInit()) { ptr->displayName = m_oUserCaption.get(); @@ -1880,10 +1889,16 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } if(m_oCharacter.IsInit()) ptr->fOlapFilterSelected = m_oCharacter.get(); + else + ptr->fOlapFilterSelected = false; if(m_oHideDetails.IsInit()) ptr->fHideDetail = m_oHideDetails.get(); + else + ptr->fHideDetail = false; if(m_oItemIndex.IsInit()) ptr->iCache = m_oItemIndex->GetValue(); + else + ptr->iCache = 0; if(m_oItemType.IsInit()) { if(m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeData) @@ -1917,6 +1932,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeBlank) ptr->itmtype = XLSB::PivotItemType::PITBLANK; } + else + ptr->itmtype = XLSB::PivotItemType::PITDATA; return objectPtr; } void CFieldItem::fromBin(XLS::BaseObjectPtr& obj) @@ -2244,12 +2261,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisValues) ptr->sxaxis.bData = true; } - else - ptr->sxaxis.bData = true; if(m_oCompact.IsInit()) ptr->fCompact = m_oCompact.get(); else - ptr->fCompact = false; + ptr->fCompact = true; if(m_oCountASubtotal.IsInit()) ptr->fCounta = m_oCountASubtotal.get(); @@ -2261,9 +2276,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else ptr->fCount = false; if(m_oDataField.IsInit()) - ptr->fDrilledLevel = m_oDataField.get(); - else - ptr->fDrilledLevel = false; + ptr->sxaxis.bData = m_oDataField.get(); + if(m_oDataSourceSort.IsInit()) ptr->fTensorSort = m_oDataSourceSort.get(); else @@ -2279,24 +2293,24 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oDragOff.IsInit()) ptr->fDragToHide = m_oDragOff.get(); else - ptr->fDragToHide = false; + ptr->fDragToHide = true; if (m_oDragToCol.IsInit()) ptr->fDragToColumn = m_oDragToCol.get(); else - ptr->fDragToColumn = false; + ptr->fDragToColumn = true; if (m_oDragToData.IsInit()) ptr->fDragToData = m_oDragToData.get(); else - ptr->fDragToData = false; + ptr->fDragToData = true; if (m_oDragToPage.IsInit()) ptr->fDragToPage = m_oDragToPage.get(); else - ptr->fDragToPage = false; + ptr->fDragToPage = true; if (m_oDragToRow.IsInit()) ptr->fDragToRow = m_oDragToRow.get(); else - ptr->fDragToRow = false; + ptr->fDragToRow = true; if (m_oHiddenLevel.IsInit()) ptr->fHiddenLvl = m_oHiddenLevel.get(); else @@ -2308,7 +2322,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oIncludeNewItemsInFilter.IsInit()) ptr->fFilterInclusive = m_oIncludeNewItemsInFilter.get(); else - ptr->fFilterInclusive = false; + ptr->fFilterInclusive = true; if (m_oInsertBlankRow.IsInit()) ptr->fInsertBlankRow = m_oInsertBlankRow.get(); else @@ -2321,7 +2335,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oItemPageCount.IsInit()) ptr->citmAutoShow = m_oItemPageCount->GetValue(); else - ptr->citmAutoShow = 0; + ptr->citmAutoShow = 10; if(m_oMaxSubtotal.IsInit()) ptr->fMax = m_oMaxSubtotal.get(); @@ -2331,7 +2345,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oMeasureFilter.IsInit()) ptr->fHasAdvFilter = m_oMeasureFilter.get(); else - ptr->fHasAdvFilter = false; + ptr->fHasAdvFilter = false; if(m_oMinSubtotal.IsInit()) ptr->fMin = m_oMinSubtotal.get(); @@ -2362,7 +2376,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oOutline.IsInit()) ptr->fOutline = m_oOutline.get(); else - ptr->fOutline = false; + ptr->fOutline = true; if (m_oProductSubtotal.IsInit()) ptr->fProduct = m_oProductSubtotal.get(); @@ -2372,7 +2386,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oRankBy.IsInit()) ptr->isxdiAutoShow = m_oRankBy->GetValue(); else - ptr->isxdiAutoShow = 0; + ptr->isxdiAutoShow = -1; if (m_oServerField.IsInit()) ptr->fServerBased = m_oServerField.get(); @@ -2403,15 +2417,19 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->fMemPropDisplayInTip = m_oShowPropTip.get(); else ptr->fMemPropDisplayInTip = false; + if(m_oNonAutoSortDefault.IsInit()) + ptr->fAutoSort = !m_oNonAutoSortDefault.get(); + else + ptr->fAutoSort = false; if(m_oSortType.IsInit()) { - if(m_oSortType->GetValue() != SimpleTypes::Spreadsheet::EFieldSortType::sortManual) - ptr->fAutoSort = true; if(m_oSortType->GetValue() == SimpleTypes::Spreadsheet::EFieldSortType::sortAscending) ptr->fAscendSort = true; else ptr->fAscendSort = false; } + else + ptr->fAscendSort = false; if (m_oStdDevPSubtotal.IsInit()) ptr->fStdevp = m_oStdDevPSubtotal.get(); @@ -2431,7 +2449,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oSubtotalTop.IsInit()) ptr->fSubtotalAtTop = !m_oSubtotalTop.get(); else - ptr->fSubtotalAtTop = false; + ptr->fSubtotalAtTop = true; if (m_oSumSubtotal.IsInit()) ptr->fSum = m_oSumSubtotal.get(); @@ -2441,7 +2459,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oTopAutoShow.IsInit()) ptr->fTopAutoShow = !m_oTopAutoShow.get(); else - ptr->fTopAutoShow = false; + ptr->fTopAutoShow = true; if (m_oUniqueMemberProperty.IsInit()) ptr->irstMemberPropertyCaption = m_oUniqueMemberProperty.get(); @@ -2456,7 +2474,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oVarSubtotal.IsInit()) ptr->fVar = m_oVarSubtotal.get(); else - ptr->fVar = false; + ptr->fVar = false; + if(!ptr->fVar && !ptr->fVarp && !ptr->fStdevp && !ptr->fStdevp + && !ptr->fCount && !ptr->fMin && !ptr->fMax && !ptr->fAverage + && !ptr->fCounta && !ptr->fSum ) + ptr->fDefault = true; + else + ptr->fDefault = false; return objectPtr; } @@ -2817,54 +2841,83 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr); if (m_oAvgSubtotal.IsInit()) ptr->prFilter.itmtypeAVERAGE = m_oAvgSubtotal.get(); - - if (m_oByPosition.IsInit()) - ptr->prFilter.itmtypeAVERAGE = m_oByPosition.get(); + else + ptr->prFilter.itmtypeAVERAGE = false; if (m_oCountASubtotal.IsInit()) ptr->prFilter.itmtypeCOUNTA = m_oCountASubtotal.get(); + else + ptr->prFilter.itmtypeCOUNTA = false; if (m_oCountSubtotal.IsInit()) ptr->prFilter.itmtypeCOUNT = m_oCountSubtotal.get(); + else + ptr->prFilter.itmtypeCOUNT = false; if (m_oDefaultSubtotal.IsInit()) ptr->prFilter.itmtypeDEFAULT = m_oDefaultSubtotal.get(); + else + ptr->prFilter.itmtypeDEFAULT = false; if (m_oMaxSubtotal.IsInit()) ptr->prFilter.itmtypeMAX = m_oMaxSubtotal.get(); + else + ptr->prFilter.itmtypeMAX = false; if (m_oMinSubtotal.IsInit()) ptr->prFilter.itmtypeMIN = m_oMinSubtotal.get(); + else + ptr->prFilter.itmtypeMIN = false; if (m_oProductSubtotal.IsInit()) ptr->prFilter.itmtypePRODUCT = m_oProductSubtotal.get(); + else + ptr->prFilter.itmtypePRODUCT = false; if (m_oRelative.IsInit()) ptr->prFilter.itmtypeAVERAGE = m_oRelative.get(); + else + ptr->prFilter.itmtypeAVERAGE = false; if (m_oSelected.IsInit()) ptr->prFilter.fSelected = m_oSelected.get(); + else + ptr->prFilter.fSelected = false; if (m_oStdDevPSubtotal.IsInit()) ptr->prFilter.itmtypeSTDEVP = m_oStdDevPSubtotal.get(); + else + ptr->prFilter.itmtypeSTDEVP = false; if (m_oStdDevSubtotal.IsInit()) ptr->prFilter.itmtypeSTDEV = m_oStdDevSubtotal.get(); + else + ptr->prFilter.itmtypeSTDEV = false; if (m_oSumSubtotal.IsInit()) ptr->prFilter.itmtypeSUM = m_oSumSubtotal.get(); + else + ptr->prFilter.itmtypeSUM = false; if (m_oVarPSubtotal.IsInit()) ptr->prFilter.itmtypeVARP = m_oVarPSubtotal.get(); + else + ptr->prFilter.itmtypeVARP = false; if (m_oVarSubtotal.IsInit()) ptr->prFilter.itmtypeVAR = m_oVarSubtotal.get(); + else + ptr->prFilter.itmtypeVAR = false; if (m_oField.IsInit()) ptr->prFilter.isxvd = m_oField->GetValue(); + else + ptr->prFilter.isxvd = 0; if (m_oCount.IsInit()) ptr->prFilter.cItems = m_oCount->GetValue(); + else + ptr->prFilter.cItems = 0; return objectPtr; } void CReference::ReadAttributes(XLS::BaseObjectPtr& obj) @@ -3017,14 +3070,18 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { auto ptr(new XLSB::SXFORMAT); XLS::BaseObjectPtr objectPtr(ptr); - if(m_oDxfId.IsInit()) - { - auto ptr1(new XLSB::BeginSXFormat); - ptr->m_BrtBeginSXFormat = XLS::BaseObjectPtr{ptr1}; - ptr1->dxfid = m_oDxfId->GetValue(); - if(m_oAction.IsInit()) - ptr1->rlType = m_oAction->GetValue(); - } + + auto ptr1(new XLSB::BeginSXFormat); + ptr->m_BrtBeginSXFormat = XLS::BaseObjectPtr{ptr1}; + if(m_oDxfId.IsInit()) + ptr1->dxfid = m_oDxfId->GetValue(); + else + ptr1->dxfid = 0; + if(m_oAction.IsInit()) + ptr1->rlType = m_oAction->GetValue(); + else + ptr1->rlType = 0; + if(m_oPivotArea.IsInit()) ptr->m_PIVOTRULE = m_oPivotArea->toBin(); return objectPtr; @@ -3156,6 +3213,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { auto ptr(new XLSB::BeginPRule); XLS::BaseObjectPtr objectPtr(ptr); + ptr->pruleheaderdata.sxaxis.bCol = false; + ptr->pruleheaderdata.sxaxis.bPage = false; + ptr->pruleheaderdata.sxaxis.bRw = false; + ptr->pruleheaderdata.sxaxis.bData = false; if(m_oAxis.IsInit()) { if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisCol) @@ -3169,24 +3230,43 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } if(m_oCacheIndex.IsInit()) ptr->pruleheaderdata.fCacheBased = m_oCacheIndex.get(); + else + ptr->pruleheaderdata.fCacheBased = false; if(m_oCollapsedLevelsAreSubtotals.IsInit()) ptr->pruleheaderdata.fFuzzy = m_oCollapsedLevelsAreSubtotals.get(); + else + ptr->pruleheaderdata.fFuzzy = false; if(m_oDataOnly.IsInit()) ptr->pruleheaderdata.fDataOnly = m_oDataOnly.get(); + else + ptr->pruleheaderdata.fDataOnly = true; if(m_oField.IsInit()) ptr->pruleheaderdata.isxvd = m_oField.get(); + else + ptr->pruleheaderdata.isxvd = -1; if(m_oFieldPosition.IsInit()) ptr->pruleheaderdata.iDim = m_oFieldPosition->GetValue(); + else + ptr->pruleheaderdata.iDim = 0; if(m_oGrandCol.IsInit()) ptr->pruleheaderdata.fGrandCol = m_oGrandCol.get(); + else + ptr->pruleheaderdata.fGrandCol = false; if(m_oGrandRow.IsInit()) ptr->pruleheaderdata.fGrandRw = m_oGrandRow.get(); + else + ptr->pruleheaderdata.fGrandRw = false; if(m_oLabelOnly.IsInit()) ptr->pruleheaderdata.fLabelOnly = m_oLabelOnly.get(); + else + ptr->pruleheaderdata.fLabelOnly = false; if(m_oOffsetRef.IsInit()) ptr->pruleheaderdata.rfxLoc = m_oOffsetRef.get(); if(m_oOutline.IsInit()) ptr->pruleheaderdata.fLineMode = m_oOutline.get(); + else + ptr->pruleheaderdata.fLineMode = false; + ptr->pruleheaderdata.fPart = false; if(m_oType.IsInit()) { if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaNone) @@ -3204,6 +3284,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaTopEnd) ptr->pruleheaderdata.isxrtype = 0x06; } + else + ptr->pruleheaderdata.isxrtype = 0x01; return objectPtr; } void CPivotArea::fromBin(XLS::BaseObjectPtr& obj) @@ -3601,8 +3683,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" auto ptr(new XLSB::PivotCacheDefStream); XLS::BaseObjectPtr objectPtr(ptr); ptr->m_BrtBeginPivotCacheDef = writeAttributes(); - if(m_oCacheFields.IsInit()) - ptr->m_PCDFIELDS = m_oCacheFields->toBin(); + if(m_oCacheFields.IsInit()) + ptr->m_PCDFIELDS = m_oCacheFields->toBin(); if(m_oCacheSource.IsInit()) ptr->m_PCDSOURCE = m_oCacheSource->toBin(); if(m_oExtLst.IsInit()) @@ -3933,7 +4015,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr); ptr->m_BrtBeginPCDField = writeAttributes(); - if(m_oSharedItems.IsInit()) + if(m_oSharedItems.IsInit() && !m_oSharedItems->m_arrItems.empty()) ptr->m_PCDFATBL = m_oSharedItems->toBin(); if(m_oFieldGroup.IsInit()) ptr->m_PCDFGROUP = m_oFieldGroup->toBin(); @@ -4006,7 +4088,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oNumFmtId.IsInit()) ptr->ifmt = m_oNumFmtId->GetValue(); else - ptr->ifmt = 0xFFFFFFFF; + ptr->ifmt = 0; ptr->cbRgisxtmp = 0; @@ -5363,7 +5445,11 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) ptr->xnum.data.value = m_oValue.get(); - if(m_oBold.IsInit()) + if(m_oBold.IsInit() || m_oItalic.IsInit() || m_oStrike.IsInit() + || m_oUnderline.IsInit() || m_oFormatIndex.IsInit() || m_oForeColor.IsInit() ||m_oBackColor.IsInit()) + { + ptr->sxvcellextra.reset(new XLSB::PCDISrvFmt); + if(m_oBold.IsInit()) ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); if(m_oItalic.IsInit()) ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); @@ -5377,6 +5463,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); if(m_oForeColor.IsInit()) ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + } return objectPtr; } } From c223714b52f1396fc7ce2f69213cc614d37e12a9 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Fri, 22 Mar 2024 13:54:48 +0300 Subject: [PATCH 092/117] Fix bug 67066 --- .../graphics/pro/js/wasm/src/drawingfile.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp index ccb252acb2..c0d30a3c73 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp @@ -74,9 +74,15 @@ WASM_EXPORT int GetType(BYTE* data, LONG size) // 0 - PDF // 1 - DJVU // 2 - XPS - char* pFirst = strstr((char*)data, "%PDF-" ); - if (pFirst) - return 0; + LONG nHeaderSearchSize = 1024; + LONG nSize = size < nHeaderSearchSize ? size : nHeaderSearchSize; + char* pData = (char*)data; + for (int i = 0; i < nSize - 5; ++i) + { + int nPDF = strncmp(&pData[i], "%PDF-", 5); + if (!nPDF) + return 0; + } if ( (8 <= size) && (0x41 == data[0] && 0x54 == data[1] && 0x26 == data[2] && 0x54 == data[3] && 0x46 == data[4] && 0x4f == data[5] && 0x52 == data[6] && 0x4d == data[7])) return 1; From 510a6a621d0d42201768ec5b6b39be66162e7be1 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 25 Mar 2024 18:13:10 +0300 Subject: [PATCH 093/117] fix bug #67054 --- OdfFile/Reader/Format/styles.cpp | 46 +++++++++++++++++-- OdfFile/Reader/Format/styles.h | 2 + OdfFile/Writer/Converter/XlsxConverter.cpp | 51 +++++++++++++++++++++- 3 files changed, 95 insertions(+), 4 deletions(-) diff --git a/OdfFile/Reader/Format/styles.cpp b/OdfFile/Reader/Format/styles.cpp index 75cdd7736f..cd8ba22335 100644 --- a/OdfFile/Reader/Format/styles.cpp +++ b/OdfFile/Reader/Format/styles.cpp @@ -1433,6 +1433,34 @@ bool style_page_layout_properties::docx_background_serialize(std::wostream & str return true; } +int style_page_layout_properties::DetectPageSize(double w, double h) +{ + int result = 0; + + if (w > 209.99) // A4 and more + { + if ( w < 211 && h > 296 && h < 298) result = 9; // pagesizeA4Paper; + else if (w > 279 && w < 280 && h > 431 && h < 433) result = 3; // pagesizeTabloidPaper; + else if (w > 215 && w < 217 && h > 355 && h < 356) result = 6; // pagesizeLegalPaper; + else if (w > 296 && w < 298 && h > 419 && h < 421) result = 8; // pagesizeA3Paper; + else if (w > 256 && w < 258 && h > 363 && h < 365) result = 12; // pagesizeB4Paper; + else if (w > 215 && w < 217 && h > 329 && h < 331) result = 14; // pagesizeFolioPaper; + else if (w > 228 && w < 230 && h > 323 && h < 325) result = 30; // pagesizeC4Envelope; + else if (w > 215 && w < 217 && h > 278 && h < 280) result = 1; // pagesizeLetterPaper; + } + else + { + if (w > 183 && w < 185 && h > 265 && h < 267) result = 7; // pagesizeExecutivePaper; + else if (w > 147 && w < 149 && h > 209 && h < 211) result = 11; // pagesizeA5Paper; + else if (w > 181 && w < 183 && h > 256 && h < 259) result = 13; // pagesizeB5Paper; + else if (w > 103 && w < 106 && h > 240 && h < 243) result = 20; // pagesize10Envelope; + else if (w > 109 && w < 111 && h > 219 && h < 221) result = 27; // pagesizeDLEnvelope; + else if (w > 161 && w < 164 && h > 228 && h < 230) result = 28; // pagesizeC5Envelope; + else if (w > 97 && w < 100 && h > 189 && h < 192) result = 37; // pagesizeMonarchEnvelope; + } + + return result; +} void style_page_layout_properties::xlsx_serialize(std::wostream & strm, oox::xlsx_conversion_context & Context) { @@ -1525,14 +1553,26 @@ void style_page_layout_properties::xlsx_serialize(std::wostream & strm, oox::xls if (attlist_.fo_page_height_) { h = attlist_.fo_page_height_->get_value_unit(length::mm); - CP_XML_ATTR(L"paperHeight", (int)h); } if (attlist_.fo_page_width_) { w = attlist_.fo_page_width_->get_value_unit(length::mm); - CP_XML_ATTR(L"paperWidth", (int)w); } - CP_XML_ATTR(L"paperUnits", L"mm"); + + if (h > 0 && w > 0) + { + int paperSize = DetectPageSize(w, h); + if (0 < paperSize) + { + CP_XML_ATTR(L"paperSize", paperSize); + } + else + { + CP_XML_ATTR(L"paperHeight", (int)h); + CP_XML_ATTR(L"paperWidth", (int)w); + CP_XML_ATTR(L"paperUnits", L"mm"); + } + } if (attlist_.style_scale_to_) { diff --git a/OdfFile/Reader/Format/styles.h b/OdfFile/Reader/Format/styles.h index 8b78ced093..61cf51eaaa 100644 --- a/OdfFile/Reader/Format/styles.h +++ b/OdfFile/Reader/Format/styles.h @@ -967,6 +967,8 @@ private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); + + int DetectPageSize(double w, double h); }; CP_REGISTER_OFFICE_ELEMENT2(style_page_layout_properties); //------------------------------------------------------------------------------------------------------------------------- diff --git a/OdfFile/Writer/Converter/XlsxConverter.cpp b/OdfFile/Writer/Converter/XlsxConverter.cpp index 893a2abb37..f963d5c616 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.cpp +++ b/OdfFile/Writer/Converter/XlsxConverter.cpp @@ -1998,6 +1998,19 @@ void XlsxConverter::convert(OOX::Spreadsheet::CPageSetup *oox_page) width = odf_types::length(8.5, odf_types::length::inch); height = odf_types::length(11, odf_types::length::inch); break; + //case SimpleTypes::Spreadsheet::pagesizeLetterSmall: + case SimpleTypes::Spreadsheet::pagesizeTabloidPaper: + width = odf_types::length(279.4, odf_types::length::mm); + height = odf_types::length(431.8, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeLegalPaper: + width = odf_types::length(215.9, odf_types::length::mm); + height = odf_types::length(355.6, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeExecutivePaper: + width = odf_types::length(184.2, odf_types::length::mm); + height = odf_types::length(266.7, odf_types::length::mm); + break; case SimpleTypes::Spreadsheet::pagesizeA3Paper: width = odf_types::length(297, odf_types::length::mm); height = odf_types::length(420, odf_types::length::mm); @@ -2006,9 +2019,45 @@ void XlsxConverter::convert(OOX::Spreadsheet::CPageSetup *oox_page) width = odf_types::length(210, odf_types::length::mm); height = odf_types::length(297, odf_types::length::mm); break; + //case SimpleTypes::Spreadsheet::pagesizeA4SmallPaper: + case SimpleTypes::Spreadsheet::pagesizeA5Paper: + width = odf_types::length(148, odf_types::length::mm); + height = odf_types::length(210, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeB4Paper: + width = odf_types::length(257, odf_types::length::mm); + height = odf_types::length(364, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeB5Paper: + width = odf_types::length(182, odf_types::length::mm); + height = odf_types::length(257, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeFolioPaper: + width = odf_types::length(215.9, odf_types::length::mm); + height = odf_types::length(330.2, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesize10Envelope: + width = odf_types::length(104.7, odf_types::length::mm); + height = odf_types::length(241.3, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeDLEnvelope: + width = odf_types::length(110, odf_types::length::mm); + height = odf_types::length(220, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeC5Envelope: + width = odf_types::length(162, odf_types::length::mm); + height = odf_types::length(229, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeC4Envelope: + width = odf_types::length(229, odf_types::length::mm); + height = odf_types::length(324, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeMonarchEnvelope: + width = odf_types::length(98.4, odf_types::length::mm); + height = odf_types::length(190.5, odf_types::length::mm); + break; default: break; - //todooo } } ods_context->page_layout_context()->set_page_size(width, height); From b10e482fbb8d6bb11271bf79a64481d038ce62ba Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 25 Mar 2024 22:21:22 +0600 Subject: [PATCH 094/117] Fix dxf prop conversion --- .../Format/Logic/Biff_structures/XFProp.cpp | 124 ++++++++++++++---- 1 file changed, 98 insertions(+), 26 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp index 4fa7de73c5..2235ea10d9 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp @@ -85,7 +85,6 @@ void XFProp::load(CFRecord& record) case 0x000F: case 0x0010: case 0x0011: // XFPropTextRotation - case 0x0012: // indent case 0x0013: // ReadingOrder case 0x0014: case 0x0015: @@ -112,6 +111,7 @@ void XFProp::load(CFRecord& record) xfPropDataBlob = str; return; } + case 0x0012: // indent case 0x0019: case 0x001A: case 0x001B: @@ -141,6 +141,7 @@ void XFProp::load(CFRecord& record) } void XFProp::save(CFRecord& record) { + LPWideString* strData; if (xfPropDataBlob) { cb = sizeof(cb) + sizeof(xfPropType); @@ -152,7 +153,6 @@ void XFProp::save(CFRecord& record) case 0x000F: case 0x0010: case 0x0011: // XFPropTextRotation - case 0x0012: // indent case 0x0013: // ReadingOrder case 0x0014: case 0x0015: @@ -196,9 +196,12 @@ void XFProp::save(CFRecord& record) case 0x0026: case 0x0018: { - blobSize = sizeof(*xfPropDataBlob.get()); + strData = dynamic_cast(xfPropDataBlob.get()); + if(strData) + blobSize = (strData->getSize() * 2) + 2; } break; + case 0x0012: // indent case 0x0019: case 0x001A: case 0x001B: @@ -218,9 +221,8 @@ void XFProp::save(CFRecord& record) if (xfPropType == 0x0026 || xfPropType == 0x0018) { - LPWideString* string = dynamic_cast(xfPropDataBlob.get()); - if (string) - record << *string; + if (strData) + record << *strData; } else record << *xfPropDataBlob; @@ -345,6 +347,37 @@ static void deserialize_val_prop(XmlUtils::CXmlLiteReader& oReader, const std::w } } +static void deserialize_default_val(XmlUtils::CXmlLiteReader& oReader, const std::wstring & typeName, const _UINT32& value, BiffStructurePtr & val) +{ + BiffStructurePtr biffref; + deserialize_val_prop(oReader, typeName, biffref); + if (typeName == L"BIFF_WORD") + { + auto word = new BIFF_WORD; + if(biffref.get()) + { + *word = *(reinterpret_cast(biffref.get())); + } + else + { + *word = value; + } + val.reset(word); + } + else if(typeName == L"BIFF_BYTE") + { + auto word = new BIFF_BYTE; + if(biffref.get()) + { + *word = *(reinterpret_cast(biffref.get())); + } + else + { + *word = value; + } + val.reset(word); + } +} static void deserialize_prop(XmlUtils::CXmlLiteReader& oReader, const std::wstring & typeName, BiffStructurePtr & val) { auto value = oReader.GetText(); @@ -468,10 +501,46 @@ static XFPropBorder* deserialize_border_prop(XmlUtils::CXmlLiteReader& oReader) border->color.deserialize(oReader); } } + else + { + border->color.xclrType = 0; + border->color.fValidRGBA = false; + border->color.nTintShade = 0; + } return border; } - + static void deserialize_alignment(XmlUtils::CXmlLiteReader& oReader, const unsigned short & typeName, BiffStructurePtr & val) + { + BIFF_BYTE* byte_ = new BIFF_BYTE; + if (!byte_) return; + + auto value = oReader.GetText(); + if(typeName == 0x000F) + { + if (value == L"general") *byte_ = 0; + else if (value == L"left") *byte_ = 1; + else if (value == L"center") *byte_ = 2; + else if (value == L"right") *byte_ = 3; + else if (value == L"fill") *byte_ = 4; + else if (value == L"justify") *byte_ = 5; + else if (value == L"center-across-selection") *byte_ = 6; + else if (value == L"distributed") *byte_ = 7; + else *byte_ = 0xFF; + } + else if(typeName == 0x0010) + { + if (value == L"top") *byte_ = 0; + else if (value == L"center") *byte_ = 1; + else if (value == L"bottom") *byte_ = 2; + else if (value == L"justify") *byte_ = 3; + else if (value == L"distributed") *byte_ = 4; + else *byte_ = 0; + } + else + *byte_ = 0; + val.reset(byte_); + } void XFProp::serialize_attr(CP_ATTR_NODE) { switch(xfPropType) @@ -585,25 +654,34 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) case 0x000C: xfPropDataBlob.reset(deserialize_border_prop(oReader)); break; + case 0x000F: + case 0x0010: + deserialize_alignment(oReader, xfPropType, xfPropDataBlob); + break; case 0x000D: case 0x000E: - case 0x000F: - case 0x0010: case 0x0011: // XFPropTextRotation - case 0x0012: // indent case 0x0013: // ReadingOrder case 0x0014: case 0x0015: case 0x0016: //case 0x0017: - xfPropDataBlob.reset(new BIFF_BYTE(XmlUtils::GetInteger(oReader.GetText()))); + xfPropDataBlob.reset(new BIFF_BYTE(XmlUtils::GetInteger(oReader.GetText()))); + break;// + case 0x0018: + deserialize_val_prop(oReader, L"LPWideString", xfPropDataBlob); break; - case 0x001C: - case 0x001D: - case 0x001E: - case 0x001F: - case 0x0020: - case 0x0021: + case 0x0019: + deserialize_default_val(oReader, L"BIFF_WORD", 0x02BC, xfPropDataBlob); + break; + case 0x0020: + case 0x0021: + case 0x001C: + case 0x001D: + case 0x001E: + case 0x001F: + deserialize_default_val(oReader, L"BIFF_BYTE", 0x01, xfPropDataBlob); + break; case 0x0022: case 0x0023: xfPropDataBlob.reset(new BIFF_BYTE(1)); @@ -614,18 +692,12 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) case 0x002C: deserialize_prop(oReader, L"BIFF_BYTE", xfPropDataBlob); break; - case 0x0018: - deserialize_val_prop(oReader, L"LPWideString", xfPropDataBlob); - break; + case 0x0012: // indent case 0x0029: xfPropDataBlob.reset(new BIFF_WORD(XmlUtils::GetInteger(oReader.GetText()))); break; - case 0x0019: - xfPropDataBlob.reset(new BIFF_WORD(0x02BC1)); - deserialize_val_prop(oReader, L"BIFF_WORD", xfPropDataBlob); - break; case 0x001A: - xfPropDataBlob.reset(new BIFF_WORD(1)); + //xfPropDataBlob.reset(new BIFF_WORD(1)); case 0x001B: case 0x002A: deserialize_val_prop(oReader, L"BIFF_WORD", xfPropDataBlob); @@ -640,7 +712,7 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) } int XFProp::serialize(std::wostream & stream) { - CP_XML_WRITER(stream) + CP_XML_WRITER(stream) { switch(xfPropType) { From 4cc7ec1ed07db808f3690106af9acf93ffe196f5 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 26 Mar 2024 18:03:51 +0600 Subject: [PATCH 095/117] Fix dxfs conversion --- .../XlsFile/Format/Logic/Biff_structures/XFProp.cpp | 8 +++++--- .../XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp index 2235ea10d9..4473f52edb 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp @@ -605,7 +605,8 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) if (value == L"none") *byte_ = 0; else if (value == L"solid") *byte_ = 1; else if (value == L"pct50") *byte_ = 2; - else if (value == L"pct75") *byte_ = 3; + else if (value == L"pct75" || value == L"darkGray") + *byte_ = 3; else if (value == L"pct25") *byte_ = 4; else if (value == L"horzStripe") *byte_ = 5; else if (value == L"vertStripe") *byte_ = 6; @@ -621,7 +622,8 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) else if (value == L"thinDiagCross") *byte_ = 16; else if (value == L"gray125") *byte_ = 17; else if (value == L"gray0625") *byte_ = 18; - + else *byte_ = 1; + xfPropDataBlob.reset(byte_); }break; @@ -703,7 +705,7 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) deserialize_val_prop(oReader, L"BIFF_WORD", xfPropDataBlob); break; case 0x0024: - xfPropDataBlob.reset(new BIFF_DWORD(XmlUtils::GetInteger(oReader.GetText()))); + deserialize_val_prop(oReader, L"BIFF_DWORD", xfPropDataBlob); break; case 0x0026: xfPropDataBlob.reset(new LPWideString(oReader.GetText())); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp index 2d4075c68f..a505a8d8d5 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp @@ -120,11 +120,14 @@ int XFPropColor::deserialize(XmlUtils::CXmlLiteReader& oReader) dwRgba.Parse(oReader.GetText()); fValidRGBA = true; } - else if (wsPropName == L"tint") + if (wsPropName == L"tint") { nTintShade = XmlUtils::GetDouble(oReader.GetText()) * 32767.0; } - + else + { + nTintShade = 0; + } if (!oReader.MoveToNextAttribute()) break; From cbac820495f11960d9f5791b8d159f753c09ef7f Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 26 Mar 2024 17:37:06 +0300 Subject: [PATCH 096/117] fix bug #67066 --- Common/OfficeFileFormatChecker2.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index 2ee7f1bede..79b51dee73 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -236,6 +236,15 @@ bool COfficeFileFormatChecker::isPdfFormatFile(unsigned char *pBuffer, int dwByt char *pFirst = strstr((char *)pBuffer, "%PDF-"); + if (NULL == pFirst) + { + //skip special + _UINT16 sz = pBuffer[0] + (pBuffer[1] << 8); + if (sz < dwBytes - 8) + { + pFirst = strstr((char*)(pBuffer + sz), "%PDF-"); + } + } if (NULL != pFirst) { pFirst = strstr((char *)pBuffer, "%DocumentID "); From 53b93ed9f2cdf2cdcfda633bc09828479c4e6be2 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 26 Mar 2024 19:34:29 +0300 Subject: [PATCH 097/117] fix bug #67109 --- OdfFile/Reader/Format/styles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OdfFile/Reader/Format/styles.cpp b/OdfFile/Reader/Format/styles.cpp index cd8ba22335..719295d0d0 100644 --- a/OdfFile/Reader/Format/styles.cpp +++ b/OdfFile/Reader/Format/styles.cpp @@ -1441,7 +1441,7 @@ int style_page_layout_properties::DetectPageSize(double w, double h) { if ( w < 211 && h > 296 && h < 298) result = 9; // pagesizeA4Paper; else if (w > 279 && w < 280 && h > 431 && h < 433) result = 3; // pagesizeTabloidPaper; - else if (w > 215 && w < 217 && h > 355 && h < 356) result = 6; // pagesizeLegalPaper; + else if (w > 215 && w < 217 && h > 354 && h < 356) result = 5; // pagesizeLegalPaper; else if (w > 296 && w < 298 && h > 419 && h < 421) result = 8; // pagesizeA3Paper; else if (w > 256 && w < 258 && h > 363 && h < 365) result = 12; // pagesizeB4Paper; else if (w > 215 && w < 217 && h > 329 && h < 331) result = 14; // pagesizeFolioPaper; From c961f00fd116e2c66ab6f9653b2f0c0dbf301fc6 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 26 Mar 2024 20:06:43 +0300 Subject: [PATCH 098/117] fix bug #67043 --- OdfFile/Reader/Format/paragraph_elements.cpp | 27 ++++++++++--------- .../Writer/Format/odt_conversion_context.cpp | 9 +++++++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/OdfFile/Reader/Format/paragraph_elements.cpp b/OdfFile/Reader/Format/paragraph_elements.cpp index 57e4549b0d..4b90ab12db 100644 --- a/OdfFile/Reader/Format/paragraph_elements.cpp +++ b/OdfFile/Reader/Format/paragraph_elements.cpp @@ -740,16 +740,16 @@ void a::add_space(const std::wstring & Text) } void a::docx_convert(oox::docx_conversion_context & Context) { - bool pushed_style = false; - - bool addNewRun = false; - Context.finish_run(); - - std::wostream & _Wostream = Context.output_stream(); - std::wstring ref = xlink_attlist_.href_.get_value_or(L""); + if (ref.empty()) return; + + bool pushed_style = false; + bool addNewRun = false; + + Context.finish_run(); - if (Context.is_table_content()) + std::wostream& _Wostream = Context.output_stream(); + if (Context.is_table_content() || office_target_frame_name_ || ref[0] == L'#') { size_t pos_outline = ref.find(L"|outline"); if (std::wstring::npos != pos_outline)//без # @@ -766,11 +766,14 @@ void a::docx_convert(oox::docx_conversion_context & Context) { ref = XmlUtils::EncodeXmlString(ref.substr(1)); } - _Wostream << L""; - int type = Context.get_table_content_context().get_type_current_content_template_index(); - //type == 3 (LinkStart) - Context.get_table_content_context().next_level_index(); + + if (Context.is_table_content()) + { + int type = Context.get_table_content_context().get_type_current_content_template_index(); + //type == 3 (LinkStart) + Context.get_table_content_context().next_level_index(); + } } else { diff --git a/OdfFile/Writer/Format/odt_conversion_context.cpp b/OdfFile/Writer/Format/odt_conversion_context.cpp index 89c8a3a133..28d20c9bf8 100644 --- a/OdfFile/Writer/Format/odt_conversion_context.cpp +++ b/OdfFile/Writer/Format/odt_conversion_context.cpp @@ -590,6 +590,15 @@ void odt_conversion_context::start_hyperlink(const std::wstring& link, const std text_a* hyperlink = dynamic_cast(hyperlink_elm.get()); if (hyperlink) { + if (location == L"_top") + hyperlink->office_target_frame_name_ = odf_types::target_frame_name::Top; + else if (location == L"_blank") + hyperlink->office_target_frame_name_ = odf_types::target_frame_name::Blank; + else if (location == L"_self") + hyperlink->office_target_frame_name_ = odf_types::target_frame_name::Self; + else if (location == L"_parent") + hyperlink->office_target_frame_name_ = odf_types::target_frame_name::Parent; + hyperlink->common_xlink_attlist_.href_ = link + (location.empty() ? L"" : (L"#" + location)); hyperlink->common_xlink_attlist_.type_ = xlink_type::Simple; From e2d278c74bd3ae7cc1d4f6a6f4b700132e08756e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 27 Mar 2024 14:54:22 +0600 Subject: [PATCH 099/117] Fix dxfs conversion --- MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp index 4473f52edb..fe040d36be 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp @@ -696,12 +696,12 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) break; case 0x0012: // indent case 0x0029: + case 0x002A: xfPropDataBlob.reset(new BIFF_WORD(XmlUtils::GetInteger(oReader.GetText()))); break; case 0x001A: //xfPropDataBlob.reset(new BIFF_WORD(1)); case 0x001B: - case 0x002A: deserialize_val_prop(oReader, L"BIFF_WORD", xfPropDataBlob); break; case 0x0024: From f203f73a4b2cd02fc99b9b98b5a4d770c579cc1e Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 27 Mar 2024 18:40:38 +0300 Subject: [PATCH 100/117] fix bug #67087 --- .../Reader/Converter/drawing_object_description.h | 2 ++ OdfFile/Reader/Converter/pptx_drawing.cpp | 15 +++++++++++---- OdfFile/Reader/Converter/pptx_slide_context.cpp | 9 ++++++++- OdfFile/Reader/Converter/pptx_slide_context.h | 1 + OdfFile/Reader/Format/draw_frame_pptx.cpp | 7 ++++++- OdfFile/Writer/Format/odf_drawing_context.cpp | 4 ++-- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/OdfFile/Reader/Converter/drawing_object_description.h b/OdfFile/Reader/Converter/drawing_object_description.h index d29c86e429..692fb11fd6 100644 --- a/OdfFile/Reader/Converter/drawing_object_description.h +++ b/OdfFile/Reader/Converter/drawing_object_description.h @@ -76,6 +76,8 @@ struct drawing_object_description _action_desc action_; std::vector<_hlink_desc> hlinks_; + bool hidden_; + std::vector additional_; //shape properties std::wstring xlink_href_; //ссылка на внешний объект diff --git a/OdfFile/Reader/Converter/pptx_drawing.cpp b/OdfFile/Reader/Converter/pptx_drawing.cpp index 757b27653d..1c91de4048 100644 --- a/OdfFile/Reader/Converter/pptx_drawing.cpp +++ b/OdfFile/Reader/Converter/pptx_drawing.cpp @@ -76,7 +76,8 @@ void pptx_serialize_image(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); - + if (val.hidden) CP_XML_ATTR(L"hidden", true); + oox_serialize_action(CP_XML_STREAM(), val.action); } @@ -123,6 +124,7 @@ void pptx_serialize_media(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); + if (val.hidden) CP_XML_ATTR(L"hidden", true); oox_serialize_action(CP_XML_STREAM(), val.action); @@ -210,6 +212,7 @@ void pptx_serialize_shape(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id);//числовое значение val.rId CP_XML_ATTR(L"name", val.name); + if (val.hidden) CP_XML_ATTR(L"hidden", true); oox_serialize_action(CP_XML_STREAM(),val.action); } @@ -270,6 +273,7 @@ void pptx_serialize_connector(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id);//числовое значение val.rId CP_XML_ATTR(L"name", val.name); + if (val.hidden) CP_XML_ATTR(L"hidden", true); oox_serialize_action(CP_XML_STREAM(), val.action); } @@ -342,7 +346,8 @@ void pptx_serialize_chart(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); - } + if (val.hidden) CP_XML_ATTR(L"hidden", true); + } CP_XML_NODE(L"p:cNvGraphicFramePr"); CP_XML_NODE(L"p:nvPr"); @@ -379,7 +384,8 @@ void pptx_serialize_table(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); - } + if (val.hidden) CP_XML_ATTR(L"hidden", true); + } CP_XML_NODE(L"p:cNvGraphicFramePr"); CP_XML_NODE(L"p:nvPr"); @@ -420,7 +426,8 @@ void pptx_serialize_object(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); - } + if (val.hidden) CP_XML_ATTR(L"hidden", true); + } CP_XML_NODE(L"p:cNvGraphicFramePr"); CP_XML_NODE(L"p:nvPr"); diff --git a/OdfFile/Reader/Converter/pptx_slide_context.cpp b/OdfFile/Reader/Converter/pptx_slide_context.cpp index cc9248c690..a2c2deae66 100644 --- a/OdfFile/Reader/Converter/pptx_slide_context.cpp +++ b/OdfFile/Reader/Converter/pptx_slide_context.cpp @@ -290,6 +290,8 @@ void pptx_slide_context::default_set() impl_->object_description_.connector_ = false; impl_->object_description_.lined_ = false; + impl_->object_description_.hidden_ = false; + impl_->object_description_.start_shape_id = boost::none; impl_->object_description_.start_shape_glue_point = boost::none; impl_->object_description_.end_shape_id = boost::none; @@ -466,6 +468,10 @@ void pptx_slide_context::set_id(std::wstring const& id) { impl_->object_description_.xml_id_ = id; } +void pptx_slide_context::set_hidden(bool val) +{ + impl_->object_description_.hidden_ = val; +} void pptx_slide_context::start_shape(int type) { @@ -841,7 +847,8 @@ void pptx_slide_context::Impl::process_common_properties(drawing_object_descript val = (int)(0.5 + odf_types::length(pic.svg_rect_->cy, odf_types::length::pt).get_value_unit(odf_types::length::emu)); if ( val >=0 ) drawing.cy = val; } - + + drawing.hidden = pic.hidden_; drawing.additional = pic.additional_; drawing.hlinks = pic.hlinks_; drawing.action = pic.action_; diff --git a/OdfFile/Reader/Converter/pptx_slide_context.h b/OdfFile/Reader/Converter/pptx_slide_context.h index a7e0d0e751..85f6412449 100644 --- a/OdfFile/Reader/Converter/pptx_slide_context.h +++ b/OdfFile/Reader/Converter/pptx_slide_context.h @@ -73,6 +73,7 @@ public: std::vector & get_properties(); void set_clipping (const std::wstring & str ); void set_fill (_oox_fill & fill); + void set_hidden (bool val); void set_is_line_shape(bool val); void set_is_connector_shape(bool val); diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 70bf37bf33..83927b7898 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -88,7 +88,7 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) { common_shape_draw_attlist &common_draw_attlist_ = common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_; common_presentation_attlist &common_presentation_attlist_ = common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_; - + const unsigned int z_index = common_draw_attlist_.draw_z_index_.get_value_or(0); const std::wstring name = common_draw_attlist_.draw_name_.get_value_or(L""); const std::wstring textStyleName = common_draw_attlist_.draw_text_style_name_.get_value_or(L""); @@ -191,6 +191,11 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) Context.get_slide_context().set_placeHolder_idx(idx_in_owner); } + if (common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_) + { + Context.get_slide_context().set_hidden(true); + } + if (!textStyleName.empty()) { odf_reader::style_instance* textStyleInst = diff --git a/OdfFile/Writer/Format/odf_drawing_context.cpp b/OdfFile/Writer/Format/odf_drawing_context.cpp index adc1d3b981..576ce8e805 100644 --- a/OdfFile/Writer/Format/odf_drawing_context.cpp +++ b/OdfFile/Writer/Format/odf_drawing_context.cpp @@ -433,7 +433,7 @@ void odf_drawing_context::start_group() //if (!impl_->current_drawing_state_.description_.empty()) // group->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_name_ = impl_->current_drawing_state_.description_; if (impl_->current_drawing_state_.hidden_) - group->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_ = L"printer"; + group->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_ = L"printer"; // L"none" ??? if (!impl_->current_drawing_state_.xml_id_.empty()) group->xml_id_ = impl_->current_drawing_state_.xml_id_; @@ -630,7 +630,7 @@ void odf_drawing_context::end_drawing() if (impl_->current_drawing_state_.z_order_ >= 0) draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_z_index_ = impl_->current_drawing_state_.z_order_; if (impl_->current_drawing_state_.hidden_) - draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_ = L"printer"; + draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_ = L"printer"; // L"none" ??? if (!impl_->current_drawing_state_.xml_id_.empty()) draw->xml_id_ = impl_->current_drawing_state_.xml_id_; From b7a4c739ebe18b8e07b0a7313521e988d2ec220a Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 28 Mar 2024 13:40:59 +0300 Subject: [PATCH 101/117] fix bug #67121 --- .../Vml/PPTShape/Ppt2PptxShapeConverter.cpp | 8 ++--- MsBinaryFile/Common/Vml/VmlPath.cpp | 2 ++ .../ASCOfficeDrawingConverter.cpp | 34 ++++++------------- 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/MsBinaryFile/Common/Vml/PPTShape/Ppt2PptxShapeConverter.cpp b/MsBinaryFile/Common/Vml/PPTShape/Ppt2PptxShapeConverter.cpp index 110e92af9f..c6c4fa7db8 100644 --- a/MsBinaryFile/Common/Vml/PPTShape/Ppt2PptxShapeConverter.cpp +++ b/MsBinaryFile/Common/Vml/PPTShape/Ppt2PptxShapeConverter.cpp @@ -49,7 +49,7 @@ namespace NSGuidesVML point.x = lParam; if (m_eRuler != rtRMoveTo && m_eRuler != rtRLineTo && m_eRuler != rtRCurveTo) { - //point.x -= m_lX; + point.x -= m_lX; } point.y = 0; pointType.x = eParType; @@ -62,7 +62,7 @@ namespace NSGuidesVML m_arPoints.back().y = lParam; if (m_eRuler != rtRMoveTo && m_eRuler != rtRLineTo && m_eRuler != rtRCurveTo) { - //m_arPoints.back().y -= m_lY; + m_arPoints.back().y -= m_lY; } m_arPointsType.back().y = eParType; @@ -272,8 +272,8 @@ namespace NSGuidesVML m_lWidth = oPart.width; m_lHeight = oPart.height; - //m_lX = oPart.x; - //m_lY = oPart.y; + m_lX = oPart.x; + m_lY = oPart.y; } bool bFill = false; diff --git a/MsBinaryFile/Common/Vml/VmlPath.cpp b/MsBinaryFile/Common/Vml/VmlPath.cpp index a093071b19..868d598814 100644 --- a/MsBinaryFile/Common/Vml/VmlPath.cpp +++ b/MsBinaryFile/Common/Vml/VmlPath.cpp @@ -852,6 +852,8 @@ namespace ODRAW for (size_t nIndex = 0; nIndex < oArray.size(); ++nIndex) { + if (oArray[nIndex].empty()) continue; + CPartPath part; part.x = m_lX; diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index 6fd1940e89..07ef977c65 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -2297,7 +2297,7 @@ void CDrawingConverter::ConvertDrawing(PPTX::Logic::SpTreeElem *elem, XmlUtils:: } } } -void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CXmlNode& oNodeShape, std::wstring**& pMainProps,bool bIsTop) +void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CXmlNode& oNodeShape, std::wstring**& pMainProps, bool bIsTop) { if (!elem) return; @@ -3436,11 +3436,11 @@ void CDrawingConverter::ConvertWordArtShape(PPTX::Logic::SpTreeElem* elem, XmlUt strRPr += L""; nullable_string sStrokeColor; - nullable_string sStrokeWeight; + nullable oStrokeWeight; nullable_string sStroked; XmlMacroReadAttributeBase(oNodeShape, L"strokecolor", sStrokeColor); - XmlMacroReadAttributeBase(oNodeShape, L"strokeweight", sStrokeWeight); + XmlMacroReadAttributeBase(oNodeShape, L"strokeweight", oStrokeWeight); XmlMacroReadAttributeBase(oNodeShape, L"stroked", sStroked); XmlUtils::CXmlNode oNodeStroke = oNodeShape.ReadNode(L"v:stroke"); @@ -3580,18 +3580,13 @@ void CDrawingConverter::ConvertWordArtShape(PPTX::Logic::SpTreeElem* elem, XmlUt strRPr += L""; //textOutline - double m_dValue = 1; - if (sStrokeWeight.is_init()) + double m_dValuePt = 1; + if (oStrokeWeight.is_init()) { - std::wstring strW(*sStrokeWeight); - int p = (int)strW.find(L"pt"); - if (p >= 0) - strW.erase(p); - - m_dValue = XmlUtils::GetDouble(strW); + m_dValuePt = oStrokeWeight->GetValue(); } - std::wstring strStrokeW = std::to_wstring((int)Pt_To_Emu(m_dValue)); + std::wstring strStrokeW = std::to_wstring((int)Pt_To_Emu(m_dValuePt)); strRPr += L""; smart_ptr pSolid = new PPTX::Logic::SolidFill(); @@ -3909,7 +3904,6 @@ void CDrawingConverter::LoadCoordPos(XmlUtils::CXmlNode& oNode, CShapePtr pShape } } } - pShape->getBaseShape()->m_oPath.SetCoordpos((LONG)pShape->m_dXLogic, (LONG)pShape->m_dYLogic); } @@ -5381,22 +5375,16 @@ void CDrawingConverter::CheckPenShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils:: } } - nullable_string sStrokeWeight; - XmlMacroReadAttributeBase(oNode, L"strokeweight", sStrokeWeight); - if (sStrokeWeight.is_init()) + nullable oStrokeWeight; + XmlMacroReadAttributeBase(oNode, L"strokeweight", oStrokeWeight); + if (oStrokeWeight.is_init()) { pPPTShape->m_bIsStroked = true; if (!pSpPr->ln.is_init()) pSpPr->ln = new PPTX::Logic::Ln(); - if (sStrokeWeight->length() > 0 && sStrokeWeight->at(0) == wchar_t('.')) - { - sStrokeWeight = (L"0" + *sStrokeWeight); - } - - SimpleTypes::CPoint oPoint; - int size = (int)(g_emu_koef * oPoint.FromString(*sStrokeWeight)); + int size = oStrokeWeight->ToEmu(); pSpPr->ln->w = size; pPPTShape->m_bIsStroked = true; From 8332560d061efd42f4cd84b7b7f53b31e984f001 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 29 Mar 2024 15:31:52 +0600 Subject: [PATCH 102/117] Fix data validations --- .../Format/Logic/Biff_records/DVal.cpp | 6 ++- .../XlsFile/Format/Logic/Biff_records/Dv.cpp | 48 +++++++++++++------ .../Logic/Biff_structures/DVParsedFormula.cpp | 46 +++++++++++++----- .../XlsxFormat/Worksheets/DataValidation.cpp | 4 ++ 4 files changed, 76 insertions(+), 28 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/DVal.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/DVal.cpp index c65c93fd14..c44852c18d 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/DVal.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/DVal.cpp @@ -62,9 +62,13 @@ void DVal::readFields(CFRecord& record) void DVal::writeFields(CFRecord& record) { _UINT16 flags = 0; + _UINT32 reserved = 0; SETBIT(flags, 0, fWnClosed); - record << flags << xLeft << yTop << idObj << idvMac; + if(record.getGlobalWorkbookInfo()->Version < 0x0800) + record << flags << xLeft << yTop << idObj << idvMac; + else + record << flags << xLeft << yTop << reserved << idvMac; } } // namespace XLS diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Dv.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Dv.cpp index e55f2caebf..825d8c5af4 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Dv.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Dv.cpp @@ -142,20 +142,33 @@ void Dv::writeFields(CFRecord& record) record << FRTheader; _UINT32 flags = 0; + if(record.getGlobalWorkbookInfo()->Version < 0x0800) + { + SETBITS(flags, 0, 3, valType) + SETBITS(flags, 4, 6, errStyle) - SETBITS(flags, 0, 3, valType) - SETBITS(flags, 4, 6, errStyle) - - SETBIT(flags, 7, fStrLookup) - SETBIT(flags, 8, fAllowBlank) - SETBIT(flags, 9, fSuppressCombo) - SETBITS(flags, 10, 17, mdImeMode) - SETBIT(flags, 18, fShowInputMsg) - SETBIT(flags, 19, fShowErrorMsg) - SETBITS(flags, 20, 23, typOperator) - SETBIT(flags, 24, fDVMinFmla) - SETBIT(flags, 25, fDVMaxFmla) + SETBIT(flags, 7, fStrLookup) + SETBIT(flags, 8, fAllowBlank) + SETBIT(flags, 9, fSuppressCombo) + SETBITS(flags, 10, 17, mdImeMode) + SETBIT(flags, 18, fShowInputMsg) + SETBIT(flags, 19, fShowErrorMsg) + SETBITS(flags, 20, 23, typOperator) + SETBIT(flags, 24, fDVMinFmla) + SETBIT(flags, 25, fDVMaxFmla) + } + else + { + SETBITS(flags, 0, 3, valType) + SETBITS(flags, 4, 6, errStyle) + SETBIT(flags, 8, fAllowBlank) + SETBIT(flags, 9, fSuppressCombo) + SETBITS(flags, 10, 17, mdImeMode) + SETBIT(flags, 18, fShowInputMsg) + SETBIT(flags, 19, fShowErrorMsg) + SETBITS(flags, 20, 23, typOperator) + } record << flags; if (record.getGlobalWorkbookInfo()->Version < 0x0800) @@ -174,10 +187,17 @@ void Dv::writeFields(CFRecord& record) XLSB::DValStrings dvalstr; dvalstr.strPromptTitle = PromptTitle; - dvalstr.strErrorTitle = ErrorTitle; + if(!PromptTitle.size()) + dvalstr.strPromptTitle.setSize(0xFFFFFFFF); + dvalstr.strErrorTitle = ErrorTitle; + if(!ErrorTitle.size()) + dvalstr.strErrorTitle.setSize(0xFFFFFFFF); dvalstr.strPrompt = Prompt; + if(!Prompt.size()) + dvalstr.strPrompt.setSize(0xFFFFFFFF); dvalstr.strError = Error; - + if(!Error.size()) + dvalstr.strError.setSize(0xFFFFFFFF); record << dvalstr; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/DVParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/DVParsedFormula.cpp index ca52fba9e9..447b0e0b83 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/DVParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/DVParsedFormula.cpp @@ -93,31 +93,51 @@ void DVParsedFormula::save(CFRecord& record, bool bSave) else { cce = 0; - record << cce; + auto cb = 0; + record << cce << cb; } } void DVParsedFormula::save(CFRecord& record) { - auto saving = [&](BiffStructure& rgceORrgb) + if (record.getGlobalWorkbookInfo()->Version < 0x0800) { - record << cce; + auto saving = [&](BiffStructure& rgceORrgb) + { + record << cce; - auto rdPtr = record.getRdPtr(); + auto rdPtr = record.getRdPtr(); - rgceORrgb.save(record); + rgceORrgb.save(record); - cce = record.getRdPtr() - rdPtr; + cce = record.getRdPtr() - rdPtr; - record.RollRdPtrBack(cce + 4); - record << cce; - record.skipNunBytes(cce); - }; + record.RollRdPtrBack(cce + 4); + record << cce; + record.skipNunBytes(cce); + }; - saving(rgce); - - if (record.getGlobalWorkbookInfo()->Version == 0x0800) + saving(rgce); + } + else { + _UINT32 size = 0; + auto saving = [&](BiffStructure& rgceORrgb) + { + record << size; + + auto rdPtr = record.getRdPtr(); + + rgceORrgb.save(record); + + size = record.getRdPtr() - rdPtr; + + record.RollRdPtrBack(size + 4); + record << size; + record.skipNunBytes(size); + }; + + saving(rgce); saving(rgcb); } } diff --git a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp index fb9b99a69e..c5b4acd5c6 100644 --- a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp +++ b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp @@ -290,7 +290,11 @@ xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">"); ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThanOrEqual; else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThanOrEqual) ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThanOrEqual; + else + ptr->typOperator = XLS::_typOperatorDv::operatorDvBetween; } + else + ptr->typOperator = XLS::_typOperatorDv::operatorDvBetween; if(m_oShowDropDown.IsInit()) ptr->fSuppressCombo = m_oShowDropDown->GetValue(); From 2156d6e13411ca74260c0c89c050ab916c88a34f Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 29 Mar 2024 17:28:02 +0300 Subject: [PATCH 103/117] fix bug #66842 --- OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp index 197b67eef3..a6358c9f98 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp @@ -284,6 +284,9 @@ public: case 14: CP_XML_ATTR(L"iconSet", L"5ArrowsGray"); break; case 15: CP_XML_ATTR(L"iconSet", L"5Quarters"); break; case 16: CP_XML_ATTR(L"iconSet", L"5Rating"); break; + case 17: CP_XML_ATTR(L"iconSet", L"3Triangles"); break; + case 18: CP_XML_ATTR(L"iconSet", L"3Stars"); break; + case 19: CP_XML_ATTR(L"iconSet", L"5Boxes"); break; case 0: default: CP_XML_ATTR(L"iconSet", L"3Arrows"); break; break; From 3d394b173cd76799748f11415e83b0781acac259 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 9 Feb 2024 12:13:06 +0300 Subject: [PATCH 104/117] fix bugs (cherry picked from commit 97ddd35653e715aa69f0330fde9e6e3c77b96b0f) --- .../StarMath2OOXML/cstarmathpars.cpp | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index c256c4e238..eac1e96bf8 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -153,7 +153,7 @@ namespace StarMath return SetLeft(pLeftArg,pElementWhichAdd); } default: - return false; + break; } } else return false; @@ -435,6 +435,7 @@ namespace StarMath } } +//нет phantom, rgb, 16 , гарнитуры и кегля TypeElement CAttribute::GetTypeColorAttribute(const std::wstring &wsToken) { if(L"color" == wsToken) return TypeElement::color; @@ -655,9 +656,9 @@ namespace StarMath pReader->ReadingTheNextToken(); while((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { - CElement* pElementWithRightArgument = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTempElement,pElementWithRightArgument); - pTempElement = pElementWithRightArgument; + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTempElement,pElement); + pTempElement = pElement; pReader->ReadingTheNextToken(); } SetRightArg(pTempElement); @@ -870,7 +871,7 @@ namespace StarMath pReader->ClearReader(); } CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - if(pTempElement!= nullptr &&( !m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType()))) + if(pTempElement != nullptr &&(!m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType()))) { if(CParserStarMathString::AddLeftArgument(m_arBrecketValue.back(),pTempElement)) m_arBrecketValue.pop_back(); @@ -1898,16 +1899,16 @@ namespace StarMath { if(pReader->CheckIteratorPosition()) { - CElement* pTemp = CParserStarMathString::ParseElement(pReader); + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); while(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) { - CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTemp,pTempElement); - pTemp = pTempElement; + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(pTempElement,pElement); + pTempElement = pElement; pReader->ReadingTheNextToken(); } - SetValueFunction(pTemp); + SetValueFunction(pTempElement); } else SetValueFunction(nullptr); From fcd0bec3ac9e1374deeb49f84131c18d86831864 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 16 Feb 2024 11:23:46 +0300 Subject: [PATCH 105/117] conversion of unary symbols. code refactoring. (cherry picked from commit 89287887a0a6c1914f042120a9da2e335f0d3af2) --- .../StarMath2OOXML/TestSMConverter/main.cpp | 34 ++++- .../StarMath2OOXML/cstarmathpars.cpp | 135 +++++++++++------- .../Converter/StarMath2OOXML/cstarmathpars.h | 12 ++ 3 files changed, 128 insertions(+), 53 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index 5914ccfd95..ecffde6bb6 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -1080,7 +1080,7 @@ TEST(SMConvectorTest,OverWithoutLeft) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString =L"\u00B12105"; + std::wstring wsXmlString =L"\u00B12105"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1090,7 +1090,37 @@ TEST(SMConvectorTest,Newline) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2323102"; + std::wstring wsXmlString = L"23102"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexAndBinOp) +{ + std::wstring wsString = L"2 union 3^4 over 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2\u22C33410"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example7) +{ + std::wstring wsString = L" %DELTA t' = { %DELTA t } over sqrt{ 1 - v^2 over c^2 }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"\u0394t'=\u0394t1-v2c2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,UnarySign) +{ + std::wstring wsString = L"3+6 over 9 newline -+5 over 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"3+69\u2213510"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index eac1e96bf8..d93794d467 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -42,33 +42,24 @@ namespace StarMath pReader->SetBaseAttribute(pBaseAttribute); while(pReader->CheckIteratorPosition()) { - CElement* pTempElement; if(pReader->GetLocalType() == TypeElement::newline) { m_arEquation.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); pReader->ClearReader(); } - else - pTempElement = ParseElement(pReader); - if(nullptr == pTempElement) - continue; - if(!m_arEquation.empty() && CheckForLeftArgument(pTempElement->GetBaseType()) ) - { - if(AddLeftArgument(m_arEquation.back(),pTempElement)) - m_arEquation.pop_back(); - } - m_arEquation.push_back(pTempElement); + if(!m_arEquation.empty()) + CElementBinOperator::UnaryCheck(pReader,m_arEquation.back()); + CElement* pTempElement = ParseElement(pReader); + AddingAnElementToAnArray(m_arEquation,pTempElement); } if(!pReader->EmptyString()) { - CElement* pTempElement; if(pReader->GetLocalType() == TypeElement::newline) { m_arEquation.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); pReader->ClearReader(); } - else - pTempElement = ParseElement(pReader); + CElement* pTempElement = ParseElement(pReader); if(nullptr != pTempElement) m_arEquation.push_back(pTempElement); } @@ -112,12 +103,8 @@ namespace StarMath T* pTempElement = dynamic_cast(pElementWhichAdd); if(pTempElement->GetLeftArg() == nullptr) { - if(pLeftArg->GetBaseType() == TypeElement::SpecialSymbol) - { - CElementSpecialSymbol* pSpecial = dynamic_cast(pLeftArg); - if(pSpecial->GetType() == TypeElement::newline) - return false; - } + if(CParserStarMathString::CheckNewline(pLeftArg)) + return false; pTempElement->SetLeftArg(pLeftArg); pElementWhichAdd = pTempElement; return true; @@ -137,8 +124,7 @@ namespace StarMath } case TypeElement::SetOperations: { - SetLeft(pLeftArg, pElementWhichAdd); - break; + return SetLeft(pLeftArg, pElementWhichAdd); } case TypeElement::Connection: { @@ -192,6 +178,34 @@ namespace StarMath return false; } } + bool CParserStarMathString::CheckNewline(CElement* pElement) + { + if(pElement->GetBaseType() == TypeElement::SpecialSymbol) + { + CElementSpecialSymbol* pSpecial = dynamic_cast(pElement); + return (pSpecial->GetType() == TypeElement::newline); + } + return false; + } + void CParserStarMathString::AddingAnElementToAnArray(std::vector &arrEquation, CElement *pAddElement) + { + if(pAddElement !=nullptr) + { + if(!arrEquation.empty() && CheckForLeftArgument(pAddElement->GetBaseType())) + { + if(AddLeftArgument(arrEquation.back(),pAddElement)) + arrEquation.pop_back(); + } + arrEquation.push_back(pAddElement); + } + } + void CParserStarMathString::ReadingElementsWithPriorities(CStarMathReader *pReader, CElement *&pLeftElement) + { + CElement* pNextElement = ParseElement(pReader); + AddLeftArgument(pLeftElement,pNextElement); + pLeftElement = pNextElement; + pReader->ReadingTheNextToken(); + } //class methods CAttribute CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0) { @@ -647,19 +661,19 @@ namespace StarMath SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader)); } else if(m_enTypeBinOp == TypeElement::And || m_enTypeBinOp == TypeElement::neg) + SetRightArg(CParserStarMathString::ParseElement(pReader)); + else if(pReader->GetMarkForUnar() && MixedOperators(m_enTypeBinOp)) { SetRightArg(CParserStarMathString::ParseElement(pReader)); } else { + pReader->SetMarkForUnar(true); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); while((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { - CElement* pElement = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTempElement,pElement); - pTempElement = pElement; - pReader->ReadingTheNextToken(); + CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); } SetRightArg(pTempElement); } @@ -779,13 +793,30 @@ namespace StarMath else if(L"and" == wsToken) return TypeElement::And; else return TypeElement::undefine; } - bool CElementBinOperator::IsBinOperatorLowPrior() + bool CElementBinOperator::MixedOperators(const TypeElement &enType) { - switch (m_enTypeBinOp) { + switch (enType) + { case TypeElement::plus: return true; + case TypeElement::plus_minus: + return true; + case TypeElement::minus_plus: + return true; case TypeElement::minus: return true; + default: + return false; + } + } + void CElementBinOperator::UnaryCheck(CStarMathReader *pReader, CElement *pLastElement) + { + pReader->ReadingTheNextToken(); + pReader->SetMarkForUnar(!(!CParserStarMathString::CheckNewline(pLastElement) && MixedOperators(pReader->GetLocalType()))); + } + bool CElementBinOperator::IsBinOperatorLowPrior() + { + switch (m_enTypeBinOp) { case TypeElement::oplus: return true; case TypeElement::ominus: @@ -795,7 +826,7 @@ namespace StarMath case TypeElement::Or: return true; default: - return false; + return MixedOperators(m_enTypeBinOp); } } void CElementBinOperator::SetAttribute(CAttribute *pAttribute) @@ -870,15 +901,11 @@ namespace StarMath m_arBrecketValue.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); pReader->ClearReader(); } + if(!m_arBrecketValue.empty()) + CElementBinOperator::UnaryCheck(pReader,m_arBrecketValue.back()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - if(pTempElement != nullptr &&(!m_arBrecketValue.empty() && CParserStarMathString::CheckForLeftArgument(pTempElement->GetBaseType()))) - { - if(CParserStarMathString::AddLeftArgument(m_arBrecketValue.back(),pTempElement)) - m_arBrecketValue.pop_back(); - } - m_arBrecketValue.push_back(pTempElement); + CParserStarMathString::AddingAnElementToAnArray(m_arBrecketValue,pTempElement); } - //доработать() pReader->IteratorNullification(); } void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) @@ -890,6 +917,8 @@ namespace StarMath pXmlWrite->WriteNodeBegin(L"m:e",false); for(CElement* pTemp:m_arBrecketValue) { + if(CParserStarMathString::CheckNewline(pTemp)) + continue; CConversionSMtoOOXML::ElementConversion(pXmlWrite,pTemp); } pXmlWrite->WriteNodeEnd(L"m:e",false,false); @@ -899,6 +928,8 @@ namespace StarMath { for(CElement* pTemp:m_arBrecketValue) { + if(CParserStarMathString::CheckNewline(pTemp)) + continue; CConversionSMtoOOXML::ElementConversion(pXmlWrite,pTemp); } } @@ -1137,10 +1168,10 @@ namespace StarMath m_wsType = L"\u2200"; break; case TypeElement::hbar: - m_wsType = L"\u"; + m_wsType = L"\u0127"; break; case TypeElement::lambdabar: - m_wsType = L"\u"; + m_wsType = L"\u019B"; break; case TypeElement::Re: m_wsType = L"\u211C"; @@ -1149,13 +1180,13 @@ namespace StarMath m_wsType = L"\u2111"; break; case TypeElement::wp: - m_wsType = L"\u"; + m_wsType = L"\u2118"; break; case TypeElement::laplace: - m_wsType = L"\u"; + m_wsType = L"\u2112"; break; case TypeElement::fourier: - m_wsType = L"\u0192"; + m_wsType = L"\u2131"; break; case TypeElement::backepsilon: m_wsType = L"\u03F6"; @@ -1415,10 +1446,7 @@ namespace StarMath pReader->ReadingTheNextToken(); while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) { - CElement* pElement = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTempElement,pElement); - pTempElement = pElement; - pReader->ReadingTheNextToken(); + CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); } SetRightArg(pTempElement); } @@ -1541,10 +1569,8 @@ namespace StarMath pReader->ReadingTheNextToken(); while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt))) { - CElement* pElement = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTempElement,pElement); - pTempElement = pElement; - pReader->ReadingTheNextToken(); + + CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); } SetRightArg(pTempElement); } @@ -2177,11 +2203,10 @@ namespace StarMath } // class methods CStarMathReader CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd) - : m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr) + : m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr),m_bMarkForUnar(true) { m_itStart = itStart; m_itEnd = itEnd; - //m_pAttribute = new CAttribute(); } CStarMathReader::~CStarMathReader() { @@ -2477,6 +2502,14 @@ namespace StarMath return false; return true; } + void CStarMathReader::SetMarkForUnar(const bool &bMark) + { + m_bMarkForUnar = bMark; + } + bool CStarMathReader::GetMarkForUnar() + { + return m_bMarkForUnar; + } //class methods CElementBracketWithIndex CElementBracketWithIndex::CElementBracketWithIndex(const TypeElement &enType) :CElement(TypeElement::BracketWithIndex),m_pLeftArg(nullptr), m_pValue(nullptr),m_enTypeBracketWithIndex(enType) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 954c7e6c49..470eb87b31 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -114,9 +114,12 @@ namespace StarMath void FindingTheEndOfParentheses(); void IteratorNullification(); void ReadingTheNextToken(); + void SetMarkForUnar(const bool& bMark); + bool GetMarkForUnar(); private: bool CheckTokenForGetElement(const wchar_t& cToken); bool CheckIsalhpaForGetElement(const wchar_t& cToken,const wchar_t& cLastToken); + bool m_bMarkForUnar; std::wstring::iterator m_itStart,m_itEnd; TypeElement m_enGlobalType; TypeElement m_enUnderType; @@ -192,7 +195,10 @@ namespace StarMath CElement* GetRightArg(); CElement* GetLeftArg(); static TypeElement GetBinOperator(const std::wstring& wsToken); + static void UnaryCheck(CStarMathReader* pReader,CElement* pLastElement); private: + //checking for signs such as -,+,-+,+-. + static bool MixedOperators(const TypeElement& enType); void SetAttribute(CAttribute* pAttribute) override; bool IsBinOperatorLowPrior(); void Parse(CStarMathReader* pReader) override; @@ -397,6 +403,12 @@ namespace StarMath static bool AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); static bool CheckForLeftArgument(const TypeElement& enType ); static CElement* ReadingWithoutBracket(CStarMathReader* pReader); + //checking the element (true if it is newline) + static bool CheckNewline(CElement* pElement); + //adding an element to the array, checking that it is not empty and adding the left element, if there is one. + static void AddingAnElementToAnArray(std::vector& arrEquation,CElement* pAddElement); + //Receives the left element as input, reads the next one, if the next element has a higher priority and contains the left element, the element received at the input is passed to it. The entire structure is saved and returned. + static void ReadingElementsWithPriorities(CStarMathReader* pReader,CElement*& pLeftElement); private: std::vector m_arEquation; }; From b1794fcf96152ee2ea536c592bc268261a1b86b6 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Mon, 26 Feb 2024 17:29:15 +0300 Subject: [PATCH 106/117] editing parsing of indexes with operators. adding alignment. (cherry picked from commit 1dff8bb868325ba885789802405a04e5e4ca7067) --- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 58 +++++- .../StarMath2OOXML/cconversionsmtoooxml.h | 4 +- .../StarMath2OOXML/cstarmathpars.cpp | 187 ++++++++++++------ .../Converter/StarMath2OOXML/cstarmathpars.h | 26 +-- .../Converter/StarMath2OOXML/typeselements.h | 3 + 5 files changed, 197 insertions(+), 81 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 4257d35836..40b3a52638 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -37,15 +37,51 @@ namespace StarMath { { } //check XMLWrite(if not nullptr == delete) - void CConversionSMtoOOXML::StartConversion(std::vector arPars) + void CConversionSMtoOOXML::StartConversion(std::vector arPars, const unsigned int& iAlignment) { m_pXmlWrite = new XmlUtils::CXmlWriter; m_pXmlWrite->WriteNodeBegin(L"m:oMathPara",false); + if(iAlignment>= 0 && iAlignment <= 2) + { + std::wstring wsAlignment; + switch(iAlignment) + { + case 0: + wsAlignment = L"center"; + break; + case 1: + wsAlignment = L"left"; + break; + case 2: + wsAlignment = L"right"; + break; + default: + wsAlignment = L"center"; + break; + } + m_pXmlWrite->WriteNodeBegin(L"m:oMathParaPr",false); + m_pXmlWrite->WriteNodeBegin(L"m:jc",true); + m_pXmlWrite->WriteAttribute(L"m:val",wsAlignment); + m_pXmlWrite->WriteNodeEnd(L"",true,true); + m_pXmlWrite->WriteNodeEnd(L"m:oMathParaPr",false,false); + } m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); for(CElement* oTempElement:arPars) { if(oTempElement != nullptr) - oTempElement->ConversionToOOXML(m_pXmlWrite); + { + if(CParserStarMathString::CheckNewline(oTempElement)) + { + m_pXmlWrite->WriteNodeBegin(L"m:r",false); + m_pXmlWrite->WriteNodeBegin(L"w:br",true); + m_pXmlWrite->WriteNodeEnd(L"",true,true); + m_pXmlWrite->WriteNodeEnd(L"m:r",false,false); + m_pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); + m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); + } + else + oTempElement->ConversionToOOXML(m_pXmlWrite); + } } EndConversion(); } @@ -211,10 +247,6 @@ namespace StarMath { pXmlWrite->WriteNodeBegin(wsNameBlock,true); pXmlWrite->WriteNodeEnd(L"",true,true); } -/* pXmlWrite->WriteNodeBegin(wsNameBlock,false); - if(pValueBlock != nullptr) - pValueBlock->ConversionToOOXML(pXmlWrite); - pXmlWrite->WriteNodeEnd(wsNameBlock,false,false)*/; } std::wstring CConversionSMtoOOXML::GetOOXML() { @@ -389,7 +421,7 @@ namespace StarMath { pXmlWrite->WriteNodeEnd(L"m:t",false,false); pXmlWrite->WriteNodeEnd(L"m:r",false,false); } - void CConversionSMtoOOXML::WriteLimUpOrLowNode(XmlUtils::CXmlWriter *pXmlWrite,const std::wstring& wsNameNode,CElement* pValue, const TypeElement& enType,CAttribute* pAttribute,const std::wstring& wsName) + void CConversionSMtoOOXML::WriteLimUpOrLowNode(XmlUtils::CXmlWriter *pXmlWrite,const std::wstring& wsNameNode,CElement* pValue, const TypeElement& enType,CAttribute* pAttribute,const std::wstring& wsName,CElement* pIndex) { pXmlWrite->WriteNodeBegin(wsNameNode,false); pXmlWrite->WriteNodeBegin(wsNameNode+L"Pr",false); @@ -398,7 +430,17 @@ namespace StarMath { pXmlWrite->WriteNodeBegin(L"m:e",false); CConversionSMtoOOXML::WriteRPrFName(enType,pXmlWrite,pAttribute,wsName); pXmlWrite->WriteNodeEnd(L"m:e",false,false); - WriteNodeConversion(L"m:lim",pValue,pXmlWrite); + if(pValue!= nullptr && pIndex != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:lim",false); + pIndex->ConversionToOOXML(pXmlWrite); + pValue->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:lim",false,false); + } + else if(pValue!=nullptr && pIndex == nullptr) + WriteNodeConversion(L"m:lim",pValue,pXmlWrite); + else if(pValue == nullptr && pIndex !=nullptr) + WriteNodeConversion(L"m:lim",pIndex,pXmlWrite); pXmlWrite->WriteNodeEnd(wsNameNode,false,false); } void CConversionSMtoOOXML::ElementConversion(XmlUtils::CXmlWriter *pXmlWrite, CElement *pElement) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h index 7561585039..05d61d0b83 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -41,7 +41,7 @@ namespace StarMath { { public: CConversionSMtoOOXML(); - void StartConversion(std::vector arPars); + void StartConversion(std::vector arPars, const unsigned int& iAlignment = -1); static void StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesMFPR(bool bType,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); static void PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); @@ -56,7 +56,7 @@ namespace StarMath { static void WriteRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const std::wstring& wsNameOp); static void WriteStyNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsAttributeNode); static void WritePreserveBlock(XmlUtils::CXmlWriter* pXmlWrite, CAttribute *pAttribute); - static void WriteLimUpOrLowNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsNameNode,CElement* pValue,const TypeElement& enType,CAttribute* pAttribute, const std::wstring& wsName = L"oper"); + static void WriteLimUpOrLowNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsNameNode,CElement* pValue,const TypeElement& enType,CAttribute* pAttribute, const std::wstring& wsName = L"oper",CElement* pIndex = nullptr); static void ElementConversion(XmlUtils::CXmlWriter* pXmlWrite,CElement* pElement); void EndConversion(); std::wstring GetOOXML(); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index d93794d467..77d2923c87 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -40,13 +40,10 @@ namespace StarMath std::wstring::iterator itStart = wsParseString.begin(),itEnd = wsParseString.end(); CStarMathReader* pReader = new CStarMathReader(itStart,itEnd); pReader->SetBaseAttribute(pBaseAttribute); + if(pBaseAttribute != nullptr && (pBaseAttribute->base_alignment >= 0 && pBaseAttribute->base_alignment <= 2)) + SetAlignment(pBaseAttribute->base_alignment); while(pReader->CheckIteratorPosition()) { - if(pReader->GetLocalType() == TypeElement::newline) - { - m_arEquation.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); - pReader->ClearReader(); - } if(!m_arEquation.empty()) CElementBinOperator::UnaryCheck(pReader,m_arEquation.back()); CElement* pTempElement = ParseElement(pReader); @@ -69,16 +66,11 @@ namespace StarMath CElement* CParserStarMathString::ParseElement(CStarMathReader* pReader) { CElement* pElement; - pReader->ReadingTheNextToken(); - - if(TypeElement::newline == pReader->GetLocalType()) - return nullptr; - pElement = CElement::CreateElement(pReader); - if(pElement != nullptr) { + if(pReader->GetAttribute() != nullptr && !CheckForLeftArgument(pReader->GetGlobalType())) pElement->SetBaseAttribute(pReader->GetAttribute()); else if(pReader->GetAttribute() != nullptr && (pReader->GetLocalType() == TypeElement::plus || TypeElement::minus == pReader->GetLocalType())) @@ -142,21 +134,16 @@ namespace StarMath break; } } - else return false; + else + return false; } CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader) { CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while(CheckForLeftArgument(pReader->GetGlobalType()) && (pReader->GetLocalType() != TypeElement::frac || pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt)) + while(CheckForLeftArgument(pReader->GetGlobalType()) && (pReader->GetLocalType() != TypeElement::frac && pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType()!=TypeElement::sqrt)) { - CElement* pSecondTempElement = CParserStarMathString::ParseElement(pReader); - if(pFirstTempElement != nullptr) - { - CParserStarMathString::AddLeftArgument(pFirstTempElement,pSecondTempElement); - } - pFirstTempElement = pSecondTempElement; - pReader->ReadingTheNextToken(); + CParserStarMathString::ReadingElementsWithPriorities(pReader,pFirstTempElement); } return pFirstTempElement; } @@ -165,13 +152,9 @@ namespace StarMath switch(enType) { case TypeElement::BinOperator: - return true; case TypeElement::Connection: - return true; case TypeElement::SetOperations: - return true; case TypeElement::BracketWithIndex: - return true; case TypeElement::Index: return true; default: @@ -202,10 +185,19 @@ namespace StarMath void CParserStarMathString::ReadingElementsWithPriorities(CStarMathReader *pReader, CElement *&pLeftElement) { CElement* pNextElement = ParseElement(pReader); - AddLeftArgument(pLeftElement,pNextElement); + if(pLeftElement != nullptr) + AddLeftArgument(pLeftElement,pNextElement); pLeftElement = pNextElement; pReader->ReadingTheNextToken(); } + void CParserStarMathString::SetAlignment(const unsigned int &iAlignment) + { + m_iAlignment = iAlignment; + } + const unsigned int& CParserStarMathString::GetAlignment() + { + return m_iAlignment; + } //class methods CAttribute CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0) { @@ -216,6 +208,10 @@ namespace StarMath { m_iSize = iSize; } + void CAttribute::SetAlignment(const unsigned int &iAlignment) + { + m_iAlignment = iAlignment; + } void CAttribute::SetBold() { m_bBold = true; @@ -372,6 +368,10 @@ namespace StarMath { return m_iSize; } + unsigned int CAttribute::GetAlignment() + { + return m_iAlignment; + } bool CAttribute::EmptyColor() { return m_wsColor.empty(); @@ -443,6 +443,10 @@ namespace StarMath m_wsNameFont = pReader->GetString(); break; } + case TypeElement::alignl: + case TypeElement::alignr: + case TypeElement::alignc: + break; default: SetFont(enTypeFont); break; @@ -490,6 +494,9 @@ namespace StarMath else if(L"ital" == wsToken) return TypeElement::ital; else if(L"phantom" == wsToken ) return TypeElement::phantom; else if(L"overstrike" == wsToken) return TypeElement::overstrike; + else if(L"alignl" == wsToken) return TypeElement::alignl; + else if(L"alignr" == wsToken) return TypeElement::alignr; + else if(L"alignc" == wsToken) return TypeElement::alignc; else return TypeElement::undefine; } //class methods CElement @@ -671,7 +678,7 @@ namespace StarMath pReader->SetMarkForUnar(true); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) + while((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) { CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); } @@ -896,11 +903,6 @@ namespace StarMath pReader->FindingTheEndOfParentheses(); while(pReader->CheckIteratorPosition()) { - if(pReader->GetLocalType() == TypeElement::newline) - { - m_arBrecketValue.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); - pReader->ClearReader(); - } if(!m_arBrecketValue.empty()) CElementBinOperator::UnaryCheck(pReader,m_arBrecketValue.back()); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); @@ -1118,12 +1120,12 @@ namespace StarMath } case TypeElement::newline: { - pXmlWrite->WriteNodeBegin(L"m:r",false); - pXmlWrite->WriteNodeBegin(L"w:br",true); - pXmlWrite->WriteNodeEnd(L"",true,true); - pXmlWrite->WriteNodeEnd(L"m:r",false,false); - pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); - pXmlWrite->WriteNodeBegin(L"m:oMath",false); +// pXmlWrite->WriteNodeBegin(L"m:r",false); +// pXmlWrite->WriteNodeBegin(L"w:br",true); +// pXmlWrite->WriteNodeEnd(L"",true,true); +// pXmlWrite->WriteNodeEnd(L"m:r",false,false); +// pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); +// pXmlWrite->WriteNodeBegin(L"m:oMath",false); break; } default: @@ -1444,7 +1446,7 @@ namespace StarMath { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType() != TypeElement::sqrt))) + while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) { CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); } @@ -1567,7 +1569,7 @@ namespace StarMath { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot || pReader->GetLocalType()!=TypeElement::sqrt))) + while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType()!=TypeElement::sqrt))) { CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); @@ -1770,6 +1772,30 @@ namespace StarMath else if(L"sqrt" == wsCheckToken) return TypeElement::sqrt; else return TypeElement::undefine; } + bool CElementIndex::GetUpperIndex(const TypeElement &enType) + { + switch(enType) + { + case TypeElement::upper: + case TypeElement::csup: + case TypeElement::lsup: + return true; + default: + return false; + } + } + bool CElementIndex::GetLowerIndex(const TypeElement &enType) + { + switch(enType) + { + case TypeElement::lower: + case TypeElement::lsub: + case TypeElement::csub: + return true; + default: + return false; + } + } void CElementIndex::Parse(CStarMathReader *pReader) { if(m_enTypeIndex == TypeElement::nroot) @@ -2065,7 +2091,7 @@ namespace StarMath } //class methods CElementOperation CElementOperator::CElementOperator(const TypeElement &enType, const std::wstring& wsNameOp) - :CElement(TypeElement::Operator), m_pValueFrom(nullptr), m_pValueTo(nullptr), m_pValueOperator(nullptr),m_enTypeOperator(enType),m_wsName(wsNameOp) + :CElement(TypeElement::Operator), m_pValueFrom(nullptr), m_pValueTo(nullptr), m_pValueOperator(nullptr),m_pUpperIndex(nullptr),m_pLowerIndex(nullptr),m_enTypeOperator(enType),m_wsName(wsNameOp) { } CElementOperator::~CElementOperator() @@ -2132,6 +2158,20 @@ namespace StarMath void CElementOperator::Parse(CStarMathReader* pReader) { pReader->ReadingTheNextToken(); + while(CElementIndex::GetUpperIndex(pReader->GetLocalType()) || CElementIndex::GetLowerIndex(pReader->GetLocalType())) + { + if(CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + pReader->ClearReader(); + m_pUpperIndex = CParserStarMathString::ParseElement(pReader); + } + if(CElementIndex::GetLowerIndex(pReader->GetLocalType())) + { + pReader->ClearReader(); + m_pLowerIndex = CParserStarMathString::ParseElement(pReader); + } + pReader->ReadingTheNextToken(); + } if(pReader->GetLocalType() == TypeElement::from) { pReader->ClearReader(); @@ -2142,7 +2182,13 @@ namespace StarMath pReader->ClearReader(); SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader)); } - SetValueOperator(CParserStarMathString::ParseElement(pReader)); +// SetValueOperator(CParserStarMathString::ParseElement(pReader)); + m_pValueOperator = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while(pReader->GetGlobalType() == TypeElement::Index) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,m_pValueOperator); + } } void CElementOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) { @@ -2151,20 +2197,25 @@ namespace StarMath pXmlWrite->WriteNodeBegin(L"m:func",false); CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); pXmlWrite->WriteNodeBegin(L"m:fName",false); - if(m_pValueFrom != nullptr && m_pValueTo == nullptr) - CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName); - else if(m_pValueTo != nullptr && m_pValueFrom == nullptr) - CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limUpp",m_pValueTo,m_enTypeOperator,GetAttribute(),m_wsName); - else if(m_pValueFrom != nullptr && m_pValueTo != nullptr) + if((m_pValueFrom != nullptr || m_pLowerIndex != nullptr) && (m_pValueTo == nullptr && m_pUpperIndex == nullptr)) + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName,m_pLowerIndex); + else if((m_pValueTo != nullptr || m_pUpperIndex != nullptr ) && (m_pValueFrom == nullptr && m_pLowerIndex == nullptr)) + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limUpp",m_pValueTo,m_enTypeOperator,GetAttribute(),m_wsName,m_pUpperIndex); + else if ((m_pValueFrom != nullptr || m_pLowerIndex != nullptr )&& (m_pValueTo != nullptr || m_pUpperIndex != nullptr)) { pXmlWrite->WriteNodeBegin(L"m:limUpp",false); pXmlWrite->WriteNodeBegin(L"m:limUppPr",false); CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr); pXmlWrite->WriteNodeEnd(L"m:limUppPr",false,false); pXmlWrite->WriteNodeBegin(L"m:e",false); - CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName); + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName,m_pLowerIndex); pXmlWrite->WriteNodeEnd(L"m:e",false,false); - CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pValueTo,pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:lim",false); + if(m_pUpperIndex !=nullptr) + m_pUpperIndex->ConversionToOOXML(pXmlWrite); + if(m_pValueTo !=nullptr) + m_pValueTo->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:lim",false,false); pXmlWrite->WriteNodeEnd(L"m:limUpp",false,false); } else if(m_pValueFrom == nullptr && m_pValueTo == nullptr) @@ -2176,17 +2227,33 @@ namespace StarMath else { pXmlWrite->WriteNodeBegin(L"m:nary",false); - CConversionSMtoOOXML::PropertiesNaryPr(m_enTypeOperator,nullptr == m_pValueFrom,nullptr == m_pValueTo,pXmlWrite,GetAttribute()); - if(m_pValueFrom == nullptr) pXmlWrite->WriteNode(L"m:sub",L""); - else + CConversionSMtoOOXML::PropertiesNaryPr(m_enTypeOperator,(nullptr == m_pValueFrom && nullptr == m_pLowerIndex),(nullptr == m_pValueTo && nullptr == m_pUpperIndex),pXmlWrite,GetAttribute()); + if(m_pValueFrom != nullptr && m_pLowerIndex != nullptr) { + pXmlWrite->WriteNodeBegin(L"m:sub",false); + m_pLowerIndex->ConversionToOOXML(pXmlWrite); + m_pValueFrom->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:sub",false); + } + else if(m_pValueFrom == nullptr && m_pLowerIndex != nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pLowerIndex,pXmlWrite); + else if(m_pValueFrom != nullptr && m_pLowerIndex == nullptr) CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueFrom,pXmlWrite); - } - if(m_pValueTo == nullptr) pXmlWrite->WriteNode(L"m:sup",L""); - else + else if(m_pValueFrom == nullptr && m_pLowerIndex == nullptr) + pXmlWrite->WriteNode(L"m:sub",L""); + if(m_pValueTo != nullptr && m_pUpperIndex != nullptr) { - CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueTo,pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:sup",false); + m_pUpperIndex->ConversionToOOXML(pXmlWrite); + m_pValueTo->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:sup",false); } + else if(m_pValueTo == nullptr && m_pUpperIndex != nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pUpperIndex,pXmlWrite); + else if(m_pValueTo != nullptr && m_pUpperIndex == nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueTo,pXmlWrite); + else if(m_pValueTo == nullptr && m_pUpperIndex == nullptr) + pXmlWrite->WriteNode(L"m:sup",L""); CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueOperator,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:nary",false,false); } @@ -2219,9 +2286,9 @@ namespace StarMath { m_wsToken = GetElement(); TypeElement enTypeFont =CAttribute::GetTypeFontAttribute(m_wsToken),enTypeColor = CAttribute::GetTypeColorAttribute(m_wsToken); - if(enTypeFont != TypeElement::undefine ||enTypeColor != TypeElement::undefine) + if(enTypeFont != TypeElement::undefine || enTypeColor != TypeElement::undefine) m_pAttribute = new CAttribute(); - while((enTypeFont != TypeElement::undefine ||enTypeColor != TypeElement::undefine) && m_itStart != m_itEnd) + while((enTypeFont != TypeElement::undefine || enTypeColor != TypeElement::undefine) && m_itStart != m_itEnd) { if(enTypeColor == TypeElement::color) m_pAttribute->ParseColorAttribute(GetElement(),this); else if(enTypeFont != TypeElement::undefine) m_pAttribute->ParseFontAttribute(enTypeFont,this); @@ -2243,7 +2310,7 @@ namespace StarMath m_enUnderType = CElementOperator::GetFromOrTo(m_wsToken); if(m_enUnderType != TypeElement::undefine) { - m_enGlobalType = TypeElement::Operation; + m_enGlobalType = TypeElement::String; return; } m_enUnderType = CElementBracketWithIndex::GetBracketWithIndex(m_wsToken); @@ -2384,8 +2451,8 @@ namespace StarMath m_pBaseAttribute->SetFontName(pAttribute->base_font_name); if(pAttribute->base_font_size != 0) m_pBaseAttribute->SetSize(pAttribute->base_font_size); - // if(pAttribute.base_alignment != 0) - // m_pBaseAttribute-> + if(pAttribute->base_alignment >= 0 && pAttribute->base_alignment <=2) + m_pBaseAttribute->SetAlignment(pAttribute->base_alignment); } else m_pBaseAttribute = nullptr; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 470eb87b31..907b12cad6 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -46,9 +46,9 @@ namespace StarMath struct TBaseAttribute { - int base_font_size = 12; + unsigned int base_font_size = 12; std::wstring base_font_name = L"Arial"; - int base_alignment = 1; + unsigned int base_alignment = 1;//(0 - center,1 - left,2 - right) bool base_font_bold = false; bool base_font_italic = false; }; @@ -65,12 +65,14 @@ namespace StarMath bool GetPhantom(); bool GetStrike(); unsigned int GetSize(); + unsigned int GetAlignment(); std::wstring GetColor(); const std::wstring& GetFontName(); bool EmptyColor(); void ParseFontAttribute(const TypeElement& enTypeFont,CStarMathReader* pReader); void ParseColorAttribute(const std::wstring& wsToken,CStarMathReader* pReader); void SetSize(const unsigned int& iSize); + void SetAlignment(const unsigned int& iAlignment); void SetBold(); void SetItal(); void SetPhantom(); @@ -80,13 +82,9 @@ namespace StarMath void SetFont(const TypeElement& enFont); void SetFontName(const std::wstring& wsNameFont); private: - std::wstring m_wsColor; - bool m_bBold; - bool m_bItal; - bool m_bPhantom; - bool m_bStrike; - unsigned int m_iSize; - std::wstring m_wsNameFont; + std::wstring m_wsColor,m_wsNameFont; + bool m_bBold,m_bItal,m_bPhantom,m_bStrike; + unsigned int m_iSize,m_iAlignment; }; //Сlass for working with tokens (reading, defining types, passing) class CStarMathReader @@ -121,8 +119,7 @@ namespace StarMath bool CheckIsalhpaForGetElement(const wchar_t& cToken,const wchar_t& cLastToken); bool m_bMarkForUnar; std::wstring::iterator m_itStart,m_itEnd; - TypeElement m_enGlobalType; - TypeElement m_enUnderType; + TypeElement m_enGlobalType,m_enUnderType; std::wstring m_wsToken; CAttribute* m_pAttribute; CAttribute* m_pBaseAttribute; @@ -159,6 +156,8 @@ namespace StarMath CElement* GetValueIndex(); CElement* GetLeftArg(); static TypeElement GetIndex(const std::wstring& wsCheckToken); + static bool GetUpperIndex(const TypeElement& enType); + static bool GetLowerIndex(const TypeElement& enType); private: void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; @@ -230,6 +229,8 @@ namespace StarMath CElement* m_pValueOperator; CElement* m_pValueFrom; CElement* m_pValueTo; + CElement* m_pUpperIndex; + CElement* m_pLowerIndex; TypeElement m_enTypeOperator; std::wstring m_wsName; }; @@ -409,8 +410,11 @@ namespace StarMath static void AddingAnElementToAnArray(std::vector& arrEquation,CElement* pAddElement); //Receives the left element as input, reads the next one, if the next element has a higher priority and contains the left element, the element received at the input is passed to it. The entire structure is saved and returned. static void ReadingElementsWithPriorities(CStarMathReader* pReader,CElement*& pLeftElement); + void SetAlignment(const unsigned int& iAlignment); + const unsigned int& GetAlignment(); private: std::vector m_arEquation; + unsigned int m_iAlignment; }; } diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h index 7e24ced39f..04c58fe3b9 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -112,6 +112,9 @@ enum class TypeElement{ overstrike, size, font, + alignl, + alignc, + alignr, //top element acute, breve, From db95af6c584745bc5f2b7a1cea873327b2bb08a3 Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Wed, 6 Mar 2024 15:35:57 +0300 Subject: [PATCH 107/117] refinement of parsing and conversion of indexes. editing and writing tests. (cherry picked from commit 62b3b7b3c6b1b632fd8d74de058b7169cf10db4e) --- .../StarMath2OOXML/TestSMConverter/main.cpp | 84 ++- .../StarMath2OOXML/cstarmathpars.cpp | 638 ++++++++++++------ .../Converter/StarMath2OOXML/cstarmathpars.h | 14 +- 3 files changed, 542 insertions(+), 194 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index ecffde6bb6..40e3d17131 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -910,7 +910,7 @@ TEST(SMConvectorTest,IndexLsup) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"2+3cos1527"; + std::wstring wsXmlString = L"2+3cos1527"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -920,7 +920,7 @@ TEST(SMConvectorTest,IndexLsub) StarMath::CParserStarMathString oTemp; StarMath::CConversionSMtoOOXML oTest; oTest.StartConversion(oTemp.Parse(wsString)); - std::wstring wsXmlString = L"22222103"; + std::wstring wsXmlString = L"22222103"; EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } @@ -1124,6 +1124,86 @@ TEST(SMConvectorTest,UnarySign) EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } +TEST(SMConvectorTest,Example13) +{ + std::wstring wsString = L"nroot{3}{x^3-7x^2+14x-8}+sqrt{7/8+4/9+nroot{3}{sqrt{7/8+4/9}}}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"3x3-7x2+14x-8+78+49+378+49"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example14) +{ + std::wstring wsString = L"sum_{i=0}^{infinity} {(-1)^i over (2i+1)} x^{2i+1} = sin(x)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"i=0\u221E-1i2i+1x2i+1=sinx"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example15) +{ + std::wstring wsString = L"lim_{x->0} {sin(x) over x} = 1"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"limx->0sinxx=1"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example16) +{ + std::wstring wsString = L"int_0^{infinity} x^2 e^{-x} dx = 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"0\u221Ex2e-xdx=2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example17) +{ + std::wstring wsString = L"{a^{2} over b} + {b^{2} over a} >= 2 sqrt{a b}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"a2b+b2a\u22652ab"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example18) +{ + std::wstring wsString = L"10^1_2lsub5lsup4"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"541021"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexWithColor) +{ + std::wstring wsString = L"bold 2 ^ 3 _4 lsup color blue 5 csub color red 6 csup 7 lsub 8"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"5867243"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionWithColor) +{ + std::wstring wsString = L"func e^ 7_2 lsup 10 2over3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"10e2723"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + //TEST(SMConvectorTest,AttributeMatrix) //{ // std::wstring wsString = L""; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 77d2923c87..6666b40927 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -99,6 +99,8 @@ namespace StarMath return false; pTempElement->SetLeftArg(pLeftArg); pElementWhichAdd = pTempElement; + if(pElementWhichAdd->GetBaseType() == TypeElement::Index) + pElementWhichAdd->SetAttribute(nullptr); return true; } else return false; @@ -163,12 +165,15 @@ namespace StarMath } bool CParserStarMathString::CheckNewline(CElement* pElement) { + if(pElement == nullptr) + return false; if(pElement->GetBaseType() == TypeElement::SpecialSymbol) { CElementSpecialSymbol* pSpecial = dynamic_cast(pElement); return (pSpecial->GetType() == TypeElement::newline); } - return false; + else + return false; } void CParserStarMathString::AddingAnElementToAnArray(std::vector &arrEquation, CElement *pAddElement) { @@ -190,6 +195,26 @@ namespace StarMath pLeftElement = pNextElement; pReader->ReadingTheNextToken(); } + void CParserStarMathString::ReadingElementsWithAttributes(CStarMathReader *pReader, CElement*& pSavingElement) + { + CElement* pElement = CParserStarMathString::ParseElement(pReader); + if(pElement->GetAttribute() != nullptr) + { + pReader->ReadingTheNextToken(); + if(CElementIndex::GetLowerIndex(pReader->GetLocalType()) || CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + CElement* pIndex = new CElementIndex(pReader->GetLocalType()); + pReader->ClearReader(); + pIndex->Parse(pReader); + AddLeftArgument(pElement,pIndex); + pSavingElement = pIndex; + } + else + pSavingElement = pElement; + } + else + pSavingElement = pElement; + } void CParserStarMathString::SetAlignment(const unsigned int &iAlignment) { m_iAlignment = iAlignment; @@ -199,7 +224,7 @@ namespace StarMath return m_iAlignment; } //class methods CAttribute - CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0) + CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0),m_iAlignment(-1) { } CAttribute::~CAttribute() @@ -908,6 +933,17 @@ namespace StarMath CElement* pTempElement = CParserStarMathString::ParseElement(pReader); CParserStarMathString::AddingAnElementToAnArray(m_arBrecketValue,pTempElement); } + if(!pReader->EmptyString()) + { + if(pReader->GetLocalType() == TypeElement::newline) + { + m_arBrecketValue.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); + pReader->ClearReader(); + } + CElement* pTempElement =CParserStarMathString::ParseElement(pReader); + if(nullptr != pTempElement) + m_arBrecketValue.push_back(pTempElement); + } pReader->IteratorNullification(); } void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) @@ -921,6 +957,16 @@ namespace StarMath { if(CParserStarMathString::CheckNewline(pTemp)) continue; + if(CheckMline(pTemp)) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(L"\u007C"); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + continue; + } CConversionSMtoOOXML::ElementConversion(pXmlWrite,pTemp); } pXmlWrite->WriteNodeEnd(L"m:e",false,false); @@ -937,6 +983,18 @@ namespace StarMath } } + bool CElementBracket::CheckMline(CElement *pElement) + { + if(pElement == nullptr) + return false; + if(pElement->GetBaseType() == TypeElement::SpecialSymbol) + { + CElementSpecialSymbol* pSpecial = dynamic_cast(pElement); + return(pSpecial->GetType() == TypeElement::mline); + } + else + return false; + } void CElementBracket::SetAttribute(CAttribute *pAttribute) { SetBaseAttribute(pAttribute); @@ -981,6 +1039,7 @@ namespace StarMath if(wsToken[0] != L'%') { if(L"#" == wsToken) return TypeElement::grid; + else if(L"mline" == wsToken) return TypeElement::mline; else if(L"##" == wsToken) return TypeElement::transition; else if(L"emptyset" == wsToken) return TypeElement::emptyset; else if(L"aleph" == wsToken) return TypeElement::aleph; @@ -1735,13 +1794,19 @@ namespace StarMath } //class methods CIndex CElementIndex::CElementIndex(const TypeElement& enType) - : CElement(TypeElement::Index),m_pValueIndex(nullptr),m_pLeftArg(nullptr),m_enTypeIndex(enType) + : CElement(TypeElement::Index),m_pValueIndex(nullptr),m_pUpperIndex(nullptr),m_pLowerIndex(nullptr),m_pLsubIndex(nullptr),m_pLsupIndex(nullptr),m_pCsubIndex(nullptr),m_pCsupIndex(nullptr),m_pLeftArg(nullptr),m_enTypeIndex(enType) { } CElementIndex::~CElementIndex() { delete m_pValueIndex; delete m_pLeftArg; + delete m_pUpperIndex; + delete m_pLowerIndex; + delete m_pLsubIndex; + delete m_pLsupIndex; + delete m_pCsubIndex; + delete m_pCsupIndex; } void CElementIndex::SetValueIndex(CElement *pElement) { @@ -1800,70 +1865,62 @@ namespace StarMath { if(m_enTypeIndex == TypeElement::nroot) { - SetLeftArg(CParserStarMathString::ParseElement(pReader)); - SetValueIndex(CParserStarMathString::ParseElement(pReader)); + m_pLeftArg = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + if(CElementIndex::GetLowerIndex(pReader->GetLocalType()) || CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(m_pLeftArg,pElement); + m_pLeftArg = pElement; + } + m_pValueIndex = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + if(CElementIndex::GetLowerIndex(pReader->GetLocalType()) || CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(m_pValueIndex,pElement); + m_pValueIndex = pElement; + } + } + else if(m_enTypeIndex == TypeElement::sqrt) + { + m_pValueIndex = CParserStarMathString::ParseElement(pReader); + m_pLeftArg = m_pValueIndex; } else - SetValueIndex(CParserStarMathString::ParseElement(pReader)); - if(m_enTypeIndex == TypeElement::sqrt) - SetLeftArg(GetValueIndex()); + { + do + { + pReader->ClearReader(); + switch(m_enTypeIndex) + { + case TypeElement::upper: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pUpperIndex); + break; + case TypeElement::lower: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pLowerIndex); + break; + case TypeElement::lsub: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pLsubIndex); + break; + case TypeElement::lsup: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pLsupIndex); + break; + case TypeElement::csub: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pCsubIndex); + break; + case TypeElement::csup: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pCsupIndex); + break; + } + pReader->ReadingTheNextToken(); + m_enTypeIndex = pReader->GetLocalType(); + }while(GetUpperIndex(pReader->GetLocalType()) || GetLowerIndex(pReader->GetLocalType())); + } } void CElementIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - switch(m_enTypeIndex) - { - case TypeElement::upper: - case TypeElement::lower: - { - std::wstring wsNameNodeIndex; - switch(m_enTypeIndex) - { - case TypeElement::upper: - wsNameNodeIndex = L"m:sSup"; - break; - case TypeElement::lower: - wsNameNodeIndex = L"m:sSub"; - break; - } - pXmlWrite->WriteNodeBegin(wsNameNodeIndex,false); - pXmlWrite->WriteNodeBegin(wsNameNodeIndex+L"Pr",false); - CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); - pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); - CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); - switch(m_enTypeIndex) - { - case TypeElement::upper: - CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueIndex,pXmlWrite); - break; - case TypeElement::lower: - CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueIndex,pXmlWrite); - break; - } - pXmlWrite->WriteNodeEnd(wsNameNodeIndex,false,false); - break; - } - case TypeElement::lsub: - case TypeElement::lsup: - { - pXmlWrite->WriteNodeBegin(L"m:sPre",false); - pXmlWrite->WriteNodeBegin(L"m:sPrePr",false); - CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); - pXmlWrite->WriteNodeEnd(L"m:sPrePr",false,false); - switch(m_enTypeIndex) - { - case TypeElement::lsup: - CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueIndex,pXmlWrite); - break; - case TypeElement::lsub: - CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueIndex,pXmlWrite); - break; - } - CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); - pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); - break; - } - case TypeElement::nroot: - case TypeElement::sqrt: + if(TypeElement::sqrt == m_enTypeIndex || TypeElement::nroot == m_enTypeIndex) { pXmlWrite->WriteNodeBegin(L"m:rad",false); pXmlWrite->WriteNodeBegin(L"m:radPr",false); @@ -1888,48 +1945,302 @@ namespace StarMath } CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueIndex,pXmlWrite); pXmlWrite->WriteNodeEnd(L"m:rad",false,false); - break; } - case TypeElement::csub: - case TypeElement::csup: + else if(m_pCsubIndex != nullptr || m_pCsupIndex != nullptr) { - std::wstring wsNameLim; - switch(m_enTypeIndex) + if(m_pCsubIndex != nullptr && m_pCsupIndex != nullptr) { - case TypeElement::csub: - wsNameLim = L"m:limLow"; - break; - case TypeElement::csup: - wsNameLim = L"m:limUpp"; - break; + pXmlWrite->WriteNodeBegin(L"m:limLow",false); + pXmlWrite->WriteNodeBegin(L"m:limLowPr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,m_pCsubIndex->GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:limLowPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + pXmlWrite->WriteNodeBegin(L"m:limUpp",false); + pXmlWrite->WriteNodeBegin(L"m:limUppPr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,m_pCsupIndex->GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:limUppPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + ConversionOfIndicesToValue(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pCsupIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:limUpp",false,false); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pCsubIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:limLow",false,false); + } + else + { + std::wstring wsNameLim; + if(m_pCsubIndex!= nullptr) + wsNameLim = L"m:limLow"; + else + wsNameLim = L"m:limUpp"; + pXmlWrite->WriteNodeBegin(wsNameLim,false); + pXmlWrite->WriteNodeBegin(wsNameLim+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(wsNameLim+L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + ConversionOfIndicesToValue(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + if(m_pCsubIndex != nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pCsubIndex,pXmlWrite); + else + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pCsupIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameLim,false,false); } - pXmlWrite->WriteNodeBegin(wsNameLim,false); - pXmlWrite->WriteNodeBegin(wsNameLim+L"Pr",false); - CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); - pXmlWrite->WriteNodeEnd(wsNameLim+L"Pr",false,false); - CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); - CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pValueIndex,pXmlWrite); - pXmlWrite->WriteNodeEnd(wsNameLim,false,false); - break; - } } + else + ConversionOfIndicesToValue(pXmlWrite); +// switch(m_enTypeIndex) +// { +// case TypeElement::upper: +// case TypeElement::lower: +// { +// std::wstring wsNameNodeIndex; +// switch(m_enTypeIndex) +// { +// case TypeElement::upper: +// wsNameNodeIndex = L"m:sSup"; +// break; +// case TypeElement::lower: +// wsNameNodeIndex = L"m:sSub"; +// break; +// } +// pXmlWrite->WriteNodeBegin(wsNameNodeIndex,false); +// pXmlWrite->WriteNodeBegin(wsNameNodeIndex+L"Pr",false); +// CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); +// pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); +// CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); +// switch(m_enTypeIndex) +// { +// case TypeElement::upper: +// CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueIndex,pXmlWrite); +// break; +// case TypeElement::lower: +// CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueIndex,pXmlWrite); +// break; +// } +// pXmlWrite->WriteNodeEnd(wsNameNodeIndex,false,false); +// break; +// } +// case TypeElement::lsub: +// case TypeElement::lsup: +// { +// pXmlWrite->WriteNodeBegin(L"m:sPre",false); +// pXmlWrite->WriteNodeBegin(L"m:sPrePr",false); +// CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); +// pXmlWrite->WriteNodeEnd(L"m:sPrePr",false,false); +// switch(m_enTypeIndex) +// { +// case TypeElement::lsup: +// CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueIndex,pXmlWrite); +// break; +// case TypeElement::lsub: +// CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueIndex,pXmlWrite); +// break; +// } +// CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); +// pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); +// break; +// } +// case TypeElement::nroot: +// case TypeElement::sqrt: +// { +// pXmlWrite->WriteNodeBegin(L"m:rad",false); +// pXmlWrite->WriteNodeBegin(L"m:radPr",false); +// if(TypeElement::sqrt == m_enTypeIndex) +// { +// pXmlWrite->WriteNodeBegin(L"m:degHide",true); +// pXmlWrite->WriteAttribute(L"m:val",1); +// pXmlWrite->WriteNodeEnd(L"",true,true); +// } +// CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); +// pXmlWrite->WriteNodeEnd(L"m:radPr",false,false); +// if(m_pLeftArg != nullptr && m_enTypeIndex == TypeElement::nroot) +// { +// pXmlWrite->WriteNodeBegin(L"m:deg",false); +// m_pLeftArg->ConversionToOOXML(pXmlWrite); +// pXmlWrite->WriteNodeEnd(L"m:deg",false,false); +// } +// else +// { +// pXmlWrite->WriteNodeBegin(L"m:deg",true); +// pXmlWrite->WriteNodeEnd(L"w",true,true); +// } +// CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueIndex,pXmlWrite); +// pXmlWrite->WriteNodeEnd(L"m:rad",false,false); +// break; +// } +// case TypeElement::csub: +// case TypeElement::csup: +// { +// std::wstring wsNameLim; +// switch(m_enTypeIndex) +// { +// case TypeElement::csub: +// wsNameLim = L"m:limLow"; +// break; +// case TypeElement::csup: +// wsNameLim = L"m:limUpp"; +// break; +// } +// pXmlWrite->WriteNodeBegin(wsNameLim,false); +// pXmlWrite->WriteNodeBegin(wsNameLim+L"Pr",false); +// CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); +// pXmlWrite->WriteNodeEnd(wsNameLim+L"Pr",false,false); +// CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); +// CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pValueIndex,pXmlWrite); +// pXmlWrite->WriteNodeEnd(wsNameLim,false,false); +// break; +// } +// } } void CElementIndex::SetAttribute(CAttribute *pAttribute) { - SetBaseAttribute(pAttribute); - if(m_pLeftArg != nullptr) + if(m_pLeftArg != nullptr && m_pLeftArg->GetAttribute() == nullptr && pAttribute != nullptr) m_pLeftArg->SetAttribute(pAttribute); + if(m_pLeftArg != nullptr && m_pLeftArg->GetAttribute() != nullptr) + SetBaseAttribute(m_pLeftArg->GetAttribute()); +// if(pAttribute!= nullptr) +// SetBaseAttribute(pAttribute); if(m_pValueIndex != nullptr) m_pValueIndex->SetAttribute(pAttribute); + if(m_pLowerIndex != nullptr) + m_pLowerIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pUpperIndex != nullptr) + m_pUpperIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pLsubIndex != nullptr) + m_pLsubIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pLsupIndex != nullptr) + m_pLsupIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pCsubIndex != nullptr) + m_pCsubIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pCsupIndex != nullptr) + m_pCsupIndex->SetAttribute(m_pLeftArg->GetAttribute()); + } + void CElementIndex::ConversionOfIndicesToValue(XmlUtils::CXmlWriter *pXmlWrite) + { + if(m_pLsubIndex != nullptr || m_pLsupIndex != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:sPre",false); + pXmlWrite->WriteNodeBegin(L"m:sPrePr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:sPrePr",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pLsubIndex,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pLsupIndex,pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:e",false); + ConversionOfIndicesAfterValue(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); + } + else + ConversionOfIndicesAfterValue(pXmlWrite); + } + void CElementIndex::ConversionOfIndicesAfterValue(XmlUtils::CXmlWriter *pXmlWrite) + { + if(m_pUpperIndex !=nullptr || m_pLowerIndex != nullptr) + { + std::wstring wsNameNodeIndex; + if(m_pUpperIndex != nullptr && m_pLowerIndex != nullptr) + wsNameNodeIndex = L"m:sSubSup"; + else if(m_pLowerIndex != nullptr && m_pUpperIndex == nullptr) + wsNameNodeIndex = L"m:sSub"; + else if(m_pLowerIndex == nullptr && m_pUpperIndex != nullptr) + wsNameNodeIndex = L"m:sSup"; + pXmlWrite->WriteNodeBegin(wsNameNodeIndex,false); + pXmlWrite->WriteNodeBegin(wsNameNodeIndex+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); + if(m_pUpperIndex!=nullptr && m_pLowerIndex != nullptr) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pLowerIndex,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pUpperIndex,pXmlWrite); + } + else if(m_pLowerIndex!= nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pLowerIndex,pXmlWrite); + else if(m_pUpperIndex != nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pUpperIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameNodeIndex,false,false); + } + else + m_pLeftArg->ConversionToOOXML(pXmlWrite); } //class methods CElementFunction CElementFunction::CElementFunction(const TypeElement &enType, const std::wstring &wsNameFunc) - :CElement(TypeElement::Function), m_pValue(nullptr),m_wsNameFunc(wsNameFunc),m_enTypeFunction(enType) + :CElement(TypeElement::Function), m_pValue(nullptr),m_pIndex(nullptr),m_enTypeFunction(enType) { + switch (m_enTypeFunction) { + case TypeElement::cos: + m_wsNameFunc = L"cos"; + break; + case TypeElement::sin: + m_wsNameFunc = L"sin"; + break; + case TypeElement::tan: + m_wsNameFunc = L"tan"; + break; + case TypeElement::cot: + m_wsNameFunc = L"cot"; + break; + case TypeElement::sinh: + m_wsNameFunc = L"sinh"; + break; + case TypeElement::cosh: + m_wsNameFunc = L"cosh"; + break; + case TypeElement::tanh: + m_wsNameFunc = L"tanh"; + break; + case TypeElement::coth: + m_wsNameFunc = L"coth"; + break; + case TypeElement::arcsin: + m_wsNameFunc = L"arcsin"; + break; + case TypeElement::arccos: + m_wsNameFunc = L"arccos"; + break; + case TypeElement::arctan: + m_wsNameFunc = L"arctan"; + break; + case TypeElement::arccot: + m_wsNameFunc = L"arccot"; + break; + case TypeElement::arsinh: + m_wsNameFunc = L"arsinh"; + break; + case TypeElement::arcosh: + m_wsNameFunc = L"arcosh"; + break; + case TypeElement::artanh: + m_wsNameFunc = L"artanh"; + break; + case TypeElement::arcoth: + m_wsNameFunc = L"arcoth"; + break; + case TypeElement::log: + m_wsNameFunc = L"log"; + break; + case TypeElement::ln: + m_wsNameFunc = L"ln"; + break; + case TypeElement::exp: + m_wsNameFunc = L"exp"; + break; + case TypeElement::func: + { + m_wsNameFunc = wsNameFunc; + break; + } + default: + break; + } } CElementFunction::~CElementFunction() { delete m_pValue; + delete m_pIndex; } void CElementFunction::SetValueFunction(CElement *pElement) { @@ -1949,115 +2260,54 @@ namespace StarMath } void CElementFunction::Parse(CStarMathReader* pReader) { - if(pReader->CheckIteratorPosition()) + pReader->ReadingTheNextToken(); + if(CElementIndex::GetUpperIndex(pReader->GetLocalType()) || CElementIndex::GetLowerIndex(pReader->GetLocalType())) { - CElement* pTempElement = CParserStarMathString::ParseElement(pReader); - pReader->ReadingTheNextToken(); - while(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) - { - CElement* pElement = CParserStarMathString::ParseElement(pReader); - CParserStarMathString::AddLeftArgument(pTempElement,pElement); - pTempElement = pElement; - pReader->ReadingTheNextToken(); - } - SetValueFunction(pTempElement); + m_pIndex = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(new CElementString(m_wsNameFunc),m_pIndex); + return ; } - else - SetValueFunction(nullptr); + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); + } + SetValueFunction(pTempElement); } void CElementFunction::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { - pXmlWrite->WriteNodeBegin(L"m:func",false); - CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); - pXmlWrite->WriteNodeBegin(L"m:fName",false); - pXmlWrite->WriteNodeBegin(L"m:r",false); - pXmlWrite->WriteNodeBegin(L"m:rPr",false); - pXmlWrite->WriteNodeBegin(L"m:sty",true); - pXmlWrite->WriteAttribute(L"m:val",L"p"); - pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeEnd(L"m:rPr",false,false); - CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); - pXmlWrite->WriteNodeBegin(L"m:t",false); - switch (m_enTypeFunction) { - case TypeElement::cos: - pXmlWrite->WriteString(L"cos"); - break; - case TypeElement::sin: - pXmlWrite->WriteString(L"sin"); - break; - case TypeElement::tan: - pXmlWrite->WriteString(L"tan"); - break; - case TypeElement::cot: - pXmlWrite->WriteString(L"cot"); - break; - case TypeElement::sinh: - pXmlWrite->WriteString(L"sinh"); - break; - case TypeElement::cosh: - pXmlWrite->WriteString(L"cosh"); - break; - case TypeElement::tanh: - pXmlWrite->WriteString(L"tanh"); - break; - case TypeElement::coth: - pXmlWrite->WriteString(L"coth"); - break; - case TypeElement::arcsin: - pXmlWrite->WriteString(L"arcsin"); - break; - case TypeElement::arccos: - pXmlWrite->WriteString(L"arccos"); - break; - case TypeElement::arctan: - pXmlWrite->WriteString(L"arctan"); - break; - case TypeElement::arccot: - pXmlWrite->WriteString(L"arccot"); - break; - case TypeElement::arsinh: - pXmlWrite->WriteString(L"arsinh"); - break; - case TypeElement::arcosh: - pXmlWrite->WriteString(L"arcosh"); - break; - case TypeElement::artanh: - pXmlWrite->WriteString(L"artanh"); - break; - case TypeElement::arcoth: - pXmlWrite->WriteString(L"arcoth"); - break; - case TypeElement::log: - pXmlWrite->WriteString(L"log"); - break; - case TypeElement::ln: - pXmlWrite->WriteString(L"ln"); - break; - case TypeElement::exp: - pXmlWrite->WriteString(L"exp"); - break; - case TypeElement::func: - { - if(!m_wsNameFunc.empty()) - pXmlWrite->WriteString(GetNameFuncInString()); - break; - } - default: - break; - } - pXmlWrite->WriteNodeEnd(L"m:t",false,false); - pXmlWrite->WriteNodeEnd(L"m:r",false,false); - pXmlWrite->WriteNodeEnd(L"m:fName",false,false); - if(m_pValue!=nullptr) - { - CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValue,pXmlWrite); - } + if(m_pIndex !=nullptr) + m_pIndex->ConversionToOOXML(pXmlWrite); else { - pXmlWrite->WriteNodeBegin(L"m:e",true); - pXmlWrite->WriteNodeEnd(L"",true,true); + pXmlWrite->WriteNodeBegin(L"m:func",false); + CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:fName",false); + pXmlWrite->WriteNodeBegin(L"m:r",false); + pXmlWrite->WriteNodeBegin(L"m:rPr",false); + pXmlWrite->WriteNodeBegin(L"m:sty",true); + pXmlWrite->WriteAttribute(L"m:val",L"p"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"m:rPr",false,false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + if(!m_wsNameFunc.empty()) + pXmlWrite->WriteString(m_wsNameFunc); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + pXmlWrite->WriteNodeEnd(L"m:fName",false,false); + if(m_pValue!=nullptr) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValue,pXmlWrite); + } + else + { + pXmlWrite->WriteNodeBegin(L"m:e",true); + pXmlWrite->WriteNodeEnd(L"",true,true); + } + pXmlWrite->WriteNodeEnd(L"m:func",false,false); } - pXmlWrite->WriteNodeEnd(L"m:func",false,false); } TypeElement CElementFunction::GetFunction(const std::wstring &wsToken) { @@ -2099,6 +2349,8 @@ namespace StarMath delete m_pValueOperator; delete m_pValueFrom; delete m_pValueTo; + delete m_pLowerIndex; + delete m_pUpperIndex; } void CElementOperator::SetValueOperator(CElement *pElement) { @@ -2182,7 +2434,6 @@ namespace StarMath pReader->ClearReader(); SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader)); } -// SetValueOperator(CParserStarMathString::ParseElement(pReader)); m_pValueOperator = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); while(pReader->GetGlobalType() == TypeElement::Index) @@ -2601,7 +2852,12 @@ namespace StarMath } void CElementBracketWithIndex::Parse(CStarMathReader *pReader) { - SetBracketValue(CParserStarMathString::ParseElement(pReader)); + m_pValue = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while(pReader->GetGlobalType() == TypeElement::Index) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,m_pValue); + } } void CElementBracketWithIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) { @@ -2706,18 +2962,18 @@ namespace StarMath } void CElementGrade::Parse(CStarMathReader *pReader) { - SetValueGrade(CParserStarMathString::ParseElement(pReader)); + m_pValueGrade = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); if(pReader->GetLocalType() == TypeElement::from) { pReader->ClearReader(); - SetValueFrom(CParserStarMathString::ParseElement(pReader)); + m_pValueFrom = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); } if(pReader->GetLocalType() == TypeElement::to) { pReader->ClearReader(); - SetValueTo(CParserStarMathString::ParseElement(pReader)); + m_pValueTo = CParserStarMathString::ParseElement(pReader); } if(GetAttribute() != nullptr) SetAttribute(GetAttribute()); diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 907b12cad6..f1608b93d0 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -162,7 +162,15 @@ namespace StarMath void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + void ConversionOfIndicesToValue(XmlUtils::CXmlWriter* pXmlWrite); + void ConversionOfIndicesAfterValue(XmlUtils::CXmlWriter* pXmlWrite); CElement* m_pValueIndex; + CElement* m_pUpperIndex; + CElement* m_pLowerIndex; + CElement* m_pLsubIndex; + CElement* m_pLsupIndex; + CElement* m_pCsubIndex; + CElement* m_pCsupIndex; CElement* m_pLeftArg; TypeElement m_enTypeIndex; }; @@ -265,7 +273,8 @@ namespace StarMath private: void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; - void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override;// + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + bool CheckMline(CElement* pElement); TypeElement m_enTypeBracket; std::vector m_arBrecketValue; }; @@ -341,6 +350,7 @@ namespace StarMath void Parse(CStarMathReader* pReader) override; void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; CElement* m_pValue; + CElement* m_pIndex; std::wstring m_wsNameFunc; TypeElement m_enTypeFunction; }; @@ -410,6 +420,8 @@ namespace StarMath static void AddingAnElementToAnArray(std::vector& arrEquation,CElement* pAddElement); //Receives the left element as input, reads the next one, if the next element has a higher priority and contains the left element, the element received at the input is passed to it. The entire structure is saved and returned. static void ReadingElementsWithPriorities(CStarMathReader* pReader,CElement*& pLeftElement); + // + static void ReadingElementsWithAttributes(CStarMathReader* pReader,CElement*& pSavingElement); void SetAlignment(const unsigned int& iAlignment); const unsigned int& GetAlignment(); private: From 110617547c5ae44d0a20b9073b720d099a04eb8a Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Fri, 15 Mar 2024 15:48:02 +0300 Subject: [PATCH 108/117] improvements to attribute parsing (cherry picked from commit 7776f15a359951b9d61ed0b1f5041f1b482e5605) --- .../StarMath2OOXML/cstarmathpars.cpp | 236 ++++++++++++------ .../Converter/StarMath2OOXML/cstarmathpars.h | 15 +- 2 files changed, 171 insertions(+), 80 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 6666b40927..3a9c7f986b 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -224,7 +224,7 @@ namespace StarMath return m_iAlignment; } //class methods CAttribute - CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0),m_iAlignment(-1) + CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0),m_iAlignment(0) { } CAttribute::~CAttribute() @@ -253,112 +253,113 @@ namespace StarMath { m_bStrike = true; } - void CAttribute::SetColor(const TypeElement &enColor) + bool CAttribute::SetColor(const TypeElement &enColor) { if(enColor != TypeElement::undefine) { switch (enColor) { case TypeElement::black: m_wsColor = L"000000"; - break; + return true; case TypeElement::blue: m_wsColor = L"0400ff"; - break; + return true; case TypeElement::green: m_wsColor =L"00FF00"; - break; + return true; case TypeElement::red: m_wsColor =L"FF0000"; - break; + return true; case TypeElement::fuchsia: m_wsColor =L"ED0DD9"; - break; + return true; case TypeElement::aqua: m_wsColor =L"30D5C8"; - break; + return true; case TypeElement::yellow: m_wsColor =L"FFFF00"; - break; + return true; case TypeElement::gray: m_wsColor =L"808080"; - break; + return true; case TypeElement::lime: m_wsColor =L"00FF00"; - break; + return true; case TypeElement::maroon: m_wsColor =L"800000"; - break; + return true; case TypeElement::navy: m_wsColor =L"000080"; - break; + return true; case TypeElement::olive: m_wsColor =L"808000"; - break; + return true; case TypeElement::purple: m_wsColor =L"800080"; - break; + return true; case TypeElement::silver: m_wsColor =L"C0C0C0"; - break; + return true; case TypeElement::teal: m_wsColor =L"008080"; - break; + return true; case TypeElement::coral: m_wsColor =L"FF7F50"; - break; + return true; case TypeElement::midnightblue: m_wsColor =L"191970"; - break; + return true; case TypeElement::crimson: m_wsColor =L"DC143C"; - break; + return true; case TypeElement::violet: m_wsColor =L"EE82EE"; - break; + return true; case TypeElement::orange: m_wsColor =L"FFA500"; - break; + return true; case TypeElement::orangered: m_wsColor =L"FF4500"; - break; + return true; case TypeElement::seagreen: m_wsColor =L"2E8B57"; - break; + return true; case TypeElement::indigo: m_wsColor =L"4B0082"; - break; + return true; case TypeElement::hotpink: m_wsColor =L"FF69B4"; - break; + return true; case TypeElement::lavender: m_wsColor =L"FFF0F5"; - break; + return true; default: - break; + return false; } } + else return false; } void CAttribute::SetColor(const std::wstring &wsColor) { m_wsColor = wsColor; } - void CAttribute::SetFont(const TypeElement &enFont) + bool CAttribute::SetFont(const TypeElement &enFont) { switch (enFont) { case TypeElement::ital: - SetItal(); - break; + m_bItal = true; + return true; case TypeElement::bold: - SetBold(); - break; + m_bBold = true; + return true; case TypeElement::phantom: - SetPhantom(); - break; + m_bPhantom = true; + return true; case TypeElement::overstrike: - SetStrike(); - break; + m_bStrike = true; + return true; default: - break; + return false; } } void CAttribute::SetFontName(const std::wstring &wsNameFont) @@ -401,32 +402,62 @@ namespace StarMath { return m_wsColor.empty(); } - void CAttribute::ParseColorAttribute(const std::wstring &wsToken,CStarMathReader* pReader) + //hex current + bool CAttribute::ParseColorAttribute(const std::wstring &wsToken,CStarMathReader* pReader) { TypeElement enTempColor = GetTypeColorAttribute(wsToken); switch(enTempColor) { case TypeElement::hex: { - std::wstring wsTempHex; - do + pReader->SetString(L""); + std::wstring wsTempToken; + wsTempToken = pReader->TakingElementForHex(); + if(wsTempToken.empty()) + return false; + if(!m_wsColor.empty()) + m_wsColor.clear(); + if(wsTempToken.size()< 6) { - wsTempHex += pReader->GetElement(); - }while(wsTempHex.size()< 6); - m_wsColor = wsTempHex; - break; + int iZero = 6 - wsTempToken.size(); + for(int i = 0;i 6) + { + m_wsColor += wsTempToken.substr(wsTempToken.size()-6); + return true; + } } case TypeElement::rgb: { const int iTempLen = 7; wchar_t arTemp[iTempLen]; unsigned int wsRed,wsGreen,wsBlue; - pReader->GetToken(); - wsRed = std::stoi(pReader->GetString()); - pReader->GetToken(); - wsGreen = std::stoi(pReader->GetString()); - pReader->GetToken(); - wsBlue = std::stoi(pReader->GetString()); + pReader->SetString(pReader->GetElement()); + if(TypeElement::undefine != CElementString::GetDigit(pReader->GetString())) + wsRed = std::stoi(pReader->GetString()); + else + return false; + if(wsRed > 255 || wsRed < 0) + return false; + pReader->SetString(pReader->GetElement()); + if(TypeElement::undefine != CElementString::GetDigit(pReader->GetString())) + wsGreen = std::stoi(pReader->GetString()); + else + return false; + pReader->SetString(pReader->GetElement()); + if(TypeElement::undefine != CElementString::GetDigit(pReader->GetString())) + wsBlue = std::stoi(pReader->GetString()); + else + return false; if(wsRed > 255 || wsGreen > 255 || wsBlue > 255) m_wsColor = L"000000"; else @@ -434,30 +465,36 @@ namespace StarMath swprintf(arTemp,iTempLen,L"%02X%02X%02X",wsRed,wsGreen,wsBlue); m_wsColor = std::wstring(arTemp,6); } - break; + return true; } default: - SetColor(enTempColor); - break; + return(SetColor(enTempColor)); } } - void CAttribute::ParseFontAttribute(const TypeElement& enTypeFont, CStarMathReader *pReader) + bool CAttribute::ParseFontAttribute(const TypeElement& enTypeFont, CStarMathReader *pReader) { switch(enTypeFont) { case TypeElement::size: { - pReader->GetToken(); - int iTemp = std::stoi(pReader->GetString()); - if (iTemp >= 0) + std::wstring wsSize = pReader->GetElement(); + int iTemp; + if(CElementString::GetDigit(wsSize) != TypeElement::undefine) + iTemp = std::stoi(wsSize); + else + { + pReader->SetString(wsSize); + return false; + } + if (iTemp > 0) m_iSize = iTemp*2; else m_iSize = 24; - break; + return true; } case TypeElement::font: { - pReader->GetToken(); + pReader->SetString(pReader->GetElement()); if(pReader->GetString() == L"sans") m_wsNameFont = L"Liberation Sans"; else if(pReader->GetString() == L"serif") @@ -465,24 +502,23 @@ namespace StarMath else if(pReader->GetString() == L"fixed") m_wsNameFont = L"Liberation Mono"; else - m_wsNameFont = pReader->GetString(); - break; + return false; +// m_wsNameFont = pReader->GetString(); + return true; } case TypeElement::alignl: case TypeElement::alignr: case TypeElement::alignc: - break; + return true; default: - SetFont(enTypeFont); - break; + return SetFont(enTypeFont); } } //нет phantom, rgb, 16 , гарнитуры и кегля TypeElement CAttribute::GetTypeColorAttribute(const std::wstring &wsToken) { - if(L"color" == wsToken) return TypeElement::color; - else if(L"hex"==wsToken) return TypeElement::hex; + if(L"hex"==wsToken) return TypeElement::hex; else if(L"rgb" == wsToken) return TypeElement::rgb; else if(L"black" == wsToken) return TypeElement::black; else if(L"green" == wsToken) return TypeElement::green; @@ -524,6 +560,29 @@ namespace StarMath else if(L"alignc" == wsToken) return TypeElement::alignc; else return TypeElement::undefine; } + bool CAttribute::CheckHexPosition(const wchar_t &cToken) + { + if(isdigit(cToken)) + return true; + if( L'A' == cToken) return true; + else if(L'B' == cToken) return true; + else if(L'C' == cToken) return true; + else if(L'D' == cToken) return true; + else if(L'E' == cToken) return true; + else if(L'F' == cToken) return true; + else + return false; + } + bool CAttribute::CheckAttribute() + { + if(m_bBold == true || m_bItal == true || m_bStrike == true || m_bPhantom == true) + return true; + else if(!m_wsColor.empty() || !m_wsNameFont.empty()) + return true; + else if(m_iSize != 0 || (m_iAlignment == 1 || m_iAlignment == 2)) + return true; + return false; + } //class methods CElement CElement::~CElement() { @@ -2536,21 +2595,30 @@ namespace StarMath if(CheckIteratorPosition()) { m_wsToken = GetElement(); - TypeElement enTypeFont =CAttribute::GetTypeFontAttribute(m_wsToken),enTypeColor = CAttribute::GetTypeColorAttribute(m_wsToken); - if(enTypeFont != TypeElement::undefine || enTypeColor != TypeElement::undefine) + TypeElement enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); + if(enTypeFont != TypeElement::undefine || L"color" == m_wsToken) m_pAttribute = new CAttribute(); - while((enTypeFont != TypeElement::undefine || enTypeColor != TypeElement::undefine) && m_itStart != m_itEnd) + while((enTypeFont != TypeElement::undefine || L"color" == m_wsToken) && m_itStart != m_itEnd) { - if(enTypeColor == TypeElement::color) m_pAttribute->ParseColorAttribute(GetElement(),this); - else if(enTypeFont != TypeElement::undefine) m_pAttribute->ParseFontAttribute(enTypeFont,this); - - if(m_itStart != m_itEnd) + if(L"color" == m_wsToken) + { + m_wsToken = GetElement(); + if(m_pAttribute->ParseColorAttribute(m_wsToken,this)) + m_wsToken.clear(); + } + else if(enTypeFont != TypeElement::undefine) + if(m_pAttribute->ParseFontAttribute(enTypeFont,this)) + m_wsToken.clear(); + else + enTypeFont = TypeElement::undefine; + if((m_itStart != m_itEnd) && m_wsToken.empty()) { m_wsToken = GetElement(); - enTypeColor = CAttribute::GetTypeColorAttribute(m_wsToken); enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); } } + if(m_pAttribute != nullptr && !m_pAttribute->CheckAttribute()) + m_pAttribute = nullptr; if(m_wsToken == L"left") m_wsToken = GetElement(); else if(L"right" == m_wsToken ) m_wsToken = GetElement(); } @@ -2741,6 +2809,24 @@ namespace StarMath if(!m_wsElement.empty()) return m_wsElement; else return {}; } + std::wstring CStarMathReader::TakingElementForHex() + { + std::wstring wsTokenHex{}; + for(;m_itStart != m_itEnd;m_itStart++) + { + if(iswspace(*m_itStart)) + return wsTokenHex; + else if(CAttribute::CheckHexPosition(*m_itStart)) + wsTokenHex.push_back(*m_itStart); + else + return wsTokenHex; + } + return wsTokenHex; + } + void CStarMathReader::SetString(const std::wstring &wsToken) + { + m_wsToken = wsToken; + } void CStarMathReader::FindingTheEndOfParentheses() { std::wstring::iterator itStart = m_itStart,itStartBracketClose; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index f1608b93d0..94904c356b 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -69,18 +69,21 @@ namespace StarMath std::wstring GetColor(); const std::wstring& GetFontName(); bool EmptyColor(); - void ParseFontAttribute(const TypeElement& enTypeFont,CStarMathReader* pReader); - void ParseColorAttribute(const std::wstring& wsToken,CStarMathReader* pReader); + bool ParseFontAttribute(const TypeElement& enTypeFont,CStarMathReader* pReader); + bool ParseColorAttribute(const std::wstring& wsToken,CStarMathReader* pReader); void SetSize(const unsigned int& iSize); void SetAlignment(const unsigned int& iAlignment); void SetBold(); void SetItal(); void SetPhantom(); void SetStrike(); - void SetColor(const TypeElement& enColor); + bool SetColor(const TypeElement& enColor); void SetColor(const std::wstring& wsColor); - void SetFont(const TypeElement& enFont); + bool SetFont(const TypeElement& enFont); void SetFontName(const std::wstring& wsNameFont); + bool CheckAttribute(); + // + static bool CheckHexPosition(const wchar_t& cToken); private: std::wstring m_wsColor,m_wsNameFont; bool m_bBold,m_bItal,m_bPhantom,m_bStrike; @@ -109,6 +112,8 @@ namespace StarMath CAttribute* GetBaseAttribute(); //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) std::wstring GetElement(); + std::wstring TakingElementForHex(); + void SetString(const std::wstring& wsToken); void FindingTheEndOfParentheses(); void IteratorNullification(); void ReadingTheNextToken(); @@ -420,7 +425,7 @@ namespace StarMath static void AddingAnElementToAnArray(std::vector& arrEquation,CElement* pAddElement); //Receives the left element as input, reads the next one, if the next element has a higher priority and contains the left element, the element received at the input is passed to it. The entire structure is saved and returned. static void ReadingElementsWithPriorities(CStarMathReader* pReader,CElement*& pLeftElement); - // + //method for parsing indexes with attributes. If there is an attribute present when indexes are read, then all subsequent indexes are applied to the index with the attribute. static void ReadingElementsWithAttributes(CStarMathReader* pReader,CElement*& pSavingElement); void SetAlignment(const unsigned int& iAlignment); const unsigned int& GetAlignment(); From 2b72bf3f531862e150705141ea68629be8a8149e Mon Sep 17 00:00:00 2001 From: Dmitry Okunev Date: Wed, 27 Mar 2024 14:47:52 +0300 Subject: [PATCH 109/117] Fix bugs (correction of indexes, without elements between them, editing of frac and binom) (cherry picked from commit 43bee348aa87d797457b58855eb9d843195e904d) --- .../StarMath2OOXML/TestSMConverter/main.cpp | 90 ++++++ .../StarMath2OOXML/cconversionsmtoooxml.cpp | 54 ++-- .../StarMath2OOXML/cstarmathpars.cpp | 293 +++++++++--------- .../Converter/StarMath2OOXML/cstarmathpars.h | 15 +- .../Converter/oox_conversion_context.cpp | 3 +- 5 files changed, 274 insertions(+), 181 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp index 40e3d17131..75ec83fbc7 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -1204,6 +1204,96 @@ TEST(SMConvectorTest,FunctionWithColor) EXPECT_EQ(oTest.GetOOXML(),wsXmlString); } +TEST(SMConvectorTest,IncorrectSizeAndFontInput) +{ + std::wstring wsString = L"size font bolt ital 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"bolt2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IncorrectRGBColorInput) +{ + std::wstring wsString = L"color rgb 255 0 257 2 color rgb 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2550257210"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IncorrectHexColorInput) +{ + std::wstring wsString = L"color hex 161616FF RGB color hex 66 RGB color hex RGB color hex FFAACCFF RGB color hex 99112288FF0000 RGB "; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"RGBRGBRGBRGBRGB"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexWithoutElement) +{ + std::wstring wsString = L"2^_3 "; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"23"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Neg) +{ + std::wstring wsString = L"-1 neg 10 over 5 or 7"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"-1\u00AC105\u22287"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Frac) +{ + std::wstring wsString = L"sum_{n=1}^{ infty} frac{1}{n^2} + frac{1}{n^3} = frac{ pi^2}{6} + zeta(3)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"n=1\u221E1n2+1n3=pi26+zeta3"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketIndexOnTopAndOperationOnSet) +{ + std::wstring wsString = L"3 + 10 over 5 setminus 1 overbrace 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"3+105\u221612"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SqrtWithIndex) +{ + std::wstring wsString = L"sqrt{2}^{ log_2{8}} = 4"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2log28=4"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Binom) +{ + std::wstring wsString = L"binom 2 = 4 3 binom 2+1abc 5"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2=432+1abc5"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + //TEST(SMConvectorTest,AttributeMatrix) //{ // std::wstring wsString = L""; diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index 40b3a52638..e056cbb293 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -40,32 +40,32 @@ namespace StarMath { void CConversionSMtoOOXML::StartConversion(std::vector arPars, const unsigned int& iAlignment) { m_pXmlWrite = new XmlUtils::CXmlWriter; - m_pXmlWrite->WriteNodeBegin(L"m:oMathPara",false); - if(iAlignment>= 0 && iAlignment <= 2) - { - std::wstring wsAlignment; - switch(iAlignment) - { - case 0: - wsAlignment = L"center"; - break; - case 1: - wsAlignment = L"left"; - break; - case 2: - wsAlignment = L"right"; - break; - default: - wsAlignment = L"center"; - break; - } - m_pXmlWrite->WriteNodeBegin(L"m:oMathParaPr",false); - m_pXmlWrite->WriteNodeBegin(L"m:jc",true); - m_pXmlWrite->WriteAttribute(L"m:val",wsAlignment); - m_pXmlWrite->WriteNodeEnd(L"",true,true); - m_pXmlWrite->WriteNodeEnd(L"m:oMathParaPr",false,false); - } - m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); +// m_pXmlWrite->WriteNodeBegin(L"m:oMathPara",false); +// if(iAlignment>= 0 && iAlignment <= 2) +// { +// std::wstring wsAlignment; +// switch(iAlignment) +// { +// case 0: +// wsAlignment = L"center"; +// break; +// case 1: +// wsAlignment = L"left"; +// break; +// case 2: +// wsAlignment = L"right"; +// break; +// default: +// wsAlignment = L"center"; +// break; +// } +// m_pXmlWrite->WriteNodeBegin(L"m:oMathParaPr",false); +// m_pXmlWrite->WriteNodeBegin(L"m:jc",true); +// m_pXmlWrite->WriteAttribute(L"m:val",wsAlignment); +// m_pXmlWrite->WriteNodeEnd(L"",true,true); +// m_pXmlWrite->WriteNodeEnd(L"m:oMathParaPr",false,false); +// } +// m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); for(CElement* oTempElement:arPars) { if(oTempElement != nullptr) @@ -83,7 +83,7 @@ namespace StarMath { oTempElement->ConversionToOOXML(m_pXmlWrite); } } - EndConversion(); +// EndConversion(); } void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) { diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 3a9c7f986b..5836af722c 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -114,7 +114,11 @@ namespace StarMath { case TypeElement::BinOperator: { - return SetLeft(pLeftArg, pElementWhichAdd); + CElementBinOperator* pBinOp = dynamic_cast(pElementWhichAdd); + if(pBinOp->GetType() == TypeElement::neg) + return false; + else + return SetLeft(pLeftArg, pElementWhichAdd); } case TypeElement::SetOperations: { @@ -139,26 +143,27 @@ namespace StarMath else return false; } - CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader) + CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader, const bool& bConnection) { CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while(CheckForLeftArgument(pReader->GetGlobalType()) && (pReader->GetLocalType() != TypeElement::frac && pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType()!=TypeElement::sqrt)) + while(CheckForLeftArgument(pReader->GetGlobalType(),bConnection) && (pReader->GetLocalType() != TypeElement::frac && pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType()!=TypeElement::sqrt)) { CParserStarMathString::ReadingElementsWithPriorities(pReader,pFirstTempElement); } return pFirstTempElement; } - bool CParserStarMathString::CheckForLeftArgument(const TypeElement &enType) + bool CParserStarMathString::CheckForLeftArgument(const TypeElement &enType,const bool& bConnection) { switch(enType) { case TypeElement::BinOperator: - case TypeElement::Connection: case TypeElement::SetOperations: case TypeElement::BracketWithIndex: case TypeElement::Index: return true; + case TypeElement::Connection: + return bConnection; default: return false; } @@ -438,31 +443,56 @@ namespace StarMath } case TypeElement::rgb: { + pReader->SetString(L""); const int iTempLen = 7; wchar_t arTemp[iTempLen]; - unsigned int wsRed,wsGreen,wsBlue; - pReader->SetString(pReader->GetElement()); - if(TypeElement::undefine != CElementString::GetDigit(pReader->GetString())) - wsRed = std::stoi(pReader->GetString()); - else + int iRed(-1),iGreen(-1),iBlue(-1); + iRed = pReader->TakingElementForRGB(); + if(iRed == -1) return false; - if(wsRed > 255 || wsRed < 0) + iGreen = pReader->TakingElementForRGB(); + if(iGreen == -1) + { + RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); return false; - pReader->SetString(pReader->GetElement()); - if(TypeElement::undefine != CElementString::GetDigit(pReader->GetString())) - wsGreen = std::stoi(pReader->GetString()); - else + } + iBlue = pReader->TakingElementForRGB(); + if(iBlue == -1) + { + RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); return false; - pReader->SetString(pReader->GetElement()); - if(TypeElement::undefine != CElementString::GetDigit(pReader->GetString())) - wsBlue = std::stoi(pReader->GetString()); - else - return false; - if(wsRed > 255 || wsGreen > 255 || wsBlue > 255) + } +// std::wstring wsColorNumber = pReader->GetElement(); +// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) +// iRed = std::stoi(wsColorNumber); +// else +// { +// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); +// return false; +// } +// if(iRed > 255 || iRed < 0) +// return false; +// wsColorNumber = pReader->GetElement(); +// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) +// iGreen = std::stoi(wsColorNumber); +// else +// { +// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); +// return false; +// } +// wsColorNumber = pReader->GetElement(); +// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) +// iBlue = std::stoi(wsColorNumber); +// else +// { +// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); +// return false; +// } + if(iRed > 255 || iGreen > 255 || iBlue > 255) m_wsColor = L"000000"; else { - swprintf(arTemp,iTempLen,L"%02X%02X%02X",wsRed,wsGreen,wsBlue); + swprintf(arTemp,iTempLen,L"%02X%02X%02X",iRed,iGreen,iBlue); m_wsColor = std::wstring(arTemp,6); } return true; @@ -478,15 +508,15 @@ namespace StarMath case TypeElement::size: { std::wstring wsSize = pReader->GetElement(); + pReader->SetString(wsSize); int iTemp; if(CElementString::GetDigit(wsSize) != TypeElement::undefine) iTemp = std::stoi(wsSize); else { - pReader->SetString(wsSize); return false; } - if (iTemp > 0) + if (iTemp > 0 && iTemp < 127) m_iSize = iTemp*2; else m_iSize = 24; @@ -503,7 +533,6 @@ namespace StarMath m_wsNameFont = L"Liberation Mono"; else return false; -// m_wsNameFont = pReader->GetString(); return true; } case TypeElement::alignl: @@ -583,6 +612,17 @@ namespace StarMath return true; return false; } + void CAttribute::RefundOfTheAmountRGB(CStarMathReader *pReader, const int &iRed, const int &iGreen, const int &iBlue) + { + std::wstring wsSum; + if(iRed != -1) + wsSum += std::to_wstring(iRed); + if(iGreen != -1) + wsSum += std::to_wstring(iGreen); + if(iBlue != -1) + wsSum += std::to_wstring(iBlue); + pReader->SetString(wsSum); + } //class methods CElement CElement::~CElement() { @@ -748,10 +788,10 @@ namespace StarMath { if(m_enTypeBinOp == TypeElement::frac) { - SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader)); - SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader,false)); + SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader,false)); } - else if(m_enTypeBinOp == TypeElement::And || m_enTypeBinOp == TypeElement::neg) + else if(m_enTypeBinOp == TypeElement::neg) SetRightArg(CParserStarMathString::ParseElement(pReader)); else if(pReader->GetMarkForUnar() && MixedOperators(m_enTypeBinOp)) { @@ -762,7 +802,7 @@ namespace StarMath pReader->SetMarkForUnar(true); CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while((IsBinOperatorLowPrior() && pReader->GetGlobalType() == TypeElement::BinOperator) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) + while((IsBinOperatorLowPrior() && (pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetLocalType() == TypeElement::intersection || pReader->GetLocalType() == TypeElement::setminus || pReader->GetLocalType() == TypeElement::setquotient)) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) { CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); } @@ -835,6 +875,9 @@ namespace StarMath case TypeElement::And: pXmlWrite->WriteString(L"\u2227"); break; + case TypeElement::neg: + pXmlWrite->WriteString(L"\u00AC"); + break; default: break; } @@ -882,6 +925,7 @@ namespace StarMath else if(L"neg" == wsToken) return TypeElement::neg; else if(L"or" == wsToken) return TypeElement::Or; else if(L"and" == wsToken) return TypeElement::And; + else if(L"&" == wsToken) return TypeElement::And; else return TypeElement::undefine; } bool CElementBinOperator::MixedOperators(const TypeElement &enType) @@ -936,6 +980,10 @@ namespace StarMath { return m_pRightArgument; } + const TypeElement& CElementBinOperator::GetType() + { + return m_enTypeBinOp; + } //class methods CElementBracket CElementBracket::CElementBracket(const TypeElement& enType) :CElement(TypeElement::Bracket),m_enTypeBracket(enType) @@ -1108,6 +1156,7 @@ namespace StarMath else if(L"setR" == wsToken) return TypeElement::setR; else if(L"setc" == wsToken) return TypeElement::setC; else if(L"infinity" == wsToken) return TypeElement::infinity; + else if(L"infty" == wsToken) return TypeElement::infinity; else if(L"fact" == wsToken) return TypeElement::fact; else if(L"abs" == wsToken) return TypeElement::abs; else if(L"`" == wsToken) return TypeElement::interval; @@ -1564,7 +1613,7 @@ namespace StarMath { CElement* pTempElement = CParserStarMathString::ParseElement(pReader); pReader->ReadingTheNextToken(); - while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) + while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || (pReader->GetGlobalType() == TypeElement::BracketWithIndex && !(TypeElement::intersection == m_enTypeSet || TypeElement::setminus == m_enTypeSet || TypeElement::setquotient == m_enTypeSet)) || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) { CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); } @@ -1657,6 +1706,10 @@ namespace StarMath if(m_pRightArgument != nullptr) m_pRightArgument->SetAttribute(pAttribute); } + const TypeElement& CElementSetOperations::GetType() + { + return m_enTypeSet; + } //class methods CElementConnection CElementConnection::CElementConnection(const TypeElement& enType) :CElement(TypeElement::Connection),m_pLeftArgument(nullptr), m_pRightArgument(nullptr),m_enTypeCon(enType) @@ -1851,6 +1904,10 @@ namespace StarMath if(m_pRightArgument != nullptr) m_pRightArgument->SetAttribute(pAttribute); } + const TypeElement& CElementConnection::GetType() + { + return m_enTypeCon; + } //class methods CIndex CElementIndex::CElementIndex(const TypeElement& enType) : CElement(TypeElement::Index),m_pValueIndex(nullptr),m_pUpperIndex(nullptr),m_pLowerIndex(nullptr),m_pLsubIndex(nullptr),m_pLsupIndex(nullptr),m_pCsubIndex(nullptr),m_pCsupIndex(nullptr),m_pLeftArg(nullptr),m_enTypeIndex(enType) @@ -1944,6 +2001,13 @@ namespace StarMath else if(m_enTypeIndex == TypeElement::sqrt) { m_pValueIndex = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + if(CElementIndex::GetLowerIndex(pReader->GetLocalType()) || CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(m_pValueIndex,pElement); + m_pValueIndex = pElement; + } m_pLeftArg = m_pValueIndex; } else @@ -2050,109 +2114,6 @@ namespace StarMath } else ConversionOfIndicesToValue(pXmlWrite); -// switch(m_enTypeIndex) -// { -// case TypeElement::upper: -// case TypeElement::lower: -// { -// std::wstring wsNameNodeIndex; -// switch(m_enTypeIndex) -// { -// case TypeElement::upper: -// wsNameNodeIndex = L"m:sSup"; -// break; -// case TypeElement::lower: -// wsNameNodeIndex = L"m:sSub"; -// break; -// } -// pXmlWrite->WriteNodeBegin(wsNameNodeIndex,false); -// pXmlWrite->WriteNodeBegin(wsNameNodeIndex+L"Pr",false); -// CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); -// pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); -// CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); -// switch(m_enTypeIndex) -// { -// case TypeElement::upper: -// CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueIndex,pXmlWrite); -// break; -// case TypeElement::lower: -// CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueIndex,pXmlWrite); -// break; -// } -// pXmlWrite->WriteNodeEnd(wsNameNodeIndex,false,false); -// break; -// } -// case TypeElement::lsub: -// case TypeElement::lsup: -// { -// pXmlWrite->WriteNodeBegin(L"m:sPre",false); -// pXmlWrite->WriteNodeBegin(L"m:sPrePr",false); -// CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); -// pXmlWrite->WriteNodeEnd(L"m:sPrePr",false,false); -// switch(m_enTypeIndex) -// { -// case TypeElement::lsup: -// CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueIndex,pXmlWrite); -// break; -// case TypeElement::lsub: -// CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueIndex,pXmlWrite); -// break; -// } -// CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); -// pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); -// break; -// } -// case TypeElement::nroot: -// case TypeElement::sqrt: -// { -// pXmlWrite->WriteNodeBegin(L"m:rad",false); -// pXmlWrite->WriteNodeBegin(L"m:radPr",false); -// if(TypeElement::sqrt == m_enTypeIndex) -// { -// pXmlWrite->WriteNodeBegin(L"m:degHide",true); -// pXmlWrite->WriteAttribute(L"m:val",1); -// pXmlWrite->WriteNodeEnd(L"",true,true); -// } -// CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); -// pXmlWrite->WriteNodeEnd(L"m:radPr",false,false); -// if(m_pLeftArg != nullptr && m_enTypeIndex == TypeElement::nroot) -// { -// pXmlWrite->WriteNodeBegin(L"m:deg",false); -// m_pLeftArg->ConversionToOOXML(pXmlWrite); -// pXmlWrite->WriteNodeEnd(L"m:deg",false,false); -// } -// else -// { -// pXmlWrite->WriteNodeBegin(L"m:deg",true); -// pXmlWrite->WriteNodeEnd(L"w",true,true); -// } -// CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueIndex,pXmlWrite); -// pXmlWrite->WriteNodeEnd(L"m:rad",false,false); -// break; -// } -// case TypeElement::csub: -// case TypeElement::csup: -// { -// std::wstring wsNameLim; -// switch(m_enTypeIndex) -// { -// case TypeElement::csub: -// wsNameLim = L"m:limLow"; -// break; -// case TypeElement::csup: -// wsNameLim = L"m:limUpp"; -// break; -// } -// pXmlWrite->WriteNodeBegin(wsNameLim,false); -// pXmlWrite->WriteNodeBegin(wsNameLim+L"Pr",false); -// CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); -// pXmlWrite->WriteNodeEnd(wsNameLim+L"Pr",false,false); -// CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); -// CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pValueIndex,pXmlWrite); -// pXmlWrite->WriteNodeEnd(wsNameLim,false,false); -// break; -// } -// } } void CElementIndex::SetAttribute(CAttribute *pAttribute) { @@ -2160,22 +2121,23 @@ namespace StarMath m_pLeftArg->SetAttribute(pAttribute); if(m_pLeftArg != nullptr && m_pLeftArg->GetAttribute() != nullptr) SetBaseAttribute(m_pLeftArg->GetAttribute()); -// if(pAttribute!= nullptr) -// SetBaseAttribute(pAttribute); if(m_pValueIndex != nullptr) m_pValueIndex->SetAttribute(pAttribute); - if(m_pLowerIndex != nullptr) - m_pLowerIndex->SetAttribute(m_pLeftArg->GetAttribute()); - if(m_pUpperIndex != nullptr) - m_pUpperIndex->SetAttribute(m_pLeftArg->GetAttribute()); - if(m_pLsubIndex != nullptr) - m_pLsubIndex->SetAttribute(m_pLeftArg->GetAttribute()); - if(m_pLsupIndex != nullptr) - m_pLsupIndex->SetAttribute(m_pLeftArg->GetAttribute()); - if(m_pCsubIndex != nullptr) - m_pCsubIndex->SetAttribute(m_pLeftArg->GetAttribute()); - if(m_pCsupIndex != nullptr) - m_pCsupIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pLeftArg != nullptr) + { + if(m_pLowerIndex != nullptr) + m_pLowerIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pUpperIndex != nullptr) + m_pUpperIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pLsubIndex != nullptr) + m_pLsubIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pLsupIndex != nullptr) + m_pLsupIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pCsubIndex != nullptr) + m_pCsubIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pCsupIndex != nullptr) + m_pCsupIndex->SetAttribute(m_pLeftArg->GetAttribute()); + } } void CElementIndex::ConversionOfIndicesToValue(XmlUtils::CXmlWriter *pXmlWrite) { @@ -2225,6 +2187,10 @@ namespace StarMath else m_pLeftArg->ConversionToOOXML(pXmlWrite); } + const TypeElement& CElementIndex::GetType() + { + return m_enTypeIndex; + } //class methods CElementFunction CElementFunction::CElementFunction(const TypeElement &enType, const std::wstring &wsNameFunc) :CElement(TypeElement::Function), m_pValue(nullptr),m_pIndex(nullptr),m_enTypeFunction(enType) @@ -2610,7 +2576,7 @@ namespace StarMath if(m_pAttribute->ParseFontAttribute(enTypeFont,this)) m_wsToken.clear(); else - enTypeFont = TypeElement::undefine; + enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); if((m_itStart != m_itEnd) && m_wsToken.empty()) { m_wsToken = GetElement(); @@ -2823,6 +2789,29 @@ namespace StarMath } return wsTokenHex; } + int CStarMathReader::TakingElementForRGB() + { + int iTokenRGB{-1}; + std::wstring wsToken; + std::wstring::iterator itTempStart = m_itStart; + wsToken = GetElement(); + if(CElementString::GetDigit(wsToken) != TypeElement::undefine) + { + iTokenRGB = std::stoi(wsToken); + if(iTokenRGB >= 0 && iTokenRGB<256) + return iTokenRGB; + else + { + m_itStart = itTempStart; + return -1; + } + } + else + { + m_itStart = itTempStart; + return -1; + } + } void CStarMathReader::SetString(const std::wstring &wsToken) { m_wsToken = wsToken; @@ -3023,6 +3012,10 @@ namespace StarMath if(m_pLeftArg != nullptr) m_pLeftArg->SetAttribute(pAttribute); } + const TypeElement& CElementBracketWithIndex::GetType() + { + return m_enTypeBracketWithIndex; + } //class methods CElementGrade CElementGrade::CElementGrade() :CElement(TypeElement::Grade),m_pValueGrade(nullptr), m_pValueFrom(nullptr), m_pValueTo(nullptr) @@ -3149,8 +3142,8 @@ namespace StarMath { if(m_enTypeMatrix == TypeElement::binom) { - SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader)); - SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader)); + SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader,false)); + SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader,false)); } else { diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h index 94904c356b..38393a1e26 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -82,9 +82,10 @@ namespace StarMath bool SetFont(const TypeElement& enFont); void SetFontName(const std::wstring& wsNameFont); bool CheckAttribute(); - // + //checking an element for a number from 1 to 9 or from the letter A to F static bool CheckHexPosition(const wchar_t& cToken); private: + void RefundOfTheAmountRGB(CStarMathReader* pReader,const int& iRed, const int& iGreen, const int& iBlue); std::wstring m_wsColor,m_wsNameFont; bool m_bBold,m_bItal,m_bPhantom,m_bStrike; unsigned int m_iSize,m_iAlignment; @@ -112,7 +113,10 @@ namespace StarMath CAttribute* GetBaseAttribute(); //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) std::wstring GetElement(); + // std::wstring TakingElementForHex(); + // + int TakingElementForRGB(); void SetString(const std::wstring& wsToken); void FindingTheEndOfParentheses(); void IteratorNullification(); @@ -163,6 +167,7 @@ namespace StarMath static TypeElement GetIndex(const std::wstring& wsCheckToken); static bool GetUpperIndex(const TypeElement& enType); static bool GetLowerIndex(const TypeElement& enType); + const TypeElement& GetType(); private: void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; @@ -208,6 +213,7 @@ namespace StarMath CElement* GetLeftArg(); static TypeElement GetBinOperator(const std::wstring& wsToken); static void UnaryCheck(CStarMathReader* pReader,CElement* pLastElement); + const TypeElement& GetType(); private: //checking for signs such as -,+,-+,+-. static bool MixedOperators(const TypeElement& enType); @@ -293,6 +299,7 @@ namespace StarMath void SetBracketValue(CElement* pElement); CElement* GetLeftArg(); static TypeElement GetBracketWithIndex(const std::wstring& wsToken); + const TypeElement& GetType(); private: void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; @@ -312,6 +319,7 @@ namespace StarMath void SetRightArg(CElement* pElement); CElement* GetRightArg(); static TypeElement GetSetOperation(const std::wstring& wsToken); + const TypeElement& GetType(); private: void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; @@ -331,6 +339,7 @@ namespace StarMath void SetLeftArg(CElement* pElement); CElement* GetLeftArg(); static TypeElement GetConnection(const std::wstring& wsToken); + const TypeElement& GetType(); private: void SetAttribute(CAttribute* pAttribute) override; void Parse(CStarMathReader* pReader) override; @@ -417,8 +426,8 @@ namespace StarMath static CElement* ParseElement(CStarMathReader* pReader); //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). static bool AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); - static bool CheckForLeftArgument(const TypeElement& enType ); - static CElement* ReadingWithoutBracket(CStarMathReader* pReader); + static bool CheckForLeftArgument(const TypeElement& enType, const bool& bConnection = true); + static CElement* ReadingWithoutBracket(CStarMathReader* pReader,const bool& bConnection = true); //checking the element (true if it is newline) static bool CheckNewline(CElement* pElement); //adding an element to the array, checking that it is not empty and adding the left element, if there is one. diff --git a/OdfFile/Reader/Converter/oox_conversion_context.cpp b/OdfFile/Reader/Converter/oox_conversion_context.cpp index 9ec757fcee..15e36a90b7 100644 --- a/OdfFile/Reader/Converter/oox_conversion_context.cpp +++ b/OdfFile/Reader/Converter/oox_conversion_context.cpp @@ -277,7 +277,8 @@ void math_context::start() } math_stream_ << L"\"/>"; - math_stream_ << L""; + math_stream_ << L""; + //math_stream_ << L""; start_level(); } From 3c8604390eac5cd77b385719603a0edd230b5367 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 1 Apr 2024 16:03:16 +0600 Subject: [PATCH 110/117] Fix table styles conversion --- OOXML/XlsxFormat/Styles/TableStyles.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/TableStyles.cpp b/OOXML/XlsxFormat/Styles/TableStyles.cpp index 7e99b76c8f..19d128b637 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.cpp +++ b/OOXML/XlsxFormat/Styles/TableStyles.cpp @@ -91,7 +91,7 @@ namespace OOX if(m_oSize.IsInit()) ptr->size = m_oSize->GetValue(); else - ptr->size = 0; + ptr->size = 1; if(m_oType.IsInit()) { @@ -330,7 +330,7 @@ namespace OOX if(m_oTable.IsInit()) beginStyle->fIsTable = m_oTable->GetValue(); else - beginStyle->fIsTable = false; + beginStyle->fIsTable = true; if(m_oName.IsInit()) beginStyle->rgchName = m_oName.get(); else if(m_oDisplayName.IsInit()) From 083ced27c8819d58f692d7abae24151ba2d96a8f Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 2 Apr 2024 12:32:04 +0300 Subject: [PATCH 111/117] fix build --- OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp index 5836af722c..fa84192c54 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -1538,7 +1538,7 @@ namespace StarMath m_wsType = L"\u2209"; break; case TypeElement::dlriarrow: - m_wsType = L"\u\u226B"; + m_wsType = L"\u226B"; break; case TypeElement::dllearrow: m_wsType = L"\u226A"; From ebe0248c3fe2f5639a216971522f11f13bbffec6 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 2 Apr 2024 13:08:08 +0300 Subject: [PATCH 112/117] fix bug #67016 --- OdfFile/Projects/Windows/cpodf.vcxproj | 1 + OdfFile/Reader/Format/paragraph_elements.cpp | 35 ++++++++++++++++---- OdfFile/Reader/Format/paragraph_elements.h | 6 ++-- OdfFile/Reader/Format/styles.cpp | 20 ++++++++++- 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/OdfFile/Projects/Windows/cpodf.vcxproj b/OdfFile/Projects/Windows/cpodf.vcxproj index 05f9ae9ddd..11770cba04 100644 --- a/OdfFile/Projects/Windows/cpodf.vcxproj +++ b/OdfFile/Projects/Windows/cpodf.vcxproj @@ -553,6 +553,7 @@ /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /bigobj %(AdditionalOptions) diff --git a/OdfFile/Reader/Format/paragraph_elements.cpp b/OdfFile/Reader/Format/paragraph_elements.cpp index 4b90ab12db..d4bc450363 100644 --- a/OdfFile/Reader/Format/paragraph_elements.cpp +++ b/OdfFile/Reader/Format/paragraph_elements.cpp @@ -160,7 +160,16 @@ void paragraph_content_element::docx_serialize_run(office_element_ptr_array& con docx_serialize_run(content[i], Context); } } - +void paragraph_content_element::xlsx_serialize(std::wostream& _Wostream, oox::xlsx_conversion_context& Context) +{ + std::wstringstream val; + text_to_stream(val, true); + std::wstring val_text = val.str(); + if (val_text != L"???") + { + _Wostream << val_text; + } +} //------------------------------------------------------------------------------------------------------------ const wchar_t * text::ns = L""; const wchar_t * text::name = L""; @@ -1069,7 +1078,11 @@ void title::xlsx_convert(oox::xlsx_conversion_context & Context) { std::wstringstream val; text_to_stream(val); - Context.get_text_context()->add_text(val.str()); + std::wstring _title = val.str(); + if (_title != L"???") + { + Context.get_text_context()->add_text(_title); + } } void title::pptx_convert(oox::pptx_conversion_context & Context) { @@ -1103,11 +1116,15 @@ void subject::docx_convert(oox::docx_conversion_context & Context) docx_serialize_field(L"SUBJECT", text_, Context); } -void subject::xlsx_convert(oox::xlsx_conversion_context & Context) +void subject::xlsx_convert(oox::xlsx_conversion_context& Context) { - std::wstringstream val; - this->text_to_stream(val); - Context.get_text_context()->add_text(val.str()); + std::wstringstream val; + this->text_to_stream(val); + std::wstring _subject = val.str(); + if (_subject != L"???") + { + Context.get_text_context()->add_text(_subject); + } } void subject::pptx_convert(oox::pptx_conversion_context & Context) { @@ -1142,7 +1159,11 @@ void chapter::xlsx_convert(oox::xlsx_conversion_context & Context) { std::wstringstream val; this->text_to_stream(val); - Context.get_text_context()->add_text(val.str()); + std::wstring _chapter = val.str(); + if (_chapter != L"???") + { + Context.get_text_context()->add_text(_chapter); + } } void chapter::pptx_convert(oox::pptx_conversion_context & Context) { diff --git a/OdfFile/Reader/Format/paragraph_elements.h b/OdfFile/Reader/Format/paragraph_elements.h index 19be7cc8da..c36d2dde59 100644 --- a/OdfFile/Reader/Format/paragraph_elements.h +++ b/OdfFile/Reader/Format/paragraph_elements.h @@ -77,10 +77,8 @@ public: virtual void docx_serialize_run(office_element_ptr & text, oox::docx_conversion_context & Context); virtual void docx_serialize_run(office_element_ptr_array& content, oox::docx_conversion_context& Context); - virtual void xlsx_serialize(std::wostream & _Wostream, oox::xlsx_conversion_context & Context) - { - text_to_stream(_Wostream, true); - } + virtual void xlsx_serialize(std::wostream& _Wostream, oox::xlsx_conversion_context& Context); + private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ){} virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){} diff --git a/OdfFile/Reader/Format/styles.cpp b/OdfFile/Reader/Format/styles.cpp index 719295d0d0..95be324126 100644 --- a/OdfFile/Reader/Format/styles.cpp +++ b/OdfFile/Reader/Format/styles.cpp @@ -41,6 +41,8 @@ #include "serialize_elements.h" #include "odfcontext.h" #include "draw_common.h" +#include "paragraph_elements.h" +#include "text_elements.h" namespace cpdoccore { @@ -2090,11 +2092,27 @@ void header_footer_impl::xlsx_serialize(std::wostream & _Wostream, oox::xlsx_con { region->xlsx_serialize(_Wostream, Context); } + else if (typeTextP == content_[i]->get_type()) + { + text::p* p = dynamic_cast(content_[i].get()); + for (size_t j = 0; p && j < p->paragraph_.content_.size(); j++) + { + text::paragraph_content_element* paragraph_element = dynamic_cast(p->paragraph_.content_[i].get()); + if (paragraph_element) + { + paragraph_element->xlsx_serialize(_Wostream, Context); + } + else + { + CP_SERIALIZE_TEXT(content_[i], true); + } + } + } else { CP_SERIALIZE_TEXT(content_[i], true); } - } + } } // text:notes-configuration //------------------------------------------------------------------------------------------------------- From 3d2e43b5d7dfae1cc36f68cb1b31c4423d956280 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 3 Apr 2024 11:50:09 +0300 Subject: [PATCH 113/117] fix namespace math --- .../StarMath2OOXML/cconversionsmtoooxml.cpp | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp index e056cbb293..1ce1665b91 100644 --- a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -73,7 +73,7 @@ namespace StarMath { if(CParserStarMathString::CheckNewline(oTempElement)) { m_pXmlWrite->WriteNodeBegin(L"m:r",false); - m_pXmlWrite->WriteNodeBegin(L"w:br",true); + m_pXmlWrite->WriteNodeBegin(L"a:br",true); m_pXmlWrite->WriteNodeEnd(L"",true,true); m_pXmlWrite->WriteNodeEnd(L"m:r",false,false); m_pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); @@ -91,58 +91,58 @@ namespace StarMath { { //тут должны быть базовые свойства шрифта, задаваемые выше - pXmlWrite->WriteNodeBegin(L"w:rPr",false); - pXmlWrite->WriteNodeBegin(L"w:rFonts",true); - pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + pXmlWrite->WriteNodeBegin(L"a:rPr",false); + pXmlWrite->WriteNodeBegin(L"a:rFonts",true); + pXmlWrite->WriteAttribute(L"a:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"a:ascii",L"Cambria Math"); pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:sz",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeBegin(L"a:sz",true); + pXmlWrite->WriteAttribute(L"a:val",L"40"); pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:szCs",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeBegin(L"a:szCs",true); + pXmlWrite->WriteAttribute(L"a:val",L"40"); pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + pXmlWrite->WriteNodeEnd(L"a:rPr",false,false); } else { std::wstring wsNameFont = pAttribute->GetFontName(); - pXmlWrite->WriteNodeBegin(L"w:rPr",false); - pXmlWrite->WriteNodeBegin(L"w:rFonts",true); + pXmlWrite->WriteNodeBegin(L"a:rPr",false); + pXmlWrite->WriteNodeBegin(L"a:rFonts",true); if(!wsNameFont.empty()) { - pXmlWrite->WriteAttribute(L"w:hAnsi",wsNameFont); - pXmlWrite->WriteAttribute(L"w:ascii",wsNameFont); + pXmlWrite->WriteAttribute(L"a:hAnsi",wsNameFont); + pXmlWrite->WriteAttribute(L"a:ascii",wsNameFont); } else { - pXmlWrite->WriteAttribute(L"w:hAnsi",L"Cambria Math"); - pXmlWrite->WriteAttribute(L"w:ascii",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"a:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"a:ascii",L"Cambria Math"); } pXmlWrite->WriteNodeEnd(L"w",true,true); if(pAttribute->GetSize() == 0) { //тут должны быть базовые свойства шрифта, задаваемые выше - далее везде где не задано - аналогично - pXmlWrite->WriteNodeBegin(L"w:sz",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeBegin(L"a:sz",true); + pXmlWrite->WriteAttribute(L"a:val",L"40"); pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:szCs",true); - pXmlWrite->WriteAttribute(L"w:val",L"40"); + pXmlWrite->WriteNodeBegin(L"a:szCs",true); + pXmlWrite->WriteAttribute(L"a:val",L"40"); pXmlWrite->WriteNodeEnd(L"w",true,true); } else if(pAttribute->GetSize() != 0) { - pXmlWrite->WriteNodeBegin(L"w:sz",true); - pXmlWrite->WriteAttribute(L"w:val",std::to_wstring(pAttribute->GetSize())); + pXmlWrite->WriteNodeBegin(L"a:sz",true); + pXmlWrite->WriteAttribute(L"a:val",std::to_wstring(pAttribute->GetSize())); pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:szCs",true); - pXmlWrite->WriteAttribute(L"w:val",std::to_wstring(pAttribute->GetSize())); + pXmlWrite->WriteNodeBegin(L"a:szCs",true); + pXmlWrite->WriteAttribute(L"a:val",std::to_wstring(pAttribute->GetSize())); pXmlWrite->WriteNodeEnd(L"w",true,true); } if(!pAttribute->EmptyColor()) { - pXmlWrite->WriteNodeBegin(L"w:color",true); - pXmlWrite->WriteAttribute(L"w:val",pAttribute->GetColor()); + pXmlWrite->WriteNodeBegin(L"a:color",true); + pXmlWrite->WriteAttribute(L"a:val",pAttribute->GetColor()); pXmlWrite->WriteNodeEnd(L"w",true,true); } if(pAttribute->GetBold() && pAttribute->GetItal()) @@ -154,22 +154,22 @@ namespace StarMath { pXmlWrite->WriteNodeBegin(L"m:sty", true); pXmlWrite->WriteAttribute(L"m:val",L"b"); pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:b",true); + pXmlWrite->WriteNodeBegin(L"a:b",true); pXmlWrite->WriteNodeEnd(L"w",true,true); - pXmlWrite->WriteNodeBegin(L"w:bCs",true); + pXmlWrite->WriteNodeBegin(L"a:bCs",true); pXmlWrite->WriteNodeEnd(L"w",true,true); } else if(pAttribute->GetItal()) { - pXmlWrite->WriteNodeBegin(L"w:i",true); + pXmlWrite->WriteNodeBegin(L"a:i",true); pXmlWrite->WriteNodeEnd(L"w",true,true); } if(pAttribute->GetStrike()) { - pXmlWrite->WriteNodeBegin(L"w:strike",true); + pXmlWrite->WriteNodeBegin(L"a:strike",true); pXmlWrite->WriteNodeEnd(L"w",true,true); } - pXmlWrite->WriteNodeEnd(L"w:rPr",false,false); + pXmlWrite->WriteNodeEnd(L"a:rPr",false,false); } } void CConversionSMtoOOXML::PropertiesMFPR(bool bType, XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) From ab4a3ef54639f428d56c43d3f50941f1dce22b0a Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 3 Apr 2024 11:53:12 +0300 Subject: [PATCH 114/117] fix bug #67231 --- OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj | 1 - .../Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters | 3 --- OdfFile/Reader/Converter/mediaitems.cpp | 2 +- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj b/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj index 71e929716b..b016c3bc60 100644 --- a/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj +++ b/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj @@ -82,7 +82,6 @@ - diff --git a/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters b/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters index 1ac5444aa8..eb22134e16 100644 --- a/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters +++ b/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters @@ -161,9 +161,6 @@ - - Document - Document diff --git a/OdfFile/Reader/Converter/mediaitems.cpp b/OdfFile/Reader/Converter/mediaitems.cpp index dc07512d82..01e4e350bb 100644 --- a/OdfFile/Reader/Converter/mediaitems.cpp +++ b/OdfFile/Reader/Converter/mediaitems.cpp @@ -64,7 +64,7 @@ bool is_internal(const std::wstring & uri, const std::wstring & packetRoot) std::wstring testRoot = pathRoot.GetPath(); std::wstring testFile = pathFile.GetPath(); - return (NSFile::CFileBinary::Exists(resultPath) || NSDirectory::Exists(mediaPath)) && (std::wstring::npos != testFile.find(testRoot)); + return (NSFile::CFileBinary::Exists(testFile) || NSDirectory::Exists(testFile)) && (std::wstring::npos != testFile.find(testRoot)); } mediaitems::item::item(std::wstring const & _href,_rels_type _type, std::wstring const & _outputName, From 2f7447f918b659c8faba1586f63525521f8513f0 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 4 Apr 2024 12:40:16 +0300 Subject: [PATCH 115/117] For bug #66986 --- PdfFile/PdfReader.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index 4a67605467..2fdd5cc2e7 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -1015,7 +1015,7 @@ BYTE* CPdfReader::GetWidgetFonts(int nTypeFonts) } } - if (!bFullFont || pField->getAcroFormFieldType() == acroFormFieldPushbutton) + if (!bFullFont) { oR.free(); oFonts.free(); oFontRef.free(); std::string sFontKey; @@ -1047,6 +1047,27 @@ BYTE* CPdfReader::GetWidgetFonts(int nTypeFonts) } } oR.free(); oFonts.free(); oFontRef.free(); + + if (pField->getAcroFormFieldType() == acroFormFieldPushbutton) + { + std::string sFontKey; + bool bFind = PdfReader::GetFontFromAP(m_pPDFDocument, pField, &oR, &oFonts, &oFontRef, sFontKey); + if (bFind && std::find(arrFontsRef.begin(), arrFontsRef.end(), oFontRef.getRefNum()) == arrFontsRef.end()) + { + bool bBold = false, bItalic = false; + wsFileName = PdfReader::GetFontData(m_pPDFDocument, m_pFontManager, m_pFontList, &oFonts, &oFontRef, nTypeFonts, sFontName, sFontName, bBold, bItalic); + + std::wstring wsFontName = UTF8_TO_U(sFontName); + if (m_mFonts.find(wsFontName) == m_mFonts.end()) + { + oRes.WriteString(sFontName); + nFontsID++; + arrFontsRef.push_back(oFontRef.getRefNum()); + m_mFonts[wsFontName] = wsFileName; + } + } + } + oR.free(); oFonts.free(); oFontRef.free(); } oRes.AddInt(nFontsID, nFontsPos); From 8b9c0d79bb46e187dd6f10def1dcd0cf14f03dd2 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 4 Apr 2024 14:27:48 +0300 Subject: [PATCH 116/117] Fix bug #67210 --- PdfFile/SrcReader/RendererOutputDev.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PdfFile/SrcReader/RendererOutputDev.cpp b/PdfFile/SrcReader/RendererOutputDev.cpp index 867f9e20d8..9e39f547e4 100644 --- a/PdfFile/SrcReader/RendererOutputDev.cpp +++ b/PdfFile/SrcReader/RendererOutputDev.cpp @@ -4035,8 +4035,9 @@ namespace PdfReader if (nRenderMode == 0 || nRenderMode == 4 || nRenderMode == 6 || (m_bDrawOnlyText && nRenderMode == 2)) { -#ifdef BUILDING_WASM_MODULE + bool bReplace = false; std::wstring sFontPath; +#ifdef BUILDING_WASM_MODULE m_pRenderer->get_FontPath(&sFontPath); if (!unGid && !wsUnicodeText.empty() && !sFontPath.empty()) { @@ -4079,13 +4080,15 @@ namespace PdfReader return; } m_pRenderer->put_FontPath(wsFileName); - sFontPath = wsFileName; + bReplace = true; } } } } #endif m_pRenderer->CommandDrawTextEx(wsUnicodeText, &unGid, unGidsCount, PDFCoordsToMM(dShiftX), PDFCoordsToMM(dShiftY), PDFCoordsToMM(dDx), PDFCoordsToMM(dDy)); + if (bReplace) + m_pRenderer->put_FontPath(sFontPath); } if (nRenderMode == 1 || nRenderMode == 2 || nRenderMode == 5 || nRenderMode == 6) From e8a69e39bc91a93680f1e9e11021b66d38c5491d Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 4 Apr 2024 16:40:41 +0300 Subject: [PATCH 117/117] Fix bugs #67249, #65628 --- PdfFile/SrcWriter/Document.cpp | 9 --------- PdfFile/SrcWriter/Metadata.cpp | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/PdfFile/SrcWriter/Document.cpp b/PdfFile/SrcWriter/Document.cpp index 8277f5c4eb..0881281355 100644 --- a/PdfFile/SrcWriter/Document.cpp +++ b/PdfFile/SrcWriter/Document.cpp @@ -531,9 +531,6 @@ namespace PdfWriter } CExtGrState* CDocument::GetExtGState(double dAlphaStroke, double dAlphaFill, EBlendMode eMode, int nStrokeAdjustment) { - if (IsPDFA()) - return NULL; - CExtGrState* pExtGrState = FindExtGrState(dAlphaStroke, dAlphaFill, eMode, nStrokeAdjustment); if (!pExtGrState) @@ -561,9 +558,6 @@ namespace PdfWriter } CExtGrState* CDocument::GetStrokeAlpha(double dAlpha) { - if (IsPDFA()) - return NULL; - CExtGrState* pExtGrState = NULL; for (unsigned int unIndex = 0, unCount = m_vStrokeAlpha.size(); unIndex < unCount; unIndex++) { @@ -584,9 +578,6 @@ namespace PdfWriter } CExtGrState* CDocument::GetFillAlpha(double dAlpha) { - if (IsPDFA()) - return NULL; - CExtGrState* pExtGrState = NULL; for (unsigned int unIndex = 0, unCount = m_vFillAlpha.size(); unIndex < unCount; unIndex++) { diff --git a/PdfFile/SrcWriter/Metadata.cpp b/PdfFile/SrcWriter/Metadata.cpp index d0cd8ebab7..ad4211b809 100644 --- a/PdfFile/SrcWriter/Metadata.cpp +++ b/PdfFile/SrcWriter/Metadata.cpp @@ -155,7 +155,7 @@ namespace PdfWriter if (pXref->IsPDFA()) { sXML += "\n"; - sXML += "1A\n"; + sXML += "2A\n"; sXML += ""; }