diff --git a/.gitignore b/.gitignore index 9c3afea..d3b44ce 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,9 @@ /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 +/libreoffice-6.0.0.1.tar.xz +/libreoffice-6.0.0.1.tar.xz.asc +/libreoffice-help-6.0.0.1.tar.xz +/libreoffice-help-6.0.0.1.tar.xz.asc +/libreoffice-translations-6.0.0.1.tar.xz +/libreoffice-translations-6.0.0.1.tar.xz.asc diff --git a/0001-external-upload-libepubgen-0.1.0.patch b/0001-external-upload-libepubgen-0.1.0.patch deleted file mode 100644 index a05a50d..0000000 --- a/0001-external-upload-libepubgen-0.1.0.patch +++ /dev/null @@ -1,3744 +0,0 @@ -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 3cb308b..cc2f21b 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 .beta2 +%global libo_prerelease %{nil} # Should contain any suffix of release tarball name, e.g., -buildfix1. %global libo_buildfix %{nil} # rhbz#715152 state vendor @@ -56,8 +56,8 @@ Summary: Free Software Productivity Suite Name: libreoffice Epoch: 1 -Version: %{libo_version}.0 -Release: 8%{?libo_prerelease}%{?dist} +Version: %{libo_version}.1 +Release: 1%{?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/ @@ -269,7 +269,6 @@ Patch2: 0001-Resolves-rhbz-1432468-disable-opencl-by-default.patch # not upstreamed Patch3: 0001-gtk3-only-for-3.20.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 +2261,9 @@ done %{_includedir}/LibreOfficeKit %changelog +* Wed Dec 20 2017 David Tardon - 1:6.0.0.1-1 +- update to 6.0.0 rc1 + * Thu Dec 14 2017 David Tardon - 1:6.0.0.0-8.beta2 - update to 6.0.0 beta2 diff --git a/sources b/sources index fa63f04..7964a7e 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.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 +SHA512 (libreoffice-6.0.0.1.tar.xz) = 9a495448bf614ca890dcb72d8e0e812179201ad10001d999cf759e82621281c4a335f608e473d677c79cfeb0b669b39a2f22f0e2607d3916004c79c27da49f5d +SHA512 (libreoffice-6.0.0.1.tar.xz.asc) = 06dd032b55f7e36e7976f8b824baa2f3013690cfd97f304ee32c9d5690f2cd8bb3d87aa02794edc7df1a224f8f5839002c9965d4ce23a7f56cd892aeae097d4b +SHA512 (libreoffice-help-6.0.0.1.tar.xz) = fe398afff7c60563d49ce29eb0153bb4026855a085bb6e1832c0f3b957bcda4eb19551a2f64333bfb34f7b2f856673595ae1fd7f80d0b40e57ae9590dfd07569 +SHA512 (libreoffice-help-6.0.0.1.tar.xz.asc) = 4ad40b1dd78d97f893cf3cc3db467bacc34953924991678218a90b3aedc3a6b322d0f1e2d5ef0800d5538a19d7dd489e3dcd896444869738a0f7dfd3b2419573 +SHA512 (libreoffice-translations-6.0.0.1.tar.xz) = bb0aee83ee54af49d13be0cf3eccdbdf6adeac88b3353bf84741877e11c4a08bb8c191f1c9a73e02eb45e3ab30c1cceda62e42ef3a989e24f4dc81ee7428435c +SHA512 (libreoffice-translations-6.0.0.1.tar.xz.asc) = 8386448ec4f13a1251f88fbadffec1487b655f31328919626cdd007b365527b1a5d8f58ceb6650496916dc8a2f2b2fa30f0c6b3fd2252cbfdad7e3ffc8e65e5a