diff --git a/HtmlFile2/HTMLReader.cpp b/HtmlFile2/HTMLReader.cpp
index 5b8382de5d..604183fc76 100644
--- a/HtmlFile2/HTMLReader.cpp
+++ b/HtmlFile2/HTMLReader.cpp
@@ -332,7 +332,7 @@ void CHTMLReader::Clear()
if (nullptr != m_pWriter)
delete m_pWriter;
- m_mTags.clear();
+ m_oTags.Clear();
m_wsSrcDirectory .clear();
m_wsDstDirectory .clear();
@@ -340,14 +340,14 @@ void CHTMLReader::Clear()
m_wsCoreDirectory.clear();
}
-void CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs)
+bool CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs)
{
Clear();
COOXMLWriter *pWriter = new COOXMLWriter(pParametrs, &m_oCSSCalculator);
if (nullptr == pWriter)
- return;
+ return false;
if (nullptr != m_pWriter)
delete m_pWriter;
@@ -358,95 +358,40 @@ void CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs)
pWriter->SetBaseDirectory(m_wsBaseDirectory);
pWriter->SetCoreDirectory(m_wsCoreDirectory);
+ m_oTags.Clear();
+
+ if (!m_oTags.Init(pWriter))
+ {
+ delete pWriter;
+ return false;
+ }
+
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);
- m_mTags[HTML_TAG(DIV)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(IMG)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(FONT)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(INPUT)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(BASEFONT)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(BLOCKQUOTE)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(HR)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(OL)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(LI)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(CAPTION)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(HTML)] = std::make_shared>(pWriter);
-
- std::shared_ptr oIgnoredTag{std::make_shared()};
-
- m_mTags[HTML_TAG(B)] = oIgnoredTag;
- m_mTags[HTML_TAG(I)] = oIgnoredTag;
- m_mTags[HTML_TAG(PRE)] = oIgnoredTag;
- m_mTags[HTML_TAG(CENTER)] = oIgnoredTag;
- m_mTags[HTML_TAG(KBD)] = oIgnoredTag;
- m_mTags[HTML_TAG(S)] = oIgnoredTag;
- m_mTags[HTML_TAG(U)] = oIgnoredTag;
- m_mTags[HTML_TAG(MARK)] = oIgnoredTag;
- m_mTags[HTML_TAG(SUP)] = oIgnoredTag;
- m_mTags[HTML_TAG(DD)] = oIgnoredTag;
- m_mTags[HTML_TAG(Q)] = oIgnoredTag;
- m_mTags[HTML_TAG(BDO)] = oIgnoredTag;
- m_mTags[HTML_TAG(SPAN)] = oIgnoredTag;
- m_mTags[HTML_TAG(H1)] = oIgnoredTag;
- m_mTags[HTML_TAG(CODE)] = oIgnoredTag;
+ return true;
}
-void CHTMLReader::InitMDTags(TMarkdownParameters* pParametrs)
+bool CHTMLReader::InitMDTags(TMarkdownParameters* pParametrs)
{
CMDWriter *pWriter = new CMDWriter((nullptr != pParametrs) ? *pParametrs : TMarkdownParameters{});
if (nullptr == pWriter)
- return;
+ return false;
if (nullptr != m_pWriter)
delete m_pWriter;
+ m_oTags.Clear();
+
+ if (!m_oTags.Init(pWriter))
+ {
+ delete pWriter;
+ return false;
+ }
+
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);
- m_mTags[HTML_TAG(I)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(S)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(Q)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(H1)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(IMG)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(HR)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(BLOCKQUOTE)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(OL)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(LI)] = std::make_shared>(pWriter);
- m_mTags[HTML_TAG(PRE)] = std::make_shared>(pWriter);
-
- std::shared_ptr oCode{std::make_shared>(pWriter)};
-
- m_mTags[HTML_TAG(CODE)] = oCode;
- m_mTags[HTML_TAG(KBD)] = oCode;
-
- std::shared_ptr oIgnoredTag{std::make_shared()};
-
- m_mTags[HTML_TAG(ABBR)] = oIgnoredTag;
- m_mTags[HTML_TAG(DIV)] = oIgnoredTag;
- m_mTags[HTML_TAG(FONT)] = oIgnoredTag;
- m_mTags[HTML_TAG(INPUT)] = oIgnoredTag;
- m_mTags[HTML_TAG(BASEFONT)] = oIgnoredTag;
- m_mTags[HTML_TAG(CENTER)] = oIgnoredTag;
- m_mTags[HTML_TAG(MARK)] = oIgnoredTag;
- m_mTags[HTML_TAG(SUP)] = oIgnoredTag;
- m_mTags[HTML_TAG(DD)] = oIgnoredTag;
- m_mTags[HTML_TAG(BDO)] = oIgnoredTag;
- m_mTags[HTML_TAG(SPAN)] = oIgnoredTag;
- m_mTags[HTML_TAG(CAPTION)] = oIgnoredTag;
- m_mTags[HTML_TAG(U)] = oIgnoredTag;
- m_mTags[HTML_TAG(HTML)] = oIgnoredTag;
+ return true;
}
bool CHTMLReader::IsHTML(XmlUtils::CXmlLiteReader& oReader)
@@ -456,7 +401,9 @@ bool CHTMLReader::IsHTML(XmlUtils::CXmlLiteReader& oReader)
HRESULT CHTMLReader::InitAndConvert2OOXML(const std::vector& arPaths, const std::wstring& wsDirectory, Convert_Func Convertation, THTMLParameters* pParameters)
{
- InitOOXMLTags(pParameters);
+ if (!InitOOXMLTags(pParameters))
+ return S_FALSE;
+
m_wsDstDirectory = wsDirectory;
HRESULT lResult{S_FALSE};
@@ -481,7 +428,8 @@ HRESULT CHTMLReader::InitAndConvert2OOXML(const std::vector& arPat
HRESULT CHTMLReader::InitAndConvert2Markdown(const std::vector& arPaths, const std::wstring& wsFinalFile, Convert_Func Convertation, TMarkdownParameters* pParameters)
{
- InitMDTags(pParameters);
+ if (!InitMDTags(pParameters))
+ return S_FALSE;
HRESULT lResult{S_FALSE};
@@ -646,7 +594,7 @@ void CHTMLReader::ReadBody(XmlUtils::CXmlLiteReader& oReader)
GetSubClass(oReader, arSelectors, m_oCSSCalculator);
- if (!m_mTags[HTML_TAG(HTML)]->Open(arSelectors))
+ if (!m_oTags.m_pHTML->Apply(arSelectors.back()))
return;
std::map::iterator itFound = arSelectors.back().m_mAttributes.find(L"bgcolor");
@@ -657,8 +605,6 @@ void CHTMLReader::ReadBody(XmlUtils::CXmlLiteReader& oReader)
oReader.MoveToElement();
ReadStream(oReader, arSelectors);
-
- m_mTags[HTML_TAG(HTML)]->Close(arSelectors);
}
bool CHTMLReader::ReadStream(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, bool bInsertEmptyP)
@@ -703,7 +649,7 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen(arSelectors))
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pAnchor->Close(arSelectors.back());
+ }
break;
}
case HTML_TAG(ABBR):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(ABBR), arSelectors);
+ if (m_oTags.m_pAbbr->Open(arSelectors))
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pAbbr->Close();
+ }
break;
}
case HTML_TAG(B):
case HTML_TAG(STRONG):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(B), arSelectors);
- break;
- }
- case HTML_TAG(BDO):
- case HTML_TAG(BDI):
- {
- bResult = ReadDefaultTag(oReader, HTML_TAG(BDO), arSelectors);
+ if (m_oTags.m_pBold->Open())
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pBold->Close();
+ }
break;
}
case HTML_TAG(BR):
{
- bResult = ReadEmptyTag(HTML_TAG(BR), arSelectors);
- break;
- }
- case HTML_TAG(CENTER):
- {
- bResult = ReadDefaultTag(oReader, HTML_TAG(CENTER), arSelectors);
+ bResult = m_oTags.m_pBreak->Read(arSelectors.back());
break;
}
case HTML_TAG(CITE):
@@ -748,71 +695,110 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen())
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pItalic->Close();
+ }
break;
}
case HTML_TAG(CODE):
case HTML_TAG(SAMP):
case HTML_TAG(TT):
case HTML_TAG(OUTPUT):
- {
- bResult = ReadDefaultTag(oReader, HTML_TAG(CODE), arSelectors);
- break;
- }
case HTML_TAG(KBD):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(KBD), arSelectors);
+ if (m_oTags.m_pCode->Open(arSelectors.back()))
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pCode->Close();
+ }
break;
}
case HTML_TAG(DEL):
case HTML_TAG(S):
case HTML_TAG(STRIKE):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(S), arSelectors);
+ if (m_oTags.m_pStrike->Open())
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pStrike->Close();
+ }
break;
}
case HTML_TAG(FONT):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(FONT), arSelectors);
+ m_oTags.m_pFont->Apply(arSelectors.back(), arSelectors.size());
+ bResult = ReadStream(oReader, arSelectors);
break;
}
case HTML_TAG(IMG):
{
- bResult = ReadEmptyTag(HTML_TAG(IMG), arSelectors);
+ bResult = m_oTags.m_pImage->Read(arSelectors);
break;
}
case HTML_TAG(SVG):
{
- bResult = ReadSVG(oReader, arSelectors);
+ bResult = m_oTags.m_pImage->ReadSVG(arSelectors, oReader.GetOuterXml());
break;
}
case HTML_TAG(INS):
case HTML_TAG(U):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(U), arSelectors);
- break;
- }
- case HTML_TAG(MARK):
- {
- bResult = ReadDefaultTag(oReader, HTML_TAG(MARK), arSelectors);
- break;
- }
- case HTML_TAG(Q):
- {
- bResult = ReadDefaultTag(oReader, HTML_TAG(Q), arSelectors);
- break;
- }
- case HTML_TAG(SUP):
- case HTML_TAG(SUB):
- {
- bResult = ReadDefaultTag(oReader, HTML_TAG(SUP), arSelectors);
+ if (m_oTags.m_pUnderline->Open())
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pUnderline->Close();
+ }
break;
}
case HTML_TAG(INPUT):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(INPUT), arSelectors);
+ m_oTags.m_pInput->Read(arSelectors);
+ bResult = ReadStream(oReader, arSelectors);
break;
}
+ case HTML_TAG(NOBR):
+ {
+ if (m_oTags.m_pPreformatted->Open())
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pPreformatted->Close(arSelectors);
+ }
+ break;
+ }
+ case HTML_TAG(BASEFONT):
+ {
+ m_oTags.m_pBaseFont->Apply(arSelectors.back());
+ bResult = ReadStream(oReader, arSelectors);
+ break;
+ }
+ case HTML_TAG(BUTTON):
+ case HTML_TAG(LABEL):
+ case HTML_TAG(DATA):
+ case HTML_TAG(OBJECT):
+ case HTML_TAG(NOSCRIPT):
+ case HTML_TAG(TIME):
+ case HTML_TAG(SMALL):
+ case HTML_TAG(PROGRESS):
+ case HTML_TAG(HGROUP):
+ case HTML_TAG(METER):
+ case HTML_TAG(ACRONYM):
+ case HTML_TAG(BIG):
+
+ case HTML_TAG(BDO):
+ case HTML_TAG(BDI):
+ case HTML_TAG(CENTER):
+ case HTML_TAG(MARK):
+ case HTML_TAG(Q):
+ case HTML_TAG(SUP):
+ case HTML_TAG(SUB):
+ case HTML_TAG(SPAN):
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ break;
+ }
+
case HTML_TAG(CANVAS):
case HTML_TAG(VIDEO):
case HTML_TAG(MATH):
@@ -832,37 +818,6 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorBeginBlock();
@@ -871,12 +826,11 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen())
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pItalic->Close();
+ }
break;
}
case HTML_TAG(H1):
@@ -886,18 +840,76 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorRead(arSelectors.back());
+ bResult = ReadStream(oReader, arSelectors);
break;
}
case HTML_TAG(ASIDE):
case HTML_TAG(DIV):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(DIV), arSelectors);
+ if (m_oTags.m_pDivision->Open(arSelectors))
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pDivision->Close();
+ }
break;
}
case HTML_TAG(BLOCKQUOTE):
{
- bResult = ReadDefaultTag(oReader, HTML_TAG(BLOCKQUOTE), arSelectors);
+ if (m_oTags.m_pBlockquote->Open(arSelectors))
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pBlockquote->Close();
+ }
+
+ break;
+ }
+ case HTML_TAG(HR):
+ {
+ bResult = true;
+ m_oTags.m_pHorizontalRule->Write(arSelectors);
+ break;
+ }
+ case HTML_TAG(LI):
+ {
+ if (m_oTags.m_pListElement->Open())
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pListElement->Close();
+ }
+ 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();
+ }
+ break;
+ }
+ // case HTML_TAG(MENU):
+ // case HTML_TAG(SELECT):
+ // case HTML_TAG(DATALIST):
+ // case HTML_TAG(DIR):
+ // {
+ // bResult = readLi(&oXmlData, sSelectors, oTS, HTML_TAG(OL) != eHtmlTag);
+ // break;
+ // }
+ case HTML_TAG(PRE):
+ case HTML_TAG(XMP):
+ {
+ if (m_oTags.m_pPreformatted->Open())
+ {
+ bResult = ReadStream(oReader, arSelectors);
+ m_oTags.m_pPreformatted->Close(arSelectors);
+ }
+ break;
+ }
+ case HTML_TAG(TABLE):
+ {
+ bResult = ReadTable(oReader, arSelectors);
break;
}
case HTML_TAG(ARTICLE):
@@ -916,45 +928,12 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorEndBlock(bResult);
@@ -1000,16 +974,6 @@ bool CHTMLReader::ReadText(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors)
-{
- if (!m_mTags[HTML_TAG(IMG)]->Open(arSelectors, oReader.GetOuterXml()))
- return false;
-
- m_mTags[HTML_TAG(IMG)]->Close(arSelectors);
-
- return true;
-}
-
bool CHTMLReader::ReadTable(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors)
{
if(oReader.IsEmptyNode())
@@ -1020,6 +984,9 @@ bool CHTMLReader::ReadTable(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors)
-{
- if (!m_mTags[unTag]->Open(arSelectors))
- return false;
-
- m_mTags[unTag]->Close(arSelectors);
-
- return true;
-}
-
-bool CHTMLReader::ReadDefaultTag(XmlUtils::CXmlLiteReader& oReader, UINT unTag, std::vector& arSelectors)
-{
- if (!m_mTags[unTag]->Open(arSelectors))
- return false;
-
- const bool bResult{ReadStream(oReader, arSelectors)};
-
- m_mTags[unTag]->Close(arSelectors);
-
- return bResult;
-}
-
inline std::wstring GetArgumentValue(XmlUtils::CXmlLiteReader& oLiteReader, const std::wstring& wsArgumentName, const std::wstring& wsDefaultValue)
{
if (!oLiteReader.MoveToFirstAttribute())
diff --git a/HtmlFile2/HTMLReader.h b/HtmlFile2/HTMLReader.h
index 4ccef4917e..f108e35b44 100644
--- a/HtmlFile2/HTMLReader.h
+++ b/HtmlFile2/HTMLReader.h
@@ -30,7 +30,7 @@ class CHTMLReader
IWriter *m_pWriter;
- std::unordered_map> m_mTags;
+ THTMLTags m_oTags;
public:
CHTMLReader();
~CHTMLReader();
@@ -53,8 +53,8 @@ public:
NSCSS::CCssCalculator* GetCSSCalculator();
private:
void Clear();
- void InitOOXMLTags(THTMLParameters* pParametrs = nullptr);
- void InitMDTags(TMarkdownParameters* pParametrs = nullptr);
+ bool InitOOXMLTags(THTMLParameters* pParametrs = nullptr);
+ bool InitMDTags(TMarkdownParameters* pParametrs = nullptr);
bool IsHTML(XmlUtils::CXmlLiteReader& oReader);
@@ -78,10 +78,6 @@ private:
bool ReadText(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors);
- bool ReadSVG(XmlUtils::CXmlLiteReader& oReader, const std::vector& arSelectors);
- bool ReadEmptyTag(UINT unTag, const std::vector& arSelectors);
- bool ReadDefaultTag(XmlUtils::CXmlLiteReader& oReader, UINT unTag, std::vector& arSelectors);
-
bool ReadTable(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors);
};
}
diff --git a/HtmlFile2/Tags/HTMLTags.h b/HtmlFile2/Tags/HTMLTags.h
index 7d4b80c469..349cec5dd8 100644
--- a/HtmlFile2/Tags/HTMLTags.h
+++ b/HtmlFile2/Tags/HTMLTags.h
@@ -2,93 +2,332 @@
#define HTMLTAGS_H
#include "../Common/3dParty/html/css/src/CNode.h"
-#include
namespace HTML
{
-// TODO:: думаю лучше перейти на интерфейсы к каждой ноде
-// ISVGTag -> CMarkdownSVGTag
-// -> COOXMLSVGTag
-// Либо
-// template CSVGTag -> template<> class CSVGTag
-// -> template<> class CSVGTag
+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(Bold)
+ ADD_BOOL_INTERFACE_METHOD(Open);
+ 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(Italic)
+ ADD_BOOL_INTERFACE_METHOD(Open);
+ ADD_VOID_INTERFACE_METHOD(Close);
+CLOSE_INTERFACE_TAG()
+
+OPEN_INTERFACE_TAG(Strike)
+ ADD_BOOL_INTERFACE_METHOD(Open);
+ ADD_VOID_INTERFACE_METHOD(Close);
+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(Underline)
+ ADD_BOOL_INTERFACE_METHOD(Open);
+ ADD_VOID_INTERFACE_METHOD(Close);
+CLOSE_INTERFACE_TAG()
+
+OPEN_INTERFACE_TAG(Header)
+ ADD_BOOL_INTERFACE_METHOD(Read, const NSCSS::CNode& oTagNode);
+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:
virtual ~ITag() = default;
- virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) = 0;
- virtual void Close(const std::vector& arSelectors) = 0;
-};
-
-class CEmptyTag : public ITag
-{
-public:
- virtual ~CEmptyTag() = default;
- virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any())
- {
- return true;
- };
- virtual void Close(const std::vector& arSelectors) {};
-};
-
-template
-class CTag : public ITag
-{
protected:
- T* m_pWriter;
-public:
- CTag(T* pWriter)
+ ITag(Writer *pWriter)
: m_pWriter(pWriter)
{}
- virtual ~CTag() = default;
- virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) = 0;
- virtual void Close(const std::vector& arSelectors) = 0;
- bool ValidWriter() const
+ bool Valid() const
{
return nullptr != m_pWriter;
}
-};
-#define CREATE_TAG(tag_name)\
-template\
-class tag_name : public CTag\
+ Writer *m_pWriter;
+};
+}
+
+#define OPEN_CLASS_TAG(class_name)\
+template\
+class C ## class_name ## Tag : public INTERFACE_TAGS::I ## class_name ## Tag, public INTERFACE_TAGS::ITag\
{\
public:\
- virtual bool Open(const std::vector& arSelectors) = 0;\
- virtual void Close(const std::vector& arSelectors) = 0;\
-}
+ C ## class_name ## Tag(Writer *pWriter) : INTERFACE_TAGS::ITag(pWriter) {}
-CREATE_TAG(CAnchor);
-CREATE_TAG(CAbbr);
-CREATE_TAG(CBold);
-CREATE_TAG(CBidirectional);
-CREATE_TAG(CBreak);
-CREATE_TAG(CCenter);
-CREATE_TAG(CItalic);
-CREATE_TAG(CKbd);
-CREATE_TAG(CStrike);
-CREATE_TAG(CUnderline);
-CREATE_TAG(CMark);
-CREATE_TAG(CQuotation);
-CREATE_TAG(CSup);
-CREATE_TAG(CSpan);
-CREATE_TAG(CDD);
-CREATE_TAG(CPreformatted);
-CREATE_TAG(CHeader);
-CREATE_TAG(CDivision);
-CREATE_TAG(CImage);
-CREATE_TAG(CFont);
-CREATE_TAG(CInput);
-CREATE_TAG(CBaseFont);
-CREATE_TAG(CBlockquote);
-CREATE_TAG(CHorizontalRule);
-CREATE_TAG(CList);
-CREATE_TAG(CListElement);
-CREATE_TAG(CCaption);
-CREATE_TAG(CCode);
-CREATE_TAG(CHTML);
+#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(Bold)
+ ADD_BOOL_CLASS_METHOD(Open);
+ 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(Italic)
+ ADD_BOOL_CLASS_METHOD(Open);
+ ADD_VOID_CLASS_METHOD(Close);
+CLOSE_CLASS_TAG()
+
+OPEN_CLASS_TAG(Strike)
+ ADD_BOOL_CLASS_METHOD(Open);
+ ADD_VOID_CLASS_METHOD(Close);
+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(Underline)
+ ADD_BOOL_CLASS_METHOD(Open);
+ ADD_VOID_CLASS_METHOD(Close);
+CLOSE_CLASS_TAG()
+
+OPEN_CLASS_TAG(Header)
+ ADD_BOOL_CLASS_METHOD(Read, const NSCSS::CNode& oTagNode);
+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_TAG(class_name) INTERFACE_TAGS::I ## class_name ## Tag *m_p##class_name{nullptr}
+
+struct THTMLTags
+{
+ ADD_TAG(Anchor);
+ ADD_TAG(Abbr);
+ ADD_TAG(Bold);
+ ADD_TAG(Break);
+ ADD_TAG(Italic);
+ ADD_TAG(Strike);
+ ADD_TAG(Preformatted);
+ ADD_TAG(Underline);
+ ADD_TAG(Header);
+ ADD_TAG(Division);
+ ADD_TAG(Image);
+ ADD_TAG(Font);
+ ADD_TAG(Input);
+ ADD_TAG(BaseFont);
+ ADD_TAG(Blockquote);
+ ADD_TAG(List);
+ ADD_TAG(HorizontalRule);
+ ADD_TAG(ListElement);
+ ADD_TAG(Code);
+ ADD_TAG(HTML);
+
+ ~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(Bold);
+ CLEAR_VARIABLE(Break);
+ CLEAR_VARIABLE(Italic);
+ CLEAR_VARIABLE(Strike);
+ CLEAR_VARIABLE(Preformatted);
+ CLEAR_VARIABLE(Underline);
+ 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(Bold);
+ INIT_VARIABLE(Break);
+ INIT_VARIABLE(Italic);
+ INIT_VARIABLE(Strike);
+ INIT_VARIABLE(Preformatted);
+ INIT_VARIABLE(Underline);
+ 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;
+ }
+};
}
#endif // HTMLTAGS_H
diff --git a/HtmlFile2/Tags/MDTags.cpp b/HtmlFile2/Tags/MDTags.cpp
index 61e1777566..3fcf0e6be7 100644
--- a/HtmlFile2/Tags/MDTags.cpp
+++ b/HtmlFile2/Tags/MDTags.cpp
@@ -6,35 +6,57 @@
#include "../Table.h"
#include "../Common/3dParty/html/css/src/CCompiledStyle.h"
+#include "../../DesktopEditor/common/Base64.h"
+
#include
#include
namespace HTML
{
-CAnchor::CAnchor(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CAnchor::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CAnchorTag::Open(const std::vector& arSelectors)
{
- if (!ValidWriter())
+ if (!Valid())
return false;
m_pWriter->WriteString(L"[");
return true;
}
-void CAnchor::Close(const std::vector& arSelectors)
+
+template<>
+void CAnchorTag::Close(const NSCSS::CNode& oTagNode)
{
- if (!ValidWriter())
+ if (!Valid())
return;
m_pWriter->WriteString(L"]");
std::wstring wsHref, wsTitle;
- arSelectors.back().GetAttributeValue(L"href", wsHref);
- arSelectors.back().GetAttributeValue(L"title", wsTitle);
+ oTagNode.GetAttributeValue(L"href", wsHref);
+ oTagNode.GetAttributeValue(L"title", wsTitle);
+
+ NSCSS::NSProperties::CDigit oWidth{oTagNode.m_pCompiledStyle->m_oDisplay.GetWidth()};
+ NSCSS::NSProperties::CDigit oHeight{oTagNode.m_pCompiledStyle->m_oDisplay.GetHeight()};
+
+ std::wstring wsValue;
+
+ if (oTagNode.GetAttributeValue(L"width", wsValue))
+ oWidth.SetValue(wsValue);
+
+ if (oTagNode.GetAttributeValue(L"height", wsValue))
+ oHeight.SetValue(wsValue);
+
+ const bool bNeedSetSize{(!oWidth.Empty() && !oWidth.Zero()) || (!oHeight.Empty() && !oHeight.Zero())};
+
+ // Предполагаем картинку в Base64
+ if (wsHref.length() > 4 && wsHref.substr(0, 4) == L"data" && wsHref.find(L"/", 4) != std::wstring::npos)
+ {
+ if (bNeedSetSize)
+ {
+ }
+ }
m_pWriter->WriteString(L'(' + wsHref);
@@ -44,13 +66,62 @@ void CAnchor::Close(const std::vector& arSelectors)
m_pWriter->WriteString(L")");
}
-CBold::CBold(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CBold::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+bool ConvertFromBase64(const std::wstring& wsBase64, UINT unWidth, UINT unHeight)
{
- if (!ValidWriter())
+ bool bRes = false;
+ size_t nBase = wsBase64.find(L"/", 4);
+ nBase++;
+
+ const size_t nEndBase = wsBase64.find(L";", nBase);
+ if (nEndBase == std::wstring::npos)
+ return bRes;
+
+ std::wstring wsExtention{wsBase64.substr(nBase, nEndBase - nBase)};
+
+ if (wsExtention == L"octet-stream")
+ wsExtention = L"jpg";
+
+ nBase = wsBase64.find(L"base64", nEndBase);
+ if (nBase == std::wstring::npos)
+ return bRes;
+
+ const int nOffset = nBase + 7;
+ int nSrcLen = (int)(wsBase64.length() - nBase + 1);
+ int nDecodeLen = NSBase64::Base64DecodeGetRequiredLength(nSrcLen);
+
+ // if (nDecodeLen != 0)
+ // {
+ // BYTE* pImageData = new BYTE[nDecodeLen];
+
+ // if (!pImageData || FALSE == NSBase64::Base64Decode(wsBase64.c_str() + nOffset, nSrcLen, pImageData, &nDecodeLen))
+ // return false;
+
+ // if (L"svg" == wsExtention || L"svg+xml" == wsExtention;)
+ // {
+ // std::wstring wsSvg(pImageData, pImageData + nDecodeLen);
+ // bRes = ReadSVG(wsSvg, pFonts, wsTempDir, wsImagePath);
+ // wsExtention = L"png";
+ // }
+ // else
+ // {
+ // NSFile::CFileBinary oImageWriter;
+
+ // if (oImageWriter.CreateFileW(wsImagePath + L'.' + wsExtention))
+ // bRes = oImageWriter.WriteFile(pImageData, (DWORD)nDecodeLen);
+
+ // oImageWriter.CloseFile();
+ // }
+
+ // RELEASEARRAYOBJECTS(pImageData);
+ // }
+
+ return bRes;
+}
+
+template<>
+bool CBoldTag::Open()
+{
+ if (!Valid())
return false;
if (m_pWriter->IsBold())
@@ -62,22 +133,20 @@ bool CBold::Open(const std::vector& arSelectors, const
return true;
}
-void CBold::Close(const std::vector& arSelectors)
+template<>
+void CBoldTag::Close()
{
- if (!ValidWriter() || !m_pWriter->IsBold())
+ if (!Valid() || !m_pWriter->IsBold())
return;
m_pWriter->WriteCloseSpecialString(L"**");
m_pWriter->OutBold();
}
-CBreak::CBreak(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CBreak::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CBreakTag::Read(const NSCSS::CNode& oTagNode)
{
- if (!ValidWriter())
+ if (!Valid())
return false;
m_pWriter->WriteBreakLine();
@@ -85,16 +154,10 @@ bool CBreak::Open(const std::vector& arSelectors, const
return true;
}
-void CBreak::Close(const std::vector& arSelectors)
-{}
-
-CItalic::CItalic(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CItalic::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CItalicTag::Open()
{
- if (!ValidWriter())
+ if (!Valid())
return false;
if (m_pWriter->IsItalic())
@@ -106,22 +169,20 @@ bool CItalic::Open(const std::vector& arSelectors, cons
return true;
}
-void CItalic::Close(const std::vector& arSelectors)
+template<>
+void CItalicTag::Close()
{
- if (!ValidWriter() || !m_pWriter->IsItalic())
+ if (!Valid())
return;
m_pWriter->WriteCloseSpecialString(L"*");
m_pWriter->OutItalic();
}
-CStrike::CStrike(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CStrike::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CStrikeTag::Open()
{
- if (!ValidWriter())
+ if (!Valid())
return false;
if (m_pWriter->IsStrike())
@@ -133,37 +194,20 @@ bool CStrike::Open(const std::vector& arSelectors, cons
return true;
}
-void CStrike::Close(const std::vector& arSelectors)
+template<>
+void CStrikeTag::Close()
{
- if (!ValidWriter() || !m_pWriter->IsStrike())
+ if (!Valid())
return;
m_pWriter->WriteCloseSpecialString(L"~~");
m_pWriter->OutStrike();
}
-CQuotation::CQuotation(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CQuotation::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CPreformattedTag::Open()
{
- if (!ValidWriter())
- return false;
-
- return true;
-}
-
-void CQuotation::Close(const std::vector& arSelectors)
-{}
-
-CPreformatted::CPreformatted(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CPreformatted::Open(const std::vector& arSelectors, const boost::any& oExtraData)
-{
- if (!ValidWriter())
+ if (!Valid())
return false;
m_pWriter->WriteOpenSpecialString(L"```");
@@ -172,9 +216,10 @@ bool CPreformatted::Open(const std::vector& arSelectors
return true;
}
-void CPreformatted::Close(const std::vector& arSelectors)
+template<>
+void CPreformattedTag::Close(const std::vector& arSelectors)
{
- if (!ValidWriter())
+ if (!Valid())
return;
bool bNeedBreakLine{false};
@@ -198,16 +243,13 @@ void CPreformatted::Close(const std::vector& arSelector
m_pWriter->WriteBreakLine(false);
}
-CHeader::CHeader(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CHeader::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CHeaderTag::Read(const NSCSS::CNode& oTagNode)
{
- if (!ValidWriter())
+ if (!Valid())
return false;
- switch(arSelectors.back().m_wsName[1])
+ switch(oTagNode.m_wsName[1])
{
case L'1' : m_pWriter->WriteString(L"# ", true); break;
case L'2' : m_pWriter->WriteString(L"## ", true); break;
@@ -219,22 +261,14 @@ bool CHeader::Open(const std::vector& arSelectors, cons
return false;
}
+
return true;
}
-void CHeader::Close(const std::vector& arSelectors)
+template<>
+bool CImageTag::Read(const std::vector& arSelectors)
{
- if (!ValidWriter())
- return;
-}
-
-CImage::CImage(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CImage::Open(const std::vector& arSelectors, const boost::any& oExtraData)
-{
- if (!ValidWriter())
+ if (!Valid())
return false;
std::wstring wsAlt, wsSrc, wsTitle;
@@ -255,19 +289,19 @@ bool CImage::Open(const std::vector& arSelectors, const
return true;
}
-void CImage::Close(const std::vector& arSelectors)
+template<>
+bool CImageTag::ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG)
{
- if (!ValidWriter())
- return;
+ if (!Valid())
+ return false;
+
+ return true;
}
-CHorizontalRule::CHorizontalRule(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CHorizontalRule::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CHorizontalRuleTag::Write(const std::vector& arSelectors)
{
- if (!ValidWriter())
+ if (!Valid())
return false;
m_pWriter->WriteBreakLine(false);
@@ -277,16 +311,10 @@ bool CHorizontalRule::Open(const std::vector& arSelecto
return true;
}
-void CHorizontalRule::Close(const std::vector& arSelectors)
-{}
-
-CBlockquote::CBlockquote(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CBlockquote::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CBlockquoteTag::Open(const std::vector& arSelectors)
{
- if (!ValidWriter())
+ if (!Valid())
return false;
m_pWriter->WriteBreakLine();
@@ -295,9 +323,10 @@ bool CBlockquote::Open(const std::vector& arSelectors,
return true;
}
-void CBlockquote::Close(const std::vector& arSelectors)
+template<>
+void CBlockquoteTag::Close()
{
- if (!ValidWriter())
+ if (!Valid())
return;
m_pWriter->OutBlockquote();
@@ -305,44 +334,41 @@ void CBlockquote::Close(const std::vector& arSelectors)
m_pWriter->WriteBreakLine(false);
}
-CList::CList(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CList::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CListTag::Open(const NSCSS::CNode& oTagNode)
{
- if (!ValidWriter())
+ if (!Valid())
return false;
m_pWriter->WriteBreakLine();
- m_pWriter->EnteredList(L"ol" == arSelectors.back().m_wsName);
+ m_pWriter->EnteredList(L"ol" == oTagNode.m_wsName);
if (!m_pWriter->InOrederedList())
return true;
std::wstring wsIndex;
- if (arSelectors.back().GetAttributeValue(L"start", wsIndex))
+ if (oTagNode.GetAttributeValue(L"start", wsIndex))
m_pWriter->SetIndexOrderedList(NSStringFinder::ToInt(wsIndex, 1));
return true;
+
+ return true;
}
-void CList::Close(const std::vector& arSelectors)
+template<>
+void CListTag::Close()
{
- if (!ValidWriter())
+ if (!Valid())
return;
m_pWriter->OutList();
}
-CListElement::CListElement(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CListElement::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CListElementTag::Open()
{
- if (!ValidWriter())
+ if (!Valid())
return false;
if (0 != m_pWriter->GetLevelList())
@@ -362,25 +388,23 @@ bool CListElement::Open(const std::vector& arSelectors,
return true;
}
-void CListElement::Close(const std::vector& arSelectors)
+template<>
+void CListElementTag::Close()
{}
-CCode::CCode(CMDWriter* pWriter)
- : CTag(pWriter)
-{}
-
-bool CCode::Open(const std::vector& arSelectors, const boost::any& oExtraData)
+template<>
+bool CCodeTag::Open(const NSCSS::CNode& oTagNode)
{
- if (!ValidWriter())
+ if (!Valid())
return false;
m_pWriter->EnteredCode();
if (m_pWriter->InPreformatted())
{
- 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));
+ 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));
m_pWriter->WriteBreakLine(false);
}
else
@@ -389,9 +413,10 @@ bool CCode::Open(const std::vector& arSelectors, const
return true;
}
-void CCode::Close(const std::vector& arSelectors)
+template<>
+void CCodeTag::Close()
{
- if (!ValidWriter())
+ if (!Valid())
return;
if (!m_pWriter->InPreformatted())
diff --git a/HtmlFile2/Tags/MDTags.h b/HtmlFile2/Tags/MDTags.h
index 65452f867a..1361899188 100644
--- a/HtmlFile2/Tags/MDTags.h
+++ b/HtmlFile2/Tags/MDTags.h
@@ -8,130 +8,63 @@
namespace HTML
{
template<>
-class CAnchor : public CTag
-{
-public:
- CAnchor(CMDWriter* pWriter);
- virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override;
- virtual void Close(const std::vector& arSelectors) override;
-};
+bool CAnchorTag::Open(const std::vector& arSelectors);
+template<>
+void CAnchorTag::Close(const NSCSS::CNode& oTagNode);
template<>
-class CBold : public CTag
-{
-public:
- CBold(CMDWriter* pWriter);
- virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override;
- virtual void Close(const std::vector& arSelectors) override;
-};
+bool CBoldTag::Open();
+template<>
+void CBoldTag::Close();
template<>
-class CBreak : public CTag
-{
-public:
- CBreak(CMDWriter* pWriter);
- virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override;
- virtual void Close(const std::vector& arSelectors) override;
-};
+bool CBreakTag::Read(const NSCSS::CNode& oTagNode);
template<>
-class CItalic : public CTag
-{
-public:
- CItalic(CMDWriter* pWriter);
- virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override;
- virtual void Close(const std::vector& arSelectors) override;
-};
+bool CItalicTag::Open();
+template<>
+void CItalicTag::Close();
template<>
-class CStrike : public CTag
-{
-public:
- CStrike(CMDWriter* pWriter);
- virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override;
- virtual void Close(const std::vector& arSelectors) override;
-};
+bool CStrikeTag::Open();
+template<>
+void CStrikeTag::Close();
template<>
-class CQuotation : public CTag
-{
-public:
- CQuotation(CMDWriter* pWriter);
- virtual bool Open(const std::vector