diff options
-rw-r--r-- | RepositoryExternal.mk | 2 | ||||
-rw-r--r-- | config_host/config_libepubgen.h.in | 16 | ||||
-rw-r--r-- | configure.ac | 21 | ||||
-rw-r--r-- | download.lst | 4 | ||||
-rw-r--r-- | external/libepubgen/UnpackedTarball_libepubgen.mk | 11 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-epub3.patch.1 | 3318 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-validation1.patch.1 | 49 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-validation2.patch.1 | 34 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-validation3.patch.1 | 35 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-vc.patch.1 | 59 | ||||
-rw-r--r-- | writerperfect/Module_writerperfect.mk | 2 | ||||
-rw-r--r-- | writerperfect/source/writer/EPUBExportFilter.cxx | 24 |
12 files changed, 8 insertions, 3567 deletions
diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk index bdc5d65a2d81..9ac1b3fe15fb 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 6a6aac317628..2ac35b7507df 100644 --- a/configure.ac +++ b/configure.ac @@ -7677,25 +7677,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> - ], [ - const libepubgen::EPUBTextGenerator generator(nullptr, EPUB_SPLIT_METHOD_NONE, 30); - ])], - [ - 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"], @@ -12564,7 +12546,6 @@ AC_CONFIG_HEADERS([config_host/config_global.h]) 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_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 342c245320ba..467f21ef5ee6 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 98ce658e5705..000000000000 --- a/external/libepubgen/libepubgen-epub3.patch.1 +++ /dev/null @@ -1,3318 +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 ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath) -+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, 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 ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath); -+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, 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 ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator) -+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, 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 ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator); -+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, 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. -+ 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 ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath) -+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, 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 ¶graphStyleManager, 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 ¶graphStyleManager, 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 ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath); -+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, 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 ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath) -+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, 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 ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath); -+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, 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 - 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/EPUBExportFilter.cxx b/writerperfect/source/writer/EPUBExportFilter.cxx index 1b0eea21725c..3ef5384a8b96 100644 --- a/writerperfect/source/writer/EPUBExportFilter.cxx +++ b/writerperfect/source/writer/EPUBExportFilter.cxx @@ -9,8 +9,6 @@ #include "EPUBExportFilter.hxx" -#include <config_libepubgen.h> - #include <libepubgen/EPUBTextGenerator.h> #include <libepubgen/libepubgen-decls.h> @@ -25,17 +23,6 @@ using namespace com::sun::star; -#if !LIBEPUBGEN_VERSION_SUPPORT -namespace libepubgen -{ -enum EPUBStylesMethod -{ - EPUB_STYLES_METHOD_CSS, //< The styles will be described in a separate CSS file. - EPUB_STYLES_METHOD_INLINE, //< The styles will be described inline. -}; -} -#endif - namespace writerperfect { @@ -88,14 +75,9 @@ 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, static_cast<libepubgen::EPUBSplitMethod>(nSplitMethod) -#if LIBEPUBGEN_VERSION_SUPPORT - , nVersion -#endif - ); -#if LIBEPUBGEN_VERSION_SUPPORT - aGenerator.setStylesMethod(static_cast<libepubgen::EPUBStylesMethod>(nStylesMethod)); -#endif + libepubgen::EPUBTextGenerator aGenerator(&aPackage, nVersion); + aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_SPLIT, nSplitMethod); + aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_STYLES, nStylesMethod); uno::Reference<xml::sax::XDocumentHandler> xExportHandler(new exp::XMLImport(aGenerator)); uno::Reference<lang::XInitialization> xInitialization(mxContext->getServiceManager()->createInstanceWithContext("com.sun.star.comp.Writer.XMLOasisExporter", mxContext), uno::UNO_QUERY); |