sw/CppunitTest_sw_ooxmlimport.mk | 1 sw/qa/extras/inc/swmodeltestbase.hxx | 4 + sw/qa/extras/ooxmlimport/data/strict-lockedcanvas.docx |binary sw/qa/extras/ooxmlimport/data/strict.docx |binary sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 38 +++++++++++++++++ writerfilter/source/ooxml/OOXMLFactory.cxx | 12 +++++ writerfilter/source/ooxml/OOXMLFactory.hxx | 3 - writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx | 34 +++++++++++++++ writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx | 15 ++++++ writerfilter/source/ooxml/factoryimpl.xsl | 4 + writerfilter/source/ooxml/model.xml | 15 +++++- writerfilter/source/ooxml/namespaceids.xsl | 3 - 12 files changed, 122 insertions(+), 7 deletions(-)
New commits: commit 65909e07763e80031bfeb7bb3170e6c3b0029065 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Mar 7 11:45:39 2014 +0100 writerfilter: initial strict DOCX support The generate-id() code is just necessary avoid duplicated elements in the for-each loop. http://mahahegde.com/xslt-distinct-values/ has a detailed description of the technique used here. (cherry picked from commit f9bf15e19ec823a58ee32bf94da81f3bb1a147bc) writerfilter: introduce ooxml::OOXMLUniversalMeasureValue In transitional DOCX, ST_UniversalMeasure is in practice a simple integer, which means twips. But in case of strict, ST_UniversalMeasure is in points in practice -- which is perfectly valid, but we didn't handle it so far. Add a separate Value class that is used only for handling ST_UniversalMeasure, then there we can handle the various additional suffixes. (cherry picked from commit d5d7c7d3b281e1a9060d60bc4ac7738ae616f167) DOCX import: handle points in ST_TwipsMeasure and ST_SignedTwipsMeasure This fixes page size and margins in case of strict DOCX. (cherry picked from commit 37cc7e7471ba3b11cefcb0218c27e2c745886a6d) DOCX strict import: fix headers Now that the document has a header, better to just test the bottom margin, as in case there is a header, the top margin has different semantics in Word and Writer. (cherry picked from commit 195b8491d0299038fb64d19463e3ce90905bf346) DOCX strict import: fix pictures as well (cherry picked from commit aaef39de32442203d631a65aecf23eeb27dfbb12) DOCX strict import: handle charts (cherry picked from commit 49c3aff8d8d3030b2acbffb6ff000b5d44445cc9) DOCX strict import: handle SmartArt (cherry picked from commit f5985685ddc519f760a7324fa60fd662f25404c1) DOCX strict import: handle lockedCanvas (cherry picked from commit d795fb224e52c66c4585ed1e079a2b7601a07eda) DOCX strict import: handle math (cherry picked from commit c98d649117dc776ac51807be3376924d1fce2035) Conflicts: sw/qa/extras/ooxmlimport/ooxmlimport.cxx Change-Id: I647efe9d4a0834d3756fe9fa6d706ba6ba4e00f1 Reviewed-on: https://gerrit.libreoffice.org/8532 Tested-by: Markus Mohrhard <markus.mohrh...@googlemail.com> Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sw/CppunitTest_sw_ooxmlimport.mk b/sw/CppunitTest_sw_ooxmlimport.mk index fe1cefe..ad6155e 100644 --- a/sw/CppunitTest_sw_ooxmlimport.mk +++ b/sw/CppunitTest_sw_ooxmlimport.mk @@ -69,6 +69,7 @@ $(eval $(call gb_CppunitTest_use_components,sw_ooxmlimport,\ sw/util/swd \ sw/util/msword \ sfx2/util/sfx \ + starmath/util/sm \ svl/source/fsstor/fsstorage \ svl/util/svl \ svtools/util/svt \ diff --git a/sw/qa/extras/inc/swmodeltestbase.hxx b/sw/qa/extras/inc/swmodeltestbase.hxx index 8a2b8c4..316cb9c 100644 --- a/sw/qa/extras/inc/swmodeltestbase.hxx +++ b/sw/qa/extras/inc/swmodeltestbase.hxx @@ -351,9 +351,11 @@ protected: return xParagraph; } - uno::Reference<text::XTextRange> getParagraphOfText(int number, uno::Reference<text::XText> xText) const + uno::Reference<text::XTextRange> getParagraphOfText(int number, uno::Reference<text::XText> xText, OUString content = OUString()) const { uno::Reference<text::XTextRange> const xParagraph(getParagraphOrTable(number, xText), uno::UNO_QUERY_THROW); + if (!content.isEmpty()) + CPPUNIT_ASSERT_EQUAL(content, xParagraph->getString()); return xParagraph; } diff --git a/sw/qa/extras/ooxmlimport/data/strict-lockedcanvas.docx b/sw/qa/extras/ooxmlimport/data/strict-lockedcanvas.docx new file mode 100644 index 0000000..d31be7e Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/strict-lockedcanvas.docx differ diff --git a/sw/qa/extras/ooxmlimport/data/strict.docx b/sw/qa/extras/ooxmlimport/data/strict.docx new file mode 100644 index 0000000..b46ce94 Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/strict.docx differ diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 4c8a790..5e161cc 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -1595,6 +1595,44 @@ DECLARE_OOXMLIMPORT_TEST(testFdo73389,"fdo73389.docx") // This was 9340, i.e. the width of the inner table was too large. CPPUNIT_ASSERT_EQUAL(sal_Int32(2842), getProperty<sal_Int32>(xTables->getByIndex(0), "Width")); } + +DECLARE_OOXMLIMPORT_TEST(testStrict, "strict.docx") +{ + uno::Reference<beans::XPropertySet> xPageStyle(getStyles("PageStyles")->getByName(DEFAULT_STYLE), uno::UNO_QUERY); + // This was only 127, pt suffix was ignored, so this got parsed as twips instead of points. + CPPUNIT_ASSERT_EQUAL(sal_Int32(TWIP_TO_MM100(72 * 20)), getProperty<sal_Int32>(xPageStyle, "BottomMargin")); + // This was only 1397, same issue + CPPUNIT_ASSERT_EQUAL(sal_Int32(TWIP_TO_MM100(792 * 20)), getProperty<sal_Int32>(xPageStyle, "Height")); + // Text was missing, due to not handling the strict namespaces. + getParagraph(1, "Hello world!"); + + // Header in the document caused a crash on import. + uno::Reference<text::XText> xHeaderText(xPageStyle->getPropertyValue("HeaderText"), uno::UNO_QUERY); + getParagraphOfText(1, xHeaderText, "This is a header."); + + // Picture was missing. + uno::Reference<lang::XServiceInfo> xServiceInfo(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextGraphicObject")); + + // SmartArt was missing. + xServiceInfo.set(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.drawing.GroupShape")); + + // Chart was missing. + xServiceInfo.set(getShape(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextEmbeddedObject")); + + // Math was missing. + xServiceInfo.set(getShape(4), uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextEmbeddedObject")); +} + +DECLARE_OOXMLIMPORT_TEST(testStrictLockedcanvas, "strict-lockedcanvas.docx") +{ + // locked canvas shape was missing. + getShape(1); +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/ooxml/OOXMLFactory.cxx b/writerfilter/source/ooxml/OOXMLFactory.cxx index 20fc82c..06115c3 100644 --- a/writerfilter/source/ooxml/OOXMLFactory.cxx +++ b/writerfilter/source/ooxml/OOXMLFactory.cxx @@ -202,6 +202,18 @@ void OOXMLFactory::attributes(OOXMLFastContextHandler * pHandler, pFactory->attributeAction(pHandler, aIt->first, pValue); } break; + case RT_UniversalMeasure: + { +#ifdef DEBUG_FACTORY + debug_logger->element("universalMeasure"); +#endif + OUString aValue(Attribs->getValue(aIt->first)); + OOXMLFastHelper<OOXMLUniversalMeasureValue>::newProperty(pHandler, nId, aValue); + + OOXMLValue::Pointer_t pValue(new OOXMLUniversalMeasureValue(aValue)); + pFactory->attributeAction(pHandler, aIt->first, pValue); + } + break; case RT_List: { #ifdef DEBUG_FACTORY diff --git a/writerfilter/source/ooxml/OOXMLFactory.hxx b/writerfilter/source/ooxml/OOXMLFactory.hxx index 94039d3..346b023 100644 --- a/writerfilter/source/ooxml/OOXMLFactory.hxx +++ b/writerfilter/source/ooxml/OOXMLFactory.hxx @@ -54,7 +54,8 @@ enum ResourceType_t { RT_TextTable, RT_PropertyTable, RT_Math, - RT_Any + RT_Any, + RT_UniversalMeasure }; struct AttributeInfo diff --git a/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx index d77fdeb..6d227af1 100644 --- a/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx @@ -661,6 +661,40 @@ string OOXMLHexValue::toString() const return buffer; } +// OOXMLUniversalMeasureValue + +OOXMLUniversalMeasureValue::OOXMLUniversalMeasureValue(sal_uInt32 nValue) + : mnValue(nValue) +{ +} + +OOXMLUniversalMeasureValue::OOXMLUniversalMeasureValue(const OUString& rValue) +{ + if (rValue.endsWith("pt")) + mnValue = rValue.copy(0, rValue.getLength() - 2).toInt32() * 20; + else + mnValue = rValue.toInt32(); +} + +OOXMLUniversalMeasureValue::~OOXMLUniversalMeasureValue() +{ +} + +int OOXMLUniversalMeasureValue::getInt() const +{ + return mnValue; +} + +OOXMLValue* OOXMLUniversalMeasureValue::clone() const +{ + return new OOXMLUniversalMeasureValue(*this); +} + +string OOXMLUniversalMeasureValue::toString() const +{ + return OString::number(mnValue).getStr(); +} + /* class OOXMLShapeValue */ diff --git a/writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx b/writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx index 8ea8d85..58815b6 100644 --- a/writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx +++ b/writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx @@ -214,6 +214,21 @@ public: virtual OOXMLValue * clone() const; }; +/// Handles OOXML's ST_UniversalMeasure value. +class OOXMLUniversalMeasureValue : public OOXMLValue +{ +protected: + sal_uInt32 mnValue; +public: + explicit OOXMLUniversalMeasureValue(sal_uInt32 nValue); + explicit OOXMLUniversalMeasureValue(const OUString& rValue); + virtual ~OOXMLUniversalMeasureValue(); + + virtual int getInt() const; + virtual string toString() const; + virtual OOXMLValue* clone() const; +}; + class OOXMLShapeValue : public OOXMLValue { protected: diff --git a/writerfilter/source/ooxml/factoryimpl.xsl b/writerfilter/source/ooxml/factoryimpl.xsl index 07571b0..48f7ef4 100644 --- a/writerfilter/source/ooxml/factoryimpl.xsl +++ b/writerfilter/source/ooxml/factoryimpl.xsl @@ -101,6 +101,7 @@ uno::Reference< xml::sax::XFastContextHandler > OOXMLFactory::createFastCh <xsl:if test="generate-id(key('resources', @resource)) = generate-id(.)"> <xsl:if test="not(@resource = 'Hex' or @resource = 'Integer' or + @resource = 'UniversalMeasure' or @resource = 'Boolean' or @resource = 'List' or @resource = 'String')"> @@ -196,6 +197,7 @@ uno::Reference< xml::sax::XFastContextHandler > OOXMLFactory::createFastCh </xsl:text> </xsl:template> +<xsl:key name="namespaces-by-id" match="namespace-alias" use="@id"/> <xsl:template name="fasttokentoid"> <xsl:text> namespace tokenmap { @@ -217,7 +219,7 @@ string fastTokenToId(sal_uInt32 nToken) switch (nToken & 0xffff0000) {</xsl:text> - <xsl:for-each select="//namespace-alias"> + <xsl:for-each select="//namespace-alias[generate-id() = generate-id(key('namespaces-by-id', @id)[1])]"> <xsl:text> case NS_</xsl:text> <xsl:value-of select="@alias"/> diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 6018582..2506511 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -19,19 +19,28 @@ <model xmlns:rng="http://relaxng.org/ns/structure/1.0"> <namespace-alias name="http://www.w3.org/XML/1998/namespace" alias="xml" id="xml"/> <namespace-alias name="http://schemas.openxmlformats.org/officeDocument/2006/relationships" alias="relationships" id="officeRel"/> + <namespace-alias name="http://purl.oclc.org/ooxml/officeDocument/relationships" alias="relationships" id="officeRel"/> <namespace-alias name="urn:schemas-microsoft-com:office:office" alias="office" id="vmlOffice"/> <namespace-alias name="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" alias="theme" id="officeRelTheme"/> <namespace-alias name="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" alias="wordprocessingDrawing" id="dmlWordDr"/> + <namespace-alias name="http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing" alias="wordprocessingDrawing" id="dmlWordDr"/> <namespace-alias name="http://schemas.openxmlformats.org/drawingml/2006/main" alias="drawingml" id="dml"/> + <namespace-alias name="http://purl.oclc.org/ooxml/drawingml/main" alias="drawingml" id="dml"/> <namespace-alias name="urn:schemas-microsoft-com:vml" alias="vml" id="vml"/> <namespace-alias name="http://schemas.openxmlformats.org/drawingml/2006/picture" alias="picture" id="dmlPicture"/> + <namespace-alias name="http://purl.oclc.org/ooxml/drawingml/picture" alias="picture" id="dmlPicture"/> <namespace-alias name="http://schemas.openxmlformats.org/drawingml/2006/diagram" alias="diagram" id="dmlDiagram"/> + <namespace-alias name="http://purl.oclc.org/ooxml/drawingml/diagram" alias="diagram" id="dmlDiagram"/> <namespace-alias name="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" alias="lockedCanvas" id="dmlLockedCanvas"/> + <namespace-alias name="http://purl.oclc.org/ooxml/drawingml/lockedCanvas" alias="lockedCanvas" id="dmlLockedCanvas"/> <namespace-alias name="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" alias="wps" id="wps"/> <namespace-alias name="http://schemas.openxmlformats.org/drawingml/2006/chart" alias="chart" id="dmlChart"/> + <namespace-alias name="http://purl.oclc.org/ooxml/drawingml/chart" alias="chart" id="dmlChart"/> <namespace-alias name="urn:schemas-microsoft-com:office:word" alias="vml_wordprocessingDrawing" id="vmlWord"/> <namespace-alias name="http://schemas.openxmlformats.org/wordprocessingml/2006/main" alias="wordprocessingml" id="doc"/> + <namespace-alias name="http://purl.oclc.org/ooxml/wordprocessingml/main" alias="wordprocessingml" id="doc"/> <namespace-alias name="http://schemas.openxmlformats.org/officeDocument/2006/math" alias="math" id="officeMath"/> + <namespace-alias name="http://purl.oclc.org/ooxml/officeDocument/math" alias="math" id="officeMath"/> <namespace-alias name="http://schemas.openxmlformats.org/schemaLibrary/2006/main" alias="schemaLibrary" id="schema"/> <namespace-alias name="http://schemas.openxmlformats.org/markup-compatibility/2006" alias="mce" id="mce"/> <namespace-alias name="http://sprm" alias="sprm" id="sprm"/> @@ -8343,7 +8352,7 @@ <resource name="CT_OMathJc" resource="Value" generated="yes" tag="math"> <attribute name="val" tokenid="ooxml:CT_OMathJc_val" action="setValue"/> </resource> - <resource name="ST_TwipsMeasure" resource="Integer" generated="yes"/> + <resource name="ST_TwipsMeasure" resource="UniversalMeasure"/> <resource name="CT_TwipsMeasure" resource="Value" generated="yes" tag="math"> <attribute name="val" tokenid="ooxml:CT_TwipsMeasure_val" action="setValue"/> <action name="start" action="setDefaultIntegerValue"/> @@ -21336,12 +21345,12 @@ <action name="start" action="setDefaultIntegerValue"/> </resource> <resource name="ST_UnsignedDecimalNumber" resource="Integer" generated="yes"/> - <resource name="ST_TwipsMeasure" resource="Integer"/> + <resource name="ST_TwipsMeasure" resource="UniversalMeasure"/> <resource name="CT_TwipsMeasure" resource="Value" tag="attribute"> <attribute name="val" tokenid="ooxml:CT_TwipsMeasure_val" action="setValue"/> <action name="start" action="setDefaultIntegerValue"/> </resource> - <resource name="ST_SignedTwipsMeasure" resource="Integer"/> + <resource name="ST_SignedTwipsMeasure" resource="UniversalMeasure"/> <resource name="CT_SignedTwipsMeasure" resource="Value" tag="attribute"> <attribute name="val" tokenid="ooxml:CT_SignedTwipsMeasure_val" action="setValue"/> <action name="start" action="setDefaultIntegerValue"/> diff --git a/writerfilter/source/ooxml/namespaceids.xsl b/writerfilter/source/ooxml/namespaceids.xsl index ea56acc..d92593d 100644 --- a/writerfilter/source/ooxml/namespaceids.xsl +++ b/writerfilter/source/ooxml/namespaceids.xsl @@ -51,8 +51,9 @@ <xsl:include href="factorytools.xsl"/> +<xsl:key name="namespaces-by-id" match="namespace-alias" use="@id"/> <xsl:template name="namespaceids"> - <xsl:for-each select="//namespace-alias"> + <xsl:for-each select="//namespace-alias[generate-id() = generate-id(key('namespaces-by-id', @id)[1])]"> <xsl:text> const sal_uInt32 </xsl:text> <xsl:call-template name="namespaceid"/> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits