diff --git a/Common/3dParty/html/css/src/CCssCalculator_Private.cpp b/Common/3dParty/html/css/src/CCssCalculator_Private.cpp index 3223e8f34f..6dd82b5e1e 100644 --- a/Common/3dParty/html/css/src/CCssCalculator_Private.cpp +++ b/Common/3dParty/html/css/src/CCssCalculator_Private.cpp @@ -523,7 +523,7 @@ namespace NSCSS unStart = itFound.base() - arSelectors.cbegin(); std::vector arNodes = CalculateAllNodes(arSelectors, unStart); - std::vector arPrevNodes; + std::vector arPrevNodes = CalculateAllNodes(arSelectors, 0, unStart); bool bInTable = false; for (size_t i = 0; i < unStart; ++i) @@ -592,11 +592,14 @@ namespace NSCSS } #endif - std::vector CCssCalculator_Private::CalculateAllNodes(const std::vector &arSelectors, unsigned int unStart) + std::vector CCssCalculator_Private::CalculateAllNodes(const std::vector &arSelectors, unsigned int unStart, unsigned int unEnd) { + if (0 != unEnd && (unEnd < unStart || unEnd > arSelectors.size())) + return std::vector(); + std::vector arNodes; - - for (std::vector::const_reverse_iterator oNode = arSelectors.rbegin(); oNode != arSelectors.rend() - unStart; ++oNode) + + for (std::vector::const_reverse_iterator oNode = arSelectors.rbegin() + ((0 != unEnd) ? (arSelectors.size() - unEnd) : 0); oNode != arSelectors.rend() - unStart; ++oNode) { if (!oNode->m_wsName.empty()) arNodes.push_back(oNode->m_wsName); diff --git a/Common/3dParty/html/css/src/CCssCalculator_Private.h b/Common/3dParty/html/css/src/CCssCalculator_Private.h index f57c97a189..5d433a9b29 100644 --- a/Common/3dParty/html/css/src/CCssCalculator_Private.h +++ b/Common/3dParty/html/css/src/CCssCalculator_Private.h @@ -110,7 +110,7 @@ namespace NSCSS void ClearPageData(); #endif - std::vector CalculateAllNodes(const std::vector& arSelectors, unsigned int unStart = 0); + std::vector CalculateAllNodes(const std::vector& arSelectors, unsigned int unStart = 0, unsigned int unEnd = 0); std::vector FindElements(std::vector& arNodes, std::vector& arNextNodes); void AddStyles(const std::string& sStyle); diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index 1777816147..d3d80f0610 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -2231,7 +2231,6 @@ private: if (m_mDivs.empty()) pXml->WriteString(L""); - m_oStylesCalculator.CalculateCompiledStyle(sSelectors); NSCSS::CCompiledStyle *pStyle = sSelectors.back().m_pCompiledStyle; const bool bInTable = ElementInTable(sSelectors); @@ -2308,6 +2307,8 @@ private: } m_oLightReader.MoveToElement(); sSelectors.push_back(oNode); + + m_oStylesCalculator.CalculateCompiledStyle(sSelectors); return sNote; } @@ -2391,8 +2392,6 @@ private: if (sText.empty()) return false; - m_oStylesCalculator.CalculateCompiledStyle(arSelectors); - bool bPre = oTS.bPre; if (!bPre && nullptr != arSelectors.back().m_pCompiledStyle) @@ -2585,7 +2584,6 @@ private: if (m_oState.m_bInP) { OpenR(pXml); - m_oStylesCalculator.CalculateCompiledStyle(arSelectors); if(arSelectors.back().m_pCompiledStyle->m_oText.GetAlign() == L"both") pXml->WriteString(L""); pXml->WriteString(L""); @@ -3056,8 +3054,6 @@ private: std::wstring sNote = GetSubClass(oXml, sSelectors); bool bResult = true; - // Ссылка - // Область ссылки const HtmlTag eHtmlTag{GetHtmlTag(sName)}; @@ -3406,8 +3402,6 @@ private: if (NULL == pCellStyle) return; - m_oStylesCalculator.CalculateCompiledStyle(arSelectors); - pCellStyle->m_wsVAlign = arSelectors.back().m_pCompiledStyle->m_oDisplay.GetVAlign().ToWString(); pCellStyle->m_wsHAlign = arSelectors.back().m_pCompiledStyle->m_oDisplay.GetHAlign().ToWString(); pCellStyle->m_oBackground = arSelectors.back().m_pCompiledStyle->m_oBackground.GetColor(); @@ -3658,8 +3652,6 @@ private: CTextSettings oNewSettings{oTS}; - m_oStylesCalculator.CalculateCompiledStyle(sSelectors); - const std::wstring wsHighlight{sSelectors.back().m_pCompiledStyle->m_oBackground.GetColor() .EquateToColor({{{0, 0, 0}, L"black"}, {{0, 0, 255}, L"blue"}, {{0, 255, 255}, L"cyan"}, {{0, 255, 0}, L"green"}, {{255, 0, 255}, L"magenta"}, {{255, 0, 0}, L"red"}, @@ -3698,7 +3690,6 @@ private: if (0 != oRT.GetSize()) { - m_oStylesCalculator.CalculateCompiledStyle(sSelectors); NSCSS::CCompiledStyle *pStyle = sSelectors.back().m_pCompiledStyle; int nFontSize = 24; @@ -3746,7 +3737,6 @@ private: CTextSettings oTextSettings{oTS}; oTextSettings.sPStyle.clear(); - m_oStylesCalculator.CalculateCompiledStyle(sSelectors); NSCSS::CCompiledStyle *pStyle = sSelectors.back().m_pCompiledStyle; //Table styles @@ -4377,8 +4367,6 @@ private: if (NULL != sSelectors.back().m_pCompiledStyle) { - m_oStylesCalculator.CalculateCompiledStyle(sSelectors); - const NSCSS::NSProperties::CDigit& oWidth {sSelectors.back().m_pCompiledStyle->m_oDisplay.GetWidth() }; const NSCSS::NSProperties::CDigit& oHeight{sSelectors.back().m_pCompiledStyle->m_oDisplay.GetHeight()}; @@ -4496,8 +4484,6 @@ private: if (m_oState.m_bWasPStyle) return L""; - m_oStylesCalculator.CalculateCompiledStyle(sSelectors); - std::wstring sPStyle = GetStyle(*sSelectors.back().m_pCompiledStyle, true); if (sPStyle.empty() && !ElementInTable(sSelectors)) @@ -4545,8 +4531,6 @@ private: if (!m_oState.m_bInP) return L""; - m_oStylesCalculator.CalculateCompiledStyle(sSelectors); - std::wstring sRStyle = GetStyle(*sSelectors.back().m_pCompiledStyle, false); m_oXmlStyle.WriteLiteRStyle(oTS.oAdditionalStyle);