sw/qa/extras/ooxmlimport/data/tdf124670.docx |binary sw/qa/extras/ooxmlimport/ooxmlimport2.cxx | 10 +++++ writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 31 ++++++------------ writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 15 +++----- 4 files changed, 27 insertions(+), 29 deletions(-)
New commits: commit 7b6c9c2f52ef80876d494ef966a3ee088c81bcd5 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Sun Apr 14 00:46:15 2019 +0300 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Mon Apr 15 11:00:56 2019 +0200 tdf#124670: xml:space attribute may be specified for w:document root element Treat xml:space specially in OOXMLFastContextHandler::startFastElement, to allow this attribute to be handled for any element. Change-Id: I81bd1e0642940ffdfc03d6c65d0ce9f421206c5e Reviewed-on: https://gerrit.libreoffice.org/70723 Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Tested-by: Mike Kaganski <mike.kagan...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/70725 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/sw/qa/extras/ooxmlimport/data/tdf124670.docx b/sw/qa/extras/ooxmlimport/data/tdf124670.docx new file mode 100644 index 000000000000..d804efa5a990 Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/tdf124670.docx differ diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx index 991573fd40af..a74501cd708c 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx @@ -330,6 +330,16 @@ DECLARE_OOXMLIMPORT_TEST(testTdf121440, "tdf121440.docx") getProperty<sal_Int32>(getRun(getParagraph(1), 1), "CharEscapement")); } +DECLARE_OOXMLIMPORT_TEST(testTdf124670, "tdf124670.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); + // We need to take xml:space attribute into account, even in w:document element + uno::Reference<text::XTextRange> paragraph = getParagraph(1); + CPPUNIT_ASSERT_EQUAL( + OUString("You won't believe, but that's how it was in markup of original bugdoc!"), + paragraph->getString()); +} + // tests should only be added to ooxmlIMPORT *if* they fail round-tripping in ooxmlEXPORT CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index ff3da8a3ba5a..be825d2f01d3 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -144,6 +144,13 @@ void SAL_CALL OOXMLFastContextHandler::startFastElement (Token_t Element, const uno::Reference< xml::sax::XFastAttributeList > & Attribs) { + // Set xml:space value early, to allow child contexts use it when dealing with strings. + if (Attribs && Attribs->hasAttribute(oox::NMSP_xml | oox::XML_space)) + { + mbPreserveSpace = Attribs->getValue(oox::NMSP_xml | oox::XML_space) == "preserve"; + mbPreserveSpaceSet = true; + } + if (oox::getNamespace(Element) == NMSP_mce) m_bDiscardChildren = prepareMceContext(Element, Attribs); @@ -881,6 +888,8 @@ bool OOXMLFastContextHandler::IsPreserveSpace() const { // xml:space attribute applies to all elements within the content of the element where it is specified, // unless overridden with another instance of the xml:space attribute + if (mbPreserveSpaceSet) + return mbPreserveSpace; if (mpParent) return mpParent->IsPreserveSpace(); return false; // default value @@ -893,9 +902,7 @@ bool OOXMLFastContextHandler::IsPreserveSpace() const OOXMLFastContextHandlerStream::OOXMLFastContextHandlerStream (OOXMLFastContextHandler * pContext) : OOXMLFastContextHandler(pContext), - mpPropertySetAttrs(new OOXMLPropertySet), - mbPreserveSpace(false), - mbPreserveSpaceSet(false) + mpPropertySetAttrs(new OOXMLPropertySet) { } @@ -906,14 +913,7 @@ OOXMLFastContextHandlerStream::~OOXMLFastContextHandlerStream() void OOXMLFastContextHandlerStream::newProperty(Id nId, const OOXMLValue::Pointer_t& pVal) { - if (nId == NS_ooxml::LN_CT_Text_space) - { - // Set <xml:space> value early, to allow - // child contexts use it when dealing with strings - mbPreserveSpace = pVal->getString() == "preserve"; - mbPreserveSpaceSet = true; - } - else if (nId != 0x0) + if (nId != 0x0) { mpPropertySetAttrs->add(nId, pVal, OOXMLProperty::ATTRIBUTE); } @@ -943,15 +943,6 @@ void OOXMLFastContextHandlerStream::handleHyperlink() aHyperlinkHandler.writetext(); } -bool OOXMLFastContextHandlerStream::IsPreserveSpace() const -{ - // xml:space attribute applies to all elements within the content of the element where it is specified, - // unless overridden with another instance of the xml:space attribute - if (mbPreserveSpaceSet) - return mbPreserveSpace; - return OOXMLFastContextHandler::IsPreserveSpace(); -} - /* class OOXMLFastContextHandlerProperties */ diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index 29842cc5071f..097214b8e049 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -51,7 +51,7 @@ public: virtual ~OOXMLFastContextHandler() override; // css::xml::sax::XFastContextHandler: - virtual void SAL_CALL startFastElement (Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) override; + virtual void SAL_CALL startFastElement (Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) override final; virtual void SAL_CALL startUnknownElement(const OUString & Namespace, const OUString & Name, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override; @@ -224,9 +224,6 @@ protected: void startAction(); void endAction(); - // 2.10 of XML 1.0 specification - virtual bool IsPreserveSpace() const; - const css::uno::Reference< css::uno::XComponentContext >& getComponentContext() { return m_xContext;} bool inPositionV; @@ -237,9 +234,14 @@ private: /// Handles AlternateContent. Returns true, if children of the current element should be ignored. bool prepareMceContext(Token_t nElement, const css::uno::Reference<css::xml::sax::XFastAttributeList>& Attribs); + // 2.10 of XML 1.0 specification + bool IsPreserveSpace() const; + css::uno::Reference< css::uno::XComponentContext > m_xContext; bool m_bDiscardChildren; bool m_bTookChoice; ///< Did we take the Choice or want Fallback instead? + bool mbPreserveSpace = false; + bool mbPreserveSpaceSet = false; }; @@ -259,13 +261,8 @@ public: void handleHyperlink(); -protected: - virtual bool IsPreserveSpace() const override; - private: mutable OOXMLPropertySet::Pointer_t mpPropertySetAttrs; - bool mbPreserveSpace : 1; - bool mbPreserveSpaceSet : 1; }; class OOXMLFastContextHandlerProperties : public OOXMLFastContextHandler _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits