sw/CppunitTest_sw_ooxmlexport22.mk                            |   22 ++++
 sw/Module_sw.mk                                               |    1 
 sw/qa/extras/ooxmlexport/data/tdf165642_glossaryFootnote.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport22.cxx                    |   49 ++++++++++
 sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx            |   16 +++
 5 files changed, 88 insertions(+)

New commits:
commit 60788682d3d62264e8a5ac42f3469f2d2f55815c
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Sat Mar 8 15:30:41 2025 -0500
Commit:     Justin Luth <justin.l...@collabora.com>
CommitDate: Sun Mar 9 00:46:50 2025 +0100

    tdf#165642 docx export glossary: RT endnotes.xml/footnotes.xml too
    
    settings.xml might refer to endnotePr
    (in which case there must be an endnotes.xml file)
    and / or footnotePr
    (in which case there must be a footnotes.xml file)
    so round-trip these 2 files also if they exist in the glossary folder.
    
    Otherwise MS Word complains about invalid content.
    
    For this particular unit test it went bad in LO 7.4.4,
    but in other circumstances, it already goes bad in LO 4.3.
    
    make CppunitTest_sw_ooxmlexport22 \
        CPPUNIT_TEST_NAME=testTdf165642_glossaryFootnote
    
    Change-Id: Ib4c2513fa915fc4de4aee056b67a5936be5c52a1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182674
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>

diff --git a/sw/CppunitTest_sw_ooxmlexport22.mk 
b/sw/CppunitTest_sw_ooxmlexport22.mk
new file mode 100644
index 000000000000..e1137f9c302c
--- /dev/null
+++ b/sw/CppunitTest_sw_ooxmlexport22.mk
@@ -0,0 +1,22 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#*************************************************************************
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#*************************************************************************
+
+$(eval $(call sw_ooxmlexport_test,22))
+
+$(eval $(call gb_CppunitTest_use_custom_headers,sw_ooxmlexport22,\
+    officecfg/registry \
+))
+
+ifneq ($(filter MORE_FONTS,$(BUILD_TYPE)),)
+$(eval $(call 
gb_CppunitTest_set_non_application_font_use,sw_ooxmlexport22,abort))
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk
index 6d4ed9f55967..19fecbe6d9cf 100644
--- a/sw/Module_sw.mk
+++ b/sw/Module_sw.mk
@@ -99,6 +99,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\
     CppunitTest_sw_ooxmlexport19 \
     CppunitTest_sw_ooxmlexport20 \
     CppunitTest_sw_ooxmlexport21 \
+    CppunitTest_sw_ooxmlexport22 \
     CppunitTest_sw_ooxmlexport_template \
     CppunitTest_sw_ooxmlfieldexport \
     CppunitTest_sw_ooxmllinks \
diff --git a/sw/qa/extras/ooxmlexport/data/tdf165642_glossaryFootnote.docx 
b/sw/qa/extras/ooxmlexport/data/tdf165642_glossaryFootnote.docx
new file mode 100644
index 000000000000..6188a919522b
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf165642_glossaryFootnote.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport22.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport22.cxx
new file mode 100644
index 000000000000..34408dcc958b
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport22.cxx
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <swmodeltestbase.hxx>
+
+#include <com/sun/star/beans/XPropertyState.hpp>
+
+#include <comphelper/configuration.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+#include <officecfg/Office/Common.hxx>
+
+#include <pam.hxx>
+#include <unotxdoc.hxx>
+#include <docsh.hxx>
+
+namespace
+{
+class Test : public SwModelTestBase
+{
+public:
+    Test()
+        : SwModelTestBase(u"/sw/qa/extras/ooxmlexport/data/"_ustr, u"Office 
Open XML Text"_ustr)
+    {
+    }
+};
+
+CPPUNIT_TEST_FIXTURE(Test, testTdf165642_glossaryFootnote)
+{
+    loadAndSave("tdf165642_glossaryFootnote.docx");
+    // round-trip'ing the settings.xml file as is, it contains 
footnote/endnote references
+    xmlDocUniquePtr pXmlSettings = 
parseExport(u"word/glossary/settings.xml"_ustr);
+    assertXPath(pXmlSettings, "//w:endnotePr", 1);
+    assertXPath(pXmlSettings, "//w:footnotePr", 1);
+
+    // thus, the footnote and endnote files must also be round-tripped
+    parseExport(u"word/glossary/endnotes.xml"_ustr);
+    parseExport(u"word/glossary/footnotes.xml"_ustr);
+}
+
+} // end of anonymous namespace
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx 
b/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx
index 9192f1055a89..8caaddbc1e6a 100644
--- a/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx
+++ b/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx
@@ -608,10 +608,14 @@ void OOXMLDocumentImpl::resolveCustomXmlStream(Stream & 
rStream)
 namespace
 {
 constexpr OUStringLiteral sSettingsType = 
u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings";;
+constexpr OUStringLiteral sEndnotesType = 
u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes";;
+constexpr OUStringLiteral sFootnotesType = 
u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes";;
 constexpr OUStringLiteral sStylesType = 
u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";;
 constexpr OUStringLiteral sFonttableType = 
u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable";;
 constexpr OUStringLiteral sWebSettings = 
u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings";;
 constexpr OUStringLiteral sSettingsTypeStrict = 
u"http://purl.oclc.org/ooxml/officeDocument/relationships/settings";;
+constexpr OUStringLiteral sEndnoteTypeStrict = 
u"http://purl.oclc.org/ooxml/officeDocument/relationships/endnotes";;
+constexpr OUStringLiteral sFootnoteTypeStrict = 
u"http://purl.oclc.org/ooxml/officeDocument/relationships/footnotes";;
 constexpr OUStringLiteral sStylesTypeStrict = 
u"http://purl.oclc.org/ooxml/officeDocument/relationships/styles";;
 constexpr OUStringLiteral sFonttableTypeStrict = 
u"http://purl.oclc.org/ooxml/officeDocument/relationships/fontTable";;
 constexpr OUStringLiteral sWebSettingsStrict = 
u"http://purl.oclc.org/ooxml/officeDocument/relationships/webSettings";;
@@ -623,6 +627,8 @@ constexpr OUStringLiteral sTargetMode = u"TargetMode";
 constexpr OUString sContentType = u"_contentType"_ustr;
 constexpr OUStringLiteral sRelDom = u"_relDom";
 constexpr OUStringLiteral sSettingsContentType = 
u"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml";
+constexpr OUStringLiteral sEndnotesContentType = 
u"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml";
+constexpr OUStringLiteral sFootnotesContentType = 
u"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml";
 constexpr OUStringLiteral sStylesContentType = 
u"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml";
 constexpr OUStringLiteral sWebsettingsContentType = 
u"application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml";
 constexpr OUStringLiteral sFonttableContentType = 
u"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml";
@@ -663,6 +669,16 @@ void OOXMLDocumentImpl::resolveGlossaryStream(Stream & 
/*rStream*/)
             nType = OOXMLStream::SETTINGS;
             aRelDefinition.put(sContentType, sSettingsContentType);
         }
+        else if (gType == sEndnotesType || gType == sEndnoteTypeStrict)
+        {
+            nType = OOXMLStream::ENDNOTES;
+            aRelDefinition.put(sContentType, sEndnotesContentType);
+        }
+        else if (gType == sFootnotesType || gType == sFootnoteTypeStrict)
+        {
+            nType = OOXMLStream::FOOTNOTES;
+            aRelDefinition.put(sContentType, sFootnotesContentType);
+        }
         else if (gType == sStylesType || gType == sStylesTypeStrict)
         {
             nType = OOXMLStream::STYLES;

Reply via email to