diff --git a/Common/3dParty/html/css/src/CNode.cpp b/Common/3dParty/html/css/src/CNode.cpp index 8073a6266e..2799e375c3 100644 --- a/Common/3dParty/html/css/src/CNode.cpp +++ b/Common/3dParty/html/css/src/CNode.cpp @@ -14,6 +14,15 @@ namespace NSCSS return m_wsName.empty() && m_wsClass.empty() && m_wsId.empty() && m_wsStyle.empty(); } + void CNode::Clear() + { + m_wsName .clear(); + m_wsClass .clear(); + m_wsId .clear(); + m_wsStyle .clear(); + m_mAttributes.clear(); + } + std::vector CNode::GetData() const { std::vector arValues; diff --git a/Common/3dParty/html/css/src/CNode.h b/Common/3dParty/html/css/src/CNode.h index 57409a67a5..d8f6d8e4f0 100644 --- a/Common/3dParty/html/css/src/CNode.h +++ b/Common/3dParty/html/css/src/CNode.h @@ -22,6 +22,8 @@ namespace NSCSS bool Empty() const; + void Clear(); + std::vector GetData() const; bool operator< (const CNode& oNode) const; bool operator== (const CNode& oNode) const; diff --git a/Common/3dParty/html/css/src/ConstValues.cpp b/Common/3dParty/html/css/src/ConstValues.cpp index 56f1b28f79..b654ee9206 100644 --- a/Common/3dParty/html/css/src/ConstValues.cpp +++ b/Common/3dParty/html/css/src/ConstValues.cpp @@ -7,12 +7,18 @@ namespace NSCSS return sValue < oStatistickElement.sValue; } + void CTree::Clear() + { + m_arrChild.clear(); + m_oNode.Clear(); + } + void CTree::CountingNumberRepetitions(const CTree &oTree, std::map &mStatictics) { if (!oTree.m_oNode.m_wsId.empty()) ++mStatictics[StatistickElement{StatistickElement::IsId, L'#' + oTree.m_oNode.m_wsId}]; - if (!oTree.m_oNode.m_wsStyle.empty()) - ++mStatictics[StatistickElement{StatistickElement::IsStyle, oTree.m_oNode.m_wsStyle}]; + if (!oTree.m_oNode.m_wsStyle.empty()) + ++mStatictics[StatistickElement{StatistickElement::IsStyle, oTree.m_oNode.m_wsStyle}]; if (!oTree.m_arrChild.empty()) for (const CTree& oChildren : oTree.m_arrChild) diff --git a/Common/3dParty/html/css/src/ConstValues.h b/Common/3dParty/html/css/src/ConstValues.h index 4e7f8ab9fe..2bc546b54d 100644 --- a/Common/3dParty/html/css/src/ConstValues.h +++ b/Common/3dParty/html/css/src/ConstValues.h @@ -33,6 +33,8 @@ namespace NSCSS NSCSS::CNode m_oNode; std::vector m_arrChild; + void Clear(); + static void CountingNumberRepetitions(const CTree &oTree, std::map &mStatictics); }; diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp index 4874c22a7a..52fb291a10 100644 --- a/Common/3dParty/html/css/src/StyleProperties.cpp +++ b/Common/3dParty/html/css/src/StyleProperties.cpp @@ -614,11 +614,11 @@ namespace NSCSS void CColor::SetHEX(const std::wstring &wsValue) { - Clear(); - if (6 != wsValue.length() && 3 != wsValue.length()) return; + Clear(); + if (6 == wsValue.length()) m_oValue = new std::wstring(wsValue); else @@ -632,8 +632,6 @@ namespace NSCSS void CColor::SetUrl(const std::wstring &wsValue) { - Clear(); - if (wsValue.empty()) return; @@ -648,6 +646,8 @@ namespace NSCSS return; } + Clear(); + m_oValue = pURL; m_enType = ColorUrl; } @@ -659,6 +659,16 @@ namespace NSCSS m_enType = ColorNone; } + char NormalizeNegativeColorValue(INT nValue) + { + if (nValue > 255) + return 0xff; + else if (nValue < 0) + return (char)(std::abs(nValue) % 255); + + return (char)nValue; + } + bool CColor::SetValue(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { if ((CHECK_CONDITIONS && !bHardMode) || (wsValue.empty() && unLevel == m_unLevel)) @@ -704,29 +714,18 @@ namespace NSCSS if (3 > arValues.size()) return false; - INT nRed = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[0], 255)); - INT nGreen = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[1], 255)); - INT nBlue = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[2], 255)); + const char chRed = NormalizeNegativeColorValue(std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[0], 255))); + const char chGreen = NormalizeNegativeColorValue(std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[1], 255))); + const char chBlue = NormalizeNegativeColorValue(std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[2], 255))); - if (nRed < 0 || nGreen < 0 || nBlue < 0) - { - SetEmpty(unLevel); - return false; - } - - if (255 < nRed) nRed = 255; - if (255 < nGreen) nGreen = 255; - if (255 < nBlue) nBlue = 255; - - SetRGB(nRed, nGreen, nBlue); + SetRGB(chRed, chGreen, chBlue); if (wsNewValue.substr(0, 4) == L"rgba" && 4 == arValues.size()) m_oOpacity.SetValue(arValues[3], unLevel, bHardMode); bResult = true; } - - if (5 <= wsNewValue.length()) + else if (5 <= wsNewValue.length()) { SetUrl(wsValue); diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index c53563ecbe..8bd0eb8cb6 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -4214,6 +4214,7 @@ HRESULT CHtmlFile2::OpenMht(const std::wstring& sSrc, const std::wstring& sDst, m_internal->readStyle(); m_internal->m_oStylesCalculator.SetBodyTree(m_internal->m_oTree); + m_internal->m_oTree.Clear(); // Переходим в начало if(!m_internal->m_oLightReader.MoveToStart())