From 06c4419ecdf4750448c6b930b7fa25a48b2497ec Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Tue, 10 Nov 2020 15:33:03 +0300 Subject: [PATCH] OdfFormat fix bug #47308 --- .../src/common/readdocelement.cpp | 33 ++-- DesktopEditor/xml/src/xmllight_private.h | 170 ++++++++++-------- 2 files changed, 110 insertions(+), 93 deletions(-) diff --git a/ASCOfficeOdfFile/src/common/readdocelement.cpp b/ASCOfficeOdfFile/src/common/readdocelement.cpp index 178e0186fe3..54d134b344c 100644 --- a/ASCOfficeOdfFile/src/common/readdocelement.cpp +++ b/ASCOfficeOdfFile/src/common/readdocelement.cpp @@ -74,25 +74,26 @@ bool read_doc_element::read_sax( xml::sax * Reader ) switch( nodeType ) { case xml::typeElement: - { - const std::wstring namespacePrefix = Reader->namespacePrefix(); - const std::wstring localName = Reader->nodeLocalName(); + { + const std::wstring namespacePrefix = Reader->namespacePrefix(); + const std::wstring localName = Reader->nodeLocalName(); - add_child_element(Reader, namespacePrefix, localName); - } - break; + add_child_element(Reader, namespacePrefix, localName); + } + break; case xml::typeWhitespace: - { - const std::wstring value = Reader->value(); - add_space(value); - } - break; + { + const std::wstring value = Reader->value(); + add_space(value); + } + break; + case xml::typeCDATA: case xml::typeText: - { - const std::wstring value = Reader->value(); - add_text(value); - } - break; + { + const std::wstring value = Reader->value(); + add_text(value); + } + break; } } return true; diff --git a/DesktopEditor/xml/src/xmllight_private.h b/DesktopEditor/xml/src/xmllight_private.h index 16627df897b..00a12f03a7c 100644 --- a/DesktopEditor/xml/src/xmllight_private.h +++ b/DesktopEditor/xml/src/xmllight_private.h @@ -234,8 +234,9 @@ namespace XmlUtils if ((XmlNodeType_Element == eNodeType && nCurDepth == nDepth + 1) || ((XmlNodeType_Text == eNodeType || - XmlNodeType_Whitespace == eNodeType || - XmlNodeType_SIGNIFICANT_WHITESPACE == eNodeType ) && nCurDepth == nDepth + 1)) + XmlNodeType_Whitespace == eNodeType || + XmlNodeType_SIGNIFICANT_WHITESPACE == eNodeType || + XmlNodeType_CDATA == eNodeType ) && nCurDepth == nDepth + 1)) return true; else if (XmlNodeType_EndElement == eNodeType && nCurDepth == nDepth) return false; @@ -400,8 +401,11 @@ namespace XmlUtils XmlNodeType eNodeType = XmlNodeType_EndElement; while (Read(eNodeType) && GetDepth() >= nDepth && XmlNodeType_EndElement != eNodeType) { - if (eNodeType == XmlNodeType_Text || eNodeType == XmlNodeType_Whitespace || eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE) - sResult += GetText(); + if (eNodeType == XmlNodeType_Text || + eNodeType == XmlNodeType_Whitespace || + eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE || + eNodeType == XmlNodeType_CDATA) + sResult += GetText(); } return sResult; @@ -420,8 +424,11 @@ namespace XmlUtils XmlNodeType eNodeType = XmlNodeType_EndElement; while (Read(eNodeType) && GetDepth() >= nDepth && XmlNodeType_EndElement != eNodeType) { - if (eNodeType == XmlNodeType_Text || eNodeType == XmlNodeType_Whitespace || eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE) - sResult += GetTextA(); + if (eNodeType == XmlNodeType_Text || + eNodeType == XmlNodeType_Whitespace || + eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE || + eNodeType == XmlNodeType_CDATA) + sResult += GetTextA(); } return sResult; @@ -440,79 +447,85 @@ namespace XmlUtils XmlNodeType eNodeType = XmlNodeType_EndElement; while ( Read( eNodeType ) && GetDepth() >= nDepth && XmlNodeType_EndElement != eNodeType ) { - if ( eNodeType == XmlNodeType_Text || eNodeType == XmlNodeType_Whitespace || eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE ) - sResult += GetText(); + if ( eNodeType == XmlNodeType_Text || + eNodeType == XmlNodeType_Whitespace || + eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE || + eNodeType == XmlNodeType_CDATA) + sResult += GetText(); } return sResult; } - void CheckBufferSize(unsigned int nOffset, unsigned int nRequired, wchar_t*& sBuffer, long& nSize) - { - if(nOffset + nRequired > nSize) - { - if(0 == nSize) - { - nSize = nOffset + nRequired; - } - while(nOffset + nRequired > nSize) - { - nSize *= 2; - } - RELEASEOBJECT(sBuffer); - sBuffer = new WCHAR[nSize]; - } - } - void GetTextWithHHHH(bool bPreserve, wchar_t*& sBuffer, long& nSize, long& nLen) - { - nLen = 0; - if ( !IsValid() ) - return; - - if ( 0 != xmlTextReaderIsEmptyElement(reader) ) - return; - bool bTrimLeft, bTrimRight; - bTrimLeft = bTrimRight = !bPreserve; - LONG lOutputCount = 0; - int nDepth = GetDepth(); - XmlNodeType eNodeType = XmlNodeType_EndElement; - while ( Read( eNodeType ) && GetDepth() >= nDepth && XmlNodeType_EndElement != eNodeType ) - { - if ( eNodeType == XmlNodeType_Text || eNodeType == XmlNodeType_Whitespace || eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE ) - { - const xmlChar* pValue = xmlTextReaderConstValue(reader); - if(NULL != pValue) - { - const char* pValueA = (const char*)pValue; - if(bTrimLeft) - { - bTrimLeft = false; - pValueA += NSStringExt::FindFirstNotOfA(pValueA, " \n\r\t"); - } - if('\0' != pValueA[0]) - { - LONG nLenA = strlen((const char*)pValueA); - LONG nRequired = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8BufferSize(nLenA); - CheckBufferSize(nLen, nRequired, sBuffer, nSize); - wchar_t* sBufferCur = sBuffer + nLen; - NSFile::CUtf8Converter::GetUnicodeStringFromUTF8WithHHHH((const BYTE*)pValueA, nLenA, sBufferCur, lOutputCount); - nLen += lOutputCount; - } - } - } - } - if(bTrimRight) - { - nLen = NSStringExt::FindLastNotOf(sBuffer, nLen, L" \n\r\t") + 1; - } - } - std::wstring GetTextWithHHHH(bool bPreserve) - { - wchar_t* pUnicodes = NULL; - LONG nSize = 0; - LONG nLen = 0; - GetTextWithHHHH(bPreserve, pUnicodes, nSize, nLen); - return std::wstring(pUnicodes, nLen); - } + void CheckBufferSize(unsigned int nOffset, unsigned int nRequired, wchar_t*& sBuffer, long& nSize) + { + if(nOffset + nRequired > nSize) + { + if(0 == nSize) + { + nSize = nOffset + nRequired; + } + while(nOffset + nRequired > nSize) + { + nSize *= 2; + } + RELEASEOBJECT(sBuffer); + sBuffer = new WCHAR[nSize]; + } + } + void GetTextWithHHHH(bool bPreserve, wchar_t*& sBuffer, long& nSize, long& nLen) + { + nLen = 0; + if ( !IsValid() ) + return; + + if ( 0 != xmlTextReaderIsEmptyElement(reader) ) + return; + bool bTrimLeft, bTrimRight; + bTrimLeft = bTrimRight = !bPreserve; + LONG lOutputCount = 0; + int nDepth = GetDepth(); + XmlNodeType eNodeType = XmlNodeType_EndElement; + while ( Read( eNodeType ) && GetDepth() >= nDepth && XmlNodeType_EndElement != eNodeType ) + { + if ( eNodeType == XmlNodeType_Text || + eNodeType == XmlNodeType_Whitespace || + eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE || + eNodeType == XmlNodeType_CDATA ) + { + const xmlChar* pValue = xmlTextReaderConstValue(reader); + if(NULL != pValue) + { + const char* pValueA = (const char*)pValue; + if(bTrimLeft) + { + bTrimLeft = false; + pValueA += NSStringExt::FindFirstNotOfA(pValueA, " \n\r\t"); + } + if('\0' != pValueA[0]) + { + LONG nLenA = strlen((const char*)pValueA); + LONG nRequired = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8BufferSize(nLenA); + CheckBufferSize(nLen, nRequired, sBuffer, nSize); + wchar_t* sBufferCur = sBuffer + nLen; + NSFile::CUtf8Converter::GetUnicodeStringFromUTF8WithHHHH((const BYTE*)pValueA, nLenA, sBufferCur, lOutputCount); + nLen += lOutputCount; + } + } + } + } + if(bTrimRight) + { + nLen = NSStringExt::FindLastNotOf(sBuffer, nLen, L" \n\r\t") + 1; + } + } + std::wstring GetTextWithHHHH(bool bPreserve) + { + wchar_t* pUnicodes = NULL; + LONG nSize = 0; + LONG nLen = 0; + GetTextWithHHHH(bPreserve, pUnicodes, nSize, nLen); + return std::wstring(pUnicodes, nLen); + } inline std::wstring GetOuterXml() { return GetXml(false); @@ -604,8 +617,11 @@ namespace XmlUtils eNodeType = (XmlNodeType)nTempType; nCurDepth = GetDepth(); - if (eNodeType == XmlNodeType_Text || eNodeType == XmlNodeType_Whitespace || eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE) - oResult.WriteEncodeXmlString(GetText().c_str()); + if (eNodeType == XmlNodeType_Text || + eNodeType == XmlNodeType_Whitespace || + eNodeType == XmlNodeType_SIGNIFICANT_WHITESPACE || + eNodeType == XmlNodeType_CDATA) + oResult.WriteEncodeXmlString(GetText().c_str()); else if (eNodeType == XmlNodeType_Element) WriteElement(oResult); else if (eNodeType == XmlNodeType_EndElement)