sw/qa/extras/ooxmlimport/data/strict.docx |binary sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 12 +++++++ 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 | 1 writerfilter/source/ooxml/model.xml | 6 +-- 8 files changed, 79 insertions(+), 4 deletions(-)
New commits: commit 37cc7e7471ba3b11cefcb0218c27e2c745886a6d Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Mar 7 14:44:10 2014 +0100 DOCX import: handle points in ST_TwipsMeasure and ST_SignedTwipsMeasure This fixes page size and margins in case of strict DOCX. Change-Id: I65894eeef191a0f4bd92d1fa69a17e820aae3a43 diff --git a/sw/qa/extras/ooxmlimport/data/strict.docx b/sw/qa/extras/ooxmlimport/data/strict.docx new file mode 100644 index 0000000..4195398 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 4f384d8..2503c81 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -1903,6 +1903,18 @@ DECLARE_OOXMLIMPORT_TEST(testDMLGroupShapeRunFonts, "dml-groupshape-runfonts.doc CPPUNIT_ASSERT_EQUAL(OUString("Arial Unicode MS"), getProperty<OUString>(xRun, "CharFontNameComplex")); CPPUNIT_ASSERT_EQUAL(OUString("MS Mincho"), getProperty<OUString>(xRun, "CharFontNameAsian")); } + +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, "TopMargin")); + // 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!"); +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx index cb7f1b7..6d227af1 100644 --- a/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx @@ -670,7 +670,10 @@ OOXMLUniversalMeasureValue::OOXMLUniversalMeasureValue(sal_uInt32 nValue) OOXMLUniversalMeasureValue::OOXMLUniversalMeasureValue(const OUString& rValue) { - mnValue = rValue.toInt32(); + if (rValue.endsWith("pt")) + mnValue = rValue.copy(0, rValue.getLength() - 2).toInt32() * 20; + else + mnValue = rValue.toInt32(); } OOXMLUniversalMeasureValue::~OOXMLUniversalMeasureValue() diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 406609a..0a84d4f 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -22996,7 +22996,7 @@ <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"/> commit d5d7c7d3b281e1a9060d60bc4ac7738ae616f167 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Mar 7 14:27:11 2014 +0100 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. Change-Id: Iebb1ee859076595594d1455a1f826841dae77a0b diff --git a/writerfilter/source/ooxml/OOXMLFactory.cxx b/writerfilter/source/ooxml/OOXMLFactory.cxx index 5d683cb..8e2fa15 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..cb7f1b7 100644 --- a/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx @@ -661,6 +661,37 @@ string OOXMLHexValue::toString() const return buffer; } +// OOXMLUniversalMeasureValue + +OOXMLUniversalMeasureValue::OOXMLUniversalMeasureValue(sal_uInt32 nValue) + : mnValue(nValue) +{ +} + +OOXMLUniversalMeasureValue::OOXMLUniversalMeasureValue(const OUString& rValue) +{ + 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 2fb5139..fe45620 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')"> diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 12c47c4..406609a 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -9902,7 +9902,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"/> @@ -22991,7 +22991,7 @@ <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"/> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits