summaryrefslogtreecommitdiff
path: root/external/libepubgen/0003-Ensure-page-properties-in-the-page-span-works.patch.1
diff options
context:
space:
mode:
Diffstat (limited to 'external/libepubgen/0003-Ensure-page-properties-in-the-page-span-works.patch.1')
-rw-r--r--external/libepubgen/0003-Ensure-page-properties-in-the-page-span-works.patch.1225
1 files changed, 225 insertions, 0 deletions
diff --git a/external/libepubgen/0003-Ensure-page-properties-in-the-page-span-works.patch.1 b/external/libepubgen/0003-Ensure-page-properties-in-the-page-span-works.patch.1
new file mode 100644
index 000000000000..62dd2cbab5dd
--- /dev/null
+++ b/external/libepubgen/0003-Ensure-page-properties-in-the-page-span-works.patch.1
@@ -0,0 +1,225 @@
+From 715786e10deaa6849a6e46b5a9884edde44e194b Mon Sep 17 00:00:00 2001
+From: Mark Hung <marklh9@gmail.com>
+Date: Sun, 25 Mar 2018 10:27:07 +0800
+Subject: [PATCH 3/3] Ensure page properties in the page span works.
+
+As the page properties are converted to CSS styles of the
+body element, this patch force it to start a new HTML file
+when openPageSpan is invoked to open the second page span.
+
+This ensures that page properties in every page span works,
+even there are multiple page spans between intentional HTML
+page splits such as on size, on headings, or on page breaks.
+---
+ src/lib/EPUBGenerator.cpp | 4 +++-
+ src/lib/EPUBSplitGuard.cpp | 19 ++++++++++++++++++-
+ src/lib/EPUBSplitGuard.h | 7 ++++++-
+ src/lib/EPUBTextGenerator.cpp | 5 +++++
+ src/test/EPUBTextGeneratorTest.cpp | 38 ++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 70 insertions(+), 3 deletions(-)
+
+diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
+index 110667f..9e0c972 100644
+--- a/src/lib/EPUBGenerator.cpp
++++ b/src/lib/EPUBGenerator.cpp
+@@ -44,7 +44,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, int version)
+ , m_documentProps()
+ , m_metadata()
+ , m_currentHtml()
+- , m_splitGuard(EPUB_SPLIT_METHOD_PAGE_BREAK)
++ , m_splitGuard(EPUB_SPLIT_METHOD_PAGE_BREAK,true)
+ , m_version(version)
+ , m_stylesMethod(EPUB_STYLES_METHOD_CSS)
+ , m_layoutMethod(EPUB_LAYOUT_METHOD_REFLOWABLE)
+@@ -173,6 +173,8 @@ void EPUBGenerator::setLayoutMethod(EPUBLayoutMethod layout)
+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED)
+ // Fixed layout implies split on page break.
+ m_splitGuard.setSplitMethod(EPUB_SPLIT_METHOD_PAGE_BREAK);
++
++ m_splitGuard.setSplitOnSecondPageSpan(m_layoutMethod == EPUB_LAYOUT_METHOD_REFLOWABLE);
+ }
+
+ void EPUBGenerator::writeContainer()
+diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
+index 4f7531d..5bee515 100644
+--- a/src/lib/EPUBSplitGuard.cpp
++++ b/src/lib/EPUBSplitGuard.cpp
+@@ -15,8 +15,10 @@ namespace libepubgen
+ static const unsigned DEFAULT_SPLIT_HEADING_LEVEL = 1;
+ static const unsigned DEFAULT_SPLIT_SIZE = 1 << 16;
+
+-EPUBSplitGuard::EPUBSplitGuard(const EPUBSplitMethod method)
++EPUBSplitGuard::EPUBSplitGuard(const EPUBSplitMethod method,bool splitOnSecondPageSpan)
+ : m_method(method)
++ , m_splitOnSecondPageSpan(splitOnSecondPageSpan)
++ , m_htmlEverInPageSpan(false)
+ , m_headingLevel(DEFAULT_SPLIT_HEADING_LEVEL)
+ , m_currentHeadingLevel(0)
+ , m_size(DEFAULT_SPLIT_SIZE)
+@@ -25,6 +27,11 @@ EPUBSplitGuard::EPUBSplitGuard(const EPUBSplitMethod method)
+ {
+ }
+
++void EPUBSplitGuard::setHtmlEverInPageSpan(bool value)
++{
++ m_htmlEverInPageSpan = value;
++}
++
+ void EPUBSplitGuard::setSplitHeadingLevel(const unsigned level)
+ {
+ m_headingLevel = level;
+@@ -45,6 +52,11 @@ void EPUBSplitGuard::setSplitMethod(EPUBSplitMethod method)
+ m_method = method;
+ }
+
++void EPUBSplitGuard::setSplitOnSecondPageSpan(bool value)
++{
++ m_splitOnSecondPageSpan = value;
++}
++
+ void EPUBSplitGuard::openLevel()
+ {
+ ++m_nestingLevel;
+@@ -70,6 +82,11 @@ bool EPUBSplitGuard::splitOnHeading(const unsigned level) const
+ return canSplit(EPUB_SPLIT_METHOD_HEADING) && (m_headingLevel >= level);
+ }
+
++bool EPUBSplitGuard::splitOnSecondPageSpan() const
++{
++ return m_splitOnSecondPageSpan && m_htmlEverInPageSpan;
++}
++
+ bool EPUBSplitGuard::inHeading(bool any) const
+ {
+ if (!m_currentHeadingLevel)
+diff --git a/src/lib/EPUBSplitGuard.h b/src/lib/EPUBSplitGuard.h
+index ff55846..a55bad3 100644
+--- a/src/lib/EPUBSplitGuard.h
++++ b/src/lib/EPUBSplitGuard.h
+@@ -18,13 +18,15 @@ namespace libepubgen
+ class EPUBSplitGuard
+ {
+ public:
+- explicit EPUBSplitGuard(EPUBSplitMethod method);
++ explicit EPUBSplitGuard(EPUBSplitMethod method,bool splitOnSecondPageSpan);
+
+ void setSplitHeadingLevel(unsigned level);
+ void setCurrentHeadingLevel(unsigned level);
+ void setSplitSize(unsigned size);
++ void setHtmlEverInPageSpan(bool value);
+ /// Allows overwriting the value given in the constructor.
+ void setSplitMethod(EPUBSplitMethod method);
++ void setSplitOnSecondPageSpan(bool value);
+
+ void openLevel();
+ void closeLevel();
+@@ -32,6 +34,7 @@ public:
+
+ bool splitOnPageBreak() const;
+ bool splitOnHeading(unsigned level) const;
++ bool splitOnSecondPageSpan() const;
+ bool inHeading(bool any) const;
+ bool splitOnSize() const;
+
+@@ -42,6 +45,8 @@ private:
+
+ private:
+ EPUBSplitMethod m_method;
++ bool m_splitOnSecondPageSpan;
++ bool m_htmlEverInPageSpan;
+ unsigned m_headingLevel;
+ unsigned m_currentHeadingLevel;
+ unsigned m_size;
+diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
+index 8e88adb..db9d360 100644
+--- a/src/lib/EPUBTextGenerator.cpp
++++ b/src/lib/EPUBTextGenerator.cpp
+@@ -110,6 +110,7 @@ void EPUBTextGenerator::Impl::startHtmlFile()
+
+ void EPUBTextGenerator::Impl::endHtmlFile()
+ {
++ getSplitGuard().setHtmlEverInPageSpan(false);
+ if (m_inPageSpan)
+ getHtml()->openPageSpan(m_pageSpanProps);
+ if (bool(m_currentHeader))
+@@ -206,10 +207,14 @@ void EPUBTextGenerator::openPageSpan(const librevenge::RVNGPropertyList &propLis
+ {
+ assert(!m_impl->m_inPageSpan);
+
++ if (m_impl->getSplitGuard().splitOnSecondPageSpan())
++ m_impl->startNewHtmlFile();
++
+ m_impl->m_inPageSpan = true;
+ m_impl->m_pageSpanProps = propList;
+
+ m_impl->getHtml()->openPageSpan(propList);
++ m_impl->getSplitGuard().setHtmlEverInPageSpan(true);
+ }
+
+ void EPUBTextGenerator::closePageSpan()
+diff --git a/src/test/EPUBTextGeneratorTest.cpp b/src/test/EPUBTextGeneratorTest.cpp
+index 0946408..b5e43a5 100644
+--- a/src/test/EPUBTextGeneratorTest.cpp
++++ b/src/test/EPUBTextGeneratorTest.cpp
+@@ -239,6 +239,7 @@ private:
+ CPPUNIT_TEST(testSplitOnPageBreakInPageSpan);
+ CPPUNIT_TEST(testSplitOnHeadingInPageSpan);
+ CPPUNIT_TEST(testSplitOnSizeInPageSpan);
++ CPPUNIT_TEST(testManyWritingModes);
+ CPPUNIT_TEST_SUITE_END();
+
+ private:
+@@ -282,6 +283,7 @@ private:
+ void testSplitOnPageBreakInPageSpan();
+ void testSplitOnHeadingInPageSpan();
+ void testSplitOnSizeInPageSpan();
++ void testManyWritingModes();
+
+ /// Asserts that exactly one xpath exists in buffer, and its content equals content.
+ void assertXPathContent(xmlBufferPtr buffer, const std::string &xpath, const std::string &content);
+@@ -1467,6 +1469,42 @@ void EPUBTextGeneratorTest::testSplitOnSizeInPageSpan()
+ assertXPath(package.m_streams["OEBPS/sections/section0002.xhtml"], "//xhtml:body", "class", "body0");
+ }
+
++void EPUBTextGeneratorTest::testManyWritingModes()
++{
++ StringEPUBPackage package;
++ libepubgen::EPUBTextGenerator generator(&package);
++ generator.setOption(libepubgen::EPUB_GENERATOR_OPTION_SPLIT, libepubgen::EPUB_SPLIT_METHOD_PAGE_BREAK);
++ generator.startDocument(librevenge::RVNGPropertyList());
++
++ {
++ librevenge::RVNGPropertyList page;
++ page.insert("style:writing-mode", "tb");
++ generator.openPageSpan(page);
++
++ librevenge::RVNGPropertyList para;
++ generator.openParagraph(para);
++ generator.insertText("Para1");
++ generator.closeParagraph();
++ generator.closePageSpan();
++ }
++ {
++ librevenge::RVNGPropertyList page;
++ page.insert("style:writing-mode", "lr");
++ generator.openPageSpan(page);
++
++ librevenge::RVNGPropertyList para;
++ generator.openParagraph(para);
++ generator.insertText("Para1");
++ generator.closeParagraph();
++ generator.closePageSpan();
++ }
++ generator.endDocument();
++ assertCss(package.m_cssStreams["OEBPS/styles/stylesheet.css"], ".body0", "writing-mode: vertical-rl", true);
++ assertCss(package.m_cssStreams["OEBPS/styles/stylesheet.css"], ".body1", "writing-mode: horizontal-tb", true);
++ assertXPath(package.m_streams["OEBPS/sections/section0001.xhtml"], "//xhtml:body", "class", "body0");
++ assertXPath(package.m_streams["OEBPS/sections/section0002.xhtml"], "//xhtml:body", "class", "body1");
++}
++
+ CPPUNIT_TEST_SUITE_REGISTRATION(EPUBTextGeneratorTest);
+
+ }
+--
+2.14.1
+