Refactoring

This commit is contained in:
Kirill Polyakov
2026-02-04 16:30:08 +03:00
parent 65a4fa90a5
commit 2f34fd917e
12 changed files with 273 additions and 183 deletions

View File

@ -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<NSCSS::CNode>& arSelectors) = 0;

View File

@ -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;
}

View File

@ -2,17 +2,12 @@
#define MDWRITER_H
#include "IWriter.h"
#include "../MarkdownParameters.h"
#include <stack>
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<TState> 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<NSCSS::CNode>& 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;

View File

@ -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"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">";
if(pParams)
if(nullptr != m_pHTMLParameters)
{
if(!pParams->m_sBookTitle.empty())
if(!m_pHTMLParameters->m_sBookTitle.empty())
{
sCore += L"<dc:title>";
sCore += EncodeXmlString(pParams->m_sBookTitle);
sCore += EncodeXmlString(m_pHTMLParameters->m_sBookTitle);
sCore += L"</dc:title>";
}
if(!pParams->m_sAuthors.empty())
if(!m_pHTMLParameters->m_sAuthors.empty())
{
sCore += L"<dc:creator>";
sCore += EncodeXmlString(pParams->m_sAuthors);
sCore += EncodeXmlString(m_pHTMLParameters->m_sAuthors);
sCore += L"</dc:creator>";
}
if(!pParams->m_sGenres.empty())
if(!m_pHTMLParameters->m_sGenres.empty())
{
sCore += L"<dc:subject>";
sCore += EncodeXmlString(pParams->m_sGenres);
sCore += EncodeXmlString(m_pHTMLParameters->m_sGenres);
sCore += L"</dc:subject>";
}
if(!pParams->m_sDate.empty())
if(!m_pHTMLParameters->m_sDate.empty())
{
sCore += L"<dcterms:created xsi:type=\"dcterms:W3CDTF\">";
sCore += EncodeXmlString(pParams->m_sDate);
sCore += EncodeXmlString(m_pHTMLParameters->m_sDate);
sCore += L"</dcterms:created>";
}
if(!pParams->m_sDescription.empty())
if(!m_pHTMLParameters->m_sDescription.empty())
{
sCore += L"<dc:description>";
sCore += EncodeXmlString(pParams->m_sDescription);
sCore += EncodeXmlString(m_pHTMLParameters->m_sDescription);
sCore += L"</dc:description>";
}
if (!pParams->m_sLanguage.empty())
if (!m_pHTMLParameters->m_sLanguage.empty())
{
wsCurrentLanguage = IndentifyLanguage(pParams->m_sLanguage);
wsCurrentLanguage = IndentifyLanguage(m_pHTMLParameters->m_sLanguage);
sCore += L"<dc:language>";
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"<w:rPrDefault><w:rPr>";
@ -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"<w:style w:type=\"paragraph\" w:styleId=\"normal\" w:default=\"1\"><w:name w:val=\"Normal\"/><w:qFormat/><w:rPr><w:rFonts w:eastAsiaTheme=\"minorEastAsia\"/>";
@ -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<NSCSS::CNode>& arSelectors)

View File

@ -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 <stack>
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();