tdf#108272 DOCX table-only header: fix SAX parser error
Floating tables in table-only headers are imported as non-floating ones after a SAX parser error. Now we import them as non-floating ones from the beginning to avoid of the parser error. Change-Id: I0a816a7af642f402a25ed53d9766b1e8b82db789 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87874 Tested-by: Jenkins Reviewed-by: László Németh <nemeth@numbertext.org>
This commit is contained in:
BIN
sw/qa/core/data/ooxml/pass/tdf108272.docx
Normal file
BIN
sw/qa/core/data/ooxml/pass/tdf108272.docx
Normal file
Binary file not shown.
@@ -50,7 +50,7 @@ DomainMapperTableManager::DomainMapperTableManager() :
|
||||
m_nGridAfter(0),
|
||||
m_nHeaderRepeat(0),
|
||||
m_nTableWidth(0),
|
||||
m_bIsInShape(false),
|
||||
m_bIsUnfloatTable(false),
|
||||
m_aTmpPosition(),
|
||||
m_aTmpTableProperties(),
|
||||
m_bPushCurrentWidth(false),
|
||||
@@ -339,8 +339,8 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm)
|
||||
case NS_ooxml::LN_CT_TblPrBase_tblpPr:
|
||||
{
|
||||
writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
|
||||
// Ignore <w:tblpPr> in shape text, those tables should be always non-floating ones.
|
||||
if (!m_bIsInShape && pProperties.get())
|
||||
// Ignore <w:tblpPr> in shape text or in table-only header, those tables should be always non-floating ones.
|
||||
if (!m_bIsUnfloatTable && pProperties.get())
|
||||
{
|
||||
TablePositionHandlerPtr pHandler = m_aTmpPosition.back();
|
||||
if ( !pHandler )
|
||||
@@ -425,9 +425,9 @@ TablePositionHandler* DomainMapperTableManager::getCurrentTableRealPosition()
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void DomainMapperTableManager::setIsInShape(bool bIsInShape)
|
||||
void DomainMapperTableManager::setIsUnfloatTable(bool bIsUnfloatTable)
|
||||
{
|
||||
m_bIsInShape = bIsInShape;
|
||||
m_bIsUnfloatTable = bIsUnfloatTable;
|
||||
}
|
||||
|
||||
void DomainMapperTableManager::startLevel( )
|
||||
|
@@ -46,8 +46,8 @@ class DomainMapperTableManager : public TableManager
|
||||
sal_uInt32 m_nGridAfter; ///< number of grid columns in the parent table's table grid which shall be left after the last cell in the table row
|
||||
sal_Int32 m_nHeaderRepeat; //counter of repeated headers - if == -1 then the repeating stops
|
||||
sal_Int32 m_nTableWidth; //might be set directly or has to be calculated from the column positions
|
||||
/// Are we in a shape (text append stack is not empty) or in the body document?
|
||||
bool m_bIsInShape;
|
||||
/// Unfloat tables in a shape/table-only header (text append stack is not empty)
|
||||
bool m_bIsUnfloatTable;
|
||||
OUString m_sTableStyleName;
|
||||
/// Grab-bag of table look attributes for preserving.
|
||||
comphelper::SequenceAsHashMap m_aTableLook;
|
||||
@@ -130,7 +130,7 @@ public:
|
||||
|
||||
using TableManager::isInCell;
|
||||
|
||||
void setIsInShape(bool bIsInShape);
|
||||
void setIsUnfloatTable(bool bIsUnfloatTable);
|
||||
|
||||
};
|
||||
|
||||
|
@@ -1874,6 +1874,11 @@ void DomainMapper_Impl::appendTextPortion( const OUString& rString, const Proper
|
||||
|
||||
if (m_aTextAppendStack.empty())
|
||||
return;
|
||||
|
||||
// not a table-only header, don't avoid of floating tables
|
||||
if (m_eInHeaderFooterImport == HeaderFooterImportState::header && !IsInShape() && hasTableManager() && !getTableManager().isInCell())
|
||||
getTableManager().setIsUnfloatTable(false);
|
||||
|
||||
// Before placing call to processDeferredCharacterProperties(), TopContextType should be CONTEXT_CHARACTER
|
||||
// processDeferredCharacterProperties() invokes only if character inserted
|
||||
if( pPropertyMap == m_pTopContext && !deferredCharacterProperties.empty() && (GetTopContextType() == CONTEXT_CHARACTER) )
|
||||
@@ -2221,6 +2226,10 @@ void DomainMapper_Impl::PushPageHeaderFooter(bool bHeader, SectionPropertyMap::P
|
||||
m_eInHeaderFooterImport
|
||||
= bHeader ? HeaderFooterImportState::header : HeaderFooterImportState::footer;
|
||||
|
||||
// ignore <w:tblpPr> in table-only header, that table is imported as non-floating one
|
||||
if (bHeader && hasTableManager())
|
||||
getTableManager().setIsUnfloatTable(true);
|
||||
|
||||
//get the section context
|
||||
PropertyMapPtr pContext = DomainMapper_Impl::GetTopContextOfType(CONTEXT_SECTION);
|
||||
//ask for the header/footer name of the given type
|
||||
@@ -2840,7 +2849,7 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
|
||||
uno::makeAny( true ) );
|
||||
}
|
||||
m_bParaChanged = true;
|
||||
getTableManager().setIsInShape(true);
|
||||
getTableManager().setIsUnfloatTable(true);
|
||||
}
|
||||
catch ( const uno::Exception& )
|
||||
{
|
||||
|
Reference in New Issue
Block a user