This commit is contained in:
Elena Subbotina
2025-10-02 18:35:51 +03:00
parent add2a66da9
commit 63d6430502
4 changed files with 120 additions and 156 deletions

View File

@ -384,23 +384,32 @@ namespace OOX
pItem = new Logic::CSdt( document ); pItem = new Logic::CSdt( document );
else if (L"sectPr" == sName ) else if (L"sectPr" == sName )
{ {
m_oSectPr = new Logic::CSectionProperty( document ); Logic::CSectionProperty *pSectPr = new Logic::CSectionProperty( document );
m_oSectPr->fromXML(oReader); pSectPr->fromXML(oReader);
//-------------------------------------------------------------------------
OOX::CDocx* docx = dynamic_cast<OOX::CDocx*>(document);
OOX::CDocument* document = docx ? (docx->m_bGlossaryRead ? docx->m_oGlossary.document : (docx->m_oMain.document ? docx->m_oMain.document : this)) : this;
if (document) if (pSectPr->m_bEmpty)
{ {
if (document->m_arrSections.empty()) delete pSectPr;
{ pSectPr = NULL;
OOX::CDocument::_section section; }
document->m_arrSections.push_back(section); else
} {
document->m_arrSections.back().sect = m_oSectPr.GetPointer(); m_oSectPr = pSectPr;
document->m_arrSections.back().end_elm = document->m_arrItems.size(); //активный рутовый еще не добавлен
OOX::CDocx* docx = dynamic_cast<OOX::CDocx*>(document);
OOX::CDocument* document = docx ? (docx->m_bGlossaryRead ? docx->m_oGlossary.document : (docx->m_oMain.document ? docx->m_oMain.document : this)) : this;
if (document)
{
if (document->m_arrSections.empty())
{
OOX::CDocument::_section section;
document->m_arrSections.push_back(section);
}
document->m_arrSections.back().sect = m_oSectPr.GetPointer();
document->m_arrSections.back().end_elm = document->m_arrItems.size(); //активный рутовый еще не добавлен
}
} }
//-------------------------------------------------------------------------
} }
else if (L"tbl" == sName ) else if (L"tbl" == sName )
pItem = new Logic::CTbl( document ); pItem = new Logic::CTbl( document );

View File

@ -640,27 +640,36 @@ namespace OOX
m_oRPr = oReader; m_oRPr = oReader;
else if ( !m_bPPrChange && L"sectPr" == sName ) else if ( !m_bPPrChange && L"sectPr" == sName )
{ {
m_oSectPr = new CSectionProperty(document); Logic::CSectionProperty* pSectPr = new Logic::CSectionProperty(document);
m_oSectPr->fromXML(oReader); pSectPr->fromXML(oReader);
//------------------------------------------------------------------------------------
OOX::CDocx *docx = dynamic_cast<OOX::CDocx*>(document);
if (docx)
{
OOX::CDocument *doc = docx->m_bGlossaryRead ? docx->m_oGlossary.document : docx->m_oMain.document;
if (doc->m_arrSections.empty()) if (pSectPr->m_bEmpty)
{
delete pSectPr;
pSectPr = NULL;
}
else
{
m_oSectPr = pSectPr;
OOX::CDocx* docx = dynamic_cast<OOX::CDocx*>(document);
if (docx)
{ {
OOX::CDocument* doc = docx->m_bGlossaryRead ? docx->m_oGlossary.document : docx->m_oMain.document;
if (doc->m_arrSections.empty())
{
OOX::CDocument::_section section;
doc->m_arrSections.push_back(section);
}
doc->m_arrSections.back().sect = m_oSectPr.GetPointer();
doc->m_arrSections.back().end_elm = doc->m_arrItems.size() + 1; // порядок выше - сначала читаем, потом добавляем
OOX::CDocument::_section section; OOX::CDocument::_section section;
section.start_elm = doc->m_arrItems.size() + 1;
doc->m_arrSections.push_back(section); doc->m_arrSections.push_back(section);
} }
doc->m_arrSections.back().sect = m_oSectPr.GetPointer();
doc->m_arrSections.back().end_elm = doc->m_arrItems.size() + 1; // порядок выше - сначала читаем, потом добавляем
OOX::CDocument::_section section;
section.start_elm = doc->m_arrItems.size() + 1;
doc->m_arrSections.push_back(section);
} }
//------------------------------------------------------------------------------------
} }
else if ( L"shd" == sName ) else if ( L"shd" == sName )
m_oShd = oReader; m_oShd = oReader;

View File

@ -78,7 +78,6 @@ namespace ComplexTypes
} }
void CColumn::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CColumn::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, (L"w:space"), m_oSpace ) WritingElement_ReadAttributes_Read_if ( oReader, (L"w:space"), m_oSpace )
WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:w"), m_oW ) WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:w"), m_oW )
@ -245,7 +244,6 @@ namespace ComplexTypes
} }
void CLineNumber::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CLineNumber::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, (L"w:countBy"), m_oCountBy ) WritingElement_ReadAttributes_Read_if ( oReader, (L"w:countBy"), m_oCountBy )
WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:distance"), m_oDistance ) WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:distance"), m_oDistance )
@ -298,7 +296,6 @@ namespace ComplexTypes
} }
void CPaperSource::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CPaperSource::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, (L"w:first"), m_oFirst ) WritingElement_ReadAttributes_Read_if ( oReader, (L"w:first"), m_oFirst )
WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:other"), m_oOther ) WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:other"), m_oOther )
@ -851,7 +848,6 @@ namespace ComplexTypes
} }
void CPageNumber::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CPageNumber::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, (L"w:chapSep"), m_oChapSep ) WritingElement_ReadAttributes_Read_if ( oReader, (L"w:chapSep"), m_oChapSep )
WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:chapStyle"), m_oChapStyle ) WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:chapStyle"), m_oChapStyle )
@ -918,7 +914,6 @@ namespace ComplexTypes
} }
void CPageSz::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CPageSz::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, (L"w:code"), m_oCode ) WritingElement_ReadAttributes_Read_if ( oReader, (L"w:code"), m_oCode )
WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:h"), m_oH ) WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:h"), m_oH )
@ -963,7 +958,6 @@ namespace ComplexTypes
} }
void CSectType::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CSectType::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, (L"w:val"), m_oVal ) WritingElement_ReadAttributes_ReadSingle( oReader, (L"w:val"), m_oVal )
WritingElement_ReadAttributes_End( oReader ) WritingElement_ReadAttributes_End( oReader )
@ -1081,7 +1075,6 @@ namespace OOX
} }
void CColumns::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CColumns::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, (L"w:equalWidth"), m_oEqualWidth ) WritingElement_ReadAttributes_Read_if ( oReader, (L"w:equalWidth"), m_oEqualWidth )
WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:num"), m_oNum ) WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:num"), m_oNum )
@ -1378,11 +1371,10 @@ namespace OOX
} }
void CPageBorders::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CPageBorders::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, (L"w:display"), m_oDisplay ) WritingElement_ReadAttributes_Read_if ( oReader, L"w:display", m_oDisplay )
WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:offsetFrom"), m_oOffsetFrom ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:offsetFrom", m_oOffsetFrom )
WritingElement_ReadAttributes_Read_else_if( oReader, (L"w:zOrder"), m_oZOrder ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:zOrder", m_oZOrder )
WritingElement_ReadAttributes_End( oReader ) WritingElement_ReadAttributes_End( oReader )
} }
@ -1400,14 +1392,14 @@ namespace OOX
} }
void CSectPrChange::fromXML(XmlUtils::CXmlNode& oNode) void CSectPrChange::fromXML(XmlUtils::CXmlNode& oNode)
{ {
XmlMacroReadAttributeBase( oNode, _T("w:author"), m_sAuthor ); XmlMacroReadAttributeBase( oNode, L"w:author", m_sAuthor );
XmlMacroReadAttributeBase( oNode, _T("w:date"), m_oDate ); XmlMacroReadAttributeBase( oNode, L"w:date", m_oDate );
XmlMacroReadAttributeBase( oNode, _T("w:id"), m_oId ); XmlMacroReadAttributeBase( oNode, L"w:id", m_oId );
XmlMacroReadAttributeBase( oNode, _T("oouserid"), m_sUserId ); XmlMacroReadAttributeBase( oNode, L"oouserid", m_sUserId );
XmlUtils::CXmlNode oNode_sectPr; XmlUtils::CXmlNode oNode_sectPr;
if ( m_pSecPr.IsInit() && oNode.GetNode( _T("w:sectPr"), oNode_sectPr ) ) if ( m_pSecPr.IsInit() && oNode.GetNode( L"w:sectPr", oNode_sectPr ) )
m_pSecPr->fromXML( oNode_sectPr ); m_pSecPr->fromXML( oNode_sectPr );
} }
@ -1422,13 +1414,13 @@ namespace OOX
while( oReader.ReadNextSiblingNode( nParentDepth ) ) while( oReader.ReadNextSiblingNode( nParentDepth ) )
{ {
std::wstring sName = oReader.GetName(); std::wstring sName = oReader.GetName();
if ( _T("w:sectPr") == sName ) if ( L"w:sectPr" == sName )
m_pSecPr->fromXML( oReader ); m_pSecPr->fromXML( oReader );
} }
} }
std::wstring CSectPrChange::toXML() const std::wstring CSectPrChange::toXML() const
{ {
std::wstring sResult = _T("<w:sectPrChange "); std::wstring sResult = L"<w:sectPrChange ";
if ( m_sAuthor.IsInit() ) if ( m_sAuthor.IsInit() )
{ {
@ -1439,31 +1431,31 @@ namespace OOX
if ( m_oDate.IsInit() ) if ( m_oDate.IsInit() )
{ {
sResult += _T("w:date=\""); sResult += L"w:date=\"";
sResult += m_oDate->ToString(); sResult += m_oDate->ToString();
sResult += _T("\" "); sResult += L"\" ";
} }
if ( m_oId.IsInit() ) if ( m_oId.IsInit() )
{ {
sResult += _T("w:id=\""); sResult += L"w:id=\"";
sResult += m_oId->ToString(); sResult += m_oId->ToString();
sResult += _T("\" "); sResult += L"\" ";
} }
if ( m_sUserId.IsInit() ) if ( m_sUserId.IsInit() )
{ {
sResult += _T("oouserid=\""); sResult += L"oouserid=\"";
sResult += m_sUserId.get2(); sResult += m_sUserId.get2();
sResult += _T("\" "); sResult += L"\" ";
} }
sResult += _T(">"); sResult += L">";
if ( m_pSecPr.IsInit() ) if ( m_pSecPr.IsInit() )
sResult += m_pSecPr->toXML(); sResult += m_pSecPr->toXML();
sResult += _T("</w:sectPrChange>"); sResult += L"</w:sectPrChange>";
return sResult; return sResult;
} }
@ -1473,12 +1465,11 @@ namespace OOX
} }
void CSectPrChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) void CSectPrChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{ {
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, _T("w:author"), m_sAuthor ) WritingElement_ReadAttributes_Read_if ( oReader, L"w:author", m_sAuthor )
WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:date"), m_oDate ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:date", m_oDate )
WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:id"), m_oId ) WritingElement_ReadAttributes_Read_else_if( oReader, L"w:id", m_oId )
WritingElement_ReadAttributes_Read_else_if( oReader, _T("oouserid"), m_sUserId ) WritingElement_ReadAttributes_Read_else_if( oReader, L"oouserid", m_sUserId )
WritingElement_ReadAttributes_End( oReader ) WritingElement_ReadAttributes_End( oReader )
} }
@ -1511,116 +1502,70 @@ namespace OOX
} }
void CSectionProperty::fromXML(XmlUtils::CXmlNode &oNode) void CSectionProperty::fromXML(XmlUtils::CXmlNode &oNode)
{ {
if ( (L"w:sectPr") != oNode.GetName() ) std::vector<XmlUtils::CXmlNode> oChilds;
return; oNode.GetNodes(L"*", oChilds);
if (oChilds.empty() && oNode.GetAttributesCount() < 1)
{
m_bEmpty = true;
return;
}
XmlMacroReadAttributeBase( oNode, (L"w:rsidDel"), m_oRsidDel ); XmlMacroReadAttributeBase( oNode, (L"w:rsidDel"), m_oRsidDel );
XmlMacroReadAttributeBase( oNode, (L"w:rsidR"), m_oRsidR ); XmlMacroReadAttributeBase( oNode, (L"w:rsidR"), m_oRsidR );
XmlMacroReadAttributeBase( oNode, (L"w:rsidRPr"), m_oRsidRPr ); XmlMacroReadAttributeBase( oNode, (L"w:rsidRPr"), m_oRsidRPr );
XmlMacroReadAttributeBase( oNode, (L"w:rsidSect"), m_oRsidSect ); XmlMacroReadAttributeBase( oNode, (L"w:rsidSect"), m_oRsidSect );
XmlUtils::CXmlNode oChild; for (size_t nIndex = 0; nIndex < oChilds.size(); nIndex++)
if ( oNode.GetNode( (L"w:bidi"), oChild ) )
m_oBidi = oChild;
if ( oNode.GetNode( (L"w:cols"), oChild ) )
m_oCols = oChild;
if ( oNode.GetNode( (L"w:docGrid"), oChild ) )
m_oDocGrid = oChild;
if ( oNode.GetNode( (L"w:endnotePr"), oChild ) )
m_oEndnotePr = oChild;
if ( !m_bSectPrChange )
{ {
std::vector<XmlUtils::CXmlNode> oNodes; XmlUtils::CXmlNode& oChild = oChilds[nIndex];
if ( oNode.GetNodes( (L"w:footerReference"), oNodes ) ) if (oChild.IsValid())
{ {
for ( int nIndex = 0; nIndex < oNodes.size(); nIndex++ ) std::wstring sName = oChild.GetName();
{
XmlUtils::CXmlNode& oNode = oNodes[nIndex];
if ( oNode.IsValid() )
{
nullable<ComplexTypes::Word::CHdrFtrRef> oFooter; oFooter.Init();
oFooter->FromXML(oNode);
m_arrFooterReference.push_back( oFooter ); if (L"w:bidi" == sName) m_oBidi = oChild;
} else if (L"w:cols" == sName) m_oCols = oChild;
else if (L"w:docGrid" == sName) m_oDocGrid = oChild;
else if (L"w:endnotePr" == sName) m_oEndnotePr = oChild;
else if (L"w:footnotePr" == sName) m_oFootnotePr = oChild;
else if (L"w:formProt" == sName) m_oFormProt = oChild;
else if (!m_bSectPrChange && L"w:footerReference" == sName)
{
nullable<ComplexTypes::Word::CHdrFtrRef> oFooter; oFooter.Init();
oFooter->FromXML(oChild);
m_arrFooterReference.push_back(oFooter);
} }
else if (!m_bSectPrChange && L"w:headerReference" == sName)
{
nullable < ComplexTypes::Word::CHdrFtrRef> oHeader; oHeader.Init();
oHeader->FromXML(oChild);
m_arrHeaderReference.push_back(oHeader);
}
else if (L"w:lnNumType" == sName) m_oLnNumType = oChild;
else if (L"w:noEndnote" == sName) m_oNoEndnote = oChild;
else if (L"w:paperSrc" == sName) m_oPaperSrc = oChild;
else if (L"w:pgBorders" == sName) m_oPgBorders = oChild;
else if (L"w:pgMar" == sName) m_oPgMar = oChild;
else if (L"w:pgNumType" == sName) m_oPgNumType = oChild;
else if (L"w:pgSz" == sName) m_oPgSz = oChild;
else if (L"w:printerSettings" == sName) m_oPrinterSettings = oChild;
else if (L"w:rtlGutter" == sName) m_oRtlGutter = oChild;
else if (!m_bSectPrChange && L"w:sectPrChange" == sName) m_oSectPrChange = oChild;
else if (L"w:textDirection" == sName) m_oTextDirection = oChild;
else if (L"w:titlePg" == sName) m_oTitlePg = oChild;
else if (L"w:type" == sName) m_oType = oChild;
else if (L"w:vAlign" == sName) m_oVAlign = oChild;
} }
} }
if ( oNode.GetNode( (L"w:footnotePr"), oChild ) )
m_oFootnotePr = oChild;
if ( oNode.GetNode( (L"w:formProt"), oChild ) )
m_oFormProt = oChild;
if ( !m_bSectPrChange )
{
std::vector<XmlUtils::CXmlNode> oNodes;
if ( oNode.GetNodes( L"w:headerReference", oNodes ) )
{
for ( size_t nIndex = 0; nIndex < oNodes.size(); nIndex++ )
{
XmlUtils::CXmlNode& oNode = oNodes[nIndex];
if ( oNode.IsValid())
{
nullable < ComplexTypes::Word::CHdrFtrRef> oHeader; oHeader.Init();
oHeader->FromXML(oNode);
m_arrHeaderReference.push_back( oHeader );
}
}
}
}
if ( oNode.GetNode( (L"w:lnNumType"), oChild ) )
m_oLnNumType = oChild;
if ( oNode.GetNode( (L"w:noEndnote"), oChild ) )
m_oNoEndnote = oChild;
if ( oNode.GetNode( (L"w:paperSrc"), oChild ) )
m_oPaperSrc = oChild;
if ( oNode.GetNode( (L"w:pgBorders"), oChild ) )
m_oPgBorders = oChild;
if ( oNode.GetNode( (L"w:pgMar"), oChild ) )
m_oPgMar = oChild;
if ( oNode.GetNode( (L"w:pgNumType"), oChild ) )
m_oPgNumType = oChild;
if ( oNode.GetNode( (L"w:pgSz"), oChild ) )
m_oPgSz = oChild;
if ( oNode.GetNode( (L"w:printerSettings"), oChild ) )
m_oPrinterSettings = oChild;
if ( oNode.GetNode( (L"w:rtlGutter"), oChild ) )
m_oRtlGutter = oChild;
if ( !m_bSectPrChange && oNode.GetNode( (L"w:sectPrChange"), oChild ) )
m_oSectPrChange = oChild;
if ( oNode.GetNode( (L"w:textDirection"), oChild ) )
m_oTextDirection = oChild;
if ( oNode.GetNode( (L"w:titlePg"), oChild ) )
m_oTitlePg = oChild;
if ( oNode.GetNode( (L"w:type"), oChild ) )
m_oType = oChild;
if ( oNode.GetNode( (L"w:vAlign"), oChild ) )
m_oVAlign = oChild;
} }
void CSectionProperty::fromXML(XmlUtils::CXmlLiteReader& oReader) void CSectionProperty::fromXML(XmlUtils::CXmlLiteReader& oReader)
{ {
if (oReader.IsEmptyNode() && oReader.GetAttributesCount() < 1)
{
m_bEmpty = true;
return;
}
ReadAttributes( oReader ); ReadAttributes( oReader );
if ( oReader.IsEmptyNode() ) if ( oReader.IsEmptyNode() )

View File

@ -503,7 +503,8 @@ namespace OOX
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader);
public: public:
bool m_bSectPrChange; bool m_bSectPrChange = false;
bool m_bEmpty = false;
nullable<SimpleTypes::CLongHexNumber> m_oRsidDel; nullable<SimpleTypes::CLongHexNumber> m_oRsidDel;
nullable<SimpleTypes::CLongHexNumber> m_oRsidR; nullable<SimpleTypes::CLongHexNumber> m_oRsidR;