[Libreoffice-commits] core.git: config_host/config_libepubgen.h.in configure.ac download.lst external/libepubgen RepositoryExternal.mk writerperfect/Module_writerperfect.mk writerperfect/source

Miklos Vajna vmiklos at collabora.co.uk
Thu Dec 14 08:12:41 UTC 2017


 RepositoryExternal.mk                              |    2 
 config_host/config_libepubgen.h.in                 |   16 
 configure.ac                                       |   22 
 download.lst                                       |    4 
 external/libepubgen/UnpackedTarball_libepubgen.mk  |   11 
 external/libepubgen/libepubgen-epub3.patch.1       | 6419 ---------------------
 external/libepubgen/libepubgen-validation1.patch.1 |   49 
 external/libepubgen/libepubgen-validation2.patch.1 |   34 
 external/libepubgen/libepubgen-validation3.patch.1 |   35 
 external/libepubgen/libepubgen-vc.patch.1          |   59 
 writerperfect/Module_writerperfect.mk              |    2 
 writerperfect/source/writer/EPUBExportDialog.cxx   |    2 
 writerperfect/source/writer/EPUBExportFilter.cxx   |   16 
 13 files changed, 6 insertions(+), 6665 deletions(-)

New commits:
commit b2b1debf06589bd91e437df47a2904574aaae316
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Dec 13 10:54:27 2017 +0100

    external: upload libepubgen-0.1.0
    
    The only change is that version support is now available
    unconditionally, otherwise most code changes were bundled already in the
    form of patches.
    
    Change-Id: I0e456d85c9d84002cabcd77b31b02c9a7ad16ac5
    Reviewed-on: https://gerrit.libreoffice.org/46386
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk
index b0f0c17068ff..c72d12b678d9 100644
--- a/RepositoryExternal.mk
+++ b/RepositoryExternal.mk
@@ -1819,7 +1819,7 @@ $(call gb_LinkTarget_set_include,$(1),\
 	$$(INCLUDE) \
 )
 $(call gb_LinkTarget_add_libs,$(1),\
-	$(call gb_UnpackedTarball_get_dir,libepubgen)/src/lib/.libs/libepubgen-0.0$(gb_StaticLibrary_PLAINEXT) \
+	$(call gb_UnpackedTarball_get_dir,libepubgen)/src/lib/.libs/libepubgen-0.1$(gb_StaticLibrary_PLAINEXT) \
 )
 $(call gb_LinkTarget_use_external_project,$(1),libepubgen)
 
diff --git a/config_host/config_libepubgen.h.in b/config_host/config_libepubgen.h.in
deleted file mode 100644
index 884541617f44..000000000000
--- a/config_host/config_libepubgen.h.in
+++ /dev/null
@@ -1,16 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-/* Configuration for libepubgen.
- */
-
-// Defined if libepubgen supports setting EPUB version (devel. only)
-#define LIBEPUBGEN_VERSION_SUPPORT 0
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/configure.ac b/configure.ac
index e10df21a70ed..20e1fb48e45b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7746,26 +7746,7 @@ libo_CHECK_SYSTEM_MODULE([librevenge],[REVENGE],[librevenge-0.0 >= 0.0.1],["-I${
 
 libo_CHECK_SYSTEM_MODULE([libodfgen],[ODFGEN],[libodfgen-0.1])
 
-libo_CHECK_SYSTEM_MODULE([libepubgen],[EPUBGEN],[libepubgen-0.0])
-AS_IF([test "$SYSTEM_EPUBGEN" = "TRUE"], [
-    AC_MSG_CHECKING([whether libepubgen supports setting EPUB version])
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
-            #include <libepubgen/libepubgen.h>
-        ], [
-            libepubgen::EPUBTextGenerator generator(nullptr);
-            generator.setOption(libepubgen::EPUB_GENERATOR_OPTION_SPLIT, libepubgen::EPUB_SPLIT_METHOD_NONE);
-        ])],
-        [
-            AC_MSG_RESULT([yes])
-            AC_DEFINE([LIBEPUBGEN_VERSION_SUPPORT])
-        ],
-        [
-            AC_MSG_RESULT([no])
-        ]
-    )
-], [
-    AC_DEFINE([LIBEPUBGEN_VERSION_SUPPORT])
-])
+libo_CHECK_SYSTEM_MODULE([libepubgen],[EPUBGEN],[libepubgen-0.1])
 
 AS_IF([test "$COM" = "MSC"],
       [libwpd_libdir="${WORKDIR}/LinkTarget/Library"],
@@ -12532,7 +12513,6 @@ AC_CONFIG_HEADERS([config_host/config_gpgme.h])
 AC_CONFIG_HEADERS([config_host/config_java.h])
 AC_CONFIG_HEADERS([config_host/config_lgpl.h])
 AC_CONFIG_HEADERS([config_host/config_libcxx.h])
-AC_CONFIG_HEADERS([config_host/config_libepubgen.h])
 AC_CONFIG_HEADERS([config_host/config_liblangtag.h])
 AC_CONFIG_HEADERS([config_host/config_locales.h])
 AC_CONFIG_HEADERS([config_host/config_mpl.h])
diff --git a/download.lst b/download.lst
index 0faaa5312987..32e9ae786d4d 100644
--- a/download.lst
+++ b/download.lst
@@ -37,8 +37,8 @@ export EPOXY_SHA256SUM := 1d8668b0a259c709899e1c4bab62d756d9002d546ce4f59c9665e2
 export EPOXY_TARBALL := libepoxy-1.3.1.tar.bz2
 export EPM_SHA256SUM := b3fc4c5445de6c9a801504a3ea3efb2d4ea9d5a622c9427e716736e7713ddb91
 export EPM_TARBALL := 3ade8cfe7e59ca8e65052644fed9fca4-epm-3.7.tar.gz
-export EPUBGEN_SHA256SUM := eea910b042526ed52f7ab9292b7fa31fca32f9e042285818074ff33664db4fa2
-export EPUBGEN_TARBALL := libepubgen-0.0.1.tar.bz2
+export EPUBGEN_SHA256SUM := 730bd1cbeee166334faadbc06c953a67b145c3c4754a3b503482066dae4cd633
+export EPUBGEN_TARBALL := libepubgen-0.1.0.tar.bz2
 export ETONYEK_SHA256SUM := 69dbe10d4426d52f09060d489f8eb90dfa1df592e82eb0698d9dbaf38cc734ac
 export ETONYEK_VERSION_MICRO := 7
 export ETONYEK_TARBALL := libetonyek-0.1.$(ETONYEK_VERSION_MICRO).tar.xz
diff --git a/external/libepubgen/UnpackedTarball_libepubgen.mk b/external/libepubgen/UnpackedTarball_libepubgen.mk
index 0134768c57aa..14efadb337c0 100644
--- a/external/libepubgen/UnpackedTarball_libepubgen.mk
+++ b/external/libepubgen/UnpackedTarball_libepubgen.mk
@@ -8,17 +8,6 @@
 #
 
 epubgen_patches :=
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/96e9786f5aba1078251f36e58feefc8d953cdea0/>.
-epubgen_patches += libepubgen-validation1.patch.1
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/2e51fb9163bbc6b9a27fa524382c5aad9700dd0d/>.
-epubgen_patches += libepubgen-validation2.patch.1
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/9041ef42f9e0a5c4bc3b0a912d36683c4e10ca84/>.
-epubgen_patches += libepubgen-validation3.patch.1
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/49f6461d4751d3b16e32ab8f9c93a3856b33be49/>.
-epubgen_patches += libepubgen-vc.patch.1
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/2e9e9af9f49a78cca75d3c862c8dd4b5f7cc7eb2/> (and its deps).
-epubgen_patches += libepubgen-epub3.patch.1
-
 
 ifeq ($(COM_IS_CLANG),TRUE)
 ifneq ($(filter -fsanitize=%,$(CC)),)
diff --git a/external/libepubgen/libepubgen-epub3.patch.1 b/external/libepubgen/libepubgen-epub3.patch.1
deleted file mode 100644
index bf9670995049..000000000000
--- a/external/libepubgen/libepubgen-epub3.patch.1
+++ /dev/null
@@ -1,6419 +0,0 @@
-From 17b4d0a2b595d1504f3d957268e2085ae0f80db7 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Wed, 9 Aug 2017 15:53:02 +0200
-Subject: [PATCH 1/9] EPUBGenerator: avoid container version roundtrip to
- double
-
-This will be an error for EPUB3:
-
-ERROR(RSC-005): test.epub/META-INF/container.xml(2,85): Error while parsing file: value of attribute "version" is invalid; must be equal to "1.0"
-
-But it does not hurt for EPUB2, either.
----
- src/lib/EPUBGenerator.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 3357cf2..1033c0f 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -117,7 +117,7 @@ void EPUBGenerator::writeContainer()
-   EPUBXMLSink sink;
- 
-   RVNGPropertyList containerAttrs;
--  containerAttrs.insert("version", "1.0");
-+  containerAttrs.insert("version", RVNGPropertyFactory::newStringProp("1.0"));
-   containerAttrs.insert("xmlns", "urn:oasis:names:tc:opendocument:xmlns:container");
- 
-   sink.openElement("container", containerAttrs);
--- 
-2.12.3
-
-From 8ca1fe2b9db9bacd6e868e69a0909a441fb6a7f8 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Wed, 9 Aug 2017 16:00:05 +0200
-Subject: [PATCH 2/9] EPUBGenerator: avoid opf:scheme attribute when writing
- the UUID
-
-This will be an error for EPUB3:
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,292): Error while parsing file: found attribute "opf:scheme", but no attributes allowed here
-
-But it's optional for EPUB2 already.
----
- src/lib/EPUBGenerator.cpp | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 1033c0f..14e3c58 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -199,7 +199,6 @@ void EPUBGenerator::writeRoot()
- 
-   RVNGPropertyList identifierAttrs;
-   identifierAttrs.insert("id", uniqueId);
--  identifierAttrs.insert("opf:scheme", "UUID");
-   sink.openElement("dc:identifier", identifierAttrs);
-   // The identifier element is required to have a unique character content.
-   std::stringstream identifierStream("urn:uuid:");
--- 
-2.12.3
-
-From aa71784fcee0404c2f136f035887ca4c52d0e756 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Wed, 9 Aug 2017 16:11:13 +0200
-Subject: [PATCH 3/9] EPUBGenerator: avoid empty dc:title element
-
-This is a warning for EPUB2, but it'll be an error for EPUB3:
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,337): Error while parsing file: character content of element "dc:title" invalid; must be a string with length at least 1 (actual length was 0)
-
-The problem is that for ODF/librevenge this element is optional, so work
-it around by adding a zero-width space.
-
-A later commit should read the optional title of declared with a
-librevenge API call, though.
----
- src/lib/EPUBGenerator.cpp | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 14e3c58..75ccb5a 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -208,8 +208,12 @@ void EPUBGenerator::writeRoot()
-   sink.insertCharacters(identifierCharactrs.c_str());
-   sink.closeElement("dc:identifier");
- 
-+  // Zero-width space as it must be at least one character in length after
-+  // white space has been trimmed.
-   sink.openElement("dc:title");
-+  sink.insertCharacters("\u200b");
-   sink.closeElement("dc:title");
-+
-   sink.openElement("dc:language");
-   sink.closeElement("dc:language");
- 
--- 
-2.12.3
-
-From a4585b8f35c76472eb91688c9177b9f532c290d8 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Wed, 9 Aug 2017 16:15:12 +0200
-Subject: [PATCH 4/9] EPUBGenerator: avoid empty dc:language element
-
-Same story as with dc:title:
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,362): Error while parsing file: character content of element "dc:language" invalid; must be an RFC 3066 language identifier
-
-(This is a warning for EPUB2, but it'll be an error for EPUB3; this is optional
-for ODF; later commit should read the this info, though.)
----
- src/lib/EPUBGenerator.cpp | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 75ccb5a..40ae0cc 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -215,6 +215,7 @@ void EPUBGenerator::writeRoot()
-   sink.closeElement("dc:title");
- 
-   sink.openElement("dc:language");
-+  sink.insertCharacters("en");
-   sink.closeElement("dc:language");
- 
-   sink.closeElement("metadata");
--- 
-2.12.3
-
-From 862ec6735c25760edadf05d83717daaf65f39f99 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Wed, 9 Aug 2017 16:47:12 +0200
-Subject: [PATCH 5/9] [ABI CHANGE] optionally support generating EPUB3 output
-
-Versions are 20 and 30 to be consistent with
-<https://github.com/idpf/epubcheck/tree/master/src/main/resources/com/adobe/epubcheck/schema/>.
----
- inc/libepubgen/EPUBDrawingGenerator.h      |  6 +++++-
- inc/libepubgen/EPUBPresentationGenerator.h |  6 +++++-
- inc/libepubgen/EPUBTextGenerator.h         |  6 +++++-
- src/lib/EPUBDrawingGenerator.cpp           | 10 +++++-----
- src/lib/EPUBGenerator.cpp                  |  8 ++++++--
- src/lib/EPUBGenerator.h                    |  4 +++-
- src/lib/EPUBPagedGenerator.cpp             | 10 +++++-----
- src/lib/EPUBPagedGenerator.h               |  2 +-
- src/lib/EPUBPresentationGenerator.cpp      | 10 +++++-----
- src/lib/EPUBTextGenerator.cpp              | 10 +++++-----
- 10 files changed, 45 insertions(+), 27 deletions(-)
-
-diff --git a/inc/libepubgen/EPUBDrawingGenerator.h b/inc/libepubgen/EPUBDrawingGenerator.h
-index 48bfc99..963e3b8 100644
---- a/inc/libepubgen/EPUBDrawingGenerator.h
-+++ b/inc/libepubgen/EPUBDrawingGenerator.h
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBDrawingGenerator : public librevenge::RVNGDrawingInterface
-   class Impl;
- 
- public:
--  explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
-+  /** Constructor.
-+    *
-+    * @param[in] version possible values: 20, 30.
-+    */
-+  explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
-   EPUBDrawingGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
-   ~EPUBDrawingGenerator() override;
- 
-diff --git a/inc/libepubgen/EPUBPresentationGenerator.h b/inc/libepubgen/EPUBPresentationGenerator.h
-index 0a8152a..512c52d 100644
---- a/inc/libepubgen/EPUBPresentationGenerator.h
-+++ b/inc/libepubgen/EPUBPresentationGenerator.h
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBPresentationGenerator: public librevenge::RVNGPresentationI
-   class Impl;
- 
- public:
--  explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
-+  /** Constructor.
-+    *
-+    * @param[in] version possible values: 20, 30.
-+    */
-+  explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
-   EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
-   ~EPUBPresentationGenerator() override;
- 
-diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h
-index abf9e7f..664f673 100644
---- a/inc/libepubgen/EPUBTextGenerator.h
-+++ b/inc/libepubgen/EPUBTextGenerator.h
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBTextGenerator : public librevenge::RVNGTextInterface
-   struct Impl;
- 
- public:
--  explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
-+  /** Constructor.
-+    *
-+    * @param[in] version possible values: 20, 30.
-+    */
-+  explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
-   EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
-   ~EPUBTextGenerator() override;
- 
-diff --git a/src/lib/EPUBDrawingGenerator.cpp b/src/lib/EPUBDrawingGenerator.cpp
-index e25a377..bcb4994 100644
---- a/src/lib/EPUBDrawingGenerator.cpp
-+++ b/src/lib/EPUBDrawingGenerator.cpp
-@@ -20,16 +20,16 @@ using librevenge::RVNGString;
- class EPUBDrawingGenerator::Impl : public EPUBPagedGenerator
- {
- public:
--  Impl(EPUBPackage *const package, const EPUBSplitMethod method);
-+  Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version);
- };
- 
--EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
--  : EPUBPagedGenerator(package, method)
-+EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+  : EPUBPagedGenerator(package, method, version)
- {
- }
- 
--EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split)
--  : m_impl(new Impl(package, split))
-+EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split, int version)
-+  : m_impl(new Impl(package, split, version))
- {
- }
- 
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 40ae0cc..4888677 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -25,7 +25,7 @@ using librevenge::RVNGPropertyFactory;
- using librevenge::RVNGPropertyList;
- using librevenge::RVNGString;
- 
--EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split)
-+EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split, int version)
-   : m_package(package)
-   , m_manifest()
-   , m_htmlManager(m_manifest)
-@@ -39,6 +39,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
-   , m_metadata()
-   , m_currentHtml()
-   , m_splitGuard(split)
-+  , m_version(version)
- {
- }
- 
-@@ -190,7 +191,10 @@ void EPUBGenerator::writeRoot()
-   packageAttrs.insert("xmlns:dc", "http://purl.org/dc/elements/1.1/");
-   packageAttrs.insert("xmlns:dcterms", "http://purl.org/dc/terms/");
-   packageAttrs.insert("xmlns:opf", "http://www.idpf.org/2007/opf");
--  packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0"));
-+  if (m_version == 30)
-+    packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("3.0"));
-+  else
-+    packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0"));
-   packageAttrs.insert("unique-identifier", uniqueId);
- 
-   sink.openElement("package", packageAttrs);
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index 51dd911..a0ef8ac 100644
---- a/src/lib/EPUBGenerator.h
-+++ b/src/lib/EPUBGenerator.h
-@@ -33,7 +33,7 @@ class EPUBGenerator
-   EPUBGenerator &operator=(const EPUBGenerator &);
- 
- public:
--  EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method);
-+  EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
-   virtual ~EPUBGenerator();
- 
-   void startDocument(const librevenge::RVNGPropertyList &props);
-@@ -75,6 +75,8 @@ private:
-   EPUBHTMLGeneratorPtr_t m_currentHtml;
- 
-   EPUBSplitGuard m_splitGuard;
-+
-+  int m_version;
- };
- 
- }
-diff --git a/src/lib/EPUBPagedGenerator.cpp b/src/lib/EPUBPagedGenerator.cpp
-index 913a592..6a3bff0 100644
---- a/src/lib/EPUBPagedGenerator.cpp
-+++ b/src/lib/EPUBPagedGenerator.cpp
-@@ -25,7 +25,7 @@ class EPUBPagedGenerator::Impl : public EPUBGenerator
-   Impl &operator=(const Impl &);
- 
- public:
--  Impl(EPUBPackage *const package, EPUBSplitMethod method);
-+  Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
- 
- private:
-   void startHtmlFile() override;
-@@ -35,8 +35,8 @@ public:
-   bool m_firstPage;
- };
- 
--EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
--  : EPUBGenerator(package, method)
-+EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+  : EPUBGenerator(package, method, version)
-   , m_firstPage(true)
- {
- }
-@@ -59,8 +59,8 @@ void EPUBPagedGenerator::Impl::endHtmlFile()
- {
- }
- 
--EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method)
--  : m_impl(new Impl(package, method))
-+EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+  : m_impl(new Impl(package, method, version))
- {
- }
- 
-diff --git a/src/lib/EPUBPagedGenerator.h b/src/lib/EPUBPagedGenerator.h
-index f1d124f..74d70da 100644
---- a/src/lib/EPUBPagedGenerator.h
-+++ b/src/lib/EPUBPagedGenerator.h
-@@ -26,7 +26,7 @@ class EPUBPagedGenerator: public librevenge::RVNGPresentationInterface
-   class Impl;
- 
- public:
--  EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method);
-+  EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
- 
-   void setSplitHeadingLevel(unsigned level);
-   void setSplitSize(unsigned size);
-diff --git a/src/lib/EPUBPresentationGenerator.cpp b/src/lib/EPUBPresentationGenerator.cpp
-index 5b2a2e9..80b5ac2 100644
---- a/src/lib/EPUBPresentationGenerator.cpp
-+++ b/src/lib/EPUBPresentationGenerator.cpp
-@@ -20,16 +20,16 @@ using librevenge::RVNGString;
- class EPUBPresentationGenerator::Impl : public EPUBPagedGenerator
- {
- public:
--  Impl(EPUBPackage *const package, EPUBSplitMethod method);
-+  Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
- };
- 
--EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
--  : EPUBPagedGenerator(package, method)
-+EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+  : EPUBPagedGenerator(package, method, version)
- {
- }
- 
--EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method)
--  : m_impl(new Impl(package, method))
-+EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method, int version)
-+  : m_impl(new Impl(package, method, version))
- {
-   (void) method;
- }
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index b3ca626..e8f785e 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -57,7 +57,7 @@ bool operator!=(const char *const left, const RVNGString &right)
- 
- struct EPUBTextGenerator::Impl : public EPUBGenerator
- {
--  Impl(EPUBPackage *package, EPUBSplitMethod method);
-+  Impl(EPUBPackage *package, EPUBSplitMethod method, int version);
- 
- private:
-   void startHtmlFile() override;
-@@ -83,8 +83,8 @@ private:
-   Impl &operator=(const Impl &);
- };
- 
--EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
--  : EPUBGenerator(package, method)
-+EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+  : EPUBGenerator(package, method, version)
-   , m_inPageSpan(false)
-   , m_inHeader(false)
-   , m_inFooter(false)
-@@ -113,8 +113,8 @@ void EPUBTextGenerator::Impl::endHtmlFile()
-     m_currentFooter->write(getHtml().get());
- }
- 
--EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method)
--  : m_impl(new Impl(package, method))
-+EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+  : m_impl(new Impl(package, method, version))
- {
-   (void) method;
- }
--- 
-2.12.3
-
-From cfd57f50c9d33781f90018d40902ccce68a13a5c Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Wed, 9 Aug 2017 17:19:06 +0200
-Subject: [PATCH 6/9] EPUB3: write missing modification date
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,236): Error while parsing file: package dcterms:modified meta element must occur exactly once
-
-But not for EPUB2, which doesn't allow so.
-
-(Similar story as with dc:title: later commit should read the this
-optional info from librevenge.)
----
- src/lib/EPUBGenerator.cpp | 18 ++++++++++++++++++
- 1 file changed, 18 insertions(+)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 4888677..1628a2b 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -7,6 +7,7 @@
-  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
-  */
- 
-+#include <ctime>
- #include <sstream>
- 
- #include <boost/uuid/uuid.hpp>
-@@ -222,6 +223,23 @@ void EPUBGenerator::writeRoot()
-   sink.insertCharacters("en");
-   sink.closeElement("dc:language");
- 
-+  time_t now = 0;
-+  time(&now);
-+  const struct tm *local = localtime(&now);
-+  if (m_version == 30 && local)
-+  {
-+    RVNGPropertyList metaAttrs;
-+    metaAttrs.insert("property", "dcterms:modified");
-+    sink.openElement("meta", metaAttrs);
-+    const int MAX_BUFFER = 1024;
-+    char buffer[MAX_BUFFER];
-+    strftime(&buffer[0], MAX_BUFFER-1, "%Y-%m-%dT%H:%M:%SZ", local);
-+    RVNGString result;
-+    result.append(buffer);
-+    sink.insertCharacters(result);
-+    sink.closeElement("meta");
-+  }
-+
-   sink.closeElement("metadata");
- 
-   sink.openElement("manifest");
--- 
-2.12.3
-
-From 575a09f637b5afe4d61387c7be3c8b2b67039ccb Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Wed, 9 Aug 2017 17:39:51 +0200
-Subject: [PATCH 7/9] EPUB3: add missing nav property on first HTML stream
-
-ERROR(RSC-005): test30.epub/OEBPS/content.opf(2,459): Error while parsing file: Exactly one manifest item must declare the 'nav' property (number of 'nav' items: 0).
-
-This is the last error in OEBPS/content.opf in case of EPUB3.
----
- src/lib/EPUBGenerator.cpp    | 11 ++++++++---
- src/lib/EPUBGenerator.h      |  1 +
- src/lib/EPUBHTMLManager.cpp  |  9 +++++++--
- src/lib/EPUBHTMLManager.h    |  3 ++-
- src/lib/EPUBImageManager.cpp |  2 +-
- src/lib/EPUBManifest.cpp     | 11 +++++++----
- src/lib/EPUBManifest.h       |  5 +++--
- 7 files changed, 29 insertions(+), 13 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 1628a2b..f77aa6c 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -54,8 +54,8 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
- 
-   startNewHtmlFile();
- 
--  m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx");
--  m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css");
-+  m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
-+  m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
- }
- 
- void EPUBGenerator::endDocument()
-@@ -90,7 +90,7 @@ void EPUBGenerator::startNewHtmlFile()
- 
-   m_splitGuard.onSplit();
- 
--  m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath);
-+  m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, *this);
- 
-   // restore state in the new file
-   m_currentHtml->startDocument(m_documentProps);
-@@ -114,6 +114,11 @@ EPUBSplitGuard &EPUBGenerator::getSplitGuard()
-   return m_splitGuard;
- }
- 
-+int EPUBGenerator::getVersion() const
-+{
-+  return m_version;
-+}
-+
- void EPUBGenerator::writeContainer()
- {
-   EPUBXMLSink sink;
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index a0ef8ac..1a67a88 100644
---- a/src/lib/EPUBGenerator.h
-+++ b/src/lib/EPUBGenerator.h
-@@ -47,6 +47,7 @@ public:
- 
-   const EPUBSplitGuard &getSplitGuard() const;
-   EPUBSplitGuard &getSplitGuard();
-+  int getVersion() const;
- 
- private:
-   virtual void startHtmlFile() = 0;
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index 03dbf21..57636b9 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -13,6 +13,7 @@
- 
- #include "EPUBHTMLManager.h"
- #include "EPUBManifest.h"
-+#include "EPUBGenerator.h"
- 
- namespace libepubgen
- {
-@@ -26,7 +27,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
- {
- }
- 
--const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator)
- {
-   std::ostringstream nameBuf;
-   nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next();
-@@ -35,7 +36,11 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana
-   nameBuf << ".html";
-   m_paths.push_back(EPUBPath("OEBPS/sections") / nameBuf.str());
- 
--  m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back());
-+  std::string properties;
-+  if (m_number.current() == 1 && generator.getVersion() == 30)
-+    // Only for the first HTML file.
-+    properties = "nav";
-+  m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back(), properties);
- 
-   m_contents.push_back(EPUBXMLSink());
- 
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index 84ecd2d..7dab33b 100644
---- a/src/lib/EPUBHTMLManager.h
-+++ b/src/lib/EPUBHTMLManager.h
-@@ -30,6 +30,7 @@ class EPUBSpanStyleManager;
- class EPUBTableStyleManager;
- class EPUBManifest;
- class EPUBPackage;
-+class EPUBGenerator;
- 
- class EPUBHTMLManager
- {
-@@ -40,7 +41,7 @@ class EPUBHTMLManager
- public:
-   explicit EPUBHTMLManager(EPUBManifest &manifest);
- 
--  const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath);
-+  const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator);
- 
-   void writeTo(EPUBPackage &package);
- 
-diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp
-index 1b043d7..0179cad 100644
---- a/src/lib/EPUBImageManager.cpp
-+++ b/src/lib/EPUBImageManager.cpp
-@@ -86,7 +86,7 @@ const EPUBPath &EPUBImageManager::insert(const librevenge::RVNGBinaryData &data,
- 
-     const EPUBPath path(EPUBPath("OEBPS/images") / nameBuf.str());
- 
--    m_manifest.insert(path, mime, id);
-+    m_manifest.insert(path, mime, id, "");
-     it = m_map.insert(MapType_t::value_type(data, path)).first;
-   }
- 
-diff --git a/src/lib/EPUBManifest.cpp b/src/lib/EPUBManifest.cpp
-index dcffdcc..813a097 100644
---- a/src/lib/EPUBManifest.cpp
-+++ b/src/lib/EPUBManifest.cpp
-@@ -21,9 +21,9 @@ EPUBManifest::EPUBManifest()
- {
- }
- 
--void EPUBManifest::insert(const EPUBPath &path, const std::string &mimetype, const std::string &id)
-+void EPUBManifest::insert(const EPUBPath &path, const std::string &mimetype, const std::string &id, const std::string &properties)
- {
--  if (!m_map.insert(MapType_t::value_type(path.relativeTo(EPUBPath("OEBPS/content.opf")).str(), ValueType_t(mimetype, id))).second)
-+  if (!m_map.insert(MapType_t::value_type(path.relativeTo(EPUBPath("OEBPS/content.opf")).str(), ValueType_t(mimetype, id, properties))).second)
-   {
-     assert(!"duplicate entry!");
-   }
-@@ -35,8 +35,11 @@ void EPUBManifest::writeTo(EPUBXMLSink &sink)
-   {
-     librevenge::RVNGPropertyList attrs;
-     attrs.insert("href", it->first.c_str());
--    attrs.insert("media-type", it->second.first.c_str());
--    attrs.insert("id", it->second.second.c_str());
-+    attrs.insert("media-type", std::get<0>(it->second).c_str());
-+    attrs.insert("id", std::get<1>(it->second).c_str());
-+    const std::string &properties = std::get<2>(it->second);
-+    if (!properties.empty())
-+      attrs.insert("properties", properties.c_str());
-     sink.insertEmptyElement("item", attrs);
-   }
- }
-diff --git a/src/lib/EPUBManifest.h b/src/lib/EPUBManifest.h
-index f2379cf..c4c9031 100644
---- a/src/lib/EPUBManifest.h
-+++ b/src/lib/EPUBManifest.h
-@@ -26,13 +26,14 @@ class EPUBManifest
-   EPUBManifest(const EPUBManifest &);
-   EPUBManifest &operator=(const EPUBManifest &);
- 
--  typedef std::pair<std::string, std::string> ValueType_t;
-+  // media-type, id, properties
-+  typedef std::tuple<std::string, std::string, std::string> ValueType_t;
-   typedef std::unordered_map<std::string, ValueType_t> MapType_t;
- 
- public:
-   EPUBManifest();
- 
--  void insert(const EPUBPath &path, const std::string &mimetype, const std::string &id);
-+  void insert(const EPUBPath &path, const std::string &mimetype, const std::string &id, const std::string &properties);
- 
-   void writeTo(EPUBXMLSink &sink);
- 
--- 
-2.12.3
-
-From 28090aa5d57162302122686cb020d4bf2231cab4 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Thu, 10 Aug 2017 15:05:46 +0200
-Subject: [PATCH 8/9] EPUB3: implement navigation document
-
-As
-<http://www.idpf.org/epub/30/spec/epub30-changes.html#sec-new-changed-nav>
-says, EPUB 3 defines a new grammar for navigation based on XHTML, which
-replaces the old NCX grammar -- so use that in EPUB3 mode.
-
-With this, a hello world input in EPUB3 mode results in 0 errors in the
-validator.
----
- src/lib/EPUBGenerator.cpp   | 43 ++++++++++++++++++++++++++++++++++++++-----
- src/lib/EPUBHTMLManager.cpp | 28 +++++++++++++++++++++-------
- src/lib/EPUBHTMLManager.h   |  4 ++--
- 3 files changed, 61 insertions(+), 14 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index f77aa6c..7ec2a2b 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -54,7 +54,10 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
- 
-   startNewHtmlFile();
- 
--  m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
-+  if (m_version == 30)
-+    m_manifest.insert(EPUBPath("OEBPS/toc.html"), "application/xhtml+xml", "toc.html", "nav");
-+  else
-+    m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
-   m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
- }
- 
-@@ -90,7 +93,7 @@ void EPUBGenerator::startNewHtmlFile()
- 
-   m_splitGuard.onSplit();
- 
--  m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, *this);
-+  m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath);
- 
-   // restore state in the new file
-   m_currentHtml->startDocument(m_documentProps);
-@@ -144,9 +147,38 @@ void EPUBGenerator::writeContainer()
- 
- void EPUBGenerator::writeNavigation()
- {
--  const EPUBPath path("OEBPS/toc.ncx");
-   EPUBXMLSink sink;
- 
-+  if (m_version == 30)
-+  {
-+    const EPUBPath path("OEBPS/toc.html");
-+    RVNGPropertyList htmlAttrs;
-+    htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml");
-+    htmlAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops");
-+    sink.openElement("html", htmlAttrs);
-+
-+    sink.openElement("head");
-+    sink.closeElement("head");
-+    sink.openElement("body");
-+
-+    RVNGPropertyList navAttrs;
-+    navAttrs.insert("epub:type", "toc");
-+    sink.openElement("nav", navAttrs);
-+
-+    sink.openElement("ol");
-+    m_htmlManager.writeTocTo(sink, path, m_version);
-+    sink.closeElement("ol");
-+
-+    sink.closeElement("nav");
-+    sink.closeElement("body");
-+    sink.closeElement("html");
-+
-+    sink.writeTo(*m_package, path.str().c_str());
-+
-+    return;
-+  }
-+
-+  const EPUBPath path("OEBPS/toc.ncx");
-   RVNGPropertyList ncxAttrs;
-   ncxAttrs.insert("xmlns", "http://www.daisy.org/z3986/2005/ncx/");
-   ncxAttrs.insert("version", "2005-1");
-@@ -166,7 +198,7 @@ void EPUBGenerator::writeNavigation()
-   sink.closeElement("docTitle");
- 
-   sink.openElement("navMap");
--  m_htmlManager.writeTocTo(sink, path);
-+  m_htmlManager.writeTocTo(sink, path, m_version);
-   sink.closeElement("navMap");
- 
-   sink.closeElement("ncx");
-@@ -252,7 +284,8 @@ void EPUBGenerator::writeRoot()
-   sink.closeElement("manifest");
- 
-   RVNGPropertyList spineAttrs;
--  spineAttrs.insert("toc", "toc.ncx");
-+  if (m_version == 20)
-+    spineAttrs.insert("toc", "toc.ncx");
- 
-   sink.openElement("spine", spineAttrs);
-   m_htmlManager.writeSpineTo(sink);
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index 57636b9..7b17304 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -27,7 +27,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
- {
- }
- 
--const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath)
- {
-   std::ostringstream nameBuf;
-   nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next();
-@@ -36,11 +36,7 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana
-   nameBuf << ".html";
-   m_paths.push_back(EPUBPath("OEBPS/sections") / nameBuf.str());
- 
--  std::string properties;
--  if (m_number.current() == 1 && generator.getVersion() == 30)
--    // Only for the first HTML file.
--    properties = "nav";
--  m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back(), properties);
-+  m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back(), "");
- 
-   m_contents.push_back(EPUBXMLSink());
- 
-@@ -71,8 +67,26 @@ void EPUBHTMLManager::writeSpineTo(EPUBXMLSink &sink)
-   }
- }
- 
--void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath)
-+void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version)
- {
-+  if (version == 30)
-+  {
-+    for (std::vector<EPUBPath>::size_type i = 0; m_paths.size() != i; ++i)
-+    {
-+      sink.openElement("li");
-+      librevenge::RVNGPropertyList anchorAttrs;
-+      anchorAttrs.insert("href", m_paths[i].relativeTo(tocPath).str().c_str());
-+      sink.openElement("a", anchorAttrs);
-+      std::ostringstream label;
-+      label << "Section " << (i + 1);
-+      sink.insertCharacters(label.str().c_str());
-+      sink.closeElement("a");
-+      sink.closeElement("li");
-+    }
-+
-+    return;
-+  }
-+
-   librevenge::RVNGPropertyList navPointAttrs;
-   for (std::vector<EPUBPath>::size_type i = 0; m_paths.size() != i; ++i)
-   {
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index 7dab33b..2ec7bb7 100644
---- a/src/lib/EPUBHTMLManager.h
-+++ b/src/lib/EPUBHTMLManager.h
-@@ -41,12 +41,12 @@ class EPUBHTMLManager
- public:
-   explicit EPUBHTMLManager(EPUBManifest &manifest);
- 
--  const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator);
-+  const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath);
- 
-   void writeTo(EPUBPackage &package);
- 
-   void writeSpineTo(EPUBXMLSink &sink);
--  void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath);
-+  void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version);
- 
- private:
-   EPUBManifest &m_manifest;
--- 
-2.12.3
-
-From 2e9e9af9f49a78cca75d3c862c8dd4b5f7cc7eb2 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Thu, 10 Aug 2017 15:11:49 +0200
-Subject: [PATCH 9/9] Use .xhtml for XHTML content
-
-The EPUB3 validator warns:
-
-WARNING(HTM-014a): test30.epub/OEBPS/content.opf(2,718): XHTML Content Document file name 'OEBPS/sections/section0001.html' should have the extension '.xhtml'.
-
-And it does not hurt for EPUB2, either.
----
- src/lib/EPUBGenerator.cpp   | 4 ++--
- src/lib/EPUBHTMLManager.cpp | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 7ec2a2b..ca05ea7 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -55,7 +55,7 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
-   startNewHtmlFile();
- 
-   if (m_version == 30)
--    m_manifest.insert(EPUBPath("OEBPS/toc.html"), "application/xhtml+xml", "toc.html", "nav");
-+    m_manifest.insert(EPUBPath("OEBPS/toc.xhtml"), "application/xhtml+xml", "toc.xhtml", "nav");
-   else
-     m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
-   m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
-@@ -151,7 +151,7 @@ void EPUBGenerator::writeNavigation()
- 
-   if (m_version == 30)
-   {
--    const EPUBPath path("OEBPS/toc.html");
-+    const EPUBPath path("OEBPS/toc.xhtml");
-     RVNGPropertyList htmlAttrs;
-     htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml");
-     htmlAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops");
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index 7b17304..be56cc7 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -33,7 +33,7 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana
-   nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next();
-   m_ids.push_back(nameBuf.str());
- 
--  nameBuf << ".html";
-+  nameBuf << ".xhtml";
-   m_paths.push_back(EPUBPath("OEBPS/sections") / nameBuf.str());
- 
-   m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back(), "");
--- 
-2.12.3
-
-From c30bc184c18837203e9f249386711e9cd616c9f0 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Fri, 11 Aug 2017 10:50:47 +0200
-Subject: [PATCH] EPUB3: write the deprecated NCX navication as well
-
-<http://www.idpf.org/epub/30/spec/epub30-changes.html#sec-new-changed-nav>
-"3.2 Navigation" says:
-
-	EPUB 3 Publications may include the EPUB 2 NCX for EPUB 2 Reading System
-	forward compatibility purposes.
----
- src/lib/EPUBGenerator.cpp | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index ca05ea7..8017ffe 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -56,8 +56,7 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
- 
-   if (m_version == 30)
-     m_manifest.insert(EPUBPath("OEBPS/toc.xhtml"), "application/xhtml+xml", "toc.xhtml", "nav");
--  else
--    m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
-+  m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
-   m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
- }
- 
-@@ -147,10 +146,10 @@ void EPUBGenerator::writeContainer()
- 
- void EPUBGenerator::writeNavigation()
- {
--  EPUBXMLSink sink;
--
-   if (m_version == 30)
-   {
-+    EPUBXMLSink sink;
-+
-     const EPUBPath path("OEBPS/toc.xhtml");
-     RVNGPropertyList htmlAttrs;
-     htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml");
-@@ -174,10 +173,10 @@ void EPUBGenerator::writeNavigation()
-     sink.closeElement("html");
- 
-     sink.writeTo(*m_package, path.str().c_str());
--
--    return;
-   }
- 
-+  EPUBXMLSink sink;
-+
-   const EPUBPath path("OEBPS/toc.ncx");
-   RVNGPropertyList ncxAttrs;
-   ncxAttrs.insert("xmlns", "http://www.daisy.org/z3986/2005/ncx/");
-@@ -198,7 +197,9 @@ void EPUBGenerator::writeNavigation()
-   sink.closeElement("docTitle");
- 
-   sink.openElement("navMap");
--  m_htmlManager.writeTocTo(sink, path, m_version);
-+  // In case of EPUB3 the (deprecated, but valid) EPUB2 markup is wanted, so
-+  // the version is unconditional here.
-+  m_htmlManager.writeTocTo(sink, path, /*version=*/20);
-   sink.closeElement("navMap");
- 
-   sink.closeElement("ncx");
-@@ -284,8 +285,7 @@ void EPUBGenerator::writeRoot()
-   sink.closeElement("manifest");
- 
-   RVNGPropertyList spineAttrs;
--  if (m_version == 20)
--    spineAttrs.insert("toc", "toc.ncx");
-+  spineAttrs.insert("toc", "toc.ncx");
- 
-   sink.openElement("spine", spineAttrs);
-   m_htmlManager.writeSpineTo(sink);
--- 
-2.12.3
-
-From d855721de6b4e55fb0b2a02a6a1132802dba5f63 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Fri, 11 Aug 2017 15:40:49 +0200
-Subject: [PATCH] EPUBGenerator: write title into content.opf
-
----
- src/lib/EPUBGenerator.cpp | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 8017ffe..056c48c 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -253,8 +253,11 @@ void EPUBGenerator::writeRoot()
- 
-   // Zero-width space as it must be at least one character in length after
-   // white space has been trimmed.
-+  RVNGString title("\u200b");
-+  if (m_metadata["dc:title"] && !m_metadata["dc:title"]->getStr().empty())
-+    title = m_metadata["dc:title"]->getStr();
-   sink.openElement("dc:title");
--  sink.insertCharacters("\u200b");
-+  sink.insertCharacters(title);
-   sink.closeElement("dc:title");
- 
-   sink.openElement("dc:language");
--- 
-2.12.3
-
-From 14da42819f1f96b87b2337da395e5ad6639dcebe Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Fri, 11 Aug 2017 16:43:10 +0200
-Subject: [PATCH] EPUBGenerator: write language and modification date into
- content.opf
-
-With this, all metadata which had a hardcoded value is now parsed and
-the old values are just defaults.
----
- src/lib/EPUBGenerator.cpp | 32 +++++++++++++++++++++-----------
- 1 file changed, 21 insertions(+), 11 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 056c48c..fc6c848 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -260,24 +260,34 @@ void EPUBGenerator::writeRoot()
-   sink.insertCharacters(title);
-   sink.closeElement("dc:title");
- 
-+  RVNGString language("en");
-+  if (m_metadata["dc:language"] && !m_metadata["dc:language"]->getStr().empty())
-+    language = m_metadata["dc:language"]->getStr();
-   sink.openElement("dc:language");
--  sink.insertCharacters("en");
-+  sink.insertCharacters(language);
-   sink.closeElement("dc:language");
- 
--  time_t now = 0;
--  time(&now);
--  const struct tm *local = localtime(&now);
--  if (m_version == 30 && local)
-+  if (m_version == 30)
-   {
-+    RVNGString date;
-+    time_t now = 0;
-+    time(&now);
-+    const struct tm *local = localtime(&now);
-+    if (local)
-+    {
-+      const int MAX_BUFFER = 1024;
-+      char buffer[MAX_BUFFER];
-+      strftime(&buffer[0], MAX_BUFFER-1, "%Y-%m-%dT%H:%M:%SZ", local);
-+      date.append(buffer);
-+    }
-+
-+    if (m_metadata["dc:date"] && !m_metadata["dc:date"]->getStr().empty())
-+      date = m_metadata["dc:date"]->getStr();
-+
-     RVNGPropertyList metaAttrs;
-     metaAttrs.insert("property", "dcterms:modified");
-     sink.openElement("meta", metaAttrs);
--    const int MAX_BUFFER = 1024;
--    char buffer[MAX_BUFFER];
--    strftime(&buffer[0], MAX_BUFFER-1, "%Y-%m-%dT%H:%M:%SZ", local);
--    RVNGString result;
--    result.append(buffer);
--    sink.insertCharacters(result);
-+    sink.insertCharacters(date);
-     sink.closeElement("meta");
-   }
- 
--- 
-2.12.3
-From c8cba54a7025ee0f1129233912f6e9ceda254c64 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Fri, 11 Aug 2017 17:40:10 +0200
-Subject: [PATCH] EPUB3: fix validation error with doc modified date format
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,420): Error while parsing file: dcterms:modified illegal syntax (expecting: 'CCYY-MM-DDThh:mm:ssZ')
-
-Both of them looked like XML date formats, but actually librevenge is
-more precise, so truncate it.
----
- src/lib/EPUBGenerator.cpp | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index fc6c848..4bffb8b 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -282,7 +282,11 @@ void EPUBGenerator::writeRoot()
-     }
- 
-     if (m_metadata["dc:date"] && !m_metadata["dc:date"]->getStr().empty())
--      date = m_metadata["dc:date"]->getStr();
-+    {
-+      // Expecting CCYY-MM-DDThh:mm:ssZ, librevenge provides CCYY-MM-DDThh:mm:ss.sssssssss
-+      date = std::string(m_metadata["dc:date"]->getStr().cstr()).substr(0, 19).c_str();
-+      date.append("Z");
-+    }
- 
-     RVNGPropertyList metaAttrs;
-     metaAttrs.insert("property", "dcterms:modified");
--- 
-2.12.3
-
-From c28f02f21a6d80ad258cf8f052705508567e2418 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Fri, 11 Aug 2017 18:19:15 +0200
-Subject: [PATCH 1/3] Fix image mime-type key
-
-libepubgen expected librevenge:mimetype, but:
-
-1) LO's ODF output has loext:mime-type
-2) libabw generates librevenge:mime-type
-3) libodfgen expects librevenge:mime-type
-
-So probably this one has to be adjusted.
----
- src/lib/EPUBHTMLGenerator.cpp | 2 +-
- src/lib/EPUBTextGenerator.cpp | 4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 5ef5e14..40c507e 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -866,7 +866,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- 
-   const EPUBPath &path = m_impl->m_imageManager.insert(
-                            RVNGBinaryData(propList["office:binary-data"]->getStr()),
--                           propList["librevenge:mimetype"]->getStr());
-+                           propList["librevenge:mime-type"]->getStr());
- 
-   RVNGPropertyList attrs;
-   attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str());
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index e8f785e..cb557b2 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -596,7 +596,7 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
- 
-   for (RVNGPropertyList::Iter iter(propList); !iter.last(); iter.next())
-   {
--    if (RVNGString("librevenge:mimetype") == iter.key())
-+    if (RVNGString("librevenge:mime-type") == iter.key())
-       mimetype.reset(iter()->clone());
-     else if (RVNGString("office:binary-data") == iter.key())
-       data.reset(iter()->clone());
-@@ -627,7 +627,7 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
-     }
-   }
- 
--  newPropList.insert("librevenge:mimetype", mimetype->clone());
-+  newPropList.insert("librevenge:mime-type", mimetype->clone());
-   newPropList.insert("office:binary-data", data->clone());
- 
-   if (m_impl->m_inHeader || m_impl->m_inFooter)
--- 
-2.12.3
-
-From 39470cf360cfc67f2dd078646162a63168a84c05 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Tue, 15 Aug 2017 12:12:12 +0200
-Subject: [PATCH 2/3] EPUBSplitGuard: fix tracking current size
-
-In case incrementing size and split affects the reference size, the
-current size won't be ever greather than zero in
-EPUBSplitGuard::canSplit(), and it will always return false.
-
-With this, EPUB_SPLIT_METHOD_PAGE_BREAK works again.
----
- src/lib/EPUBSplitGuard.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
-index 8c279c8..15ba20f 100644
---- a/src/lib/EPUBSplitGuard.cpp
-+++ b/src/lib/EPUBSplitGuard.cpp
-@@ -46,7 +46,7 @@ void EPUBSplitGuard::closeLevel()
- 
- void EPUBSplitGuard::incrementSize(const unsigned size)
- {
--  m_size += size;
-+  m_currentSize += size;
- }
- 
- bool EPUBSplitGuard::splitOnPageBreak() const
-@@ -66,7 +66,7 @@ bool EPUBSplitGuard::splitOnSize() const
- 
- void EPUBSplitGuard::onSplit()
- {
--  m_size = 0;
-+  m_currentSize = 0;
- }
- 
- bool EPUBSplitGuard::canSplit(const EPUBSplitMethod method) const
--- 
-2.12.3
-
-From 3155cb6164f04fa8170dd9912c579ad90586c8a8 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Tue, 15 Aug 2017 13:53:16 +0200
-Subject: [PATCH 3/3] EPUBTextGenerator: handle EPUB_SPLIT_METHOD_HEADING
-
-It seems to me this was unimplemented so far.
----
- src/lib/EPUBTextGenerator.cpp | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index cb557b2..aba8827 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -255,6 +255,12 @@ void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propLi
-   m_impl->m_breakAfterPara = breakAfter && ("column" != breakAfter->getStr());
-   if (m_impl->getSplitGuard().splitOnSize())
-     m_impl->startNewHtmlFile();
-+
-+  // Handle split by chapters.
-+  const RVNGProperty *const outlineLevel = propList["text:outline-level"];
-+  if (outlineLevel && m_impl->getSplitGuard().splitOnHeading(outlineLevel->getInt()))
-+    m_impl->startNewHtmlFile();
-+
-   m_impl->getSplitGuard().openLevel();
- 
-   if (m_impl->m_inHeader || m_impl->m_inFooter)
--- 
-2.12.3
-
-From 576c2472e384ea1a71739b15f42561cd34de5bba Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Wed, 16 Aug 2017 17:52:37 +0200
-Subject: [PATCH] EPUB_SPLIT_METHOD_HEADING: try to use real chapter names, not
- Section N
-
-What users call "chapter title" is the text of a paragraph with an
-outline level set.
-
-To keep this simple just handle the text after opening such a paragraph,
-but no other paragraph is opened, i.e. assume that in:
-
-<para outline=y>A<para outline=n>B</para>C</para>
-
-only A is interesting, but not B, neither C. (Which could happen with an
-at-character anchored frame inside a heading text e.g.)
----
- src/lib/EPUBGenerator.cpp     |  5 +++++
- src/lib/EPUBGenerator.h       |  2 ++
- src/lib/EPUBHTMLManager.cpp   | 26 ++++++++++++++++++++++++--
- src/lib/EPUBHTMLManager.h     |  3 +++
- src/lib/EPUBPath.cpp          | 11 +++++++++++
- src/lib/EPUBPath.h            |  4 ++++
- src/lib/EPUBTextGenerator.cpp |  6 ++++++
- 7 files changed, 55 insertions(+), 2 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 4bffb8b..4ce2964 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -106,6 +106,11 @@ const EPUBHTMLGeneratorPtr_t &EPUBGenerator::getHtml() const
-   return m_currentHtml;
- }
- 
-+EPUBHTMLManager &EPUBGenerator::getHtmlManager()
-+{
-+  return m_htmlManager;
-+}
-+
- const EPUBSplitGuard &EPUBGenerator::getSplitGuard() const
- {
-   return m_splitGuard;
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index 1a67a88..f98c80f 100644
---- a/src/lib/EPUBGenerator.h
-+++ b/src/lib/EPUBGenerator.h
-@@ -45,6 +45,8 @@ public:
- 
-   const EPUBHTMLGeneratorPtr_t &getHtml() const;
- 
-+  EPUBHTMLManager &getHtmlManager();
-+
-   const EPUBSplitGuard &getSplitGuard() const;
-   EPUBSplitGuard &getSplitGuard();
-   int getVersion() const;
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index be56cc7..5141f31 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -18,6 +18,20 @@
- namespace libepubgen
- {
- 
-+namespace
-+{
-+
-+/// Extracts a title string from a path and provides a fallback if it would be empty.
-+void getPathTitle(std::ostringstream &label, const EPUBPath &path, std::vector<EPUBPath>::size_type index)
-+{
-+  if (path.getTitle().empty())
-+    label << "Section " << (index + 1);
-+  else
-+    label << path.getTitle();
-+}
-+
-+}
-+
- EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
-   : m_manifest(manifest)
-   , m_paths()
-@@ -78,7 +92,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
-       anchorAttrs.insert("href", m_paths[i].relativeTo(tocPath).str().c_str());
-       sink.openElement("a", anchorAttrs);
-       std::ostringstream label;
--      label << "Section " << (i + 1);
-+      getPathTitle(label, m_paths[i], i);
-       sink.insertCharacters(label.str().c_str());
-       sink.closeElement("a");
-       sink.closeElement("li");
-@@ -101,7 +115,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
-     sink.openElement("navLabel");
-     sink.openElement("text");
-     std::ostringstream label;
--    label << "Section " << (i + 1);
-+    getPathTitle(label, m_paths[i], i);
-     sink.insertCharacters(label.str().c_str());
-     sink.closeElement("text");
-     sink.closeElement("navLabel");
-@@ -112,6 +126,14 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
-   }
- }
- 
-+void EPUBHTMLManager::insertHeadingText(const std::string &text)
-+{
-+  if (m_paths.empty())
-+    return;
-+
-+  m_paths.back().appendTitle(text);
-+}
-+
- }
- 
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index 2ec7bb7..6b480c4 100644
---- a/src/lib/EPUBHTMLManager.h
-+++ b/src/lib/EPUBHTMLManager.h
-@@ -48,6 +48,9 @@ public:
-   void writeSpineTo(EPUBXMLSink &sink);
-   void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version);
- 
-+  /// Appends text to the title of the current heading.
-+  void insertHeadingText(const std::string &text);
-+
- private:
-   EPUBManifest &m_manifest;
-   std::vector<EPUBPath> m_paths;
-diff --git a/src/lib/EPUBPath.cpp b/src/lib/EPUBPath.cpp
-index 9def6f6..e1c05ed 100644
---- a/src/lib/EPUBPath.cpp
-+++ b/src/lib/EPUBPath.cpp
-@@ -53,6 +53,7 @@ EPUBPath::Relative::Relative(const std::vector<std::string> &components)
- 
- EPUBPath::EPUBPath(const std::string &path)
-   : m_components()
-+  , m_title()
- {
-   const std::string trimmed(algorithm::trim_left_copy_if(path, algorithm::is_any_of("/")));
-   algorithm::split(m_components, trimmed, algorithm::is_any_of("/"), algorithm::token_compress_on);
-@@ -110,6 +111,16 @@ const EPUBPath::Relative EPUBPath::relativeTo(const EPUBPath &base) const
-   return Relative(components);
- }
- 
-+void EPUBPath::appendTitle(const std::string &title)
-+{
-+  m_title += title;
-+}
-+
-+std::string EPUBPath::getTitle() const
-+{
-+  return m_title;
-+}
-+
- bool operator==(const EPUBPath &left, const EPUBPath &right)
- {
-   return left.m_components == right.m_components;
-diff --git a/src/lib/EPUBPath.h b/src/lib/EPUBPath.h
-index 18bf058..12b8f25 100644
---- a/src/lib/EPUBPath.h
-+++ b/src/lib/EPUBPath.h
-@@ -48,8 +48,12 @@ public:
- 
-   const Relative relativeTo(const EPUBPath &base) const;
- 
-+  void appendTitle(const std::string &title);
-+  std::string getTitle() const;
-+
- private:
-   std::vector<std::string> m_components;
-+  std::string m_title;
- };
- 
- bool operator==(const EPUBPath &left, const EPUBPath &right);
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index aba8827..b1e33f8 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -67,6 +67,7 @@ public:
-   bool m_inPageSpan;
-   bool m_inHeader;
-   bool m_inFooter;
-+  bool m_inHeading;
- 
-   RVNGPropertyList m_pageSpanProps;
-   shared_ptr<EPUBTextElements> m_currentHeader;
-@@ -88,6 +89,7 @@ EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod
-   , m_inPageSpan(false)
-   , m_inHeader(false)
-   , m_inFooter(false)
-+  , m_inHeading(false)
-   , m_pageSpanProps()
-   , m_currentHeader()
-   , m_currentFooter()
-@@ -260,6 +262,7 @@ void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propLi
-   const RVNGProperty *const outlineLevel = propList["text:outline-level"];
-   if (outlineLevel && m_impl->getSplitGuard().splitOnHeading(outlineLevel->getInt()))
-     m_impl->startNewHtmlFile();
-+  m_impl->m_inHeading = outlineLevel != nullptr;
- 
-   m_impl->getSplitGuard().openLevel();
- 
-@@ -366,6 +369,9 @@ void EPUBTextGenerator::insertText(const librevenge::RVNGString &text)
-   if (m_impl->m_inHeader || m_impl->m_inFooter)
-     m_impl->m_currentHeaderOrFooter->addInsertText(text);
- 
-+  if (m_impl->m_inHeading)
-+    m_impl->getHtmlManager().insertHeadingText(text.cstr());
-+
-   m_impl->getSplitGuard().incrementSize(text.len());
- 
-   m_impl->getHtml()->insertText(text);
--- 
-2.12.3
-
-From 8a3cc9733f567864ad0658cf1a25c60d5e7205a6 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Thu, 17 Aug 2017 12:01:44 +0200
-Subject: [PATCH] EPUB_SPLIT_METHOD_HEADING: fix unexpected text in chapter
- names
-
-We used to add text for all headings for the chapter name, but if we
-split on heading 1, then text of heading2+ should not be included.
----
- src/lib/EPUBSplitGuard.cpp    | 14 ++++++++++++++
- src/lib/EPUBSplitGuard.h      |  3 +++
- src/lib/EPUBTextGenerator.cpp |  6 ++----
- 3 files changed, 19 insertions(+), 4 deletions(-)
-
-diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
-index 15ba20f..25eae87 100644
---- a/src/lib/EPUBSplitGuard.cpp
-+++ b/src/lib/EPUBSplitGuard.cpp
-@@ -18,6 +18,7 @@ static const unsigned DEFAULT_SPLIT_SIZE = 1 << 16;
- EPUBSplitGuard::EPUBSplitGuard(const EPUBSplitMethod method)
-   : m_method(method)
-   , m_headingLevel(DEFAULT_SPLIT_HEADING_LEVEL)
-+  , m_currentHeadingLevel(0)
-   , m_size(DEFAULT_SPLIT_SIZE)
-   , m_currentSize(0)
-   , m_nestingLevel(0)
-@@ -29,6 +30,11 @@ void EPUBSplitGuard::setSplitHeadingLevel(const unsigned level)
-   m_headingLevel = level;
- }
- 
-+void EPUBSplitGuard::setCurrentHeadingLevel(const unsigned level)
-+{
-+  m_currentHeadingLevel = level;
-+}
-+
- void EPUBSplitGuard::setSplitSize(const unsigned size)
- {
-   m_size = size;
-@@ -59,6 +65,14 @@ bool EPUBSplitGuard::splitOnHeading(const unsigned level) const
-   return canSplit(EPUB_SPLIT_METHOD_HEADING) && (m_headingLevel >= level);
- }
- 
-+bool EPUBSplitGuard::inHeading() const
-+{
-+  if (!m_currentHeadingLevel)
-+    return false;
-+
-+  return m_headingLevel >= m_currentHeadingLevel;
-+}
-+
- bool EPUBSplitGuard::splitOnSize() const
- {
-   return canSplit(EPUB_SPLIT_METHOD_SIZE) && (m_size <= m_currentSize);
-diff --git a/src/lib/EPUBSplitGuard.h b/src/lib/EPUBSplitGuard.h
-index 17613ac..7bc53ce 100644
---- a/src/lib/EPUBSplitGuard.h
-+++ b/src/lib/EPUBSplitGuard.h
-@@ -21,6 +21,7 @@ public:
-   explicit EPUBSplitGuard(EPUBSplitMethod method);
- 
-   void setSplitHeadingLevel(unsigned level);
-+  void setCurrentHeadingLevel(unsigned level);
-   void setSplitSize(unsigned size);
- 
-   void openLevel();
-@@ -29,6 +30,7 @@ public:
- 
-   bool splitOnPageBreak() const;
-   bool splitOnHeading(unsigned level) const;
-+  bool inHeading() const;
-   bool splitOnSize() const;
- 
-   void onSplit();
-@@ -39,6 +41,7 @@ private:
- private:
-   const EPUBSplitMethod m_method;
-   unsigned m_headingLevel;
-+  unsigned m_currentHeadingLevel;
-   unsigned m_size;
-   unsigned m_currentSize;
-   unsigned m_nestingLevel;
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index b1e33f8..5206b37 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -67,7 +67,6 @@ public:
-   bool m_inPageSpan;
-   bool m_inHeader;
-   bool m_inFooter;
--  bool m_inHeading;
- 
-   RVNGPropertyList m_pageSpanProps;
-   shared_ptr<EPUBTextElements> m_currentHeader;
-@@ -89,7 +88,6 @@ EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod
-   , m_inPageSpan(false)
-   , m_inHeader(false)
-   , m_inFooter(false)
--  , m_inHeading(false)
-   , m_pageSpanProps()
-   , m_currentHeader()
-   , m_currentFooter()
-@@ -262,7 +260,7 @@ void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propLi
-   const RVNGProperty *const outlineLevel = propList["text:outline-level"];
-   if (outlineLevel && m_impl->getSplitGuard().splitOnHeading(outlineLevel->getInt()))
-     m_impl->startNewHtmlFile();
--  m_impl->m_inHeading = outlineLevel != nullptr;
-+  m_impl->getSplitGuard().setCurrentHeadingLevel(outlineLevel ? outlineLevel->getInt() : 0);
- 
-   m_impl->getSplitGuard().openLevel();
- 
-@@ -369,7 +367,7 @@ void EPUBTextGenerator::insertText(const librevenge::RVNGString &text)
-   if (m_impl->m_inHeader || m_impl->m_inFooter)
-     m_impl->m_currentHeaderOrFooter->addInsertText(text);
- 
--  if (m_impl->m_inHeading)
-+  if (m_impl->getSplitGuard().inHeading())
-     m_impl->getHtmlManager().insertHeadingText(text.cstr());
- 
-   m_impl->getSplitGuard().incrementSize(text.len());
--- 
-2.12.3
-
-From a4e85e191813e7c8f4e6b5bcf2458504f9d06aeb Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Tue, 22 Aug 2017 12:05:28 +0200
-Subject: [PATCH] EPUB_SPLIT_METHOD_HEADING: fix unexpected first chapter name
-
-If the structure of the document is like this:
-
- Heading 2
-Heading 1
- Heading 2
-Heading 1
- Heading 2
-
-Then this resulted in 3 chapters: Section 1, Heading 1 and Heading 1.
-The first one is unexpected; so in case we don't have a heading 1
-paragraph for the first section, then fall back to any other heading.
----
- src/lib/EPUBHTMLManager.cpp   | 8 ++++++++
- src/lib/EPUBHTMLManager.h     | 3 +++
- src/lib/EPUBSplitGuard.cpp    | 5 ++++-
- src/lib/EPUBSplitGuard.h      | 2 +-
- src/lib/EPUBTextGenerator.cpp | 2 +-
- 5 files changed, 17 insertions(+), 3 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index 5141f31..7753160 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -134,6 +134,14 @@ void EPUBHTMLManager::insertHeadingText(const std::string &text)
-   m_paths.back().appendTitle(text);
- }
- 
-+bool EPUBHTMLManager::hasHeadingText() const
-+{
-+  if (m_paths.empty())
-+    return false;
-+
-+  return !m_paths.back().getTitle().empty();
-+}
-+
- }
- 
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index 6b480c4..158b466 100644
---- a/src/lib/EPUBHTMLManager.h
-+++ b/src/lib/EPUBHTMLManager.h
-@@ -51,6 +51,9 @@ public:
-   /// Appends text to the title of the current heading.
-   void insertHeadingText(const std::string &text);
- 
-+  /// If the current heading has a title.
-+  bool hasHeadingText() const;
-+
- private:
-   EPUBManifest &m_manifest;
-   std::vector<EPUBPath> m_paths;
-diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
-index 25eae87..890500b 100644
---- a/src/lib/EPUBSplitGuard.cpp
-+++ b/src/lib/EPUBSplitGuard.cpp
-@@ -65,11 +65,14 @@ bool EPUBSplitGuard::splitOnHeading(const unsigned level) const
-   return canSplit(EPUB_SPLIT_METHOD_HEADING) && (m_headingLevel >= level);
- }
- 
--bool EPUBSplitGuard::inHeading() const
-+bool EPUBSplitGuard::inHeading(bool any) const
- {
-   if (!m_currentHeadingLevel)
-     return false;
- 
-+  if (any)
-+    return true;
-+
-   return m_headingLevel >= m_currentHeadingLevel;
- }
- 
-diff --git a/src/lib/EPUBSplitGuard.h b/src/lib/EPUBSplitGuard.h
-index 7bc53ce..1a74079 100644
---- a/src/lib/EPUBSplitGuard.h
-+++ b/src/lib/EPUBSplitGuard.h
-@@ -30,7 +30,7 @@ public:
- 
-   bool splitOnPageBreak() const;
-   bool splitOnHeading(unsigned level) const;
--  bool inHeading() const;
-+  bool inHeading(bool any) const;
-   bool splitOnSize() const;
- 
-   void onSplit();
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index 5206b37..a39f266 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -367,7 +367,7 @@ void EPUBTextGenerator::insertText(const librevenge::RVNGString &text)
-   if (m_impl->m_inHeader || m_impl->m_inFooter)
-     m_impl->m_currentHeaderOrFooter->addInsertText(text);
- 
--  if (m_impl->getSplitGuard().inHeading())
-+  if (m_impl->getSplitGuard().inHeading(!m_impl->getHtmlManager().hasHeadingText()))
-     m_impl->getHtmlManager().insertHeadingText(text.cstr());
- 
-   m_impl->getSplitGuard().incrementSize(text.len());
--- 
-2.12.3
-
-From 1376b91046ad50f3a443b6fd4887252c1922870c Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Tue, 22 Aug 2017 16:23:55 +0200
-Subject: [PATCH] EPUBHTMLGenerator: fix validation problem with non-page
- anchored images
-
-In most cases (except for at-page anchored images) there is a paragraph
-already opened, and writing <p> inside <span> results in a validation
-error.
-
-So just write <p> in case we're not in paragraph already.
----
- src/lib/EPUBHTMLGenerator.cpp | 35 +++++++++++++++++++++++++++++------
- 1 file changed, 29 insertions(+), 6 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 40c507e..019404f 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -360,6 +360,7 @@ struct EPUBHTMLGeneratorImpl
-     , m_stylesheetPath(stylesheetPath)
-     , m_actualPage(0)
-     , m_ignore(false)
-+    , m_frameAnchorTypes()
-     , m_actualSink()
-     , m_sinkStack()
-   {
-@@ -446,6 +447,8 @@ struct EPUBHTMLGeneratorImpl
-   int m_actualPage;
-   bool m_ignore;
- 
-+  std::stack<std::string> m_frameAnchorTypes;
-+
- protected:
-   std::unique_ptr<TextZoneSink> m_actualSink;
-   std::stack<std::unique_ptr<TextZoneSink>> m_sinkStack;
-@@ -846,8 +849,32 @@ void EPUBHTMLGenerator::closeTable()
-   m_impl->m_tableManager.closeTable();
- }
- 
--void EPUBHTMLGenerator::openFrame(const RVNGPropertyList & /* propList */) {}
--void EPUBHTMLGenerator::closeFrame() {}
-+void EPUBHTMLGenerator::openFrame(const RVNGPropertyList &propList)
-+{
-+  librevenge::RVNGPropertyList::Iter i(propList);
-+  std::string anchorType;
-+  for (i.rewind(); i.next();)
-+  {
-+    if (std::string("text:anchor-type") == i.key())
-+      anchorType = i()->getStr().cstr();
-+  }
-+
-+  if (anchorType == "page")
-+    // Other anchor types are already inside a paragraph.
-+    m_impl->output().openElement("p", RVNGPropertyList());
-+  m_impl->m_frameAnchorTypes.push(anchorType);
-+}
-+
-+void EPUBHTMLGenerator::closeFrame()
-+{
-+  if (m_impl->m_frameAnchorTypes.empty())
-+    return;
-+
-+  if (m_impl->m_frameAnchorTypes.top() == "page")
-+    m_impl->output().closeElement("p");
-+
-+  m_impl->m_frameAnchorTypes.pop();
-+}
- 
- void EPUBHTMLGenerator::openGroup(const librevenge::RVNGPropertyList & /* propList */) {}
- void EPUBHTMLGenerator::closeGroup() {}
-@@ -862,8 +889,6 @@ void EPUBHTMLGenerator::drawConnector(const librevenge::RVNGPropertyList & /* pr
- 
- void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- {
--  m_impl->output().openElement("p", RVNGPropertyList());
--
-   const EPUBPath &path = m_impl->m_imageManager.insert(
-                            RVNGBinaryData(propList["office:binary-data"]->getStr()),
-                            propList["librevenge:mime-type"]->getStr());
-@@ -873,8 +898,6 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
-   // FIXME: use alternative repr. if available
-   attrs.insert("alt", path.str().c_str());
-   m_impl->output().insertEmptyElement("img", attrs);
--
--  m_impl->output().closeElement("p");
- }
- 
- void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {}
--- 
-2.12.3
-
-From 89ae3e392890b9360d271f1c1796cb27e36be26f Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Thu, 24 Aug 2017 17:11:17 +0200
-Subject: [PATCH] EPUBTextGenerator: empty mime type is the same as no mime
- type
-
-epubcheck says:
-
-	ERROR(RSC-005): image.epub/OEBPS/content.opf(11,69): Error while parsing file: value of attribute "media-type" is invalid; must be a string matching the regular expression "[a-zA-Z0-9!#$&+\-\^_]+/[a-zA-Z0-9!#$&+\-\^_]+.*"
----
- src/lib/EPUBTextGenerator.cpp      |  2 +-
- src/test/EPUBTextGeneratorTest.cpp | 24 ++++++++++++++++++++++++
- 2 files changed, 25 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index a39f266..0f7f1e0 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -614,7 +614,7 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
-       newPropList.insert(iter.key(), iter()->clone());
-   }
- 
--  if (!mimetype || !data)
-+  if (!mimetype || mimetype->getStr().empty() || !data)
-   {
-     EPUBGEN_DEBUG_MSG(("invalid binary object dropped"));
-     return;
--- 
-2.12.3
-
-From 28e5e30c20aba54dff6505df4c03d6a3da0ee0f3 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Thu, 24 Aug 2017 17:41:49 +0200
-Subject: [PATCH] EPUBHTMLGenerator: sanitize URLs a bit in openLink()
-
-epubcheck warns on this:
-
-	WARNING(RSC-023): large.epub/OEBPS/sections/section0018.xhtml(2,5171): The URL 'https:///www.fsf.org' is missing 1 slash(es) '/' after the protocol 'https:'
----
- configure.ac                       |  1 +
- src/lib/EPUBHTMLGenerator.cpp      | 12 +++++++++++-
- src/test/EPUBTextGeneratorTest.cpp | 40 ++++++++++++++++++++++++++++++++++++++
- 3 files changed, 52 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 019404f..aa09332 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -12,6 +12,8 @@
- #include <stack>
- #include <string>
- 
-+#include <boost/algorithm/string/replace.hpp>
-+
- #include "EPUBHTMLGenerator.h"
- #include "EPUBImageManager.h"
- #include "EPUBListStyleManager.h"
-@@ -625,7 +627,15 @@ void EPUBHTMLGenerator::openLink(const RVNGPropertyList &propList)
-   }
-   RVNGPropertyList attrs;
-   if (propList["xlink:href"])
--    attrs.insert("href", propList["xlink:href"]->getStr().cstr());
-+  {
-+    std::string href(propList["xlink:href"]->getStr().cstr());
-+
-+    // Basic URL sanitization.
-+    boost::replace_all(href, "http:///", "http://");
-+    boost::replace_all(href, "https:///", "https://");
-+
-+    attrs.insert("href", href.c_str());
-+  }
-   m_impl->output(false).openElement("a", attrs);
- }
- 
--- 
-2.12.3
-
-From 143a470f190aaf2f420d2f84b5f08e9b01b40473 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Fri, 25 Aug 2017 17:44:38 +0200
-Subject: [PATCH] Export generator
-
----
- src/lib/EPUBGenerator.cpp          | 28 ++++++++++++++++++++++++++++
- src/test/EPUBTextGeneratorTest.cpp | 17 +++++++++++++++++
- 2 files changed, 45 insertions(+)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 4ce2964..1661064 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -7,6 +7,10 @@
-  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
-  */
- 
-+#ifdef HAVE_CONFIG_H
-+#include "config.h"
-+#endif
-+
- #include <ctime>
- #include <sstream>
- 
-@@ -298,6 +302,30 @@ void EPUBGenerator::writeRoot()
-     sink.openElement("meta", metaAttrs);
-     sink.insertCharacters(date);
-     sink.closeElement("meta");
-+
-+#ifdef VERSION
-+    const std::string version(VERSION);
-+#else
-+    const std::string version("unknown");
-+#endif
-+    std::string generator;
-+    if (m_metadata["meta:generator"])
-+      generator = m_metadata["meta:generator"]->getStr().cstr();
-+
-+    if (generator.empty())
-+      generator = "libepubgen/" + version;
-+    else
-+    {
-+      generator += " (";
-+      generator += "libepubgen/" + version;
-+      generator += ")";
-+    }
-+
-+    metaAttrs.clear();
-+    metaAttrs.insert("name", "generator");
-+    metaAttrs.insert("content", generator.c_str());
-+    sink.openElement("meta", metaAttrs);
-+    sink.closeElement("meta");
-   }
- 
-   sink.closeElement("metadata");
--- 
-2.12.3
-
-From 7e3b5186616326534b1ae95c6d2d188c5e522c7f Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Mon, 4 Sep 2017 17:18:49 +0200
-Subject: [PATCH] EPUBGenerator: always write author and title
-
-Some EPUB3 readers categorize books by author and then title, so if
-these are empty, then it's next to impossible to reach the export result
-there.
----
- src/lib/EPUBGenerator.cpp          | 11 ++++++++---
- src/test/EPUBTextGeneratorTest.cpp | 11 +++++++++++
- 2 files changed, 19 insertions(+), 3 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 1661064..3340643 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -260,15 +260,20 @@ void EPUBGenerator::writeRoot()
-   sink.insertCharacters(identifierCharactrs.c_str());
-   sink.closeElement("dc:identifier");
- 
--  // Zero-width space as it must be at least one character in length after
--  // white space has been trimmed.
--  RVNGString title("\u200b");
-+  RVNGString title("Unknown Title");
-   if (m_metadata["dc:title"] && !m_metadata["dc:title"]->getStr().empty())
-     title = m_metadata["dc:title"]->getStr();
-   sink.openElement("dc:title");
-   sink.insertCharacters(title);
-   sink.closeElement("dc:title");
- 
-+  RVNGString creator("Unknown Author");
-+  if (m_metadata["meta:initial-creator"] && !m_metadata["meta:initial-creator"]->getStr().empty())
-+    creator = m_metadata["meta:initial-creator"]->getStr();
-+  sink.openElement("dc:creator");
-+  sink.insertCharacters(creator);
-+  sink.closeElement("dc:creator");
-+
-   RVNGString language("en");
-   if (m_metadata["dc:language"] && !m_metadata["dc:language"]->getStr().empty())
-     language = m_metadata["dc:language"]->getStr();
--- 
-2.12.3
-
-From bce7c05a18a4c5089d5ac77bc61b9f6978e7224b Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Fri, 8 Sep 2017 11:21:32 +0200
-Subject: [PATCH] EPUBHTMLGenerator: write un-escaped NBSP
-
-Package implementations are supposed to take care of escaping, like it
-was already a requirement for normal text.
----
- src/lib/EPUBHTMLGenerator.cpp      |  3 ++-
- src/test/EPUBTextGeneratorTest.cpp | 18 ++++++++++++++++++
- 2 files changed, 20 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index aa09332..ed968bf 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -681,7 +681,8 @@ void EPUBHTMLGenerator::insertSpace()
- {
-   if (m_impl->m_ignore)
-     return;
--  m_impl->output().insertCharacters(" ");
-+  // NBSP.
-+  m_impl->output().insertCharacters("\xc2\xa0");
- }
- 
- void EPUBHTMLGenerator::openOrderedListLevel(const RVNGPropertyList &propList)
--- 
-2.12.3
-
-From 7cf3c6541a61f9d74cd51fb2a01344df783cb26d Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Fri, 8 Sep 2017 16:25:36 +0200
-Subject: [PATCH] EPUBTextGenerator: ignore invalid media types
-
-This assumes there is no image type that is valid in EPUB2, but not in
-EPUB3.
----
- src/lib/EPUBTextGenerator.cpp      | 26 +++++++++++++++++++++++++-
- src/test/EPUBTextGeneratorTest.cpp | 23 +++++++++++++++++++++++
- 2 files changed, 48 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index 0f7f1e0..1bd1e16 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -595,6 +595,27 @@ void EPUBTextGenerator::closeFrame()
-   m_impl->getHtml()->closeFrame();
- }
- 
-+/// Checks if the media type is an EPUB 3 Core Media Type or not.
-+static bool isValidMimeType(const RVNGString& mediaType)
-+{
-+  // Defined at <https://idpf.github.io/epub-cmt/v3/#sec-cmt-supported>.
-+  static char const *(types[])=
-+  {
-+    "image/gif",
-+    "image/png",
-+    "image/jpeg",
-+    "image/svg+xml"
-+  };
-+
-+  for (const auto& i : types)
-+  {
-+    if (mediaType == i)
-+      return true;
-+  }
-+
-+  return false;
-+}
-+
- void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &propList)
- {
-   if (m_impl->getSplitGuard().splitOnSize())
-@@ -607,7 +628,10 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
-   for (RVNGPropertyList::Iter iter(propList); !iter.last(); iter.next())
-   {
-     if (RVNGString("librevenge:mime-type") == iter.key())
--      mimetype.reset(iter()->clone());
-+    {
-+      if (isValidMimeType(iter()->getStr()))
-+        mimetype.reset(iter()->clone());
-+    }
-     else if (RVNGString("office:binary-data") == iter.key())
-       data.reset(iter()->clone());
-     else
--- 
-2.12.3
-
-From 7be89d1881e175182039ca93a1546d79933cab85 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Mon, 11 Sep 2017 11:03:03 +0200
-Subject: [PATCH] EPUBSpanStyleManager: ignore line though type/style 'none'
-
-In CSS this is a boolean property, but in ODF it's an enum, so map none
-to false and everything else to true.
----
- src/lib/EPUBSpanStyleManager.cpp   | 11 +++++++-
- src/lib/EPUBTextGenerator.cpp      |  4 +--
- src/test/EPUBTextGeneratorTest.cpp | 58 ++++++++++++++++++++++++++++++++++++--
- 3 files changed, 68 insertions(+), 5 deletions(-)
-
-diff --git a/src/lib/EPUBSpanStyleManager.cpp b/src/lib/EPUBSpanStyleManager.cpp
-index 4887858..211946c 100644
---- a/src/lib/EPUBSpanStyleManager.cpp
-+++ b/src/lib/EPUBSpanStyleManager.cpp
-@@ -137,8 +137,17 @@ void EPUBSpanStyleManager::extractDecorations(RVNGPropertyList const &pList, EPU
-   // replaceme by text-decoration-line when its implementation will appear in browser
-   std::stringstream s;
- 
--  if (pList["style:text-line-through-style"] || pList["style:text-line-through-type"])
-+  // line-though style or type 'none' is not line-though, everything else is.
-+  const librevenge::RVNGProperty *textLineThoughStyle = pList["style:text-line-through-style"];
-+  bool lineThough = textLineThoughStyle && textLineThoughStyle->getStr() != "none";
-+  if (!lineThough)
-+  {
-+    const librevenge::RVNGProperty *textLineThoughType = pList["style:text-line-through-type"];
-+    lineThough = textLineThoughType && textLineThoughType->getStr() != "none";
-+  }
-+  if (lineThough)
-     s << " line-through";
-+
-   if (pList["style:text-overline-style"] || pList["style:text-overline-type"])
-     s << " overline";
-   if (pList["style:text-underline-style"] || pList["style:text-underline-type"])
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index 1bd1e16..07aa50d 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -596,7 +596,7 @@ void EPUBTextGenerator::closeFrame()
- }
- 
- /// Checks if the media type is an EPUB 3 Core Media Type or not.
--static bool isValidMimeType(const RVNGString& mediaType)
-+static bool isValidMimeType(const RVNGString &mediaType)
- {
-   // Defined at <https://idpf.github.io/epub-cmt/v3/#sec-cmt-supported>.
-   static char const *(types[])=
-@@ -607,7 +607,7 @@ static bool isValidMimeType(const RVNGString& mediaType)
-     "image/svg+xml"
-   };
- 
--  for (const auto& i : types)
-+  for (const auto &i : types)
-   {
-     if (mediaType == i)
-       return true;
--- 
-2.12.3
-
-From d8ee84ff50a6113f49105a70f946b23acfa2566f Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Mon, 18 Sep 2017 17:49:13 +0200
-Subject: [PATCH] [ABI CHANGE] optionally support not writing formatting to CSS
- files
-
-This should help a number of poor readers, which don't support the old
-method. Examples:
-
-- Sigil
-- Readium
-- Moon+ reader
-- Calibre
-- MS Edge
----
- inc/libepubgen/EPUBTextGenerator.h    |  1 +
- inc/libepubgen/libepubgen-decls.h     |  8 ++++++++
- src/lib/EPUBGenerator.cpp             |  8 +++++++-
- src/lib/EPUBGenerator.h               |  3 +++
- src/lib/EPUBHTMLGenerator.cpp         | 29 ++++++++++++++++++++++++-----
- src/lib/EPUBHTMLGenerator.h           |  2 +-
- src/lib/EPUBHTMLManager.cpp           |  4 ++--
- src/lib/EPUBHTMLManager.h             |  2 +-
- src/lib/EPUBParagraphStyleManager.cpp | 11 +++++++++++
- src/lib/EPUBParagraphStyleManager.h   |  2 ++
- src/lib/EPUBSpanStyleManager.cpp      | 11 +++++++++++
- src/lib/EPUBSpanStyleManager.h        |  2 ++
- src/lib/EPUBTextGenerator.cpp         |  5 +++++
- src/test/EPUBTextGeneratorTest.cpp    | 26 ++++++++++++++++++++++++++
- 14 files changed, 104 insertions(+), 10 deletions(-)
-
-diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h
-index 664f673..cb2d9a6 100644
---- a/inc/libepubgen/EPUBTextGenerator.h
-+++ b/inc/libepubgen/EPUBTextGenerator.h
-@@ -42,6 +42,7 @@ public:
- 
-   void setSplitHeadingLevel(unsigned level);
-   void setSplitSize(unsigned size);
-+  void setStylesMethod(EPUBStylesMethod styles);
- 
-   /** Register a handler for embedded images.
-     *
-diff --git a/inc/libepubgen/libepubgen-decls.h b/inc/libepubgen/libepubgen-decls.h
-index 3fb0220..2657a2d 100644
---- a/inc/libepubgen/libepubgen-decls.h
-+++ b/inc/libepubgen/libepubgen-decls.h
-@@ -61,6 +61,14 @@ typedef bool (*EPUBEmbeddedImage)(const librevenge::RVNGBinaryData &input, libre
-   */
- typedef bool (*EPUBEmbeddedObject)(const librevenge::RVNGBinaryData &data, const EPUBEmbeddingContact &contact);
- 
-+/** The possible ways to represent styles in CSS/HTML files.
-+  */
-+enum EPUBStylesMethod
-+{
-+  EPUB_STYLES_METHOD_CSS, //< The styles will be described in a seprarate CSS file.
-+  EPUB_STYLES_METHOD_INLINE, //< The styles will be described inline.
-+};
-+
- }
- 
- #endif // INCLUDED_LIBEPUBGEN_LIBEPUBGEN_DECLS_H
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 3340643..75c3076 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -45,6 +45,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
-   , m_currentHtml()
-   , m_splitGuard(split)
-   , m_version(version)
-+  , m_stylesMethod(EPUB_STYLES_METHOD_CSS)
- {
- }
- 
-@@ -96,7 +97,7 @@ void EPUBGenerator::startNewHtmlFile()
- 
-   m_splitGuard.onSplit();
- 
--  m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath);
-+  m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod);
- 
-   // restore state in the new file
-   m_currentHtml->startDocument(m_documentProps);
-@@ -130,6 +131,11 @@ int EPUBGenerator::getVersion() const
-   return m_version;
- }
- 
-+void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles)
-+{
-+  m_stylesMethod = styles;
-+}
-+
- void EPUBGenerator::writeContainer()
- {
-   EPUBXMLSink sink;
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index f98c80f..099eb4a 100644
---- a/src/lib/EPUBGenerator.h
-+++ b/src/lib/EPUBGenerator.h
-@@ -51,6 +51,8 @@ public:
-   EPUBSplitGuard &getSplitGuard();
-   int getVersion() const;
- 
-+  void setStylesMethod(EPUBStylesMethod stylesMethod);
-+
- private:
-   virtual void startHtmlFile() = 0;
-   virtual void endHtmlFile() = 0;
-@@ -80,6 +82,7 @@ private:
-   EPUBSplitGuard m_splitGuard;
- 
-   int m_version;
-+  EPUBStylesMethod m_stylesMethod;
- };
- 
- }
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index ed968bf..f3b30a6 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -351,7 +351,7 @@ std::string EPUBHTMLTextZone::label(int id) const
- struct EPUBHTMLGeneratorImpl
- {
-   //! constructor
--  EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath)
-+  EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
-     : m_document(document)
-     , m_imageManager(imageManager)
-     , m_listManager(listStyleManager)
-@@ -363,6 +363,7 @@ struct EPUBHTMLGeneratorImpl
-     , m_actualPage(0)
-     , m_ignore(false)
-     , m_frameAnchorTypes()
-+    , m_stylesMethod(stylesMethod)
-     , m_actualSink()
-     , m_sinkStack()
-   {
-@@ -451,6 +452,8 @@ struct EPUBHTMLGeneratorImpl
- 
-   std::stack<std::string> m_frameAnchorTypes;
- 
-+  EPUBStylesMethod m_stylesMethod;
-+
- protected:
-   std::unique_ptr<TextZoneSink> m_actualSink;
-   std::stack<std::unique_ptr<TextZoneSink>> m_sinkStack;
-@@ -461,8 +464,8 @@ private:
-   EPUBHTMLGeneratorImpl operator=(EPUBHTMLGeneratorImpl const &orig);
- };
- 
--EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath)
--  : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath))
-+EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
-+  : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod))
- {
- }
- 
-@@ -582,7 +585,15 @@ void EPUBHTMLGenerator::openParagraph(const RVNGPropertyList &propList)
-     return;
- 
-   RVNGPropertyList attrs;
--  attrs.insert("class", m_impl->m_paragraphManager.getClass(propList).c_str());
-+  switch (m_impl->m_stylesMethod)
-+  {
-+  case EPUB_STYLES_METHOD_CSS:
-+    attrs.insert("class", m_impl->m_paragraphManager.getClass(propList).c_str());
-+    break;
-+  case EPUB_STYLES_METHOD_INLINE:
-+    attrs.insert("style", m_impl->m_paragraphManager.getStyle(propList).c_str());
-+    break;
-+  }
-   m_impl->output(false).openElement("p", attrs);
- }
- 
-@@ -605,7 +616,15 @@ void EPUBHTMLGenerator::openSpan(const RVNGPropertyList &propList)
-     return;
- 
-   RVNGPropertyList attrs;
--  attrs.insert("class", m_impl->m_spanManager.getClass(propList).c_str());
-+  switch (m_impl->m_stylesMethod)
-+  {
-+  case EPUB_STYLES_METHOD_CSS:
-+    attrs.insert("class", m_impl->m_spanManager.getClass(propList).c_str());
-+    break;
-+  case EPUB_STYLES_METHOD_INLINE:
-+    attrs.insert("style", m_impl->m_spanManager.getStyle(propList).c_str());
-+    break;
-+  }
-   m_impl->output(false).openElement("span", attrs);
- }
- 
-diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h
-index 88059ec..d8783ed 100644
---- a/src/lib/EPUBHTMLGenerator.h
-+++ b/src/lib/EPUBHTMLGenerator.h
-@@ -30,7 +30,7 @@ class EPUBPath;
- class EPUBHTMLGenerator : public librevenge::RVNGTextInterface
- {
- public:
--  EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath);
-+  EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod);
-   ~EPUBHTMLGenerator() override;
- 
-   void setDocumentMetaData(const librevenge::RVNGPropertyList &propList) override;
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index 7753160..2dedb7f 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -41,7 +41,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
- {
- }
- 
--const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
- {
-   std::ostringstream nameBuf;
-   nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next();
-@@ -55,7 +55,7 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana
-   m_contents.push_back(EPUBXMLSink());
- 
-   const EPUBHTMLGeneratorPtr_t gen(
--    new EPUBHTMLGenerator(m_contents.back(), imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath));
-+    new EPUBHTMLGenerator(m_contents.back(), imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod));
- 
-   return gen;
- }
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index 158b466..f034657 100644
---- a/src/lib/EPUBHTMLManager.h
-+++ b/src/lib/EPUBHTMLManager.h
-@@ -41,7 +41,7 @@ class EPUBHTMLManager
- public:
-   explicit EPUBHTMLManager(EPUBManifest &manifest);
- 
--  const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath);
-+  const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod);
- 
-   void writeTo(EPUBPackage &package);
- 
-diff --git a/src/lib/EPUBParagraphStyleManager.cpp b/src/lib/EPUBParagraphStyleManager.cpp
-index b03f185..836e678 100644
---- a/src/lib/EPUBParagraphStyleManager.cpp
-+++ b/src/lib/EPUBParagraphStyleManager.cpp
-@@ -41,6 +41,17 @@ std::string EPUBParagraphStyleManager::getClass(RVNGPropertyList const &pList)
-   return s.str();
- }
- 
-+std::string EPUBParagraphStyleManager::getStyle(RVNGPropertyList const &pList)
-+{
-+  EPUBCSSProperties content;
-+  extractProperties(pList, false, content);
-+
-+  std::stringstream s;
-+  for (const auto &property : content)
-+    s << property.first << ": " << property.second << "; ";
-+  return s.str();
-+}
-+
- void EPUBParagraphStyleManager::defineParagraph(RVNGPropertyList const &propList)
- {
-   if (!propList["librevenge:paragraph-id"])
-diff --git a/src/lib/EPUBParagraphStyleManager.h b/src/lib/EPUBParagraphStyleManager.h
-index 2fdfff4..433f0e9 100644
---- a/src/lib/EPUBParagraphStyleManager.h
-+++ b/src/lib/EPUBParagraphStyleManager.h
-@@ -43,6 +43,8 @@ public:
-   void defineParagraph(librevenge::RVNGPropertyList const &pList);
-   //! returns the class name corresponding to a propertylist
-   std::string getClass(librevenge::RVNGPropertyList const &pList);
-+  //! returns the style string corresponding to a propertylist
-+  std::string getStyle(librevenge::RVNGPropertyList const &pList);
-   //! send the data to the sink
-   void send(EPUBCSSSink &out);
- protected:
-diff --git a/src/lib/EPUBSpanStyleManager.cpp b/src/lib/EPUBSpanStyleManager.cpp
-index 211946c..5e53ee2 100644
---- a/src/lib/EPUBSpanStyleManager.cpp
-+++ b/src/lib/EPUBSpanStyleManager.cpp
-@@ -41,6 +41,17 @@ std::string EPUBSpanStyleManager::getClass(RVNGPropertyList const &pList)
-   return s.str();
- }
- 
-+std::string EPUBSpanStyleManager::getStyle(RVNGPropertyList const &pList)
-+{
-+  EPUBCSSProperties content;
-+  extractProperties(pList, content);
-+
-+  std::stringstream s;
-+  for (const auto &property : content)
-+    s << property.first << ": " << property.second << "; ";
-+  return s.str();
-+}
-+
- void EPUBSpanStyleManager::defineSpan(RVNGPropertyList const &propList)
- {
-   if (!propList["librevenge:span-id"])
-diff --git a/src/lib/EPUBSpanStyleManager.h b/src/lib/EPUBSpanStyleManager.h
-index 263ab3a..ec9d0e5 100644
---- a/src/lib/EPUBSpanStyleManager.h
-+++ b/src/lib/EPUBSpanStyleManager.h
-@@ -43,6 +43,8 @@ public:
-   void defineSpan(librevenge::RVNGPropertyList const &pList);
-   //! returns the class name corresponding to a propertylist
-   std::string getClass(librevenge::RVNGPropertyList const &pList);
-+  //! returns the style string corresponding to a propertylist
-+  std::string getStyle(librevenge::RVNGPropertyList const &pList);
-   //! send the data to the sink
-   void send(EPUBCSSSink &out);
- protected:
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index 07aa50d..26675af 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -142,6 +142,11 @@ void EPUBTextGenerator::setSplitSize(const unsigned size)
-   m_impl->getSplitGuard().setSplitSize(size);
- }
- 
-+void EPUBTextGenerator::setStylesMethod(EPUBStylesMethod styles)
-+{
-+  m_impl->setStylesMethod(styles);
-+}
-+
- void EPUBTextGenerator::registerEmbeddedImageHandler(const librevenge::RVNGString &mimeType, EPUBEmbeddedImage imageHandler)
- {
-   if (!mimeType.empty() && imageHandler)
--- 
-2.12.3
-
-From 4f46bc715a5fc8a0e13bb1596f6f5dbb55ca0632 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Tue, 17 Oct 2017 10:22:35 +0200
-Subject: [PATCH] EPUBSpanStyleManager: ignore underline type/style 'none'
-
-This is similar to commit 7be89d1881e175182039ca93a1546d79933cab85
-(EPUBSpanStyleManager: ignore line though type/style 'none',
-2017-09-11).
----
- src/lib/EPUBSpanStyleManager.cpp   |  9 ++++++++-
- src/test/EPUBTextGeneratorTest.cpp | 22 ++++++++++++++++++++++
- 2 files changed, 30 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBSpanStyleManager.cpp b/src/lib/EPUBSpanStyleManager.cpp
-index 5e53ee2..e25fa26 100644
---- a/src/lib/EPUBSpanStyleManager.cpp
-+++ b/src/lib/EPUBSpanStyleManager.cpp
-@@ -161,7 +161,14 @@ void EPUBSpanStyleManager::extractDecorations(RVNGPropertyList const &pList, EPU
- 
-   if (pList["style:text-overline-style"] || pList["style:text-overline-type"])
-     s << " overline";
--  if (pList["style:text-underline-style"] || pList["style:text-underline-type"])
-+  const librevenge::RVNGProperty *textUnderlineStyle = pList["style:text-underline-style"];
-+  bool underline = textUnderlineStyle && textUnderlineStyle->getStr() != "none";
-+  if (!underline)
-+  {
-+    const librevenge::RVNGProperty *textUnderlineType = pList["style:text-underline-type"];
-+    underline = textUnderlineType && textUnderlineType->getStr() != "none";
-+  }
-+  if (underline)
-     s << " underline";
-   if (s.str().length())
-     cssProps["text-decoration"] = s.str();
--- 
-2.12.3
-
-From 383f315b067e9fc1aa840913c581e7451949c2db Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos at collabora.co.uk>
-Date: Tue, 17 Oct 2017 12:21:26 +0200
-Subject: [PATCH] EPUBHTMLGenerator: better handling of empty paragraphs
-
-The ODF/librevenge concept is that empty paragraphs still take their
-vertical space, i.e. inserting lots of them is a (poor) equivalent of a
-page break.
-
-HTML collapses empty paragraphs by default, so empty paragraphs need
-some content to preserve this effect. Do the same trick what LibreOffice
-Writer does: if the text has no content, add a <br/> element inside the
-paragraph.
----
- src/lib/EPUBHTMLGenerator.cpp      |  8 ++++++++
- src/test/EPUBTextGeneratorTest.cpp | 15 +++++++++++++++
- 2 files changed, 23 insertions(+)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index f3b30a6..d822571 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -362,6 +362,7 @@ struct EPUBHTMLGeneratorImpl
-     , m_stylesheetPath(stylesheetPath)
-     , m_actualPage(0)
-     , m_ignore(false)
-+    , m_hasText(false)
-     , m_frameAnchorTypes()
-     , m_stylesMethod(stylesMethod)
-     , m_actualSink()
-@@ -449,6 +450,8 @@ struct EPUBHTMLGeneratorImpl
- 
-   int m_actualPage;
-   bool m_ignore;
-+  /// Does the currently opened paragraph have some text?
-+  bool m_hasText;
- 
-   std::stack<std::string> m_frameAnchorTypes;
- 
-@@ -595,6 +598,7 @@ void EPUBHTMLGenerator::openParagraph(const RVNGPropertyList &propList)
-     break;
-   }

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list