diff --git a/HtmlFile2/HTMLReader.cpp b/HtmlFile2/HTMLReader.cpp index 9cd1e6252b..d5465bcf36 100644 --- a/HtmlFile2/HTMLReader.cpp +++ b/HtmlFile2/HTMLReader.cpp @@ -27,6 +27,8 @@ namespace HTML #define UNKNOWN_TAG GumboTag::GUMBO_TAG_UNKNOWN #define HtmlTag GumboTag +#define TAGS_COUNT 32 + const static std::map m_HTML_TAGS { ADD_TAG(L"a", A), @@ -341,6 +343,9 @@ void CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs) if (nullptr == pWriter) return; + if (nullptr != m_pWriter) + delete m_pWriter; + pWriter->SetSrcDirectory (m_wsSrcDirectory); pWriter->SetDstDirectory (m_wsDstDirectory); pWriter->SetTempDirectory(m_wsTempDirectory); @@ -349,6 +354,9 @@ void CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs) m_pWriter = pWriter; + m_mTags.clear(); + m_mTags.reserve(TAGS_COUNT); + m_mTags[HTML_TAG(A)] = std::make_shared>(pWriter); m_mTags[HTML_TAG(ABBR)] = std::make_shared>(pWriter); m_mTags[HTML_TAG(BR)] = std::make_shared>(pWriter); @@ -365,6 +373,7 @@ void CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs) m_mTags[HTML_TAG(TABLE)] = std::make_shared>(pWriter); m_mTags[HTML_TAG(TR)] = std::make_shared>(pWriter); m_mTags[HTML_TAG(TD)] = std::make_shared>(pWriter); + m_mTags[HTML_TAG(HTML)] = std::make_shared>(pWriter); std::shared_ptr oIgnoredTag{std::make_shared()}; @@ -392,8 +401,14 @@ void CHTMLReader::InitMDTags(TMarkdownParameters* pParametrs) if (nullptr == pWriter) return; + if (nullptr != m_pWriter) + delete m_pWriter; + m_pWriter = pWriter; + m_mTags.clear(); + m_mTags.reserve(TAGS_COUNT); + m_mTags[HTML_TAG(A)] = std::make_shared>(pWriter); m_mTags[HTML_TAG(B)] = std::make_shared>(pWriter); m_mTags[HTML_TAG(BR)] = std::make_shared>(pWriter); @@ -431,6 +446,7 @@ void CHTMLReader::InitMDTags(TMarkdownParameters* pParametrs) m_mTags[HTML_TAG(SPAN)] = oIgnoredTag; m_mTags[HTML_TAG(CAPTION)] = oIgnoredTag; m_mTags[HTML_TAG(U)] = oIgnoredTag; + m_mTags[HTML_TAG(HTML)] = oIgnoredTag; } bool CHTMLReader::IsHTML() @@ -623,30 +639,19 @@ void CHTMLReader::ReadBody() GetSubClass(arSelectors); - if (!arSelectors.back().m_mAttributes.empty()) - { - std::map::iterator itFound = arSelectors.back().m_mAttributes.find(L"bgcolor"); + if (!m_mTags[HTML_TAG(HTML)]->Open(arSelectors)) + return; - if (arSelectors.back().m_mAttributes.end() != itFound) - { - NSCSS::NSProperties::CColor oColor; - oColor.SetValue(itFound->second); + std::map::iterator itFound = arSelectors.back().m_mAttributes.find(L"bgcolor"); - if (!oColor.Empty() && !oColor.None()) - { - const std::wstring wsHEXColor{oColor.ToHEX()}; - - if (!wsHEXColor.empty()) - m_pWriter->GetCurrentDocument()->WriteString(L""); - - arSelectors.back().m_mAttributes.erase(itFound); - } - } - } + if (arSelectors.back().m_mAttributes.end() != itFound) + arSelectors.back().m_mAttributes.erase(itFound); m_oLightReader.MoveToElement(); ReadStream(arSelectors); + + m_mTags[HTML_TAG(HTML)]->Close(arSelectors); } bool CHTMLReader::ReadStream(std::vector& arSelectors, bool bInsertEmptyP) diff --git a/HtmlFile2/Tags/HTMLTags.h b/HtmlFile2/Tags/HTMLTags.h index 627a26dad9..a7a1a48e2f 100644 --- a/HtmlFile2/Tags/HTMLTags.h +++ b/HtmlFile2/Tags/HTMLTags.h @@ -84,6 +84,7 @@ CREATE_TAG(CTable); CREATE_TAG(CTableRow); CREATE_TAG(CTableCell); CREATE_TAG(CCode); +CREATE_TAG(CHTML); } #endif // HTMLTAGS_H diff --git a/HtmlFile2/Tags/OOXMLTags.cpp b/HtmlFile2/Tags/OOXMLTags.cpp index 468a93cbc2..c29c32b9bb 100644 --- a/HtmlFile2/Tags/OOXMLTags.cpp +++ b/HtmlFile2/Tags/OOXMLTags.cpp @@ -1300,8 +1300,8 @@ void HTML::CTableRow::Close(const std::vector& arSel m_pWriter->GetCurrentDocument()->WriteNodeEnd(L"w:tr"); } -CTableCell::CTableCell(COOXMLWriter* pWriter) - : CTag(pWriter) +CTableCell::CTableCell(COOXMLWriter* pInterpretator) + : CTag(pInterpretator) {} std::wstring CalculateSidesToClean(UINT unColumnNumber, const std::vector& arColgroups, UINT unMaxColumns) @@ -1448,11 +1448,45 @@ bool CTableCell::Open(const std::vector& arSelectors return true; } - void HTML::CTableCell::Close(const std::vector& arSelectors) - { - if (!ValidWriter()) - return; +void HTML::CTableCell::Close(const std::vector& arSelectors) +{ + if (!ValidWriter()) + return; + + m_pWriter->GetCurrentDocument()->WriteNodeEnd(L"w:tc"); +} + +CHTML::CHTML(COOXMLWriter* pInterpretator) + : CTag(pInterpretator) +{} + +bool CHTML::Open(const std::vector& arSelectors, const boost::any& oExtraData) +{ + if (!ValidWriter()) + return false; + + if (!arSelectors.back().m_mAttributes.empty()) + { + std::wstring wsBackground; + if (arSelectors.back().GetAttributeValue(L"bgcolor", wsBackground)) + { + NSCSS::NSProperties::CColor oColor; + oColor.SetValue(wsBackground); + + if (!oColor.Empty() && !oColor.None()) + { + const std::wstring wsHEXColor{oColor.ToHEX()}; + + if (!wsHEXColor.empty()) + m_pWriter->GetCurrentDocument()->WriteString(L""); + } + } + } + + return true; +} + +void CHTML::Close(const std::vector& arSelectors) +{} - m_pWriter->GetCurrentDocument()->WriteNodeEnd(L"w:tc"); - } } diff --git a/HtmlFile2/Tags/OOXMLTags.h b/HtmlFile2/Tags/OOXMLTags.h index 44abce22de..9d906090fe 100644 --- a/HtmlFile2/Tags/OOXMLTags.h +++ b/HtmlFile2/Tags/OOXMLTags.h @@ -153,6 +153,15 @@ public: virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; virtual void Close(const std::vector& arSelectors) override; }; + +template<> +class CHTML : public CTag +{ +public: + CHTML(COOXMLWriter* pInterpretator); + virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; + virtual void Close(const std::vector& arSelectors) override; +}; } #endif // OOXMLTAGS_H