sw/qa/extras/rtfexport/data/listWithLgl.rtf     |   23 +++++++++++++++++++++
 sw/qa/extras/rtfexport/rtfexport3.cxx           |   26 ++++++++++++++++++++++++
 sw/source/filter/ww8/rtfattributeoutput.cxx     |    7 +++++-
 writerfilter/source/rtftok/rtfcontrolwords.cxx  |    2 -
 writerfilter/source/rtftok/rtfdispatchvalue.cxx |    3 ++
 5 files changed, 59 insertions(+), 2 deletions(-)

New commits:
commit ebfd17e47c1bdfd25090fe73495e4e729ac19564
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Wed Feb 28 08:34:02 2024 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Mon Mar 4 09:40:00 2024 +0100

    Related: tdf#150408 RTF filter: handle legal numbering
    
    The bugdoc's 2nd para started with 'Sect I.01', while Word rendered this
    as 'Sect 1.01'.
    
    The reason for this difference is that there is an "is legal" boolean
    property on the numbering that we ignored from RTF during import/export.
    
    Fix the problem by extending RTFDocumentImpl::dispatchTableSprmValue()
    for the numbering table import + RtfAttributeOutput::NumberingLevel()
    for the export.
    
    The import default for this value was also wrong, given that the default
    is to enable it when the control word is present.
    
    (cherry picked from commit e8487bedb20a429565b4a0e4bd2d6806cc603b7f)
    
    Conflicts:
            sw/qa/extras/rtfexport/rtfexport3.cxx
    
    Change-Id: I4dcd23768000ba29d4df314b475b412bb371545e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164327
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sw/qa/extras/rtfexport/data/listWithLgl.rtf 
b/sw/qa/extras/rtfexport/data/listWithLgl.rtf
new file mode 100644
index 000000000000..4355049eb3dc
--- /dev/null
+++ b/sw/qa/extras/rtfexport/data/listWithLgl.rtf
@@ -0,0 +1,23 @@
+{ tf1
+{\*\listtable
+{\list\listtemplateid197063698
+{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0
+{\leveltext\'04CH \'00;}
+{\levelnumbers\'04;}
+ tlchcs1 f0 \ltrchcs0 \s15i0\li0\lin0 }
+{\listlevel\levelnfc22\levelnfcn22\leveljc0\leveljcn0\levelfollow0\levelstartat1\levellegal\levelspace0\levelindent0
+{\leveltext\'08Sect \'00.\'01;}
+{\levelnumbers
+\'06\'08;}
+ tlchcs1 f0 \ltrchcs0 \s16i720\li0\jclisttab       x2160\lin0 }
+\listid1297755732}
+}
+{\*\listoverridetable
+{\listoverride\listid1297755732\listoverridecount0\ls1}
+}
+\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440
+\pard\plain\ls1\par
+\pard\plaini720       x2160\ls1\ilvl1 Foo\par
+\pard\plain\ls1\par
+\pard\plaini720       x2160\ls1\ilvl1 Bar\par
+}
diff --git a/sw/qa/extras/rtfexport/rtfexport3.cxx 
b/sw/qa/extras/rtfexport/rtfexport3.cxx
index fd25e7e5758d..d7ab8fc1995e 100644
--- a/sw/qa/extras/rtfexport/rtfexport3.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport3.cxx
@@ -716,6 +716,32 @@ DECLARE_RTFEXPORT_TEST(testTdf158409, "tdf158409.rtf")
     CPPUNIT_ASSERT_EQUAL(8.0, getProperty<double>(xRun, "CharHeight"));
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testLegalNumbering)
+{
+    auto verify = [this]() {
+        // Second level's numbering should use Arabic numbers for first level 
reference
+        auto xPara = getParagraph(1);
+        CPPUNIT_ASSERT_EQUAL(OUString("CH I"), getProperty<OUString>(xPara, 
"ListLabelString"));
+        xPara = getParagraph(2);
+        // Without the accompanying fix in place, this test would have failed 
with:
+        // - Expected: Sect 1.01
+        // - Actual  : Sect I.01
+        // i.e. \levellegal was ignored on import/export.
+        CPPUNIT_ASSERT_EQUAL(OUString("Sect 1.01"),
+                             getProperty<OUString>(xPara, "ListLabelString"));
+        xPara = getParagraph(3);
+        CPPUNIT_ASSERT_EQUAL(OUString("CH II"), getProperty<OUString>(xPara, 
"ListLabelString"));
+        xPara = getParagraph(4);
+        CPPUNIT_ASSERT_EQUAL(OUString("Sect 2.01"),
+                             getProperty<OUString>(xPara, "ListLabelString"));
+    };
+
+    createSwDoc("listWithLgl.rtf");
+    verify();
+    saveAndReload(mpFilter);
+    verify();
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx 
b/sw/source/filter/ww8/rtfattributeoutput.cxx
index de7140f091bc..26203291d6e5 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -1625,7 +1625,7 @@ void RtfAttributeOutput::NumberingLevel(sal_uInt8 nLevel, 
sal_uInt16 nStart,
                                         const wwFont* pFont, const SfxItemSet* 
pOutSet,
                                         sal_Int16 nIndentAt, sal_Int16 
nFirstLineIndex,
                                         sal_Int16 /*nListTabPos*/, const 
OUString& rNumberingString,
-                                        const SvxBrushItem* pBrush, bool 
/*isLegal*/)
+                                        const SvxBrushItem* pBrush, bool 
isLegal)
 {
     m_rExport.Strm().WriteOString(SAL_NEWLINE_STRING);
     if (nLevel > 8) // RTF knows only 9 levels
@@ -1764,6 +1764,11 @@ void RtfAttributeOutput::NumberingLevel(sal_uInt8 
nLevel, sal_uInt16 nStart,
     m_rExport.Strm().WriteOString(OOO_STRING_SVTOOLS_RTF_LEVELSTARTAT);
     m_rExport.Strm().WriteNumberAsString(nStart);
 
+    if (isLegal)
+    {
+        m_rExport.Strm().WriteOString(OOO_STRING_SVTOOLS_RTF_LEVELLEGAL);
+    }
+
     m_rExport.Strm().WriteOString(OOO_STRING_SVTOOLS_RTF_LEVELFOLLOW);
     m_rExport.Strm().WriteNumberAsString(nFollow);
 
diff --git a/writerfilter/source/rtftok/rtfcontrolwords.cxx 
b/writerfilter/source/rtftok/rtfcontrolwords.cxx
index 3f5a0827bae4..8b035b37bbe2 100644
--- a/writerfilter/source/rtftok/rtfcontrolwords.cxx
+++ b/writerfilter/source/rtftok/rtfcontrolwords.cxx
@@ -715,7 +715,7 @@ RTFSymbol const aRTFControlWords[] = {
     { "levelindent", RTFControlType::VALUE, RTFKeyword::LEVELINDENT, 0 },
     { "leveljc", RTFControlType::VALUE, RTFKeyword::LEVELJC, 0 },
     { "leveljcn", RTFControlType::VALUE, RTFKeyword::LEVELJCN, 0 },
-    { "levellegal", RTFControlType::VALUE, RTFKeyword::LEVELLEGAL, 0 },
+    { "levellegal", RTFControlType::VALUE, RTFKeyword::LEVELLEGAL, 1 },
     { "levelnfc", RTFControlType::VALUE, RTFKeyword::LEVELNFC, 0 },
     { "levelnfcn", RTFControlType::VALUE, RTFKeyword::LEVELNFCN, 0 },
     { "levelnorestart", RTFControlType::VALUE, RTFKeyword::LEVELNORESTART, 0 },
diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx 
b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
index f699b0ed39d1..1e7552dd71b1 100644
--- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
@@ -135,6 +135,9 @@ bool RTFDocumentImpl::dispatchTableSprmValue(RTFKeyword 
nKeyword, int nParam)
             nSprm = NS_ooxml::LN_CT_Style_next;
             pIntValue = new RTFValue(getStyleName(nParam));
             break;
+        case RTFKeyword::LEVELLEGAL:
+            nSprm = NS_ooxml::LN_CT_Lvl_isLgl;
+            break;
         default:
             break;
     }

Reply via email to