#ifndef OOXMLWRITER_H #define OOXMLWRITER_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; } namespace HTML { struct TImageData { UINT m_unWidth; UINT m_unHeight; int m_nHSpace; int m_nVSpace; std::wstring m_wsAlign; TImageData() : m_unWidth(0), m_unHeight(0), m_nHSpace(0), m_nVSpace(0), m_wsAlign(L"left") {} bool ZeroSize() const { return 0 == m_unWidth || 0 == m_unHeight; } bool ZeroSpaces() const { return 0 == m_nHSpace && 0 == m_nVSpace; } }; class COOXMLWriter : public IWriter { 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 XmlString m_oNoteXmlRels; // footnotes.xml.rels XmlString m_oDocXml; // document.xml XmlString m_oNoteXml; // footnotes.xml XmlString m_oNumberXml; // numbering.xml XmlString m_oWebSettings; // webSettings.xml NSCSS::CDocumentStyle m_oXmlStyle; // Ooxml стиль NSCSS::NSProperties::CPage m_oPageData; // Стили страницы NSCSS::CCssCalculator *m_pStylesCalculator; THTMLParameters *m_pHTMLParameters; struct TState { bool m_bInP; // открыт? bool m_bInR; // открыт? bool m_bInT; // открыт? bool m_bWasPStyle; // записан? bool m_bWasSpace; // Был пробел? bool m_bInHyperlink; // открыт? std::wstring m_wsTooltip; std::wstring m_wsHref; std::wstring m_wsFootnote; bool m_bIsFootnote; bool m_bISCrossHyperlink; XmlString *m_pCurrentDocument; //Текущее место записи bool m_bRemoveCurrentDocument; TState(XmlString *pCurrentDocument) : m_bInP(false), m_bInR(false), m_bInT(false), m_bWasPStyle(false), m_bWasSpace(true), m_bInHyperlink(false), m_bIsFootnote(false), m_bISCrossHyperlink(false), m_pCurrentDocument(pCurrentDocument), m_bRemoveCurrentDocument(false) {} ~TState() { if (m_bRemoveCurrentDocument && nullptr != m_pCurrentDocument) delete m_pCurrentDocument; } void CreateNewCurrentDocument() { m_pCurrentDocument = new XmlString(); m_bRemoveCurrentDocument = true; } }; std::stack m_arStates; int m_nFootnoteId; // ID сноски int m_nHyperlinkId; // ID ссылки int m_nListId; // ID списка int m_nElementId; // ID остальные элементы bool m_bBanUpdatePageData; // Запретить обновление данных о странице? std::stack m_arDivId; bool m_bWasDivs; std::map m_mFootnotes; // Сноски std::map m_mBookmarks; // Закладки using anchors_map = std::map; anchors_map m_mAnchors; // Map якорей с индивидуальными id NSFonts::IApplicationFonts* m_pFonts; // Необходимо для оптимизации работы со шрифтами public: COOXMLWriter(THTMLParameters* pHTMLParameters = nullptr, NSCSS::CCssCalculator* pCSSCalculator = nullptr); 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(); bool OpenR(); bool OpenT(); void OpenHyperlink(); void CloseP(); void CloseR(); void CloseT(); void CloseHyperlink(); void PageBreak() override; void BeginBlock() override; void EndBlock(bool bAddBlock) override; void SetDataOutput(XmlString* pOutputData) override; void RevertDataOutput() override; void SaveState(); void RollBackState(); void SetCurrentDocument(XmlString* pNewDocument); void Break(const std::vector& arSelectors); void SetHyperlinkData(const std::wstring& wsRef, const std::wstring& wsTooltip, bool bIsCross, const std::wstring& wsFootnote, bool bIsFootnote); void ClearHyperlinkData(); void OpenCrossHyperlink(const std::wstring& wsRef); void OpenExternalHyperlink(const std::wstring& wsRef, const std::wstring& wsTooltip); void CloseCrossHyperlink(const std::vector& arSelectors, std::wstring wsFootnote, const std::wstring& wsRef); void CloseExternalHyperlink(); std::wstring WritePPr(const std::vector& arSelectors); std::wstring WriteRPr(XmlString& oXml, const std::vector& arSelectors); bool WriteText(std::wstring wsText, const std::vector& arSelectors) override; void WriteEmptyParagraph(bool bVahish = false, bool bInP = false) override; void WriteSpace(); void WriteEmptyBookmark(const std::wstring& wsId); std::wstring AddLiteBookmark(); std::wstring WriteBookmark(const std::wstring& wsId); std::wstring AddAnchor(const std::wstring& wsAnchorValue); void WriteImage(const TImageData& oImageData, const std::wstring& wsId); void WriteAlternativeImage(const std::wstring& wsAlt, const std::wstring& wsSrc, const TImageData& oImageData); void WriteEmptyImage(int nWidth, int nHeight, const std::wstring& wsName = L"", const std::wstring& wsDescr = L""); void WriteImageRels(const std::wstring& wsImageId, const std::wstring& wsImageName); std::wstring GetStyle(const NSCSS::CCompiledStyle& oStyle, bool bParagraphStyle); void UpdatePageStyle(const std::vector& arSelectors); void SetBaseFont(const std::wstring& wsFontStyles); void SetDivId(const std::wstring& wsDivId); void RollBackDivId(); void IncreaseListId(); int GetListId() const; std::wstring FindFootnote(const std::wstring& wsId); void OpenFootnote(const std::wstring& wsFootnoteID); void CloseFootnote(); XmlString& GetStylesXml(); XmlString& GetDocRelsXml(); XmlString& GetNotesRelsXml(); XmlString& GetDocumentXml(); XmlString& GetNotesXml(); XmlString& GetNumberingXml(); XmlString& GetWebSettingsXml(); XmlString* GetCurrentDocument() const override; const NSCSS::NSProperties::CPage* GetPageData() const; NSFonts::IApplicationFonts* GetFonts(); std::wstring GetMediaDir() const; std::wstring GetTempDir() const; std::wstring GetSrcPath() const; std::wstring GetBasePath() const; std::wstring GetCorePath() const; }; } #endif // OOXMLWRITER_H