From 20d2ff7954ee0d275edf97ce4524254863993feb Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Sat, 14 Dec 2024 11:18:42 +0300 Subject: [PATCH] Refactoring --- DocxRenderer/DocxRenderer.cpp | 35 +------- DocxRenderer/src/logic/Page.cpp | 52 +++++++++-- DocxRenderer/src/logic/Page.h | 95 +++++++++++---------- DocxRenderer/src/resources/VectorGraphics.h | 3 - 4 files changed, 99 insertions(+), 86 deletions(-) diff --git a/DocxRenderer/DocxRenderer.cpp b/DocxRenderer/DocxRenderer.cpp index bef210f8b2..740f66beac 100644 --- a/DocxRenderer/DocxRenderer.cpp +++ b/DocxRenderer/DocxRenderer.cpp @@ -126,20 +126,7 @@ std::vector CDocxRenderer::ScanPage(IOfficeDrawingFile* pFile, siz DrawPage(pFile, nPage); - std::vector xml_shapes; - for (const auto& shape : m_pInternal->m_oDocument.m_oCurrentPage.m_arShapes) - { - if (!shape) continue; - auto writer = new NSStringUtils::CStringBuilder(); - shape->ToXml(*writer); - xml_shapes.push_back(writer->GetData()); - delete writer; - } - - std::vector& arComleteObjects = m_pInternal->m_oDocument.m_oCurrentPage.m_arCompleteObjectsXml; - if (!arComleteObjects.empty()) - xml_shapes.insert(xml_shapes.end(), arComleteObjects.begin(), arComleteObjects.end()); - + auto xml_shapes = m_pInternal->m_oDocument.m_oCurrentPage.GetXmlShapes(); m_pInternal->m_oDocument.Clear(); return xml_shapes; } @@ -154,23 +141,7 @@ std::vector CDocxRenderer::ScanPagePptx(IOfficeDrawingFile* pFile, DrawPage(pFile, nPage); - // for drawingml is no tag behind-doc - so we need to reorder shapes - m_pInternal->m_oDocument.m_oCurrentPage.ReorderShapesForPptx(); - - std::vector xml_shapes; - for (const auto& shape : m_pInternal->m_oDocument.m_oCurrentPage.m_arShapes) - { - if (!shape) continue; - auto writer = new NSStringUtils::CStringBuilder(); - shape->ToXmlPptx(*writer); - xml_shapes.push_back(writer->GetData()); - delete writer; - } - - std::vector& arComleteObjects = m_pInternal->m_oDocument.m_oCurrentPage.m_arCompleteObjectsXml; - if (!arComleteObjects.empty()) - xml_shapes.insert(xml_shapes.end(), arComleteObjects.begin(), arComleteObjects.end()); - + auto xml_shapes = m_pInternal->m_oDocument.m_oCurrentPage.GetXmlShapesPptx(); m_pInternal->m_oDocument.Clear(); return xml_shapes; } @@ -241,7 +212,7 @@ HRESULT CDocxRenderer::AdvancedCommand(IAdvancedCommand* command) std::string sNewId = "r:embed=\"rId" + std::to_string(pInfo->m_nId + c_iStartingIdForImages) + "\""; NSStringUtils::string_replaceA(sUtf8Shape, "r:embed=\"\"", sNewId); } - m_pInternal->m_oDocument.m_oCurrentPage.m_arCompleteObjectsXml.push_back(UTF8_TO_U(sUtf8Shape)); + m_pInternal->m_oDocument.m_oCurrentPage.AddCompleteXml(UTF8_TO_U(sUtf8Shape)); return S_OK; } case IAdvancedCommand::AdvancedCommandType::ShapeEnd: diff --git a/DocxRenderer/src/logic/Page.cpp b/DocxRenderer/src/logic/Page.cpp index 93c96fac6b..2aef825cdc 100644 --- a/DocxRenderer/src/logic/Page.cpp +++ b/DocxRenderer/src/logic/Page.cpp @@ -54,6 +54,7 @@ namespace NSDocxRenderer m_oEdgeText.SetDefaultParams(); m_oTransform.Reset(); + m_oHorVerLinesCollector.Clear(); m_arConts.clear(); m_arTextLines.clear(); m_arDiacriticalSymbols.clear(); @@ -413,6 +414,45 @@ namespace NSDocxRenderer ToXml(oWriter); WriteSectionToFile(bIsLastPage, oWriter); } + + std::vector CPage::GetXmlShapes() + { + std::vector xml_shapes; + for (const auto& shape : m_arShapes) + { + if (!shape) continue; + auto writer = new NSStringUtils::CStringBuilder(); + shape->ToXml(*writer); + xml_shapes.push_back(writer->GetData()); + delete writer; + } + if (!m_arCompleteObjectsXml.empty()) + xml_shapes.insert(xml_shapes.end(), m_arCompleteObjectsXml.begin(), m_arCompleteObjectsXml.end()); + + return xml_shapes; + } + std::vector CPage::GetXmlShapesPptx() + { + ReorderShapesForPptx(); + + std::vector xml_shapes; + for (const auto& shape : m_arShapes) + { + if (!shape) continue; + auto writer = new NSStringUtils::CStringBuilder(); + shape->ToXmlPptx(*writer); + xml_shapes.push_back(writer->GetData()); + delete writer; + } + if (!m_arCompleteObjectsXml.empty()) + xml_shapes.insert(xml_shapes.end(), m_arCompleteObjectsXml.begin(), m_arCompleteObjectsXml.end()); + + return xml_shapes; + } + void CPage::AddCompleteXml(const std::wstring oXml) + { + m_arCompleteObjectsXml.push_back(oXml); + } void CPage::ReorderShapesForPptx() { // переместим nullptr в конец и удалим @@ -942,7 +982,7 @@ namespace NSDocxRenderer } } - bool CPage::IsLineCrossingText(shape_ptr_t pShape, cont_ptr_t pCont) + bool CPage::IsLineCrossingText(shape_ptr_t pShape, cont_ptr_t pCont) const noexcept { auto h_type = pCont->CBaseItem::GetHorizontalCrossingType(pShape.get()); double dTopBorder = pCont->m_dTop + pCont->m_dHeight / 3; @@ -967,7 +1007,7 @@ namespace NSDocxRenderer return bIf1 && bIf2 && bIf3 && bIf4; } - bool CPage::IsLineBelowText(shape_ptr_t pShape, cont_ptr_t pCont) + bool CPage::IsLineBelowText(shape_ptr_t pShape, cont_ptr_t pCont) const noexcept { auto h_type = pCont->CBaseItem::GetHorizontalCrossingType(pShape.get()); bool bIf1 = (pShape->m_eGraphicsType == eGraphicsType::gtRectangle || @@ -991,7 +1031,7 @@ namespace NSDocxRenderer return bIf1 && bIf2 && bIf3 && bIf4; } - bool CPage::IsHighlight(shape_ptr_t pShape, cont_ptr_t pCont) + bool CPage::IsHighlight(shape_ptr_t pShape, cont_ptr_t pCont) const noexcept { auto h_type = pCont->CBaseItem::GetHorizontalCrossingType(pShape.get()); @@ -1021,7 +1061,7 @@ namespace NSDocxRenderer return bIf1 && bIf2 && bIf3 && bIf4 && !bIf5 && bIf6 && bIf7; } - bool CPage::IsOutline(shape_ptr_t pShape, cont_ptr_t pCont) + bool CPage::IsOutline(shape_ptr_t pShape, cont_ptr_t pCont) const noexcept { auto h_type = pCont->CBaseItem::GetHorizontalCrossingType(pShape.get()); auto v_type = pCont->CBaseItem::GetVerticalCrossingType(pShape.get()); @@ -1129,7 +1169,7 @@ namespace NSDocxRenderer } } - void CPage::ToXml(NSStringUtils::CStringBuilder& oWriter) + void CPage::ToXml(NSStringUtils::CStringBuilder& oWriter) const noexcept { bool bIsNeedWP = !m_arShapes.empty(); @@ -1893,7 +1933,7 @@ namespace NSDocxRenderer return pShape; } - void CPage::WriteSectionToFile(bool bLastPage, NSStringUtils::CStringBuilder& oWriter) + void CPage::WriteSectionToFile(bool bLastPage, NSStringUtils::CStringBuilder& oWriter) const noexcept { // section int lWidthDx = (int)(m_dWidth * c_dMMToDx); diff --git a/DocxRenderer/src/logic/Page.h b/DocxRenderer/src/logic/Page.h index a5e74ea338..399560f95f 100644 --- a/DocxRenderer/src/logic/Page.h +++ b/DocxRenderer/src/logic/Page.h @@ -18,51 +18,27 @@ namespace NSDocxRenderer CManagers(const CManagers& other) = default; ~CManagers() = default; - CImageManager* pImageManager; - CFontStyleManager* pFontStyleManager; - CParagraphStyleManager* pParagraphStyleManager; - CFontManager* pFontManager; - CFontSelector* pFontSelector; + CImageManager* pImageManager; + CFontStyleManager* pFontStyleManager; + CParagraphStyleManager* pParagraphStyleManager; + CFontManager* pFontManager; + CFontSelector* pFontSelector; }; - using shape_ptr_t = std::shared_ptr; - using cont_ptr_t = std::shared_ptr; - using line_ptr_t = std::shared_ptr; - using item_ptr_t = std::shared_ptr; - using paragraph_ptr_t = std::shared_ptr; - double m_dWidth {0.0}; double m_dHeight{0.0}; LONG m_lCurrentCommand{0}; LONG m_lClipMode {0}; - TextAssociationType m_eTextAssociationType{TextAssociationType::tatPlainParagraph}; - + TextAssociationType m_eTextAssociationType{TextAssociationType::tatPlainParagraph}; NSFonts::IApplicationFonts* m_pAppFonts{nullptr}; - - NSStructures::CFont m_oFont; - NSStructures::CPen m_oPen; - NSStructures::CBrush m_oBrush; - NSStructures::CShadow m_oShadow; - NSStructures::CEdgeText m_oEdgeText; - - Aggplus::CMatrix m_oTransform; - CManagers m_oManagers; - - CVectorGraphics m_oCurrVectorGraphics, m_oClipVectorGraphics; - - CContTextBuilder m_oContBuilder; - CHorVerLinesCollector m_oHorVerLinesCollector; - - std::vector m_arConts; - std::vector m_arTextLines; - std::vector m_arDiacriticalSymbols; - std::vector m_arShapes; - std::vector m_arParagraphs; - - std::vector m_arOutputObjects; - std::vector m_arCompleteObjectsXml; + NSStructures::CFont m_oFont{}; + NSStructures::CPen m_oPen{}; + NSStructures::CBrush m_oBrush{}; + NSStructures::CShadow m_oShadow{}; + NSStructures::CEdgeText m_oEdgeText{}; + Aggplus::CMatrix m_oTransform{}; bool m_bIsDeleteTextClipPage{true}; bool m_bIsRecalcFontSize {true}; @@ -100,9 +76,18 @@ namespace NSDocxRenderer void Analyze(); void Record(NSStringUtils::CStringBuilder& oWriter, bool bIsLastPage); - void ReorderShapesForPptx(); + + std::vector GetXmlShapes(); + std::vector GetXmlShapesPptx(); + void AddCompleteXml(const std::wstring oXml); private: + using shape_ptr_t = std::shared_ptr; + using cont_ptr_t = std::shared_ptr; + using line_ptr_t = std::shared_ptr; + using item_ptr_t = std::shared_ptr; + using paragraph_ptr_t = std::shared_ptr; + // returns std::vector of conts with diac. symbols and remove it from m_arConts std::vector MoveDiacriticalSymbols(); @@ -166,23 +151,43 @@ namespace NSDocxRenderer // calc true shapes rotation for ooxml format void CalcShapesRotation(); + // for drawingml is no tag behind-doc - so we need to reorder shapes + void ReorderShapesForPptx(); + // get lines by groups by X std::vector> GetLinesByGroups(); - bool IsLineCrossingText(shape_ptr_t pShape, cont_ptr_t pCont); - bool IsLineBelowText(shape_ptr_t pShape, cont_ptr_t pCont); - bool IsHighlight(shape_ptr_t pShape, cont_ptr_t pCont); - bool IsOutline(shape_ptr_t pShape, cont_ptr_t pCont); + bool IsLineCrossingText(shape_ptr_t pShape, cont_ptr_t pCont) const noexcept; + bool IsLineBelowText(shape_ptr_t pShape, cont_ptr_t pCont) const noexcept; + bool IsHighlight(shape_ptr_t pShape, cont_ptr_t pCont) const noexcept; + bool IsOutline(shape_ptr_t pShape, cont_ptr_t pCont) const noexcept; bool IsShapeBorderBetweenVertical(line_ptr_t pFirst, line_ptr_t pSecond) const noexcept; bool IsShapeBorderBetweenHorizontal(line_ptr_t pFirst, line_ptr_t pSecond) const noexcept; bool IsShapeBorderTrough(cont_ptr_t pItem, double& dXCrossing, double& dYCrossing) const noexcept; - shape_ptr_t CreateSingleLineShape(line_ptr_t& pLine); - shape_ptr_t CreateSingleParagraphShape(paragraph_ptr_t& pParagraph); + void ToXml(NSStringUtils::CStringBuilder& oWriter) const noexcept; + void WriteSectionToFile(bool bLastPage, NSStringUtils::CStringBuilder& oWriter) const noexcept; - void ToXml(NSStringUtils::CStringBuilder& oWriter); - void WriteSectionToFile(bool bLastPage, NSStringUtils::CStringBuilder& oWriter); + static shape_ptr_t CreateSingleLineShape(line_ptr_t& pLine); + static shape_ptr_t CreateSingleParagraphShape(paragraph_ptr_t& pParagraph); + + CManagers m_oManagers; + + CVectorGraphics m_oCurrVectorGraphics; + CVectorGraphics m_oClipVectorGraphics; + + CContTextBuilder m_oContBuilder; + CHorVerLinesCollector m_oHorVerLinesCollector; + + std::vector m_arConts; + std::vector m_arTextLines; + std::vector m_arDiacriticalSymbols; + std::vector m_arShapes; + std::vector m_arParagraphs; + + std::vector m_arOutputObjects; + std::vector m_arCompleteObjectsXml; size_t m_nShapeOrder = 0; }; diff --git a/DocxRenderer/src/resources/VectorGraphics.h b/DocxRenderer/src/resources/VectorGraphics.h index f0a0a0c556..bd43bebc76 100644 --- a/DocxRenderer/src/resources/VectorGraphics.h +++ b/DocxRenderer/src/resources/VectorGraphics.h @@ -104,10 +104,7 @@ namespace NSDocxRenderer CHorVerLinesCollector() = default; ~CHorVerLinesCollector() = default; - // after call m_arHorizontal is empty const std::vector>& GetHorizontal(); - - // after call m_arVertical is empty const std::vector>& GetVertical(); void AddVector(const CVectorGraphics& oVector);