sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak.docx |binary sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak2.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport18.cxx | 17 ++ sw/qa/extras/rtfexport/data/n818997B.rtf | 77 ++++++++++ sw/qa/extras/rtfexport/rtfexport5.cxx | 6 writerfilter/source/dmapper/DomainMapper.cxx | 16 +- 6 files changed, 108 insertions(+), 8 deletions(-)
New commits: commit a9bc19c2d4a35606668aa2dcc53355651b71ee78 Author: Justin Luth <justin.l...@collabora.com> AuthorDate: Wed Feb 15 13:54:31 2023 -0500 Commit: Justin Luth <jl...@mail.com> CommitDate: Thu Feb 16 20:39:40 2023 +0000 tdf#153613 writerfilter: don't always split para for shape w/ pagebreak The problem was that an extra paragraph was added, and the shape was anchored to the wrong page. There are lots of places that handle deferred breaks, and they typically do this only for FirstParagraph or non-first character properties run. This is needed here too. make CppunitTest_sw_ooxmlexport18 CPPUNIT_TEST_NAME=testTdf153613_textboxAfterPgBreak make CppunitTest_sw_ooxmlexport18 CPPUNIT_TEST_NAME=testTdf153613_textboxAfterPgBreak2 Of course, RTF is goofy, so handle that as an exception to just leave it alone as it has been. To solve it properly is likely very tricky - as are all things RTF, because we can't trust IsFirstRun in general and especially not for RTF. make CppunitTest_sw_rtfexport5 CPPUNIT_TEST_NAME=testN818997B Change-Id: Iad06f3ea9684a2860ae6ba724887bdf0b5850f94 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147169 Tested-by: Jenkins Reviewed-by: Justin Luth <jl...@mail.com> diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak.docx new file mode 100644 index 000000000000..4ad4dfba8110 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak2.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak2.docx new file mode 100644 index 000000000000..26006abd2fe3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak2.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx index 81267209e7bc..7afaa31b1889 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx @@ -149,6 +149,23 @@ DECLARE_OOXMLEXPORT_TEST(testTdf153613_inlineAfterPgBreak, "tdf153613_inlineAfte assertXPath(pLayout, "//page[2]//anchored", 1); } +DECLARE_OOXMLEXPORT_TEST(testTdf153613_textboxAfterPgBreak, "tdf153613_textboxAfterPgBreak.docx") +{ + CPPUNIT_ASSERT_EQUAL(3, getParagraphs()); + + const auto& pLayout = parseLayoutDump(); + assertXPathContent(pLayout, "//page[2]/body/txt", "There should be no prior carriage return."); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_textboxAfterPgBreak2, "tdf153613_textboxAfterPgBreak2.docx") +{ + // same as previous example, except that it is the first paragraph in the section. + CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); + + const auto& pLayout = parseLayoutDump(); + assertXPathContent(pLayout, "//page[2]/body/txt", "There should be no prior carriage return."); +} + CPPUNIT_TEST_FIXTURE(Test, testTdf149551_mongolianVert) { // Given a docx document with a shape with vert="mongolianVert". diff --git a/sw/qa/extras/rtfexport/data/n818997B.rtf b/sw/qa/extras/rtfexport/data/n818997B.rtf new file mode 100644 index 000000000000..94c0324f42e8 --- /dev/null +++ b/sw/qa/extras/rtfexport/data/n818997B.rtf @@ -0,0 +1,77 @@ +{\rtf +{\par\par\shp +{\*\shpinst\shpleft2310\shpright6060\shptop8685\shpbottom8985\shpbxpage +\shpbypage\shpwr3\shpz2 +{\sp +{\sn shapeType} +{\sv 202} +} +{\sp +{\sn dxTextLeft} +{\sv +0} +} +{\sp +{\sn dxTextRight} +{\sv 0} +} +{\sp +{\sn dyTextTop} +{\sv 0} +} +{\sp +{\sn +dyTextBottom} +{\sv 0} +} +{\sp +{\sn fLine} +{\sv 0} +} +{\shptxt\plain\pard\f29\fs24 +On first page.\par} +{\sp +{\sn fFilled} +{\sv 0} +} +} +} +\page +{\shp +{\*\shpinst\shpleft4800\shpright8025\shptop780\shpbottom1080\shpbxpage +\shpbypage\shpwr3\shpz2 +{\sp +{\sn shapeType} +{\sv 202} +} +{\sp +{\sn dxTextLeft} +{\sv +0} +} +{\sp +{\sn dxTextRight} +{\sv 0} +} +{\sp +{\sn dyTextTop} +{\sv 0} +} +{\sp +{\sn +dyTextBottom} +{\sv 0} +} +{\sp +{\sn fLine} +{\sv 0} +} +{\shptxt\plain\pard\f29\fs24\b +On second page.\par} +{\sp +{\sn fFilled} +{\sv 0} +} +} +} +} diff --git a/sw/qa/extras/rtfexport/rtfexport5.cxx b/sw/qa/extras/rtfexport/rtfexport5.cxx index e49960930297..376608ba22b3 100644 --- a/sw/qa/extras/rtfexport/rtfexport5.cxx +++ b/sw/qa/extras/rtfexport/rtfexport5.cxx @@ -86,6 +86,12 @@ DECLARE_RTFEXPORT_TEST(testN818997, "n818997.rtf") CPPUNIT_ASSERT_EQUAL(2, getPages()); } +DECLARE_RTFEXPORT_TEST(testN818997B, "n818997B.rtf") +{ + // \page was ignored between two \shp tokens - this time not IsFirstParagraphInSection. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + DECLARE_RTFEXPORT_TEST(testTdf153613_anchoredAfterPgBreak, "tdf153613_anchoredAfterPgBreak.rtf") { // An anchored TO character image (followed by nothing) anchors before the page break, no split. diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index e32cc43f607a..ac271aa4effb 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -3563,14 +3563,14 @@ void DomainMapper::lcl_startShape(uno::Reference<drawing::XShape> const& xShape) // started shape will be on the correct page. if (m_pImpl->isBreakDeferred(PAGE_BREAK)) { - m_pImpl->clearDeferredBreak(PAGE_BREAK); - lcl_startCharacterGroup(); - sal_uInt8 const sBreak[] = { 0xd }; - lcl_text(sBreak, 1); - lcl_endCharacterGroup(); - lcl_endParagraphGroup(); - lcl_startParagraphGroup(); - m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE)); + // RTF doesn't properly report IsFirstRun, so in order to prevent regressions + // always split the paragraph for RTF since that is the way it has been done lately. + if (!m_pImpl->IsFirstRun() || IsRTFImport()) + { + m_pImpl->m_bIsSplitPara = true; + finishParagraph(); + lcl_startParagraphGroup(); + } } m_pImpl->PushShapeContext( xShape ); lcl_startParagraphGroup();