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