diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp index 403d004275..d86648c4c9 100644 --- a/Common/3dParty/html/css/src/StyleProperties.cpp +++ b/Common/3dParty/html/css/src/StyleProperties.cpp @@ -1773,10 +1773,12 @@ namespace NSCSS void CIndent::Equation(CIndent &oFirstMargin, CIndent &oSecondMargin) { - CDigit::Equation(oFirstMargin.m_oLeft, oSecondMargin.m_oLeft); - CDigit::Equation(oFirstMargin.m_oTop, oSecondMargin.m_oTop); - CDigit::Equation(oFirstMargin.m_oRight, oSecondMargin.m_oRight); - CDigit::Equation(oFirstMargin.m_oBottom, oSecondMargin.m_oBottom); + //TODO:: добавить корректную реализацию + +// CDigit::Equation(oFirstMargin.m_oLeft, oSecondMargin.m_oLeft); +// CDigit::Equation(oFirstMargin.m_oTop, oSecondMargin.m_oTop); +// CDigit::Equation(oFirstMargin.m_oRight, oSecondMargin.m_oRight); +// CDigit::Equation(oFirstMargin.m_oBottom, oSecondMargin.m_oBottom); } void CIndent::SetPermisson(bool bPermission) @@ -1786,54 +1788,39 @@ namespace NSCSS bool CIndent::AddValue(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { + if (!m_bPermission) + return false; + const std::vector arValues = NS_STATIC_FUNCTIONS::GetWordsW(wsValue, false, L" "); switch (arValues.size()) { case 1: { - // TODO:: иногда будет не верный рельтат, если до этого одиен из элементом был с '!important' - // Необходимо добавить обработку такого случая - if (AddValue(m_oLeft, arValues[0], unLevel, bHardMode)) - { - m_oTop = m_oRight = m_oBottom = m_oLeft; - return true; - } - break; + return AddSide(m_arTopValues, arValues[0], unLevel, bHardMode) && + AddSide(m_arLeftValues, arValues[0], unLevel, bHardMode) && + AddSide(m_arRightValues, arValues[0], unLevel, bHardMode) && + AddSide(m_arBottomValues, arValues[0], unLevel, bHardMode); } case 2: { - if (AddValue(m_oTop, arValues[0], unLevel, bHardMode) && - AddValue(m_oLeft, arValues[1], unLevel, bHardMode)) - { - m_oBottom = m_oTop; - m_oRight = m_oLeft; - - return true; - } - break; + return AddSide(m_arTopValues, arValues[0], unLevel, bHardMode) && + AddSide(m_arBottomValues, arValues[0], unLevel, bHardMode) && + AddSide(m_arLeftValues, arValues[1], unLevel, bHardMode) && + AddSide(m_arRightValues, arValues[1], unLevel, bHardMode); } case 3: { - if (AddValue(m_oTop, arValues[0], unLevel, bHardMode) && - AddValue(m_oLeft, arValues[1], unLevel, bHardMode) && - AddValue(m_oBottom, arValues[2], unLevel, bHardMode)) - { - m_oRight = m_oLeft; - - return true; - } - - break; + return AddSide(m_arTopValues, arValues[0], unLevel, bHardMode) && + AddSide(m_arLeftValues, arValues[1], unLevel, bHardMode) && + AddSide(m_arRightValues, arValues[1], unLevel, bHardMode) && + AddSide(m_arBottomValues, arValues[2], unLevel, bHardMode); } case 4: { - if (AddValue(m_oTop, arValues[0], unLevel, bHardMode) && - AddValue(m_oRight, arValues[1], unLevel, bHardMode) && - AddValue(m_oBottom, arValues[2], unLevel, bHardMode) && - AddValue(m_oLeft, arValues[3], unLevel, bHardMode)) - return true; - - break; + return AddSide(m_arTopValues, arValues[0], unLevel, bHardMode) && + AddSide(m_arRightValues, arValues[1], unLevel, bHardMode) && + AddSide(m_arBottomValues, arValues[2], unLevel, bHardMode) && + AddSide(m_arLeftValues, arValues[3], unLevel, bHardMode); } } @@ -1842,22 +1829,22 @@ namespace NSCSS bool CIndent::AddLeft(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { - return AddValue(m_oLeft, wsValue, unLevel, bHardMode); + return AddSide(m_arLeftValues, wsValue, unLevel, bHardMode); } bool CIndent::AddTop(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { - return AddValue(m_oTop, wsValue, unLevel, bHardMode); + return AddSide(m_arTopValues, wsValue, unLevel, bHardMode); } bool CIndent::AddRight(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { - return AddValue(m_oRight, wsValue, unLevel, bHardMode); + return AddSide(m_arRightValues, wsValue, unLevel, bHardMode); } bool CIndent::AddBottom(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { - return AddValue(m_oBottom, wsValue, unLevel, bHardMode); + return AddSide(m_arBottomValues, wsValue, unLevel, bHardMode); } void CIndent::UpdateAll(double dFontSize) @@ -1870,86 +1857,118 @@ namespace NSCSS void CIndent::UpdateLeft(double dFontSize) { - if (NSCSS::Em == m_oLeft.GetUnitMeasure() || NSCSS::Rem == m_oLeft.GetUnitMeasure()) - m_oLeft.ConvertTo(NSCSS::Twips, dFontSize); + UpdateSide(m_arLeftValues, dFontSize); } void CIndent::UpdateTop(double dFontSize) { - if (NSCSS::Em == m_oTop.GetUnitMeasure() || NSCSS::Rem == m_oTop.GetUnitMeasure()) - m_oTop.ConvertTo(NSCSS::Twips, dFontSize); + UpdateSide(m_arTopValues, dFontSize); } void CIndent::UpdateRight(double dFontSize) { - if (NSCSS::Em == m_oRight.GetUnitMeasure() || NSCSS::Rem == m_oRight.GetUnitMeasure()) - m_oRight.ConvertTo(NSCSS::Twips, dFontSize); + UpdateSide(m_arRightValues, dFontSize); } void CIndent::UpdateBottom(double dFontSize) { - if (NSCSS::Em == m_oBottom.GetUnitMeasure() || NSCSS::Rem == m_oBottom.GetUnitMeasure()) - m_oBottom.ConvertTo(NSCSS::Twips, dFontSize); + UpdateSide(m_arBottomValues, dFontSize); } - const CDigit& CIndent::GetLeft() const + CDigit CIndent::GetLeft() const { - return m_oLeft; + return CalculateSide(m_arLeftValues); } - const CDigit& CIndent::GetTop() const + CDigit CIndent::GetTop() const { - return m_oTop; + return CalculateSide(m_arTopValues); } - const CDigit& CIndent::GetRight() const + CDigit CIndent::GetRight() const { - return m_oRight; + return CalculateSide(m_arRightValues); } - const CDigit& CIndent::GetBottom() const + CDigit CIndent::GetBottom() const { - return m_oBottom; + return CalculateSide(m_arBottomValues); } bool CIndent::Empty() const { - return m_oLeft.Empty() && m_oTop.Empty() && m_oRight.Empty() && m_oBottom.Empty(); + return m_arLeftValues.empty() && m_arTopValues.empty() && m_arRightValues.empty() && m_arBottomValues.empty(); } - CIndent &CIndent::operator+=(const CIndent &oMargin) + CIndent &CIndent::operator+=(const CIndent &oIndent) { - m_oLeft += oMargin.m_oLeft; - m_oTop += oMargin.m_oTop; - m_oRight += oMargin.m_oRight; - m_oBottom += oMargin.m_oBottom; + m_arLeftValues .insert(m_arLeftValues.end(), oIndent.m_arLeftValues.begin(), oIndent.m_arLeftValues.end()); + m_arTopValues .insert(m_arTopValues.end(), oIndent.m_arTopValues.begin(), oIndent.m_arTopValues.end()); + m_arRightValues .insert(m_arRightValues.end(), oIndent.m_arRightValues.begin(), oIndent.m_arRightValues.end()); + m_arBottomValues.insert(m_arBottomValues.end(), oIndent.m_arBottomValues.begin(), oIndent.m_arBottomValues.end()); return *this; } - bool CIndent::operator==(const CIndent &oMargin) const + bool CIndent::operator==(const CIndent &oIndent) const { - return m_oLeft == oMargin.m_oLeft && - m_oTop == oMargin.m_oTop && - m_oRight == oMargin.m_oRight && - m_oBottom == oMargin.m_oBottom; - } - - bool CIndent::AddValue(CDigit &oValue, const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) - { - if (!m_bPermission) - return false; - - CDigit oTempValue; - - if (!oTempValue.SetValue(wsValue, unLevel, bHardMode)) + // Есть вариант, когда у CIndent разное кол-во значений, но итоговое значение одинаковое + // Пока считаем это не одинаковыми + if (m_arLeftValues .size() != oIndent.m_arLeftValues .size() || + m_arTopValues .size() != oIndent.m_arTopValues .size() || + m_arRightValues .size() != oIndent.m_arRightValues .size() || + m_arBottomValues.size() != oIndent.m_arBottomValues.size()) return false; - oValue += oTempValue; + for (unsigned int unIndex = 0; unIndex < m_arLeftValues.size(); ++unIndex) + { + if (m_arLeftValues [unIndex] != oIndent.m_arLeftValues [unIndex]) return false; + if (m_arTopValues [unIndex] != oIndent.m_arTopValues [unIndex]) return false; + if (m_arRightValues [unIndex] != oIndent.m_arRightValues [unIndex]) return false; + if (m_arBottomValues[unIndex] != oIndent.m_arBottomValues[unIndex]) return false; + } return true; } + bool CIndent::AddSide(std::vector &arValues, const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) + { + CDigit oValue; + + if (!oValue.SetValue(wsValue, unLevel, bHardMode)) + return false; + + if (!arValues.empty() && CDigit::LevelIsSame(oValue, arValues.back())) + arValues.pop_back(); + + arValues.push_back(oValue); + + return true; + } + + void CIndent::UpdateSide(std::vector &arValues, double dFontSize) + { + if (arValues.empty()) + return; + + const UnitMeasure eUM = arValues.back().GetUnitMeasure(); + if (NSCSS::Em == eUM || NSCSS::Rem == eUM) + arValues.back().ConvertTo(NSCSS::Twips, dFontSize); + } + + CDigit CIndent::CalculateSide(const std::vector &arValues) const + { + if (arValues.empty()) + return CDigit(); + + CDigit oValue{arValues.front()}; + + for (std::vector::const_iterator oIter = arValues.begin() + 1; oIter < arValues.end(); ++oIter) + oValue += *oIter; + + return oValue; + } + // FONT CTextDecorationLine::CTextDecorationLine() : m_bUnderline(false), m_bOverline(false), m_bLineThrough(false) diff --git a/Common/3dParty/html/css/src/StyleProperties.h b/Common/3dParty/html/css/src/StyleProperties.h index c9c234b012..a2b670946f 100644 --- a/Common/3dParty/html/css/src/StyleProperties.h +++ b/Common/3dParty/html/css/src/StyleProperties.h @@ -54,6 +54,11 @@ namespace NSCSS } } + static bool LevelIsSame(const CValue& oFirstValue, const CValue& oSecondValue) + { + return oFirstValue.m_unLevel == oSecondValue.m_unLevel; + } + bool operator==(const T& oValue) const { return m_oValue == oValue; } bool operator>=(const T& oValue) const { return m_oValue >= oValue; } bool operator<=(const T& oValue) const { return m_oValue <= oValue; } @@ -595,22 +600,24 @@ namespace NSCSS void UpdateRight(double dFontSize); void UpdateBottom(double dFontSize); - const CDigit& GetLeft () const; - const CDigit& GetTop () const; - const CDigit& GetRight () const; - const CDigit& GetBottom() const; + CDigit GetLeft () const; + CDigit GetTop () const; + CDigit GetRight () const; + CDigit GetBottom() const; bool Empty() const; - CIndent& operator+=(const CIndent& oMargin); - bool operator==(const CIndent& oMargin) const; + CIndent& operator+=(const CIndent& oIndent); + bool operator==(const CIndent& oIndent) const; private: - bool AddValue(CDigit& oValue, const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false); + bool AddSide(std::vector& arValues, const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false); + void UpdateSide(std::vector& arValues, double dFontSize); + CDigit CalculateSide(const std::vector& arValues) const; - CDigit m_oLeft; - CDigit m_oTop; - CDigit m_oRight; - CDigit m_oBottom; + std::vector m_arLeftValues; + std::vector m_arTopValues; + std::vector m_arRightValues; + std::vector m_arBottomValues; bool m_bPermission; }; diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index e617a0b898..e3529db72a 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -1438,23 +1438,19 @@ private: if (!oStyle.m_oBorder.Empty()) wsTable += L"" + CreateBorders(oStyle.m_oBorder) + L""; - if (!oStyle.m_oMargin.Empty() && (0 < oStyle.m_oMargin.GetTop().ToInt() || 0 < oStyle.m_oMargin.GetBottom().ToInt())) + if (!oStyle.m_oPadding.Empty()) { - wsTable += L""; + const int nTopPadding = std::max(0, oStyle.m_oPadding.GetTop() .ToInt(NSCSS::UnitMeasure::Twips, m_unHeight)); + const int nLeftPadding = std::max(0, oStyle.m_oPadding.GetLeft() .ToInt(NSCSS::UnitMeasure::Twips, m_unWidth )); + const int nBottomPadding = std::max(0, oStyle.m_oPadding.GetBottom().ToInt(NSCSS::UnitMeasure::Twips, m_unHeight)); + const int nRightPadding = std::max(0, oStyle.m_oPadding.GetRight() .ToInt(NSCSS::UnitMeasure::Twips, m_unWidth )); - if (0 < oStyle.m_oMargin.GetTop().ToInt()) - wsTable += L"(oStyle.m_oMargin.GetTop().ToInt() * 10 + 0.5f)) + L"\" w:type=\"dxa\"/>"; - -// if (0 < oStyle.m_pMargin.GetLeftSide()) -// wsTable += L"(oStyle.m_pMargin.GetLeftSide() * 10 + 0.5f)) + L"\" w:type=\"dxa\"/>"; - - if (0 < oStyle.m_oMargin.GetBottom().ToInt()) - wsTable += L"(oStyle.m_oMargin.GetBottom().ToInt() * 10 + 0.5f)) + L"\" w:type=\"dxa\"/>"; - -// if (0 < oStyle.m_pMargin.GetRightSide()) -// wsTable += L"(oStyle.m_pMargin.GetRightSide() * 10 + 0.5f)) + L"\" w:type=\"dxa\"/>"; - - wsTable += L""; + wsTable += L"" + "" + "" + "" + "" + ""; } else wsTable += L"";