From 23b745e20d23c1eae555fdad5bec5f494a30c88c Mon Sep 17 00:00:00 2001 From: Dmitry Kulikov Date: Thu, 9 Jul 2026 15:50:08 +0300 Subject: [PATCH] tdf#170236 sw: import comment anchored inside a math formula A Word comment whose w:commentReference sits inside was lost on DOCX import: OOXMLFastContextHandlerLinear/Math buffers every child of the formula and never routes commentReference to handleComment, so comments.xml was never resolved and no annotation was created. Intercept w:commentReference in OOXMLFastContextHandlerLinear: collect its id and resolve it via the existing resolveComment() path once the formula object has been emitted (in OOXMLFastContextHandlerMath::process). The tag is never buffered into the formula, so the Starmath buffer stays balanced and formula import is unaffected. Signed-off-by: Dmitry Kulikov Change-Id: I9b0dccc79d5a7da9294b18f0cb58776a2bd8b553 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/207888 Tested-by: Jenkins Reviewed-by: Dan Williams --- sw/qa/extras/ooxmlimport/data/tdf170236.docx | Bin 0 -> 19465 bytes sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 25 ++++++++++++++++++ .../ooxml/OOXMLFastContextHandler.cxx | 17 ++++++++++-- .../ooxml/OOXMLFastContextHandler.hxx | 4 +++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 sw/qa/extras/ooxmlimport/data/tdf170236.docx diff --git a/sw/qa/extras/ooxmlimport/data/tdf170236.docx b/sw/qa/extras/ooxmlimport/data/tdf170236.docx new file mode 100644 index 0000000000000000000000000000000000000000..1d6fdd1e88d2b7db9e828999a4e87238eea6136e GIT binary patch literal 19465 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

wVdXj%2V=m{jN)F$pJ&$n%H|a6);V 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 literal 0 HcmV?d00001 diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 7442fdb86677..54349c0896a5 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -1960,6 +1960,31 @@ CPPUNIT_TEST_FIXTURE(Test, testInlineFormulaTextMode) testFitsOnOnePage(); } +CPPUNIT_TEST_FIXTURE(Test, testTdf170236CommentInFormula) +{ + // tdf#170236: a w:commentReference inside an m:oMath formula was dropped on import + createSwDoc("tdf170236.docx"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + bool bFoundAnnotation = false; + while (xFields->hasMoreElements()) + { + uno::Reference xServiceInfo(xFields->nextElement(), uno::UNO_QUERY); + if (xServiceInfo->supportsService(u"com.sun.star.text.textfield.Annotation"_ustr)) + { + bFoundAnnotation = true; + uno::Reference xPropertySet(xServiceInfo, uno::UNO_QUERY); + OUString aContent; + xPropertySet->getPropertyValue(u"Content"_ustr) >>= aContent; + CPPUNIT_ASSERT_EQUAL(u"Hello World!"_ustr, aContent); + break; + } + } + CPPUNIT_ASSERT_MESSAGE("No annotation found in document", bFoundAnnotation); +} + // tests should only be added to ooxmlIMPORT *if* they fail round-tripping in ooxmlEXPORT } // end of anonymous namespace diff --git a/sw/source/writerfilter/ooxml/OOXMLFastContextHandler.cxx b/sw/source/writerfilter/ooxml/OOXMLFastContextHandler.cxx index a61fcaa2caa5..6c18c4b867e3 100644 --- a/sw/source/writerfilter/ooxml/OOXMLFastContextHandler.cxx +++ b/sw/source/writerfilter/ooxml/OOXMLFastContextHandler.cxx @@ -2492,9 +2492,18 @@ void OOXMLFastContextHandlerLinear::lcl_endFastElement(Token_t Element) } uno::Reference< xml::sax::XFastContextHandler > -OOXMLFastContextHandlerLinear::lcl_createFastChildContext(Token_t, - const uno::Reference< xml::sax::XFastAttributeList >&) +OOXMLFastContextHandlerLinear::lcl_createFastChildContext(Token_t Element, + const uno::Reference< xml::sax::XFastAttributeList >& Attribs) { + // tdf#170236: buffering a w:commentReference would feed it to Starmath, which + // drops it; capture the id instead and resolve it after the formula (process()). + if (Element == W_TOKEN(commentReference)) + { + if (Attribs && Attribs->hasAttribute(W_TOKEN(id))) + m_aCommentIds.push_back(Attribs->getValue(W_TOKEN(id)).toInt32()); + return nullptr; + } + uno::Reference< xml::sax::XFastContextHandler > xContextHandler; xContextHandler.set( this ); return xContextHandler; @@ -2556,6 +2565,10 @@ void OOXMLFastContextHandlerMath::process() else pProps->add(NS_ooxml::LN_starmath, pVal, OOXMLProperty::ATTRIBUTE); mpStream->props( pProps.get() ); + + // tdf#170236: resolve now, so the anchor lands right after the emitted formula + for (sal_Int32 nCommentId : m_aCommentIds) + resolveComment(nCommentId); } OOXMLFastContextHandlerCommentEx::OOXMLFastContextHandlerCommentEx( diff --git a/sw/source/writerfilter/ooxml/OOXMLFastContextHandler.hxx b/sw/source/writerfilter/ooxml/OOXMLFastContextHandler.hxx index 34bd89693c91..7f1976c82ce8 100644 --- a/sw/source/writerfilter/ooxml/OOXMLFastContextHandler.hxx +++ b/sw/source/writerfilter/ooxml/OOXMLFastContextHandler.hxx @@ -20,6 +20,7 @@ #pragma once #include +#include #include #include #include @@ -596,6 +597,9 @@ protected: // should be private, but not much point in making deep copies of it oox::formulaimport::XmlStreamBuilder m_buffer; + // tdf#170236: comment ids referenced inside the formula, resolved in Math::process() + std::vector m_aCommentIds; + private: int m_depthCount; };