This commit is contained in:
ElenaSubbotina
2024-10-29 10:13:34 +03:00
parent edfa558a38
commit 571a7ee2d1
5 changed files with 90 additions and 50 deletions

View File

@ -236,6 +236,20 @@ bool OOXMathReader::ParseElement(ReaderParameter oParam , OOX::WritingElement *
rtfMath->AddItem(oSubMath); rtfMath->AddItem(oSubMath);
} }
}break; }break;
case OOX::et_m_borderBox:
{
OOX::Logic::CBorderBox* ooxSubMath = dynamic_cast<OOX::Logic::CBorderBox*>(ooxMath);
if (ooxSubMath)
{
RtfMathPtr oSubMath;
if (ParseElement(oParam, ooxSubMath->m_oBorderBoxPr.GetPointer(), oSubMath))
rtfMath->AddItem(oSubMath);
oSubMath.reset();
if (ParseElement(oParam, ooxSubMath->m_oElement.GetPointer(), oSubMath))
rtfMath->AddItem(oSubMath);
}
}break;
case OOX::et_m_box: case OOX::et_m_box:
{ {
OOX::Logic::CBox *ooxSubMath = dynamic_cast<OOX::Logic::CBox *>(ooxMath); OOX::Logic::CBox *ooxSubMath = dynamic_cast<OOX::Logic::CBox *>(ooxMath);
@ -250,6 +264,25 @@ bool OOXMathReader::ParseElement(ReaderParameter oParam , OOX::WritingElement *
rtfMath->AddItem(oSubMath); rtfMath->AddItem(oSubMath);
} }
}break; }break;
case OOX::et_m_borderBoxPr:
{
OOX::Logic::CBorderBoxPr* ooxSubMath = dynamic_cast<OOX::Logic::CBorderBoxPr*>(ooxMath);
if (ooxSubMath)
{
RtfMathPtr oSubMath;
if (ParseElement(oParam, ooxSubMath->m_oCtrlPr.GetPointer(), oSubMath))
rtfMath->AddItem(oSubMath);
//nullable<OOX::Logic::CHideBot> m_oHideBot;
//nullable<OOX::Logic::CHideLeft> m_oHideLeft;
//nullable<OOX::Logic::CHideRight> m_oHideRight;
//nullable<OOX::Logic::CHideTop> m_oHideTop;
//nullable<OOX::Logic::CStrikeBLTR> m_oStrikeBLTR;
//nullable<OOX::Logic::CStrikeH> m_oStrikeH;
//nullable<OOX::Logic::CStrikeTLBR> m_oStrikeTLBR;
//nullable<OOX::Logic::CStrikeV> m_oStrikeV;
}
}break;
case OOX::et_m_boxPr: case OOX::et_m_boxPr:
{ {
OOX::Logic::CBoxPr *ooxSubMath = dynamic_cast<OOX::Logic::CBoxPr *>(ooxMath); OOX::Logic::CBoxPr *ooxSubMath = dynamic_cast<OOX::Logic::CBoxPr *>(ooxMath);

View File

@ -468,7 +468,7 @@ bool OOXParagraphReader::Parse3( ReaderParameter oParam , RtfParagraph& oOutputP
oMathReader.m_oCharProperty = m_oCharProperty; oMathReader.m_oCharProperty = m_oCharProperty;
oMathReader.m_oCharProperty.Merge(oOutputParagraph.m_oProperty.m_oCharProperty); oMathReader.m_oCharProperty.Merge(oOutputParagraph.m_oProperty.m_oCharProperty);
if(true == oMathReader.Parse( oParam, (*oNewMath) ) ) if (true == oMathReader.Parse( oParam, (*oNewMath) ) )
oOutputParagraph.AddItem( oNewMath ); oOutputParagraph.AddItem( oNewMath );
}break; }break;
case OOX::et_m_oMathPara: case OOX::et_m_oMathPara:
@ -482,17 +482,17 @@ bool OOXParagraphReader::Parse3( ReaderParameter oParam , RtfParagraph& oOutputP
oMathReader.m_oCharProperty = m_oCharProperty; oMathReader.m_oCharProperty = m_oCharProperty;
oMathReader.m_oCharProperty.Merge(oOutputParagraph.m_oProperty.m_oCharProperty); oMathReader.m_oCharProperty.Merge(oOutputParagraph.m_oProperty.m_oCharProperty);
if(true == oMathReader.Parse( oParam, (*oNewMath) ) ) if (true == oMathReader.Parse( oParam, (*oNewMath) ) )
oOutputParagraph.AddItem( oNewMath ); oOutputParagraph.AddItem( oNewMath );
}break; }break;
case OOX::et_w_sdt: case OOX::et_w_sdt:
{ {
OOX::Logic::CSdt * pSdt = dynamic_cast<OOX::Logic::CSdt*>(m_ooxElement); OOX::Logic::CSdt * pSdt = dynamic_cast<OOX::Logic::CSdt*>(m_ooxElement);
if( pSdt->m_oSdtEndPr.IsInit() ) if (pSdt->m_oSdtEndPr.IsInit() )
{ {
//todo //todo
} }
if(pSdt->m_oSdtContent.IsInit()) if (pSdt->m_oSdtContent.IsInit())
{ {
if (pSdt->m_oSdtContent->m_arrItems.size() > 0) if (pSdt->m_oSdtContent->m_arrItems.size() > 0)
{ {
@ -508,12 +508,12 @@ bool OOXParagraphReader::Parse3( ReaderParameter oParam , RtfParagraph& oOutputP
{ {
OOX::Logic::CCommentRangeStart * pCommentStart = dynamic_cast<OOX::Logic::CCommentRangeStart*>(m_ooxElement); OOX::Logic::CCommentRangeStart * pCommentStart = dynamic_cast<OOX::Logic::CCommentRangeStart*>(m_ooxElement);
if(pCommentStart->m_oId.IsInit()) if (pCommentStart->m_oId.IsInit())
{ {
int nId = pCommentStart->m_oId->GetValue(); int nId = pCommentStart->m_oId->GetValue();
std::map<int, OOXReader::_comment>::iterator pFind = oParam.oReader->m_mapComments.find( nId ); std::map<int, OOXReader::_comment>::iterator pFind = oParam.oReader->m_mapComments.find( nId );
if( pFind == oParam.oReader->m_mapComments.end()) if (pFind == oParam.oReader->m_mapComments.end())
{ {
RtfAnnotElemPtr oNewAnnotElem ( new RtfAnnotElem(1) ); RtfAnnotElemPtr oNewAnnotElem ( new RtfAnnotElem(1) );
oNewAnnotElem->m_sValue = std::to_wstring(0x7700000 + nId); oNewAnnotElem->m_sValue = std::to_wstring(0x7700000 + nId);
@ -535,7 +535,7 @@ bool OOXParagraphReader::Parse3( ReaderParameter oParam , RtfParagraph& oOutputP
std::map<int, OOXReader::_comment>::iterator pFindRef = oParam.oReader->m_mapComments.find( nId ); std::map<int, OOXReader::_comment>::iterator pFindRef = oParam.oReader->m_mapComments.find( nId );
if( pFindRef != oParam.oReader->m_mapComments.end()) if (pFindRef != oParam.oReader->m_mapComments.end())
{ {
RtfAnnotElemPtr oNewAnnotElem ( new RtfAnnotElem(2) ); RtfAnnotElemPtr oNewAnnotElem ( new RtfAnnotElem(2) );
oNewAnnotElem->m_sValue = pFindRef->second.ref; oNewAnnotElem->m_sValue = pFindRef->second.ref;
@ -546,7 +546,7 @@ bool OOXParagraphReader::Parse3( ReaderParameter oParam , RtfParagraph& oOutputP
if (pFindComment != oParam.oDocx->m_oMain.comments->m_mapComments.end()) if (pFindComment != oParam.oDocx->m_oMain.comments->m_mapComments.end())
{ {
if ( pFindComment->second < (int)oParam.oDocx->m_oMain.comments->m_arrComments.size() && pFindComment->second >= 0) if (pFindComment->second < (int)oParam.oDocx->m_oMain.comments->m_arrComments.size() && pFindComment->second >= 0)
{ {
OOX::CComment* oox_comment = oParam.oDocx->m_oMain.comments->m_arrComments[pFindComment->second]; OOX::CComment* oox_comment = oParam.oDocx->m_oMain.comments->m_arrComments[pFindComment->second];
if (oox_comment) if (oox_comment)
@ -688,28 +688,28 @@ bool OOXRunReader::Parse( ReaderParameter oParam , RtfParagraph& oOutputParagrap
{ {
switch(ooxFldChar->m_oFldCharType->GetValue()) switch(ooxFldChar->m_oFldCharType->GetValue())
{ {
case SimpleTypes::fldchartypeBegin: case SimpleTypes::fldchartypeBegin:
{ {
OOXFieldBeginPtr oNewField ( new OOXFieldBegin() ); OOXFieldBeginPtr oNewField(new OOXFieldBegin());
if (ooxFldChar->m_oFldLock.IsInit()) if (ooxFldChar->m_oFldLock.IsInit())
oNewField->m_bLock = ooxFldChar->m_oFldLock->ToBool(); oNewField->m_bLock = ooxFldChar->m_oFldLock->ToBool();
if (ooxFldChar->m_oDirty.IsInit()) if (ooxFldChar->m_oDirty.IsInit())
oNewField->m_bDirty = ooxFldChar->m_oDirty->ToBool(); oNewField->m_bDirty = ooxFldChar->m_oDirty->ToBool();
oNewField->m_oCharProperty = oNewProperty; oNewField->m_oCharProperty = oNewProperty;
oOutputParagraph.AddItem( oNewField ); oOutputParagraph.AddItem(oNewField);
}break; }break;
case SimpleTypes::fldchartypeEnd: case SimpleTypes::fldchartypeEnd:
{ {
OOXFieldEndPtr oNewField ( new OOXFieldEnd() ); OOXFieldEndPtr oNewField(new OOXFieldEnd());
oOutputParagraph.AddItem( oNewField ); oOutputParagraph.AddItem(oNewField);
}break; }break;
case SimpleTypes::fldchartypeSeparate: case SimpleTypes::fldchartypeSeparate:
{ {
OOXFieldSeparatePtr oNewField ( new OOXFieldSeparate() ); OOXFieldSeparatePtr oNewField(new OOXFieldSeparate());
oOutputParagraph.AddItem( oNewField ); oOutputParagraph.AddItem(oNewField);
}break; }break;
default: break; default: break;
} }
} }
}break; }break;
@ -735,7 +735,7 @@ bool OOXRunReader::Parse( ReaderParameter oParam , RtfParagraph& oOutputParagrap
int nID = ooxFootnoteReference->m_oId->GetValue(); int nID = ooxFootnoteReference->m_oId->GetValue();
std::map<int, TextItemContainerPtr>::iterator oPair = oParam.oReader->m_mapFootnotes.find( nID ); std::map<int, TextItemContainerPtr>::iterator oPair = oParam.oReader->m_mapFootnotes.find( nID );
if( oParam.oReader->m_mapFootnotes.end() != oPair ) if (oParam.oReader->m_mapFootnotes.end() != oPair )
{ {
RtfFootnotePtr oNewFootnote ( new RtfFootnote() ); RtfFootnotePtr oNewFootnote ( new RtfFootnote() );
oNewFootnote->m_oCharProp = oNewProperty; oNewFootnote->m_oCharProp = oNewProperty;
@ -753,7 +753,7 @@ bool OOXRunReader::Parse( ReaderParameter oParam , RtfParagraph& oOutputParagrap
int nID = ooxEndnoteReference->m_oId->GetValue(); int nID = ooxEndnoteReference->m_oId->GetValue();
std::map<int, TextItemContainerPtr>::iterator oPair = oParam.oReader->m_mapEndnotes.find ( nID ); std::map<int, TextItemContainerPtr>::iterator oPair = oParam.oReader->m_mapEndnotes.find ( nID );
if( oParam.oReader->m_mapEndnotes.end() != oPair ) if (oParam.oReader->m_mapEndnotes.end() != oPair )
{ {
RtfFootnotePtr oNewEndnote ( new RtfFootnote() ); RtfFootnotePtr oNewEndnote ( new RtfFootnote() );
oNewEndnote->m_oCharProp = oNewProperty; oNewEndnote->m_oCharProp = oNewProperty;

View File

@ -63,7 +63,8 @@ public:
RtfConvertationManager* m_convertationManager; RtfConvertationManager* m_convertationManager;
std::wstring m_sPath; std::wstring m_sPath;
int m_nCurItap; //для определение вложенности таблицы int m_nCurItap = 0; //для определение вложенности таблицы
bool m_bInTable = false;
int m_nCurOleChartId; int m_nCurOleChartId;
int m_nCurFittextId; int m_nCurFittextId;

View File

@ -33,6 +33,7 @@
#include "OOXTableRowReader.h" #include "OOXTableRowReader.h"
#include "OOXTableReader.h" #include "OOXTableReader.h"
#include "OOXParagraphReader.h" #include "OOXParagraphReader.h"
#include "OOXTextItemReader.h"
#include "../../../OOXML/DocxFormat/Logic/Table.h" #include "../../../OOXML/DocxFormat/Logic/Table.h"
#include "../../../OOXML/DocxFormat/Logic/Paragraph.h" #include "../../../OOXML/DocxFormat/Logic/Paragraph.h"
@ -305,26 +306,8 @@ bool OOXTableCellReader::Parse( ReaderParameter oParam ,RtfTableCell& oOutputCel
{ {
switch((*it)->getType()) switch((*it)->getType())
{ {
case OOX::et_w_p: case OOX::et_w_tcPr:
{ break;
OOX::Logic::CParagraph * pParagraph = dynamic_cast<OOX::Logic::CParagraph*>(*it);
RtfParagraphPtr oNewParagraph( new RtfParagraph() );
//применяем к новому параграфу default property
oNewParagraph->m_oProperty = oParam.oRtf->m_oDefaultParagraphProp;
oNewParagraph->m_oProperty.m_oCharProperty = oParam.oRtf->m_oDefaultCharProp;
OOXParagraphReader oParagraphReader(pParagraph);
oParagraphReader.Parse( oParam, (*oNewParagraph), oConditionalTableStyle );
//ставим стиль таблицы
if( NULL != oParam.poTableStyle )
oNewParagraph->m_oProperty.m_nTableStyle = oParam.poTableStyle->m_nID;
oNewParagraph->m_oProperty.m_nItap = oParam.oReader->m_nCurItap;
oNewParagraph->m_oProperty.m_bInTable = 1;
oOutputCell.AddItem( oNewParagraph );
}break;
case OOX::et_w_tbl: case OOX::et_w_tbl:
{ {
OOX::Logic::CTbl * pTbl = dynamic_cast<OOX::Logic::CTbl*>(*it); OOX::Logic::CTbl * pTbl = dynamic_cast<OOX::Logic::CTbl*>(*it);
@ -336,13 +319,23 @@ bool OOXTableCellReader::Parse( ReaderParameter oParam ,RtfTableCell& oOutputCel
oOutputCell.AddItem( oNewTabel ); oOutputCell.AddItem( oNewTabel );
oParam.oReader->m_nCurItap -- ; oParam.oReader->m_nCurItap -- ;
}break; }break;
default: default:
{ {
//todooo - универсальный риадер oParam.oReader->m_bInTable = true;
//OOXElementReader oElementReader((*it));
//ITextItemPtr *rtfElement = oElementReader.Parse( oParam); OOXTextItemReader oElementReader;
//oOutputCell.AddItem( rtfElement ); if (oElementReader.Parse(*it, oParam))
}break; {
if (oElementReader.m_oTextItems)
{
for (auto elm : oElementReader.m_oTextItems->m_aArray)
{
oOutputCell.AddItem(elm);
}
}
}
oParam.oReader->m_bInTable = false;
}break;
} }
} }
return true; return true;

View File

@ -73,15 +73,28 @@ bool OOXTextItemReader::Parse(OOX::WritingElement* ooxElement, ReaderParameter o
OOXParagraphReader oParagraphReader(pParagraph); OOXParagraphReader oParagraphReader(pParagraph);
RtfParagraphPtr oNewParagraph(new RtfParagraph()); RtfParagraphPtr oNewParagraph(new RtfParagraph());
//применяем к новому параграфу default property //применяем к новому параграфу default property
oNewParagraph->m_oProperty = oParam.oRtf->m_oDefaultParagraphProp; oNewParagraph->m_oProperty = oParam.oRtf->m_oDefaultParagraphProp;
oNewParagraph->m_oProperty.m_oCharProperty = oParam.oRtf->m_oDefaultCharProp; oNewParagraph->m_oProperty.m_oCharProperty = oParam.oRtf->m_oDefaultCharProp;
oNewParagraph->m_oProperty.m_nItap = 0;
if (oParam.oReader->m_bInTable)
{
if (NULL != oParam.poTableStyle)
oNewParagraph->m_oProperty.m_nTableStyle = oParam.poTableStyle->m_nID;
oNewParagraph->m_oProperty.m_bInTable = 1;
oNewParagraph->m_oProperty.m_nItap = oParam.oReader->m_nCurItap;
}
else
{
oNewParagraph->m_oProperty.m_nItap = 0;
}
if (true == oParagraphReader.Parse(oParam, (*oNewParagraph), CcnfStyle())) if (true == oParagraphReader.Parse(oParam, (*oNewParagraph), CcnfStyle()))
{ {
m_oTextItems->AddItem(oNewParagraph); m_oTextItems->AddItem(oNewParagraph);
} }
}break; }break;
case OOX::et_w_tbl: case OOX::et_w_tbl:
{ {