From a3d3d8e0a994069986400c0e08701bf4f8a94ba0 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Thu, 29 Sep 2022 22:46:26 +0200 Subject: [PATCH] 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 --- 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(-) 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: */ -- 2.11.4.GIT