diff --git a/HtmlFile2/HTMLParams.h b/HtmlFile2/HTMLParameters.h similarity index 88% rename from HtmlFile2/HTMLParams.h rename to HtmlFile2/HTMLParameters.h index 623a628417..22c7a8fc25 100644 --- a/HtmlFile2/HTMLParams.h +++ b/HtmlFile2/HTMLParameters.h @@ -1,11 +1,11 @@ -#ifndef HTMLPARAMS_H -#define HTMLPARAMS_H +#ifndef HTMLPARAMETERS_H +#define HTMLPARAMETERS_H #include namespace HTML { -struct THtmlParams +struct THTMLParameters { std::wstring m_sGenres; // Жанры std::wstring m_sAuthors; // Авторы @@ -17,7 +17,7 @@ struct THtmlParams std::wstring m_sdocDefaults; // Стиль docDefaults std::wstring m_sNormal; // Стиль normal - THtmlParams() : m_bNeedPageBreakBefore(false) {} + THTMLParameters() : m_bNeedPageBreakBefore(false) {} void SetNormal(const std::wstring& sStyle) { @@ -66,4 +66,4 @@ struct THtmlParams }; } -#endif // HTMLPARAMS_H +#endif // HTMLPARAMETERS_H diff --git a/HtmlFile2/HTMLReader.cpp b/HtmlFile2/HTMLReader.cpp index 944251f150..97463ef988 100644 --- a/HtmlFile2/HTMLReader.cpp +++ b/HtmlFile2/HTMLReader.cpp @@ -170,10 +170,7 @@ inline bool TagIsUnprocessed(const std::wstring& wsTagName); CHTMLReader::CHTMLReader() : m_pWriter(nullptr) -{ - // InitOOXMLTags(); - InitMDTags(); -} +{} CHTMLReader::~CHTMLReader() { @@ -181,41 +178,63 @@ CHTMLReader::~CHTMLReader() delete m_pWriter; } -HRESULT CHTMLReader::ConvertFromTo(const std::wstring& wsFrom, const std::wstring& wsTo) +void CHTMLReader::SetTempDirectory(const std::wstring& wsPath) { - if (nullptr == m_pWriter || !HTML2XHTML(wsFrom) || !m_oLightReader.IsValid() || !IsHTML()) - return S_FALSE; - - m_pWriter->Begin(wsTo, nullptr); - - m_sSrc = NSSystemPath::GetDirectoryName(wsFrom); - // m_sDst = sDst; - - m_oLightReader.MoveToStart(); - m_oLightReader.ReadNextNode(); - ReadStyle(); - - // Переходим в начало - if(!m_oLightReader.MoveToStart()) - return S_FALSE; - - // if(oParams && oParams->m_bNeedPageBreakBefore) - // m_internal->PageBreakBefore(); - - ReadDocument(); - - m_pWriter->End(wsTo); - return S_OK; + m_wsTempDirectory = wsPath; } -void CHTMLReader::InitOOXMLTags() +void CHTMLReader::SetCoreDirectory(const std::wstring& wsPath) { + m_wsCoreDirectory = wsPath; +} + +HRESULT CHTMLReader::ConvertHTML2OOXML(const std::wstring& wsPath, const std::wstring& wsDirectory, THTMLParameters* pParameters) +{ + InitOOXMLTags(pParameters); + + m_wsDstDirectory = wsDirectory; + + return ConvertHTML(wsPath, wsDirectory); +} + +HRESULT CHTMLReader::ConvertHTML2Markdown(const std::wstring& wsPath, const std::wstring& wsFinalFile, TMarkdownParameters* pParameters) +{ + InitMDTags(); + return ConvertHTML(wsPath, wsFinalFile); +} + +void CHTMLReader::Clear() +{ + if (nullptr != m_pWriter) + delete m_pWriter; + + m_mTags.clear(); + + m_wsTempDirectory.clear(); + m_wsSrcDirectory .clear(); + m_wsDstDirectory .clear(); + m_wsBaseDirectory.clear(); + m_wsCoreDirectory.clear(); +} + +void CHTMLReader::InitOOXMLTags(THTMLParameters* pParametrs) +{ + Clear(); + COOXMLWriter *pWriter = new COOXMLWriter(); if (nullptr == pWriter) return; pWriter->SetCSSCalculator(&m_oCSSCalculator); + pWriter->SetHTMLParameters(pParametrs); + + pWriter->SetSrcDirectory (m_wsSrcDirectory); + pWriter->SetDstDirectory (m_wsDstDirectory); + pWriter->SetTempDirectory(m_wsTempDirectory); + pWriter->SetBaseDirectory(m_wsBaseDirectory); + pWriter->SetCoreDirectory(m_wsCoreDirectory); + m_pWriter = pWriter; m_mTags[HTML_TAG(A)] = std::make_shared>(pWriter); @@ -228,7 +247,7 @@ void CHTMLReader::InitOOXMLTags() 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(UL)] = 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(TABLE)] = std::make_shared>(pWriter); @@ -251,6 +270,7 @@ void CHTMLReader::InitOOXMLTags() m_mTags[HTML_TAG(BDO)] = oIgnoredTag; m_mTags[HTML_TAG(SPAN)] = oIgnoredTag; m_mTags[HTML_TAG(H1)] = oIgnoredTag; + m_mTags[HTML_TAG(CODE)] = oIgnoredTag; } void CHTMLReader::InitMDTags() @@ -356,6 +376,33 @@ bool CHTMLReader::HTML2XHTML(const std::wstring& wsFileName) return m_oLightReader.FromString(sRes); } +HRESULT CHTMLReader::ConvertHTML(const std::wstring& wsPath, const std::wstring& wsDirectory) +{ + if (nullptr == m_pWriter || !HTML2XHTML(wsPath) || !m_oLightReader.IsValid() || !IsHTML()) + return S_FALSE; + + m_pWriter->Begin(wsDirectory); + + m_wsSrcDirectory = NSSystemPath::GetDirectoryName(wsPath); + // m_sDst = sDst; + + m_oLightReader.MoveToStart(); + m_oLightReader.ReadNextNode(); + ReadStyle(); + + // Переходим в начало + if(!m_oLightReader.MoveToStart()) + return S_FALSE; + + // if(oParams && oParams->m_bNeedPageBreakBefore) + // m_internal->PageBreakBefore(); + + ReadDocument(); + + m_pWriter->End(wsDirectory); + return S_OK; +} + void CHTMLReader::ReadStyle() { if(m_oLightReader.IsEmptyNode()) @@ -422,7 +469,7 @@ void CHTMLReader::ReadStyleFromNetwork() // Стиль в сети if(sRef.substr(0, 4) == L"http") { - sFName = m_sTmp + L'/' + sFName; + sFName = m_wsTempDirectory + L'/' + sFName; NSNetwork::NSFileTransport::CFileDownloader oDownloadStyle(sRef, false); oDownloadStyle.SetFilePath(sFName); if(oDownloadStyle.DownloadSync()) @@ -433,8 +480,8 @@ void CHTMLReader::ReadStyleFromNetwork() } else { - m_oCSSCalculator.AddStylesFromFile(m_sSrc + L'/' + sFName); - m_oCSSCalculator.AddStylesFromFile(m_sSrc + L'/' + sRef); + m_oCSSCalculator.AddStylesFromFile(m_wsSrcDirectory + L'/' + sFName); + m_oCSSCalculator.AddStylesFromFile(m_wsSrcDirectory + L'/' + sRef); } } @@ -463,7 +510,7 @@ void CHTMLReader::ReadHead() const std::wstring wsName = m_oLightReader.GetName(); // Базовый адрес if (L"base" == wsName) - m_sBase = GetArgumentValue(m_oLightReader, L"href"); + m_wsBaseDirectory = GetArgumentValue(m_oLightReader, L"href"); } m_oLightReader.MoveToElement(); diff --git a/HtmlFile2/HTMLReader.h b/HtmlFile2/HTMLReader.h index 7947360a2f..84c6d6f34e 100644 --- a/HtmlFile2/HTMLReader.h +++ b/HtmlFile2/HTMLReader.h @@ -4,6 +4,9 @@ #include "../Common/3dParty/html/css/src/CCssCalculator.h" #include "../DesktopEditor/xml/include/xmlutils.h" +#include "HTMLParameters.h" +#include "MarkdownParameters.h" + #include "Writers/IWriter.h" #include "Tags/HTMLTags.h" #include "Table.h" @@ -15,11 +18,11 @@ class CHTMLReader XmlUtils::CXmlLiteReader m_oLightReader; // SAX Reader NSCSS::CCssCalculator m_oCSSCalculator; // Css калькулятор - std::wstring m_sTmp; // Temp папка - std::wstring m_sSrc; // Директория источника - std::wstring m_sDst; // Директория назначения - std::wstring m_sBase; // Полный базовый адрес - std::wstring m_sCore; // Путь до корневого файла (используется для работы с Epub) + std::wstring m_wsTempDirectory; // Temp папка + std::wstring m_wsSrcDirectory; // Директория источника + std::wstring m_wsDstDirectory; // Директория назначения + std::wstring m_wsBaseDirectory; // Полный базовый адрес + std::wstring m_wsCoreDirectory; // Путь до корневого файла (используется для работы с Epub) IWriter *m_pWriter; @@ -28,17 +31,27 @@ public: CHTMLReader(); ~CHTMLReader(); - HRESULT ConvertFromTo(const std::wstring& wsFrom, const std::wstring& wsTo); + void SetTempDirectory(const std::wstring& wsPath); + void SetCoreDirectory(const std::wstring& wsPath); + + HRESULT ConvertHTML2OOXML (const std::wstring& wsPath, const std::wstring& wsDirectory, THTMLParameters* pParameters = nullptr); + HRESULT ConvertHTML2Markdown(const std::wstring& wsPath, const std::wstring& wsFinalFile, TMarkdownParameters* pParameters = nullptr); + + HRESULT ConvertMHT2OOXML (const std::wstring& sPath, const std::wstring& sDirectory, THTMLParameters* pParameters = nullptr); + HRESULT ConvertMHT2Markdown (const std::wstring& sPath, const std::wstring& sDirectory, TMarkdownParameters* pParameters = nullptr); NSCSS::CCssCalculator* GetCSSCalculator(); private: - void InitOOXMLTags(); + void Clear(); + void InitOOXMLTags(THTMLParameters* pParametrs = nullptr); void InitMDTags(); bool IsHTML(); bool HTML2XHTML(const std::wstring& wsFileName); + HRESULT ConvertHTML(const std::wstring& wsPath, const std::wstring& wsDirectory); + void ReadStyle(); void ReadStyle2(); void ReadStyleFromNetwork(); diff --git a/HtmlFile2/HtmlFile2.pro b/HtmlFile2/HtmlFile2.pro index 0c5f42e605..1e20ffe52a 100644 --- a/HtmlFile2/HtmlFile2.pro +++ b/HtmlFile2/HtmlFile2.pro @@ -46,9 +46,10 @@ HEADERS += htmlfile2.h \ Common.h \ ./Writers/OOXMLWriter.h \ ./Writers/IWriter.h \ - HTMLParams.h \ + HTMLParameters.h \ HTMLReader.h \ ./Tags/HTMLTags.h \ + MarkdownParameters.h \ Tags/MDTags.h \ Writers/MDWriter.h \ Table.h \ diff --git a/HtmlFile2/MarkdownParameters.h b/HtmlFile2/MarkdownParameters.h new file mode 100644 index 0000000000..9398ea983f --- /dev/null +++ b/HtmlFile2/MarkdownParameters.h @@ -0,0 +1,14 @@ +#ifndef MARKDOWNPARAMETERS_H +#define MARKDOWNPARAMETERS_H + +namespace HTML +{ +struct TMarkdownParameters +{ + bool m_bUseAlternativeHTMLTags = false; //Использовать html теги там, где нет стандартной реализации в md(например для подчеркиваний) + wchar_t m_wchUnorderedList = L'-'; // Возможные варианты в md: -, +, * + wchar_t m_wchOrderedList = L'.'; // Возможные варианты в md: ., ) +}; +} + +#endif // MARKDOWNPARAMETERS_H diff --git a/HtmlFile2/Writers/IWriter.h b/HtmlFile2/Writers/IWriter.h index 4b1ffcda76..ec36289d41 100644 --- a/HtmlFile2/Writers/IWriter.h +++ b/HtmlFile2/Writers/IWriter.h @@ -2,7 +2,6 @@ #define IWRITER_H #include "../../Common/3dParty/html/css/src/CNode.h" -#include "HTMLParams.h" #include "../Common.h" namespace HTML @@ -13,7 +12,7 @@ public: IWriter() = default; virtual ~IWriter() = default; - virtual void Begin(const std::wstring& wsDst, const THtmlParams* pParams) = 0; + virtual void Begin(const std::wstring& wsDst) = 0; virtual void End(const std::wstring& wsDst) = 0; virtual bool WriteText(std::wstring wsText, const std::vector& arSelectors) = 0; diff --git a/HtmlFile2/Writers/MDWriter.cpp b/HtmlFile2/Writers/MDWriter.cpp index d6ad897783..a46e3c5efb 100644 --- a/HtmlFile2/Writers/MDWriter.cpp +++ b/HtmlFile2/Writers/MDWriter.cpp @@ -7,14 +7,14 @@ namespace HTML { -CMDWriter::CMDWriter(const TMDParametrs& oMDParametrs) +CMDWriter::CMDWriter(const TMarkdownParameters& oMDParametrs) : m_oMDParametrs(oMDParametrs) { m_arStates.push(TState{}); m_arStates.top().m_pCurrentDocument = &m_oDocument; } -void CMDWriter::Begin(const std::wstring& wsDst, const THtmlParams* pParams) +void CMDWriter::Begin(const std::wstring& wsDst) { } @@ -117,7 +117,7 @@ void CMDWriter::RevertDataOutput() RollBackState(); } -TMDParametrs CMDWriter::GetParametrs() const +TMarkdownParameters CMDWriter::GetParametrs() const { return m_oMDParametrs; } diff --git a/HtmlFile2/Writers/MDWriter.h b/HtmlFile2/Writers/MDWriter.h index 2f577842e7..7f97b08fe9 100644 --- a/HtmlFile2/Writers/MDWriter.h +++ b/HtmlFile2/Writers/MDWriter.h @@ -2,17 +2,12 @@ #define MDWRITER_H #include "IWriter.h" +#include "../MarkdownParameters.h" + #include namespace HTML { -struct TMDParametrs -{ - bool m_bUseAlternativeHTMLTags = false; //Использовать html теги там, где нет стандартной реализации в md(например для подчеркиваний) - WCHAR m_wchUnorderedList = L'-'; // Возможные варианты в md: -, +, * - WCHAR m_wchOrderedList = L'.'; // Возможные варианты в md: ., ) -}; - class CMDWriter : public IWriter { XmlString m_oDocument; @@ -37,11 +32,11 @@ class CMDWriter : public IWriter }; std::stack m_arStates; - TMDParametrs m_oMDParametrs; + TMarkdownParameters m_oMDParametrs; public: - CMDWriter(const TMDParametrs& oMDParametrs); + CMDWriter(const TMarkdownParameters& oMDParametrs); - void Begin(const std::wstring& wsDst, const THtmlParams* pParams) override; + void Begin(const std::wstring& wsDst) override; void End(const std::wstring& wsDst) override; bool WriteText(std::wstring wsText, const std::vector& arSelectors) override; @@ -54,7 +49,7 @@ public: void SetDataOutput(XmlString* pOutputData) override; void RevertDataOutput() override; - TMDParametrs GetParametrs() const; + TMarkdownParameters GetParametrs() const; void WriteString(const std::wstring& wsString, bool bSpecialString = false); XmlString* GetCurrentDocument() const override; diff --git a/HtmlFile2/Writers/OOXMLWriter.cpp b/HtmlFile2/Writers/OOXMLWriter.cpp index d524981bc2..7309538d11 100644 --- a/HtmlFile2/Writers/OOXMLWriter.cpp +++ b/HtmlFile2/Writers/OOXMLWriter.cpp @@ -41,7 +41,10 @@ inline UINT GetFontSizeByLevel(UINT unLevel); inline void ReplaceSpaces(std::wstring& wsValue); COOXMLWriter::COOXMLWriter() - : m_nFootnoteId(1), m_nHyperlinkId(1), m_nNumberingId(1), m_nId(1), m_nShapeId(1), m_bWasDivs(false), m_pFonts(nullptr) + : m_pDstPath(nullptr), m_pTempDir(nullptr), m_pSrcPath(nullptr), + m_pBasePath(nullptr), m_pCorePath(nullptr), m_pHTMLParameters(nullptr), + m_nFootnoteId(1), m_nHyperlinkId(1), m_nNumberingId(1), m_nId(1), + m_nShapeId(1), m_bWasDivs(false), m_pFonts(nullptr) { m_oPageData.SetWidth (DEFAULT_PAGE_WIDTH, NSCSS::UnitMeasure::Twips, 0, true); m_oPageData.SetHeight(DEFAULT_PAGE_HEIGHT, NSCSS::UnitMeasure::Twips, 0, true); @@ -58,7 +61,37 @@ void COOXMLWriter::SetCSSCalculator(NSCSS::CCssCalculator* pCSSCalculator) m_pStylesCalculator = pCSSCalculator; } -void COOXMLWriter::Begin(const std::wstring& wsDst, const THtmlParams* pParams) +void COOXMLWriter::SetHTMLParameters(THTMLParameters* pHTMLParameters) +{ + m_pHTMLParameters = pHTMLParameters; +} + +void COOXMLWriter::SetSrcDirectory(const std::wstring& wsPath) +{ + m_pSrcPath = &wsPath; +} + +void COOXMLWriter::SetDstDirectory(const std::wstring& wsPath) +{ + m_pDstPath = &wsPath; +} + +void COOXMLWriter::SetTempDirectory(const std::wstring& wsPath) +{ + m_pTempDir = &wsPath; +} + +void COOXMLWriter::SetBaseDirectory(const std::wstring& wsPath) +{ + m_pBasePath = &wsPath; +} + +void COOXMLWriter::SetCoreDirectory(const std::wstring& wsPath) +{ + m_pCorePath = &wsPath; +} + +void COOXMLWriter::Begin(const std::wstring& wsDst) { // Создаем пустые папки NSDirectory::CreateDirectory(wsDst + L"/_rels"); @@ -152,41 +185,41 @@ void COOXMLWriter::Begin(const std::wstring& wsDst, const THtmlParams* pParams) // core.xml std::wstring sCore = L""; - if(pParams) + if(nullptr != m_pHTMLParameters) { - if(!pParams->m_sBookTitle.empty()) + if(!m_pHTMLParameters->m_sBookTitle.empty()) { sCore += L""; - sCore += EncodeXmlString(pParams->m_sBookTitle); + sCore += EncodeXmlString(m_pHTMLParameters->m_sBookTitle); sCore += L""; } - if(!pParams->m_sAuthors.empty()) + if(!m_pHTMLParameters->m_sAuthors.empty()) { sCore += L""; - sCore += EncodeXmlString(pParams->m_sAuthors); + sCore += EncodeXmlString(m_pHTMLParameters->m_sAuthors); sCore += L""; } - if(!pParams->m_sGenres.empty()) + if(!m_pHTMLParameters->m_sGenres.empty()) { sCore += L""; - sCore += EncodeXmlString(pParams->m_sGenres); + sCore += EncodeXmlString(m_pHTMLParameters->m_sGenres); sCore += L""; } - if(!pParams->m_sDate.empty()) + if(!m_pHTMLParameters->m_sDate.empty()) { sCore += L""; - sCore += EncodeXmlString(pParams->m_sDate); + sCore += EncodeXmlString(m_pHTMLParameters->m_sDate); sCore += L""; } - if(!pParams->m_sDescription.empty()) + if(!m_pHTMLParameters->m_sDescription.empty()) { sCore += L""; - sCore += EncodeXmlString(pParams->m_sDescription); + sCore += EncodeXmlString(m_pHTMLParameters->m_sDescription); sCore += L""; } - if (!pParams->m_sLanguage.empty()) + if (!m_pHTMLParameters->m_sLanguage.empty()) { - wsCurrentLanguage = IndentifyLanguage(pParams->m_sLanguage); + wsCurrentLanguage = IndentifyLanguage(m_pHTMLParameters->m_sLanguage); sCore += L""; sCore += wsCurrentLanguage; @@ -220,8 +253,8 @@ void COOXMLWriter::Begin(const std::wstring& wsDst, const THtmlParams* pParams) m_nId += 7; // docDefaults по умолчанию - if(pParams && !pParams->m_sdocDefaults.empty()) - m_oStylesXml += pParams->m_sdocDefaults; + if(m_pHTMLParameters && !m_pHTMLParameters->m_sdocDefaults.empty()) + m_oStylesXml += m_pHTMLParameters->m_sdocDefaults; else { m_oStylesXml += L""; @@ -234,8 +267,8 @@ void COOXMLWriter::Begin(const std::wstring& wsDst, const THtmlParams* pParams) } // normal по умолчанию - if(pParams && !pParams->m_sNormal.empty()) - m_oStylesXml += pParams->m_sNormal; + if(m_pHTMLParameters && !m_pHTMLParameters->m_sNormal.empty()) + m_oStylesXml += m_pHTMLParameters->m_sNormal; else { m_oStylesXml += L""; @@ -1136,27 +1169,27 @@ NSFonts::IApplicationFonts* COOXMLWriter::GetFonts() std::wstring COOXMLWriter::GetMediaDir() const { - return m_wsDstPath + L"/word/media/"; + return ((nullptr != m_pDstPath) ? *m_pDstPath : std::wstring()) + L"/word/media/"; } std::wstring COOXMLWriter::GetTempDir() const { - return m_wsTempDir; + return (nullptr != m_pTempDir) ? *m_pTempDir : std::wstring(); } std::wstring COOXMLWriter::GetSrcPath() const { - return m_wsSrcPath; + return (nullptr != m_pSrcPath) ? *m_pSrcPath : std::wstring(); } std::wstring COOXMLWriter::GetBasePath() const { - return m_wsBasePath; + return (nullptr != m_pBasePath) ? *m_pBasePath : std::wstring(); } std::wstring COOXMLWriter::GetCorePath() const { - return m_wsCorePath; + return (nullptr != m_pCorePath) ? *m_pCorePath : std::wstring(); } inline bool ElementInTable(const std::vector& arSelectors) diff --git a/HtmlFile2/Writers/OOXMLWriter.h b/HtmlFile2/Writers/OOXMLWriter.h index d90b3b406c..0f0177c361 100644 --- a/HtmlFile2/Writers/OOXMLWriter.h +++ b/HtmlFile2/Writers/OOXMLWriter.h @@ -1,11 +1,11 @@ #ifndef OOXMLWRITER_H #define OOXMLWRITER_H -// #include "HTMLInterpretator.h" - #include "../../Common/3dParty/html/css/src/xhtml/CDocumentStyle.h" #include "../../Common/3dParty/html/css/src/CCssCalculator.h" +#include "../HTMLParameters.h" #include "IWriter.h" + #include namespace NSFonts { class IApplicationFonts; } @@ -39,11 +39,11 @@ struct TImageData class COOXMLWriter : public IWriter { - std::wstring m_wsDstPath; // Директория назначения - std::wstring m_wsTempDir; // Temp папка - std::wstring m_wsSrcPath; // Директория источника - std::wstring m_wsBasePath; // Полный базовый адрес - std::wstring m_wsCorePath; // Путь до корневого файла (используется для работы с Epub) + const std::wstring *m_pDstPath; // Директория назначения + const std::wstring *m_pTempDir; // Temp папка + const std::wstring *m_pSrcPath; // Директория источника + const std::wstring *m_pBasePath; // Полный базовый адрес + const std::wstring *m_pCorePath; // Путь до корневого файла (используется для работы с Epub) XmlString m_oStylesXml; // styles.xml XmlString m_oDocXmlRels; // document.xml.rels @@ -57,6 +57,7 @@ class COOXMLWriter : public IWriter NSCSS::NSProperties::CPage m_oPageData; // Стили страницы NSCSS::CCssCalculator *m_pStylesCalculator; + THTMLParameters *m_pHTMLParameters; struct TState { @@ -72,15 +73,11 @@ class COOXMLWriter : public IWriter XmlString *m_pCurrentDocument; //Текущее место записи bool m_bRemoveCurrentDocument; - // std::wstring m_wsNote; - - // HtmlTag m_eLastElement; - TState() : m_bInP(false), m_bInR(false), m_bInT(false), m_bWasPStyle(false), m_bWasSpace(true), m_bInHyperlink(false), m_bBanUpdatePageData(false), m_pCurrentDocument(nullptr), - m_bRemoveCurrentDocument(false)/*, m_eLastElement(HTML_TAG(UNKNOWN))*/ + m_bRemoveCurrentDocument(false) {} ~TState() @@ -117,8 +114,15 @@ public: COOXMLWriter(); void SetCSSCalculator(NSCSS::CCssCalculator* pCSSCalculator); + void SetHTMLParameters(THTMLParameters* pHTMLParameters); - void Begin(const std::wstring& wsDst, const THtmlParams* pParams) override; + void SetSrcDirectory (const std::wstring& wsPath); + void SetDstDirectory (const std::wstring& wsPath); + void SetTempDirectory(const std::wstring& wsPath); + void SetBaseDirectory(const std::wstring& wsPath); + void SetCoreDirectory(const std::wstring& wsPath); + + void Begin(const std::wstring& wsDst) override; void End(const std::wstring& wsDst) override; bool OpenP(); diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index 5e5939731a..73d286c874 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -5012,6 +5012,8 @@ CHtmlFile2::CHtmlFile2() { #ifdef USE_OLD_HTML_CONVERTER m_internal = new CHtmlFile2_Private(); + #else + m_pReader = new HTML::CHTMLReader(); #endif } @@ -5019,37 +5021,37 @@ CHtmlFile2::~CHtmlFile2() { #ifdef USE_OLD_HTML_CONVERTER RELEASEOBJECT(m_internal); + #else + RELEASEOBJECT(m_pReader); #endif } +#ifdef USE_OLD_HTML_CONVERTER bool CHtmlFile2::IsHtmlFile(const std::wstring& sFile) { - #ifdef USE_OLD_HTML_CONVERTER // Конвертируем в xhtml if(!m_internal->htmlXhtml(sFile)) return false; // Читаем html return m_internal->isHtml(); - #endif - return true; } bool CHtmlFile2::IsMhtFile(const std::wstring& sFile) { - #ifdef USE_OLD_HTML_CONVERTER // Конвертируем в xhtml if(!m_internal->mhtXhtml(sFile)) return false; // Читаем html return m_internal->isHtml(); - #endif - return true; } +#endif -void CHtmlFile2::SetTmpDirectory(const std::wstring& sFolder) +void CHtmlFile2::SetTempDirectory(const std::wstring& wsFolder) { #ifdef USE_OLD_HTML_CONVERTER - m_internal->m_sTmp = NSSystemPath::NormalizePath(sFolder); + m_internal->m_sTmp = NSSystemPath::NormalizePath(wsFolder); + #else + m_pReader->SetTempDirectory(wsFolder); #endif } @@ -5057,37 +5059,54 @@ void CHtmlFile2::SetCoreDirectory(const std::wstring& wsFolder) { #ifdef USE_OLD_HTML_CONVERTER m_internal->m_sCore = NSSystemPath::NormalizePath(wsFolder); + #else + m_pReader->SetCoreDirectory(wsFolder); #endif } -HRESULT CHtmlFile2::OpenHtml(const std::wstring& sSrc, const std::wstring& sDst, CHtmlParams* oParams) +HRESULT CHtmlFile2::ConvertHTML2OOXML(const std::wstring& wsPath, const std::wstring& wsDirectory, HTML::THTMLParameters* pParametrs) { - #ifdef USE_OLD_HTML_CONVERTER + #ifndef USE_OLD_HTML_CONVERTER + if (nullptr == m_pReader) + return S_FALSE; + + return m_pReader->ConvertHTML2OOXML(wsPath, wsDirectory, pParametrs); + #else if(!m_internal->m_oLightReader.IsValid()) if(!IsHtmlFile(sSrc)) return S_FALSE; m_internal->m_sSrc = NSSystemPath::GetDirectoryName(sSrc); m_internal->m_sDst = sDst; - m_internal->CreateDocxEmpty(oParams); + m_internal->CreateDocxEmpty(pParametrs); m_internal->readStyle(); // Переходим в начало if(!m_internal->m_oLightReader.MoveToStart()) return S_FALSE; - if(oParams && oParams->m_bNeedPageBreakBefore) + if(pParametrs && pParametrs->m_bNeedPageBreakBefore) m_internal->PageBreakBefore(); + m_internal->readSrc(); m_internal->write(); return S_OK; - #else - HTML::CHTMLReader oHTMLReader; - return oHTMLReader.ConvertFromTo(sSrc, sDst); #endif } -HRESULT CHtmlFile2::OpenMht(const std::wstring& sSrc, const std::wstring& sDst, CHtmlParams* oParams) +HRESULT CHtmlFile2::ConvertHTML2Markdown(const std::wstring& wsPath, const std::wstring& wsFinalFile, HTML::TMarkdownParameters* pParametrs) +{ + #ifdef USE_OLD_HTML_CONVERTER + return S_FALSE; + #else + if (nullptr == m_pReader) + return S_FALSE; + + return m_pReader->ConvertHTML2Markdown(wsPath, wsFinalFile, pParametrs); + #endif +} + +HRESULT CHtmlFile2::OpenMht(const std::wstring& sSrc, const std::wstring& sDst) { #ifdef USE_OLD_HTML_CONVERTER if(!m_internal->m_oLightReader.IsValid()) @@ -5113,7 +5132,7 @@ HRESULT CHtmlFile2::OpenMht(const std::wstring& sSrc, const std::wstring& sDst, #endif } -HRESULT CHtmlFile2::OpenBatchHtml(const std::vector& sSrc, const std::wstring& sDst, CHtmlParams* oParams) +HRESULT CHtmlFile2::OpenBatchHtml(const std::vector& sSrc, const std::wstring& sDst) { #ifdef USE_OLD_HTML_CONVERTER m_internal->m_sDst = sDst; diff --git a/HtmlFile2/htmlfile2.h b/HtmlFile2/htmlfile2.h index 4b9c5fa179..85a4c21aa4 100644 --- a/HtmlFile2/htmlfile2.h +++ b/HtmlFile2/htmlfile2.h @@ -5,6 +5,9 @@ #include #include "../DesktopEditor/common/Types.h" +#include "HTMLParameters.h" +#include "MarkdownParameters.h" + #ifndef HTMLFILE2_USE_DYNAMIC_LIBRARY #define HTMLFILE2_DECL_EXPORT #else @@ -12,84 +15,46 @@ #define HTMLFILE2_DECL_EXPORT Q_DECL_EXPORT #endif -struct CHtmlParams -{ - std::wstring m_sGenres; // Жанры - std::wstring m_sAuthors; // Авторы - std::wstring m_sBookTitle; // Название - std::wstring m_sDate; // Дата - std::wstring m_sDescription; // описание - std::wstring m_sLanguage; // Язык - bool m_bNeedPageBreakBefore; // Новый html с новой страницы - std::wstring m_sdocDefaults; // Стиль docDefaults - std::wstring m_sNormal; // Стиль normal - - CHtmlParams() : m_bNeedPageBreakBefore(false) {} - - void SetNormal(const std::wstring& sStyle) - { - m_sNormal = sStyle; - } - - void SetDocDefaults(const std::wstring& sStyle) - { - m_sdocDefaults = sStyle; - } - - void SetPageBreakBefore(bool bNeed) - { - m_bNeedPageBreakBefore = bNeed; - } - - void SetDate(const std::wstring& sDate) - { - m_sDate = sDate; - } - - void SetDescription(const std::wstring& sDescription) - { - m_sDescription = sDescription; - } - - void SetGenres(const std::wstring& sGenres) - { - m_sGenres = sGenres; - } - - void SetAuthors(const std::wstring& sAuthors) - { - m_sAuthors = sAuthors; - } - - void SetTitle(const std::wstring& sTitle) - { - m_sBookTitle = sTitle; - } - - void SetLanguage(const std::wstring& sLanguage) - { - m_sLanguage = sLanguage; - } -}; - +#ifdef USE_OLD_HTML_CONVERTER class CHtmlFile2_Private; +#else +namespace HTML { class CHTMLReader; } +#endif + class HTMLFILE2_DECL_EXPORT CHtmlFile2 { private: #ifdef USE_OLD_HTML_CONVERTER CHtmlFile2_Private* m_internal; + #else + HTML::CHTMLReader* m_pReader; #endif public: CHtmlFile2(); ~CHtmlFile2(); - bool IsHtmlFile(const std::wstring& sFile); - bool IsMhtFile (const std::wstring& sFile); - void SetTmpDirectory(const std::wstring& sFolder); + #ifdef USE_OLD_HTML_CONVERTER + bool IsHtmlFile(const std::wstring& wsFile); + bool IsMhtFile (const std::wstring& wsFile); + #endif + + void SetTempDirectory(const std::wstring& wsFolder); void SetCoreDirectory(const std::wstring& wsFolder); - HRESULT OpenHtml(const std::wstring& sPath, const std::wstring& sDirectory, CHtmlParams* oParams = NULL); - HRESULT OpenMht (const std::wstring& sPath, const std::wstring& sDirectory, CHtmlParams* oParams = NULL); - HRESULT OpenBatchHtml(const std::vector& sPath, const std::wstring& sDirectory, CHtmlParams* oParams = NULL); + + HRESULT ConvertHTML2OOXML (const std::wstring& wsPath, const std::wstring& wsDirectory, HTML::THTMLParameters* pParametrs = nullptr); + HRESULT ConvertHTML2Markdown(const std::wstring& wsPath, const std::wstring& wsFinalFile, HTML::TMarkdownParameters* pParametrs = nullptr); + + HRESULT ConvertMHT2OOXML (const std::wstring& sPath, const std::wstring& sDirectory, HTML::THTMLParameters* pParametrs = nullptr); + HRESULT ConvertMHT2Markdown (const std::wstring& sPath, const std::wstring& sDirectory, HTML::TMarkdownParameters* pParametrs = nullptr); + + HRESULT ConvertHTML2OOXML (const std::vector& arPaths, const std::wstring& wsDirectory, HTML::THTMLParameters* pParametrs = nullptr); + HRESULT ConvertHTML2Markdown(const std::vector& arPaths, const std::wstring& wsDirectory, HTML::TMarkdownParameters* pParametrs = nullptr); + + HRESULT ConvertMHT2OOXML (const std::vector& arPaths, const std::wstring& wsDirectory, HTML::THTMLParameters* pParametrs = nullptr); + HRESULT ConvertMHT2Markdown (const std::vector& arPaths, const std::wstring& wsDirectory, HTML::TMarkdownParameters* pParametrs = nullptr); + + HRESULT OpenMht (const std::wstring& sPath, const std::wstring& sDirectory); + HRESULT OpenBatchHtml(const std::vector& sPath, const std::wstring& sDirectory); }; #endif // _HTMLFILE2_HTMLFILE2_H