diff --git a/HwpFile/HwpDoc/Conversion/ConversionState.h b/HwpFile/HwpDoc/Conversion/ConversionState.h index a4b9089268..22daf378b5 100644 --- a/HwpFile/HwpDoc/Conversion/ConversionState.h +++ b/HwpFile/HwpDoc/Conversion/ConversionState.h @@ -18,7 +18,7 @@ struct TConversionState bool m_bOpenedR; bool m_bIsNote; bool m_bInTable; - bool m_bLastEmptyNode; + ECtrlObjectType m_ePrevElementType; bool m_bInTextBox; // TODO:: используется, чтобы в wps:txbx не появилась новая фигура (посмотреть этот момент нужно подробнее) @@ -47,7 +47,7 @@ struct TConversionState std::map m_mOpenField; TConversionState() - : m_bOpenedP(false), m_bOpenedR(false), m_bIsNote(false), m_bInTable(false), m_bLastEmptyNode(false), m_bInTextBox(false), m_ushLastCharShapeId(-1), m_ushSecdIndex(0), m_unParaIndex(0), + : m_bOpenedP(false), m_bOpenedR(false), m_bIsNote(false), m_bInTable(false), m_ePrevElementType(ECtrlObjectType::Empty), m_bInTextBox(false), m_ushLastCharShapeId(-1), m_ushSecdIndex(0), m_unParaIndex(0), m_pSectionDef(nullptr), m_pColumnDef(nullptr), m_pPageNum(nullptr), m_pNewNumber(nullptr), m_pRelationships(nullptr), m_eBreakType(EBreakType::None) {} }; diff --git a/HwpFile/HwpDoc/Conversion/Converter2OOXML.cpp b/HwpFile/HwpDoc/Conversion/Converter2OOXML.cpp index cf4c15473b..06b0e6936c 100644 --- a/HwpFile/HwpDoc/Conversion/Converter2OOXML.cpp +++ b/HwpFile/HwpDoc/Conversion/Converter2OOXML.cpp @@ -299,6 +299,13 @@ void CConverter2OOXML::WriteCharacter(const CCtrlCharacter* pCharacter, short sh { case ECtrlCharType::PARAGRAPH_BREAK: { + // Таблицы пишутся без тега , поэтому для них не открывается параграф + if (ECtrlObjectType::Table == oState.m_ePrevElementType && !oState.m_bInTable) + { + oState.m_ePrevElementType = ECtrlObjectType::Character; + break; + } + if (!oState.m_bOpenedP) WriteEmptyParagraph(shParaShapeID, shParaStyleID, pCharacter->GetCharShapeId(), oBuilder, oState); else @@ -322,6 +329,8 @@ void CConverter2OOXML::WriteShape(const CCtrlGeneralShape* pShape, short shParaS if (nullptr == pShape || oState.m_bInTextBox) return; + oState.m_ePrevElementType = ECtrlObjectType::Shape; + switch (pShape->GetShapeType()) { case EShapeType::Arc: @@ -368,6 +377,11 @@ void CConverter2OOXML::WriteShape(const CCtrlGeneralShape* pShape, short shParaS void CConverter2OOXML::WriteNote(const CCtrlNote* pNote, short shParaShapeID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState) { + if (nullptr == pNote) + return; + + oState.m_ePrevElementType = ECtrlObjectType::Note; + oBuilder.WriteString(L""); CRunnerStyle oRunnerStyle; @@ -385,6 +399,8 @@ void CConverter2OOXML::WriteField(const CCtrlField* pShape, short shParaShapeID, if (nullptr == pShape) return; + oState.m_ePrevElementType = ECtrlObjectType::AutoNumber; + switch (pShape->GetType()) { case EFieldType::Hyperlink: @@ -492,7 +508,7 @@ void CConverter2OOXML::WriteCaption(const CCtrlCommon* pCtrlCommon, NSStringUtil void CConverter2OOXML::WriteEmptyParagraph(short shParaShapeID, short shParaStyleID, short shCharShapeID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState) { - if (oState.m_bOpenedP || oState.m_bLastEmptyNode) + if (oState.m_bOpenedP) return; oBuilder.WriteString(L""); @@ -503,8 +519,6 @@ void CConverter2OOXML::WriteEmptyParagraph(short shParaShapeID, short shParaStyl oBuilder.WriteString(L""); oBuilder.WriteString(L""); - - oState.m_bLastEmptyNode = true; } void CConverter2OOXML::WriteParagraph(const CHWPPargraph* pParagraph, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState) @@ -536,7 +550,6 @@ void CConverter2OOXML::WriteParagraph(const CHWPPargraph* pParagraph, NSStringUt case ECtrlObjectType::ParaText: { WriteText((const CParaText*)pCtrl, pParagraph->GetRangeTags(), pParagraph->GetShapeID(), pParagraph->GetStyleID(), oBuilder, oState); - // WriteText(((const CParaText*)pCtrl)->GetText(), pParagraph->GetShapeID(), ((const CParaText*)pCtrl)->GetCharShapeID(), oBuilder, oState); break; } case ECtrlObjectType::Character: @@ -601,7 +614,6 @@ void CConverter2OOXML::WriteParagraph(const CHWPPargraph* pParagraph, NSStringUt } CloseParagraph(oBuilder, oState); - oState.m_bLastEmptyNode = false; } void CConverter2OOXML::WriteParagraphProperties(short shParaShapeID, short shParaStyleID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState) @@ -668,14 +680,17 @@ void CConverter2OOXML::WriteTable(const CCtrlTable* pTable, short shParaShapeID, if (nullptr == pTable || pTable->Empty()) return; + oState.m_ePrevElementType = ECtrlObjectType::Table; + CloseParagraph(oBuilder, oState); ++m_ushTableCount; oBuilder.WriteString(L""); + const bool bTableInTable = oState.m_bInTable; + oState.m_bInTable = true; - oState.m_bLastEmptyNode = false; WriteTableProperties(pTable, shParaShapeID, shParaStyleID, oBuilder, oState); @@ -753,7 +768,7 @@ void CConverter2OOXML::WriteTable(const CCtrlTable* pTable, short shParaShapeID, oBuilder.WriteString(L""); - oState.m_bInTable = false; + oState.m_bInTable = bTableInTable; } void CConverter2OOXML::WriteTableProperties(const CCtrlTable* pTable, short shParaShapeID, short shParaStyleID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState) @@ -828,8 +843,10 @@ void CConverter2OOXML::WriteCell(const CTblCell* pCell, NSStringUtils::CStringBu for (const CHWPPargraph* pParagraph : pCell->GetParagraphs()) { NSStringUtils::CStringBuilder oCellBuilder; + TConversionState oCellState; oCellState.m_pRelationships = oState.m_pRelationships; + oCellState.m_bInTable = oState.m_bInTable; WriteParagraph(pParagraph, oCellBuilder, oCellState); @@ -1736,7 +1753,6 @@ void CConverter2OOXML::OpenParagraph(short shParaShapeID, short shParaStyleID, N oBuilder.WriteString(L""); oState.m_bOpenedP = true; - oState.m_bLastEmptyNode = false; WriteParagraphProperties(shParaShapeID, shParaStyleID, oBuilder, oState); } @@ -1857,10 +1873,9 @@ std::vector SplitText(const std::wstring& wsText) void CConverter2OOXML::WriteText(const HWP_STRING& wsText, short shParaShapeID, short shParaStyleID, short shCharShapeID, NSStringUtils::CStringBuilder& oBuilder, TConversionState& oState, const CRunnerStyle& oExternalStyle) { if (!oState.m_bOpenedP && wsText.empty()) - { - WriteEmptyParagraph(shParaShapeID, shParaStyleID, shCharShapeID, oBuilder, oState); return; - } + + oState.m_ePrevElementType = ECtrlObjectType::ParaText; OpenParagraph(shParaShapeID, shParaStyleID, oBuilder, oState); @@ -2042,6 +2057,8 @@ void CConverter2OOXML::WriteAutoNumber(const CCtrlAutoNumber* pAutoNumber, short if (nullptr == pAutoNumber) return; + oState.m_ePrevElementType = ECtrlObjectType::AutoNumber; + unsigned short ushValue = 0; HWP_STRING wsType;