diff --git a/.gitignore b/.gitignore index c7a749a..9c3afea 100644 --- a/.gitignore +++ b/.gitignore @@ -12,13 +12,13 @@ /harfbuzz-1.7.0.tar.bz2 /libassuan-2.4.3.tar.bz2 /libcmis-0.5.1.tar.gz -/libepubgen-0.0.1.tar.bz2 +/libepubgen-0.1.0.tar.bz2 /libgpg-error-1.27.tar.bz2 /liborcus-0.13.1.tar.gz /libqxp-0.0.0.tar.xz /libpagemaker-0.0.3.tar.bz2 /libstaroffice-0.0.5.tar.xz -/libwps-0.4.7.tar.xz +/libwps-0.4.8.tar.xz /libzmf-0.0.2.tar.xz /mdds-1.3.1.tar.bz2 /xmlsec1-1.2.25.tar.gz @@ -52,3 +52,9 @@ /libreoffice-help-6.0.0.0.beta1.tar.xz.asc /libreoffice-translations-6.0.0.0.beta1.tar.xz /libreoffice-translations-6.0.0.0.beta1.tar.xz.asc +/libreoffice-6.0.0.0.beta2.tar.xz +/libreoffice-6.0.0.0.beta2.tar.xz.asc +/libreoffice-help-6.0.0.0.beta2.tar.xz +/libreoffice-help-6.0.0.0.beta2.tar.xz.asc +/libreoffice-translations-6.0.0.0.beta2.tar.xz +/libreoffice-translations-6.0.0.0.beta2.tar.xz.asc diff --git a/0001-external-upload-libepubgen-0.1.0.patch b/0001-external-upload-libepubgen-0.1.0.patch new file mode 100644 index 0000000..a05a50d --- /dev/null +++ b/0001-external-upload-libepubgen-0.1.0.patch @@ -0,0 +1,3744 @@ +From e8eecbcaaead516127497483958028fb58f8924f Mon Sep 17 00:00:00 2001 +From: Miklos Vajna +Date: Wed, 13 Dec 2017 10:54:27 +0100 +Subject: [PATCH] external: upload libepubgen-0.1.0 + +The only change is that version support is now available +unconditionally, otherwise most code changes were bundled already in the +form of patches. + +(cherry picked from commits b2b1debf06589bd91e437df47a2904574aaae316 and +14c91e12b5bb3444235e1444eeefab42e21e3cb5) + +Conflicts: + configure.ac + external/libepubgen/libepubgen-epub3.patch.1 + writerperfect/source/writer/EPUBExportDialog.cxx + writerperfect/source/writer/EPUBExportFilter.cxx + +Change-Id: I0e456d85c9d84002cabcd77b31b02c9a7ad16ac5 +Reviewed-on: https://gerrit.libreoffice.org/46440 +Tested-by: Jenkins +Reviewed-by: David Tardon +--- + RepositoryExternal.mk | 2 +- + config_host/config_libepubgen.h.in | 16 - + configure.ac | 21 +- + download.lst | 4 +- + external/libepubgen/UnpackedTarball_libepubgen.mk | 11 - + external/libepubgen/libepubgen-epub3.patch.1 | 3318 -------------------- + external/libepubgen/libepubgen-validation1.patch.1 | 49 - + external/libepubgen/libepubgen-validation2.patch.1 | 34 - + external/libepubgen/libepubgen-validation3.patch.1 | 35 - + external/libepubgen/libepubgen-vc.patch.1 | 59 - + writerperfect/Module_writerperfect.mk | 2 +- + writerperfect/source/writer/EPUBExportFilter.cxx | 24 +- + 12 files changed, 8 insertions(+), 3567 deletions(-) + delete mode 100644 config_host/config_libepubgen.h.in + delete mode 100644 external/libepubgen/libepubgen-epub3.patch.1 + delete mode 100644 external/libepubgen/libepubgen-validation1.patch.1 + delete mode 100644 external/libepubgen/libepubgen-validation2.patch.1 + delete mode 100644 external/libepubgen/libepubgen-validation3.patch.1 + delete mode 100644 external/libepubgen/libepubgen-vc.patch.1 + +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 +- ], [ +- 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 . +-epubgen_patches += libepubgen-validation1.patch.1 +-# Backport of . +-epubgen_patches += libepubgen-validation2.patch.1 +-# Backport of . +-epubgen_patches += libepubgen-validation3.patch.1 +-# Backport of . +-epubgen_patches += libepubgen-vc.patch.1 +-# Backport of (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 +-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 +-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 +-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 +-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 +-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 +-. +---- +- 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 +-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 +- #include +- +- #include +-@@ -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 +-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 ValueType_t; +-+ // media-type, id, properties +-+ typedef std::tuple ValueType_t; +- typedef std::unordered_map 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 +-Date: Thu, 10 Aug 2017 15:05:46 +0200 +-Subject: [PATCH 8/9] EPUB3: implement navigation document +- +-As +- +-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::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::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 +-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 +-Date: Fri, 11 Aug 2017 10:50:47 +0200 +-Subject: [PATCH] EPUB3: write the deprecated NCX navication as well +- +- +-"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 +-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 +-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 +-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 +-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 +-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 +-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 +-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: +- +-ABC +- +-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::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 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 &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 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 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 +-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 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 +-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 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 +-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

inside results in a validation +-error. +- +-So just write

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 m_frameAnchorTypes; +-+ +- protected: +- std::unique_ptr m_actualSink; +- std::stack> 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 +-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 +-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 +- #include +- +-+#include +-+ +- #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 +-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 +- #include +- +-@@ -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 +-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 +-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 +-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 . +-+ 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 +-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 . +- 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 +-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 m_frameAnchorTypes; +- +-+ EPUBStylesMethod m_stylesMethod; +-+ +- protected: +- std::unique_ptr m_actualSink; +- std::stack> 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 +-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 +-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
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 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 +-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 +-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 +-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 +-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 +-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 +-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 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 +-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 const &widths=m_columWitdhsStack.back(); +-+ std::vector 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 > m_columWitdhsStack; +-+ std::vector > 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 +-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 const &widths=m_columWidthsStack.back(); +-+ std::vector 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 > m_columWidthsStack; +-+ std::vector > 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 +-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 +- #include +- +- #include +-@@ -25,6 +26,7 @@ using librevenge::RVNGString; +- void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList) +- { +- std::vector colWidths; +-+ std::vector 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 > &columnWidthsStack, int col, int numSpanned, bool relative, double &w) +-+{ +-+ if (!columnWidthsStack.size()) +- return false; +-- std::vector const &widths=m_columnWidthsStack.back(); +-+ std::vector const &widths=columnWidthsStack.back(); +-+ double total = std::accumulate(widths.begin(), widths.end(), static_cast(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 > m_columnWidthsStack; +-+ //! a stack of relative column width (in percents ) +-+ std::vector > 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 +-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 colWidths; +-- std::vector 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 colWidths; +-+ std::vector 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 > 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 +-Date: Tue, 8 Aug 2017 16:54:24 +0200 +-Subject: [PATCH 1/3] EPUBGenerator: fix validation error with empty +- dc:identifier element +- +- +-"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 +-+#include +-+#include +-+ +- #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 +-Date: Tue, 8 Aug 2017 17:23:38 +0200 +-Subject: [PATCH 2/3] EPUBGenerator: don't write empty guide element +- +- "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 +-Date: Tue, 8 Aug 2017 17:39:18 +0200 +-Subject: [PATCH 3/3] EPUBHTMLManager: fix value of +- +- "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 . +---- +- 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 +-Date: Wed, 2 Aug 2017 14:53:36 +0200 +-Subject: [PATCH] m4: MSVC defines __cplusplus as 199711L still +- +-See e.g. +-, +-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 +-+ +- #include +- #include +- #include +--- +-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 +- + #include + #include + +@@ -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 &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(nSplitMethod) +-#if LIBEPUBGEN_VERSION_SUPPORT +- , nVersion +-#endif +- ); +-#if LIBEPUBGEN_VERSION_SUPPORT +- aGenerator.setStylesMethod(static_cast(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 xExportHandler(new exp::XMLImport(aGenerator)); + + uno::Reference xInitialization(mxContext->getServiceManager()->createInstanceWithContext("com.sun.star.comp.Writer.XMLOasisExporter", mxContext), uno::UNO_QUERY); +-- +2.14.3 + diff --git a/libreoffice.spec b/libreoffice.spec index d3cb79e..3cb308b 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -3,7 +3,7 @@ # Should contain .alphaX / .betaX, if this is pre-release (actually # pre-RC) version. The pre-release string is part of tarball file names, # so we need a way to define it easily at one place. -%global libo_prerelease .beta1 +%global libo_prerelease .beta2 # Should contain any suffix of release tarball name, e.g., -buildfix1. %global libo_buildfix %{nil} # rhbz#715152 state vendor @@ -57,7 +57,7 @@ Summary: Free Software Productivity Suite Name: libreoffice Epoch: 1 Version: %{libo_version}.0 -Release: 7%{?libo_prerelease}%{?dist} +Release: 8%{?libo_prerelease}%{?dist} License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and MPLv2.0 and CC0 URL: http://www.libreoffice.org/ @@ -99,7 +99,7 @@ Source100: %{external_url}/0168229624cfac409e766913506961a8-ucpp-1.3.2.tar. Source101: %{external_url}/liborcus-0.13.1.tar.xz Source102: %{external_url}/mdds-1.3.1.tar.bz2 Source103: %{external_url}/libcmis-0.5.1.tar.gz -Source104: %{external_url}/libwps-0.4.7.tar.xz +Source104: %{external_url}/libwps-0.4.8.tar.xz Source105: %{external_url}/libpagemaker-0.0.3.tar.bz2 Source106: %{external_url}/libzmf-0.0.2.tar.xz Source107: %{external_url}/libstaroffice-0.0.5.tar.xz @@ -110,7 +110,7 @@ Source111: %{external_url}/libgpg-error-1.27.tar.bz2 Source112: %{external_url}/libassuan-2.4.3.tar.bz2 Source113: %{external_url}/cppunit-1.14.0.tar.gz Source114: %{external_url}/libqxp-0.0.0.tar.xz -Source115: %{external_url}/libepubgen-0.0.1.tar.bz2 +Source115: %{external_url}/libepubgen-0.1.0.tar.bz2 %global bundling_options %{?bundling_options} --without-system-ucpp --without-system-orcus --without-system-mdds --without-system-libcmis --without-system-libwps --without-system-libpagemaker --without-system-libzmf --without-system-libstaroffice --without-system-harfbuzz --without-system-graphite --without-system-gpgmepp --without-system-cppunit --without-system-libqxp --without-system-libepubgen Provides: bundled(gpgme) = 1.9.0 @@ -118,7 +118,7 @@ Provides: bundled(graphite2) = 1.3.10 Provides: bundled(harfbuzz) = 1.7.0 Provides: bundled(libassuan) = 2.4.3 Provides: bundled(libcmis) = 0.5.1 -Provides: bundled(libepubgen) = 0.0.1 +Provides: bundled(libepubgen) = 0.1.0 Provides: bundled(libgpg-error) = 1.27 Provides: bundled(liborcus) = 0.13.1 Provides: bundled(libpagemaker) = 0.0.3 @@ -227,7 +227,7 @@ BuildRequires: pkgconfig(harfbuzz) BuildRequires: pkgconfig(libcmis-0.5) BuildRequires: pkgconfig(libe-book-0.1) BuildRequires: pkgconfig(libeot) -BuildRequires: pkgconfig(libepubgen-0.0) +BuildRequires: pkgconfig(libepubgen-0.1) BuildRequires: pkgconfig(liborcus-0.13) BuildRequires: pkgconfig(libpagemaker-0.0) BuildRequires: pkgconfig(libqxp-0.0) @@ -268,8 +268,8 @@ Patch1: 0001-Related-tdf-106100-recover-mangled-svg-in-presentati.patch Patch2: 0001-Resolves-rhbz-1432468-disable-opencl-by-default.patch # not upstreamed Patch3: 0001-gtk3-only-for-3.20.patch -Patch4: 0001-fix-includes-in-aarch64-bridge.patch -Patch5: 0001-Related-tdf-105998-except-cut-and-paste-as-bitmap-in.patch +Patch4: 0001-Related-tdf-105998-except-cut-and-paste-as-bitmap-in.patch +Patch5: 0001-external-upload-libepubgen-0.1.0.patch %if 0%{?rhel} # not upstreamed @@ -2262,6 +2262,9 @@ done %{_includedir}/LibreOfficeKit %changelog +* Thu Dec 14 2017 David Tardon - 1:6.0.0.0-8.beta2 +- update to 6.0.0 beta2 + * Mon Dec 04 2017 Caolán McNamara - 1:6.0.0.0-7.beta1 - Rebuild for hunspell 1.6.2 diff --git a/sources b/sources index 4f456bc..fa63f04 100644 --- a/sources +++ b/sources @@ -6,9 +6,9 @@ SHA512 (a7983f859eafb2677d7ff386a023bc40-xsltml_2.1.2.zip) = 2d3835f7ac356805025 SHA512 (0168229624cfac409e766913506961a8-ucpp-1.3.2.tar.gz) = b9c02d63e9b47a838dbe67c05b9e9e4983d13b9d74794e1c30c73d341c3bc905c9edec3a72fa339ae8c0e06d97e69ac2ea23bf51336b77af14cab7ae67721a46 SHA512 (libreoffice-multiliblauncher.sh) = db532afdf5000bc66f9e02c7d0ab586468466f63f8f0bdb204832581e8277c5c59f688fa096548d642411cb8c46e8de4a744676b4e624c075262cfd6945138cd SHA512 (xmlsec1-1.2.25.tar.gz) = ac61547a1cbf9016d7f75be3dc5249d6bc8a526bc51715e53ede13f056c1c72c57433a6be200c886000a25826c3e473954ded3ae988f25d37ac4ef4d777c66a6 -SHA512 (libreoffice-6.0.0.0.beta1.tar.xz) = 7b8b99e1d79789422f5c6e89a87c91a3d7052b310d770dff4228bd8e2ab4d083e7b8a7de22b9d185ad7b58ab2bd731c8129fc138b7c187ab86f532dc9450f2e9 -SHA512 (libreoffice-6.0.0.0.beta1.tar.xz.asc) = 50d1dfefb1308a160406b83d93853ea95fe01847fcdc6557833a0b7a8293989885247d8cb56b46837de11593ebf52a6e2be8970223c159d0030491d5c17bd190 -SHA512 (libreoffice-help-6.0.0.0.beta1.tar.xz) = b01ac4e2b181b793d9dbb6183e6a1c76e37c8154295bd0c001d181d7d75977153bcefd10ac5c9b3d82e1008c9906493046098fa64e2353cc4412cfd5c498680d -SHA512 (libreoffice-help-6.0.0.0.beta1.tar.xz.asc) = dc178afd614a5774b6ab8b8b1c7dd71165278aa87d0438d76ddc6afd1b9f2949100226fae29f729a15e5fafe4ac919bb7f4e47245c6a32db811800467d6990e5 -SHA512 (libreoffice-translations-6.0.0.0.beta1.tar.xz) = 50f33269ba46b8dd9c8179a3745b0f31c482f26b3c5a1e84f5373d8070e6ff1704e75458348dbe8ad001f797e1f0d9e6571dcda745332f10805344d5d123b3b8 -SHA512 (libreoffice-translations-6.0.0.0.beta1.tar.xz.asc) = f91f31f360c1659174799d68bca82e765a69f3e068a4881175270998f2bfc0646de333120312803ad1d8e9ab841fbf849bd09f65857cec69db58a52e48b0fda1 +SHA512 (libreoffice-6.0.0.0.beta2.tar.xz) = a34d72db2dd4e821a0f9693687552706a07f457c02b903e8054d8bdab1801c1cf77c8a94d26211d5d34582c918895be668e9df46e15a4b80c97863269c1a3aa9 +SHA512 (libreoffice-6.0.0.0.beta2.tar.xz.asc) = 50c5ada5ffaa1a4e19287ec11ef62cb576aceaef61f632a0cc3fd522bc36c00acc6b1d700f74a4307badf92b75b9a86c0ee6c57eceb02fb8f4afc719d2783d2c +SHA512 (libreoffice-help-6.0.0.0.beta2.tar.xz) = d07e8503ff68fe02193a8ace18d8a7b4e4d7f85a63208e74bdb8a18659c7e2b132fbb0673a1d8ebfbd166064eca06183b73159e260bcc8b3a4fba517a552685d +SHA512 (libreoffice-help-6.0.0.0.beta2.tar.xz.asc) = 42590087fdc8c64f35dc6eb21c4a5643baa34fce6173ee438accfedcf6cd5a092ec70758fc67d139be77e30bbc0ab40292b427a9675367d251cb8aa0fa3bef4a +SHA512 (libreoffice-translations-6.0.0.0.beta2.tar.xz) = 8e66f22e08eb85cc07cc6bd5bd616ea74d177792bb176f12214c1902580469097cb34138f71cf64948e3854f76398f46e92e193b2f91693164c5e9bcd6f9a5c7 +SHA512 (libreoffice-translations-6.0.0.0.beta2.tar.xz.asc) = acd6305750d07b9aa80dc880da43657a7bfe787f71173d4223b1fbacbde101c4b1a643a12460a59ecc5d708f271564d1c1c930b025b44c24834a33a8b25ed42c