From 542124aa95c8ce13559de0b54ff61daae01899f7 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 25 Jul 2018 02:23:02 +0200 Subject: [PATCH] Fix page-break-inside:avoid to work for nested tags too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The initial version was too naïve and didn't work correctly if the
with this style had nested elements. --- samples/html/printing/test.htm | 11 +++++ src/html/m_layout.cpp | 27 +++++++++++- tests/html/htmprint.cpp | 80 +++++++++++++++++----------------- 3 files changed, 76 insertions(+), 42 deletions(-) diff --git a/samples/html/printing/test.htm b/samples/html/printing/test.htm index 3bb5be3a20..c0518a8d00 100644 --- a/samples/html/printing/test.htm +++ b/samples/html/printing/test.htm @@ -55,6 +55,8 @@ is split into base and GUI libraries.

+ +

Release 2.1.11 (final)

    @@ -71,18 +73,22 @@ combined base/GUI library for GUI applications only.
  • Rewritten timer.cpp, possible wxChrono class.
  • Bug tracking system in place.
+

+

Release 2.1.12

  • Release date: January 9th, 2000
  • Miscellaneous fixes and small enhancements.
+

+

Release 2.1.13

    @@ -90,6 +96,7 @@ combined base/GUI library for GUI applications only.
  • Miscellaneous fixes and small enhancements.
  • wxDateTime class in beta.
+

@@ -102,6 +109,7 @@ combined base/GUI library for GUI applications only.

+

Release 2.2.x (final)

    @@ -109,15 +117,18 @@ combined base/GUI library for GUI applications only.
  • Unicode compilation working in wxGTK and wxMSW.
  • wxDateTime class.
+

+

Release 2.3.x (final)

  • Release date: unknown
  • WinCE port available.
+

diff --git a/src/html/m_layout.cpp b/src/html/m_layout.cpp index e8f849b86f..5556c34396 100644 --- a/src/html/m_layout.cpp +++ b/src/html/m_layout.cpp @@ -189,9 +189,32 @@ TAG_HANDLER_BEGIN(DIV, "DIV") } else if(style.IsSameAs(wxT("PAGE-BREAK-INSIDE:AVOID"), false)) { + // As usual, reuse the current container if it's empty. + wxHtmlContainerCell *c = m_WParser->GetContainer(); + if (c->GetFirstChild() != NULL) + { + // If not, open a new one. + m_WParser->CloseContainer(); + c = m_WParser->OpenContainer(); + } + + // Force this container to live entirely on the same page. + c->SetCanLiveOnPagebreak(false); + + // Use a nested container so that nested tags that close and + // reopen a container again close this one, but still remain + // inside the outer "unbreakable" container. + m_WParser->OpenContainer(); + + ParseInner(tag); + + // Close both the inner and the outer containers and reopen the + // new current one. m_WParser->CloseContainer(); - m_WParser->OpenContainer()->SetCanLiveOnPagebreak(false); - return false; + m_WParser->CloseContainer(); + m_WParser->OpenContainer(); + + return true; } else { diff --git a/tests/html/htmprint.cpp b/tests/html/htmprint.cpp index 11dcc10c7a..72c33c6980 100644 --- a/tests/html/htmprint.cpp +++ b/tests/html/htmprint.cpp @@ -121,52 +121,52 @@ TEST_CASE("wxHtmlPrintout::Pagination", "[html][print]") // should move it entirely to the next page, resulting in one extra page // compared to the version without "page-break-inside: avoid". static const char* const text = -"Early in the morning on the fourteenth of the spring month of Nisan the " -"Procurator of Judea, Pontius Pilate, in a white cloak lined with blood red, " -"emerged with his shuffling cavalryman's walk into the arcade connecting the two " -"wings of the palace of Herod the Great. " -"\n" -"More than anything else in the world the Procurator hated the smell of attar of " -"roses. The omens for the day were bad, as this scent had been haunting him " -"since dawn. " -"\n" -"It seemed to the Procurator that the very cypresses and palms in the garden " -"were exuding the smell of roses, that this damned stench of roses was even " -"mingling with the smell of leather tackle and sweat from his mounted bodyguard. " -"\n" -"A haze of smoke was drifting toward the arcade across the upper courtyard of " -"the garden, coming from the wing at the rear of the palace, the quarters of the " -"first cohort of the XII Legion; known as the \"Lightning,\" it had been " -"stationed in Jerusalem since the Procurator's arrival. The same oily perfume " -"of roses was mixed with the acrid smoke that showed that the centuries' cooks " -"had started to prepare breakfast " -"\n" -"\"Oh, gods, what are you punishing me for?.. No, there's no doubt, I have it " -"again, this terrible incurable pain... hemicrania, when half the head aches... " -"There's no cure for it, nothing helps... I must try not to move my head...\" " -"\n" -"A chair had already been placed on the mosaic floor by the fountain; without a " -"glance around, the Procurator sat in it and stretched out his hand to one side. " -"His secretary deferentially laid a piece of parchment in his hand. Unable to " -"restrain a grimace of agony, the Procurator gave a fleeting sideways look at " -"its contents, returned the parchment to his secretary and said painfully, \"The " -"accused comes from Galilee, does he? Was the case sent to the tetrarch?\" " -"\n" -"\"Yes, Procurator,\" replied the secretary. \"He declined to confirm the " -"finding of the court and passed the Sanhedrin's sentence of death to you for " -"confirmation.\" " -"\n" -"The Procurator's cheek twitched, and he said quietly, \"Bring in the accused.\" " +"Early in the morning on the fourteenth of the spring month of Nisan the
" +"Procurator of Judea, Pontius Pilate, in a white cloak lined with blood red,
" +"emerged with his shuffling cavalryman's walk into the arcade connecting the two
" +"wings of the palace of Herod the Great.
" +"
" +"More than anything else in the world the Procurator hated the smell of attar of
" +"roses. The omens for the day were bad, as this scent had been haunting him
" +"since dawn.
" +"
" +"It seemed to the Procurator that the very cypresses and palms in the garden
" +"were exuding the smell of roses, that this damned stench of roses was even
" +"mingling with the smell of leather tackle and sweat from his mounted bodyguard.
" +"
" +"A haze of smoke was drifting toward the arcade across the upper courtyard of
" +"the garden, coming from the wing at the rear of the palace, the quarters of the
" +"first cohort of the XII Legion; known as the \"Lightning,\" it had been
" +"stationed in Jerusalem since the Procurator's arrival. The same oily perfume
" +"of roses was mixed with the acrid smoke that showed that the centuries' cooks
" +"had started to prepare breakfast
" +"
" +"\"Oh, gods, what are you punishing me for?.. No, there's no doubt, I have it
" +"again, this terrible incurable pain... hemicrania, when half the head aches...
" +"There's no cure for it, nothing helps... I must try not to move my head...\"
" +"
" +"A chair had already been placed on the mosaic floor by the fountain; without a
" +"glance around, the Procurator sat in it and stretched out his hand to one side.
" +"His secretary deferentially laid a piece of parchment in his hand. Unable to
" +"restrain a grimace of agony, the Procurator gave a fleeting sideways look at
" +"its contents, returned the parchment to his secretary and said painfully, \"The
" +"accused comes from Galilee, does he? Was the case sent to the tetrarch?\"
" +"
" +"\"Yes, Procurator,\" replied the secretary. \"He declined to confirm the
" +"finding of the court and passed the Sanhedrin's sentence of death to you for
" +"confirmation.\"
" +"
" +"The Procurator's cheek twitched, and he said quietly, \"Bring in the accused.\"
" ; pr.SetHtmlText ( wxString::Format ( - "" + "" "

%s
" "
" - "", + "", text ) ); @@ -176,10 +176,10 @@ TEST_CASE("wxHtmlPrintout::Pagination", "[html][print]") ( wxString::Format ( - "" + "" "
%s
" "
" - "", + "", text ) );