Skip to content

Commit

Permalink
OdfFormat fix bug #47308
Browse files Browse the repository at this point in the history
  • Loading branch information
ElenaSubbotina committed Nov 10, 2020
1 parent d0a8e93 commit 06c4419
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 93 deletions.
33 changes: 17 additions & 16 deletions ASCOfficeOdfFile/src/common/readdocelement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
170 changes: 93 additions & 77 deletions DesktopEditor/xml/src/xmllight_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 06c4419

Please sign in to comment.