sw/qa/extras/layout/layout2.cxx            |   69 +++++++++++++++++------------
 sw/qa/extras/ooxmlexport/ooxmlexport16.cxx |    2 
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx   |    8 +--
 sw/source/core/text/porrst.cxx             |   31 +++++++++++++
 sw/source/core/text/porrst.hxx             |    2 
 5 files changed, 79 insertions(+), 33 deletions(-)

New commits:
commit a3d3d8e0a994069986400c0e08701bf4f8a94ba0
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Thu Sep 29 22:46:26 2022 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Sep 30 08:01:23 2022 +0200

    CppunitTest_sw_layoutwriter2: use more SwParaPortion::dumpAsXml()
    
    See commit feeed3e762cf077fbd9cf48f82e949365108ccc1
    (CppunitTest_sw_layoutwriter: avoid some a11y-based layout testing,
    2022-04-07) for motivation.
    
    Also add a SwBookmarkPortion::dumpAsXml() can that show the colors of
    a bookmark portion, instead of faking that into the layout text.
    
    Change-Id: Id4da6b27bf3d33d55bba281445084242306d1525
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140751
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx
index 4ba57e79f336..92ad57c742ff 100644
--- a/sw/qa/extras/layout/layout2.cxx
+++ b/sw/qa/extras/layout/layout2.cxx
@@ -408,14 +408,21 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150717)
     createSwDoc(DATA_DIRECTORY, "tdf150717.odt");
     xmlDocUniquePtr pXmlDoc = parseLayoutDump();
     // check bookmark colors defined in metadata
-    assertXPath(pXmlDoc, "/root/page/body/txt/Special[1]", "rText", 
"#Bookmark1 Bookmark Start");
-    assertXPath(pXmlDoc, "/root/page/body/txt/Special[2]", "rText", 
"#Bookmark2 Bookmark Start");
-    assertXPath(pXmlDoc, "/root/page/body/txt/Special[3]", "rText",
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[2]", "colors",
+                "#Bookmark1 Bookmark Start");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[4]", "colors",
+                "#Bookmark2 Bookmark Start");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[6]", "colors",
                 "#Bookmark2 Bookmark End#Bookmark1 Bookmark End");
     // full text, if bookmarks are visible
-    assertXPath(pXmlDoc, "/root/page/body/txt/LineBreak", "Line",
-                "Lorem #Bookmark1 Bookmark Startipsum dolor et #Bookmark2 
Bookmark Start"
-                "ames#Bookmark2 Bookmark End#Bookmark1 Bookmark End.");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[1]", "portion",
+                "Lorem ");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[3]", "portion",
+                "ipsum dolor et ");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[5]", "portion",
+                "ames");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[7]", "portion",
+                ".");
 }
 
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150790)
@@ -423,15 +430,17 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150790)
     createSwDoc(DATA_DIRECTORY, "tdf150790.fodt");
     xmlDocUniquePtr pXmlDoc = parseLayoutDump();
     // point bookmark is shown as I-beam (only its text dump is |, as before 
on the screen)
-    assertXPath(pXmlDoc, "/root/page/body/txt[1]/Special", "rText", "#Bookmark 
1 Bookmark");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt[1]/SwParaPortion/SwLineLayout/SwBookmarkPortion",
+                "colors", "#Bookmark 1 Bookmark");
     // single start bookmark
-    assertXPath(pXmlDoc, "/root/page/body/txt[2]/Special[1]", "rText",
-                "#Bookmark 2 Bookmark Start");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[1]",
+                "colors", "#Bookmark 2 Bookmark Start");
     // single end bookmark
-    assertXPath(pXmlDoc, "/root/page/body/txt[2]/Special[3]", "rText", 
"#Bookmark 3 Bookmark End");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[3]",
+                "colors", "#Bookmark 3 Bookmark End");
     // This was |, as before the point bookmark (neighboring end and start 
bookmarks)
-    assertXPath(pXmlDoc, "/root/page/body/txt[2]/Special[2]", "rText",
-                "#Bookmark 2 Bookmark End#Bookmark 3 Bookmark Start");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[2]",
+                "colors", "#Bookmark 2 Bookmark End#Bookmark 3 Bookmark 
Start");
 }
 
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumberInNumbering)
@@ -1999,19 +2008,20 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150200)
     createSwDoc(DATA_DIRECTORY, "tdf150200.odt");
     xmlDocUniquePtr pXmlDoc = parseLayoutDump();
     // dash
-    OUString sFirstLine = 
parseDump("/root/page/body/txt[1]/LineBreak[1]/@Line");
+    OUString sFirstLine
+        = 
parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"-(dash)"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(93), sFirstLine.getLength());
     // en-dash
-    sFirstLine = parseDump("/root/page/body/txt[2]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"–(en-dash)"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(88), sFirstLine.getLength());
     // em-dash
-    sFirstLine = parseDump("/root/page/body/txt[3]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"—(em-dash)"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(77), sFirstLine.getLength());
     // figure dash
-    sFirstLine = parseDump("/root/page/body/txt[4]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[4]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"‒(figure dash)"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(87), sFirstLine.getLength());
 }
@@ -2021,19 +2031,20 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, 
testTdf150200_DOCX)
     createSwDoc(DATA_DIRECTORY, "tdf150200.docx");
     xmlDocUniquePtr pXmlDoc = parseLayoutDump();
     // dash
-    OUString sFirstLine = 
parseDump("/root/page/body/txt[1]/LineBreak[1]/@Line");
+    OUString sFirstLine
+        = 
parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"-(dash)"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(93), sFirstLine.getLength());
     // en-dash
-    sFirstLine = parseDump("/root/page/body/txt[2]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"–(en-dash)"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(88), sFirstLine.getLength());
     // em-dash
-    sFirstLine = parseDump("/root/page/body/txt[3]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"—(em-dash)"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(77), sFirstLine.getLength());
     // figure dash
-    sFirstLine = parseDump("/root/page/body/txt[4]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[4]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"‒(figure dash)"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(87), sFirstLine.getLength());
 }
@@ -2043,19 +2054,20 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150438)
     createSwDoc(DATA_DIRECTORY, "tdf150438.odt");
     xmlDocUniquePtr pXmlDoc = parseLayoutDump();
     // left double quotation mark
-    OUString sFirstLine = 
parseDump("/root/page/body/txt[1]/LineBreak[1]/@Line");
+    OUString sFirstLine
+        = 
parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"“Lorem ipsum"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(92), sFirstLine.getLength());
     // right double quotation mark
-    sFirstLine = parseDump("/root/page/body/txt[2]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"”Nunc viverra imperdiet 
enim."));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(97), sFirstLine.getLength());
     // left single quotation mark
-    sFirstLine = parseDump("/root/page/body/txt[3]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"‘Aenean nec lorem."));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(85), sFirstLine.getLength());
     // right single quotation mark or apostrophe
-    sFirstLine = parseDump("/root/page/body/txt[4]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[4]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"’Aenean nec lorem."));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(85), sFirstLine.getLength());
 }
@@ -2065,19 +2077,20 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, 
testTdf150438_DOCX)
     createSwDoc(DATA_DIRECTORY, "tdf150438.docx");
     xmlDocUniquePtr pXmlDoc = parseLayoutDump();
     // left double quotation mark
-    OUString sFirstLine = 
parseDump("/root/page/body/txt[1]/LineBreak[1]/@Line");
+    OUString sFirstLine
+        = 
parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"“Lorem ipsum"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(92), sFirstLine.getLength());
     // right double quotation mark
-    sFirstLine = parseDump("/root/page/body/txt[2]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"”Nunc viverra imperdiet 
enim."));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(97), sFirstLine.getLength());
     // left single quotation mark
-    sFirstLine = parseDump("/root/page/body/txt[3]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"‘Aenean nec lorem."));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(85), sFirstLine.getLength());
     // right single quotation mark or apostrophe
-    sFirstLine = parseDump("/root/page/body/txt[4]/LineBreak[1]/@Line");
+    sFirstLine = 
parseDump("/root/page/body/txt[4]/SwParaPortion/SwLineLayout[1]/@portion");
     CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"’Aenean nec lorem."));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(85), sFirstLine.getLength());
 }
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
index 60f4e801ba0a..3ae35e8fac4a 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
@@ -624,7 +624,7 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf142404_tabOverSpacingC15)
     nLineWidth = 
parseDump("//page[2]/body/txt[6]/SwParaPortion/SwLineLayout[4]", 
"width").toInt32();
     CPPUNIT_ASSERT_EQUAL_MESSAGE("Full paragraph area used", nLineWidth, 
nParaWidth);
 
-    CPPUNIT_ASSERT_EQUAL(OUString("TabOverflow does what?"), 
parseDump("//page[3]/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwLinePortion[2]",
 "portion"));
+    CPPUNIT_ASSERT_EQUAL(OUString("TabOverflow does what?"), 
parseDump("//page[3]/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwLinePortion[1]",
 "portion"));
     // Not 1 line high (Word 2010 DOCX and ODT), or 4 lines high (prev LO 
DOCX),
     // but 8 lines high.
     nHeight = parseDump("//page[3]/body/txt[2]/infos/bounds", 
"height").toInt32();
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx 
b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index d10b5287756a..995d7bc2e4f0 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -413,10 +413,10 @@ CPPUNIT_TEST_FIXTURE(Test, testN758883)
     pXmlDoc = parseLayoutDump();
 
     // check the bookmark portions are of the expected height
-    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/SwLinePortion[1]", "type", 
"PortionType::Bookmark");
-    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/SwLinePortion[1]", "height", 
"253");
-    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/SwLinePortion[3]", "type", 
"PortionType::Bookmark");
-    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/SwLinePortion[3]", "height", 
"253");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/SwBookmarkPortion[1]", "type", 
"PortionType::Bookmark");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/SwBookmarkPortion[1]", 
"height", "253");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/SwBookmarkPortion[2]", "type", 
"PortionType::Bookmark");
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout/SwBookmarkPortion[2]", 
"height", "253");
 
     // tdf#150947 check a11y of the newly inserted bookmark portions
     assertXPath(pXmlDoc, "/root/page/body/txt/Special[2]", "rText", 
"#BookmarkTest Bookmark Start");
diff --git a/sw/source/core/text/porrst.cxx b/sw/source/core/text/porrst.cxx
index 69d4725c23b8..e5367ab42116 100644
--- a/sw/source/core/text/porrst.cxx
+++ b/sw/source/core/text/porrst.cxx
@@ -856,6 +856,37 @@ void SwBookmarkPortion::HandlePortion( SwPortionHandler& 
rPH ) const
     rPH.Special( GetLen(), aStr.makeStringAndClear(), GetWhichPor(), Height(), 
Width() );
 }
 
+void SwBookmarkPortion::dumpAsXml(xmlTextWriterPtr pWriter, const OUString& 
rText, TextFrameIndex& nOffset) const
+{
+    (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwBookmarkPortion"));
+    dumpAsXmlAttributes(pWriter, rText, nOffset);
+    nOffset += GetLen();
+
+    if (!m_oColors.empty())
+    {
+        OUStringBuffer aStr;
+        for (const auto& rColor : m_oColors)
+        {
+            aStr.append("#" + std::get<2>(rColor) + " " + 
SwResId(STR_BOOKMARK_DEF_NAME));
+            switch (std::get<0>(rColor))
+            {
+                case SwScriptInfo::MarkKind::Point:
+                    break;
+                case SwScriptInfo::MarkKind::Start:
+                    aStr.append(" " + SwResId(STR_CAPTION_BEGINNING));
+                    break;
+                case SwScriptInfo::MarkKind::End:
+                    aStr.append(" " + SwResId(STR_CAPTION_END));
+                    break;
+            }
+        }
+        (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("colors"),
+                                          
BAD_CAST(aStr.makeStringAndClear().toUtf8().getStr()));
+    }
+
+    (void)xmlTextWriterEndElement(pWriter);
+}
+
 bool SwControlCharPortion::Format( SwTextFormatInfo &rInf )
 {
     const SwLinePortion* pRoot = rInf.GetRoot();
diff --git a/sw/source/core/text/porrst.hxx b/sw/source/core/text/porrst.hxx
index 541586e39bcb..5f6f3fca370a 100644
--- a/sw/source/core/text/porrst.hxx
+++ b/sw/source/core/text/porrst.hxx
@@ -215,6 +215,8 @@ public:
     virtual void Paint( const SwTextPaintInfo &rInf ) const override;
     virtual SwLinePortion * Compress() override { return this; }
     virtual void HandlePortion(SwPortionHandler& rPH) const override;
+    void dumpAsXml(xmlTextWriterPtr pWriter, const OUString& rText,
+                   TextFrameIndex& rOffset) const override;
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to