sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 6 +++ sw/source/filter/ww8/docxattributeoutput.cxx | 53 +++++++++++++++++++++++++-- sw/source/filter/ww8/ww8par.hxx | 2 - sw/source/filter/ww8/ww8par6.cxx | 6 +-- 4 files changed, 60 insertions(+), 7 deletions(-)
New commits: commit be515af4d9e86c8bc13a47413676bda80cee6a3e Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Mon Aug 18 11:20:20 2014 +0200 DOCX filter: improve qFormat export handling The old rule was: write qFormat for everything that's not a custom style. The new rule: write qFormat for everything that's a custom style + have a whitelist of non-custom, but qFormat styles. This matches better what Word does (whitelist is from the latent style section of an empty document, created by Word). Change-Id: Ie7a0802e886c41b8d26ca9aa154913aa2f3ff87a diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 2d47c8c..593358e 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -1191,6 +1191,12 @@ DECLARE_OOXMLEXPORT_TEST(testCharacterBorder, "charborder.odt") CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); CPPUNIT_ASSERT_EQUAL(sal_Int16(318), aShadow.ShadowWidth); } + + if (xmlDocPtr pXmlStyles = parseExport("word/styles.xml")) + { + // Make sure we write qFormat for custom style names. + assertXPath(pXmlStyles, "//w:style[@w:styleId='Heading']/w:qFormat", 1); + } } DECLARE_OOXMLEXPORT_TEST(testStyleInheritance, "style-inheritance.docx") diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index f8f2d00..4ead526 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -5054,6 +5054,55 @@ oox::drawingml::DrawingML& DocxAttributeOutput::GetDrawingML() return m_rDrawingML; } +/// Functor to do case-insensitive ordering of OUString instances. +struct OUStringIgnoreCase +{ + bool operator() (const OUString& lhs, const OUString& rhs) const + { + return lhs.compareToIgnoreAsciiCase(rhs) < 0; + } +}; + +/// Guesses if a style created in Writer (no grab-bag) should be qFormat or not. +static bool lcl_guessQFormat(const OUString& rName, sal_uInt16 nWwId) +{ + // If the style has no dedicated STI number, then it's probably a custom style -> qFormat. + if (nWwId == ww::stiUser) + return true; + + static std::set<OUString, OUStringIgnoreCase> aWhitelist; + if (aWhitelist.empty()) + { + aWhitelist.insert("Normal"); + aWhitelist.insert("Heading 1"); + aWhitelist.insert("Heading 2"); + aWhitelist.insert("Heading 3"); + aWhitelist.insert("Heading 4"); + aWhitelist.insert("Heading 5"); + aWhitelist.insert("Heading 6"); + aWhitelist.insert("Heading 7"); + aWhitelist.insert("Heading 8"); + aWhitelist.insert("Heading 9"); + aWhitelist.insert("Caption"); + aWhitelist.insert("Title"); + aWhitelist.insert("Subtitle"); + aWhitelist.insert("Strong"); + aWhitelist.insert("Emphasis"); + aWhitelist.insert("No Spacing"); + aWhitelist.insert("List Paragraph"); + aWhitelist.insert("Quote"); + aWhitelist.insert("Intense Quote"); + aWhitelist.insert("Subtle Emphasis,"); + aWhitelist.insert("Intense Emphasis"); + aWhitelist.insert("Subtle Reference"); + aWhitelist.insert("Intense Reference"); + aWhitelist.insert("Book Title"); + aWhitelist.insert("TOC Heading"); + } + // Not custom style? Then we have a list of standard styles which should be qFormat. + return aWhitelist.find(rName) != aWhitelist.end(); +} + void DocxAttributeOutput::StartStyle( const OUString& rName, StyleType eType, sal_uInt16 nBase, sal_uInt16 nNext, sal_uInt16 nWwId, sal_uInt16 nId, bool bAutoUpdate ) { @@ -5148,9 +5197,7 @@ void DocxAttributeOutput::StartStyle( const OUString& rName, StyleType eType, if (bUnhideWhenUsed) m_pSerializer->singleElementNS(XML_w, XML_unhideWhenUsed, FSEND); - // If the style has a dedicated STI number, then chances are high that Word - // will have qFormat enabled for it, so let's do the same. - if (bQFormat || nWwId != ww::stiUser) + if (bQFormat || lcl_guessQFormat(rName, nWwId)) m_pSerializer->singleElementNS(XML_w, XML_qFormat, FSEND); if (bLocked) m_pSerializer->singleElementNS(XML_w, XML_locked, FSEND); commit f1095b41c6506b153199a72b36fc720804ea9ebc Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Mon Aug 18 10:37:25 2014 +0200 Fix missing prefix Change-Id: I0a9df00f90b63059e6446278d7a98d1cd902de4b diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index 0f50969..d44e508 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -1383,7 +1383,7 @@ private: // a document position recorded the after-position of TOC section, managed by Read_F_TOX() and End_Field() SwPaM* mpPosAfterTOC; - boost::scoped_ptr< SwPosition > lastAnchorPos; + boost::scoped_ptr< SwPosition > mpLastAnchorPos; bool mbCareFirstParaEndInToc; bool mbCareLastParaEndInToc; diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx index fb35194..69f8582 100644 --- a/sw/source/filter/ww8/ww8par6.cxx +++ b/sw/source/filter/ww8/ww8par6.cxx @@ -795,10 +795,10 @@ void wwSectionManager::CreateSep(const long nTxtPos, bool /*bMustHaveBreak*/) if (!pSep) return; - if (!maSegments.empty() && mrReader.lastAnchorPos.get() && *mrReader.lastAnchorPos == *mrReader.pPaM->GetPoint()) + if (!maSegments.empty() && mrReader.mpLastAnchorPos.get() && *mrReader.mpLastAnchorPos == *mrReader.pPaM->GetPoint()) { bool insert = true; - SwPaM pam( *mrReader.lastAnchorPos ); + SwPaM pam( *mrReader.mpLastAnchorPos ); if( pam.Move(fnMoveBackward, fnGoNode)) if( SwTxtNode* txtNode = pam.GetPoint()->nNode.GetNode().GetTxtNode()) if( txtNode->Len() == 0 ) @@ -1815,7 +1815,7 @@ WW8SwFlyPara::WW8SwFlyPara( SwPaM& rPaM, //#i53725# - absolute positioned objects have to be // anchored at-paragraph to assure its correct anchor position. eAnchor = FLY_AT_PARA; - rIo.lastAnchorPos.reset( new SwPosition(*rPaM.GetPoint())); + rIo.mpLastAnchorPos.reset( new SwPosition(*rPaM.GetPoint())); switch (nYBind) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits