sw/qa/extras/ooxmlexport/data/duplicate-east-asia.odt |binary sw/qa/extras/ooxmlexport/ooxmlexport5.cxx | 12 ++++- sw/source/filter/ww8/wrtw8esh.cxx | 38 +++++++++++++++--- sw/source/filter/ww8/wrtww8.hxx | 2 4 files changed, 43 insertions(+), 9 deletions(-)
New commits: commit 4a4dadc12777db78de60f64773f4737dd604419a Author: Caolán McNamara <caol...@redhat.com> Date: Thu Apr 23 13:47:29 2015 +0100 Resolves: tdf#85769 fix duplicate attribute export to docx... with ooo69297-4.odt (cherry picked from commit 870a7ee60ab01246ad8d9beae5705f59c6b73cbf) Conflicts: sw/qa/extras/ooxmlexport/ooxmlexport5.cxx Change-Id: I193099d7fffc160f0198e3d42d5d6fd5835c79cf Reviewed-on: https://gerrit.libreoffice.org/15572 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Miklos Vajna <vmik...@collabora.co.uk> diff --git a/sw/qa/extras/ooxmlexport/data/duplicate-east-asia.odt b/sw/qa/extras/ooxmlexport/data/duplicate-east-asia.odt new file mode 100644 index 0000000..22b8a55 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/duplicate-east-asia.odt differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx index 733434e..20e3a00 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx @@ -99,10 +99,18 @@ DECLARE_OOXMLEXPORT_TEST(testfdo76589 , "fdo76589.docx") assertXPath ( pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:lvlText","val","%1" ); } +DECLARE_OOXMLEXPORT_TEST(testNoDuplicateAttributeExport, "duplicate-east-asia.odt") +{ + // File asserting while saving in LO. + xmlDocPtr pXmlDoc = parseExport("word/document.xml"); + if (!pXmlDoc) + return; +} + DECLARE_OOXMLEXPORT_TEST(testfdo79008, "fdo79008.docx") { - /* File getting crash while saving in LO. - * Checking if document.xml file is getting created after fix + /* File crashing while saving in LO. + * Check if document.xml file is created after fix */ xmlDocPtr pXmlDoc = parseExport("word/document.xml"); if (!pXmlDoc) diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx index a2dd8ee..b93aa4f 100644 --- a/sw/source/filter/ww8/wrtw8esh.cxx +++ b/sw/source/filter/ww8/wrtw8esh.cxx @@ -1162,9 +1162,30 @@ void MSWord_SdrAttrIter::OutEEField(const SfxPoolItem& rHt) void MSWord_SdrAttrIter::OutAttr( sal_Int32 nSwPos ) { - OutParaAttr(true); + //Collect the which ids belong to the run that we will export after + //outputting the underlying paragraph attributes. We will exclude + //writing these from the underlying paragraph attributes to avoid + //duplicate attributes in docx export. Doesn't matter in doc + //export as later props just override earlier ones. + std::set<sal_uInt16> aUsedRunWhichs; + if (!aTxtAtrArr.empty()) + { + for(std::vector<EECharAttrib>::const_iterator i = aTxtAtrArr.begin(); i < aTxtAtrArr.end(); ++i) + { + if (nSwPos >= i->nStart && nSwPos < i->nEnd) + { + sal_uInt16 nWhich = i->pAttr->Which(); + aUsedRunWhichs.insert(nWhich); + } + + if( nSwPos < i->nStart ) + break; + } + } - if(!aTxtAtrArr.empty()) + OutParaAttr(true, &aUsedRunWhichs); + + if (!aTxtAtrArr.empty()) { const SwModify* pOldMod = m_rExport.pOutFmtNode; m_rExport.pOutFmtNode = 0; @@ -1274,7 +1295,7 @@ const SfxPoolItem& MSWord_SdrAttrIter::GetItem( sal_uInt16 nWhich ) const return *pRet; } -void MSWord_SdrAttrIter::OutParaAttr(bool bCharAttr) +void MSWord_SdrAttrIter::OutParaAttr(bool bCharAttr, const std::set<sal_uInt16>* pWhichsToIgnore) { SfxItemSet aSet( pEditObj->GetParaAttribs( nPara )); if( aSet.Count() ) @@ -1288,9 +1309,14 @@ void MSWord_SdrAttrIter::OutParaAttr(bool bCharAttr) const SfxItemPool* pSrcPool = pEditPool, * pDstPool = &m_rExport.pDoc->GetAttrPool(); - do { - sal_uInt16 nWhich = pItem->Which(), - nSlotId = pSrcPool->GetSlotId( nWhich ); + do + { + sal_uInt16 nWhich = pItem->Which(); + + if (pWhichsToIgnore && pWhichsToIgnore->find(nWhich) != pWhichsToIgnore->end()) + continue; + + sal_uInt16 nSlotId = pSrcPool->GetSlotId(nWhich); if ( nSlotId && nWhich != nSlotId && 0 != ( nWhich = pDstPool->GetWhich( nSlotId ) ) && diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx index c725847..d058107 100644 --- a/sw/source/filter/ww8/wrtww8.hxx +++ b/sw/source/filter/ww8/wrtww8.hxx @@ -1477,7 +1477,7 @@ public: MSWord_SdrAttrIter( MSWordExportBase& rWr, const EditTextObject& rEditObj, sal_uInt8 nType ); void NextPara( sal_Int32 nPar ); - void OutParaAttr(bool bCharAttr); + void OutParaAttr(bool bCharAttr, const std::set<sal_uInt16>* pWhichsToIgnore = NULL); void OutEEField(const SfxPoolItem& rHt); bool IsTxtAttr(sal_Int32 nSwPos);
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits