diff options
author | Justin Luth <justin.luth@collabora.com> | 2021-03-31 18:37:06 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-04-08 10:21:47 +0200 |
commit | a4d69d2a7680d4c8062119d2b9dab1df7c2b574d (patch) | |
tree | 5b6c29e05a30d3b06fcd746470f6a8bd22c9a336 /sw/source/filter/ww8 | |
parent | faf3f18bdc89cc5e04abdefcb12d63e6ef796396 (diff) |
tdf#81705 doc export: write sprmPOutLvl
but only if it is not the default value,
and it isn't the same as what it inherits.
Also tweaked DOCX, so that it can write out
the default in order to cancel a style's outline level.
RTF does nothing with ParaOutlineLevel.
I am slightly confused by ::OutlineNumbering
which also writes out Outline Level.
This appears to be a duplication
(and it also seems to duplicate ParaNumRule)
which DOCX avoids by just doing nothing.
Change-Id: I32dd1bf9f35dc5f7f500e65d517fad0304bf452d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113426
Tested-by: Jenkins
Reviewed-by: Justin Luth <justin_luth@sil.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'sw/source/filter/ww8')
-rw-r--r-- | sw/source/filter/ww8/attributeoutputbase.hxx | 1 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 20 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8atr.cxx | 31 |
3 files changed, 31 insertions, 21 deletions
diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx b/sw/source/filter/ww8/attributeoutputbase.hxx index eceeb4f51c5f..df84fa323120 100644 --- a/sw/source/filter/ww8/attributeoutputbase.hxx +++ b/sw/source/filter/ww8/attributeoutputbase.hxx @@ -620,6 +620,7 @@ protected: virtual void CharGrabBag( const SfxGrabBagItem& ) = 0; /// Sfx item RES_PARATR_OUTLINELEVEL + void ParaOutlineLevelBase( const SfxUInt16Item& rItem ); virtual void ParaOutlineLevel( const SfxUInt16Item& ) = 0; /// Write the expanded field diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 4149e3ecedfa..1416dd46baa5 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -6515,20 +6515,6 @@ void DocxAttributeOutput::EndStyleProperties( bool bParProp ) } } -namespace -{ - -void lcl_OutlineLevel(sax_fastparser::FSHelperPtr const & pSerializer, sal_uInt16 nLevel) -{ - if (nLevel >= WW8ListManager::nMaxLevel) - nLevel = WW8ListManager::nMaxLevel - 1; - - pSerializer->singleElementNS(XML_w, XML_outlineLvl, - FSNS(XML_w, XML_val), OString::number(nLevel)); -} - -} - void DocxAttributeOutput::OutlineNumbering(sal_uInt8 const /*nLvl*/) { // Handled by ParaOutlineLevel() instead. @@ -6536,8 +6522,10 @@ void DocxAttributeOutput::OutlineNumbering(sal_uInt8 const /*nLvl*/) void DocxAttributeOutput::ParaOutlineLevel(const SfxUInt16Item& rItem) { - if (rItem.GetValue() > 0) - lcl_OutlineLevel(m_pSerializer, rItem.GetValue() - 1); + sal_uInt16 nOutLvl = std::min(rItem.GetValue(), sal_uInt16(WW8ListManager::nMaxLevel)); + // Outline Level: in LO Body Text = 0, in MS Body Text = 9 + nOutLvl = nOutLvl ? nOutLvl - 1 : 9; + m_pSerializer->singleElementNS(XML_w, XML_outlineLvl, FSNS(XML_w, XML_val), OString::number(nOutLvl)); } void DocxAttributeOutput::PageBreakBefore( bool bBreak ) diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 4e0451e6072e..de65515cbf17 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -758,9 +758,8 @@ void WW8AttributeOutput::OutlineNumbering(sal_uInt8 nLvl) if ( nLvl >= WW8ListManager::nMaxLevel ) nLvl = WW8ListManager::nMaxLevel-1; - // write sprmPOutLvl sprmPIlvl and sprmPIlfo - SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::POutLvl::val ); - m_rWW8Export.pO->push_back( nLvl ); + // write sprmPIlvl and sprmPIlfo + // (sprmPOutLvl now handled by ParaOutlineLevel) SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::PIlvl::val ); m_rWW8Export.pO->push_back( nLvl ); SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::PIlfo::val ); @@ -3593,6 +3592,23 @@ void WW8AttributeOutput::CharTwoLines( const SvxTwoLinesItem& rTwoLines ) m_rWW8Export.pO->insert( m_rWW8Export.pO->end(), aZeroArr, aZeroArr+3); } +void AttributeOutputBase::ParaOutlineLevelBase( const SfxUInt16Item& rItem ) +{ + sal_uInt16 nOutLvl = rItem.GetValue(); + + // Do not write out default level (Body Text) if there is no inheritance, or if the level matches the inherited value + const SfxUInt16Item* pInherited = nullptr; + if (auto pNd = dynamic_cast<const SwContentNode*>(GetExport().m_pOutFormatNode)) //paragraph + pInherited = static_cast<SwTextFormatColl&>(pNd->GetAnyFormatColl()).GetAttrSet().GetItem<SfxUInt16Item>(RES_PARATR_OUTLINELEVEL); + else if (GetExport().m_bStyDef && GetExport().m_pCurrentStyle && GetExport().m_pCurrentStyle->DerivedFrom()) //style + pInherited = GetExport().m_pCurrentStyle->DerivedFrom()->GetAttrSet().GetItem<SfxUInt16Item>(RES_PARATR_OUTLINELEVEL); + if ((pInherited && pInherited->GetValue() == nOutLvl) + || (!pInherited && !nOutLvl)) + return; + + ParaOutlineLevel(rItem); +} + void AttributeOutputBase::ParaNumRule( const SwNumRuleItem& rNumRule ) { const SwTextNode* pTextNd = nullptr; @@ -4952,8 +4968,13 @@ void WW8AttributeOutput::CharGrabBag(const SfxGrabBagItem& /*rItem*/) { } -void WW8AttributeOutput::ParaOutlineLevel(const SfxUInt16Item& /*rItem*/) +void WW8AttributeOutput::ParaOutlineLevel(const SfxUInt16Item& rItem) { + sal_uInt16 nOutLvl = std::min(rItem.GetValue(), sal_uInt16(WW8ListManager::nMaxLevel)); + // Outline Level: in LO Body Text = 0, in MS Body Text = 9 + nOutLvl = nOutLvl ? nOutLvl - 1 : 9; + m_rWW8Export.InsUInt16( NS_sprm::POutLvl::val ); + m_rWW8Export.pO->push_back( nOutLvl ); } // "Separate paragraphs" @@ -5510,7 +5531,7 @@ void AttributeOutputBase::OutputItem( const SfxPoolItem& rHt ) ParaGrabBag(static_cast<const SfxGrabBagItem&>(rHt)); break; case RES_PARATR_OUTLINELEVEL: - ParaOutlineLevel(static_cast<const SfxUInt16Item&>(rHt)); + ParaOutlineLevelBase(static_cast<const SfxUInt16Item&>(rHt)); break; case RES_CHRATR_GRABBAG: CharGrabBag(static_cast<const SfxGrabBagItem&>(rHt)); |