summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--RepositoryExternal.mk2
-rw-r--r--config_host/config_libepubgen.h.in16
-rw-r--r--configure.ac22
-rw-r--r--download.lst4
-rw-r--r--external/libepubgen/UnpackedTarball_libepubgen.mk11
-rw-r--r--external/libepubgen/libepubgen-epub3.patch.16419
-rw-r--r--external/libepubgen/libepubgen-validation1.patch.149
-rw-r--r--external/libepubgen/libepubgen-validation2.patch.134
-rw-r--r--external/libepubgen/libepubgen-validation3.patch.135
-rw-r--r--external/libepubgen/libepubgen-vc.patch.159
-rw-r--r--writerperfect/Module_writerperfect.mk2
-rw-r--r--writerperfect/source/writer/EPUBExportDialog.cxx2
-rw-r--r--writerperfect/source/writer/EPUBExportFilter.cxx16
13 files changed, 6 insertions, 6665 deletions
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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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;");
-+ // 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@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@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@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@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@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;
- }
- m_impl->output(false).openElement("p", attrs);
-+ m_impl->m_hasText = false;
- }
-
- void EPUBHTMLGenerator::closeParagraph()
-@@ -602,6 +606,9 @@ void EPUBHTMLGenerator::closeParagraph()
- if (m_impl->m_ignore)
- return;
-
-+ if (!m_impl->m_hasText)
-+ insertLineBreak();
-+
- m_impl->output().closeElement("p");
- }
-
-@@ -694,6 +701,7 @@ void EPUBHTMLGenerator::insertText(const RVNGString &text)
- if (m_impl->m_ignore)
- return;
- m_impl->output().insertCharacters(text);
-+ m_impl->m_hasText = true;
- }
-
- void EPUBHTMLGenerator::insertSpace()
---
-2.12.3
-
-From 8166fc972e3d4b930ad0baab164f99b3c717252e Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 18 Oct 2017 10:04:32 +0200
-Subject: [PATCH] EPUBTextGenerator: handle headings inside sections
-
-On one hand, we don't want to split inside a section as there might be
-elements we need to close/open at split boundary, OTOH this is currently
-not a problem as we don't produce any output for sections.
-
-So remove the level management for sections (this way allowing headings
-to split inside sections), let's get back to this when there is a
-concept how e.g. multiple columns would be represented in EPUB.
-
-Use case is when sections are used to just group paragraph together and
-mark all of them read-only: in this case it's unexpected that headings
-are handled differently to not-in-section ones.
----
- src/lib/EPUBHTMLGenerator.cpp | 14 ++++++++++++--
- src/lib/EPUBTextGenerator.cpp | 3 ---
- src/test/EPUBTextGeneratorTest.cpp | 38 ++++++++++++++++++++++++++++++++++++++
- 3 files changed, 50 insertions(+), 5 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index d822571..11bf7de 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -574,8 +574,18 @@ void EPUBHTMLGenerator::closeFooter()
- }
-
- void EPUBHTMLGenerator::defineSectionStyle(const RVNGPropertyList &) {}
--void EPUBHTMLGenerator::openSection(const RVNGPropertyList & /* propList */) {}
--void EPUBHTMLGenerator::closeSection() {}
-+
-+void EPUBHTMLGenerator::openSection(const RVNGPropertyList & /* propList */)
-+{
-+ // Once output is produced here, EPUBTextGenerator::openSection() will need
-+ // to call EPUBSplitGuard::openLevel().
-+}
-+
-+void EPUBHTMLGenerator::closeSection()
-+{
-+ // Once output is produced here, EPUBTextGenerator::closeSection() will need
-+ // to call EPUBSplitGuard::closeLevel().
-+}
-
- void EPUBHTMLGenerator::defineParagraphStyle(const RVNGPropertyList &propList)
- {
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index 26675af..5d4e8f2 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -335,15 +335,12 @@ void EPUBTextGenerator::openSection(const librevenge::RVNGPropertyList &propList
- {
- if (m_impl->getSplitGuard().splitOnSize())
- m_impl->startNewHtmlFile();
-- m_impl->getSplitGuard().openLevel();
-
- m_impl->getHtml()->openSection(propList);
- }
-
- void EPUBTextGenerator::closeSection()
- {
-- m_impl->getSplitGuard().closeLevel();
--
- m_impl->getHtml()->closeSection();
- }
-
---
-2.12.3
-
-From c5bb9ad8922c9f537f0d613d42c33487717455c3 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 18 Oct 2017 10:52:01 +0200
-Subject: [PATCH] EPUBHTMLGenerator: better handling of tabs
-
-Mapping ODF/librevenge tab to \t in HTML is not a great idea, as it's
-ignorable whitespace. Go with NBSPs and a breakable space instead, that
-is much closer visually (15 is just an arbitrary number, it's what MS
-Word uses in its HTML export, LO Writer HTML export doesn't handle
-this).
-
-Adapt the empty paragraph case to also use NBSP for consistency.
----
- src/lib/EPUBHTMLGenerator.cpp | 10 +++++++---
- src/test/EPUBTextGeneratorTest.cpp | 18 +++++++++++++++++-
- 2 files changed, 24 insertions(+), 4 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 11bf7de..25294c6 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -617,7 +617,7 @@ void EPUBHTMLGenerator::closeParagraph()
- return;
-
- if (!m_impl->m_hasText)
-- insertLineBreak();
-+ insertSpace();
-
- m_impl->output().closeElement("p");
- }
-@@ -687,8 +687,12 @@ void EPUBHTMLGenerator::insertTab()
- if (m_impl->m_ignore)
- return;
-
-- // Does not have a lot of effect since tabs in html are ignorable white-space
-- m_impl->output().insertCharacters("\t");
-+ // \t would not have a lot of effect since tabs in html are ignorable
-+ // white-space. Write NBSPs and a breakable space instead.
-+ for (int i = 0; i < 15; ++i)
-+ m_impl->output().insertCharacters("\xc2\xa0");
-+ m_impl->output().insertCharacters(" ");
-+ m_impl->m_hasText = true;
- }
-
- void EPUBHTMLGenerator::insertLineBreak()
---
-2.12.3
-
-From f3a04df200d818b4aaa9d54910b670cd6cf3149f Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Tue, 31 Oct 2017 15:50:50 +0100
-Subject: [PATCH] EPUBHTMLGenerator: librevenge:type -> xlink:type
-
-That's what libetonyek and LO's librevenge producer generates, also
-matches librevenge documentation. This isn't really a behavior change,
-just makes the warning go away in the xlink case.
----
- src/lib/EPUBHTMLGenerator.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 25294c6..0d39c00 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -657,9 +657,9 @@ void EPUBHTMLGenerator::openLink(const RVNGPropertyList &propList)
- if (m_impl->m_ignore)
- return;
-
-- if (!propList["librevenge:type"])
-+ if (!propList["xlink:type"])
- {
-- EPUBGEN_DEBUG_MSG(("EPUBHTMLGenerator::openLink: librevenge:type: not filled, suppose link\n"));
-+ EPUBGEN_DEBUG_MSG(("EPUBHTMLGenerator::openLink: xlink:type: not filled, suppose link\n"));
- }
- RVNGPropertyList attrs;
- if (propList["xlink:href"])
---
-2.12.3
-
-From c5e32608ecea8410b11760284d49e1f1958c6f75 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Tue, 31 Oct 2017 16:50:50 +0100
-Subject: [PATCH] EPUBTableStyleManager: handle EPUB_STYLES_METHOD_INLINE for
- rows
-
-This was working for paragraphs and spans only previously.
----
- src/lib/EPUBHTMLGenerator.cpp | 10 +++++++++-
- src/lib/EPUBTableStyleManager.cpp | 11 +++++++++++
- src/lib/EPUBTableStyleManager.h | 2 ++
- src/test/EPUBTextGeneratorTest.cpp | 28 ++++++++++++++++++++++++++++
- 4 files changed, 50 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 0d39c00..42e8e3e 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -858,7 +858,15 @@ void EPUBHTMLGenerator::openTableRow(const RVNGPropertyList &propList)
- if (m_impl->m_ignore)
- return;
- RVNGPropertyList attrs;
-- attrs.insert("class", m_impl->m_tableManager.getRowClass(propList).c_str());
-+ switch (m_impl->m_stylesMethod)
-+ {
-+ case EPUB_STYLES_METHOD_CSS:
-+ attrs.insert("class", m_impl->m_tableManager.getRowClass(propList).c_str());
-+ break;
-+ case EPUB_STYLES_METHOD_INLINE:
-+ attrs.insert("style", m_impl->m_tableManager.getRowStyle(propList).c_str());
-+ break;
-+ }
- m_impl->output().openElement("tr", attrs);
- }
-
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
-index 52b6959..ead9170 100644
---- a/src/lib/EPUBTableStyleManager.cpp
-+++ b/src/lib/EPUBTableStyleManager.cpp
-@@ -111,6 +111,17 @@ std::string EPUBTableStyleManager::getRowClass(RVNGPropertyList const &pList)
- return s.str();
- }
-
-+std::string EPUBTableStyleManager::getRowStyle(RVNGPropertyList const &pList)
-+{
-+ EPUBCSSProperties content;
-+ extractRowProperties(pList, content);
-+
-+ std::stringstream s;
-+ for (const auto &property : content)
-+ s << property.first << ": " << property.second << "; ";
-+ return s.str();
-+}
-+
- void EPUBTableStyleManager::send(EPUBCSSSink &out)
- {
- for (ContentNameMap_t::const_iterator it=m_cellContentNameMap.begin(); m_cellContentNameMap.end() != it; ++it)
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
-index e6d09bc..20056ad 100644
---- a/src/lib/EPUBTableStyleManager.h
-+++ b/src/lib/EPUBTableStyleManager.h
-@@ -47,6 +47,8 @@ public:
- std::string getCellClass(librevenge::RVNGPropertyList const &pList);
- //! returns the class name corresponding to a propertylist
- std::string getRowClass(librevenge::RVNGPropertyList const &pList);
-+ //! returns the style string corresponding to a propertylist
-+ std::string getRowStyle(librevenge::RVNGPropertyList const &pList);
- //! send the data to the sink
- void send(EPUBCSSSink &out);
- private:
---
-2.12.3
-
-From 258dcc4a98405238f4e32f89d122a7ccbb9a1357 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Tue, 31 Oct 2017 17:45:22 +0100
-Subject: [PATCH] EPUBTableStyleManager: handle EPUB_STYLES_METHOD_INLINE for
- cells
-
-So that a typical table has an empty CSS when requested.
----
- src/lib/EPUBHTMLGenerator.cpp | 10 +++++++++-
- src/lib/EPUBTableStyleManager.cpp | 11 +++++++++++
- src/lib/EPUBTableStyleManager.h | 2 ++
- src/test/EPUBTextGeneratorTest.cpp | 13 +++++++++----
- 4 files changed, 31 insertions(+), 5 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 42e8e3e..86b3ac2 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -882,7 +882,15 @@ void EPUBHTMLGenerator::openTableCell(const RVNGPropertyList &propList)
- if (m_impl->m_ignore)
- return;
- RVNGPropertyList attrs;
-- attrs.insert("class", m_impl->m_tableManager.getCellClass(propList).c_str());
-+ switch (m_impl->m_stylesMethod)
-+ {
-+ case EPUB_STYLES_METHOD_CSS:
-+ attrs.insert("class", m_impl->m_tableManager.getCellClass(propList).c_str());
-+ break;
-+ case EPUB_STYLES_METHOD_INLINE:
-+ attrs.insert("style", m_impl->m_tableManager.getCellStyle(propList).c_str());
-+ break;
-+ }
- if (propList["table:number-columns-spanned"])
- attrs.insert("colspan", propList["table:number-columns-spanned"]->getInt());
- if (propList["table:number-rows-spanned"])
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
-index ead9170..4e24611 100644
---- a/src/lib/EPUBTableStyleManager.cpp
-+++ b/src/lib/EPUBTableStyleManager.cpp
-@@ -98,6 +98,17 @@ std::string EPUBTableStyleManager::getCellClass(RVNGPropertyList const &pList)
- return s.str();
- }
-
-+std::string EPUBTableStyleManager::getCellStyle(RVNGPropertyList const &pList)
-+{
-+ EPUBCSSProperties content;
-+ extractCellProperties(pList, content);
-+
-+ std::stringstream s;
-+ for (const auto &property : content)
-+ s << property.first << ": " << property.second << "; ";
-+ return s.str();
-+}
-+
- std::string EPUBTableStyleManager::getRowClass(RVNGPropertyList const &pList)
- {
- EPUBCSSProperties content;
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
-index 20056ad..135a144 100644
---- a/src/lib/EPUBTableStyleManager.h
-+++ b/src/lib/EPUBTableStyleManager.h
-@@ -45,6 +45,8 @@ public:
- void closeTable();
- //! returns the class name corresponding to a propertylist
- std::string getCellClass(librevenge::RVNGPropertyList const &pList);
-+ //! returns the style string corresponding to a propertylist
-+ std::string getCellStyle(librevenge::RVNGPropertyList const &pList);
- //! returns the class name corresponding to a propertylist
- std::string getRowClass(librevenge::RVNGPropertyList const &pList);
- //! returns the style string corresponding to a propertylist
---
-2.12.3
-
-From 6c8e86ccebb11df7ece32d10da2894c6698c5515 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Thu, 2 Nov 2017 12:07:02 +0100
-Subject: [PATCH 1/4] EPUBTableStyleManager: witdh -> width
-
----
- src/lib/EPUBTableStyleManager.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
-index 4e24611..5795524 100644
---- a/src/lib/EPUBTableStyleManager.cpp
-+++ b/src/lib/EPUBTableStyleManager.cpp
-@@ -48,7 +48,7 @@ void EPUBTableStyleManager::closeTable()
- {
- if (!m_columWitdhsStack.size())
- {
-- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::closeTable: can not find the columns witdh\n"));
-+ EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::closeTable: can not find the columns width\n"));
- return;
- }
- m_columWitdhsStack.pop_back();
-@@ -61,7 +61,7 @@ bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w)
- std::vector<double> const &widths=m_columWitdhsStack.back();
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
- {
-- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns witdh\n"));
-+ EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
- return false;
- }
- bool fixed = true;
---
-2.13.6
-
-From 45bf16a8b384010814148538d86ee584b9295c7a Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 3 Nov 2017 12:30:13 +0100
-Subject: [PATCH 2/4] Witdh -> Width
-
----
- src/lib/EPUBTableStyleManager.cpp | 10 +++++-----
- src/lib/EPUBTableStyleManager.h | 4 ++--
- 2 files changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
-index 5795524..6f8b2af 100644
---- a/src/lib/EPUBTableStyleManager.cpp
-+++ b/src/lib/EPUBTableStyleManager.cpp
-@@ -41,24 +41,24 @@ void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
- }
- colWidths.push_back(width);
- }
-- m_columWitdhsStack.push_back(colWidths);
-+ m_columWidthsStack.push_back(colWidths);
- }
-
- void EPUBTableStyleManager::closeTable()
- {
-- if (!m_columWitdhsStack.size())
-+ if (!m_columWidthsStack.size())
- {
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::closeTable: can not find the columns width\n"));
- return;
- }
-- m_columWitdhsStack.pop_back();
-+ m_columWidthsStack.pop_back();
- }
-
- bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w) const
- {
-- if (!m_columWitdhsStack.size())
-+ if (!m_columWidthsStack.size())
- return false;
-- std::vector<double> const &widths=m_columWitdhsStack.back();
-+ std::vector<double> const &widths=m_columWidthsStack.back();
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
- {
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
-index 135a144..5f704a1 100644
---- a/src/lib/EPUBTableStyleManager.h
-+++ b/src/lib/EPUBTableStyleManager.h
-@@ -32,7 +32,7 @@ class EPUBTableStyleManager
-
- public:
- //! constructor
-- EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columWitdhsStack()
-+ EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columWidthsStack()
- {
- }
- //! destructor
-@@ -65,7 +65,7 @@ private:
- //! a map row content -> name
- ContentNameMap_t m_rowContentNameMap;
- //! a stack of column width (in inches )
-- std::vector<std::vector<double> > m_columWitdhsStack;
-+ std::vector<std::vector<double> > m_columWidthsStack;
-
- EPUBTableStyleManager(EPUBTableStyleManager const &orig);
- EPUBTableStyleManager operator=(EPUBTableStyleManager const &orig);
---
-2.13.6
-
-From 85fe982b2ad158f6e050c15e4a59d51d863cc28d Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 3 Nov 2017 15:33:35 +0100
-Subject: [PATCH 3/4] columWidths -> columnWidths
-
----
- src/lib/EPUBTableStyleManager.cpp | 10 +++++-----
- src/lib/EPUBTableStyleManager.h | 4 ++--
- 2 files changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
-index 6f8b2af..b610c20 100644
---- a/src/lib/EPUBTableStyleManager.cpp
-+++ b/src/lib/EPUBTableStyleManager.cpp
-@@ -41,24 +41,24 @@ void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
- }
- colWidths.push_back(width);
- }
-- m_columWidthsStack.push_back(colWidths);
-+ m_columnWidthsStack.push_back(colWidths);
- }
-
- void EPUBTableStyleManager::closeTable()
- {
-- if (!m_columWidthsStack.size())
-+ if (!m_columnWidthsStack.size())
- {
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::closeTable: can not find the columns width\n"));
- return;
- }
-- m_columWidthsStack.pop_back();
-+ m_columnWidthsStack.pop_back();
- }
-
- bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w) const
- {
-- if (!m_columWidthsStack.size())
-+ if (!m_columnWidthsStack.size())
- return false;
-- std::vector<double> const &widths=m_columWidthsStack.back();
-+ std::vector<double> const &widths=m_columnWidthsStack.back();
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
- {
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
-index 5f704a1..4de70e3 100644
---- a/src/lib/EPUBTableStyleManager.h
-+++ b/src/lib/EPUBTableStyleManager.h
-@@ -32,7 +32,7 @@ class EPUBTableStyleManager
-
- public:
- //! constructor
-- EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columWidthsStack()
-+ EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columnWidthsStack()
- {
- }
- //! destructor
-@@ -65,7 +65,7 @@ private:
- //! a map row content -> name
- ContentNameMap_t m_rowContentNameMap;
- //! a stack of column width (in inches )
-- std::vector<std::vector<double> > m_columWidthsStack;
-+ std::vector<std::vector<double> > m_columnWidthsStack;
-
- EPUBTableStyleManager(EPUBTableStyleManager const &orig);
- EPUBTableStyleManager operator=(EPUBTableStyleManager const &orig);
---
-2.13.6
-
-From 20930e2d8151fd2ec44feb9cdb8ca502df99365f Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 3 Nov 2017 17:00:12 +0100
-Subject: [PATCH 4/4] EPUBTableStyleManager: handle style:rel-column-width col
- prop
-
-Previously only fixed width was supported, but relative width works
-better for reflowable formats and ODF has markup to express this.
----
- src/lib/EPUBTableStyleManager.cpp | 42 ++++++++++++++++++++++++++++++++----
- src/lib/EPUBTableStyleManager.h | 6 +++++-
- src/test/EPUBTextGeneratorTest.cpp | 44 ++++++++++++++++++++++++++++++++++++++
- 3 files changed, 87 insertions(+), 5 deletions(-)
-
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
-index b610c20..92078a2 100644
---- a/src/lib/EPUBTableStyleManager.cpp
-+++ b/src/lib/EPUBTableStyleManager.cpp
-@@ -7,6 +7,7 @@
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-+#include <numeric>
- #include <sstream>
-
- #include <librevenge/librevenge.h>
-@@ -25,6 +26,7 @@ using librevenge::RVNGString;
- void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
- {
- std::vector<double> colWidths;
-+ std::vector<double> relColWidths;
- for (unsigned long i = 0; i < colList.count(); i++)
- {
- RVNGPropertyList const &prop=colList[i];
-@@ -40,8 +42,15 @@ void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
- width=prop["style:column-width"]->getDouble()/1440.;
- }
- colWidths.push_back(width);
-+
-+ if (prop["style:rel-column-width"])
-+ {
-+ width = prop["style:rel-column-width"]->getDouble();
-+ relColWidths.push_back(width);
-+ }
- }
- m_columnWidthsStack.push_back(colWidths);
-+ m_relColumnWidthsStack.push_back(relColWidths);
- }
-
- void EPUBTableStyleManager::closeTable()
-@@ -54,14 +63,18 @@ void EPUBTableStyleManager::closeTable()
- m_columnWidthsStack.pop_back();
- }
-
--bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w) const
-+namespace
- {
-- if (!m_columnWidthsStack.size())
-+bool extractColumnsWidth(const std::vector< std::vector<double> > &columnWidthsStack, int col, int numSpanned, bool relative, double &w)
-+{
-+ if (!columnWidthsStack.size())
- return false;
-- std::vector<double> const &widths=m_columnWidthsStack.back();
-+ std::vector<double> const &widths=columnWidthsStack.back();
-+ double total = std::accumulate(widths.begin(), widths.end(), static_cast<double>(0));
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
- {
-- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
-+ if (!relative)
-+ EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
- return false;
- }
- bool fixed = true;
-@@ -82,8 +95,22 @@ bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w)
- }
- }
- if (!fixed) w = -w;
-+ if (relative)
-+ // Expected unit is percents.
-+ w = w * 100 / total;
- return true;
- }
-+}
-+
-+bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w) const
-+{
-+ return extractColumnsWidth(m_columnWidthsStack, col, numSpanned, false, w);
-+}
-+
-+bool EPUBTableStyleManager::getRelColumnsWidth(int col, int numSpanned, double &w) const
-+{
-+ return extractColumnsWidth(m_relColumnWidthsStack, col, numSpanned, true, w);
-+}
-
- std::string EPUBTableStyleManager::getCellClass(RVNGPropertyList const &pList)
- {
-@@ -176,6 +203,13 @@ void EPUBTableStyleManager::extractCellProperties(RVNGPropertyList const &pList,
- width << -w << "in";
- cssProps["min-width"] = width.str();
- }
-+
-+ if (getRelColumnsWidth(c, span, w))
-+ {
-+ std::ostringstream width;
-+ width << w << "%";
-+ cssProps["width"] = width.str();
-+ }
- }
- if (pList["fo:text-align"])
- {
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
-index 4de70e3..24ae1a5 100644
---- a/src/lib/EPUBTableStyleManager.h
-+++ b/src/lib/EPUBTableStyleManager.h
-@@ -32,7 +32,7 @@ class EPUBTableStyleManager
-
- public:
- //! constructor
-- EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columnWidthsStack()
-+ EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columnWidthsStack(), m_relColumnWidthsStack()
- {
- }
- //! destructor
-@@ -60,12 +60,16 @@ private:
- void extractRowProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
- //! try to return the col width
- bool getColumnsWidth(int i, int numSpanned, double &w) const;
-+ //! try to return the relative col width
-+ bool getRelColumnsWidth(int i, int numSpanned, double &w) const;
- //! a map cell content -> name
- ContentNameMap_t m_cellContentNameMap;
- //! a map row content -> name
- ContentNameMap_t m_rowContentNameMap;
- //! a stack of column width (in inches )
- std::vector<std::vector<double> > m_columnWidthsStack;
-+ //! a stack of relative column width (in percents )
-+ std::vector<std::vector<double> > m_relColumnWidthsStack;
-
- EPUBTableStyleManager(EPUBTableStyleManager const &orig);
- EPUBTableStyleManager operator=(EPUBTableStyleManager const &orig);
---
-2.13.6
-
-From d5bd8c9078eeb63769ff1807be1a9571430eaed1 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Mon, 6 Nov 2017 10:19:32 +0100
-Subject: [PATCH] EPUBTableStyleManager: handle table props
-
-Other than column properties. Only width and relative width for now.
----
- src/lib/EPUBHTMLGenerator.cpp | 16 +++++--
- src/lib/EPUBTableStyleManager.cpp | 87 ++++++++++++++++++++++++++++----------
- src/lib/EPUBTableStyleManager.h | 12 +++++-
- src/test/EPUBTextGeneratorTest.cpp | 27 ++++++++++++
- 4 files changed, 114 insertions(+), 28 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 86b3ac2..e00bea8 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -846,10 +846,18 @@ void EPUBHTMLGenerator::openTable(const RVNGPropertyList &propList)
- if (m_impl->m_ignore)
- return;
-
-- const librevenge::RVNGPropertyListVector *columns = propList.child("librevenge:table-columns");
-- if (columns)
-- m_impl->m_tableManager.openTable(*columns);
-- m_impl->output().openElement("table", RVNGPropertyList());
-+ m_impl->m_tableManager.openTable(propList);
-+ RVNGPropertyList attrs;
-+ switch (m_impl->m_stylesMethod)
-+ {
-+ case EPUB_STYLES_METHOD_CSS:
-+ attrs.insert("class", m_impl->m_tableManager.getTableClass(propList).c_str());
-+ break;
-+ case EPUB_STYLES_METHOD_INLINE:
-+ attrs.insert("style", m_impl->m_tableManager.getTableStyle(propList).c_str());
-+ break;
-+ }
-+ m_impl->output().openElement("table", attrs);
- m_impl->output().openElement("tbody", RVNGPropertyList());
- }
-
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
-index 92078a2..d5e650c 100644
---- a/src/lib/EPUBTableStyleManager.cpp
-+++ b/src/lib/EPUBTableStyleManager.cpp
-@@ -23,34 +23,38 @@ using librevenge::RVNGPropertyList;
- using librevenge::RVNGPropertyListVector;
- using librevenge::RVNGString;
-
--void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
-+void EPUBTableStyleManager::openTable(RVNGPropertyList const &propList)
- {
-- std::vector<double> colWidths;
-- std::vector<double> relColWidths;
-- for (unsigned long i = 0; i < colList.count(); i++)
-+ const librevenge::RVNGPropertyListVector *columns = propList.child("librevenge:table-columns");
-+ if (columns)
- {
-- RVNGPropertyList const &prop=colList[i];
-- double width=0;
-- if (prop["style:column-width"])
-+ std::vector<double> colWidths;
-+ std::vector<double> relColWidths;
-+ for (unsigned long i = 0; i < columns->count(); i++)
- {
-- librevenge::RVNGUnit unit=prop["style:column-width"]->getUnit();
-- if (unit==librevenge::RVNG_POINT)
-- width=prop["style:column-width"]->getDouble()/72.;
-- else if (unit==librevenge::RVNG_INCH)
-- width=prop["style:column-width"]->getDouble();
-- else if (unit==librevenge::RVNG_TWIP)
-- width=prop["style:column-width"]->getDouble()/1440.;
-- }
-- colWidths.push_back(width);
-+ RVNGPropertyList const &prop=(*columns)[i];
-+ double width=0;
-+ if (prop["style:column-width"])
-+ {
-+ librevenge::RVNGUnit unit=prop["style:column-width"]->getUnit();
-+ if (unit==librevenge::RVNG_POINT)
-+ width=prop["style:column-width"]->getDouble()/72.;
-+ else if (unit==librevenge::RVNG_INCH)
-+ width=prop["style:column-width"]->getDouble();
-+ else if (unit==librevenge::RVNG_TWIP)
-+ width=prop["style:column-width"]->getDouble()/1440.;
-+ }
-+ colWidths.push_back(width);
-
-- if (prop["style:rel-column-width"])
-- {
-- width = prop["style:rel-column-width"]->getDouble();
-- relColWidths.push_back(width);
-+ if (prop["style:rel-column-width"])
-+ {
-+ width = prop["style:rel-column-width"]->getDouble();
-+ relColWidths.push_back(width);
-+ }
- }
-+ m_columnWidthsStack.push_back(colWidths);
-+ m_relColumnWidthsStack.push_back(relColWidths);
- }
-- m_columnWidthsStack.push_back(colWidths);
-- m_relColumnWidthsStack.push_back(relColWidths);
- }
-
- void EPUBTableStyleManager::closeTable()
-@@ -160,6 +164,30 @@ std::string EPUBTableStyleManager::getRowStyle(RVNGPropertyList const &pList)
- return s.str();
- }
-
-+std::string EPUBTableStyleManager::getTableClass(RVNGPropertyList const &pList)
-+{
-+ EPUBCSSProperties content;
-+ extractTableProperties(pList, content);
-+ ContentNameMap_t::const_iterator it=m_tableContentNameMap.find(content);
-+ if (it != m_tableContentNameMap.end())
-+ return it->second;
-+ std::stringstream s;
-+ s << "table" << m_tableContentNameMap.size();
-+ m_tableContentNameMap[content]=s.str();
-+ return s.str();
-+}
-+
-+std::string EPUBTableStyleManager::getTableStyle(RVNGPropertyList const &pList)
-+{
-+ EPUBCSSProperties content;
-+ extractTableProperties(pList, content);
-+
-+ std::stringstream s;
-+ for (const auto &property : content)
-+ s << property.first << ": " << property.second << "; ";
-+ return s.str();
-+}
-+
- void EPUBTableStyleManager::send(EPUBCSSSink &out)
- {
- for (ContentNameMap_t::const_iterator it=m_cellContentNameMap.begin(); m_cellContentNameMap.end() != it; ++it)
-@@ -175,6 +203,13 @@ void EPUBTableStyleManager::send(EPUBCSSSink &out)
- fillPropertyList(it->first, props);
- out.insertRule(("." + it->second).c_str(), props);
- }
-+
-+ for (ContentNameMap_t::const_iterator it=m_tableContentNameMap.begin(); m_tableContentNameMap.end() != it; ++it)
-+ {
-+ RVNGPropertyList props;
-+ fillPropertyList(it->first, props);
-+ out.insertRule(("." + it->second).c_str(), props);
-+ }
- }
-
- void EPUBTableStyleManager::extractCellProperties(RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const
-@@ -244,6 +279,14 @@ void EPUBTableStyleManager::extractRowProperties(RVNGPropertyList const &pList,
- cssProps["height"] = pList["style:row-height"]->getStr().cstr();
- }
-
-+void EPUBTableStyleManager::extractTableProperties(RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const
-+{
-+ if (pList["style:rel-width"])
-+ cssProps["width"] = pList["style:rel-width"]->getStr().cstr();
-+ else if (pList["style:width"])
-+ cssProps["width"] = pList["style:width"]->getStr().cstr();
-+}
-+
- }
-
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
-index 24ae1a5..ab1f9e6 100644
---- a/src/lib/EPUBTableStyleManager.h
-+++ b/src/lib/EPUBTableStyleManager.h
-@@ -32,7 +32,7 @@ class EPUBTableStyleManager
-
- public:
- //! constructor
-- EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columnWidthsStack(), m_relColumnWidthsStack()
-+ EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_tableContentNameMap(), m_columnWidthsStack(), m_relColumnWidthsStack()
- {
- }
- //! destructor
-@@ -40,7 +40,7 @@ public:
- {
- }
- //! open a table
-- void openTable(librevenge::RVNGPropertyListVector const &colList);
-+ void openTable(librevenge::RVNGPropertyList const &propList);
- //! close a table
- void closeTable();
- //! returns the class name corresponding to a propertylist
-@@ -51,6 +51,10 @@ public:
- std::string getRowClass(librevenge::RVNGPropertyList const &pList);
- //! returns the style string corresponding to a propertylist
- std::string getRowStyle(librevenge::RVNGPropertyList const &pList);
-+ //! returns the class name corresponding to a propertylist
-+ std::string getTableClass(librevenge::RVNGPropertyList const &pList);
-+ //! returns the style string corresponding to a propertylist
-+ std::string getTableStyle(librevenge::RVNGPropertyList const &pList);
- //! send the data to the sink
- void send(EPUBCSSSink &out);
- private:
-@@ -58,6 +62,8 @@ private:
- void extractCellProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
- //! convert a property list into a CSS property map
- void extractRowProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
-+ //! convert a property list into a CSS property map
-+ void extractTableProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
- //! try to return the col width
- bool getColumnsWidth(int i, int numSpanned, double &w) const;
- //! try to return the relative col width
-@@ -66,6 +72,8 @@ private:
- ContentNameMap_t m_cellContentNameMap;
- //! a map row content -> name
- ContentNameMap_t m_rowContentNameMap;
-+ //! a map table content -> name
-+ ContentNameMap_t m_tableContentNameMap;
- //! a stack of column width (in inches )
- std::vector<std::vector<double> > m_columnWidthsStack;
- //! a stack of relative column width (in percents )
---
-2.13.6
-
-From 801367ee905aa70bb2ba2ad5b8257cd2a25bed9b Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 8 Nov 2017 10:50:11 +0100
-Subject: [PATCH] EPUBImageManager: add support for borders
-
-The properties are on the frame, but the inner binary object emits the
-"img" element that has the properties in XHTML. Solve this by
-maintaining a stack of currently opened frames, with their properties.
----
- src/lib/EPUBGenerator.cpp | 1 +
- src/lib/EPUBHTMLGenerator.cpp | 26 ++++++++++++++++++++
- src/lib/EPUBImageManager.cpp | 50 ++++++++++++++++++++++++++++++++++++++
- src/lib/EPUBImageManager.h | 16 ++++++++++++
- src/test/EPUBTextGeneratorTest.cpp | 26 ++++++++++++++++++++
- 5 files changed, 119 insertions(+)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 75c3076..38c3188 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -230,6 +230,7 @@ void EPUBGenerator::writeStylesheet()
- m_paragraphStyleManager.send(sink);
- m_spanStyleManager.send(sink);
- m_tableStyleManager.send(sink);
-+ m_imageManager.send(sink);
-
- sink.writeTo(*m_package, m_stylesheetPath.str().c_str());
- }
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index e00bea8..4ffa55d 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -364,6 +364,7 @@ struct EPUBHTMLGeneratorImpl
- , m_ignore(false)
- , m_hasText(false)
- , m_frameAnchorTypes()
-+ , m_framePropertiesStack()
- , m_stylesMethod(stylesMethod)
- , m_actualSink()
- , m_sinkStack()
-@@ -454,6 +455,7 @@ struct EPUBHTMLGeneratorImpl
- bool m_hasText;
-
- std::stack<std::string> m_frameAnchorTypes;
-+ std::stack<RVNGPropertyList> m_framePropertiesStack;
-
- EPUBStylesMethod m_stylesMethod;
-
-@@ -929,20 +931,29 @@ void EPUBHTMLGenerator::openFrame(const RVNGPropertyList &propList)
- {
- librevenge::RVNGPropertyList::Iter i(propList);
- std::string anchorType;
-+ RVNGPropertyList frameProperties;
- for (i.rewind(); i.next();)
- {
- if (std::string("text:anchor-type") == i.key())
- anchorType = i()->getStr().cstr();
-+
-+ // Remember the property for binary object purposes.
-+ frameProperties.insert(i.key(), i()->clone());
- }
-
- if (anchorType == "page")
- // Other anchor types are already inside a paragraph.
- m_impl->output().openElement("p", RVNGPropertyList());
- m_impl->m_frameAnchorTypes.push(anchorType);
-+
-+ m_impl->m_framePropertiesStack.push(frameProperties);
- }
-
- void EPUBHTMLGenerator::closeFrame()
- {
-+ if (!m_impl->m_framePropertiesStack.empty())
-+ m_impl->m_framePropertiesStack.pop();
-+
- if (m_impl->m_frameAnchorTypes.empty())
- return;
-
-@@ -970,6 +981,21 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- propList["librevenge:mime-type"]->getStr());
-
- RVNGPropertyList attrs;
-+
-+ if (!m_impl->m_framePropertiesStack.empty())
-+ {
-+ RVNGPropertyList &frameProperties = m_impl->m_framePropertiesStack.top();
-+ switch (m_impl->m_stylesMethod)
-+ {
-+ case EPUB_STYLES_METHOD_CSS:
-+ attrs.insert("class", m_impl->m_imageManager.getImageClass(frameProperties).c_str());
-+ break;
-+ case EPUB_STYLES_METHOD_INLINE:
-+ attrs.insert("style", m_impl->m_imageManager.getImageStyle(frameProperties).c_str());
-+ break;
-+ }
-+ }
-+
- attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str());
- // FIXME: use alternative repr. if available
- attrs.insert("alt", path.str().c_str());
-diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp
-index 0179cad..2311e76 100644
---- a/src/lib/EPUBImageManager.cpp
-+++ b/src/lib/EPUBImageManager.cpp
-@@ -16,6 +16,7 @@
- #include "EPUBBinarySink.h"
- #include "EPUBImageManager.h"
- #include "EPUBManifest.h"
-+#include "EPUBCSSSink.h"
-
- namespace libepubgen
- {
-@@ -68,6 +69,7 @@ EPUBImageManager::EPUBImageManager(EPUBManifest &manifest)
- : m_manifest(manifest)
- , m_map()
- , m_number()
-+ , m_imageContentNameMap()
- {
- }
-
-@@ -105,6 +107,54 @@ void EPUBImageManager::writeTo(EPUBPackage &package)
- }
- }
-
-+std::string EPUBImageManager::getImageClass(librevenge::RVNGPropertyList const &pList)
-+{
-+ EPUBCSSProperties content;
-+ extractImageProperties(pList, content);
-+ ContentNameMap_t::const_iterator it=m_imageContentNameMap.find(content);
-+ if (it != m_imageContentNameMap.end())
-+ return it->second;
-+ std::stringstream s;
-+ s << "image" << m_imageContentNameMap.size();
-+ m_imageContentNameMap[content]=s.str();
-+ return s.str();
-+}
-+
-+std::string EPUBImageManager::getImageStyle(librevenge::RVNGPropertyList const &pList)
-+{
-+ EPUBCSSProperties content;
-+ extractImageProperties(pList, content);
-+
-+ std::stringstream s;
-+ for (const auto &property : content)
-+ s << property.first << ": " << property.second << "; ";
-+ return s.str();
-+}
-+
-+void EPUBImageManager::extractImageProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const
-+{
-+ // Extract borders.
-+ static char const *(type[]) = {"border", "border-left", "border-top", "border-right", "border-bottom" };
-+ for (int i = 0; i < 5; i++)
-+ {
-+ std::string field("fo:");
-+ field+=type[i];
-+ if (!pList[field.c_str()])
-+ continue;
-+ cssProps[type[i]] = pList[field.c_str()]->getStr().cstr();
-+ }
-+}
-+
-+void EPUBImageManager::send(EPUBCSSSink &out)
-+{
-+ for (auto it = m_imageContentNameMap.begin(); m_imageContentNameMap.end() != it; ++it)
-+ {
-+ librevenge::RVNGPropertyList props;
-+ fillPropertyList(it->first, props);
-+ out.insertRule(("." + it->second).c_str(), props);
-+ }
-+}
-+
- }
-
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
-diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h
-index 21a1b37..c9f4236 100644
---- a/src/lib/EPUBImageManager.h
-+++ b/src/lib/EPUBImageManager.h
-@@ -12,8 +12,10 @@
-
- #include <unordered_map>
-
-+#include <boost/functional/hash.hpp>
- #include <librevenge/librevenge.h>
-
-+#include "EPUBCSSProperties.h"
- #include "EPUBCounter.h"
- #include "EPUBPath.h"
-
-@@ -22,6 +24,7 @@ namespace libepubgen
-
- class EPUBManifest;
- class EPUBPackage;
-+class EPUBCSSSink;
-
- class EPUBImageManager
- {
-@@ -40,6 +43,7 @@ class EPUBImageManager
- };
-
- typedef std::unordered_map<librevenge::RVNGBinaryData, EPUBPath, BinaryDataHash, BinaryDataEqual> MapType_t;
-+ typedef std::unordered_map<EPUBCSSProperties, std::string, boost::hash<EPUBCSSProperties>> ContentNameMap_t;
-
- public:
- explicit EPUBImageManager(EPUBManifest &manifest);
-@@ -48,10 +52,22 @@ public:
-
- void writeTo(EPUBPackage &package);
-
-+ //! returns the class name corresponding to a propertylist
-+ std::string getImageClass(librevenge::RVNGPropertyList const &pList);
-+ //! returns the style string corresponding to a propertylist
-+ std::string getImageStyle(librevenge::RVNGPropertyList const &pList);
-+ //! send the data to the sink
-+ void send(EPUBCSSSink &out);
-+
- private:
-+ //! convert a property list into a CSS property map
-+ void extractImageProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
-+
- EPUBManifest &m_manifest;
- MapType_t m_map;
- EPUBCounter m_number;
-+ //! a map image content -> name
-+ ContentNameMap_t m_imageContentNameMap;
- };
-
- }
---
-2.13.6
-
-From 094db625e36b91b57e152296a1f7db1bdcc682c5 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 8 Nov 2017 14:10:26 +0100
-Subject: [PATCH] EPUBHTMLGenerator: add missing rel attribute for CSS
- reference
-
-Turns out a number of readers (checked Calibre and Aldiko on Android) do
-support taking formatting from an external CSS, but only in case this
-attribute is present.
----
- src/lib/EPUBHTMLGenerator.cpp | 1 +
- src/test/EPUBTextGeneratorTest.cpp | 24 ++++++++++++++++++++++++
- 2 files changed, 25 insertions(+)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 4ffa55d..d81a905 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -531,6 +531,7 @@ void EPUBHTMLGenerator::endDocument()
- RVNGPropertyList linkAttrs;
- linkAttrs.insert("href", m_impl->m_stylesheetPath.relativeTo(m_impl->m_path).str().c_str());
- linkAttrs.insert("type", "text/css");
-+ linkAttrs.insert("rel", "stylesheet");
- m_impl->m_document.insertEmptyElement("link", linkAttrs);
- m_impl->m_document.closeElement("head");
- m_impl->m_document.openElement("body", RVNGPropertyList());
---
-2.13.6
-
-From 0f5073481b094562f2c78481475a660fb6826cdb Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Thu, 9 Nov 2017 11:32:27 +0100
-Subject: [PATCH] EPUBImageManager: initial horizontal positioning
-
-For now position everything to the left, except for explicit "right".
----
- src/lib/EPUBImageManager.cpp | 17 ++++++++++
- src/test/EPUBTextGeneratorTest.cpp | 66 ++++++++++++++++++++++++++++++++++++++
- 2 files changed, 83 insertions(+)
-
-diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp
-index 2311e76..8414da5 100644
---- a/src/lib/EPUBImageManager.cpp
-+++ b/src/lib/EPUBImageManager.cpp
-@@ -133,6 +133,23 @@ std::string EPUBImageManager::getImageStyle(librevenge::RVNGPropertyList const &
-
- void EPUBImageManager::extractImageProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const
- {
-+ // Positioning.
-+ librevenge::RVNGString anchorType;
-+ if (pList["text:anchor-type"])
-+ anchorType = pList["text:anchor-type"]->getStr();
-+ if (anchorType != "as-char")
-+ {
-+ // Horizontal position.
-+ librevenge::RVNGString horizontalPos;
-+ if (pList["style:horizontal-pos"])
-+ horizontalPos = pList["style:horizontal-pos"]->getStr();
-+
-+ if (horizontalPos == "right")
-+ cssProps["float"] = "right";
-+ else
-+ cssProps["float"] = "left";
-+ }
-+
- // Extract borders.
- static char const *(type[]) = {"border", "border-left", "border-top", "border-right", "border-bottom" };
- for (int i = 0; i < 5; i++)
---
-2.13.6
-
-From 3d47458738729c86992a1ed0002726cba5ec315c Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 10 Nov 2017 12:27:35 +0100
-Subject: [PATCH] EPUBImageManager: initial wrap type handling
-
-You could assume that the wrap is the opposide of clear, but given it's
-an attribute on the next element, they are the same at the end in case
-of left and right.
----
- src/lib/EPUBHTMLGenerator.cpp | 24 ++++++++++++++++++++++++
- src/test/EPUBTextGeneratorTest.cpp | 38 ++++++++++++++++++++++++++++++++++++++
- 2 files changed, 62 insertions(+)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index d81a905..a90ac68 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -982,6 +982,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- propList["librevenge:mime-type"]->getStr());
-
- RVNGPropertyList attrs;
-+ RVNGString wrap;
-
- if (!m_impl->m_framePropertiesStack.empty())
- {
-@@ -995,12 +996,35 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- attrs.insert("style", m_impl->m_imageManager.getImageStyle(frameProperties).c_str());
- break;
- }
-+
-+ if (frameProperties["style:wrap"])
-+ wrap = frameProperties["style:wrap"]->getStr();
- }
-
- attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str());
- // FIXME: use alternative repr. if available
- attrs.insert("alt", path.str().c_str());
- m_impl->output().insertEmptyElement("img", attrs);
-+
-+ // Emulate wrap type with a break after the image.
-+ RVNGString brStyle;
-+ if (wrap == "none")
-+ brStyle = "clear: both;";
-+ else if (wrap == "left")
-+ // We want content on the left side, space on the right side, so the next
-+ // element should clear on its left.
-+ brStyle = "clear: left;";
-+ else if (wrap == "right")
-+ // Same here.
-+ brStyle = "clear: right;";
-+ else if (wrap == "parallel")
-+ brStyle = "clear: none;";
-+ if (!brStyle.empty())
-+ {
-+ attrs.clear();
-+ attrs.insert("style", brStyle);
-+ m_impl->output().insertEmptyElement("br", attrs);
-+ }
- }
-
- void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {}
---
-2.13.6
-
-From 40111db25a92537c922a768dd04916cb5edd0239 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 10 Nov 2017 14:13:29 +0100
-Subject: [PATCH] EPUBHTMLGenerator: map TextBox to <div>
-
-This way e.g. image with caption is no longer lost from the text
-generator. This generalizes image and textbox styles as "frame" styles.
----
- src/lib/EPUBHTMLGenerator.cpp | 27 ++++++++++++++++++----
- src/lib/EPUBImageManager.cpp | 6 ++---
- src/lib/EPUBImageManager.h | 4 ++--
- src/test/EPUBTextGeneratorTest.cpp | 47 +++++++++++++++++++++++++++++++++-----
- 4 files changed, 68 insertions(+), 16 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index a90ac68..5f10902 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -833,15 +833,32 @@ void EPUBHTMLGenerator::openTextBox(const RVNGPropertyList & /*propList*/)
- {
- if (m_impl->m_ignore)
- return;
-- m_impl->push(EPUBHTMLTextZone::Z_TextBox);
-- m_impl->getSink().addLabel(m_impl->output());
-+
-+ RVNGPropertyList attrs;
-+
-+ if (!m_impl->m_framePropertiesStack.empty())
-+ {
-+ RVNGPropertyList &frameProperties = m_impl->m_framePropertiesStack.top();
-+ switch (m_impl->m_stylesMethod)
-+ {
-+ case EPUB_STYLES_METHOD_CSS:
-+ attrs.insert("class", m_impl->m_imageManager.getFrameClass(frameProperties).c_str());
-+ break;
-+ case EPUB_STYLES_METHOD_INLINE:
-+ attrs.insert("style", m_impl->m_imageManager.getFrameStyle(frameProperties).c_str());
-+ break;
-+ }
-+ }
-+
-+ m_impl->output().openElement("div", attrs);
- }
-
- void EPUBHTMLGenerator::closeTextBox()
- {
- if (m_impl->m_ignore)
- return;
-- m_impl->pop();
-+
-+ m_impl->output().closeElement("div");
- }
-
- void EPUBHTMLGenerator::openTable(const RVNGPropertyList &propList)
-@@ -990,10 +1007,10 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- switch (m_impl->m_stylesMethod)
- {
- case EPUB_STYLES_METHOD_CSS:
-- attrs.insert("class", m_impl->m_imageManager.getImageClass(frameProperties).c_str());
-+ attrs.insert("class", m_impl->m_imageManager.getFrameClass(frameProperties).c_str());
- break;
- case EPUB_STYLES_METHOD_INLINE:
-- attrs.insert("style", m_impl->m_imageManager.getImageStyle(frameProperties).c_str());
-+ attrs.insert("style", m_impl->m_imageManager.getFrameStyle(frameProperties).c_str());
- break;
- }
-
-diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp
-index 8414da5..dfa0cb7 100644
---- a/src/lib/EPUBImageManager.cpp
-+++ b/src/lib/EPUBImageManager.cpp
-@@ -107,7 +107,7 @@ void EPUBImageManager::writeTo(EPUBPackage &package)
- }
- }
-
--std::string EPUBImageManager::getImageClass(librevenge::RVNGPropertyList const &pList)
-+std::string EPUBImageManager::getFrameClass(librevenge::RVNGPropertyList const &pList)
- {
- EPUBCSSProperties content;
- extractImageProperties(pList, content);
-@@ -115,12 +115,12 @@ std::string EPUBImageManager::getImageClass(librevenge::RVNGPropertyList const &
- if (it != m_imageContentNameMap.end())
- return it->second;
- std::stringstream s;
-- s << "image" << m_imageContentNameMap.size();
-+ s << "frame" << m_imageContentNameMap.size();
- m_imageContentNameMap[content]=s.str();
- return s.str();
- }
-
--std::string EPUBImageManager::getImageStyle(librevenge::RVNGPropertyList const &pList)
-+std::string EPUBImageManager::getFrameStyle(librevenge::RVNGPropertyList const &pList)
- {
- EPUBCSSProperties content;
- extractImageProperties(pList, content);
-diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h
-index c9f4236..939d350 100644
---- a/src/lib/EPUBImageManager.h
-+++ b/src/lib/EPUBImageManager.h
-@@ -53,9 +53,9 @@ public:
- void writeTo(EPUBPackage &package);
-
- //! returns the class name corresponding to a propertylist
-- std::string getImageClass(librevenge::RVNGPropertyList const &pList);
-+ std::string getFrameClass(librevenge::RVNGPropertyList const &pList);
- //! returns the style string corresponding to a propertylist
-- std::string getImageStyle(librevenge::RVNGPropertyList const &pList);
-+ std::string getFrameStyle(librevenge::RVNGPropertyList const &pList);
- //! send the data to the sink
- void send(EPUBCSSSink &out);
-
---
-2.13.6
-
-From da840df8eaacfcfbd93d82751a774371d7e5c9b9 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 10 Nov 2017 15:29:47 +0100
-Subject: [PATCH] EPUBHTMLGenerator: avoid wrap type for as-char anchored
- images
-
----
- src/lib/EPUBHTMLGenerator.cpp | 40 ++++++++++++++++++++++----------------
- src/test/EPUBTextGeneratorTest.cpp | 15 +++++++++++++-
- 2 files changed, 37 insertions(+), 18 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 5f10902..156f042 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -1000,6 +1000,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
-
- RVNGPropertyList attrs;
- RVNGString wrap;
-+ RVNGString anchorType;
-
- if (!m_impl->m_framePropertiesStack.empty())
- {
-@@ -1016,6 +1017,8 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
-
- if (frameProperties["style:wrap"])
- wrap = frameProperties["style:wrap"]->getStr();
-+ if (frameProperties["text:anchor-type"])
-+ anchorType = frameProperties["text:anchor-type"]->getStr();
- }
-
- attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str());
-@@ -1023,24 +1026,27 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- attrs.insert("alt", path.str().c_str());
- m_impl->output().insertEmptyElement("img", attrs);
-
-- // Emulate wrap type with a break after the image.
-- RVNGString brStyle;
-- if (wrap == "none")
-- brStyle = "clear: both;";
-- else if (wrap == "left")
-- // We want content on the left side, space on the right side, so the next
-- // element should clear on its left.
-- brStyle = "clear: left;";
-- else if (wrap == "right")
-- // Same here.
-- brStyle = "clear: right;";
-- else if (wrap == "parallel")
-- brStyle = "clear: none;";
-- if (!brStyle.empty())
-+ if (anchorType != "as-char")
- {
-- attrs.clear();
-- attrs.insert("style", brStyle);
-- m_impl->output().insertEmptyElement("br", attrs);
-+ // Emulate wrap type with a break after the image.
-+ RVNGString brStyle;
-+ if (wrap == "none")
-+ brStyle = "clear: both;";
-+ else if (wrap == "left")
-+ // We want content on the left side, space on the right side, so the next
-+ // element should clear on its left.
-+ brStyle = "clear: left;";
-+ else if (wrap == "right")
-+ // Same here.
-+ brStyle = "clear: right;";
-+ else if (wrap == "parallel")
-+ brStyle = "clear: none;";
-+ if (!brStyle.empty())
-+ {
-+ attrs.clear();
-+ attrs.insert("style", brStyle);
-+ m_impl->output().insertEmptyElement("br", attrs);
-+ }
- }
- }
-
---
-2.13.6
-
-From 3da66e7b1fbda75e43b3ab63502d66097f39ef7a Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 10 Nov 2017 16:36:11 +0100
-Subject: [PATCH] EPUBImageManager: handle text box wrap types
-
-By sharing the image and textbox wrap code.
----
- src/lib/EPUBHTMLGenerator.cpp | 44 ++++++++++++++++----------------------
- src/lib/EPUBImageManager.cpp | 29 +++++++++++++++++++++++++
- src/lib/EPUBImageManager.h | 2 ++
- src/test/EPUBTextGeneratorTest.cpp | 2 ++
- 4 files changed, 51 insertions(+), 26 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 156f042..9d39333 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -859,6 +859,18 @@ void EPUBHTMLGenerator::closeTextBox()
- return;
-
- m_impl->output().closeElement("div");
-+
-+ if (!m_impl->m_framePropertiesStack.empty())
-+ {
-+ RVNGPropertyList &frameProperties = m_impl->m_framePropertiesStack.top();
-+ RVNGString wrapStyle = m_impl->m_imageManager.getWrapStyle(frameProperties).c_str();
-+ if (!wrapStyle.empty())
-+ {
-+ RVNGPropertyList attrs;
-+ attrs.insert("style", wrapStyle);
-+ m_impl->output().insertEmptyElement("br", attrs);
-+ }
-+ }
- }
-
- void EPUBHTMLGenerator::openTable(const RVNGPropertyList &propList)
-@@ -999,8 +1011,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- propList["librevenge:mime-type"]->getStr());
-
- RVNGPropertyList attrs;
-- RVNGString wrap;
-- RVNGString anchorType;
-+ RVNGString wrapStyle;
-
- if (!m_impl->m_framePropertiesStack.empty())
- {
-@@ -1015,10 +1026,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- break;
- }
-
-- if (frameProperties["style:wrap"])
-- wrap = frameProperties["style:wrap"]->getStr();
-- if (frameProperties["text:anchor-type"])
-- anchorType = frameProperties["text:anchor-type"]->getStr();
-+ wrapStyle = m_impl->m_imageManager.getWrapStyle(frameProperties).c_str();
- }
-
- attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str());
-@@ -1026,27 +1034,11 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- attrs.insert("alt", path.str().c_str());
- m_impl->output().insertEmptyElement("img", attrs);
-
-- if (anchorType != "as-char")
-+ if (!wrapStyle.empty())
- {
-- // Emulate wrap type with a break after the image.
-- RVNGString brStyle;
-- if (wrap == "none")
-- brStyle = "clear: both;";
-- else if (wrap == "left")
-- // We want content on the left side, space on the right side, so the next
-- // element should clear on its left.
-- brStyle = "clear: left;";
-- else if (wrap == "right")
-- // Same here.
-- brStyle = "clear: right;";
-- else if (wrap == "parallel")
-- brStyle = "clear: none;";
-- if (!brStyle.empty())
-- {
-- attrs.clear();
-- attrs.insert("style", brStyle);
-- m_impl->output().insertEmptyElement("br", attrs);
-- }
-+ attrs.clear();
-+ attrs.insert("style", wrapStyle);
-+ m_impl->output().insertEmptyElement("br", attrs);
- }
- }
-
-diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp
-index dfa0cb7..c31fb82 100644
---- a/src/lib/EPUBImageManager.cpp
-+++ b/src/lib/EPUBImageManager.cpp
-@@ -162,6 +162,35 @@ void EPUBImageManager::extractImageProperties(librevenge::RVNGPropertyList const
- }
- }
-
-+std::string EPUBImageManager::getWrapStyle(librevenge::RVNGPropertyList const &pList)
-+{
-+ librevenge::RVNGString wrap;
-+ librevenge::RVNGString anchorType;
-+ std::string ret;
-+
-+ if (pList["style:wrap"])
-+ wrap = pList["style:wrap"]->getStr();
-+ if (pList["text:anchor-type"])
-+ anchorType = pList["text:anchor-type"]->getStr();
-+
-+ if (anchorType == "as-char")
-+ return ret;
-+
-+ // Emulate wrap type with a break after the image.
-+ if (wrap == "none")
-+ ret = "clear: both;";
-+ else if (wrap == "left")
-+ // We want content on the left side, space on the right side, so the next
-+ // element should clear on its left.
-+ ret = "clear: left;";
-+ else if (wrap == "right")
-+ ret = "clear: right;";
-+ else if (wrap == "parallel")
-+ ret = "clear: none;";
-+
-+ return ret;
-+}
-+
- void EPUBImageManager::send(EPUBCSSSink &out)
- {
- for (auto it = m_imageContentNameMap.begin(); m_imageContentNameMap.end() != it; ++it)
-diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h
-index 939d350..9d1da4e 100644
---- a/src/lib/EPUBImageManager.h
-+++ b/src/lib/EPUBImageManager.h
-@@ -56,6 +56,8 @@ public:
- std::string getFrameClass(librevenge::RVNGPropertyList const &pList);
- //! returns the style string corresponding to a propertylist
- std::string getFrameStyle(librevenge::RVNGPropertyList const &pList);
-+ //! returns the style for a follow-up <br> element, based on wrapping properties.
-+ static std::string getWrapStyle(librevenge::RVNGPropertyList const &pList);
- //! send the data to the sink
- void send(EPUBCSSSink &out);
-
---
-2.13.6
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 38c3188..64707c5 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -35,6 +35,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
- , m_manifest()
- , m_htmlManager(m_manifest)
- , m_imageManager(m_manifest)
-+ , m_fontManager(m_manifest)
- , m_listStyleManager()
- , m_paragraphStyleManager()
- , m_spanStyleManager()
-@@ -79,6 +80,7 @@ void EPUBGenerator::endDocument()
- writeStylesheet();
- m_htmlManager.writeTo(*m_package);
- m_imageManager.writeTo(*m_package);
-+ m_fontManager.writeTo(*m_package);
- }
-
- void EPUBGenerator::setDocumentMetaData(const RVNGPropertyList &props)
-@@ -97,7 +99,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_stylesMethod);
-+ m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod);
-
- // restore state in the new file
- m_currentHtml->startDocument(m_documentProps);
-@@ -226,6 +228,7 @@ void EPUBGenerator::writeStylesheet()
- {
- EPUBCSSSink sink;
-
-+ m_fontManager.send(sink);
- m_listStyleManager.send(sink);
- m_paragraphStyleManager.send(sink);
- m_spanStyleManager.send(sink);
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index 099eb4a..abc6a9a 100644
---- a/src/lib/EPUBGenerator.h
-+++ b/src/lib/EPUBGenerator.h
-@@ -68,6 +68,7 @@ private:
- EPUBManifest m_manifest;
- EPUBHTMLManager m_htmlManager;
- EPUBImageManager m_imageManager;
-+ EPUBFontManager m_fontManager;
- EPUBListStyleManager m_listStyleManager;
- EPUBParagraphStyleManager m_paragraphStyleManager;
- EPUBSpanStyleManager m_spanStyleManager;
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 9d39333..614dd02 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -351,9 +351,10 @@ 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, EPUBStylesMethod stylesMethod)
-+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
- : m_document(document)
- , m_imageManager(imageManager)
-+ , m_fontManager(fontManager)
- , m_listManager(listStyleManager)
- , m_paragraphManager(paragraphStyleManager)
- , m_spanManager(spanStyleManager)
-@@ -442,6 +443,7 @@ struct EPUBHTMLGeneratorImpl
-
- EPUBXMLSink &m_document;
- EPUBImageManager &m_imageManager;
-+ EPUBFontManager &m_fontManager;
- EPUBListStyleManager &m_listManager;
- EPUBParagraphStyleManager &m_paragraphManager;
- EPUBSpanStyleManager &m_spanManager;
-@@ -469,8 +471,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, EPUBStylesMethod stylesMethod)
-- : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod))
-+EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
-+ : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod))
- {
- }
-
-@@ -540,8 +542,9 @@ void EPUBHTMLGenerator::endDocument()
- m_impl->m_document.closeElement("html");
- }
-
--void EPUBHTMLGenerator::defineEmbeddedFont(const RVNGPropertyList &/*propList*/)
-+void EPUBHTMLGenerator::defineEmbeddedFont(const RVNGPropertyList &propList)
- {
-+ m_impl->m_fontManager.insert(propList, m_impl->m_path);
- }
-
- void EPUBHTMLGenerator::openPageSpan(const RVNGPropertyList & /* propList */)
-diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h
-index d8783ed..49f76a3 100644
---- a/src/lib/EPUBHTMLGenerator.h
-+++ b/src/lib/EPUBHTMLGenerator.h
-@@ -21,6 +21,7 @@ namespace libepubgen
-
- struct EPUBHTMLGeneratorImpl;
- class EPUBImageManager;
-+class EPUBFontManager;
- class EPUBListStyleManager;
- class EPUBSpanStyleManager;
- class EPUBParagraphStyleManager;
-@@ -30,7 +31,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, EPUBStylesMethod stylesMethod);
-+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, 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 33cba11..9d4c507 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, EPUBStylesMethod stylesMethod)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, 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, stylesMethod));
-+ new EPUBHTMLGenerator(m_contents.back(), imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod));
-
- return gen;
- }
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index f034657..ef56a52 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, EPUBStylesMethod stylesMethod);
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod);
-
- void writeTo(EPUBPackage &package);
-
-diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp
-index c31fb82..c4c9457 100644
---- a/src/lib/EPUBImageManager.cpp
-+++ b/src/lib/EPUBImageManager.cpp
-@@ -42,6 +42,17 @@ string getExtension(const string &mimetype)
- return (extensionMap.end() == it) ? string("img") : it->second;
- }
-
-+std::string getFontExtension(const std::string &mimetype)
-+{
-+ static const std::unordered_map<std::string, std::string> extensionMap =
-+ {
-+ {"application/vnd.ms-opentype", "otf"},
-+ };
-+
-+ const auto it = extensionMap.find(mimetype);
-+ return it == extensionMap.end() ? std::string("ttf") : it->second;
-+}
-+
- }
-
- std::size_t EPUBImageManager::BinaryDataHash::operator()(const librevenge::RVNGBinaryData &data) const
-@@ -201,6 +212,113 @@ void EPUBImageManager::send(EPUBCSSSink &out)
- }
- }
-
-+std::size_t EPUBFontManager::BinaryDataHash::operator()(const librevenge::RVNGBinaryData &data) const
-+{
-+ size_t seed = 0;
-+
-+ const unsigned char *const buf = data.getDataBuffer();
-+ for (size_t i = 0; data.size() != i; ++i)
-+ boost::hash_combine(seed, buf[i]);
-+
-+ return seed;
-+}
-+
-+bool EPUBFontManager::BinaryDataEqual::operator()(const librevenge::RVNGBinaryData &left, const librevenge::RVNGBinaryData &right) const
-+{
-+ if (left.empty() && right.empty())
-+ return true;
-+ if (left.size() != right.size())
-+ return false;
-+ const unsigned char *const leftData = left.getDataBuffer();
-+ return std::equal(leftData, leftData + left.size(), right.getDataBuffer());
-+}
-+
-+EPUBFontManager::EPUBFontManager(EPUBManifest &manifest)
-+ : m_manifest(manifest)
-+ , m_map()
-+ , m_number()
-+ , m_set()
-+{
-+}
-+
-+void EPUBFontManager::insert(const librevenge::RVNGPropertyList &propertyList, const EPUBPath &base)
-+{
-+ librevenge::RVNGBinaryData data(propertyList["office:binary-data"]->getStr());
-+ librevenge::RVNGString mimetype(propertyList["librevenge:mime-type"]->getStr());
-+ if (mimetype == "truetype")
-+ // librevenge's truetype is EPUB's opentype.
-+ mimetype = "application/vnd.ms-opentype";
-+
-+ MapType_t::const_iterator it = m_map.find(data);
-+ if (m_map.end() == it)
-+ {
-+ const std::string mime(mimetype.cstr());
-+
-+ std::ostringstream nameBuf;
-+ nameBuf << "font" << std::setw(4) << std::setfill('0') << m_number.next();
-+ const std::string id = nameBuf.str();
-+
-+ nameBuf << "." << getFontExtension(mime);
-+
-+ const EPUBPath path(EPUBPath("OEBPS/fonts") / nameBuf.str());
-+
-+ m_manifest.insert(path, mime, id, "");
-+ it = m_map.insert(MapType_t::value_type(data, path)).first;
-+ }
-+
-+ assert(m_map.end() != it); // the font must be present at this point
-+
-+ // Now collect CSS properties.
-+ EPUBCSSProperties content;
-+ extractFontProperties(propertyList, content);
-+ std::stringstream ss;
-+ ss << "url(";
-+ ss << it->second.relativeTo(base).str();
-+ ss << ")";
-+ content["src"] = ss.str();
-+ SetType_t::const_iterator contentIt = m_set.find(content);
-+ if (contentIt != m_set.end())
-+ return;
-+
-+ m_set.insert(content);
-+}
-+
-+void EPUBFontManager::extractFontProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const
-+{
-+ if (pList["librevenge:name"])
-+ {
-+ std::ostringstream name;
-+ name << '\'' << pList["librevenge:name"]->getStr().cstr() << '\'';
-+ cssProps["font-family"] = name.str();
-+ }
-+
-+ if (pList["librevenge:font-style"])
-+ cssProps["font-style"] = pList["librevenge:font-style"]->getStr().cstr();
-+
-+ if (pList["librevenge:font-weight"])
-+ cssProps["font-weight"] = pList["librevenge:font-weight"]->getStr().cstr();
-+}
-+
-+void EPUBFontManager::writeTo(EPUBPackage &package)
-+{
-+ for (MapType_t::const_iterator it = m_map.begin(); m_map.end() != it; ++it)
-+ {
-+ EPUBBinarySink sink;
-+ sink.insertBinaryData(it->first);
-+ sink.writeTo(package, it->second.str().c_str());
-+ }
-+}
-+
-+void EPUBFontManager::send(EPUBCSSSink &out)
-+{
-+ for (const auto &fontProperties : m_set)
-+ {
-+ librevenge::RVNGPropertyList props;
-+ fillPropertyList(fontProperties, props);
-+ out.insertRule("@font-face", props);
-+ }
-+}
-+
- }
-
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
-diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h
-index 9d1da4e..3f4bf3c 100644
---- a/src/lib/EPUBImageManager.h
-+++ b/src/lib/EPUBImageManager.h
-@@ -11,6 +11,7 @@
- #define INCLUDED_EPUBIMAGEMANAGER_H
-
- #include <unordered_map>
-+#include <unordered_set>
-
- #include <boost/functional/hash.hpp>
- #include <librevenge/librevenge.h>
-@@ -72,6 +73,48 @@ private:
- ContentNameMap_t m_imageContentNameMap;
- };
-
-+/// Manages embedded fonts.
-+class EPUBFontManager
-+{
-+ // disable copying
-+ EPUBFontManager(const EPUBFontManager &);
-+ EPUBFontManager &operator=(const EPUBFontManager &);
-+
-+ struct BinaryDataHash // : public std::unary_function<librevenge::RVNGBinaryData, std::size_t>
-+ {
-+ std::size_t operator()(const librevenge::RVNGBinaryData &data) const;
-+ };
-+
-+ struct BinaryDataEqual // : public std::binary_function<librevenge::RVNGBinaryData, librevenge::RVNGBinaryData, bool>
-+ {
-+ bool operator()(const librevenge::RVNGBinaryData &left, const librevenge::RVNGBinaryData &right) const;
-+ };
-+
-+ typedef std::unordered_map<librevenge::RVNGBinaryData, EPUBPath, BinaryDataHash, BinaryDataEqual> MapType_t;
-+ typedef std::unordered_set<EPUBCSSProperties, boost::hash<EPUBCSSProperties>> SetType_t;
-+
-+public:
-+ explicit EPUBFontManager(EPUBManifest &manifest);
-+
-+ void insert(const librevenge::RVNGPropertyList &propertyList, const EPUBPath &path);
-+
-+ void writeTo(EPUBPackage &package);
-+
-+ //! send the data to the sink
-+ void send(EPUBCSSSink &out);
-+
-+private:
-+ //! convert a property list into a CSS property map
-+ void extractFontProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
-+
-+ EPUBManifest &m_manifest;
-+ /// Font filename -> content map.
-+ MapType_t m_map;
-+ EPUBCounter m_number;
-+ /// Set of font properties.
-+ SetType_t m_set;
-+};
-+
- }
-
- #endif // INCLUDED_EPUBIMAGEMANAGER
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
-index d5e650c..a1ce33e 100644
---- a/src/lib/EPUBTableStyleManager.cpp
-+++ b/src/lib/EPUBTableStyleManager.cpp
-@@ -78,7 +78,9 @@ bool extractColumnsWidth(const std::vector< std::vector<double> > &columnWidthsS
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
- {
- if (!relative)
-+ {
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
-+ }
- return false;
- }
- bool fixed = true;
-From 0d06b60d45b3e1465976eb027c3fde31fccdc025 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 17 Nov 2017 15:45:12 +0100
-Subject: [PATCH] EPUBGenerator: add support for cover image metadata
-
-The librevenge:cover-images key can't have a property list as a value,
-so go with a list of cover images, though in practice more than one
-won't result in a valid EPUB3 file.
----
- src/lib/EPUBGenerator.cpp | 18 ++++++++++++++++++
- src/lib/EPUBImageManager.cpp | 4 ++--
- src/lib/EPUBImageManager.h | 2 +-
- src/test/EPUBTextGeneratorTest.cpp | 31 +++++++++++++++++++++++++++++++
- 4 files changed, 52 insertions(+), 3 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 64707c5..62dac6e 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -86,6 +86,24 @@ void EPUBGenerator::endDocument()
- void EPUBGenerator::setDocumentMetaData(const RVNGPropertyList &props)
- {
- m_metadata = props;
-+
-+ if (m_version == 30)
-+ {
-+ const librevenge::RVNGPropertyListVector *coverImages = props.child("librevenge:cover-images");
-+ if (coverImages)
-+ {
-+ for (size_t i = 0; i < coverImages->count(); ++i)
-+ {
-+ librevenge::RVNGPropertyList const &propertyList = (*coverImages)[i];
-+ if (propertyList["office:binary-data"] && propertyList["librevenge:mime-type"])
-+ {
-+ m_imageManager.insert(librevenge::RVNGBinaryData(propertyList["office:binary-data"]->getStr()),
-+ propertyList["librevenge:mime-type"]->getStr(),
-+ "cover-image");
-+ }
-+ }
-+ }
-+ }
- }
-
- void EPUBGenerator::startNewHtmlFile()
-diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp
-index c4c9457..bdf3bf0 100644
---- a/src/lib/EPUBImageManager.cpp
-+++ b/src/lib/EPUBImageManager.cpp
-@@ -84,7 +84,7 @@ EPUBImageManager::EPUBImageManager(EPUBManifest &manifest)
- {
- }
-
--const EPUBPath &EPUBImageManager::insert(const librevenge::RVNGBinaryData &data, const librevenge::RVNGString &mimetype)
-+const EPUBPath &EPUBImageManager::insert(const librevenge::RVNGBinaryData &data, const librevenge::RVNGString &mimetype, const librevenge::RVNGString &properties)
- {
- MapType_t::const_iterator it = m_map.find(data);
- if (m_map.end() == it)
-@@ -99,7 +99,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, properties.cstr());
- it = m_map.insert(MapType_t::value_type(data, path)).first;
- }
-
-diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h
-index 3f4bf3c..cbb83b7 100644
---- a/src/lib/EPUBImageManager.h
-+++ b/src/lib/EPUBImageManager.h
-@@ -49,7 +49,7 @@ class EPUBImageManager
- public:
- explicit EPUBImageManager(EPUBManifest &manifest);
-
-- const EPUBPath &insert(const librevenge::RVNGBinaryData &data, const librevenge::RVNGString &mimetype);
-+ const EPUBPath &insert(const librevenge::RVNGBinaryData &data, const librevenge::RVNGString &mimetype, const librevenge::RVNGString &properties="");
-
- void writeTo(EPUBPackage &package);
-
---
-2.13.6
-
-From 631b21834883aa8f2ee83a20717dd37900331696 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Tue, 21 Nov 2017 11:52:03 +0100
-Subject: [PATCH] EPUBGenerator: allow overwriting dc:identifier default
-
-All other types had a way to be overwritten.
----
- src/lib/EPUBGenerator.cpp | 5 ++++-
- src/test/EPUBTextGeneratorTest.cpp | 3 +++
- 2 files changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 62dac6e..1cb1112 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -285,7 +285,10 @@ void EPUBGenerator::writeRoot()
- boost::uuids::uuid uuid = boost::uuids::random_generator()();
- identifierStream << uuid;
- std::string identifierCharactrs = identifierStream.str();
-- sink.insertCharacters(identifierCharactrs.c_str());
-+ RVNGString identifier = identifierCharactrs.c_str();
-+ if (m_metadata["dc:identifier"] && !m_metadata["dc:identifier"]->getStr().empty())
-+ identifier = m_metadata["dc:identifier"]->getStr();
-+ sink.insertCharacters(identifier);
- sink.closeElement("dc:identifier");
-
- RVNGString title("Unknown Title");
---
-2.13.6
-
-From 8c447caee18b4400170ecce36ea3714fdc377989 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Thu, 23 Nov 2017 16:42:13 +0100
-Subject: [PATCH 1/4] EPUBHTMLGenerator: fix footnotes/endnotes/comments
-
-There were two problems here:
-
-- when working with two sinks (footnote and main), make sure that we
- save the main one before the push of the sink stack
-
-- when handing out a non-const xml sink reference, make sure there is no
- parallel empty bool that tracks its size, otherwise these can out of
- sync (empty is still true, even if there is footnote content)
----
- src/lib/EPUBHTMLGenerator.cpp | 24 +++++++-----------------
- src/lib/EPUBXMLSink.cpp | 5 +++++
- src/lib/EPUBXMLSink.h | 2 ++
- src/test/EPUBTextGeneratorTest.cpp | 24 ++++++++++++++++++++++++
- 4 files changed, 38 insertions(+), 17 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 614dd02..3c8862b 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -51,20 +51,16 @@ public:
- const EPUBXMLSink &get() const;
- EPUBXMLSink &get();
-
-- bool empty() const;
--
- bool endsInLineBreak() const;
-
- private:
- EPUBXMLSink m_sink;
- std::string m_lastCloseElement;
-- bool m_empty;
- };
-
- ZoneSinkImpl::ZoneSinkImpl()
- : m_sink()
- , m_lastCloseElement()
-- , m_empty(true)
- {
- }
-
-@@ -72,28 +68,24 @@ void ZoneSinkImpl::openElement(const char *const name, const librevenge::RVNGPro
- {
- m_sink.openElement(name, attributes);
- m_lastCloseElement.clear();
-- m_empty = false;
- }
-
- void ZoneSinkImpl::closeElement(const char *const name)
- {
- m_sink.closeElement(name);
- m_lastCloseElement = name;
-- m_empty = false;
- }
-
- void ZoneSinkImpl::insertCharacters(const librevenge::RVNGString &characters)
- {
- m_sink.insertCharacters(characters);
- m_lastCloseElement.clear();
-- m_empty = false;
- }
-
- void ZoneSinkImpl::append(const ZoneSinkImpl &other)
- {
- m_sink.append(other.m_sink);
- m_lastCloseElement = other.m_lastCloseElement;
-- m_empty |= other.m_empty;
- }
-
- const EPUBXMLSink &ZoneSinkImpl::get() const
-@@ -106,11 +98,6 @@ EPUBXMLSink &ZoneSinkImpl::get()
- return m_sink;
- }
-
--bool ZoneSinkImpl::empty() const
--{
-- return m_empty;
--}
--
- bool ZoneSinkImpl::endsInLineBreak() const
- {
- return m_lastCloseElement == "p"
-@@ -154,7 +141,7 @@ struct EPUBHTMLTextZone
- bool isEmpty() const
- {
- for (const auto &zoneSink : m_zoneSinks)
-- if (!zoneSink.empty())
-+ if (!zoneSink.get().empty())
- return false;
- return true;
- }
-@@ -791,8 +778,9 @@ void EPUBHTMLGenerator::openFootnote(const RVNGPropertyList &)
- {
- if (m_impl->m_ignore)
- return;
-+ EPUBXMLSink &output = m_impl->output();
- m_impl->push(EPUBHTMLTextZone::Z_FootNote);
-- m_impl->getSink().addLabel(m_impl->output());
-+ m_impl->getSink().addLabel(output);
- }
-
- void EPUBHTMLGenerator::closeFootnote()
-@@ -806,8 +794,9 @@ void EPUBHTMLGenerator::openEndnote(const RVNGPropertyList &)
- {
- if (m_impl->m_ignore)
- return;
-+ EPUBXMLSink &output = m_impl->output();
- m_impl->push(EPUBHTMLTextZone::Z_EndNote);
-- m_impl->getSink().addLabel(m_impl->output());
-+ m_impl->getSink().addLabel(output);
- }
-
- void EPUBHTMLGenerator::closeEndnote()
-@@ -821,8 +810,9 @@ void EPUBHTMLGenerator::openComment(const RVNGPropertyList & /*propList*/)
- {
- if (m_impl->m_ignore)
- return;
-+ EPUBXMLSink &output = m_impl->output();
- m_impl->push(EPUBHTMLTextZone::Z_Comment);
-- m_impl->getSink().addLabel(m_impl->output());
-+ m_impl->getSink().addLabel(output);
- }
-
- void EPUBHTMLGenerator::closeComment()
-diff --git a/src/lib/EPUBXMLSink.cpp b/src/lib/EPUBXMLSink.cpp
-index 7c12c6d..db480d7 100644
---- a/src/lib/EPUBXMLSink.cpp
-+++ b/src/lib/EPUBXMLSink.cpp
-@@ -155,6 +155,11 @@ void EPUBXMLSink::append(const EPUBXMLSink &other)
- m_elements.insert(m_elements.end(), other.m_elements.begin(), other.m_elements.end());
- }
-
-+bool EPUBXMLSink::empty() const
-+{
-+ return m_elements.empty();
-+}
-+
- void EPUBXMLSink::writeTo(EPUBPackage &package, const char *const name)
- {
- package.openXMLFile(name);
-diff --git a/src/lib/EPUBXMLSink.h b/src/lib/EPUBXMLSink.h
-index ea7ac7a..a2bf951 100644
---- a/src/lib/EPUBXMLSink.h
-+++ b/src/lib/EPUBXMLSink.h
-@@ -40,6 +40,8 @@ public:
-
- void writeTo(EPUBPackage &package, const char *name);
-
-+ bool empty() const;
-+
- private:
- std::deque<EPUBXMLElementPtr_t> m_elements;
- };
---
-2.13.6
-
-
-From 9c723bbe42673906d8d0faf5083a186cf86d05ce Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Thu, 23 Nov 2017 17:27:00 +0100
-Subject: [PATCH 2/4] EPUBHTMLGenerator: avoid <title> in EPUB3 XHTML content
- documents
-
-- there were multiple of them, which is invalid
-- just don't write them, content.opf has the same info
----
- src/lib/EPUBGenerator.cpp | 2 +-
- src/lib/EPUBHTMLGenerator.cpp | 18 ++++++++++++------
- src/lib/EPUBHTMLGenerator.h | 2 +-
- src/lib/EPUBHTMLManager.cpp | 4 ++--
- src/lib/EPUBHTMLManager.h | 2 +-
- src/test/EPUBTextGeneratorTest.cpp | 5 ++++-
- 6 files changed, 21 insertions(+), 12 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 1cb1112..571f0eb 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -117,7 +117,7 @@ void EPUBGenerator::startNewHtmlFile()
-
- m_splitGuard.onSplit();
-
-- m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod);
-+ m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_version);
-
- // restore state in the new file
- m_currentHtml->startDocument(m_documentProps);
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 3c8862b..209e7e1 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -338,7 +338,7 @@ std::string EPUBHTMLTextZone::label(int id) const
- struct EPUBHTMLGeneratorImpl
- {
- //! constructor
-- EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
-+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version)
- : m_document(document)
- , m_imageManager(imageManager)
- , m_fontManager(fontManager)
-@@ -351,6 +351,7 @@ struct EPUBHTMLGeneratorImpl
- , m_actualPage(0)
- , m_ignore(false)
- , m_hasText(false)
-+ , m_version(version)
- , m_frameAnchorTypes()
- , m_framePropertiesStack()
- , m_stylesMethod(stylesMethod)
-@@ -442,6 +443,7 @@ struct EPUBHTMLGeneratorImpl
- bool m_ignore;
- /// Does the currently opened paragraph have some text?
- bool m_hasText;
-+ int m_version;
-
- std::stack<std::string> m_frameAnchorTypes;
- std::stack<RVNGPropertyList> m_framePropertiesStack;
-@@ -458,8 +460,8 @@ private:
- EPUBHTMLGeneratorImpl operator=(EPUBHTMLGeneratorImpl const &orig);
- };
-
--EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
-- : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod))
-+EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version)
-+ : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod, version))
- {
- }
-
-@@ -509,14 +511,18 @@ void EPUBHTMLGenerator::endDocument()
- htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml");
- m_impl->m_document.openElement("html", htmlAttrs);
- m_impl->m_document.openElement("head", RVNGPropertyList());
-- m_impl->m_document.openElement("title", RVNGPropertyList());
-- m_impl->m_document.closeElement("title");
-+ if (m_impl->m_version != 30)
-+ {
-+ m_impl->m_document.openElement("title", RVNGPropertyList());
-+ m_impl->m_document.closeElement("title");
-+ }
- RVNGPropertyList metaAttrs;
- metaAttrs.insert("http-equiv", "content-type");
- metaAttrs.insert("content", "text/html; charset=UTF-8");
- m_impl->m_document.openElement("meta", metaAttrs);
- m_impl->m_document.closeElement("meta");
-- m_impl->sendMetaData(m_impl->m_document);
-+ if (m_impl->m_version != 30)
-+ m_impl->sendMetaData(m_impl->m_document);
- RVNGPropertyList linkAttrs;
- linkAttrs.insert("href", m_impl->m_stylesheetPath.relativeTo(m_impl->m_path).str().c_str());
- linkAttrs.insert("type", "text/css");
-diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h
-index 49f76a3..11f20cb 100644
---- a/src/lib/EPUBHTMLGenerator.h
-+++ b/src/lib/EPUBHTMLGenerator.h
-@@ -31,7 +31,7 @@ class EPUBPath;
- class EPUBHTMLGenerator : public librevenge::RVNGTextInterface
- {
- public:
-- EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod);
-+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version);
- ~EPUBHTMLGenerator() override;
-
- void setDocumentMetaData(const librevenge::RVNGPropertyList &propList) override;
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index 9d4c507..d2c21da 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, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version)
- {
- 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, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod));
-+ new EPUBHTMLGenerator(m_contents.back(), imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod, version));
-
- return gen;
- }
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index ef56a52..e1205e6 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, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod);
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version);
-
- void writeTo(EPUBPackage &package);
-
---
-2.13.6
-
-
-From 502948041df07729572bf4f2b222e03073baa6c8 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 24 Nov 2017 10:29:15 +0100
-Subject: [PATCH 3/4] EPUBHTMLGenerator: implement EPUB3 footnote markup
-
-The main difference is that in the EPUB3 case the footnote has an
-explicit end.
----
- src/lib/EPUBHTMLGenerator.cpp | 56 ++++++++++++++++++++++++++++----------
- src/test/EPUBTextGeneratorTest.cpp | 26 ++++++++++++++++++
- 2 files changed, 68 insertions(+), 14 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 209e7e1..96e7623 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -122,7 +122,7 @@ struct EPUBHTMLTextZone
- //! the different zone
- enum Type { Z_Comment=0, Z_EndNote, Z_FootNote, Z_Main, Z_MetaData, Z_TextBox, Z_Unknown, Z_NumZones= Z_Unknown+1};
- //! constructor for basic stream
-- EPUBHTMLTextZone(Type tp=Z_Unknown) : m_type(tp), m_actualId(0), m_zoneSinks()
-+ EPUBHTMLTextZone(Type tp=Z_Unknown) : m_type(tp), m_actualId(0), m_zoneSinks(), m_version(20)
- {
- }
- //! the type
-@@ -135,6 +135,14 @@ struct EPUBHTMLTextZone
- {
- m_type=tp;
- }
-+ void setVersion(int version)
-+ {
-+ m_version = version;
-+ }
-+ int getVersion() const
-+ {
-+ return m_version;
-+ }
- //! returns a new sink corresponding to this zone
- std::unique_ptr<TextZoneSink> getNewSink();
- //! returns true if there is no data
-@@ -150,7 +158,7 @@ struct EPUBHTMLTextZone
- {
- if (isEmpty() || m_type==Z_Unknown || m_type==Z_Main)
- return;
-- if (m_type!=Z_MetaData)
-+ if (m_type!=Z_MetaData && m_version < 30)
- {
- out.openElement("hr", RVNGPropertyList());
- out.closeElement("hr");
-@@ -197,6 +205,7 @@ protected:
- mutable int m_actualId;
- //! the list of data string
- std::vector<ZoneSinkImpl> m_zoneSinks;
-+ int m_version;
- private:
- EPUBHTMLTextZone(EPUBHTMLTextZone const &orig);
- EPUBHTMLTextZone operator=(EPUBHTMLTextZone const &orig);
-@@ -218,11 +227,16 @@ struct TextZoneSink
- std::string lbl=label();
- if (!lbl.length())
- return;
-+ int version = 20;
-+ if (m_zone)
-+ version = m_zone->getVersion();
- {
- RVNGPropertyList supAttrs;
- supAttrs.insert("id", ("called" + lbl).c_str());
- output.openElement("sup", supAttrs);
- RVNGPropertyList aAttrs;
-+ if (version == 30)
-+ aAttrs.insert("epub:type", "noteref");
- aAttrs.insert("href", ("#data" + lbl).c_str());
- output.openElement("a", aAttrs);
- output.insertCharacters(lbl.c_str());
-@@ -230,17 +244,23 @@ struct TextZoneSink
- output.closeElement("sup");
- }
- flush();
-+ if (version == 30)
- {
-- RVNGPropertyList supAttrs;
-- supAttrs.insert("id", ("data" + lbl).c_str());
-- m_delayedLabel.openElement("sup", supAttrs);
-- RVNGPropertyList aAttrs;
-- aAttrs.insert("href", ("#called" + lbl).c_str());
-- m_delayedLabel.openElement("a", aAttrs);
-- m_delayedLabel.insertCharacters(lbl.c_str());
-- m_delayedLabel.closeElement("a");
-- m_delayedLabel.closeElement("sup");
-+ RVNGPropertyList asideAttrs;
-+ asideAttrs.insert("epub:type", "footnote");
-+ asideAttrs.insert("id", ("data" + lbl).c_str());
-+ m_sink.openElement("aside", asideAttrs);
- }
-+ RVNGPropertyList supAttrs;
-+ if (version < 30)
-+ supAttrs.insert("id", ("data" + lbl).c_str());
-+ m_delayedLabel.openElement("sup", supAttrs);
-+ RVNGPropertyList aAttrs;
-+ aAttrs.insert("href", ("#called" + lbl).c_str());
-+ m_delayedLabel.openElement("a", aAttrs);
-+ m_delayedLabel.insertCharacters(lbl.c_str());
-+ m_delayedLabel.closeElement("a");
-+ m_delayedLabel.closeElement("sup");
- }
- //! flush delayed label, ...
- void flush()
-@@ -359,7 +379,10 @@ struct EPUBHTMLGeneratorImpl
- , m_sinkStack()
- {
- for (int i = 0; i < EPUBHTMLTextZone::Z_NumZones; ++i)
-+ {
- m_zones[i].setType(EPUBHTMLTextZone::Type(i));
-+ m_zones[i].setVersion(version);
-+ }
- m_actualSink=m_zones[EPUBHTMLTextZone::Z_Main].getNewSink();
- }
- //! destructor
-@@ -511,7 +534,7 @@ void EPUBHTMLGenerator::endDocument()
- htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml");
- m_impl->m_document.openElement("html", htmlAttrs);
- m_impl->m_document.openElement("head", RVNGPropertyList());
-- if (m_impl->m_version != 30)
-+ if (m_impl->m_version < 30)
- {
- m_impl->m_document.openElement("title", RVNGPropertyList());
- m_impl->m_document.closeElement("title");
-@@ -521,7 +544,7 @@ void EPUBHTMLGenerator::endDocument()
- metaAttrs.insert("content", "text/html; charset=UTF-8");
- m_impl->m_document.openElement("meta", metaAttrs);
- m_impl->m_document.closeElement("meta");
-- if (m_impl->m_version != 30)
-+ if (m_impl->m_version < 30)
- m_impl->sendMetaData(m_impl->m_document);
- RVNGPropertyList linkAttrs;
- linkAttrs.insert("href", m_impl->m_stylesheetPath.relativeTo(m_impl->m_path).str().c_str());
-@@ -529,7 +552,10 @@ void EPUBHTMLGenerator::endDocument()
- linkAttrs.insert("rel", "stylesheet");
- m_impl->m_document.insertEmptyElement("link", linkAttrs);
- m_impl->m_document.closeElement("head");
-- m_impl->m_document.openElement("body", RVNGPropertyList());
-+ RVNGPropertyList bodyAttrs;
-+ if (m_impl->m_version == 30)
-+ bodyAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops");
-+ m_impl->m_document.openElement("body", bodyAttrs);
- m_impl->flushUnsent(m_impl->m_document);
- m_impl->m_document.closeElement("body");
- m_impl->m_document.closeElement("html");
-@@ -793,6 +819,8 @@ void EPUBHTMLGenerator::closeFootnote()
- {
- if (m_impl->m_ignore)
- return;
-+ if (m_impl->m_version == 30)
-+ m_impl->output().closeElement("aside");
- m_impl->pop();
- }
-
---
-2.13.6
-
-
-From a8444b113df52769849ad45ea440def8d1884b15 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 24 Nov 2017 11:10:34 +0100
-Subject: [PATCH 4/4] EPUBHTMLGenerator: implement custom footnote anchor text
-
-Try to avoid our default F<N> anchor text if possible, which only makes
-sense in English.
----
- src/lib/EPUBHTMLGenerator.cpp | 22 +++++++++++++++-------
- src/test/EPUBTextGeneratorTest.cpp | 25 +++++++++++++++++++++++++
- 2 files changed, 40 insertions(+), 7 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 96e7623..6b4c7c2 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -222,9 +222,14 @@ struct TextZoneSink
- //! destructor
- ~TextZoneSink() { }
- //! add a label called on main and a label in this ( delayed to allow openParagraph to be called )
-- void addLabel(EPUBXMLSink &output)
-+ void addLabel(EPUBXMLSink &output, const librevenge::RVNGString &number)
- {
-+ // Unique label, e.g. 'F1' for the first footnote.
- std::string lbl=label();
-+ // User-visible label, e.g. '1'.
-+ std::string uiLabel = lbl;
-+ if (!number.empty())
-+ uiLabel = number.cstr();
- if (!lbl.length())
- return;
- int version = 20;
-@@ -239,7 +244,7 @@ struct TextZoneSink
- aAttrs.insert("epub:type", "noteref");
- aAttrs.insert("href", ("#data" + lbl).c_str());
- output.openElement("a", aAttrs);
-- output.insertCharacters(lbl.c_str());
-+ output.insertCharacters(uiLabel.c_str());
- output.closeElement("a");
- output.closeElement("sup");
- }
-@@ -258,7 +263,7 @@ struct TextZoneSink
- RVNGPropertyList aAttrs;
- aAttrs.insert("href", ("#called" + lbl).c_str());
- m_delayedLabel.openElement("a", aAttrs);
-- m_delayedLabel.insertCharacters(lbl.c_str());
-+ m_delayedLabel.insertCharacters(uiLabel.c_str());
- m_delayedLabel.closeElement("a");
- m_delayedLabel.closeElement("sup");
- }
-@@ -806,13 +811,16 @@ void EPUBHTMLGenerator::closeListElement()
- m_impl->output().closeElement("li");
- }
-
--void EPUBHTMLGenerator::openFootnote(const RVNGPropertyList &)
-+void EPUBHTMLGenerator::openFootnote(const RVNGPropertyList &propList)
- {
- if (m_impl->m_ignore)
- return;
- EPUBXMLSink &output = m_impl->output();
- m_impl->push(EPUBHTMLTextZone::Z_FootNote);
-- m_impl->getSink().addLabel(output);
-+ librevenge::RVNGString number;
-+ if (const librevenge::RVNGProperty *numProp = propList["librevenge:number"])
-+ number = numProp->getStr();
-+ m_impl->getSink().addLabel(output, number);
- }
-
- void EPUBHTMLGenerator::closeFootnote()
-@@ -830,7 +838,7 @@ void EPUBHTMLGenerator::openEndnote(const RVNGPropertyList &)
- return;
- EPUBXMLSink &output = m_impl->output();
- m_impl->push(EPUBHTMLTextZone::Z_EndNote);
-- m_impl->getSink().addLabel(output);
-+ m_impl->getSink().addLabel(output, librevenge::RVNGString());
- }
-
- void EPUBHTMLGenerator::closeEndnote()
-@@ -846,7 +854,7 @@ void EPUBHTMLGenerator::openComment(const RVNGPropertyList & /*propList*/)
- return;
- EPUBXMLSink &output = m_impl->output();
- m_impl->push(EPUBHTMLTextZone::Z_Comment);
-- m_impl->getSink().addLabel(output);
-+ m_impl->getSink().addLabel(output, librevenge::RVNGString());
- }
-
- void EPUBHTMLGenerator::closeComment()
---
-2.13.6
-
-From bc80bf98172e8e0f8c803dec0b8e74e233ac482e Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 24 Nov 2017 16:28:58 +0100
-Subject: [PATCH 1/2] EPUBHTMLGenerator: support image popup for images
-
-If the user of the lib uses the librevenge:mime-type and
-office:binary-data keys (instead of xlink:href) for a link around an
-image, then open that image in a popup (using the footnote markup).
-
-The usual assumption is that the footnote anchor is trivial (just a
-string) and the content is complex, but here the situation is the
-opposite: the anchor can be something complex, OTOH the footnote content
-is always a single inline image -- this requires the new
-closeAnchor mode when adding the footnote label.
----
- src/lib/EPUBHTMLGenerator.cpp | 79 ++++++++++++++++++++++++++++++--------
- src/test/EPUBTextGeneratorTest.cpp | 34 ++++++++++++++++
- 2 files changed, 96 insertions(+), 17 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 6b4c7c2..75b0866 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -222,7 +222,8 @@ struct TextZoneSink
- //! destructor
- ~TextZoneSink() { }
- //! add a label called on main and a label in this ( delayed to allow openParagraph to be called )
-- void addLabel(EPUBXMLSink &output, const librevenge::RVNGString &number)
-+ //! @param closeAnchor determintes if the anchor on the main sink should be closed or not.
-+ void addLabel(EPUBXMLSink &output, const librevenge::RVNGString &number, bool closeAnchor)
- {
- // Unique label, e.g. 'F1' for the first footnote.
- std::string lbl=label();
-@@ -244,9 +245,12 @@ struct TextZoneSink
- aAttrs.insert("epub:type", "noteref");
- aAttrs.insert("href", ("#data" + lbl).c_str());
- output.openElement("a", aAttrs);
-- output.insertCharacters(uiLabel.c_str());
-- output.closeElement("a");
-- output.closeElement("sup");
-+ if (closeAnchor)
-+ {
-+ output.insertCharacters(uiLabel.c_str());
-+ output.closeElement("a");
-+ output.closeElement("sup");
-+ }
- }
- flush();
- if (version == 30)
-@@ -259,13 +263,16 @@ struct TextZoneSink
- RVNGPropertyList supAttrs;
- if (version < 30)
- supAttrs.insert("id", ("data" + lbl).c_str());
-- m_delayedLabel.openElement("sup", supAttrs);
-- RVNGPropertyList aAttrs;
-- aAttrs.insert("href", ("#called" + lbl).c_str());
-- m_delayedLabel.openElement("a", aAttrs);
-- m_delayedLabel.insertCharacters(uiLabel.c_str());
-- m_delayedLabel.closeElement("a");
-- m_delayedLabel.closeElement("sup");
-+ if (closeAnchor)
-+ {
-+ m_delayedLabel.openElement("sup", supAttrs);
-+ RVNGPropertyList aAttrs;
-+ aAttrs.insert("href", ("#called" + lbl).c_str());
-+ m_delayedLabel.openElement("a", aAttrs);
-+ m_delayedLabel.insertCharacters(uiLabel.c_str());
-+ m_delayedLabel.closeElement("a");
-+ m_delayedLabel.closeElement("sup");
-+ }
- }
- //! flush delayed label, ...
- void flush()
-@@ -379,6 +386,7 @@ struct EPUBHTMLGeneratorImpl
- , m_version(version)
- , m_frameAnchorTypes()
- , m_framePropertiesStack()
-+ , m_linkPropertiesStack()
- , m_stylesMethod(stylesMethod)
- , m_actualSink()
- , m_sinkStack()
-@@ -475,6 +483,8 @@ struct EPUBHTMLGeneratorImpl
-
- std::stack<std::string> m_frameAnchorTypes;
- std::stack<RVNGPropertyList> m_framePropertiesStack;
-+ /// This is used for links which don't have a href.
-+ std::stack<RVNGPropertyList> m_linkPropertiesStack;
-
- EPUBStylesMethod m_stylesMethod;
-
-@@ -702,14 +712,29 @@ void EPUBHTMLGenerator::openLink(const RVNGPropertyList &propList)
-
- attrs.insert("href", href.c_str());
- }
-- m_impl->output(false).openElement("a", attrs);
-+ const librevenge::RVNGProperty *binaryDataProp = propList["office:binary-data"];
-+ const librevenge::RVNGProperty *mimeTypeProp = propList["librevenge:mime-type"];
-+ if (binaryDataProp && mimeTypeProp)
-+ {
-+ // This is not a real link, but more an additional image on top of an
-+ // existing one, map it to footnotes instead.
-+ RVNGPropertyList linkProperties;
-+ linkProperties.insert("office:binary-data", binaryDataProp->clone());
-+ linkProperties.insert("librevenge:mime-type", mimeTypeProp->clone());
-+ m_impl->m_linkPropertiesStack.push(linkProperties);
-+ }
-+ else
-+ m_impl->output(false).openElement("a", attrs);
- }
-
- void EPUBHTMLGenerator::closeLink()
- {
- if (m_impl->m_ignore)
- return;
-- m_impl->output().closeElement("a");
-+ if (!m_impl->m_linkPropertiesStack.empty())
-+ m_impl->m_linkPropertiesStack.pop();
-+ else
-+ m_impl->output().closeElement("a");
- }
-
- void EPUBHTMLGenerator::insertTab()
-@@ -820,7 +845,8 @@ void EPUBHTMLGenerator::openFootnote(const RVNGPropertyList &propList)
- librevenge::RVNGString number;
- if (const librevenge::RVNGProperty *numProp = propList["librevenge:number"])
- number = numProp->getStr();
-- m_impl->getSink().addLabel(output, number);
-+ bool closeAnchor = m_impl->m_linkPropertiesStack.empty();
-+ m_impl->getSink().addLabel(output, number, closeAnchor);
- }
-
- void EPUBHTMLGenerator::closeFootnote()
-@@ -838,7 +864,7 @@ void EPUBHTMLGenerator::openEndnote(const RVNGPropertyList &)
- return;
- EPUBXMLSink &output = m_impl->output();
- m_impl->push(EPUBHTMLTextZone::Z_EndNote);
-- m_impl->getSink().addLabel(output, librevenge::RVNGString());
-+ m_impl->getSink().addLabel(output, librevenge::RVNGString(), true);
- }
-
- void EPUBHTMLGenerator::closeEndnote()
-@@ -854,7 +880,7 @@ void EPUBHTMLGenerator::openComment(const RVNGPropertyList & /*propList*/)
- return;
- EPUBXMLSink &output = m_impl->output();
- m_impl->push(EPUBHTMLTextZone::Z_Comment);
-- m_impl->getSink().addLabel(output, librevenge::RVNGString());
-+ m_impl->getSink().addLabel(output, librevenge::RVNGString(), true);
- }
-
- void EPUBHTMLGenerator::closeComment()
-@@ -1067,7 +1093,26 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str());
- // FIXME: use alternative repr. if available
- attrs.insert("alt", path.str().c_str());
-- m_impl->output().insertEmptyElement("img", attrs);
-+ if (!m_impl->m_linkPropertiesStack.empty())
-+ {
-+ RVNGPropertyList &linkProperties = m_impl->m_linkPropertiesStack.top();
-+ // Save the main sink, as m_impl->output() will point to the footnote sink.
-+ libepubgen::EPUBXMLSink &main = m_impl->output();
-+ openFootnote(RVNGPropertyList());
-+ main.insertEmptyElement("img", attrs);
-+ main.closeElement("a");
-+ main.closeElement("sup");
-+ const EPUBPath &linkPath = m_impl->m_imageManager.insert(
-+ RVNGBinaryData(linkProperties["office:binary-data"]->getStr()),
-+ linkProperties["librevenge:mime-type"]->getStr());
-+ RVNGPropertyList linkAttrs;
-+ linkAttrs.insert("src", linkPath.relativeTo(m_impl->m_path).str().c_str());
-+ linkAttrs.insert("alt", linkPath.str().c_str());
-+ m_impl->output().insertEmptyElement("img", linkAttrs);
-+ closeFootnote();
-+ }
-+ else
-+ m_impl->output().insertEmptyElement("img", attrs);
-
- if (!wrapStyle.empty())
- {
---
-2.13.6
-
-
-From 6e094bbe9fd8c1784ef3c348d04e2add8b48fc67 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Fri, 24 Nov 2017 17:18:53 +0100
-Subject: [PATCH 2/2] EPUBHTMLGenerator: support image popup for text
-
-And also make sure that the popup anchor is not superscript.
----
- src/lib/EPUBHTMLGenerator.cpp | 44 ++++++++++++++++++++++++++------------
- src/lib/EPUBHTMLGenerator.h | 4 ++++
- src/test/EPUBTextGeneratorTest.cpp | 31 ++++++++++++++++++++++++++-
- 3 files changed, 64 insertions(+), 15 deletions(-)
-
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 75b0866..5c6421c 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -239,7 +239,8 @@ struct TextZoneSink
- {
- RVNGPropertyList supAttrs;
- supAttrs.insert("id", ("called" + lbl).c_str());
-- output.openElement("sup", supAttrs);
-+ if (closeAnchor)
-+ output.openElement("sup", supAttrs);
- RVNGPropertyList aAttrs;
- if (version == 30)
- aAttrs.insert("epub:type", "noteref");
-@@ -769,7 +770,9 @@ void EPUBHTMLGenerator::insertText(const RVNGString &text)
- {
- if (m_impl->m_ignore)
- return;
-- m_impl->output().insertCharacters(text);
-+ EPUBXMLSink &sink = openPopup();
-+ sink.insertCharacters(text);
-+ closePopup(sink);
- m_impl->m_hasText = true;
- }
-
-@@ -1093,15 +1096,37 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str());
- // FIXME: use alternative repr. if available
- attrs.insert("alt", path.str().c_str());
-+ EPUBXMLSink &sink = openPopup();
-+ sink.insertEmptyElement("img", attrs);
-+ closePopup(sink);
-+
-+ if (!wrapStyle.empty())
-+ {
-+ attrs.clear();
-+ attrs.insert("style", wrapStyle);
-+ m_impl->output().insertEmptyElement("br", attrs);
-+ }
-+}
-+
-+EPUBXMLSink &EPUBHTMLGenerator::openPopup()
-+{
- if (!m_impl->m_linkPropertiesStack.empty())
- {
-- RVNGPropertyList &linkProperties = m_impl->m_linkPropertiesStack.top();
- // Save the main sink, as m_impl->output() will point to the footnote sink.
- libepubgen::EPUBXMLSink &main = m_impl->output();
- openFootnote(RVNGPropertyList());
-- main.insertEmptyElement("img", attrs);
-+ return main;
-+ }
-+ else
-+ return m_impl->output();
-+}
-+
-+void EPUBHTMLGenerator::closePopup(EPUBXMLSink &main)
-+{
-+ if (!m_impl->m_linkPropertiesStack.empty())
-+ {
-+ RVNGPropertyList &linkProperties = m_impl->m_linkPropertiesStack.top();
- main.closeElement("a");
-- main.closeElement("sup");
- const EPUBPath &linkPath = m_impl->m_imageManager.insert(
- RVNGBinaryData(linkProperties["office:binary-data"]->getStr()),
- linkProperties["librevenge:mime-type"]->getStr());
-@@ -1111,15 +1136,6 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
- m_impl->output().insertEmptyElement("img", linkAttrs);
- closeFootnote();
- }
-- else
-- m_impl->output().insertEmptyElement("img", attrs);
--
-- if (!wrapStyle.empty())
-- {
-- attrs.clear();
-- attrs.insert("style", wrapStyle);
-- m_impl->output().insertEmptyElement("br", attrs);
-- }
- }
-
- void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {}
-diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h
-index 11f20cb..3699179 100644
---- a/src/lib/EPUBHTMLGenerator.h
-+++ b/src/lib/EPUBHTMLGenerator.h
-@@ -27,6 +27,7 @@ class EPUBSpanStyleManager;
- class EPUBParagraphStyleManager;
- class EPUBTableStyleManager;
- class EPUBPath;
-+class EPUBXMLSink;
-
- class EPUBHTMLGenerator : public librevenge::RVNGTextInterface
- {
-@@ -112,6 +113,9 @@ public:
- void insertEquation(const librevenge::RVNGPropertyList &propList) override;
-
- private:
-+ EPUBXMLSink &openPopup();
-+ void closePopup(EPUBXMLSink &main);
-+
- std::unique_ptr<EPUBHTMLGeneratorImpl> m_impl;
-
- // Unimplemented to prevent compiler from creating crasher ones
---
-2.13.6
-
-From bd49e1672d0e914736824dadc8f89c26ae955088 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Tue, 28 Nov 2017 14:50:34 +0100
-Subject: [PATCH] [ABI CHANGE] optionally support the EPUB3 fixed layout
-
-Default is still the reflowable method, of course.
----
- inc/libepubgen/EPUBTextGenerator.h | 1 +
- inc/libepubgen/libepubgen-decls.h | 8 ++++++++
- src/lib/EPUBGenerator.cpp | 17 +++++++++++++++-
- src/lib/EPUBGenerator.h | 3 +++
- src/lib/EPUBHTMLGenerator.cpp | 41 ++++++++++++++++++++++++++++++++++----
- src/lib/EPUBHTMLGenerator.h | 2 +-
- src/lib/EPUBHTMLManager.cpp | 4 ++--
- src/lib/EPUBHTMLManager.h | 2 +-
- src/lib/EPUBTextGenerator.cpp | 5 +++++
- src/test/EPUBTextGeneratorTest.cpp | 27 +++++++++++++++++++++++++
- 10 files changed, 101 insertions(+), 9 deletions(-)
-
-diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h
-index cb2d9a6..beb05aa 100644
---- a/inc/libepubgen/EPUBTextGenerator.h
-+++ b/inc/libepubgen/EPUBTextGenerator.h
-@@ -43,6 +43,7 @@ public:
- void setSplitHeadingLevel(unsigned level);
- void setSplitSize(unsigned size);
- void setStylesMethod(EPUBStylesMethod styles);
-+ void setLayoutMethod(EPUBLayoutMethod layout);
-
- /** Register a handler for embedded images.
- *
-diff --git a/inc/libepubgen/libepubgen-decls.h b/inc/libepubgen/libepubgen-decls.h
-index 2657a2d..3eb206e 100644
---- a/inc/libepubgen/libepubgen-decls.h
-+++ b/inc/libepubgen/libepubgen-decls.h
-@@ -69,6 +69,14 @@ enum EPUBStylesMethod
- EPUB_STYLES_METHOD_INLINE, //< The styles will be described inline.
- };
-
-+/** The possible ways to lay out HTML files.
-+ */
-+enum EPUBLayoutMethod
-+{
-+ EPUB_LAYOUT_METHOD_REFLOWABLE, //< Dynamic pagination.
-+ EPUB_LAYOUT_METHOD_FIXED, //< Exactly one page per HTML file.
-+};
-+
- }
-
- #endif // INCLUDED_LIBEPUBGEN_LIBEPUBGEN_DECLS_H
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 571f0eb..4a62d7f 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -47,6 +47,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
- , m_splitGuard(split)
- , m_version(version)
- , m_stylesMethod(EPUB_STYLES_METHOD_CSS)
-+ , m_layoutMethod(EPUB_LAYOUT_METHOD_REFLOWABLE)
- {
- }
-
-@@ -117,7 +118,7 @@ void EPUBGenerator::startNewHtmlFile()
-
- m_splitGuard.onSplit();
-
-- m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_version);
-+ m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_layoutMethod, m_version);
-
- // restore state in the new file
- m_currentHtml->startDocument(m_documentProps);
-@@ -156,6 +157,11 @@ void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles)
- m_stylesMethod = styles;
- }
-
-+void EPUBGenerator::setLayoutMethod(EPUBLayoutMethod layout)
-+{
-+ m_layoutMethod = layout;
-+}
-+
- void EPUBGenerator::writeContainer()
- {
- EPUBXMLSink sink;
-@@ -362,6 +368,15 @@ void EPUBGenerator::writeRoot()
- metaAttrs.insert("content", generator.c_str());
- sink.openElement("meta", metaAttrs);
- sink.closeElement("meta");
-+
-+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED)
-+ {
-+ metaAttrs.clear();
-+ metaAttrs.insert("property", "rendition:layout");
-+ sink.openElement("meta", metaAttrs);
-+ sink.insertCharacters("pre-paginated");
-+ sink.closeElement("meta");
-+ }
- }
-
- sink.closeElement("metadata");
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index abc6a9a..5a0df86 100644
---- a/src/lib/EPUBGenerator.h
-+++ b/src/lib/EPUBGenerator.h
-@@ -53,6 +53,8 @@ public:
-
- void setStylesMethod(EPUBStylesMethod stylesMethod);
-
-+ void setLayoutMethod(EPUBLayoutMethod layoutMethod);
-+
- private:
- virtual void startHtmlFile() = 0;
- virtual void endHtmlFile() = 0;
-@@ -84,6 +86,7 @@ private:
-
- int m_version;
- EPUBStylesMethod m_stylesMethod;
-+ EPUBLayoutMethod m_layoutMethod;
- };
-
- }
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 5c6421c..4260858 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -7,6 +7,7 @@
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-+#include <cmath>
- #include <memory>
- #include <sstream>
- #include <stack>
-@@ -107,6 +108,11 @@ bool ZoneSinkImpl::endsInLineBreak() const
- ;
- }
-
-+/// Convers inches to CSS pixels.
-+int inchToCSSPixel(const librevenge::RVNGProperty *property)
-+{
-+ return round(property->getDouble() * 96);
-+}
- }
-
- namespace
-@@ -371,7 +377,7 @@ std::string EPUBHTMLTextZone::label(int id) const
- struct EPUBHTMLGeneratorImpl
- {
- //! constructor
-- EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version)
-+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version)
- : m_document(document)
- , m_imageManager(imageManager)
- , m_fontManager(fontManager)
-@@ -382,6 +388,7 @@ struct EPUBHTMLGeneratorImpl
- , m_path(path)
- , m_stylesheetPath(stylesheetPath)
- , m_actualPage(0)
-+ , m_actualPageProperties()
- , m_ignore(false)
- , m_hasText(false)
- , m_version(version)
-@@ -389,6 +396,7 @@ struct EPUBHTMLGeneratorImpl
- , m_framePropertiesStack()
- , m_linkPropertiesStack()
- , m_stylesMethod(stylesMethod)
-+ , m_layoutMethod(layoutMethod)
- , m_actualSink()
- , m_sinkStack()
- {
-@@ -477,6 +485,7 @@ struct EPUBHTMLGeneratorImpl
- const EPUBPath m_stylesheetPath;
-
- int m_actualPage;
-+ RVNGPropertyList m_actualPageProperties;
- bool m_ignore;
- /// Does the currently opened paragraph have some text?
- bool m_hasText;
-@@ -488,6 +497,7 @@ struct EPUBHTMLGeneratorImpl
- std::stack<RVNGPropertyList> m_linkPropertiesStack;
-
- EPUBStylesMethod m_stylesMethod;
-+ EPUBLayoutMethod m_layoutMethod;
-
- protected:
- std::unique_ptr<TextZoneSink> m_actualSink;
-@@ -499,8 +509,8 @@ private:
- EPUBHTMLGeneratorImpl operator=(EPUBHTMLGeneratorImpl const &orig);
- };
-
--EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version)
-- : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod, version))
-+EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version)
-+ : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod, layoutMethod, version))
- {
- }
-
-@@ -560,6 +570,25 @@ void EPUBHTMLGenerator::endDocument()
- metaAttrs.insert("content", "text/html; charset=UTF-8");
- m_impl->m_document.openElement("meta", metaAttrs);
- m_impl->m_document.closeElement("meta");
-+ if (m_impl->m_version >= 30 && m_impl->m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED)
-+ {
-+ metaAttrs.clear();
-+ metaAttrs.insert("name", "viewport");
-+ std::stringstream content;
-+ if (const librevenge::RVNGProperty *pageWidth = m_impl->m_actualPageProperties["fo:page-width"])
-+ {
-+ content << "width=";
-+ content << inchToCSSPixel(pageWidth);
-+ }
-+ if (const librevenge::RVNGProperty *pageHeight = m_impl->m_actualPageProperties["fo:page-height"])
-+ {
-+ content << ", height=";
-+ content << inchToCSSPixel(pageHeight);
-+ }
-+ metaAttrs.insert("content", content.str().c_str());
-+ m_impl->m_document.openElement("meta", metaAttrs);
-+ m_impl->m_document.closeElement("meta");
-+ }
- if (m_impl->m_version < 30)
- m_impl->sendMetaData(m_impl->m_document);
- RVNGPropertyList linkAttrs;
-@@ -582,9 +611,13 @@ void EPUBHTMLGenerator::defineEmbeddedFont(const RVNGPropertyList &propList)
- m_impl->m_fontManager.insert(propList, m_impl->m_path);
- }
-
--void EPUBHTMLGenerator::openPageSpan(const RVNGPropertyList & /* propList */)
-+void EPUBHTMLGenerator::openPageSpan(const RVNGPropertyList &propList)
- {
- m_impl->m_actualPage++;
-+
-+ librevenge::RVNGPropertyList::Iter i(propList);
-+ for (i.rewind(); i.next();)
-+ m_impl->m_actualPageProperties.insert(i.key(), i()->clone());
- }
-
- void EPUBHTMLGenerator::closePageSpan()
-diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h
-index 3699179..3c6577f 100644
---- a/src/lib/EPUBHTMLGenerator.h
-+++ b/src/lib/EPUBHTMLGenerator.h
-@@ -32,7 +32,7 @@ class EPUBXMLSink;
- class EPUBHTMLGenerator : public librevenge::RVNGTextInterface
- {
- public:
-- EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version);
-+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version);
- ~EPUBHTMLGenerator() override;
-
- void setDocumentMetaData(const librevenge::RVNGPropertyList &propList) override;
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index d2c21da..363b33e 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, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version)
- {
- 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, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod, version));
-+ new EPUBHTMLGenerator(m_contents.back(), imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod, layoutMethod, version));
-
- return gen;
- }
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index e1205e6..31e6dfe 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, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version);
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version);
-
- void writeTo(EPUBPackage &package);
-
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index 5d4e8f2..c3bc963 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -147,6 +147,11 @@ void EPUBTextGenerator::setStylesMethod(EPUBStylesMethod styles)
- m_impl->setStylesMethod(styles);
- }
-
-+void EPUBTextGenerator::setLayoutMethod(EPUBLayoutMethod layout)
-+{
-+ m_impl->setLayoutMethod(layout);
-+}
-+
- void EPUBTextGenerator::registerEmbeddedImageHandler(const librevenge::RVNGString &mimeType, EPUBEmbeddedImage imageHandler)
- {
- if (!mimeType.empty() && imageHandler)
---
-2.13.6
-
-From 38aa728708641942371507b975193f0ab60f0b50 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 29 Nov 2017 11:00:32 +0100
-Subject: [PATCH] EPUBGenerator: fixed layout implies split on page break
-
----
- Makefile.am | 3 +++
- src/lib/EPUBGenerator.cpp | 8 ++++++++
- src/lib/EPUBHTMLGenerator.cpp | 16 ++++++++++++++++
- src/lib/EPUBHTMLGenerator.h | 5 +++++
- src/lib/EPUBSplitGuard.cpp | 5 +++++
- src/lib/EPUBSplitGuard.h | 4 +++-
- src/test/EPUBTextGeneratorTest.cpp | 31 +++++++++++++++++++++++++++++++
- 7 files changed, 71 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 4a62d7f..f608331 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -118,7 +118,12 @@ void EPUBGenerator::startNewHtmlFile()
-
- m_splitGuard.onSplit();
-
-+ librevenge::RVNGPropertyList pageProperties;
-+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED && m_currentHtml)
-+ m_currentHtml->getPageProperties(pageProperties);
- m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_layoutMethod, m_version);
-+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED)
-+ m_currentHtml->setPageProperties(pageProperties);
-
- // restore state in the new file
- m_currentHtml->startDocument(m_documentProps);
-@@ -160,6 +165,9 @@ void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles)
- void EPUBGenerator::setLayoutMethod(EPUBLayoutMethod layout)
- {
- m_layoutMethod = layout;
-+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED)
-+ // Fixed layout implies split on page break.
-+ m_splitGuard.setSplitMethod(EPUB_SPLIT_METHOD_PAGE_BREAK);
- }
-
- void EPUBGenerator::writeContainer()
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 4260858..7a53ce3 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -1173,6 +1173,22 @@ void EPUBHTMLGenerator::closePopup(EPUBXMLSink &main)
-
- void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {}
-
-+void EPUBHTMLGenerator::getPageProperties(librevenge::RVNGPropertyList &propList) const
-+{
-+ propList.clear();
-+ librevenge::RVNGPropertyList::Iter i(m_impl->m_actualPageProperties);
-+ for (i.rewind(); i.next();)
-+ propList.insert(i.key(), i()->clone());
-+}
-+
-+void EPUBHTMLGenerator::setPageProperties(const librevenge::RVNGPropertyList &propList)
-+{
-+ m_impl->m_actualPageProperties.clear();
-+ librevenge::RVNGPropertyList::Iter i(propList);
-+ for (i.rewind(); i.next();)
-+ m_impl->m_actualPageProperties.insert(i.key(), i()->clone());
-+}
-+
- }
-
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
-diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h
-index 3c6577f..ef7d542 100644
---- a/src/lib/EPUBHTMLGenerator.h
-+++ b/src/lib/EPUBHTMLGenerator.h
-@@ -112,6 +112,11 @@ public:
- void insertBinaryObject(const librevenge::RVNGPropertyList &propList) override;
- void insertEquation(const librevenge::RVNGPropertyList &propList) override;
-
-+ /// Gets the actual page properties into propList.
-+ void getPageProperties(librevenge::RVNGPropertyList &propList) const;
-+ /// Sets the actual page properties from propList.
-+ void setPageProperties(const librevenge::RVNGPropertyList &propList);
-+
- private:
- EPUBXMLSink &openPopup();
- void closePopup(EPUBXMLSink &main);
-diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
-index 890500b..4f7531d 100644
---- a/src/lib/EPUBSplitGuard.cpp
-+++ b/src/lib/EPUBSplitGuard.cpp
-@@ -40,6 +40,11 @@ void EPUBSplitGuard::setSplitSize(const unsigned size)
- m_size = size;
- }
-
-+void EPUBSplitGuard::setSplitMethod(EPUBSplitMethod method)
-+{
-+ m_method = method;
-+}
-+
- void EPUBSplitGuard::openLevel()
- {
- ++m_nestingLevel;
-diff --git a/src/lib/EPUBSplitGuard.h b/src/lib/EPUBSplitGuard.h
-index 1a74079..ff55846 100644
---- a/src/lib/EPUBSplitGuard.h
-+++ b/src/lib/EPUBSplitGuard.h
-@@ -23,6 +23,8 @@ public:
- void setSplitHeadingLevel(unsigned level);
- void setCurrentHeadingLevel(unsigned level);
- void setSplitSize(unsigned size);
-+ /// Allows overwriting the value given in the constructor.
-+ void setSplitMethod(EPUBSplitMethod method);
-
- void openLevel();
- void closeLevel();
-@@ -39,7 +41,7 @@ private:
- bool canSplit(EPUBSplitMethod method) const;
-
- private:
-- const EPUBSplitMethod m_method;
-+ EPUBSplitMethod m_method;
- unsigned m_headingLevel;
- unsigned m_currentHeadingLevel;
- unsigned m_size;
---
-2.13.6
-
-From d9921c47befa3eabcfc916e26e273667232be637 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 29 Nov 2017 14:44:55 +0100
-Subject: [PATCH] EPUBTextGenerator: page-break=auto is not a page break
-
----
- src/lib/EPUBTextGenerator.cpp | 14 ++++++++++++--
- src/test/EPUBTextGeneratorTest.cpp | 21 +++++++++++++++++++++
- 2 files changed, 33 insertions(+), 2 deletions(-)
-
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index c3bc963..02c299a 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -53,6 +53,16 @@ bool operator!=(const char *const left, const RVNGString &right)
- return right != left;
- }
-
-+/// Determines if this break property a page break one.
-+bool isPageBreak(const librevenge::RVNGProperty *property)
-+{
-+ if (!property)
-+ return false;
-+
-+ librevenge::RVNGString str = property->getStr();
-+ return str != "column" && str != "auto";
-+}
-+
- }
-
- struct EPUBTextGenerator::Impl : public EPUBGenerator
-@@ -259,10 +269,10 @@ void EPUBTextGenerator::defineParagraphStyle(const librevenge::RVNGPropertyList
- void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propList)
- {
- const RVNGProperty *const breakBefore = propList["fo:break-before"];
-- if (breakBefore && ("column" != breakBefore->getStr()) && m_impl->getSplitGuard().splitOnPageBreak())
-+ if (isPageBreak(breakBefore) && m_impl->getSplitGuard().splitOnPageBreak())
- m_impl->startNewHtmlFile();
- const RVNGProperty *const breakAfter = propList["fo:break-after"];
-- m_impl->m_breakAfterPara = breakAfter && ("column" != breakAfter->getStr());
-+ m_impl->m_breakAfterPara = isPageBreak(breakAfter);
- if (m_impl->getSplitGuard().splitOnSize())
- m_impl->startNewHtmlFile();
-
---
-2.13.6
-
-From 88b9d9a1efb9b064ea99c57ec273f76712d361ff Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Thu, 30 Nov 2017 11:32:41 +0100
-Subject: [PATCH] EPUBTextGenerator: allow a single image on a page
-
----
- src/lib/EPUBTextGenerator.cpp | 1 +
- src/test/EPUBTextGeneratorTest.cpp | 24 ++++++++++++++++++++++++
- 2 files changed, 25 insertions(+)
-
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index 02c299a..38573ec 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -684,6 +684,7 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
- if (m_impl->m_inHeader || m_impl->m_inFooter)
- m_impl->m_currentHeaderOrFooter->addInsertBinaryObject(newPropList);
-
-+ m_impl->getSplitGuard().incrementSize(1);
- m_impl->getHtml()->insertBinaryObject(newPropList);
- }
-
---
-2.13.6
-
-diff --git a/NEWS b/NEWS
-index 912efbc..ad3d4d1 100644
---- a/NEWS
-+++ b/NEWS
-@@ -1,3 +1,13 @@
-+- Fix various validation problems, pointed out by epubcheck.
-+- Add EPUB3 support.
-+- Split on headings: add user-friendly section names.
-+- Support writing CSS styles inline in the XHTML streams.
-+- Support various image wrap types.
-+- Support embedded fonts.
-+- Support cover images.
-+- Support footnotes.
-+- Support EPUB3 fixed layout.
-+
- libepubgen-0.0.1
-
- - Fix escaping of HTML entities.
-diff --git a/inc/libepubgen/EPUBDrawingGenerator.h b/inc/libepubgen/EPUBDrawingGenerator.h
-index 963e3b8..8f14959 100644
---- a/inc/libepubgen/EPUBDrawingGenerator.h
-+++ b/inc/libepubgen/EPUBDrawingGenerator.h
-@@ -36,13 +36,19 @@ public:
- *
- * @param[in] version possible values: 20, 30.
- */
-- explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
-+ explicit EPUBDrawingGenerator(EPUBPackage *package, int version = 30);
- EPUBDrawingGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
- ~EPUBDrawingGenerator() override;
-
- void setSplitHeadingLevel(unsigned level);
- void setSplitSize(unsigned size);
-
-+ /** Set an option for the EPUB generator
-+ * @param[in] key a value from the EPUBGeneratorOption enumeration
-+ * @param[in] value depends on the value of key
-+ */
-+ void setOption(int key, int value);
-+
- /** Register a handler for embedded images.
- *
- * The handler must convert the image to one of the OPS Core Media Types.
-diff --git a/inc/libepubgen/EPUBPresentationGenerator.h b/inc/libepubgen/EPUBPresentationGenerator.h
-index 512c52d..b7ad190 100644
---- a/inc/libepubgen/EPUBPresentationGenerator.h
-+++ b/inc/libepubgen/EPUBPresentationGenerator.h
-@@ -36,13 +36,19 @@ public:
- *
- * @param[in] version possible values: 20, 30.
- */
-- explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
-+ explicit EPUBPresentationGenerator(EPUBPackage *package, int version = 30);
- EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
- ~EPUBPresentationGenerator() override;
-
- void setSplitHeadingLevel(unsigned level);
- void setSplitSize(unsigned size);
-
-+ /** Set an option for the EPUB generator
-+ * @param[in] key a value from the EPUBGeneratorOption enumeration
-+ * @param[in] value depends on the value of key
-+ */
-+ void setOption(int key, int value);
-+
- /** Register a handler for embedded images.
- *
- * The handler must convert the image to one of the OPS Core Media Types.
-diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h
-index beb05aa..809078a 100644
---- a/inc/libepubgen/EPUBTextGenerator.h
-+++ b/inc/libepubgen/EPUBTextGenerator.h
-@@ -36,14 +36,19 @@ public:
- *
- * @param[in] version possible values: 20, 30.
- */
-- explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
-+ explicit EPUBTextGenerator(EPUBPackage *package, int version = 30);
- EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
- ~EPUBTextGenerator() override;
-
- void setSplitHeadingLevel(unsigned level);
- void setSplitSize(unsigned size);
-- void setStylesMethod(EPUBStylesMethod styles);
-- void setLayoutMethod(EPUBLayoutMethod layout);
-+
-+ /** Set an option for the EPUB generator
-+ *
-+ * @param[in] key a value from the EPUBGeneratorOption enumeration
-+ * @param[in] value depends on the value of key
-+ */
-+ void setOption(int key, int value);
-
- /** Register a handler for embedded images.
- *
-diff --git a/inc/libepubgen/libepubgen-decls.h b/inc/libepubgen/libepubgen-decls.h
-index 3eb206e..490dbc3 100644
---- a/inc/libepubgen/libepubgen-decls.h
-+++ b/inc/libepubgen/libepubgen-decls.h
-@@ -77,6 +77,15 @@ enum EPUBLayoutMethod
- EPUB_LAYOUT_METHOD_FIXED, //< Exactly one page per HTML file.
- };
-
-+/** The possible options for a generator.
-+ */
-+enum EPUBGeneratorOption
-+{
-+ EPUB_GENERATOR_OPTION_SPLIT, //< EPUBSplitMethod.
-+ EPUB_GENERATOR_OPTION_STYLES, //< EPUBStylesMethod.
-+ EPUB_GENERATOR_OPTION_LAYOUT //< EPUBLayoutMethod.
-+};
-+
- }
-
- #endif // INCLUDED_LIBEPUBGEN_LIBEPUBGEN_DECLS_H
-diff --git a/src/lib/EPUBDrawingGenerator.cpp b/src/lib/EPUBDrawingGenerator.cpp
-index bcb4994..aef43ad 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, int version);
-+ Impl(EPUBPackage *const package, int version);
- };
-
--EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-- : EPUBPagedGenerator(package, method, version)
-+EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, int version)
-+ : EPUBPagedGenerator(package, version)
- {
- }
-
--EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split, int version)
-- : m_impl(new Impl(package, split, version))
-+EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, int version)
-+ : m_impl(new Impl(package, version))
- {
- }
-
-@@ -51,6 +51,16 @@ void EPUBDrawingGenerator::setSplitHeadingLevel(const unsigned level)
- m_impl->setSplitHeadingLevel(level);
- }
-
-+void EPUBDrawingGenerator::setOption(int key, int value)
-+{
-+ switch (key)
-+ {
-+ case EPUB_GENERATOR_OPTION_SPLIT:
-+ m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value));
-+ break;
-+ }
-+}
-+
- void EPUBDrawingGenerator::setSplitSize(const unsigned size)
- {
- m_impl->setSplitSize(size);
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index f608331..83f3f40 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -30,7 +30,7 @@ using librevenge::RVNGPropertyFactory;
- using librevenge::RVNGPropertyList;
- using librevenge::RVNGString;
-
--EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split, int version)
-+EPUBGenerator::EPUBGenerator(EPUBPackage *const package, int version)
- : m_package(package)
- , m_manifest()
- , m_htmlManager(m_manifest)
-@@ -44,7 +44,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
- , m_documentProps()
- , m_metadata()
- , m_currentHtml()
-- , m_splitGuard(split)
-+ , m_splitGuard(EPUB_SPLIT_METHOD_PAGE_BREAK)
- , m_version(version)
- , m_stylesMethod(EPUB_STYLES_METHOD_CSS)
- , m_layoutMethod(EPUB_LAYOUT_METHOD_REFLOWABLE)
-@@ -61,7 +61,7 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
-
- startNewHtmlFile();
-
-- if (m_version == 30)
-+ if (m_version >= 30)
- m_manifest.insert(EPUBPath("OEBPS/toc.xhtml"), "application/xhtml+xml", "toc.xhtml", "nav");
- m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
- m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
-@@ -88,7 +88,7 @@ void EPUBGenerator::setDocumentMetaData(const RVNGPropertyList &props)
- {
- m_metadata = props;
-
-- if (m_version == 30)
-+ if (m_version >= 30)
- {
- const librevenge::RVNGPropertyListVector *coverImages = props.child("librevenge:cover-images");
- if (coverImages)
-@@ -157,6 +157,11 @@ int EPUBGenerator::getVersion() const
- return m_version;
- }
-
-+void EPUBGenerator::setSplitMethod(EPUBSplitMethod split)
-+{
-+ m_splitGuard.setSplitMethod(split);
-+}
-+
- void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles)
- {
- m_stylesMethod = styles;
-@@ -195,7 +200,7 @@ void EPUBGenerator::writeContainer()
-
- void EPUBGenerator::writeNavigation()
- {
-- if (m_version == 30)
-+ if (m_version >= 30)
- {
- EPUBXMLSink sink;
-
-@@ -214,7 +219,7 @@ void EPUBGenerator::writeNavigation()
- sink.openElement("nav", navAttrs);
-
- sink.openElement("ol");
-- m_htmlManager.writeTocTo(sink, path, m_version);
-+ m_htmlManager.writeTocTo(sink, path, m_version, m_layoutMethod);
- sink.closeElement("ol");
-
- sink.closeElement("nav");
-@@ -248,7 +253,7 @@ void EPUBGenerator::writeNavigation()
- sink.openElement("navMap");
- // 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);
-+ m_htmlManager.writeTocTo(sink, path, /*version=*/20, m_layoutMethod);
- sink.closeElement("navMap");
-
- sink.closeElement("ncx");
-@@ -281,7 +286,7 @@ 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");
-- if (m_version == 30)
-+ if (m_version >= 30)
- packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("3.0"));
- else
- packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0"));
-@@ -326,7 +331,7 @@ void EPUBGenerator::writeRoot()
- sink.insertCharacters(language);
- sink.closeElement("dc:language");
-
-- if (m_version == 30)
-+ if (m_version >= 30)
- {
- RVNGString date;
- time_t now = 0;
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index 5a0df86..bcb54c5 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, int version);
-+ EPUBGenerator(EPUBPackage *package, int version);
- virtual ~EPUBGenerator();
-
- void startDocument(const librevenge::RVNGPropertyList &props);
-@@ -51,6 +51,8 @@ public:
- EPUBSplitGuard &getSplitGuard();
- int getVersion() const;
-
-+ void setSplitMethod(EPUBSplitMethod splitMethod);
-+
- void setStylesMethod(EPUBStylesMethod stylesMethod);
-
- void setLayoutMethod(EPUBLayoutMethod layoutMethod);
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
-index 7a53ce3..342213e 100644
---- a/src/lib/EPUBHTMLGenerator.cpp
-+++ b/src/lib/EPUBHTMLGenerator.cpp
-@@ -239,7 +239,7 @@ struct TextZoneSink
- uiLabel = number.cstr();
- if (!lbl.length())
- return;
-- int version = 20;
-+ int version = 30;
- if (m_zone)
- version = m_zone->getVersion();
- {
-@@ -248,7 +248,7 @@ struct TextZoneSink
- if (closeAnchor)
- output.openElement("sup", supAttrs);
- RVNGPropertyList aAttrs;
-- if (version == 30)
-+ if (version >= 30)
- aAttrs.insert("epub:type", "noteref");
- aAttrs.insert("href", ("#data" + lbl).c_str());
- output.openElement("a", aAttrs);
-@@ -260,7 +260,7 @@ struct TextZoneSink
- }
- }
- flush();
-- if (version == 30)
-+ if (version >= 30)
- {
- RVNGPropertyList asideAttrs;
- asideAttrs.insert("epub:type", "footnote");
-@@ -598,7 +598,7 @@ void EPUBHTMLGenerator::endDocument()
- m_impl->m_document.insertEmptyElement("link", linkAttrs);
- m_impl->m_document.closeElement("head");
- RVNGPropertyList bodyAttrs;
-- if (m_impl->m_version == 30)
-+ if (m_impl->m_version >= 30)
- bodyAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops");
- m_impl->m_document.openElement("body", bodyAttrs);
- m_impl->flushUnsent(m_impl->m_document);
-@@ -889,7 +889,7 @@ void EPUBHTMLGenerator::closeFootnote()
- {
- if (m_impl->m_ignore)
- return;
-- if (m_impl->m_version == 30)
-+ if (m_impl->m_version >= 30)
- m_impl->output().closeElement("aside");
- m_impl->pop();
- }
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index 363b33e..5e96d1d 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -22,10 +22,16 @@ 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)
-+void getPathTitle(std::ostringstream &label, const EPUBPath &path, EPUBLayoutMethod layout, std::vector<EPUBPath>::size_type index)
- {
- if (path.getTitle().empty())
-- label << "Section " << (index + 1);
-+ {
-+ if (layout == EPUB_LAYOUT_METHOD_FIXED)
-+ label << "Page ";
-+ else
-+ label << "Section ";
-+ label << (index + 1);
-+ }
- else
- label << path.getTitle();
- }
-@@ -81,9 +87,9 @@ void EPUBHTMLManager::writeSpineTo(EPUBXMLSink &sink)
- }
- }
-
--void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version)
-+void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version, EPUBLayoutMethod layout)
- {
-- if (version == 30)
-+ if (version >= 30)
- {
- for (std::vector<EPUBPath>::size_type i = 0; m_paths.size() != i; ++i)
- {
-@@ -92,7 +98,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;
-- getPathTitle(label, m_paths[i], i);
-+ getPathTitle(label, m_paths[i], layout, i);
- sink.insertCharacters(label.str().c_str());
- sink.closeElement("a");
- sink.closeElement("li");
-@@ -115,7 +121,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
- sink.openElement("navLabel");
- sink.openElement("text");
- std::ostringstream label;
-- getPathTitle(label, m_paths[i], i);
-+ getPathTitle(label, m_paths[i], layout, i);
- sink.insertCharacters(label.str().c_str());
- sink.closeElement("text");
- sink.closeElement("navLabel");
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
-index 31e6dfe..157896b 100644
---- a/src/lib/EPUBHTMLManager.h
-+++ b/src/lib/EPUBHTMLManager.h
-@@ -46,7 +46,7 @@ public:
- void writeTo(EPUBPackage &package);
-
- void writeSpineTo(EPUBXMLSink &sink);
-- void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version);
-+ void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version, EPUBLayoutMethod layout);
-
- /// Appends text to the title of the current heading.
- void insertHeadingText(const std::string &text);
-diff --git a/src/lib/EPUBPagedGenerator.cpp b/src/lib/EPUBPagedGenerator.cpp
-index 6a3bff0..b3a06e4 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, int version);
-+ Impl(EPUBPackage *const package, int version);
-
- private:
- void startHtmlFile() override;
-@@ -35,12 +35,17 @@ public:
- bool m_firstPage;
- };
-
--EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-- : EPUBGenerator(package, method, version)
-+EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, int version)
-+ : EPUBGenerator(package, version)
- , m_firstPage(true)
- {
- }
-
-+void EPUBPagedGenerator::setSplitMethod(EPUBSplitMethod split)
-+{
-+ m_impl->setSplitMethod(split);
-+}
-+
- void EPUBPagedGenerator::setSplitHeadingLevel(const unsigned level)
- {
- m_impl->getSplitGuard().setSplitHeadingLevel(level);
-@@ -59,8 +64,8 @@ void EPUBPagedGenerator::Impl::endHtmlFile()
- {
- }
-
--EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-- : m_impl(new Impl(package, method, version))
-+EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, int version)
-+ : m_impl(new Impl(package, version))
- {
- }
-
-diff --git a/src/lib/EPUBPagedGenerator.h b/src/lib/EPUBPagedGenerator.h
-index 74d70da..4effb65 100644
---- a/src/lib/EPUBPagedGenerator.h
-+++ b/src/lib/EPUBPagedGenerator.h
-@@ -26,8 +26,9 @@ class EPUBPagedGenerator: public librevenge::RVNGPresentationInterface
- class Impl;
-
- public:
-- EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
-+ EPUBPagedGenerator(EPUBPackage *package, int version);
-
-+ void setSplitMethod(EPUBSplitMethod split);
- void setSplitHeadingLevel(unsigned level);
- void setSplitSize(unsigned size);
-
-diff --git a/src/lib/EPUBPresentationGenerator.cpp b/src/lib/EPUBPresentationGenerator.cpp
-index 80b5ac2..3ebca24 100644
---- a/src/lib/EPUBPresentationGenerator.cpp
-+++ b/src/lib/EPUBPresentationGenerator.cpp
-@@ -20,18 +20,17 @@ using librevenge::RVNGString;
- class EPUBPresentationGenerator::Impl : public EPUBPagedGenerator
- {
- public:
-- Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
-+ Impl(EPUBPackage *const package, int version);
- };
-
--EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-- : EPUBPagedGenerator(package, method, version)
-+EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, int version)
-+ : EPUBPagedGenerator(package, version)
- {
- }
-
--EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method, int version)
-- : m_impl(new Impl(package, method, version))
-+EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, int version)
-+ : m_impl(new Impl(package, version))
- {
-- (void) method;
- }
-
- EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *const package)
-@@ -47,6 +46,16 @@ EPUBPresentationGenerator::~EPUBPresentationGenerator()
- delete m_impl;
- }
-
-+void EPUBPresentationGenerator::setOption(int key, int value)
-+{
-+ switch (key)
-+ {
-+ case EPUB_GENERATOR_OPTION_SPLIT:
-+ m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value));
-+ break;
-+ }
-+}
-+
- void EPUBPresentationGenerator::setSplitHeadingLevel(const unsigned level)
- {
- m_impl->setSplitHeadingLevel(level);
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index 38573ec..78eeaae 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -67,7 +67,7 @@ bool isPageBreak(const librevenge::RVNGProperty *property)
-
- struct EPUBTextGenerator::Impl : public EPUBGenerator
- {
-- Impl(EPUBPackage *package, EPUBSplitMethod method, int version);
-+ Impl(EPUBPackage *package, int version);
-
- private:
- void startHtmlFile() override;
-@@ -93,8 +93,8 @@ private:
- Impl &operator=(const Impl &);
- };
-
--EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-- : EPUBGenerator(package, method, version)
-+EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, int version)
-+ : EPUBGenerator(package, version)
- , m_inPageSpan(false)
- , m_inHeader(false)
- , m_inFooter(false)
-@@ -123,10 +123,9 @@ void EPUBTextGenerator::Impl::endHtmlFile()
- m_currentFooter->write(getHtml().get());
- }
-
--EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-- : m_impl(new Impl(package, method, version))
-+EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, int version)
-+ : m_impl(new Impl(package, version))
- {
-- (void) method;
- }
-
- EPUBTextGenerator::EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *const package)
-@@ -152,14 +151,20 @@ void EPUBTextGenerator::setSplitSize(const unsigned size)
- m_impl->getSplitGuard().setSplitSize(size);
- }
-
--void EPUBTextGenerator::setStylesMethod(EPUBStylesMethod styles)
-+void EPUBTextGenerator::setOption(int key, int value)
- {
-- m_impl->setStylesMethod(styles);
--}
--
--void EPUBTextGenerator::setLayoutMethod(EPUBLayoutMethod layout)
--{
-- m_impl->setLayoutMethod(layout);
-+ switch (key)
-+ {
-+ case EPUB_GENERATOR_OPTION_SPLIT:
-+ m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value));
-+ break;
-+ case EPUB_GENERATOR_OPTION_STYLES:
-+ m_impl->setStylesMethod(static_cast<EPUBStylesMethod>(value));
-+ break;
-+ case EPUB_GENERATOR_OPTION_LAYOUT:
-+ m_impl->setLayoutMethod(static_cast<EPUBLayoutMethod>(value));
-+ break;
-+ }
- }
-
- void EPUBTextGenerator::registerEmbeddedImageHandler(const librevenge::RVNGString &mimeType, EPUBEmbeddedImage imageHandler)
diff --git a/external/libepubgen/libepubgen-validation1.patch.1 b/external/libepubgen/libepubgen-validation1.patch.1
deleted file mode 100644
index 18707e76205d..000000000000
--- a/external/libepubgen/libepubgen-validation1.patch.1
+++ /dev/null
@@ -1,49 +0,0 @@
-From 96e9786f5aba1078251f36e58feefc8d953cdea0 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Tue, 8 Aug 2017 16:54:24 +0200
-Subject: [PATCH 1/3] EPUBGenerator: fix validation error with empty
- dc:identifier element
-
-<http://www.idpf.org/epub/31/spec/epub-packages.html#sec-opf-dcidentifier>
-"3.4.3.2.1 The identifier Element" says that the character content is
-not optional, so write it.
----
- configure.ac | 3 +++
- src/lib/EPUBGenerator.cpp | 14 +++++++++++++-
- 2 files changed, 16 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 0d0f866..507eb14 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/.
- */
-
-+#include <boost/uuid/uuid.hpp>
-+#include <boost/uuid/uuid_generators.hpp>
-+#include <boost/uuid/uuid_io.hpp>
-+
- #include "EPUBCSSSink.h"
- #include "EPUBHTMLGenerator.h"
- #include "EPUBGenerator.h"
-@@ -193,7 +197,15 @@ void EPUBGenerator::writeRoot()
-
- RVNGPropertyList identifierAttrs;
- identifierAttrs.insert("id", uniqueId);
-- sink.insertEmptyElement("dc:identifier", identifierAttrs);
-+ 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:");
-+ boost::uuids::uuid uuid = boost::uuids::random_generator()();
-+ identifierStream << uuid;
-+ std::string identifierCharactrs = identifierStream.str();
-+ sink.insertCharacters(identifierCharactrs.c_str());
-+ sink.closeElement("dc:identifier");
-
- sink.openElement("dc:title");
- sink.closeElement("dc:title");
---
-2.12.3
-
diff --git a/external/libepubgen/libepubgen-validation2.patch.1 b/external/libepubgen/libepubgen-validation2.patch.1
deleted file mode 100644
index a1807f33841b..000000000000
--- a/external/libepubgen/libepubgen-validation2.patch.1
+++ /dev/null
@@ -1,34 +0,0 @@
-From 2e51fb9163bbc6b9a27fa524382c5aad9700dd0d Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Tue, 8 Aug 2017 17:23:38 +0200
-Subject: [PATCH 2/3] EPUBGenerator: don't write empty guide element
-
-<http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.6> "2.6:
-Guide" requires:
-
- Within the package there may be one guide element, containing one or
- more reference elements.
-
-Given that we never wrote reference child-elements, just don't write the
-guide element at all, especially seeing that it's deprecated in OPF3.
----
- src/lib/EPUBGenerator.cpp | 3 ---
- 1 file changed, 3 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 507eb14..9dbccac 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -225,9 +225,6 @@ void EPUBGenerator::writeRoot()
- m_htmlManager.writeSpineTo(sink);
- sink.closeElement("spine");
-
-- sink.openElement("guide");
-- sink.closeElement("guide");
--
- sink.closeElement("package");
-
- sink.writeTo(*m_package, "OEBPS/content.opf");
---
-2.12.3
-
diff --git a/external/libepubgen/libepubgen-validation3.patch.1 b/external/libepubgen/libepubgen-validation3.patch.1
deleted file mode 100644
index b543e5a96e38..000000000000
--- a/external/libepubgen/libepubgen-validation3.patch.1
+++ /dev/null
@@ -1,35 +0,0 @@
-From 9041ef42f9e0a5c4bc3b0a912d36683c4e10ca84 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Tue, 8 Aug 2017 17:39:18 +0200
-Subject: [PATCH 3/3] EPUBHTMLManager: fix value of <navPoint playOrder"...">
-
-<http://www.niso.org/workrooms/daisy/Z39-86-2005.html#NCXplay> "8.4.3
-playOrder Attribute" says:
-
- playOrder is a positive integer; the first playOrder value in a document
- shall be 1.
-
-So instead of writing an empty attribute, write the same number that's
-already used for <navPoint id="...">.
----
- src/lib/EPUBHTMLManager.cpp | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index e5add82..03dbf21 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -75,7 +75,9 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath)
- id << "section" << (i + 1);
- navPointAttrs.insert("id", id.str().c_str());
- navPointAttrs.insert("class", "document");
-- navPointAttrs.insert("playOrder", "");
-+ std::ostringstream playOrder;
-+ playOrder << (i + 1);
-+ navPointAttrs.insert("playOrder", playOrder.str().c_str());
- sink.openElement("navPoint", navPointAttrs);
- sink.openElement("navLabel");
- sink.openElement("text");
---
-2.12.3
-
diff --git a/external/libepubgen/libepubgen-vc.patch.1 b/external/libepubgen/libepubgen-vc.patch.1
deleted file mode 100644
index 4c929ed47a86..000000000000
--- a/external/libepubgen/libepubgen-vc.patch.1
+++ /dev/null
@@ -1,59 +0,0 @@
-From 49f6461d4751d3b16e32ab8f9c93a3856b33be49 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 2 Aug 2017 14:53:36 +0200
-Subject: [PATCH] m4: MSVC defines __cplusplus as 199711L still
-
-See e.g.
-<https://stackoverflow.com/questions/37503029/cplusplus-is-equal-to-199711-in-msvc-does-it-support-c11>,
-on MSVC we can't depend on the value of __cplusplus, since that one is a
-too low value, even if everything else works fine.
----
- m4/ax_cxx_compile_stdcxx.m4 | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff -Naur a/configure b/configure
---- a/configure 2017-08-02 14:50:09.000000000 +0200
-+++ b/configure 2017-08-02 14:50:57.000000000 +0200
-@@ -16001,7 +16001,7 @@
-
- #error "This is not a C++ compiler"
-
--#elif __cplusplus < 201103L
-+#elif __cplusplus < 201103L && !(defined _MSC_VER)
-
- #error "This is not a C++11 compiler"
-
-@@ -16314,7 +16314,7 @@
-
- #error "This is not a C++ compiler"
-
--#elif __cplusplus < 201103L
-+#elif __cplusplus < 201103L && !(defined _MSC_VER)
-
- #error "This is not a C++11 compiler"
-
-@@ -16636,7 +16636,7 @@
-
- #error "This is not a C++ compiler"
-
--#elif __cplusplus < 201103L
-+#elif __cplusplus < 201103L && !(defined _MSC_VER)
-
- #error "This is not a C++11 compiler"
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 9dbccac..3357cf2 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -7,6 +7,8 @@
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-+#include <sstream>
-+
- #include <boost/uuid/uuid.hpp>
- #include <boost/uuid/uuid_generators.hpp>
- #include <boost/uuid/uuid_io.hpp>
---
-2.12.3
-
diff --git a/writerperfect/Module_writerperfect.mk b/writerperfect/Module_writerperfect.mk
index 01f8a0dc5e59..6fa274bc8ce5 100644
--- a/writerperfect/Module_writerperfect.mk
+++ b/writerperfect/Module_writerperfect.mk
@@ -40,7 +40,7 @@ $(eval $(call gb_Module_add_check_targets,writerperfect,\
$(eval $(call gb_Module_add_slowcheck_targets,writerperfect,\
CppunitTest_writerperfect_calc \
CppunitTest_writerperfect_draw \
- $(if $(SYSTEM_EPUBGEN),,CppunitTest_writerperfect_epubexport) \
+ CppunitTest_writerperfect_epubexport \
CppunitTest_writerperfect_import \
CppunitTest_writerperfect_impress \
CppunitTest_writerperfect_writer \
diff --git a/writerperfect/source/writer/EPUBExportDialog.cxx b/writerperfect/source/writer/EPUBExportDialog.cxx
index 2d429abf657c..918d9eb9a198 100644
--- a/writerperfect/source/writer/EPUBExportDialog.cxx
+++ b/writerperfect/source/writer/EPUBExportDialog.cxx
@@ -150,9 +150,7 @@ IMPL_LINK_NOARG(EPUBExportDialog, LayoutSelectHdl, ListBox &, void)
// No conversion, 1:1 mapping between entry positions and
// libepubgen::EPUBLayoutMethod.
mrFilterData["EPUBLayoutMethod"] <<= m_pLayout->GetSelectedEntryPos();
-#if LIBEPUBGEN_VERSION_SUPPORT
m_pSplit->Enable(m_pLayout->GetSelectedEntryPos() != libepubgen::EPUB_LAYOUT_METHOD_FIXED);
-#endif
}
IMPL_LINK_NOARG(EPUBExportDialog, CoverClickHdl, Button *, void)
diff --git a/writerperfect/source/writer/EPUBExportFilter.cxx b/writerperfect/source/writer/EPUBExportFilter.cxx
index 0e0a72dbe015..7b7654c8097e 100644
--- a/writerperfect/source/writer/EPUBExportFilter.cxx
+++ b/writerperfect/source/writer/EPUBExportFilter.cxx
@@ -54,11 +54,7 @@ sal_Int32 EPUBExportFilter::GetDefaultSplitMethod()
sal_Int32 EPUBExportFilter::GetDefaultLayoutMethod()
{
-#if LIBEPUBGEN_VERSION_SUPPORT
return libepubgen::EPUB_LAYOUT_METHOD_REFLOWABLE;
-#else
- return 0;
-#endif
}
sal_Bool EPUBExportFilter::filter(const uno::Sequence<beans::PropertyValue> &rDescriptor)
@@ -76,10 +72,8 @@ sal_Bool EPUBExportFilter::filter(const uno::Sequence<beans::PropertyValue> &rDe
rDescriptor[i].Value >>= aFilterOptions;
}
-#if LIBEPUBGEN_VERSION_SUPPORT
if (aFilterOptions == "layout=fixed")
nLayoutMethod = libepubgen::EPUB_LAYOUT_METHOD_FIXED;
-#endif
for (sal_Int32 i = 0; i < aFilterData.getLength(); ++i)
{
@@ -95,25 +89,17 @@ sal_Bool EPUBExportFilter::filter(const uno::Sequence<beans::PropertyValue> &rDe
// file, the flat ODF filter has access to the doc model, everything else
// is in-between.
EPUBPackage aPackage(mxContext, rDescriptor);
- libepubgen::EPUBTextGenerator aGenerator(&aPackage
-#if LIBEPUBGEN_VERSION_SUPPORT
- , nVersion
-#endif
- );
-#if LIBEPUBGEN_VERSION_SUPPORT
+ libepubgen::EPUBTextGenerator aGenerator(&aPackage, nVersion);
aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_SPLIT, nSplitMethod);
aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_LAYOUT, nLayoutMethod);
-#endif
OUString aSourceURL;
uno::Reference<frame::XModel> xSourceModel(mxSourceDocument, uno::UNO_QUERY);
if (xSourceModel.is())
aSourceURL = xSourceModel->getURL();
std::vector<std::pair<uno::Sequence<sal_Int8>, Size>> aPageMetafiles;
-#if LIBEPUBGEN_VERSION_SUPPORT
if (nLayoutMethod == libepubgen::EPUB_LAYOUT_METHOD_FIXED)
CreateMetafiles(aPageMetafiles);
-#endif
uno::Reference<xml::sax::XDocumentHandler> xExportHandler(new exp::XMLImport(mxContext, aGenerator, aSourceURL, rDescriptor, aPageMetafiles));