diff --git a/HtmlFile2/HTMLReader.cpp b/HtmlFile2/HTMLReader.cpp index 3e3b5854d6..ec8d10abac 100644 --- a/HtmlFile2/HTMLReader.cpp +++ b/HtmlFile2/HTMLReader.cpp @@ -28,6 +28,7 @@ namespace HTML #define SKIP_TAG SCRIPT #define UNKNOWN_TAG GumboTag::GUMBO_TAG_UNKNOWN #define HtmlTag GumboTag +#define EMPTY_TAG GumboTag::GUMBO_TAG_UNKNOWN const static std::map m_HTML_TAGS { @@ -333,7 +334,7 @@ void CHTMLReader::Clear() if (nullptr != m_pWriter) delete m_pWriter; - m_oTags.Clear(); + m_mTags.clear(); m_wsSrcDirectory .clear(); m_wsDstDirectory .clear(); @@ -364,13 +365,7 @@ bool CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs) pWriter->SetBaseDirectory(m_wsBaseDirectory); pWriter->SetCoreDirectory(m_wsCoreDirectory); - m_oTags.Clear(); - - if (!m_oTags.Init(pWriter)) - { - delete pWriter; - return false; - } + InitTagsForOOXML(m_mTags, pWriter); TExternalTableData oExternalData; @@ -413,13 +408,7 @@ bool CHTMLReader::InitMDTags(TMarkdownParameters* pParametrs) pWriter->SetBaseDirectory(m_wsBaseDirectory); pWriter->SetCoreDirectory(m_wsCoreDirectory); - m_oTags.Clear(); - - if (!m_oTags.Init(pWriter)) - { - delete pWriter; - return false; - } + InitTagsForMD(m_mTags, pWriter); TExternalTableData oExternalData; @@ -648,7 +637,7 @@ void CHTMLReader::ReadBody(XmlUtils::CXmlLiteReader& oReader) GetSubClass(oReader, arSelectors, m_oCSSCalculator); - if (!m_oTags.m_pHTML->Apply(arSelectors.back())) + if (!GetTag(HTML_TAG(HTML)).get()->Open(arSelectors)) return; std::map::iterator itFound = arSelectors.back().m_mAttributes.find(L"bgcolor"); @@ -715,25 +704,17 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen(arSelectors)) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pAnchor->Close(arSelectors.back()); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(A))); break; } case HTML_TAG(ABBR): { - if (m_oTags.m_pAbbr->Open(arSelectors)) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pAbbr->Close(); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(ABBR))); break; } case HTML_TAG(BR): { - bResult = m_oTags.m_pBreak->Read(arSelectors.back()); + bResult = ReadEmptyTag(oReader, arSelectors, GetTag(HTML_TAG(BR))); break; } case HTML_TAG(CODE): @@ -742,48 +723,38 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen(arSelectors.back())) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pCode->Close(); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(CODE))); break; } case HTML_TAG(FONT): { - m_oTags.m_pFont->Apply(arSelectors.back(), arSelectors.size()); - bResult = ReadStream(oReader, arSelectors); + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(FONT))); break; } case HTML_TAG(IMG): { - bResult = m_oTags.m_pImage->Read(arSelectors); + bResult = ReadEmptyTag(oReader, arSelectors, GetTag(HTML_TAG(IMG))); break; } case HTML_TAG(SVG): { - bResult = m_oTags.m_pImage->ReadSVG(arSelectors, oReader.GetOuterXml()); + arSelectors.back().m_mAttributes.insert(std::make_pair(L"svg-text", oReader.GetOuterXml())); + bResult = ReadEmptyTag(oReader, arSelectors, GetTag(HTML_TAG(IMG))); break; } case HTML_TAG(INPUT): { - m_oTags.m_pInput->Read(arSelectors); - bResult = ReadStream(oReader, arSelectors); + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(INPUT))); break; } case HTML_TAG(NOBR): { - if (m_oTags.m_pPreformatted->Open()) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pPreformatted->Close(arSelectors); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(NOBR))); break; } case HTML_TAG(BASEFONT): { - m_oTags.m_pBaseFont->Apply(arSelectors.back()); - bResult = ReadStream(oReader, arSelectors); + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(BASEFONT))); break; } case HTML_TAG(BUTTON): @@ -859,56 +830,34 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen(arSelectors.back())) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pHeader->Close(); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(H1))); break; } case HTML_TAG(ASIDE): case HTML_TAG(DIV): { - if (m_oTags.m_pDivision->Open(arSelectors)) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pDivision->Close(); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(DIV))); break; } case HTML_TAG(BLOCKQUOTE): { - if (m_oTags.m_pBlockquote->Open(arSelectors)) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pBlockquote->Close(); - } - + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(BLOCKQUOTE))); break; } case HTML_TAG(HR): { - bResult = true; - m_oTags.m_pHorizontalRule->Write(arSelectors); + bResult = ReadEmptyTag(oReader, arSelectors, GetTag(HTML_TAG(HR))); break; } case HTML_TAG(LI): { - if (m_oTags.m_pListElement->Open()) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pListElement->Close(); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(LI))); break; } case HTML_TAG(OL): case HTML_TAG(UL): { - if (m_oTags.m_pList->Open(arSelectors.back())) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pList->Close(); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(OL))); break; } // case HTML_TAG(MENU): @@ -922,11 +871,7 @@ bool CHTMLReader::ReadInside(XmlUtils::CXmlLiteReader& oReader, std::vectorOpen()) - { - bResult = ReadStream(oReader, arSelectors); - m_oTags.m_pPreformatted->Close(arSelectors); - } + bResult = ReadTag(oReader, arSelectors, GetTag(HTML_TAG(PRE))); break; } case HTML_TAG(TABLE): @@ -1020,6 +965,36 @@ bool CHTMLReader::ReadTable(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, std::shared_ptr pTag) +{ + if (!pTag.get()->Open(arSelectors)) + return false; + + pTag.get()->Close(arSelectors); + + return true; +} + +bool CHTMLReader::ReadTag(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, std::shared_ptr pTag) +{ + if (!pTag.get()->Open(arSelectors)) + return false; + + const bool bResult{ReadStream(oReader, arSelectors)}; + + pTag.get()->Close(arSelectors); + + return bResult; +} + +std::shared_ptr CHTMLReader::GetTag(int nTag) +{ + if(m_mTags.cend() != m_mTags.find(nTag)) + return m_mTags[nTag]; + + return std::make_shared(); +} + void CHTMLReader::AddStopTag(const std::wstring& wsTag) { m_arStopTags.insert(wsTag); diff --git a/HtmlFile2/HTMLReader.h b/HtmlFile2/HTMLReader.h index 167cb2fb0c..ee8f7f3495 100644 --- a/HtmlFile2/HTMLReader.h +++ b/HtmlFile2/HTMLReader.h @@ -32,7 +32,7 @@ class CHTMLReader std::set m_arStopTags; - THTMLTags m_oTags; + std::map> m_mTags; public: CHTMLReader(); ~CHTMLReader(); @@ -82,6 +82,11 @@ private: bool ReadTable(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors); + bool ReadEmptyTag(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, std::shared_ptr pTag); + bool ReadTag(XmlUtils::CXmlLiteReader& oReader, std::vector& arSelectors, std::shared_ptr pTag); + + std::shared_ptr GetTag(int nTag); + void AddStopTag(const std::wstring& wsTag); void ClearStopTags(); }; diff --git a/HtmlFile2/Tags/HTMLTags.h b/HtmlFile2/Tags/HTMLTags.h index 49d9458144..0893be5666 100644 --- a/HtmlFile2/Tags/HTMLTags.h +++ b/HtmlFile2/Tags/HTMLTags.h @@ -5,279 +5,53 @@ namespace HTML { -namespace INTERFACE_TAGS -{ -#define OPEN_INTERFACE_TAG(tag_name)\ -class I ## tag_name ## Tag\ -{\ -public:\ - virtual ~I ## tag_name ## Tag() = default; - -#define ADD_INTERFACE_METHOD(return_type, method_name, ...) virtual return_type method_name(__VA_ARGS__) = 0 -#define ADD_BOOL_INTERFACE_METHOD(method_name, ...) ADD_INTERFACE_METHOD(bool, method_name, __VA_ARGS__) -#define ADD_VOID_INTERFACE_METHOD(method_name, ...) ADD_INTERFACE_METHOD(void, method_name, __VA_ARGS__) - -#define CLOSE_INTERFACE_TAG() }; - -OPEN_INTERFACE_TAG(Anchor) - ADD_BOOL_INTERFACE_METHOD(Open, const std::vector& arSelectors); - ADD_VOID_INTERFACE_METHOD(Close, const NSCSS::CNode& oTagNode); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Abbr) - ADD_BOOL_INTERFACE_METHOD(Open, const std::vector& arSelectors); - ADD_VOID_INTERFACE_METHOD(Close); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Break) - ADD_BOOL_INTERFACE_METHOD(Read, const NSCSS::CNode& oTagNode); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Preformatted) - ADD_BOOL_INTERFACE_METHOD(Open); - ADD_VOID_INTERFACE_METHOD(Close, const std::vector& arSelectors); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Header) - ADD_BOOL_INTERFACE_METHOD(Open, const NSCSS::CNode& oTagNode); - ADD_VOID_INTERFACE_METHOD(Close); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Division) - ADD_BOOL_INTERFACE_METHOD(Open, const std::vector& arSelectors); - ADD_VOID_INTERFACE_METHOD(Close); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Image) - ADD_BOOL_INTERFACE_METHOD(Read, const std::vector& arSelectors); - ADD_BOOL_INTERFACE_METHOD(ReadSVG, const std::vector& arSelectors, const std::wstring& wsSVG); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Font) - ADD_BOOL_INTERFACE_METHOD(Apply, const NSCSS::CNode& oTagNode, size_t unLevel); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Input) - ADD_BOOL_INTERFACE_METHOD(Read, const std::vector& arSelectors); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(BaseFont) - ADD_BOOL_INTERFACE_METHOD(Apply, const NSCSS::CNode& oTagNode); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Blockquote) - ADD_BOOL_INTERFACE_METHOD(Open, const std::vector& arSelectors); - ADD_VOID_INTERFACE_METHOD(Close); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(List) - ADD_BOOL_INTERFACE_METHOD(Open, const NSCSS::CNode& oTagNode); - ADD_VOID_INTERFACE_METHOD(Close); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(HorizontalRule) - ADD_BOOL_INTERFACE_METHOD(Write, const std::vector& arSelectors); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(ListElement) - ADD_BOOL_INTERFACE_METHOD(Open); - ADD_VOID_INTERFACE_METHOD(Close); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(Code) - ADD_BOOL_INTERFACE_METHOD(Open, const NSCSS::CNode& oTagNode); - ADD_VOID_INTERFACE_METHOD(Close); -CLOSE_INTERFACE_TAG() - -OPEN_INTERFACE_TAG(HTML) - ADD_BOOL_INTERFACE_METHOD(Apply, const NSCSS::CNode& oTagNode); -CLOSE_INTERFACE_TAG() - -template class ITag { public: + ITag() = default; virtual ~ITag() = default; + + virtual bool Open (const std::vector& arSelectors) = 0; + virtual void Close(const std::vector& arSelectors) = 0; +}; + +template +class IHTMLTag : public ITag +{ protected: - ITag(Writer *pWriter) - : m_pWriter(pWriter) - {} + Writer* m_pWriter; bool Valid() const { return nullptr != m_pWriter; } +public: + IHTMLTag(Writer* pWriter) + : m_pWriter(pWriter) {}; + virtual ~IHTMLTag() = default; - Writer *m_pWriter; + virtual bool Open (const std::vector& arSelectors) = 0; + virtual void Close(const std::vector& arSelectors) = 0; }; -} -#define OPEN_CLASS_TAG(class_name)\ -template\ -class C ## class_name ## Tag : public INTERFACE_TAGS::I ## class_name ## Tag, public INTERFACE_TAGS::ITag\ +#define CREATE_TAG(tag_name, writer)\ +class C ## tag_name ## Tag : public IHTMLTag\ {\ public:\ - C ## class_name ## Tag(Writer *pWriter) : INTERFACE_TAGS::ITag(pWriter) {} + C ## tag_name ## Tag(writer *pWriter)\ + : IHTMLTag(pWriter) {}\ + \ + bool Open (const std::vector& arSelectors) override;\ + void Close(const std::vector& arSelectors) override;\ +} -#define CLOSE_CLASS_TAG() }; - -#define ADD_CLASS_METHOD(return_type, method_name, ...) virtual return_type method_name(__VA_ARGS__) -#define ADD_BOOL_CLASS_METHOD(method_name, ...) ADD_CLASS_METHOD(bool, method_name, __VA_ARGS__) override { return true; } -#define ADD_VOID_CLASS_METHOD(method_name, ...) ADD_CLASS_METHOD(void, method_name, __VA_ARGS__) override {} - -OPEN_CLASS_TAG(Anchor) - ADD_BOOL_CLASS_METHOD(Open, const std::vector& arSelectors); - ADD_VOID_CLASS_METHOD(Close, const NSCSS::CNode& oTagNode); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Abbr) - ADD_BOOL_CLASS_METHOD(Open, const std::vector& arSelectors); - ADD_VOID_CLASS_METHOD(Close); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Break) - ADD_BOOL_CLASS_METHOD(Read, const NSCSS::CNode& oTagNode); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Preformatted) - ADD_BOOL_CLASS_METHOD(Open); - ADD_VOID_CLASS_METHOD(Close, const std::vector& arSelectors); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Header) - ADD_BOOL_CLASS_METHOD(Open, const NSCSS::CNode& oTagNode); - ADD_VOID_CLASS_METHOD(Close); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Division) - ADD_BOOL_CLASS_METHOD(Open, const std::vector& arSelectors); - ADD_VOID_CLASS_METHOD(Close); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Image) - ADD_BOOL_CLASS_METHOD(Read, const std::vector& arSelectors); - ADD_BOOL_CLASS_METHOD(ReadSVG, const std::vector& arSelectors, const std::wstring& wsSVG); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Font) - ADD_BOOL_CLASS_METHOD(Apply, const NSCSS::CNode& oTagNode, size_t unLevel); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Input) - ADD_BOOL_CLASS_METHOD(Read, const std::vector& arSelectors); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(BaseFont) - ADD_BOOL_CLASS_METHOD(Apply, const NSCSS::CNode& oTagNode); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Blockquote) - ADD_BOOL_CLASS_METHOD(Open, const std::vector& arSelectors); - ADD_VOID_CLASS_METHOD(Close); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(List) - ADD_BOOL_CLASS_METHOD(Open, const NSCSS::CNode& oTagNode); - ADD_VOID_CLASS_METHOD(Close); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(HorizontalRule) - ADD_BOOL_CLASS_METHOD(Write, const std::vector& arSelectors); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(ListElement) - ADD_BOOL_CLASS_METHOD(Open); - ADD_VOID_CLASS_METHOD(Close); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(Code) - ADD_BOOL_CLASS_METHOD(Open, const NSCSS::CNode& oTagNode); - ADD_VOID_CLASS_METHOD(Close); -CLOSE_CLASS_TAG() - -OPEN_CLASS_TAG(HTML) - ADD_BOOL_CLASS_METHOD(Apply, const NSCSS::CNode& oTagNode); -CLOSE_CLASS_TAG() - -#define ADD_HTML_TAG(class_name) INTERFACE_TAGS::I ## class_name ## Tag *m_p##class_name{nullptr} - -struct THTMLTags +class CEmptyTag : public ITag { - ADD_HTML_TAG(Anchor); - ADD_HTML_TAG(Abbr); - ADD_HTML_TAG(Break); - ADD_HTML_TAG(Preformatted); - ADD_HTML_TAG(Header); - ADD_HTML_TAG(Division); - ADD_HTML_TAG(Image); - ADD_HTML_TAG(Font); - ADD_HTML_TAG(Input); - ADD_HTML_TAG(BaseFont); - ADD_HTML_TAG(Blockquote); - ADD_HTML_TAG(List); - ADD_HTML_TAG(HorizontalRule); - ADD_HTML_TAG(ListElement); - ADD_HTML_TAG(Code); - ADD_HTML_TAG(HTML); +public: + CEmptyTag() = default; - ~THTMLTags() - { - Clear(); - } - - void Clear() - { - #define CLEAR_VARIABLE(class_name)\ - if (nullptr == m_p##class_name)\ - delete m_p##class_name - - CLEAR_VARIABLE(Anchor); - CLEAR_VARIABLE(Abbr); - CLEAR_VARIABLE(Break); - CLEAR_VARIABLE(Preformatted); - CLEAR_VARIABLE(Header); - CLEAR_VARIABLE(Division); - CLEAR_VARIABLE(Image); - CLEAR_VARIABLE(Font); - CLEAR_VARIABLE(Input); - CLEAR_VARIABLE(BaseFont); - CLEAR_VARIABLE(Blockquote); - CLEAR_VARIABLE(List); - CLEAR_VARIABLE(HorizontalRule); - CLEAR_VARIABLE(ListElement); - CLEAR_VARIABLE(Code); - CLEAR_VARIABLE(HTML); - } - - template - bool Init(Writer *pWriter) - { - #define INIT_VARIABLE(class_name) m_p##class_name = new C ## class_name ## Tag(pWriter);\ - if (nullptr == m_p##class_name)\ - {\ - Clear();\ - return false;\ - } - - INIT_VARIABLE(Anchor); - INIT_VARIABLE(Abbr); - INIT_VARIABLE(Break); - INIT_VARIABLE(Preformatted); - INIT_VARIABLE(Header); - INIT_VARIABLE(Division); - INIT_VARIABLE(Image); - INIT_VARIABLE(Font); - INIT_VARIABLE(Input); - INIT_VARIABLE(BaseFont); - INIT_VARIABLE(Blockquote); - INIT_VARIABLE(List); - INIT_VARIABLE(HorizontalRule); - INIT_VARIABLE(ListElement); - INIT_VARIABLE(Code); - INIT_VARIABLE(HTML); - - return true; - } + bool Open (const std::vector& arSelectors) override { return true; } + void Close(const std::vector& arSelectors) override {}; }; } #endif // HTMLTAGS_H diff --git a/HtmlFile2/Tags/MDTags.cpp b/HtmlFile2/Tags/MDTags.cpp index b9e4446ea0..86a2400af6 100644 --- a/HtmlFile2/Tags/MDTags.cpp +++ b/HtmlFile2/Tags/MDTags.cpp @@ -15,9 +15,27 @@ #include "../../DesktopEditor/graphics/pro/Graphics.h" #include "../../DesktopEditor/raster/BgraFrame.h" +#include "../../Common/3dParty/html/gumbo-parser/src/gumbo.h" + namespace HTML { -bool CAnchorTag::Open(const std::vector& arSelectors) +void InitTagsForMD(std::map>& mTags, CMDWriter* pWriter) +{ + #define HTML_TAG(tag) GUMBO_TAG_##tag + + mTags[HTML_TAG(A)] = std::make_shared (pWriter); + mTags[HTML_TAG(BR)] = std::make_shared (pWriter); + mTags[HTML_TAG(PRE)] = std::make_shared (pWriter); + mTags[HTML_TAG(H1)] = std::make_shared (pWriter); + mTags[HTML_TAG(IMG)] = std::make_shared (pWriter); + mTags[HTML_TAG(HR)] = std::make_shared(pWriter); + mTags[HTML_TAG(BLOCKQUOTE)] = std::make_shared (pWriter); + mTags[HTML_TAG(OL)] = std::make_shared (pWriter); + mTags[HTML_TAG(LI)] = std::make_shared (pWriter); + mTags[HTML_TAG(CODE)] = std::make_shared (pWriter); +} + +bool CAnchorMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -26,7 +44,7 @@ bool CAnchorTag::Open(const std::vector& arSelectors) return true; } -void CAnchorTag::Close(const NSCSS::CNode& oTagNode) +void CAnchorMDTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -35,8 +53,8 @@ void CAnchorTag::Close(const NSCSS::CNode& oTagNode) std::wstring wsHref, wsTitle; - oTagNode.GetAttributeValue(L"href", wsHref); - oTagNode.GetAttributeValue(L"title", wsTitle); + arSelectors.back().GetAttributeValue(L"href", wsHref); + arSelectors.back().GetAttributeValue(L"title", wsTitle); m_pWriter->WriteString(L'(' + wsHref); @@ -46,7 +64,7 @@ void CAnchorTag::Close(const NSCSS::CNode& oTagNode) m_pWriter->WriteString(L")"); } -bool CBreakTag::Read(const NSCSS::CNode& oTagNode) +bool CBreakMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -56,7 +74,10 @@ bool CBreakTag::Read(const NSCSS::CNode& oTagNode) return true; } -bool CPreformattedTag::Open() +void CBreakMDTag::Close(const std::vector& arSelectors) +{} + +bool CPreformattedMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -67,7 +88,7 @@ bool CPreformattedTag::Open() return true; } -void CPreformattedTag::Close(const std::vector& arSelectors) +void CPreformattedMDTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -93,12 +114,12 @@ void CPreformattedTag::Close(const std::vector& arSelec m_pWriter->WriteBreakLine(false); } -bool CHeaderTag::Open(const NSCSS::CNode& oTagNode) +bool CHeaderMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; - switch(oTagNode.m_wsName[1]) + switch(arSelectors.back().m_wsName[1]) { case L'1' : m_pWriter->WriteString(L"# ", true); break; case L'2' : m_pWriter->WriteString(L"## ", true); break; @@ -113,7 +134,7 @@ bool CHeaderTag::Open(const NSCSS::CNode& oTagNode) return true; } -void CHeaderTag::Close() +void CHeaderMDTag::Close(const std::vector& arSelectors) { if (Valid()) m_pWriter->WriteBreakLine(); @@ -376,11 +397,21 @@ bool ConvertFileToBase64(const std::wstring& wsFilePath, UINT unWidth, UINT unHe return bResult; } -bool CImageTag::Read(const std::vector& arSelectors) +bool CImageMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; + if (L"svg" == arSelectors.back().m_wsName) + { + std::wstring wsBase64; + + if (!ConvertFromSVG(arSelectors.back().GetAttributeValue(L"svg-text"), 0, 0, m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsBase64)) + return false; + + m_pWriter->WriteString(L"![](" + wsBase64 + L")"); + } + std::wstring wsAlt, wsSrc, wsTitle; if (!arSelectors.back().GetAttributeValue(L"src", wsSrc) && @@ -484,22 +515,10 @@ bool CImageTag::Read(const std::vector& arSelectors) return true; } -bool CImageTag::ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG) -{ - if (!Valid()) - return false; +void CImageMDTag::Close(const std::vector& arSelectors) +{} - std::wstring wsBase64; - - if (!ConvertFromSVG(wsSVG, 0, 0, m_pWriter->GetFonts(), m_pWriter->GetTempDir(), wsBase64)) - return false; - - m_pWriter->WriteString(L"![](" + wsBase64 + L")"); - - return true; -} - -bool CHorizontalRuleTag::Write(const std::vector& arSelectors) +bool CHorizontalRuleMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -511,7 +530,10 @@ bool CHorizontalRuleTag::Write(const std::vector& arSel return true; } -bool CBlockquoteTag::Open(const std::vector& arSelectors) +void CHorizontalRuleMDTag::Close(const std::vector& arSelectors) +{} + +bool CBlockquoteMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -522,7 +544,7 @@ bool CBlockquoteTag::Open(const std::vector& arSelector return true; } -void CBlockquoteTag::Close() +void CBlockquoteMDTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -532,20 +554,20 @@ void CBlockquoteTag::Close() m_pWriter->WriteBreakLine(false); } -bool CListTag::Open(const NSCSS::CNode& oTagNode) +bool CListMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; m_pWriter->WriteBreakLine(); - m_pWriter->EnteredList(L"ol" == oTagNode.m_wsName); + m_pWriter->EnteredList(L"ol" == arSelectors.back().m_wsName); if (!m_pWriter->InOrederedList()) return true; std::wstring wsIndex; - if (oTagNode.GetAttributeValue(L"start", wsIndex)) + if (arSelectors.back().GetAttributeValue(L"start", wsIndex)) m_pWriter->SetIndexOrderedList(NSStringFinder::ToInt(wsIndex, 1)); return true; @@ -553,7 +575,7 @@ bool CListTag::Open(const NSCSS::CNode& oTagNode) return true; } -void CListTag::Close() +void CListMDTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -561,7 +583,7 @@ void CListTag::Close() m_pWriter->OutList(); } -bool CListElementTag::Open() +bool CListElementMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -583,10 +605,10 @@ bool CListElementTag::Open() return true; } -void CListElementTag::Close() +void CListElementMDTag::Close(const std::vector& arSelectors) {} -bool CCodeTag::Open(const NSCSS::CNode& oTagNode) +bool CCodeMDTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -595,9 +617,9 @@ bool CCodeTag::Open(const NSCSS::CNode& oTagNode) if (m_pWriter->InPreformatted()) { - if (!oTagNode.m_wsClass.empty() && oTagNode.m_wsClass.size() >= 9 && - 0 == oTagNode.m_wsClass.compare(0, 9, L"language-")) - m_pWriter->WriteString(oTagNode.m_wsClass.substr(9, oTagNode.m_wsClass.size() - 9)); + if (!arSelectors.back().m_wsClass.empty() && arSelectors.back().m_wsClass.size() >= 9 && + 0 == arSelectors.back().m_wsClass.compare(0, 9, L"language-")) + m_pWriter->WriteString(arSelectors.back().m_wsClass.substr(9, arSelectors.back().m_wsClass.size() - 9)); m_pWriter->WriteBreakLine(false); } else @@ -606,7 +628,7 @@ bool CCodeTag::Open(const NSCSS::CNode& oTagNode) return true; } -void CCodeTag::Close() +void CCodeMDTag::Close(const std::vector& arSelectors) { if (!Valid()) return; diff --git a/HtmlFile2/Tags/MDTags.h b/HtmlFile2/Tags/MDTags.h index 63cbfa71cd..8b4f37868d 100644 --- a/HtmlFile2/Tags/MDTags.h +++ b/HtmlFile2/Tags/MDTags.h @@ -5,89 +5,24 @@ #include "../Writers/MDWriter.h" #include "../Table.h" +#include + namespace HTML { -#define CLASS_TAG_LIGHT_MD(class_name)\ -template<>\ -class C ## class_name ## Tag : public INTERFACE_TAGS::I ## class_name ## Tag, public INTERFACE_TAGS::ITag +#define CREATE_MD_TAG(class_name) CREATE_TAG(class_name##MD, CMDWriter) -CLASS_TAG_LIGHT_MD(Anchor) -{ -public: - CAnchorTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open(const std::vector& arSelectors) override; - void Close(const NSCSS::CNode& oTagNode) override; -}; +CREATE_MD_TAG(Anchor); +CREATE_MD_TAG(Break); +CREATE_MD_TAG(Preformatted); +CREATE_MD_TAG(Header); +CREATE_MD_TAG(Image); +CREATE_MD_TAG(HorizontalRule); +CREATE_MD_TAG(Blockquote); +CREATE_MD_TAG(List); +CREATE_MD_TAG(ListElement); +CREATE_MD_TAG(Code); -CLASS_TAG_LIGHT_MD(Break) -{ -public: - CBreakTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Read(const NSCSS::CNode& oTagNode) override; -}; - -CLASS_TAG_LIGHT_MD(Preformatted) -{ -public: - CPreformattedTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open() override; - void Close(const std::vector& arSelectors) override; -}; - -CLASS_TAG_LIGHT_MD(Header) -{ -public: - CHeaderTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open(const NSCSS::CNode& oTagNode) override; - void Close() override; -}; - -CLASS_TAG_LIGHT_MD(Image) -{ -public: - CImageTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Read(const std::vector& arSelectors) override; - bool ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG) override; -}; - -CLASS_TAG_LIGHT_MD(Blockquote) -{ -public: - CBlockquoteTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open(const std::vector& arSelectors) override; - void Close() override; -}; - -CLASS_TAG_LIGHT_MD(List) -{ -public: - CListTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open(const NSCSS::CNode& oTagNode) override; - void Close() override; -}; - -CLASS_TAG_LIGHT_MD(HorizontalRule) -{ -public: - CHorizontalRuleTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Write(const std::vector& arSelectors) override; -}; - -CLASS_TAG_LIGHT_MD(ListElement) -{ -public: - CListElementTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open() override; - void Close() override; -}; - -CLASS_TAG_LIGHT_MD(Code) -{ -public: - CCodeTag(CMDWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open(const NSCSS::CNode& oTagNode) override; - void Close() override; -}; +void InitTagsForMD(std::map>& mTags, CMDWriter* pWriter); struct TElementInfo { diff --git a/HtmlFile2/Tags/OOXMLTags.cpp b/HtmlFile2/Tags/OOXMLTags.cpp index ba13b7f399..f68caa57ae 100644 --- a/HtmlFile2/Tags/OOXMLTags.cpp +++ b/HtmlFile2/Tags/OOXMLTags.cpp @@ -11,7 +11,7 @@ #include "../../DesktopEditor/common/File.h" #include "../../DesktopEditor/common/Path.h" -#include +#include "../../Common/3dParty/html/gumbo-parser/src/gumbo.h" namespace HTML { @@ -37,7 +37,26 @@ bool UpdateImageData(const std::wstring& wsImagePath, TImageData& oImageData); const static double HTML_FONTS[7] = {7.5, 10, 12, 13.5, 18, 24, 36}; -bool CAnchorTag::Open(const std::vector& arSelectors) +void InitTagsForOOXML(std::map >& mTags, COOXMLWriter* pWriter) +{ + #define HTML_TAG(tag) GUMBO_TAG_##tag + + mTags[HTML_TAG(A)] = std::make_shared (pWriter); + mTags[HTML_TAG(ABBR)] = std::make_shared (pWriter); + mTags[HTML_TAG(BR)] = std::make_shared (pWriter); + mTags[HTML_TAG(FONT)] = std::make_shared (pWriter); + mTags[HTML_TAG(INPUT)] = std::make_shared (pWriter); + mTags[HTML_TAG(BASEFONT)] = std::make_shared (pWriter); + mTags[HTML_TAG(OL)] = std::make_shared (pWriter); + mTags[HTML_TAG(LI)] = std::make_shared (pWriter); + mTags[HTML_TAG(HTML)] = std::make_shared (pWriter); + mTags[HTML_TAG(DIV)] = std::make_shared (pWriter); + mTags[HTML_TAG(IMG)] = std::make_shared (pWriter); + mTags[HTML_TAG(BLOCKQUOTE)] = std::make_shared (pWriter); + mTags[HTML_TAG(HR)] = std::make_shared(pWriter); +} + +bool CAnchorOOXMLTag::Open(const std::vector& arSelectors) { if(!Valid()) return false; @@ -83,7 +102,7 @@ bool CAnchorTag::Open(const std::vector& arSelectors return true; } -void CAnchorTag::Close(const NSCSS::CNode& oTagNode) +void CAnchorOOXMLTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -91,7 +110,7 @@ void CAnchorTag::Close(const NSCSS::CNode& oTagNode) m_pWriter->ClearHyperlinkData(); } -bool CAbbrTag::Open(const std::vector& arSelectors) +bool CAbbrOOXMLTag::Open(const std::vector& arSelectors) { if(!Valid()) return false; @@ -113,7 +132,7 @@ bool CAbbrTag::Open(const std::vector& arSelectors) return true; } -void CAbbrTag::Close() +void CAbbrOOXMLTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -121,21 +140,24 @@ void CAbbrTag::Close() m_pWriter->GetCurrentDocument()->WriteString(L""); } -bool CBreakTag::Read(const NSCSS::CNode& oTagNode) +bool CBreakOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; - m_pWriter->Break(oTagNode); + m_pWriter->Break(arSelectors.back()); return true; } -CDivisionTag::CDivisionTag(COOXMLWriter* pWriter) - : INTERFACE_TAGS::ITag(pWriter) +void CBreakOOXMLTag::Close(const std::vector& arSelectors) {} -bool CDivisionTag::Open(const std::vector& arSelectors) +CDivisionOOXMLTag::CDivisionOOXMLTag(COOXMLWriter* pWriter) + : IHTMLTag(pWriter) +{} + +bool CDivisionOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -166,12 +188,12 @@ bool CDivisionTag::Open(const std::vector& arSelecto } } - // m_arFootnoteIDs.push(unMsoFootnote); + m_arFootnoteIDs.push(unMsoFootnote); return true; } -void CDivisionTag::Close() +void CDivisionOOXMLTag::Close(const std::vector& arSelectors) { if (!Valid() || m_arFootnoteIDs.empty()) return; @@ -186,15 +208,32 @@ void CDivisionTag::Close() m_arFootnoteIDs.pop(); } -CImageTag::CImageTag(COOXMLWriter* pWriter) - : INTERFACE_TAGS::ITag(pWriter) + +CImageOOXMLTag::CImageOOXMLTag(COOXMLWriter* pWriter) + : IHTMLTag(pWriter) {} -bool CImageTag::Read(const std::vector& arSelectors) +bool CImageOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; + if (L"svg" == arSelectors.back().m_wsName) + { + const std::wstring wsImagePath{m_pWriter->GetMediaDir() + L'i' + std::to_wstring(m_arImages.size()) + L".png"}; + + if (!ReadSVGData(arSelectors.back().GetAttributeValue(L"svg-text"), 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_arImages.size())); + return true; + } + const std::wstring wsAlt{arSelectors.back().GetAttributeValue(L"alt")}; std::wstring wsSrc{arSelectors.back().GetAttributeValue(L"src")}; @@ -248,7 +287,7 @@ bool CImageTag::Read(const std::vector& arSelectors) bool bRes = false; std::wstring wsExtention; - const std::wstring wsImagePath{m_pWriter->GetMediaDir() + L'i' + std::to_wstring(m_arrImages.size())}; + const std::wstring wsImagePath{m_pWriter->GetMediaDir() + L'i' + std::to_wstring(m_arImages.size())}; // Assume Base64-encoded image if (wsSrc.length() > 4 && wsSrc.substr(0, 4) == L"data" && wsSrc.find(L"/", 4) != std::wstring::npos) @@ -334,11 +373,11 @@ bool CImageTag::Read(const std::vector& arSelectors) } // Check for duplicate - const std::vector::const_iterator nFind = std::find(m_arrImages.cbegin(), m_arrImages.cend(), wsSrc); - if (nFind != m_arrImages.end()) + const std::vector::const_iterator nFind = std::find(m_arImages.cbegin(), m_arImages.cend(), wsSrc); + if (nFind != m_arImages.end()) { bRes = true; - nImageId = nFind - m_arrImages.cbegin(); + nImageId = nFind - m_arImages.cbegin(); } } @@ -386,13 +425,13 @@ bool CImageTag::Read(const std::vector& arSelectors) { m_pWriter->WritePPr(arSelectors); - const std::wstring wsImageID{std::to_wstring(m_arrImages.size())}; - m_arrImages.push_back(wsSrc); + const std::wstring wsImageID{std::to_wstring(m_arImages.size())}; + m_arImages.push_back(wsSrc); if (nImageId < 0) { m_pWriter->WriteImageRels(wsImageID, wsImageID + L'.' + wsExtention); - m_arrImages.push_back(wsSrc); + m_arImages.push_back(wsSrc); } if (!oImageData.ZeroSize()) @@ -411,41 +450,23 @@ bool CImageTag::Read(const std::vector& arSelectors) return true; } -bool CImageTag::ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG) -{ - if (!Valid()) - return false; +void CImageOOXMLTag::Close(const std::vector& arSelectors) +{} - 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; -} - -bool CFontTag::Apply(const NSCSS::CNode& oTagNode, size_t unLevel) +bool CFontOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; std::wstring wsValue; - if (oTagNode.GetAttributeValue(L"color", wsValue)) - oTagNode.m_pCompiledStyle->m_oText.SetColor(wsValue, unLevel); + if (arSelectors.back().GetAttributeValue(L"color", wsValue)) + arSelectors.back().m_pCompiledStyle->m_oText.SetColor(wsValue, arSelectors.size()); - if (oTagNode.GetAttributeValue(L"face", wsValue)) - oTagNode.m_pCompiledStyle->m_oFont.SetFamily(wsValue, unLevel); + if (arSelectors.back().GetAttributeValue(L"face", wsValue)) + arSelectors.back().m_pCompiledStyle->m_oFont.SetFamily(wsValue, arSelectors.size()); - if (oTagNode.GetAttributeValue(L"size", wsValue)) + if (arSelectors.back().GetAttributeValue(L"size", wsValue)) { int nSize = 3; if(!wsValue.empty()) @@ -461,13 +482,16 @@ bool CFontTag::Apply(const NSCSS::CNode& oTagNode, size_t unLevel) if (nSize < 1 || nSize > 7) nSize = 3; - oTagNode.m_pCompiledStyle->m_oFont.SetSize(HTML_FONTS[nSize - 1], NSCSS::UnitMeasure::Point, unLevel); + arSelectors.back().m_pCompiledStyle->m_oFont.SetSize(HTML_FONTS[nSize - 1], NSCSS::UnitMeasure::Point, arSelectors.size()); } return true; } -bool CInputTag::Read(const std::vector& arSelectors) +void CFontOOXMLTag::Close(const std::vector& arSelectors) +{} + +bool CInputOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -496,17 +520,20 @@ bool CInputTag::Read(const std::vector& arSelectors) return true; } -bool CBaseFontTag::Apply(const NSCSS::CNode& oTagNode) +void CInputOOXMLTag::Close(const std::vector& arSelectors) +{} + +bool CBaseFontOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; std::wstring wsFontStyles, wsValue; - if (oTagNode.GetAttributeValue(L"face", wsValue)) + if (arSelectors.back().GetAttributeValue(L"face", wsValue)) wsFontStyles += L"font-family:" + wsValue + L';'; - if (oTagNode.GetAttributeValue(L"size", wsValue)) + if (arSelectors.back().GetAttributeValue(L"size", wsValue)) { wsFontStyles += L"font-size:"; @@ -523,7 +550,7 @@ bool CBaseFontTag::Apply(const NSCSS::CNode& oTagNode) } } - if (oTagNode.GetAttributeValue(L"color", wsValue)) + if (arSelectors.back().GetAttributeValue(L"color", wsValue)) wsFontStyles += L"text-color:" + wsValue + L';'; if (wsFontStyles.empty()) @@ -534,17 +561,19 @@ bool CBaseFontTag::Apply(const NSCSS::CNode& oTagNode) return true; } -CBlockquoteTag::CBlockquoteTag(COOXMLWriter* pWriter) - : INTERFACE_TAGS::ITag(pWriter) +void CBaseFontOOXMLTag::Close(const std::vector& arSelectors) {} -bool CBlockquoteTag::Open(const std::vector& arSelectors) +CBlockquoteOOXMLTag::CBlockquoteOOXMLTag(COOXMLWriter* pWriter) + : IHTMLTag(pWriter) +{} + +bool CBlockquoteOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; //TODO:: when Blockquote inside Blockquote, need to add to the first one - const std::wstring wsKeyWord{arSelectors.back().m_wsName}; std::map::const_iterator itFound = m_mDivs.find(wsKeyWord); @@ -609,7 +638,7 @@ bool CBlockquoteTag::Open(const std::vector& arSelec return true; } -void CBlockquoteTag::Close() +void CBlockquoteOOXMLTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -617,11 +646,11 @@ void CBlockquoteTag::Close() m_pWriter->RollBackDivId(); } -CHorizontalRuleTag::CHorizontalRuleTag(COOXMLWriter* pWriter) - : INTERFACE_TAGS::ITag(pWriter), m_unShapeId(1) +CHorizontalRuleOOXMLTag::CHorizontalRuleOOXMLTag(COOXMLWriter* pWriter) + : IHTMLTag(pWriter), m_unShapeId(1) {} -bool CHorizontalRuleTag::Write(const std::vector& arSelectors) +bool CHorizontalRuleOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -715,12 +744,12 @@ bool CHorizontalRuleTag::Write(const std::vector& ar ++m_unShapeId; return true; - - return true; } +void CHorizontalRuleOOXMLTag::Close(const std::vector& arSelectors) +{} -bool CListTag::Open(const NSCSS::CNode& oTagNode) +bool CListOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; @@ -728,9 +757,9 @@ bool CListTag::Open(const NSCSS::CNode& oTagNode) m_pWriter->CloseP(); // Numbered list - if (L"ol" == oTagNode.m_wsName) + if (L"ol" == arSelectors.back().m_wsName) { - const int nStart{NSStringFinder::ToInt(oTagNode.GetAttributeValue(L"start"), 1)}; + const int nStart{NSStringFinder::ToInt(arSelectors.back().GetAttributeValue(L"start"), 1)}; XmlString& oNumberXml{m_pWriter->GetNumberingXml()}; @@ -763,7 +792,7 @@ bool CListTag::Open(const NSCSS::CNode& oTagNode) return true; } -void CListTag::Close() +void CListOOXMLTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -771,12 +800,12 @@ void CListTag::Close() m_pWriter->CloseP(); } -bool CListElementTag::Open() +bool CListElementOOXMLTag::Open(const std::vector& arSelectors) { return Valid(); } -void CListElementTag::Close() +void CListElementOOXMLTag::Close(const std::vector& arSelectors) { if (!Valid()) return; @@ -1132,17 +1161,16 @@ std::wstring CalculateSidesToClean(UINT unColumnNumber, const std::vector::Apply(const NSCSS::CNode& oTagNode) +bool CHTMLOOXMLTag::Open(const std::vector& arSelectors) { if (!Valid()) return false; - if (oTagNode.m_mAttributes.empty()) + if (arSelectors.back().m_mAttributes.empty()) return true; std::wstring wsBackground; - if (oTagNode.GetAttributeValue(L"bgcolor", wsBackground)) + if (arSelectors.back().GetAttributeValue(L"bgcolor", wsBackground)) { NSCSS::NSProperties::CColor oColor; oColor.SetValue(wsBackground); @@ -1159,6 +1187,9 @@ bool CHTMLTag::Apply(const NSCSS::CNode& oTagNode) return true; } +void CHTMLOOXMLTag::Close(const std::vector& arSelectors) +{} + COOXMLTable::COOXMLTable(TExternalTableData& oExternalData) : CTableElement(oExternalData) {} diff --git a/HtmlFile2/Tags/OOXMLTags.h b/HtmlFile2/Tags/OOXMLTags.h index ef0e60514d..371c8d066c 100644 --- a/HtmlFile2/Tags/OOXMLTags.h +++ b/HtmlFile2/Tags/OOXMLTags.h @@ -9,112 +9,60 @@ namespace HTML { -#define CLASS_TAG_LIGHT(class_name)\ -template<>\ -class C ## class_name ## Tag : public INTERFACE_TAGS::I ## class_name ## Tag, public INTERFACE_TAGS::ITag +#define CREATE_OOXML_TAG(class_name) CREATE_TAG(class_name##OOXML, COOXMLWriter) -CLASS_TAG_LIGHT(Anchor) -{ -public: - CAnchorTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open(const std::vector& arSelectors) override; - void Close(const NSCSS::CNode& oTagNode) override; -}; +CREATE_OOXML_TAG(Anchor); +CREATE_OOXML_TAG(Abbr); +CREATE_OOXML_TAG(Break); +CREATE_OOXML_TAG(Font); +CREATE_OOXML_TAG(Input); +CREATE_OOXML_TAG(BaseFont); +CREATE_OOXML_TAG(List); +CREATE_OOXML_TAG(ListElement); +CREATE_OOXML_TAG(HTML); -CLASS_TAG_LIGHT(Abbr) -{ -public: - CAbbrTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open(const std::vector& arSelectors) override; - void Close() override; -}; - -CLASS_TAG_LIGHT(Break) -{ -public: - CBreakTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Read(const NSCSS::CNode& oTagNode) override; -}; - -CLASS_TAG_LIGHT(Font) -{ -public: - CFontTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Apply(const NSCSS::CNode& oTagNode, size_t unLevel) override; -}; - -CLASS_TAG_LIGHT(Input) -{ -public: - CInputTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Read(const std::vector& arSelectors) override; -}; - -CLASS_TAG_LIGHT(BaseFont) -{ -public: - CBaseFontTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Apply(const NSCSS::CNode& oTagNode) override; -}; - -CLASS_TAG_LIGHT(List) -{ -public: - CListTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open(const NSCSS::CNode& oTagNode) override; - void Close() override; -}; - -CLASS_TAG_LIGHT(ListElement) -{ -public: - CListElementTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Open() override; - void Close() override; -}; - -CLASS_TAG_LIGHT(HTML) -{ -public: - CHTMLTag(COOXMLWriter* pWriter) : INTERFACE_TAGS::ITag(pWriter) {} - bool Apply(const NSCSS::CNode& oTagNode) override; -}; - -CLASS_TAG_LIGHT(Division) +class CDivisionOOXMLTag : public IHTMLTag { std::stack m_arFootnoteIDs; public: - CDivisionTag(COOXMLWriter* pWriter); - bool Open(const std::vector& arSelectors) override; - void Close() override; + CDivisionOOXMLTag(COOXMLWriter *pWriter); + + bool Open (const std::vector& arSelectors) override; + void Close(const std::vector& arSelectors) override; }; -CLASS_TAG_LIGHT(Image) +class CImageOOXMLTag : public IHTMLTag { - std::vector m_arrImages; + std::vector m_arImages; public: - CImageTag(COOXMLWriter* pWriter); - bool Read(const std::vector& arSelectors) override; - bool ReadSVG(const std::vector& arSelectors, const std::wstring& wsSVG) override; + CImageOOXMLTag(COOXMLWriter *pWriter); + + bool Open (const std::vector& arSelectors) override; + void Close(const std::vector& arSelectors) override; }; -CLASS_TAG_LIGHT(Blockquote) +class CBlockquoteOOXMLTag : public IHTMLTag { - std::map m_mDivs; + std::map m_mDivs; public: - CBlockquoteTag(COOXMLWriter* pWriter); - bool Open(const std::vector& arSelectors) override; - void Close() override; + CBlockquoteOOXMLTag(COOXMLWriter *pWriter); + + bool Open (const std::vector& arSelectors) override; + void Close(const std::vector& arSelectors) override; }; -CLASS_TAG_LIGHT(HorizontalRule) +class CHorizontalRuleOOXMLTag : public IHTMLTag { UINT m_unShapeId; public: - CHorizontalRuleTag(COOXMLWriter* pWriter); - bool Write(const std::vector& arSelectors) override; + CHorizontalRuleOOXMLTag(COOXMLWriter *pWriter); + + bool Open (const std::vector& arSelectors) override; + void Close(const std::vector& arSelectors) override; }; +void InitTagsForOOXML(std::map>& mTags, COOXMLWriter* pWriter); + enum class ETableRules { All,