sw/qa/extras/ooxmlexport/data/tdf148111.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport15.cxx | 29 +++++++++++++++++++++++++++ writerfilter/source/dmapper/SdtHelper.cxx | 3 +- 3 files changed, 31 insertions(+), 1 deletion(-)
New commits: commit 873b52f4c46c47ebe7d70374586a00488f3a4037 Author: Vasily Melenchuk <vasily.melenc...@cib.de> AuthorDate: Fri Mar 25 11:14:10 2022 +0300 Commit: Thorsten Behrens <thorsten.behr...@allotropia.de> CommitDate: Tue Jun 21 01:18:27 2022 +0200 tdf#148111: docx std fields: use placeholder text for empty data It is quite unexpected Word behavior: if data source for sdt field exists but contains empty string it is not used. Placeholder is inserted instead. In general behavior is more complex: logic of replacement is defined by <w:showingPlcHdr> property and results can vary (see testcase). But LO does not support this property correctly yet. Change-Id: I2ec8efe05f79a01af5d74d21bfcd05f3b19e3970 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132096 Tested-by: Jenkins Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132574 Tested-by: Thorsten Behrens <thorsten.behr...@allotropia.de> diff --git a/sw/qa/extras/ooxmlexport/data/tdf148111.docx b/sw/qa/extras/ooxmlexport/data/tdf148111.docx new file mode 100644 index 000000000000..a46fb508dc0e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148111.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx index 95359aebf820..f63b5aa5a5fe 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx @@ -12,6 +12,7 @@ #include <com/sun/star/beans/NamedValue.hpp> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/text/XBookmarksSupplier.hpp> +#include <com/sun/star/text/XTextField.hpp> char const DATA_DIRECTORY[] = "/sw/qa/extras/ooxmlexport/data/"; @@ -182,6 +183,34 @@ DECLARE_OOXMLEXPORT_TEST(testTdf137466, "tdf137466.docx") CPPUNIT_ASSERT_EQUAL(OUString("FF0000"), sColor); } +DECLARE_OOXMLEXPORT_TEST(testTdf148111, "tdf148111.docx") +{ + uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields()); + + uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration()); + std::vector<OUString> aExpectedValues = { + // These field values are NOT in order in document: getTextFields did provide + // fields in a strange but fixed order + "Title", "Placeholder", "Placeholder", "Placeholder", + "Placeholder", "Placeholder", "Placeholder", "Placeholder", + "Placeholder", "Placeholder", "Placeholder", "Placeholder", + "Placeholder", "Placeholder", "Placeholder", "Placeholder", + "Placeholder", "Title", "Title", "Title", + "Title", "Title", "Title", "Title" + }; + + sal_uInt16 nIndex = 0; + while (xFields->hasMoreElements()) + { + uno::Reference<text::XTextField> xTextField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(aExpectedValues[nIndex++], xTextField->getPresentation(false)); + } + + // No more fields + CPPUNIT_ASSERT(!xFields->hasMoreElements()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx index 8a2356051a21..71d1ffd7fc9f 100644 --- a/writerfilter/source/dmapper/SdtHelper.cxx +++ b/writerfilter/source/dmapper/SdtHelper.cxx @@ -201,7 +201,8 @@ std::optional<OUString> SdtHelper::getValueFromDataBinding() { uno::Reference<XXPathObject> xResult = xXpathAPI->eval(xDocument, m_sDataBindingXPath); - if (xResult.is() && xResult->getNodeList() && xResult->getNodeList()->getLength()) + if (xResult.is() && xResult->getNodeList() && xResult->getNodeList()->getLength() + && xResult->getString().getLength()) { return xResult->getString(); }