diff --git a/HtmlFile2/HTMLReader.cpp b/HtmlFile2/HTMLReader.cpp
index 3e3b5854d6..ec8d10abac 100644
--- a/HtmlFile2/HTMLReader.cpp
+++ b/HtmlFile2/HTMLReader.cpp
@@ -28,6 +28,7 @@ namespace HTML
#define SKIP_TAG SCRIPT
#define UNKNOWN_TAG GumboTag::GUMBO_TAG_UNKNOWN
#define HtmlTag GumboTag
+#define EMPTY_TAG GumboTag::GUMBO_TAG_UNKNOWN
const static std::map m_HTML_TAGS
{
@@ -333,7 +334,7 @@ void CHTMLReader::Clear()
if (nullptr != m_pWriter)
delete m_pWriter;
- m_oTags.Clear();
+ m_mTags.clear();
m_wsSrcDirectory .clear();
m_wsDstDirectory .clear();
@@ -364,13 +365,7 @@ bool CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs)
pWriter->SetBaseDirectory(m_wsBaseDirectory);
pWriter->SetCoreDirectory(m_wsCoreDirectory);
- m_oTags.Clear();
-
- if (!m_oTags.Init(pWriter))
- {
- delete pWriter;
- return false;
- }
+ InitTagsForOOXML(m_mTags, pWriter);
TExternalTableData oExternalData;
@@ -413,13 +408,7 @@ bool CHTMLReader::InitMDTags(TMarkdownParameters* pParametrs)
pWriter->SetBaseDirectory(m_wsBaseDirectory);
pWriter->SetCoreDirectory(m_wsCoreDirectory);
- m_oTags.Clear();
-
- if (!m_oTags.Init(pWriter))
- {
- delete pWriter;
- return false;
- }
+ InitTagsForMD(m_mTags, pWriter);
TExternalTableData oExternalData;
@@ -648,7 +637,7 @@ void CHTMLReader::ReadBody(XmlUtils::CXmlLiteReader& oReader)
GetSubClass(oReader, arSelectors, m_oCSSCalculator);
- if (!m_oTags.m_pHTML->Apply(arSelectors.back()))
+ if (!GetTag(HTML_TAG(HTML)).get()->Open(arSelectors))
return;
std::map::iterator itFound = arSelectors.back().m_mAttributes.find(L"bgcolor");
@@ -715,25 +704,17 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen(arSelectors))
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pAnchor->Close(arSelectors.back());
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(A)));
break;
}
case HTML_TAG(ABBR):
{
- if (m_oTags.m_pAbbr->Open(arSelectors))
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pAbbr->Close();
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(ABBR)));
break;
}
case HTML_TAG(BR):
{
- bResult = m_oTags.m_pBreak->Read(arSelectors.back());
+ bResult = ReadEmptyTag(oReader, arSelectors, GetTag(HTML_TAG(BR)));
break;
}
case HTML_TAG(CODE):
@@ -742,48 +723,38 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen(arSelectors.back()))
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pCode->Close();
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(CODE)));
break;
}
case HTML_TAG(FONT):
{
- m_oTags.m_pFont->Apply(arSelectors.back(), arSelectors.size());
- bResult = ReadStream(oReader, arSelectors);
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(FONT)));
break;
}
case HTML_TAG(IMG):
{
- bResult = m_oTags.m_pImage->Read(arSelectors);
+ bResult = ReadEmptyTag(oReader, arSelectors, GetTag(HTML_TAG(IMG)));
break;
}
case HTML_TAG(SVG):
{
- bResult = m_oTags.m_pImage->ReadSVG(arSelectors, oReader.GetOuterXml());
+ arSelectors.back().m_mAttributes.insert(std::make_pair(L"svg-text", oReader.GetOuterXml()));
+ bResult = ReadEmptyTag(oReader, arSelectors, GetTag(HTML_TAG(IMG)));
break;
}
case HTML_TAG(INPUT):
{
- m_oTags.m_pInput->Read(arSelectors);
- bResult = ReadStream(oReader, arSelectors);
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(INPUT)));
break;
}
case HTML_TAG(NOBR):
{
- if (m_oTags.m_pPreformatted->Open())
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pPreformatted->Close(arSelectors);
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(NOBR)));
break;
}
case HTML_TAG(BASEFONT):
{
- m_oTags.m_pBaseFont->Apply(arSelectors.back());
- bResult = ReadStream(oReader, arSelectors);
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(BASEFONT)));
break;
}
case HTML_TAG(BUTTON):
@@ -859,56 +830,34 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen(arSelectors.back()))
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pHeader->Close();
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(H1)));
break;
}
case HTML_TAG(ASIDE):
case HTML_TAG(DIV):
{
- if (m_oTags.m_pDivision->Open(arSelectors))
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pDivision->Close();
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(DIV)));
break;
}
case HTML_TAG(BLOCKQUOTE):
{
- if (m_oTags.m_pBlockquote->Open(arSelectors))
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pBlockquote->Close();
- }
-
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(BLOCKQUOTE)));
break;
}
case HTML_TAG(HR):
{
- bResult = true;
- m_oTags.m_pHorizontalRule->Write(arSelectors);
+ bResult = ReadEmptyTag(oReader, arSelectors, GetTag(HTML_TAG(HR)));
break;
}
case HTML_TAG(LI):
{
- if (m_oTags.m_pListElement->Open())
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pListElement->Close();
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(LI)));
break;
}
case HTML_TAG(OL):
case HTML_TAG(UL):
{
- if (m_oTags.m_pList->Open(arSelectors.back()))
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pList->Close();
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(OL)));
break;
}
// case HTML_TAG(MENU):
@@ -922,11 +871,7 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen())
- {
- bResult = ReadStream(oReader, arSelectors);
- m_oTags.m_pPreformatted->Close(arSelectors);
- }
+ bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(PRE)));
break;
}
case HTML_TAG(TABLE):
@@ -1020,6 +965,36 @@ bool CHTMLReader::ReadTable(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, std::shared_ptr pTag)
+{
+ if (!pTag.get()->Open(arSelectors))
+ return false;
+
+ pTag.get()->Close(arSelectors);
+
+ return true;
+}
+
+bool CHTMLReader::ReadTag(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, std::shared_ptr pTag)
+{
+ if (!pTag.get()->Open(arSelectors))
+ return false;
+
+ const bool bResult{ReadStream(oReader, arSelectors)};
+
+ pTag.get()->Close(arSelectors);
+
+ return bResult;
+}
+
+std::shared_ptr CHTMLReader::GetTag(int nTag)
+{
+ if(m_mTags.cend() != m_mTags.find(nTag))
+ return m_mTags[nTag];
+
+ return std::make_shared();
+}
+
void CHTMLReader::AddStopTag(const std::wstring& wsTag)
{
m_arStopTags.insert(wsTag);
diff --git a/HtmlFile2/HTMLReader.h b/HtmlFile2/HTMLReader.h
index 167cb2fb0c..ee8f7f3495 100644
--- a/HtmlFile2/HTMLReader.h
+++ b/HtmlFile2/HTMLReader.h
@@ -32,7 +32,7 @@ class CHTMLReader
std::set m_arStopTags;
- THTMLTags m_oTags;
+ std::map> m_mTags;
public:
CHTMLReader();
~CHTMLReader();
@@ -82,6 +82,11 @@ private:
bool ReadTable(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors);
+ bool ReadEmptyTag(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, std::shared_ptr pTag);
+ bool ReadTag(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, std::shared_ptr pTag);
+
+ std::shared_ptr GetTag(int nTag);
+
void AddStopTag(const std::wstring& wsTag);
void ClearStopTags();
};
diff --git a/HtmlFile2/Tags/HTMLTags.h b/HtmlFile2/Tags/HTMLTags.h
index 49d9458144..0893be5666 100644
--- a/HtmlFile2/Tags/HTMLTags.h
+++ b/HtmlFile2/Tags/HTMLTags.h
@@ -5,279 +5,53 @@
namespace HTML
{
-namespace INTERFACE_TAGS
-{
-#define OPEN_INTERFACE_TAG(tag_name)\
-class I ## tag_name ## Tag\
-{\
-public:\
- virtual ~I ## tag_name ## Tag() = default;
-
-#define ADD_INTERFACE_METHOD(return_type, method_name, ...) virtual return_type method_name(__VA_ARGS__) = 0
-#define ADD_BOOL_INTERFACE_METHOD(method_name, ...) ADD_INTERFACE_METHOD(bool, method_name, __VA_ARGS__)
-#define ADD_VOID_INTERFACE_METHOD(method_name, ...) ADD_INTERFACE_METHOD(void, method_name, __VA_ARGS__)
-
-#define CLOSE_INTERFACE_TAG() };
-
-OPEN_INTERFACE_TAG(Anchor)
- ADD_BOOL_INTERFACE_METHOD(Open, const std::vector& arSelectors);
- ADD_VOID_INTERFACE_METHOD(Close, const NSCSS::CNode& oTagNode);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Abbr)
- ADD_BOOL_INTERFACE_METHOD(Open, const std::vector& arSelectors);
- ADD_VOID_INTERFACE_METHOD(Close);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Break)
- ADD_BOOL_INTERFACE_METHOD(Read, const NSCSS::CNode& oTagNode);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Preformatted)
- ADD_BOOL_INTERFACE_METHOD(Open);
- ADD_VOID_INTERFACE_METHOD(Close, const std::vector& arSelectors);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Header)
- ADD_BOOL_INTERFACE_METHOD(Open, const NSCSS::CNode& oTagNode);
- ADD_VOID_INTERFACE_METHOD(Close);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Division)
- ADD_BOOL_INTERFACE_METHOD(Open, const std::vector& arSelectors);
- ADD_VOID_INTERFACE_METHOD(Close);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Image)
- ADD_BOOL_INTERFACE_METHOD(Read, const std::vector& arSelectors);
- ADD_BOOL_INTERFACE_METHOD(ReadSVG, const std::vector& arSelectors, const std::wstring& wsSVG);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Font)
- ADD_BOOL_INTERFACE_METHOD(Apply, const NSCSS::CNode& oTagNode, size_t unLevel);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Input)
- ADD_BOOL_INTERFACE_METHOD(Read, const std::vector& arSelectors);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(BaseFont)
- ADD_BOOL_INTERFACE_METHOD(Apply, const NSCSS::CNode& oTagNode);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Blockquote)
- ADD_BOOL_INTERFACE_METHOD(Open, const std::vector& arSelectors);
- ADD_VOID_INTERFACE_METHOD(Close);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(List)
- ADD_BOOL_INTERFACE_METHOD(Open, const NSCSS::CNode& oTagNode);
- ADD_VOID_INTERFACE_METHOD(Close);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(HorizontalRule)
- ADD_BOOL_INTERFACE_METHOD(Write, const std::vector& arSelectors);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(ListElement)
- ADD_BOOL_INTERFACE_METHOD(Open);
- ADD_VOID_INTERFACE_METHOD(Close);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(Code)
- ADD_BOOL_INTERFACE_METHOD(Open, const NSCSS::CNode& oTagNode);
- ADD_VOID_INTERFACE_METHOD(Close);
-CLOSE_INTERFACE_TAG()
-
-OPEN_INTERFACE_TAG(HTML)
- ADD_BOOL_INTERFACE_METHOD(Apply, const NSCSS::CNode& oTagNode);
-CLOSE_INTERFACE_TAG()
-
-template
class ITag
{
public:
+ ITag() = default;
virtual ~ITag() = default;
+
+ virtual bool Open (const std::vector& arSelectors) = 0;
+ virtual void Close(const std::vector& arSelectors) = 0;
+};
+
+template
+class IHTMLTag : public ITag
+{
protected:
- ITag(Writer *pWriter)
- : m_pWriter(pWriter)
- {}
+ Writer* m_pWriter;
bool Valid() const
{
return nullptr != m_pWriter;
}
+public:
+ IHTMLTag(Writer* pWriter)
+ : m_pWriter(pWriter) {};
+ virtual ~IHTMLTag() = default;
- Writer *m_pWriter;
+ virtual bool Open (const std::vector& arSelectors) = 0;
+ virtual void Close(const std::vector& arSelectors) = 0;
};
-}
-#define OPEN_CLASS_TAG(class_name)\
-template\
-class C ## class_name ## Tag : public INTERFACE_TAGS::I ## class_name ## Tag, public INTERFACE_TAGS::ITag\
+#define CREATE_TAG(tag_name, writer)\
+class C ## tag_name ## Tag : public IHTMLTag\
{\
public:\
- C ## class_name ## Tag(Writer *pWriter) : INTERFACE_TAGS::ITag(pWriter) {}
+ C ## tag_name ## Tag(writer *pWriter)\
+ : IHTMLTag(pWriter) {}\
+ \
+ bool Open (const std::vector& arSelectors) override;\
+ void Close(const std::vector& arSelectors) override;\
+}
-#define CLOSE_CLASS_TAG() };
-
-#define ADD_CLASS_METHOD(return_type, method_name, ...) virtual return_type method_name(__VA_ARGS__)
-#define ADD_BOOL_CLASS_METHOD(method_name, ...) ADD_CLASS_METHOD(bool, method_name, __VA_ARGS__) override { return true; }
-#define ADD_VOID_CLASS_METHOD(method_name, ...) ADD_CLASS_METHOD(void, method_name, __VA_ARGS__) override {}
-
-OPEN_CLASS_TAG(Anchor)
- ADD_BOOL_CLASS_METHOD(Open, const std::vector& arSelectors);
- ADD_VOID_CLASS_METHOD(Close, const NSCSS::CNode& oTagNode);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Abbr)
- ADD_BOOL_CLASS_METHOD(Open, const std::vector& arSelectors);
- ADD_VOID_CLASS_METHOD(Close);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Break)
- ADD_BOOL_CLASS_METHOD(Read, const NSCSS::CNode& oTagNode);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Preformatted)
- ADD_BOOL_CLASS_METHOD(Open);
- ADD_VOID_CLASS_METHOD(Close, const std::vector& arSelectors);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Header)
- ADD_BOOL_CLASS_METHOD(Open, const NSCSS::CNode& oTagNode);
- ADD_VOID_CLASS_METHOD(Close);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Division)
- ADD_BOOL_CLASS_METHOD(Open, const std::vector& arSelectors);
- ADD_VOID_CLASS_METHOD(Close);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Image)
- ADD_BOOL_CLASS_METHOD(Read, const std::vector& arSelectors);
- ADD_BOOL_CLASS_METHOD(ReadSVG, const std::vector& arSelectors, const std::wstring& wsSVG);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Font)
- ADD_BOOL_CLASS_METHOD(Apply, const NSCSS::CNode& oTagNode, size_t unLevel);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Input)
- ADD_BOOL_CLASS_METHOD(Read, const std::vector& arSelectors);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(BaseFont)
- ADD_BOOL_CLASS_METHOD(Apply, const NSCSS::CNode& oTagNode);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Blockquote)
- ADD_BOOL_CLASS_METHOD(Open, const std::vector& arSelectors);
- ADD_VOID_CLASS_METHOD(Close);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(List)
- ADD_BOOL_CLASS_METHOD(Open, const NSCSS::CNode& oTagNode);
- ADD_VOID_CLASS_METHOD(Close);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(HorizontalRule)
- ADD_BOOL_CLASS_METHOD(Write, const std::vector& arSelectors);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(ListElement)
- ADD_BOOL_CLASS_METHOD(Open);
- ADD_VOID_CLASS_METHOD(Close);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(Code)
- ADD_BOOL_CLASS_METHOD(Open, const NSCSS::CNode& oTagNode);
- ADD_VOID_CLASS_METHOD(Close);
-CLOSE_CLASS_TAG()
-
-OPEN_CLASS_TAG(HTML)
- ADD_BOOL_CLASS_METHOD(Apply, const NSCSS::CNode& oTagNode);
-CLOSE_CLASS_TAG()
-
-#define ADD_HTML_TAG(class_name) INTERFACE_TAGS::I ## class_name ## Tag *m_p##class_name{nullptr}
-
-struct THTMLTags
+class CEmptyTag : public ITag
{
- ADD_HTML_TAG(Anchor);
- ADD_HTML_TAG(Abbr);
- ADD_HTML_TAG(Break);
- ADD_HTML_TAG(Preformatted);
- ADD_HTML_TAG(Header);
- ADD_HTML_TAG(Division);
- ADD_HTML_TAG(Image);
- ADD_HTML_TAG(Font);
- ADD_HTML_TAG(Input);
- ADD_HTML_TAG(BaseFont);
- ADD_HTML_TAG(Blockquote);
- ADD_HTML_TAG(List);
- ADD_HTML_TAG(HorizontalRule);
- ADD_HTML_TAG(ListElement);
- ADD_HTML_TAG(Code);
- ADD_HTML_TAG(HTML);
+public:
+ CEmptyTag() = default;
- ~THTMLTags()
- {
- Clear();
- }
-
- void Clear()
- {
- #define CLEAR_VARIABLE(class_name)\
- if (nullptr == m_p##class_name)\
- delete m_p##class_name
-
- CLEAR_VARIABLE(Anchor);
- CLEAR_VARIABLE(Abbr);
- CLEAR_VARIABLE(Break);
- CLEAR_VARIABLE(Preformatted);
- CLEAR_VARIABLE(Header);
- CLEAR_VARIABLE(Division);
- CLEAR_VARIABLE(Image);
- CLEAR_VARIABLE(Font);
- CLEAR_VARIABLE(Input);
- CLEAR_VARIABLE(BaseFont);
- CLEAR_VARIABLE(Blockquote);
- CLEAR_VARIABLE(List);
- CLEAR_VARIABLE(HorizontalRule);
- CLEAR_VARIABLE(ListElement);
- CLEAR_VARIABLE(Code);
- CLEAR_VARIABLE(HTML);
- }
-
- template
- bool Init(Writer *pWriter)
- {
- #define INIT_VARIABLE(class_name) m_p##class_name = new C ## class_name ## Tag(pWriter);\
- if (nullptr == m_p##class_name)\
- {\
- Clear();\
- return false;\
- }
-
- INIT_VARIABLE(Anchor);
- INIT_VARIABLE(Abbr);
- INIT_VARIABLE(Break);
- INIT_VARIABLE(Preformatted);
- INIT_VARIABLE(Header);
- INIT_VARIABLE(Division);
- INIT_VARIABLE(Image);
- INIT_VARIABLE(Font);
- INIT_VARIABLE(Input);
- INIT_VARIABLE(BaseFont);
- INIT_VARIABLE(Blockquote);
- INIT_VARIABLE(List);
- INIT_VARIABLE(HorizontalRule);
- INIT_VARIABLE(ListElement);
- INIT_VARIABLE(Code);
- INIT_VARIABLE(HTML);
-
- return true;
- }
+ bool Open (const std::vector& arSelectors) override { return true; }
+ void Close(const std::vector& arSelectors) override {};
};
}
#endif // HTMLTAGS_H
diff --git a/HtmlFile2/Tags/MDTags.cpp b/HtmlFile2/Tags/MDTags.cpp
index b9e4446ea0..86a2400af6 100644
--- a/HtmlFile2/Tags/MDTags.cpp
+++ b/HtmlFile2/Tags/MDTags.cpp
@@ -15,9 +15,27 @@
#include "../../DesktopEditor/graphics/pro/Graphics.h"
#include "../../DesktopEditor/raster/BgraFrame.h"
+#include "../../Common/3dParty/html/gumbo-parser/src/gumbo.h"
+
namespace HTML
{
-bool CAnchorTag::Open(const std::vector& arSelectors)
+void InitTagsForMD(std::map>& mTags, CMDWriter* pWriter)
+{
+ #define HTML_TAG(tag) GUMBO_TAG_##tag
+
+ mTags[HTML_TAG(A)] = std::make_shared (pWriter);
+ mTags[HTML_TAG(BR)] = std::make_shared (pWriter);
+ mTags[HTML_TAG(PRE)] = std::make_shared (pWriter);
+ mTags[HTML_TAG(H1)] = std::make_shared (pWriter);
+ mTags[HTML_TAG(IMG)] = std::make_shared (pWriter);
+ mTags[HTML_TAG(HR)] = std::make_shared(pWriter);
+ mTags[HTML_TAG(BLOCKQUOTE)] = std::make_shared (pWriter);
+ mTags[HTML_TAG(OL)] = std::make_shared (pWriter);
+ mTags[HTML_TAG(LI)] = std::make_shared (pWriter);
+ mTags[HTML_TAG(CODE)] = std::make_shared (pWriter);
+}
+
+bool CAnchorMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
@@ -26,7 +44,7 @@ bool CAnchorTag::Open(const std::vector& arSelectors)
return true;
}
-void CAnchorTag::Close(const NSCSS::CNode& oTagNode)
+void CAnchorMDTag::Close(const std::vector& arSelectors)
{
if (!Valid())
return;
@@ -35,8 +53,8 @@ void CAnchorTag::Close(const NSCSS::CNode& oTagNode)
std::wstring wsHref, wsTitle;
- oTagNode.GetAttributeValue(L"href", wsHref);
- oTagNode.GetAttributeValue(L"title", wsTitle);
+ arSelectors.back().GetAttributeValue(L"href", wsHref);
+ arSelectors.back().GetAttributeValue(L"title", wsTitle);
m_pWriter->WriteString(L'(' + wsHref);
@@ -46,7 +64,7 @@ void CAnchorTag::Close(const NSCSS::CNode& oTagNode)
m_pWriter->WriteString(L")");
}
-bool CBreakTag::Read(const NSCSS::CNode& oTagNode)
+bool CBreakMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
@@ -56,7 +74,10 @@ bool CBreakTag::Read(const NSCSS::CNode& oTagNode)
return true;
}
-bool CPreformattedTag::Open()
+void CBreakMDTag::Close(const std::vector& arSelectors)
+{}
+
+bool CPreformattedMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
@@ -67,7 +88,7 @@ bool CPreformattedTag::Open()
return true;
}
-void CPreformattedTag::Close(const std::vector& arSelectors)
+void CPreformattedMDTag::Close(const std::vector& arSelectors)
{
if (!Valid())
return;
@@ -93,12 +114,12 @@ void CPreformattedTag::Close(const std::vector& arSelec
m_pWriter->WriteBreakLine(false);
}
-bool CHeaderTag::Open(const NSCSS::CNode& oTagNode)
+bool CHeaderMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
- switch(oTagNode.m_wsName[1])
+ switch(arSelectors.back().m_wsName[1])
{
case L'1' : m_pWriter->WriteString(L"# ", true); break;
case L'2' : m_pWriter->WriteString(L"## ", true); break;
@@ -113,7 +134,7 @@ bool CHeaderTag::Open(const NSCSS::CNode& oTagNode)
return true;
}
-void CHeaderTag::Close()
+void CHeaderMDTag::Close(const std::vector& arSelectors)
{
if (Valid())
m_pWriter->WriteBreakLine();
@@ -376,11 +397,21 @@ bool ConvertFileToBase64(const std::wstring& wsFilePath, UINT unWidth, UINT unHe
return bResult;
}
-bool CImageTag::Read(const std::vector& arSelectors)
+bool CImageMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
+ if (L"svg" == arSelectors.back().m_wsName)
+ {
+ std::wstring wsBase64;
+
+ if (!ConvertFromSVG(arSelectors.back().GetAttributeValue(L"svg-text"), 0, 0, m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsBase64))
+ return false;
+
+ m_pWriter->WriteString(L"");
+ }
+
std::wstring wsAlt, wsSrc, wsTitle;
if (!arSelectors.back().GetAttributeValue(L"src", wsSrc) &&
@@ -484,22 +515,10 @@ bool CImageTag::Read(const std::vector& arSelectors)
return true;
}
-bool CImageTag::ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG)
-{
- if (!Valid())
- return false;
+void CImageMDTag::Close(const std::vector& arSelectors)
+{}
- std::wstring wsBase64;
-
- if (!ConvertFromSVG(wsSVG, 0, 0, m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsBase64))
- return false;
-
- m_pWriter->WriteString(L"");
-
- return true;
-}
-
-bool CHorizontalRuleTag::Write(const std::vector& arSelectors)
+bool CHorizontalRuleMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
@@ -511,7 +530,10 @@ bool CHorizontalRuleTag::Write(const std::vector& arSel
return true;
}
-bool CBlockquoteTag::Open(const std::vector& arSelectors)
+void CHorizontalRuleMDTag::Close(const std::vector& arSelectors)
+{}
+
+bool CBlockquoteMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
@@ -522,7 +544,7 @@ bool CBlockquoteTag::Open(const std::vector& arSelector
return true;
}
-void CBlockquoteTag::Close()
+void CBlockquoteMDTag::Close(const std::vector& arSelectors)
{
if (!Valid())
return;
@@ -532,20 +554,20 @@ void CBlockquoteTag::Close()
m_pWriter->WriteBreakLine(false);
}
-bool CListTag::Open(const NSCSS::CNode& oTagNode)
+bool CListMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
m_pWriter->WriteBreakLine();
- m_pWriter->EnteredList(L"ol" == oTagNode.m_wsName);
+ m_pWriter->EnteredList(L"ol" == arSelectors.back().m_wsName);
if (!m_pWriter->InOrederedList())
return true;
std::wstring wsIndex;
- if (oTagNode.GetAttributeValue(L"start", wsIndex))
+ if (arSelectors.back().GetAttributeValue(L"start", wsIndex))
m_pWriter->SetIndexOrderedList(NSStringFinder::ToInt(wsIndex, 1));
return true;
@@ -553,7 +575,7 @@ bool CListTag::Open(const NSCSS::CNode& oTagNode)
return true;
}
-void CListTag::Close()
+void CListMDTag::Close(const std::vector& arSelectors)
{
if (!Valid())
return;
@@ -561,7 +583,7 @@ void CListTag::Close()
m_pWriter->OutList();
}
-bool CListElementTag::Open()
+bool CListElementMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
@@ -583,10 +605,10 @@ bool CListElementTag::Open()
return true;
}
-void CListElementTag::Close()
+void CListElementMDTag::Close(const std::vector& arSelectors)
{}
-bool CCodeTag::Open(const NSCSS::CNode& oTagNode)
+bool CCodeMDTag::Open(const std::vector& arSelectors)
{
if (!Valid())
return false;
@@ -595,9 +617,9 @@ bool CCodeTag::Open(const NSCSS::CNode& oTagNode)
if (m_pWriter->InPreformatted())
{
- if (!oTagNode.m_wsClass.empty() && oTagNode.m_wsClass.size() >= 9 &&
- 0 == oTagNode.m_wsClass.compare(0, 9, L"language-"))
- m_pWriter->WriteString(oTagNode.m_wsClass.substr(9, oTagNode.m_wsClass.size() - 9));
+ if (!arSelectors.back().m_wsClass.empty() && arSelectors.back().m_wsClass.size() >= 9 &&
+ 0 == arSelectors.back().m_wsClass.compare(0, 9, L"language-"))
+ m_pWriter->WriteString(arSelectors.back().m_wsClass.substr(9, arSelectors.back().m_wsClass.size() - 9));
m_pWriter->WriteBreakLine(false);
}
else
@@ -606,7 +628,7 @@ bool CCodeTag::Open(const NSCSS::CNode& oTagNode)
return true;
}
-void CCodeTag::Close()
+void CCodeMDTag::Close(const std::vector& arSelectors)
{
if (!Valid())
return;
diff --git a/HtmlFile2/Tags/MDTags.h b/HtmlFile2/Tags/MDTags.h
index 63cbfa71cd..8b4f37868d 100644
--- a/HtmlFile2/Tags/MDTags.h
+++ b/HtmlFile2/Tags/MDTags.h
@@ -5,89 +5,24 @@
#include "../Writers/MDWriter.h"
#include "../Table.h"
+#include