From 32da1a4901784bbc4a2a5cb358e8364ee6de1b2e Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Fri, 27 Mar 2026 01:53:35 +0300 Subject: [PATCH] Refactoring --- HtmlFile2/HTMLReader.cpp | 423 +++++++++++++----------------- HtmlFile2/HTMLReader.h | 10 +- HtmlFile2/Tags/HTMLTags.h | 375 +++++++++++++++++++++----- HtmlFile2/Tags/MDTags.cpp | 291 ++++++++++---------- HtmlFile2/Tags/MDTags.h | 131 +++------ HtmlFile2/Tags/OOXMLTags.cpp | 291 +++++++++----------- HtmlFile2/Tags/OOXMLTags.h | 150 ++++------- HtmlFile2/Writers/IWriter.h | 3 - HtmlFile2/Writers/MDWriter.cpp | 5 - HtmlFile2/Writers/MDWriter.h | 2 - HtmlFile2/Writers/OOXMLWriter.cpp | 9 +- HtmlFile2/Writers/OOXMLWriter.h | 4 +- 12 files changed, 859 insertions(+), 835 deletions(-) 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& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; +bool CPreformattedTag::Open(); +template<> +void CPreformattedTag::Close(const std::vector& arSelectors); template<> -class CPreformatted : public CTag -{ -public: - CPreformatted(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 CHeaderTag::Read(const NSCSS::CNode& oTagNode); template<> -class CHeader : public CTag -{ -public: - CHeader(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 CImageTag::Read(const std::vector& arSelectors); +template<> +bool CImageTag::ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG); template<> -class CImage : public CTag -{ -public: - CImage(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 CBlockquoteTag::Open(const std::vector& arSelectors); +template<> +void CBlockquoteTag::Close(); template<> -class CHorizontalRule : public CTag -{ -public: - CHorizontalRule(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 CListTag::Open(const NSCSS::CNode& oTagNode); +template<> +void CListTag::Close(); template<> -class CBlockquote : public CTag -{ -public: - CBlockquote(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 CHorizontalRuleTag::Write(const std::vector& arSelectors); template<> -class CList : public CTag -{ -public: - CList(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 CListElementTag::Open(); +template<> +void CListElementTag::Close(); template<> -class CListElement : public CTag -{ -public: - CListElement(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 CCodeTag::Open(const NSCSS::CNode& oTagNode); template<> -class CCode : public CTag -{ -public: - CCode(CMDWriter* pWriter); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; +void CCodeTag::Close(); struct TElementInfo { diff --git a/HtmlFile2/Tags/OOXMLTags.cpp b/HtmlFile2/Tags/OOXMLTags.cpp index 1bbdb32e7c..e5bf591c21 100644 --- a/HtmlFile2/Tags/OOXMLTags.cpp +++ b/HtmlFile2/Tags/OOXMLTags.cpp @@ -23,7 +23,7 @@ inline bool ElementInTable(const std::vector& arSelectors); inline bool NotValidExtension(const std::wstring& sExtention); inline bool IsSVG(const std::wstring& wsExtention); -bool ReadSVG(const std::wstring& wsSvg, NSFonts::IApplicationFonts* pFonts, const std::wstring& wsTempDir, const std::wstring& wsImagePath); +bool ReadSVGData(const std::wstring& wsSvg, NSFonts::IApplicationFonts* pFonts, const std::wstring& wsTempDir, const std::wstring& wsImagePath); bool ReadBase64(const std::wstring& wsSrc, const std::wstring& wsImagePath, NSFonts::IApplicationFonts* pFonts, const std::wstring& wsTempDir, std::wstring& wsExtention); bool GetStatusUsingExternalLocalFiles(); bool CanUseThisPath(const std::wstring& wsPath, const std::wstring& wsSrcPath, const std::wstring& wsCorePath, bool bIsAllowExternalLocalFiles); @@ -33,13 +33,10 @@ bool UpdateImageData(const std::wstring& wsImagePath, TImageData& oImageData); const static double HTML_FONTS[7] = {7.5, 10, 12, 13.5, 18, 24, 36}; -CAnchor::CAnchor(COOXMLWriter* 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; std::wstring wsRef, wsAlt, wsName; @@ -83,21 +80,19 @@ bool CAnchor::Open(const std::vector& arSelectors, c return true; } -void CAnchor::Close(const std::vector& arSelectors) +template<> +void CAnchorTag::Close(const NSCSS::CNode& oTagNode) { - if (!ValidWriter()) + if (!Valid()) return; m_pWriter->ClearHyperlinkData(); } -CAbbr::CAbbr(COOXMLWriter* pWriter) - : CTag(pWriter) -{} - -bool CAbbr::Open(const std::vector& arSelectors, const boost::any& oExtraData) +template<> +bool CAbbrTag::Open(const std::vector& arSelectors) { - if (!ValidWriter()) + if(!Valid()) return false; std::wstring wsTitle; @@ -117,38 +112,33 @@ bool CAbbr::Open(const std::vector& arSelectors, con return true; } -void CAbbr::Close(const std::vector& arSelectors) +template<> +void CAbbrTag::Close() { - if (!ValidWriter()) + if (!Valid()) return; m_pWriter->GetCurrentDocument()->WriteString(L""); } -CBreak::CBreak(COOXMLWriter* 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->Break(arSelectors); + m_pWriter->Break(oTagNode); return true; } -void CBreak::Close(const std::vector& arSelectors) +CDivisionTag::CDivisionTag(COOXMLWriter* pWriter) + : INTERFACE_TAGS::ITag(pWriter) {} -CDivision::CDivision(COOXMLWriter* pWriter) - : CTag(pWriter) -{} - -bool CDivision::Open(const std::vector& arSelectors, const boost::any& oExtraData) +bool CDivisionTag::Open(const std::vector& arSelectors) { - if (!ValidWriter()) + if (!Valid()) return false; m_pWriter->UpdatePageStyle(arSelectors); @@ -177,14 +167,14 @@ bool CDivision::Open(const std::vector& arSelectors, } } - m_arFootnoteIDs.push(unMsoFootnote); + // m_arFootnoteIDs.push(unMsoFootnote); return true; } -void CDivision::Close(const std::vector& arSelectors) +void CDivisionTag::Close() { - if (!ValidWriter() || m_arFootnoteIDs.empty()) + if (!Valid() || m_arFootnoteIDs.empty()) return; if (m_arFootnoteIDs.top() >= 2) @@ -197,33 +187,33 @@ void CDivision::Close(const std::vector& arSelectors m_arFootnoteIDs.pop(); } -CImage::CImage(COOXMLWriter* pWriter) - : CTag(pWriter) +CImageTag::CImageTag(COOXMLWriter* pWriter) + : INTERFACE_TAGS::ITag(pWriter) {} -bool CImage::Open(const std::vector& arSelectors, const boost::any& oExtraData) +bool CImageTag::Read(const std::vector& arSelectors) { - if (!ValidWriter()) + if (!Valid()) return false; - if (L"svg" == arSelectors.back().m_wsName) - { - if (oExtraData.empty() || typeid(const std::wstring&) != oExtraData.type()) - return false; + // if (L"svg" == arSelectors.back().m_wsName) + // { + // if (oExtraData.empty() || typeid(const std::wstring&) != oExtraData.type()) + // return false; - const std::wstring wsImagePath{m_pWriter->GetMediaDir() + L'i' + std::to_wstring(m_arrImages.size()) + L".png"}; + // const std::wstring wsImagePath{m_pWriter->GetMediaDir() + L'i' + std::to_wstring(m_arrImages.size()) + L".png"}; - if (!ReadSVG(boost::any_cast(oExtraData), m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsImagePath)) - return false; + // if (!ReadSVG(boost::any_cast(oExtraData), m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsImagePath)) + // return false; - TImageData oNewImageData; - if (!UpdateImageData(wsImagePath, oNewImageData)) - return false; + // TImageData oNewImageData; + // if (!UpdateImageData(wsImagePath, oNewImageData)) + // return false; - m_pWriter->WritePPr(arSelectors); - m_pWriter->WriteImage(oNewImageData, std::to_wstring(m_arrImages.size())); - return true; - } + // m_pWriter->WritePPr(arSelectors); + // m_pWriter->WriteImage(oNewImageData, std::to_wstring(m_arrImages.size())); + // return true; + // } const std::wstring wsAlt{arSelectors.back().GetAttributeValue(L"alt")}; std::wstring wsSrc{arSelectors.back().GetAttributeValue(L"src")}; @@ -340,7 +330,7 @@ bool CImage::Open(const std::vector& arSelectors, co std::wstring wsFileData; if (!NSFile::CFileBinary::ReadAllTextUtf8(wsDst, wsFileData) || - !ReadSVG(wsFileData, m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsImagePath)) + !ReadSVGData(wsFileData, m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsImagePath)) bRes = false; NSFile::CFileBinary::Remove(wsDst); @@ -423,27 +413,42 @@ bool CImage::Open(const std::vector& arSelectors, co return true; } -void CImage::Close(const std::vector& arSelectors) -{} - -CFont::CFont(COOXMLWriter* pWriter) - : CTag(pWriter) -{} - -bool CFont::Open(const std::vector& arSelectors, const boost::any& oExtraData) +bool CImageTag::ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG) { - if (!ValidWriter()) + if (!Valid()) + return false; + + const std::wstring wsImagePath{m_pWriter->GetMediaDir() + L'i' + std::to_wstring(m_arrImages.size()) + L".png"}; + + if (!ReadSVGData(wsSVG, m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsImagePath)) + return false; + + TImageData oNewImageData; + if (!UpdateImageData(wsImagePath, oNewImageData)) + return false; + + m_pWriter->WritePPr(arSelectors); + m_pWriter->WriteImage(oNewImageData, std::to_wstring(m_arrImages.size())); + return true; + + return true; +} + +template<> +bool CFontTag::Apply(const NSCSS::CNode& oTagNode, size_t unLevel) +{ + if (!Valid()) return false; std::wstring wsValue; - if (arSelectors.back().GetAttributeValue(L"color", wsValue)) - arSelectors.back().m_pCompiledStyle->m_oText.SetColor(wsValue, arSelectors.size()); + if (oTagNode.GetAttributeValue(L"color", wsValue)) + oTagNode.m_pCompiledStyle->m_oText.SetColor(wsValue, unLevel); - if (arSelectors.back().GetAttributeValue(L"face", wsValue)) - arSelectors.back().m_pCompiledStyle->m_oFont.SetFamily(wsValue, arSelectors.size()); + if (oTagNode.GetAttributeValue(L"face", wsValue)) + oTagNode.m_pCompiledStyle->m_oFont.SetFamily(wsValue, unLevel); - if (arSelectors.back().GetAttributeValue(L"size", wsValue)) + if (oTagNode.GetAttributeValue(L"size", wsValue)) { int nSize = 3; if(!wsValue.empty()) @@ -459,22 +464,16 @@ bool CFont::Open(const std::vector& arSelectors, con if (nSize < 1 || nSize > 7) nSize = 3; - arSelectors.back().m_pCompiledStyle->m_oFont.SetSize(HTML_FONTS[nSize - 1], NSCSS::UnitMeasure::Point, arSelectors.size()); + oTagNode.m_pCompiledStyle->m_oFont.SetSize(HTML_FONTS[nSize - 1], NSCSS::UnitMeasure::Point, unLevel); } return true; } -void CFont::Close(const std::vector& arSelectors) -{} - -CInput::CInput(COOXMLWriter* pWriter) - : CTag(pWriter) -{} - -bool CInput::Open(const std::vector& arSelectors, const boost::any& oExtraData) +template<> +bool CInputTag::Read(const std::vector& arSelectors) { - if (!ValidWriter()) + if (!Valid()) return false; std::wstring wsValue{arSelectors.back().GetAttributeValue(L"value")}; @@ -501,24 +500,18 @@ bool CInput::Open(const std::vector& arSelectors, co return true; } -void CInput::Close(const std::vector& arSelectors) -{} - -CBaseFont::CBaseFont(COOXMLWriter* pWriter) - : CTag(pWriter) -{} - -bool CBaseFont::Open(const std::vector& arSelectors, const boost::any& oExtraData) +template<> +bool CBaseFontTag::Apply(const NSCSS::CNode& oTagNode) { - if (!ValidWriter()) + if (!Valid()) return false; std::wstring wsFontStyles, wsValue; - if (arSelectors.back().GetAttributeValue(L"face", wsValue)) + if (oTagNode.GetAttributeValue(L"face", wsValue)) wsFontStyles += L"font-family:" + wsValue + L';'; - if (arSelectors.back().GetAttributeValue(L"size", wsValue)) + if (oTagNode.GetAttributeValue(L"size", wsValue)) { wsFontStyles += L"font-size:"; @@ -535,7 +528,7 @@ bool CBaseFont::Open(const std::vector& arSelectors, } } - if (arSelectors.back().GetAttributeValue(L"color", wsValue)) + if (oTagNode.GetAttributeValue(L"color", wsValue)) wsFontStyles += L"text-color:" + wsValue + L';'; if (wsFontStyles.empty()) @@ -546,16 +539,13 @@ bool CBaseFont::Open(const std::vector& arSelectors, return true; } -void CBaseFont::Close(const std::vector& arSelectors) +CBlockquoteTag::CBlockquoteTag(COOXMLWriter* pWriter) + : INTERFACE_TAGS::ITag(pWriter) {} -CBlockquote::CBlockquote(COOXMLWriter* pWriter) - : CTag(pWriter) -{} - -bool CBlockquote::Open(const std::vector& arSelectors, const boost::any& oExtraData) +bool CBlockquoteTag::Open(const std::vector& arSelectors) { - if (!ValidWriter()) + if (!Valid()) return false; //TODO:: когда Blockquote в Blockquote, то к первому нужно добавлять @@ -624,21 +614,21 @@ bool CBlockquote::Open(const std::vector& arSelector return true; } -void CBlockquote::Close(const std::vector& arSelectors) +void CBlockquoteTag::Close() { - if (!ValidWriter()) + if (!Valid()) return; m_pWriter->RollBackDivId(); } -CHorizontalRule::CHorizontalRule(COOXMLWriter* pWriter) - : CTag(pWriter), m_unShapeId(1) +CHorizontalRuleTag::CHorizontalRuleTag(COOXMLWriter* pWriter) + : INTERFACE_TAGS::ITag(pWriter), m_unShapeId(1) {} -bool CHorizontalRule::Open(const std::vector& arSelectors, const boost::any& oExtraData) +bool CHorizontalRuleTag::Write(const std::vector& arSelectors) { - if (!ValidWriter()) + if (!Valid()) return false; for (const NSCSS::CNode& item : arSelectors) @@ -730,26 +720,23 @@ bool CHorizontalRule::Open(const std::vector& arSele ++m_unShapeId; return true; + + return true; } -void CHorizontalRule::Close(const std::vector& arSelectors) -{} -CList::CList(COOXMLWriter* 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->CloseP(); //Нумерованный список - if (L"ol" == arSelectors.back().m_wsName) + if (L"ol" == oTagNode.m_wsName) { - const int nStart{NSStringFinder::ToInt(arSelectors.back().GetAttributeValue(L"start"), 1)}; + const int nStart{NSStringFinder::ToInt(oTagNode.GetAttributeValue(L"start"), 1)}; XmlString& oNumberXml{m_pWriter->GetNumberingXml()}; @@ -782,26 +769,25 @@ bool CList::Open(const std::vector& arSelectors, con return true; } -void CList::Close(const std::vector& arSelectors) +template<> +void CListTag::Close() { - if (!ValidWriter()) + if (!Valid()) return; m_pWriter->CloseP(); } -CListElement::CListElement(COOXMLWriter* pWriter) - : CTag(pWriter) -{} - -bool CListElement::Open(const std::vector& arSelectors, const boost::any& oExtraData) +template<> +bool CListElementTag::Open() { - return ValidWriter(); + return Valid(); } -void CListElement::Close(const std::vector& arSelectors) +template<> +void CListElementTag::Close() { - if (!ValidWriter()) + if (!Valid()) return; m_pWriter->CloseP(); @@ -825,7 +811,7 @@ inline bool IsSVG(const std::wstring& wsExtention) return L"svg" == wsExtention || L"svg+xml" == wsExtention; } -bool ReadSVG(const std::wstring& wsSvg, NSFonts::IApplicationFonts* pFonts, const std::wstring& wsTempDir, const std::wstring& wsImagePath) +bool ReadSVGData(const std::wstring& wsSvg, NSFonts::IApplicationFonts* pFonts, const std::wstring& wsTempDir, const std::wstring& wsImagePath) { MetaFile::IMetaFile* pSvgReader = MetaFile::Create(pFonts); if (!pSvgReader->LoadFromString(wsSvg)) @@ -948,7 +934,7 @@ bool ReadBase64(const std::wstring& wsSrc, const std::wstring& wsImagePath, NSFo if (IsSVG(wsExtention)) { std::wstring wsSvg(pImageData, pImageData + nDecodeLen); - bRes = ReadSVG(wsSvg, pFonts, wsTempDir, wsImagePath); + bRes = ReadSVGData(wsSvg, pFonts, wsTempDir, wsImagePath); wsExtention = L"png"; } else @@ -1057,28 +1043,6 @@ bool UpdateImageData(const std::wstring& wsImagePath, TImageData& oImageData) return true; } -CCaption::CCaption(COOXMLWriter* pWriter) - : CTag(pWriter) -{} - -bool CCaption::Open(const std::vector& arSelectors, const boost::any& oExtraData) -{ - if (!ValidWriter()) - return false; - - m_pWriter->WritePPr(arSelectors); - - return true; -} - -void CCaption::Close(const std::vector& arSelectors) -{ - if (!ValidWriter()) - return; - - m_pWriter->CloseP(); -} - std::wstring CreateBorders(const NSCSS::NSProperties::CBorder& oBorder, const NSCSS::NSProperties::CIndent* pPadding = NULL, bool bAddIntermediateLines = false, ETableRules enTableRule = ETableRules::None) { std::wstring wsTable; @@ -1171,39 +1135,34 @@ std::wstring CalculateSidesToClean(UINT unColumnNumber, const std::vector::CHTML(COOXMLWriter* pInterpretator) - : CTag(pInterpretator) -{} -bool CHTML::Open(const std::vector& arSelectors, const boost::any& oExtraData) +template<> +bool CHTMLTag::Apply(const NSCSS::CNode& oTagNode) { - if (!ValidWriter()) + if (!Valid()) return false; - if (!arSelectors.back().m_mAttributes.empty()) + if (oTagNode.m_mAttributes.empty()) + return true; + + std::wstring wsBackground; + if (oTagNode.GetAttributeValue(L"bgcolor", wsBackground)) { - std::wstring wsBackground; - if (arSelectors.back().GetAttributeValue(L"bgcolor", wsBackground)) + NSCSS::NSProperties::CColor oColor; + oColor.SetValue(wsBackground); + + if (!oColor.Empty() && !oColor.None()) { - NSCSS::NSProperties::CColor oColor; - oColor.SetValue(wsBackground); + const std::wstring wsHEXColor{oColor.ToHEX()}; - if (!oColor.Empty() && !oColor.None()) - { - const std::wstring wsHEXColor{oColor.ToHEX()}; - - if (!wsHEXColor.empty()) - m_pWriter->GetCurrentDocument()->WriteString(L""); - } + if (!wsHEXColor.empty()) + m_pWriter->GetCurrentDocument()->WriteString(L""); } } return true; } -void CHTML::Close(const std::vector& arSelectors) -{} - COOXMLTable::COOXMLTable(TExternalTableData* pExternalData) : CTableElement(pExternalData) {} diff --git a/HtmlFile2/Tags/OOXMLTags.h b/HtmlFile2/Tags/OOXMLTags.h index c584a8bd9e..8b48ee1ecb 100644 --- a/HtmlFile2/Tags/OOXMLTags.h +++ b/HtmlFile2/Tags/OOXMLTags.h @@ -8,133 +8,77 @@ namespace HTML { template<> -class CAnchor : public CTag -{ -public: - CAnchor(COOXMLWriter* pInterpretator); - 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 CAbbr : public CTag -{ -public: - CAbbr(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; +bool CAbbrTag::Open(const std::vector& arSelectors); +template<> +void CAbbrTag::Close(); template<> -class CBreak : public CTag -{ -public: - CBreak(COOXMLWriter* pInterpretator); - 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 CDivision : public CTag +bool CFontTag::Apply(const NSCSS::CNode& oTagNode, size_t unLevel); + +template<> +bool CInputTag::Read(const std::vector& arSelectors); + +template<> +bool CBaseFontTag::Apply(const NSCSS::CNode& oTagNode); + +template<> +bool CListTag::Open(const NSCSS::CNode& oTagNode); +template<> +void CListTag::Close(); + +template<> +bool CListElementTag::Open(); +template<> +void CListElementTag::Close(); + +template<> +bool CHTMLTag::Apply(const NSCSS::CNode& oTagNode); + +#define CLASS_TAG_LIGHT(class_name)\ +template<>\ +class C ## class_name ## Tag : public INTERFACE_TAGS::I ## class_name ## Tag, public INTERFACE_TAGS::ITag + +CLASS_TAG_LIGHT(Division) { std::stack m_arFootnoteIDs; public: - CDivision(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; + CDivisionTag(COOXMLWriter* pWriter); + bool Open(const std::vector& arSelectors) override; + void Close() override; }; -template<> -class CImage : public CTag +CLASS_TAG_LIGHT(Image) { std::vector m_arrImages; public: - CImage(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; + CImageTag(COOXMLWriter* pWriter); + bool Read(const std::vector& arSelectors) override; + bool ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG) override; }; -template<> -class CFont : public CTag -{ -public: - CFont(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; - -template<> -class CInput : public CTag -{ -public: - CInput(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; - -template<> -class CBaseFont : public CTag -{ -public: - CBaseFont(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; - -template<> -class CBlockquote : public CTag +CLASS_TAG_LIGHT(Blockquote) { std::map m_mDivs; public: - CBlockquote(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; + CBlockquoteTag(COOXMLWriter* pWriter); + bool Open(const std::vector& arSelectors) override; + void Close() override; }; -template<> -class CHorizontalRule : public CTag +CLASS_TAG_LIGHT(HorizontalRule) { UINT m_unShapeId; public: - CHorizontalRule(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; - -template<> -class CList : public CTag -{ -public: - CList(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; - -template<> -class CListElement : public CTag -{ -public: - CListElement(COOXMLWriter* pInterpretator); - virtual bool Open(const std::vector& arSelectors, const boost::any& oExtraData = boost::any()) override; - virtual void Close(const std::vector& arSelectors) override; -}; - -template<> -class CCaption : public CTag -{ -public: - CCaption(COOXMLWriter* pInterpretator); - 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; + CHorizontalRuleTag(COOXMLWriter* pWriter); + bool Write(const std::vector& arSelectors) override; }; enum class ETableRules diff --git a/HtmlFile2/Writers/IWriter.h b/HtmlFile2/Writers/IWriter.h index d36f70ae2c..ca93402c1f 100644 --- a/HtmlFile2/Writers/IWriter.h +++ b/HtmlFile2/Writers/IWriter.h @@ -36,9 +36,6 @@ public: virtual XmlString* GetCurrentDocument() const = 0; virtual EWriterType GetType() const = 0; - - //TODO:: перенести разруливание вложенных таблиц в конвертацию после изменения принципа работы с таблицами - virtual bool SupportNestedTables() const = 0; }; } diff --git a/HtmlFile2/Writers/MDWriter.cpp b/HtmlFile2/Writers/MDWriter.cpp index 5676a54585..cba05a29ac 100644 --- a/HtmlFile2/Writers/MDWriter.cpp +++ b/HtmlFile2/Writers/MDWriter.cpp @@ -282,11 +282,6 @@ EWriterType CMDWriter::GetType() const return EWriterType::Markdown; } -bool CMDWriter::SupportNestedTables() const -{ - return false; -} - void CMDWriter::WriteBreakLine(bool bNeedChecked) { if (bNeedChecked && !m_arStates.top().m_bNeedBreakLine) diff --git a/HtmlFile2/Writers/MDWriter.h b/HtmlFile2/Writers/MDWriter.h index 341edd101d..3e3a79cbb2 100644 --- a/HtmlFile2/Writers/MDWriter.h +++ b/HtmlFile2/Writers/MDWriter.h @@ -67,8 +67,6 @@ public: EWriterType GetType() const override; - bool SupportNestedTables() const override; - void WriteBreakLine(bool bNeedChecked = true); void EnteredBold(); diff --git a/HtmlFile2/Writers/OOXMLWriter.cpp b/HtmlFile2/Writers/OOXMLWriter.cpp index dc0096506b..521b261d73 100644 --- a/HtmlFile2/Writers/OOXMLWriter.cpp +++ b/HtmlFile2/Writers/OOXMLWriter.cpp @@ -557,12 +557,12 @@ void COOXMLWriter::SetCurrentDocument(XmlString* pNewDocument) m_arStates.top().m_bRemoveCurrentDocument = false; } -void COOXMLWriter::Break(const std::vector& arSelectors) +void COOXMLWriter::Break(const NSCSS::CNode& oTagNode) { if (m_arStates.top().m_bInP) { OpenR(); - if(arSelectors.back().m_pCompiledStyle->m_oText.GetAlign() == L"both") + if(oTagNode.m_pCompiledStyle->m_oText.GetAlign() == L"both") m_arStates.top().m_pCurrentDocument->WriteString(L""); m_arStates.top().m_pCurrentDocument->WriteString(L""); CloseR(); @@ -1266,11 +1266,6 @@ EWriterType COOXMLWriter::GetType() const return EWriterType::OOXML; } -bool COOXMLWriter::SupportNestedTables() const -{ - return true; -} - const NSCSS::NSProperties::CPage* COOXMLWriter::GetPageData() const { return &m_oPageData; diff --git a/HtmlFile2/Writers/OOXMLWriter.h b/HtmlFile2/Writers/OOXMLWriter.h index 7081a71bf9..19e3cd4291 100644 --- a/HtmlFile2/Writers/OOXMLWriter.h +++ b/HtmlFile2/Writers/OOXMLWriter.h @@ -150,7 +150,7 @@ public: void SetCurrentDocument(XmlString* pNewDocument); - void Break(const std::vector& arSelectors); + void Break(const NSCSS::CNode& oTagNode); void SetHyperlinkData(const std::wstring& wsRef, const std::wstring& wsTooltip, bool bIsCross, const std::wstring& wsFootnote, bool bIsFootnote); void ClearHyperlinkData(); @@ -202,8 +202,6 @@ public: EWriterType GetType() const override; - bool SupportNestedTables() const override; - const NSCSS::NSProperties::CPage* GetPageData() const; NSFonts::IApplicationFonts* GetFonts();