sw/qa/extras/ooxmlexport/data/style-inheritance.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 66 ++++++++++++++++--- sw/source/filter/ww8/docxattributeoutput.cxx | 9 +- sw/source/filter/ww8/wrtw8sty.cxx | 2 4 files changed, 63 insertions(+), 14 deletions(-)
New commits: commit 83ea6bf0deb8c2450e5e8fbdac0194c30ba5ff85 Author: Jan Holesovsky <[email protected]> Date: Wed Sep 18 19:06:10 2013 +0200 DOCX export: XPath should allow checking for the number of returned nodes. This is to implement a test that <w:next> style is not exported for styles where the next style equals to the style itself [which comes with this commit too]. Change-Id: I5fa9999cf7e741dc96f3538b7c1106e1add6b61e diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index f103cda..47b6318 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -134,7 +134,24 @@ private: * xml stream, so that you can do the asserting. */ xmlDocPtr parseExport(const OUString& rStreamName = OUString("word/document.xml")); - void assertXPath(xmlDocPtr pXmlDoc, OString aXPath, OString aAttribute = OString(), OUString aExpectedValue = OUString()); + + /** + * Helper method to return nodes represented by rXPath. + */ + xmlNodeSetPtr getXPathNode(xmlDocPtr pXmlDoc, const OString& rXPath); + + /** + * Assert that rXPath exists, and returns exactly one node. + * In case rAttribute is provided, the rXPath's attribute's value must + * equal to the rExpected value. + */ + void assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute = OString(), const OUString& rExpectedValue = OUString()); + + /** + * Assert that rXPath exists, and returns exactly nNumberOfNodes nodes. + * Useful for checking that we do _not_ export some node (nNumberOfNodes == 0). + */ + void assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfNodes); }; void Test::run() @@ -258,19 +275,30 @@ xmlDocPtr Test::parseExport(const OUString& rStreamName) return xmlParseMemory((const char*)aDocument.getStr(), aDocument.getLength()); } -void Test::assertXPath(xmlDocPtr pXmlDoc, OString aXPath, OString aAttribute, OUString aExpectedValue) +xmlNodeSetPtr Test::getXPathNode(xmlDocPtr pXmlDoc, const OString& rXPath) { xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc); xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("w"), BAD_CAST("http://schemas.openxmlformats.org/wordprocessingml/2006/main")); xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("v"), BAD_CAST("urn:schemas-microsoft-com:vml")); - xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(aXPath.getStr()), pXmlXpathCtx); - xmlNodeSetPtr pXmlNodes = pXmlXpathObj->nodesetval; + xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(rXPath.getStr()), pXmlXpathCtx); + return pXmlXpathObj->nodesetval; +} + +void Test::assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute, const OUString& rExpectedValue) +{ + xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath); CPPUNIT_ASSERT_EQUAL(1, xmlXPathNodeSetGetLength(pXmlNodes)); - if (aAttribute.isEmpty()) + if (rAttribute.isEmpty()) return; xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; - OUString aValue = OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST(aAttribute.getStr()))); - CPPUNIT_ASSERT_EQUAL(aExpectedValue, aValue); + OUString aValue = OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST(rAttribute.getStr()))); + CPPUNIT_ASSERT_EQUAL(rExpectedValue, aValue); +} + +void Test::assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfNodes) +{ + xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath); + CPPUNIT_ASSERT_EQUAL(nNumberOfNodes, xmlXPathNodeSetGetLength(pXmlNodes)); } void Test::testZoom() @@ -1336,6 +1364,9 @@ void Test::testStyleInheritance() assertXPath(pXmlStyles, "/w:styles/w:style[1]", "styleId", "Normal"); // some random style later assertXPath(pXmlStyles, "/w:styles/w:style[4]", "styleId", "Heading3"); + + // Check that we do _not_ export w:next for styles that point to themselves. + assertXPath(pXmlStyles, "/w:styles/w:style[1]/w:next", 0); } CPPUNIT_TEST_SUITE_REGISTRATION(Test); commit c5c17b6a5f9d756ece6757159ee3be4494e9aca7 Author: Jan Holesovsky <[email protected]> Date: Wed Sep 18 19:03:17 2013 +0200 DOCX styles: Don't export <w:next> for styles that point to themselves. Change-Id: I3f877f9dc836686e91df70ff1e02e67ca25b4a84 diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index dc317ca..7d060ea 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -3265,9 +3265,12 @@ void DocxAttributeOutput::StartStyle( const String& rName, bool bPapFmt, FSEND ); } - m_pSerializer->singleElementNS( XML_w, XML_next, - FSNS( XML_w, XML_val ), m_rExport.pStyles->GetStyleId(nNext).getStr(), - FSEND ); + if ( nNext != nId ) + { + m_pSerializer->singleElementNS( XML_w, XML_next, + FSNS( XML_w, XML_val ), m_rExport.pStyles->GetStyleId(nNext).getStr(), + FSEND ); + } if ( bAutoUpdate ) m_pSerializer->singleElementNS( XML_w, XML_autoRedefine, FSEND ); commit a19bcc4c876b1f94c27e55c3813cfc878df3e377 Author: Jan Holesovsky <[email protected]> Date: Wed Sep 18 18:30:47 2013 +0200 DOCX styles: Unit test for the styleId's. Change-Id: I309a9c7ed0ad633ca58dce542d5fa2db883a17ec diff --git a/sw/qa/extras/ooxmlexport/data/style-inheritance.docx b/sw/qa/extras/ooxmlexport/data/style-inheritance.docx new file mode 100644 index 0000000..65ca38a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/style-inheritance.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 66b3935..f103cda 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -117,6 +117,7 @@ public: void testA4AndBorders(); void testFdo68787(); void testCharacterBorder(); + void testStyleInheritance(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -132,7 +133,7 @@ private: * xml stream, and asserting an XPath expression. This method returns the * xml stream, so that you can do the asserting. */ - xmlDocPtr parseExport(); + xmlDocPtr parseExport(const OUString& rStreamName = OUString("word/document.xml")); void assertXPath(xmlDocPtr pXmlDoc, OString aXPath, OString aAttribute = OString(), OUString aExpectedValue = OUString()); }; @@ -210,6 +211,7 @@ void Test::run() {"a4andborders.docx", &Test::testA4AndBorders}, {"fdo68787.docx", &Test::testFdo68787}, {"charborder.odt", &Test::testCharacterBorder}, + {"style-inheritance.docx", &Test::testStyleInheritance}, }; // Don't test the first import of these, for some reason those tests fail const char* aBlacklist[] = { @@ -231,7 +233,7 @@ void Test::run() } } -xmlDocPtr Test::parseExport() +xmlDocPtr Test::parseExport(const OUString& rStreamName) { // Create the zip file. utl::TempFile aTempFile; @@ -239,7 +241,7 @@ xmlDocPtr Test::parseExport() // Read the XML stream we're interested in. uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), aTempFile.GetURL()); - uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName("word/document.xml"), uno::UNO_QUERY); + uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName(rStreamName), uno::UNO_QUERY); boost::shared_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, sal_True)); pStream->Seek(STREAM_SEEK_TO_END); sal_Size nSize = pStream->Tell(); @@ -1323,6 +1325,19 @@ void Test::testCharacterBorder() } } +void Test::testStyleInheritance() +{ + // This document has several issues to fix, more checks will be here to + // test its various aspects + + // Check that now styleId's are more like what MSO produces + xmlDocPtr pXmlStyles = parseExport("word/styles.xml"); + // the 1st style always must be Normal + assertXPath(pXmlStyles, "/w:styles/w:style[1]", "styleId", "Normal"); + // some random style later + assertXPath(pXmlStyles, "/w:styles/w:style[4]", "styleId", "Heading3"); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); commit e7f9230b6f841c6c366779f6d33686cfee78f6b9 Author: Jan Holesovsky <[email protected]> Date: Wed Sep 18 15:23:21 2013 +0200 DOCX styles: Uppercase styleId's starting with 'a' too ;-) Change-Id: I6249cd121b74caed1b20046049765b4a62d6c854 diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx index 67ff6cc..969b2b3 100644 --- a/sw/source/filter/ww8/wrtw8sty.cxx +++ b/sw/source/filter/ww8/wrtw8sty.cxx @@ -315,7 +315,7 @@ void MSWordStyles::BuildStyleIds() ('A' <= nChar && nChar <= 'Z')) { // first letter should be uppercase - if (aStyleIdBuf.isEmpty() && ('a' < nChar && nChar <= 'z')) + if (aStyleIdBuf.isEmpty() && 'a' <= nChar && nChar <= 'z') aStyleIdBuf.append(char(nChar - ('a' - 'A'))); else aStyleIdBuf.append(char(nChar)); _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
