This commit is contained in:
Green
2025-06-12 23:28:06 +03:00
parent 4e272d8ecf
commit 383a616c97
2 changed files with 30 additions and 13 deletions

View File

@ -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<unsigned int, const CCtrlField*> 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)
{}
};

View File

@ -299,6 +299,13 @@ void CConverter2OOXML::WriteCharacter(const CCtrlCharacter* pCharacter, short sh
{
case ECtrlCharType::PARAGRAPH_BREAK:
{
// Таблицы пишутся без тега <w:p>, поэтому для них не открывается параграф
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"<w:r>");
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"<w:p>");
@ -503,8 +519,6 @@ void CConverter2OOXML::WriteEmptyParagraph(short shParaShapeID, short shParaStyl
oBuilder.WriteString(L"</w:pPr>");
oBuilder.WriteString(L"</w:p>");
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"<w:tbl>");
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"</w:tbl>");
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"<w:p>");
oState.m_bOpenedP = true;
oState.m_bLastEmptyNode = false;
WriteParagraphProperties(shParaShapeID, shParaStyleID, oBuilder, oState);
}
@ -1857,10 +1873,9 @@ std::vector<std::wstring> 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;