sw/qa/extras/ooxmlexport/ooxmlexport21.cxx |   11 +++++++++++
 sw/source/core/doc/number.cxx              |    5 ++++-
 sw/source/filter/ww8/wrtw8num.cxx          |   11 ++++++++++-
 3 files changed, 25 insertions(+), 2 deletions(-)

New commits:
commit 71c49057deb1a696e4b0ce9d2091aaa28572b57a
Author:     Justin Luth <jl...@mail.com>
AuthorDate: Mon May 20 14:28:59 2024 -0400
Commit:     Justin Luth <jl...@mail.com>
CommitDate: Fri May 31 15:27:14 2024 +0200

    tdf#149258 sw ms export: no separator for NONE numbering level
    
    This is to benefit ODT->DOCX.
    
    LO does not show the separators specified after a numbering level
    that has no numbering type (since LO 7.2.5).
    However, MSO does show any specified separators.
    So export this the way that LO sees it.
    
    Note that in the very odd case where an MSO user actually wanted
    these separators to be visible, LO fails to show them,
    and thus this will end up exporting as "data loss". How sad.
    
    make CppunitTest_sw_ooxmlexport21 \
        CPPUNIT_TEST_NAME=testTdf156105_percentSuffix
    
    Change-Id: I2c084de319ef4b1e77b6f377708c71a62dcc5910
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167898
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>

diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx
index baeba733afcc..e487bbf00015 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport21.cxx
@@ -298,6 +298,17 @@ DECLARE_OOXMLEXPORT_TEST(testTdf156105_percentSuffix, 
"tdf156105_percentSuffix.o
     // given a numbered list with a non-escaping percent symbol in the prefix 
and suffix
     CPPUNIT_ASSERT_EQUAL(OUString("(%)[%]"),
                          getProperty<OUString>(getParagraph(3), 
"ListLabelString"));
+
+    // tdf#149258 - NONE number should not export separator since LO doesn't 
currently show it
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("showing levels 1, 2, and 4", 
OUString("(%)1.1.1[%]"),
+                                 getProperty<OUString>(getParagraph(4), 
"ListLabelString"));
+    if (isExported())
+    {
+        xmlDocUniquePtr pXmlNum = parseExport("word/numbering.xml");
+        // The 3rd level is NONE. If we include the separator, MS Word will 
display it.
+        assertXPath(pXmlNum, 
"/w:numbering/w:abstractNum[1]/w:lvl[4]/w:lvlText"_ostr, "val"_ostr,
+                    "(%)%1.%2.%3%4[%]");
+    }
 }
 
 DECLARE_OOXMLEXPORT_TEST(testTdf160049_anchorMarginVML, 
"tdf160049_anchorMarginVML.docx")
diff --git a/sw/source/core/doc/number.cxx b/sw/source/core/doc/number.cxx
index f43ab140b60d..e811f7b83540 100644
--- a/sw/source/core/doc/number.cxx
+++ b/sw/source/core/doc/number.cxx
@@ -763,8 +763,11 @@ OUString SwNumRule::MakeNumString( const 
SwNumberTree::tNumberVector & rNumVecto
                 // Numbering disabled - replacement is empty
                 // And we should skip all level string content until next 
level marker:
                 // so %1%.%2%.%3% with second level as NONE will result 1.1, 
not 1..1
+
+                // NOTE: if changed, fix MSWordExportBase::NumberingLevel to 
match new behaviour.
+
                 sal_Int32 nPositionNext = sLevelFormat.indexOf('%', nPosition 
+ sFind.getLength());
-                if (nPosition >= 0 && nPositionNext >= nPosition)
+                if (nPosition >= 0 && nPositionNext > nPosition)
                 {
                     sLevelFormat = sLevelFormat.replaceAt(nPosition, 
nPositionNext - nPosition, u"");
                 }
diff --git a/sw/source/filter/ww8/wrtw8num.cxx 
b/sw/source/filter/ww8/wrtw8num.cxx
index 4c56472bb6b3..e8f7b197ed59 100644
--- a/sw/source/filter/ww8/wrtw8num.cxx
+++ b/sw/source/filter/ww8/wrtw8num.cxx
@@ -489,9 +489,18 @@ void MSWordExportBase::NumberingLevel(
                 sal_Int32 nFnd = sNumStr.indexOf(sSrch);
                 if (-1 != nFnd)
                 {
+                    sal_Int32 nLen = sSrch.getLength();
+                    if (i < nLvl && rRule.Get(i).GetNumberingType() == 
SVX_NUM_NUMBER_NONE)
+                    {
+                        // LO doesn't show this level, so don't export its 
separator
+                        const OUString sSrch2("%" + OUString::number(i + 2) + 
"%");
+                        const sal_Int32 nFnd2 = sNumStr.indexOf(sSrch2, nFnd);
+                        if (-1 != nFnd2)
+                            nLen = nFnd2 - nFnd;
+                    }
                     *pLvlPos = static_cast<sal_uInt8>(nFnd + 1);
                     ++pLvlPos;
-                    sNumStr = sNumStr.replaceAt(nFnd, sSrch.getLength(), 
rtl::OUStringChar(static_cast<char>(i)));
+                    sNumStr = sNumStr.replaceAt(nFnd, nLen, 
OUStringChar(static_cast<char>(i)));
                 }
             }
         }

Reply via email to