You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3745 lines
140 KiB
3745 lines
140 KiB
From e8eecbcaaead516127497483958028fb58f8924f Mon Sep 17 00:00:00 2001
|
|
From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
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 <ci@libreoffice.org>
|
|
Reviewed-by: David Tardon <dtardon@redhat.com>
|
|
---
|
|
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 <libepubgen/libepubgen.h>
|
|
- ], [
|
|
- const libepubgen::EPUBTextGenerator generator(nullptr, EPUB_SPLIT_METHOD_NONE, 30);
|
|
- ])],
|
|
- [
|
|
- AC_MSG_RESULT([yes])
|
|
- AC_DEFINE([LIBEPUBGEN_VERSION_SUPPORT])
|
|
- ],
|
|
- [
|
|
- AC_MSG_RESULT([no])
|
|
- ]
|
|
- )
|
|
-], [
|
|
- AC_DEFINE([LIBEPUBGEN_VERSION_SUPPORT])
|
|
-])
|
|
+libo_CHECK_SYSTEM_MODULE([libepubgen],[EPUBGEN],[libepubgen-0.1])
|
|
|
|
AS_IF([test "$COM" = "MSC"],
|
|
[libwpd_libdir="${WORKDIR}/LinkTarget/Library"],
|
|
@@ -12564,7 +12546,6 @@ AC_CONFIG_HEADERS([config_host/config_global.h])
|
|
AC_CONFIG_HEADERS([config_host/config_gpgme.h])
|
|
AC_CONFIG_HEADERS([config_host/config_java.h])
|
|
AC_CONFIG_HEADERS([config_host/config_lgpl.h])
|
|
-AC_CONFIG_HEADERS([config_host/config_libepubgen.h])
|
|
AC_CONFIG_HEADERS([config_host/config_liblangtag.h])
|
|
AC_CONFIG_HEADERS([config_host/config_locales.h])
|
|
AC_CONFIG_HEADERS([config_host/config_mpl.h])
|
|
diff --git a/download.lst b/download.lst
|
|
index 342c245320ba..467f21ef5ee6 100644
|
|
--- a/download.lst
|
|
+++ b/download.lst
|
|
@@ -37,8 +37,8 @@ export EPOXY_SHA256SUM := 1d8668b0a259c709899e1c4bab62d756d9002d546ce4f59c9665e2
|
|
export EPOXY_TARBALL := libepoxy-1.3.1.tar.bz2
|
|
export EPM_SHA256SUM := b3fc4c5445de6c9a801504a3ea3efb2d4ea9d5a622c9427e716736e7713ddb91
|
|
export EPM_TARBALL := 3ade8cfe7e59ca8e65052644fed9fca4-epm-3.7.tar.gz
|
|
-export EPUBGEN_SHA256SUM := eea910b042526ed52f7ab9292b7fa31fca32f9e042285818074ff33664db4fa2
|
|
-export EPUBGEN_TARBALL := libepubgen-0.0.1.tar.bz2
|
|
+export EPUBGEN_SHA256SUM := 730bd1cbeee166334faadbc06c953a67b145c3c4754a3b503482066dae4cd633
|
|
+export EPUBGEN_TARBALL := libepubgen-0.1.0.tar.bz2
|
|
export ETONYEK_SHA256SUM := 69dbe10d4426d52f09060d489f8eb90dfa1df592e82eb0698d9dbaf38cc734ac
|
|
export ETONYEK_VERSION_MICRO := 7
|
|
export ETONYEK_TARBALL := libetonyek-0.1.$(ETONYEK_VERSION_MICRO).tar.xz
|
|
diff --git a/external/libepubgen/UnpackedTarball_libepubgen.mk b/external/libepubgen/UnpackedTarball_libepubgen.mk
|
|
index 0134768c57aa..14efadb337c0 100644
|
|
--- a/external/libepubgen/UnpackedTarball_libepubgen.mk
|
|
+++ b/external/libepubgen/UnpackedTarball_libepubgen.mk
|
|
@@ -8,17 +8,6 @@
|
|
#
|
|
|
|
epubgen_patches :=
|
|
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/96e9786f5aba1078251f36e58feefc8d953cdea0/>.
|
|
-epubgen_patches += libepubgen-validation1.patch.1
|
|
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/2e51fb9163bbc6b9a27fa524382c5aad9700dd0d/>.
|
|
-epubgen_patches += libepubgen-validation2.patch.1
|
|
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/9041ef42f9e0a5c4bc3b0a912d36683c4e10ca84/>.
|
|
-epubgen_patches += libepubgen-validation3.patch.1
|
|
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/49f6461d4751d3b16e32ab8f9c93a3856b33be49/>.
|
|
-epubgen_patches += libepubgen-vc.patch.1
|
|
-# Backport of <https://sourceforge.net/p/libepubgen/code/ci/2e9e9af9f49a78cca75d3c862c8dd4b5f7cc7eb2/> (and its deps).
|
|
-epubgen_patches += libepubgen-epub3.patch.1
|
|
-
|
|
|
|
ifeq ($(COM_IS_CLANG),TRUE)
|
|
ifneq ($(filter -fsanitize=%,$(CC)),)
|
|
diff --git a/external/libepubgen/libepubgen-epub3.patch.1 b/external/libepubgen/libepubgen-epub3.patch.1
|
|
deleted file mode 100644
|
|
index 98ce658e5705..000000000000
|
|
--- a/external/libepubgen/libepubgen-epub3.patch.1
|
|
+++ /dev/null
|
|
@@ -1,3318 +0,0 @@
|
|
-From 17b4d0a2b595d1504f3d957268e2085ae0f80db7 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 9 Aug 2017 15:53:02 +0200
|
|
-Subject: [PATCH 1/9] EPUBGenerator: avoid container version roundtrip to
|
|
- double
|
|
-
|
|
-This will be an error for EPUB3:
|
|
-
|
|
-ERROR(RSC-005): test.epub/META-INF/container.xml(2,85): Error while parsing file: value of attribute "version" is invalid; must be equal to "1.0"
|
|
-
|
|
-But it does not hurt for EPUB2, either.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 2 +-
|
|
- 1 file changed, 1 insertion(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 3357cf2..1033c0f 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -117,7 +117,7 @@ void EPUBGenerator::writeContainer()
|
|
- EPUBXMLSink sink;
|
|
-
|
|
- RVNGPropertyList containerAttrs;
|
|
-- containerAttrs.insert("version", "1.0");
|
|
-+ containerAttrs.insert("version", RVNGPropertyFactory::newStringProp("1.0"));
|
|
- containerAttrs.insert("xmlns", "urn:oasis:names:tc:opendocument:xmlns:container");
|
|
-
|
|
- sink.openElement("container", containerAttrs);
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 8ca1fe2b9db9bacd6e868e69a0909a441fb6a7f8 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 9 Aug 2017 16:00:05 +0200
|
|
-Subject: [PATCH 2/9] EPUBGenerator: avoid opf:scheme attribute when writing
|
|
- the UUID
|
|
-
|
|
-This will be an error for EPUB3:
|
|
-
|
|
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,292): Error while parsing file: found attribute "opf:scheme", but no attributes allowed here
|
|
-
|
|
-But it's optional for EPUB2 already.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 1 -
|
|
- 1 file changed, 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 1033c0f..14e3c58 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -199,7 +199,6 @@ void EPUBGenerator::writeRoot()
|
|
-
|
|
- RVNGPropertyList identifierAttrs;
|
|
- identifierAttrs.insert("id", uniqueId);
|
|
-- identifierAttrs.insert("opf:scheme", "UUID");
|
|
- sink.openElement("dc:identifier", identifierAttrs);
|
|
- // The identifier element is required to have a unique character content.
|
|
- std::stringstream identifierStream("urn:uuid:");
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From aa71784fcee0404c2f136f035887ca4c52d0e756 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 9 Aug 2017 16:11:13 +0200
|
|
-Subject: [PATCH 3/9] EPUBGenerator: avoid empty dc:title element
|
|
-
|
|
-This is a warning for EPUB2, but it'll be an error for EPUB3:
|
|
-
|
|
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,337): Error while parsing file: character content of element "dc:title" invalid; must be a string with length at least 1 (actual length was 0)
|
|
-
|
|
-The problem is that for ODF/librevenge this element is optional, so work
|
|
-it around by adding a zero-width space.
|
|
-
|
|
-A later commit should read the optional title of declared with a
|
|
-librevenge API call, though.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 4 ++++
|
|
- 1 file changed, 4 insertions(+)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 14e3c58..75ccb5a 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -208,8 +208,12 @@ void EPUBGenerator::writeRoot()
|
|
- sink.insertCharacters(identifierCharactrs.c_str());
|
|
- sink.closeElement("dc:identifier");
|
|
-
|
|
-+ // Zero-width space as it must be at least one character in length after
|
|
-+ // white space has been trimmed.
|
|
- sink.openElement("dc:title");
|
|
-+ sink.insertCharacters("\u200b");
|
|
- sink.closeElement("dc:title");
|
|
-+
|
|
- sink.openElement("dc:language");
|
|
- sink.closeElement("dc:language");
|
|
-
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From a4585b8f35c76472eb91688c9177b9f532c290d8 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 9 Aug 2017 16:15:12 +0200
|
|
-Subject: [PATCH 4/9] EPUBGenerator: avoid empty dc:language element
|
|
-
|
|
-Same story as with dc:title:
|
|
-
|
|
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,362): Error while parsing file: character content of element "dc:language" invalid; must be an RFC 3066 language identifier
|
|
-
|
|
-(This is a warning for EPUB2, but it'll be an error for EPUB3; this is optional
|
|
-for ODF; later commit should read the this info, though.)
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 1 +
|
|
- 1 file changed, 1 insertion(+)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 75ccb5a..40ae0cc 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -215,6 +215,7 @@ void EPUBGenerator::writeRoot()
|
|
- sink.closeElement("dc:title");
|
|
-
|
|
- sink.openElement("dc:language");
|
|
-+ sink.insertCharacters("en");
|
|
- sink.closeElement("dc:language");
|
|
-
|
|
- sink.closeElement("metadata");
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 862ec6735c25760edadf05d83717daaf65f39f99 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 9 Aug 2017 16:47:12 +0200
|
|
-Subject: [PATCH 5/9] [ABI CHANGE] optionally support generating EPUB3 output
|
|
-
|
|
-Versions are 20 and 30 to be consistent with
|
|
-<https://github.com/idpf/epubcheck/tree/master/src/main/resources/com/adobe/epubcheck/schema/>.
|
|
----
|
|
- inc/libepubgen/EPUBDrawingGenerator.h | 6 +++++-
|
|
- inc/libepubgen/EPUBPresentationGenerator.h | 6 +++++-
|
|
- inc/libepubgen/EPUBTextGenerator.h | 6 +++++-
|
|
- src/lib/EPUBDrawingGenerator.cpp | 10 +++++-----
|
|
- src/lib/EPUBGenerator.cpp | 8 ++++++--
|
|
- src/lib/EPUBGenerator.h | 4 +++-
|
|
- src/lib/EPUBPagedGenerator.cpp | 10 +++++-----
|
|
- src/lib/EPUBPagedGenerator.h | 2 +-
|
|
- src/lib/EPUBPresentationGenerator.cpp | 10 +++++-----
|
|
- src/lib/EPUBTextGenerator.cpp | 10 +++++-----
|
|
- 10 files changed, 45 insertions(+), 27 deletions(-)
|
|
-
|
|
-diff --git a/inc/libepubgen/EPUBDrawingGenerator.h b/inc/libepubgen/EPUBDrawingGenerator.h
|
|
-index 48bfc99..963e3b8 100644
|
|
---- a/inc/libepubgen/EPUBDrawingGenerator.h
|
|
-+++ b/inc/libepubgen/EPUBDrawingGenerator.h
|
|
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBDrawingGenerator : public librevenge::RVNGDrawingInterface
|
|
- class Impl;
|
|
-
|
|
- public:
|
|
-- explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
|
|
-+ /** Constructor.
|
|
-+ *
|
|
-+ * @param[in] version possible values: 20, 30.
|
|
-+ */
|
|
-+ explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
|
|
- EPUBDrawingGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
|
|
- ~EPUBDrawingGenerator() override;
|
|
-
|
|
-diff --git a/inc/libepubgen/EPUBPresentationGenerator.h b/inc/libepubgen/EPUBPresentationGenerator.h
|
|
-index 0a8152a..512c52d 100644
|
|
---- a/inc/libepubgen/EPUBPresentationGenerator.h
|
|
-+++ b/inc/libepubgen/EPUBPresentationGenerator.h
|
|
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBPresentationGenerator: public librevenge::RVNGPresentationI
|
|
- class Impl;
|
|
-
|
|
- public:
|
|
-- explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
|
|
-+ /** Constructor.
|
|
-+ *
|
|
-+ * @param[in] version possible values: 20, 30.
|
|
-+ */
|
|
-+ explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
|
|
- EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
|
|
- ~EPUBPresentationGenerator() override;
|
|
-
|
|
-diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h
|
|
-index abf9e7f..664f673 100644
|
|
---- a/inc/libepubgen/EPUBTextGenerator.h
|
|
-+++ b/inc/libepubgen/EPUBTextGenerator.h
|
|
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBTextGenerator : public librevenge::RVNGTextInterface
|
|
- struct Impl;
|
|
-
|
|
- public:
|
|
-- explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
|
|
-+ /** Constructor.
|
|
-+ *
|
|
-+ * @param[in] version possible values: 20, 30.
|
|
-+ */
|
|
-+ explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
|
|
- EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
|
|
- ~EPUBTextGenerator() override;
|
|
-
|
|
-diff --git a/src/lib/EPUBDrawingGenerator.cpp b/src/lib/EPUBDrawingGenerator.cpp
|
|
-index e25a377..bcb4994 100644
|
|
---- a/src/lib/EPUBDrawingGenerator.cpp
|
|
-+++ b/src/lib/EPUBDrawingGenerator.cpp
|
|
-@@ -20,16 +20,16 @@ using librevenge::RVNGString;
|
|
- class EPUBDrawingGenerator::Impl : public EPUBPagedGenerator
|
|
- {
|
|
- public:
|
|
-- Impl(EPUBPackage *const package, const EPUBSplitMethod method);
|
|
-+ Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version);
|
|
- };
|
|
-
|
|
--EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
|
|
-- : EPUBPagedGenerator(package, method)
|
|
-+EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
|
|
-+ : EPUBPagedGenerator(package, method, version)
|
|
- {
|
|
- }
|
|
-
|
|
--EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split)
|
|
-- : m_impl(new Impl(package, split))
|
|
-+EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split, int version)
|
|
-+ : m_impl(new Impl(package, split, version))
|
|
- {
|
|
- }
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 40ae0cc..4888677 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -25,7 +25,7 @@ using librevenge::RVNGPropertyFactory;
|
|
- using librevenge::RVNGPropertyList;
|
|
- using librevenge::RVNGString;
|
|
-
|
|
--EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split)
|
|
-+EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split, int version)
|
|
- : m_package(package)
|
|
- , m_manifest()
|
|
- , m_htmlManager(m_manifest)
|
|
-@@ -39,6 +39,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
|
|
- , m_metadata()
|
|
- , m_currentHtml()
|
|
- , m_splitGuard(split)
|
|
-+ , m_version(version)
|
|
- {
|
|
- }
|
|
-
|
|
-@@ -190,7 +191,10 @@ void EPUBGenerator::writeRoot()
|
|
- packageAttrs.insert("xmlns:dc", "http://purl.org/dc/elements/1.1/");
|
|
- packageAttrs.insert("xmlns:dcterms", "http://purl.org/dc/terms/");
|
|
- packageAttrs.insert("xmlns:opf", "http://www.idpf.org/2007/opf");
|
|
-- packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0"));
|
|
-+ if (m_version == 30)
|
|
-+ packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("3.0"));
|
|
-+ else
|
|
-+ packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0"));
|
|
- packageAttrs.insert("unique-identifier", uniqueId);
|
|
-
|
|
- sink.openElement("package", packageAttrs);
|
|
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
|
|
-index 51dd911..a0ef8ac 100644
|
|
---- a/src/lib/EPUBGenerator.h
|
|
-+++ b/src/lib/EPUBGenerator.h
|
|
-@@ -33,7 +33,7 @@ class EPUBGenerator
|
|
- EPUBGenerator &operator=(const EPUBGenerator &);
|
|
-
|
|
- public:
|
|
-- EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method);
|
|
-+ EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
|
|
- virtual ~EPUBGenerator();
|
|
-
|
|
- void startDocument(const librevenge::RVNGPropertyList &props);
|
|
-@@ -75,6 +75,8 @@ private:
|
|
- EPUBHTMLGeneratorPtr_t m_currentHtml;
|
|
-
|
|
- EPUBSplitGuard m_splitGuard;
|
|
-+
|
|
-+ int m_version;
|
|
- };
|
|
-
|
|
- }
|
|
-diff --git a/src/lib/EPUBPagedGenerator.cpp b/src/lib/EPUBPagedGenerator.cpp
|
|
-index 913a592..6a3bff0 100644
|
|
---- a/src/lib/EPUBPagedGenerator.cpp
|
|
-+++ b/src/lib/EPUBPagedGenerator.cpp
|
|
-@@ -25,7 +25,7 @@ class EPUBPagedGenerator::Impl : public EPUBGenerator
|
|
- Impl &operator=(const Impl &);
|
|
-
|
|
- public:
|
|
-- Impl(EPUBPackage *const package, EPUBSplitMethod method);
|
|
-+ Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
|
|
-
|
|
- private:
|
|
- void startHtmlFile() override;
|
|
-@@ -35,8 +35,8 @@ public:
|
|
- bool m_firstPage;
|
|
- };
|
|
-
|
|
--EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
|
|
-- : EPUBGenerator(package, method)
|
|
-+EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
|
|
-+ : EPUBGenerator(package, method, version)
|
|
- , m_firstPage(true)
|
|
- {
|
|
- }
|
|
-@@ -59,8 +59,8 @@ void EPUBPagedGenerator::Impl::endHtmlFile()
|
|
- {
|
|
- }
|
|
-
|
|
--EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method)
|
|
-- : m_impl(new Impl(package, method))
|
|
-+EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
|
|
-+ : m_impl(new Impl(package, method, version))
|
|
- {
|
|
- }
|
|
-
|
|
-diff --git a/src/lib/EPUBPagedGenerator.h b/src/lib/EPUBPagedGenerator.h
|
|
-index f1d124f..74d70da 100644
|
|
---- a/src/lib/EPUBPagedGenerator.h
|
|
-+++ b/src/lib/EPUBPagedGenerator.h
|
|
-@@ -26,7 +26,7 @@ class EPUBPagedGenerator: public librevenge::RVNGPresentationInterface
|
|
- class Impl;
|
|
-
|
|
- public:
|
|
-- EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method);
|
|
-+ EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
|
|
-
|
|
- void setSplitHeadingLevel(unsigned level);
|
|
- void setSplitSize(unsigned size);
|
|
-diff --git a/src/lib/EPUBPresentationGenerator.cpp b/src/lib/EPUBPresentationGenerator.cpp
|
|
-index 5b2a2e9..80b5ac2 100644
|
|
---- a/src/lib/EPUBPresentationGenerator.cpp
|
|
-+++ b/src/lib/EPUBPresentationGenerator.cpp
|
|
-@@ -20,16 +20,16 @@ using librevenge::RVNGString;
|
|
- class EPUBPresentationGenerator::Impl : public EPUBPagedGenerator
|
|
- {
|
|
- public:
|
|
-- Impl(EPUBPackage *const package, EPUBSplitMethod method);
|
|
-+ Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
|
|
- };
|
|
-
|
|
--EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
|
|
-- : EPUBPagedGenerator(package, method)
|
|
-+EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
|
|
-+ : EPUBPagedGenerator(package, method, version)
|
|
- {
|
|
- }
|
|
-
|
|
--EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method)
|
|
-- : m_impl(new Impl(package, method))
|
|
-+EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method, int version)
|
|
-+ : m_impl(new Impl(package, method, version))
|
|
- {
|
|
- (void) method;
|
|
- }
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index b3ca626..e8f785e 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -57,7 +57,7 @@ bool operator!=(const char *const left, const RVNGString &right)
|
|
-
|
|
- struct EPUBTextGenerator::Impl : public EPUBGenerator
|
|
- {
|
|
-- Impl(EPUBPackage *package, EPUBSplitMethod method);
|
|
-+ Impl(EPUBPackage *package, EPUBSplitMethod method, int version);
|
|
-
|
|
- private:
|
|
- void startHtmlFile() override;
|
|
-@@ -83,8 +83,8 @@ private:
|
|
- Impl &operator=(const Impl &);
|
|
- };
|
|
-
|
|
--EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
|
|
-- : EPUBGenerator(package, method)
|
|
-+EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
|
|
-+ : EPUBGenerator(package, method, version)
|
|
- , m_inPageSpan(false)
|
|
- , m_inHeader(false)
|
|
- , m_inFooter(false)
|
|
-@@ -113,8 +113,8 @@ void EPUBTextGenerator::Impl::endHtmlFile()
|
|
- m_currentFooter->write(getHtml().get());
|
|
- }
|
|
-
|
|
--EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method)
|
|
-- : m_impl(new Impl(package, method))
|
|
-+EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
|
|
-+ : m_impl(new Impl(package, method, version))
|
|
- {
|
|
- (void) method;
|
|
- }
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From cfd57f50c9d33781f90018d40902ccce68a13a5c Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 9 Aug 2017 17:19:06 +0200
|
|
-Subject: [PATCH 6/9] EPUB3: write missing modification date
|
|
-
|
|
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,236): Error while parsing file: package dcterms:modified meta element must occur exactly once
|
|
-
|
|
-But not for EPUB2, which doesn't allow so.
|
|
-
|
|
-(Similar story as with dc:title: later commit should read the this
|
|
-optional info from librevenge.)
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 18 ++++++++++++++++++
|
|
- 1 file changed, 18 insertions(+)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 4888677..1628a2b 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -7,6 +7,7 @@
|
|
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
- */
|
|
-
|
|
-+#include <ctime>
|
|
- #include <sstream>
|
|
-
|
|
- #include <boost/uuid/uuid.hpp>
|
|
-@@ -222,6 +223,23 @@ void EPUBGenerator::writeRoot()
|
|
- sink.insertCharacters("en");
|
|
- sink.closeElement("dc:language");
|
|
-
|
|
-+ time_t now = 0;
|
|
-+ time(&now);
|
|
-+ const struct tm *local = localtime(&now);
|
|
-+ if (m_version == 30 && local)
|
|
-+ {
|
|
-+ RVNGPropertyList metaAttrs;
|
|
-+ metaAttrs.insert("property", "dcterms:modified");
|
|
-+ sink.openElement("meta", metaAttrs);
|
|
-+ const int MAX_BUFFER = 1024;
|
|
-+ char buffer[MAX_BUFFER];
|
|
-+ strftime(&buffer[0], MAX_BUFFER-1, "%Y-%m-%dT%H:%M:%SZ", local);
|
|
-+ RVNGString result;
|
|
-+ result.append(buffer);
|
|
-+ sink.insertCharacters(result);
|
|
-+ sink.closeElement("meta");
|
|
-+ }
|
|
-+
|
|
- sink.closeElement("metadata");
|
|
-
|
|
- sink.openElement("manifest");
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 575a09f637b5afe4d61387c7be3c8b2b67039ccb Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 9 Aug 2017 17:39:51 +0200
|
|
-Subject: [PATCH 7/9] EPUB3: add missing nav property on first HTML stream
|
|
-
|
|
-ERROR(RSC-005): test30.epub/OEBPS/content.opf(2,459): Error while parsing file: Exactly one manifest item must declare the 'nav' property (number of 'nav' items: 0).
|
|
-
|
|
-This is the last error in OEBPS/content.opf in case of EPUB3.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 11 ++++++++---
|
|
- src/lib/EPUBGenerator.h | 1 +
|
|
- src/lib/EPUBHTMLManager.cpp | 9 +++++++--
|
|
- src/lib/EPUBHTMLManager.h | 3 ++-
|
|
- src/lib/EPUBImageManager.cpp | 2 +-
|
|
- src/lib/EPUBManifest.cpp | 11 +++++++----
|
|
- src/lib/EPUBManifest.h | 5 +++--
|
|
- 7 files changed, 29 insertions(+), 13 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 1628a2b..f77aa6c 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -54,8 +54,8 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
|
|
-
|
|
- startNewHtmlFile();
|
|
-
|
|
-- m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx");
|
|
-- m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css");
|
|
-+ m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
|
|
-+ m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
|
|
- }
|
|
-
|
|
- void EPUBGenerator::endDocument()
|
|
-@@ -90,7 +90,7 @@ void EPUBGenerator::startNewHtmlFile()
|
|
-
|
|
- m_splitGuard.onSplit();
|
|
-
|
|
-- m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath);
|
|
-+ m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, *this);
|
|
-
|
|
- // restore state in the new file
|
|
- m_currentHtml->startDocument(m_documentProps);
|
|
-@@ -114,6 +114,11 @@ EPUBSplitGuard &EPUBGenerator::getSplitGuard()
|
|
- return m_splitGuard;
|
|
- }
|
|
-
|
|
-+int EPUBGenerator::getVersion() const
|
|
-+{
|
|
-+ return m_version;
|
|
-+}
|
|
-+
|
|
- void EPUBGenerator::writeContainer()
|
|
- {
|
|
- EPUBXMLSink sink;
|
|
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
|
|
-index a0ef8ac..1a67a88 100644
|
|
---- a/src/lib/EPUBGenerator.h
|
|
-+++ b/src/lib/EPUBGenerator.h
|
|
-@@ -47,6 +47,7 @@ public:
|
|
-
|
|
- const EPUBSplitGuard &getSplitGuard() const;
|
|
- EPUBSplitGuard &getSplitGuard();
|
|
-+ int getVersion() const;
|
|
-
|
|
- private:
|
|
- virtual void startHtmlFile() = 0;
|
|
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
|
|
-index 03dbf21..57636b9 100644
|
|
---- a/src/lib/EPUBHTMLManager.cpp
|
|
-+++ b/src/lib/EPUBHTMLManager.cpp
|
|
-@@ -13,6 +13,7 @@
|
|
-
|
|
- #include "EPUBHTMLManager.h"
|
|
- #include "EPUBManifest.h"
|
|
-+#include "EPUBGenerator.h"
|
|
-
|
|
- namespace libepubgen
|
|
- {
|
|
-@@ -26,7 +27,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
|
|
- {
|
|
- }
|
|
-
|
|
--const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath)
|
|
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator)
|
|
- {
|
|
- std::ostringstream nameBuf;
|
|
- nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next();
|
|
-@@ -35,7 +36,11 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana
|
|
- nameBuf << ".html";
|
|
- m_paths.push_back(EPUBPath("OEBPS/sections") / nameBuf.str());
|
|
-
|
|
-- m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back());
|
|
-+ std::string properties;
|
|
-+ if (m_number.current() == 1 && generator.getVersion() == 30)
|
|
-+ // Only for the first HTML file.
|
|
-+ properties = "nav";
|
|
-+ m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back(), properties);
|
|
-
|
|
- m_contents.push_back(EPUBXMLSink());
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
|
|
-index 84ecd2d..7dab33b 100644
|
|
---- a/src/lib/EPUBHTMLManager.h
|
|
-+++ b/src/lib/EPUBHTMLManager.h
|
|
-@@ -30,6 +30,7 @@ class EPUBSpanStyleManager;
|
|
- class EPUBTableStyleManager;
|
|
- class EPUBManifest;
|
|
- class EPUBPackage;
|
|
-+class EPUBGenerator;
|
|
-
|
|
- class EPUBHTMLManager
|
|
- {
|
|
-@@ -40,7 +41,7 @@ class EPUBHTMLManager
|
|
- public:
|
|
- explicit EPUBHTMLManager(EPUBManifest &manifest);
|
|
-
|
|
-- const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath);
|
|
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator);
|
|
-
|
|
- void writeTo(EPUBPackage &package);
|
|
-
|
|
-diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp
|
|
-index 1b043d7..0179cad 100644
|
|
---- a/src/lib/EPUBImageManager.cpp
|
|
-+++ b/src/lib/EPUBImageManager.cpp
|
|
-@@ -86,7 +86,7 @@ const EPUBPath &EPUBImageManager::insert(const librevenge::RVNGBinaryData &data,
|
|
-
|
|
- const EPUBPath path(EPUBPath("OEBPS/images") / nameBuf.str());
|
|
-
|
|
-- m_manifest.insert(path, mime, id);
|
|
-+ m_manifest.insert(path, mime, id, "");
|
|
- it = m_map.insert(MapType_t::value_type(data, path)).first;
|
|
- }
|
|
-
|
|
-diff --git a/src/lib/EPUBManifest.cpp b/src/lib/EPUBManifest.cpp
|
|
-index dcffdcc..813a097 100644
|
|
---- a/src/lib/EPUBManifest.cpp
|
|
-+++ b/src/lib/EPUBManifest.cpp
|
|
-@@ -21,9 +21,9 @@ EPUBManifest::EPUBManifest()
|
|
- {
|
|
- }
|
|
-
|
|
--void EPUBManifest::insert(const EPUBPath &path, const std::string &mimetype, const std::string &id)
|
|
-+void EPUBManifest::insert(const EPUBPath &path, const std::string &mimetype, const std::string &id, const std::string &properties)
|
|
- {
|
|
-- if (!m_map.insert(MapType_t::value_type(path.relativeTo(EPUBPath("OEBPS/content.opf")).str(), ValueType_t(mimetype, id))).second)
|
|
-+ if (!m_map.insert(MapType_t::value_type(path.relativeTo(EPUBPath("OEBPS/content.opf")).str(), ValueType_t(mimetype, id, properties))).second)
|
|
- {
|
|
- assert(!"duplicate entry!");
|
|
- }
|
|
-@@ -35,8 +35,11 @@ void EPUBManifest::writeTo(EPUBXMLSink &sink)
|
|
- {
|
|
- librevenge::RVNGPropertyList attrs;
|
|
- attrs.insert("href", it->first.c_str());
|
|
-- attrs.insert("media-type", it->second.first.c_str());
|
|
-- attrs.insert("id", it->second.second.c_str());
|
|
-+ attrs.insert("media-type", std::get<0>(it->second).c_str());
|
|
-+ attrs.insert("id", std::get<1>(it->second).c_str());
|
|
-+ const std::string &properties = std::get<2>(it->second);
|
|
-+ if (!properties.empty())
|
|
-+ attrs.insert("properties", properties.c_str());
|
|
- sink.insertEmptyElement("item", attrs);
|
|
- }
|
|
- }
|
|
-diff --git a/src/lib/EPUBManifest.h b/src/lib/EPUBManifest.h
|
|
-index f2379cf..c4c9031 100644
|
|
---- a/src/lib/EPUBManifest.h
|
|
-+++ b/src/lib/EPUBManifest.h
|
|
-@@ -26,13 +26,14 @@ class EPUBManifest
|
|
- EPUBManifest(const EPUBManifest &);
|
|
- EPUBManifest &operator=(const EPUBManifest &);
|
|
-
|
|
-- typedef std::pair<std::string, std::string> ValueType_t;
|
|
-+ // media-type, id, properties
|
|
-+ typedef std::tuple<std::string, std::string, std::string> ValueType_t;
|
|
- typedef std::unordered_map<std::string, ValueType_t> MapType_t;
|
|
-
|
|
- public:
|
|
- EPUBManifest();
|
|
-
|
|
-- void insert(const EPUBPath &path, const std::string &mimetype, const std::string &id);
|
|
-+ void insert(const EPUBPath &path, const std::string &mimetype, const std::string &id, const std::string &properties);
|
|
-
|
|
- void writeTo(EPUBXMLSink &sink);
|
|
-
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 28090aa5d57162302122686cb020d4bf2231cab4 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Thu, 10 Aug 2017 15:05:46 +0200
|
|
-Subject: [PATCH 8/9] EPUB3: implement navigation document
|
|
-
|
|
-As
|
|
-<http://www.idpf.org/epub/30/spec/epub30-changes.html#sec-new-changed-nav>
|
|
-says, EPUB 3 defines a new grammar for navigation based on XHTML, which
|
|
-replaces the old NCX grammar -- so use that in EPUB3 mode.
|
|
-
|
|
-With this, a hello world input in EPUB3 mode results in 0 errors in the
|
|
-validator.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 43 ++++++++++++++++++++++++++++++++++++++-----
|
|
- src/lib/EPUBHTMLManager.cpp | 28 +++++++++++++++++++++-------
|
|
- src/lib/EPUBHTMLManager.h | 4 ++--
|
|
- 3 files changed, 61 insertions(+), 14 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index f77aa6c..7ec2a2b 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -54,7 +54,10 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
|
|
-
|
|
- startNewHtmlFile();
|
|
-
|
|
-- m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
|
|
-+ if (m_version == 30)
|
|
-+ m_manifest.insert(EPUBPath("OEBPS/toc.html"), "application/xhtml+xml", "toc.html", "nav");
|
|
-+ else
|
|
-+ m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
|
|
- m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
|
|
- }
|
|
-
|
|
-@@ -90,7 +93,7 @@ void EPUBGenerator::startNewHtmlFile()
|
|
-
|
|
- m_splitGuard.onSplit();
|
|
-
|
|
-- m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, *this);
|
|
-+ m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath);
|
|
-
|
|
- // restore state in the new file
|
|
- m_currentHtml->startDocument(m_documentProps);
|
|
-@@ -144,9 +147,38 @@ void EPUBGenerator::writeContainer()
|
|
-
|
|
- void EPUBGenerator::writeNavigation()
|
|
- {
|
|
-- const EPUBPath path("OEBPS/toc.ncx");
|
|
- EPUBXMLSink sink;
|
|
-
|
|
-+ if (m_version == 30)
|
|
-+ {
|
|
-+ const EPUBPath path("OEBPS/toc.html");
|
|
-+ RVNGPropertyList htmlAttrs;
|
|
-+ htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml");
|
|
-+ htmlAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops");
|
|
-+ sink.openElement("html", htmlAttrs);
|
|
-+
|
|
-+ sink.openElement("head");
|
|
-+ sink.closeElement("head");
|
|
-+ sink.openElement("body");
|
|
-+
|
|
-+ RVNGPropertyList navAttrs;
|
|
-+ navAttrs.insert("epub:type", "toc");
|
|
-+ sink.openElement("nav", navAttrs);
|
|
-+
|
|
-+ sink.openElement("ol");
|
|
-+ m_htmlManager.writeTocTo(sink, path, m_version);
|
|
-+ sink.closeElement("ol");
|
|
-+
|
|
-+ sink.closeElement("nav");
|
|
-+ sink.closeElement("body");
|
|
-+ sink.closeElement("html");
|
|
-+
|
|
-+ sink.writeTo(*m_package, path.str().c_str());
|
|
-+
|
|
-+ return;
|
|
-+ }
|
|
-+
|
|
-+ const EPUBPath path("OEBPS/toc.ncx");
|
|
- RVNGPropertyList ncxAttrs;
|
|
- ncxAttrs.insert("xmlns", "http://www.daisy.org/z3986/2005/ncx/");
|
|
- ncxAttrs.insert("version", "2005-1");
|
|
-@@ -166,7 +198,7 @@ void EPUBGenerator::writeNavigation()
|
|
- sink.closeElement("docTitle");
|
|
-
|
|
- sink.openElement("navMap");
|
|
-- m_htmlManager.writeTocTo(sink, path);
|
|
-+ m_htmlManager.writeTocTo(sink, path, m_version);
|
|
- sink.closeElement("navMap");
|
|
-
|
|
- sink.closeElement("ncx");
|
|
-@@ -252,7 +284,8 @@ void EPUBGenerator::writeRoot()
|
|
- sink.closeElement("manifest");
|
|
-
|
|
- RVNGPropertyList spineAttrs;
|
|
-- spineAttrs.insert("toc", "toc.ncx");
|
|
-+ if (m_version == 20)
|
|
-+ spineAttrs.insert("toc", "toc.ncx");
|
|
-
|
|
- sink.openElement("spine", spineAttrs);
|
|
- m_htmlManager.writeSpineTo(sink);
|
|
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
|
|
-index 57636b9..7b17304 100644
|
|
---- a/src/lib/EPUBHTMLManager.cpp
|
|
-+++ b/src/lib/EPUBHTMLManager.cpp
|
|
-@@ -27,7 +27,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
|
|
- {
|
|
- }
|
|
-
|
|
--const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator)
|
|
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath)
|
|
- {
|
|
- std::ostringstream nameBuf;
|
|
- nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next();
|
|
-@@ -36,11 +36,7 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana
|
|
- nameBuf << ".html";
|
|
- m_paths.push_back(EPUBPath("OEBPS/sections") / nameBuf.str());
|
|
-
|
|
-- std::string properties;
|
|
-- if (m_number.current() == 1 && generator.getVersion() == 30)
|
|
-- // Only for the first HTML file.
|
|
-- properties = "nav";
|
|
-- m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back(), properties);
|
|
-+ m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back(), "");
|
|
-
|
|
- m_contents.push_back(EPUBXMLSink());
|
|
-
|
|
-@@ -71,8 +67,26 @@ void EPUBHTMLManager::writeSpineTo(EPUBXMLSink &sink)
|
|
- }
|
|
- }
|
|
-
|
|
--void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath)
|
|
-+void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version)
|
|
- {
|
|
-+ if (version == 30)
|
|
-+ {
|
|
-+ for (std::vector<EPUBPath>::size_type i = 0; m_paths.size() != i; ++i)
|
|
-+ {
|
|
-+ sink.openElement("li");
|
|
-+ librevenge::RVNGPropertyList anchorAttrs;
|
|
-+ anchorAttrs.insert("href", m_paths[i].relativeTo(tocPath).str().c_str());
|
|
-+ sink.openElement("a", anchorAttrs);
|
|
-+ std::ostringstream label;
|
|
-+ label << "Section " << (i + 1);
|
|
-+ sink.insertCharacters(label.str().c_str());
|
|
-+ sink.closeElement("a");
|
|
-+ sink.closeElement("li");
|
|
-+ }
|
|
-+
|
|
-+ return;
|
|
-+ }
|
|
-+
|
|
- librevenge::RVNGPropertyList navPointAttrs;
|
|
- for (std::vector<EPUBPath>::size_type i = 0; m_paths.size() != i; ++i)
|
|
- {
|
|
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
|
|
-index 7dab33b..2ec7bb7 100644
|
|
---- a/src/lib/EPUBHTMLManager.h
|
|
-+++ b/src/lib/EPUBHTMLManager.h
|
|
-@@ -41,12 +41,12 @@ class EPUBHTMLManager
|
|
- public:
|
|
- explicit EPUBHTMLManager(EPUBManifest &manifest);
|
|
-
|
|
-- const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator);
|
|
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath);
|
|
-
|
|
- void writeTo(EPUBPackage &package);
|
|
-
|
|
- void writeSpineTo(EPUBXMLSink &sink);
|
|
-- void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath);
|
|
-+ void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version);
|
|
-
|
|
- private:
|
|
- EPUBManifest &m_manifest;
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 2e9e9af9f49a78cca75d3c862c8dd4b5f7cc7eb2 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Thu, 10 Aug 2017 15:11:49 +0200
|
|
-Subject: [PATCH 9/9] Use .xhtml for XHTML content
|
|
-
|
|
-The EPUB3 validator warns:
|
|
-
|
|
-WARNING(HTM-014a): test30.epub/OEBPS/content.opf(2,718): XHTML Content Document file name 'OEBPS/sections/section0001.html' should have the extension '.xhtml'.
|
|
-
|
|
-And it does not hurt for EPUB2, either.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 4 ++--
|
|
- src/lib/EPUBHTMLManager.cpp | 2 +-
|
|
- 2 files changed, 3 insertions(+), 3 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 7ec2a2b..ca05ea7 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -55,7 +55,7 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
|
|
- startNewHtmlFile();
|
|
-
|
|
- if (m_version == 30)
|
|
-- m_manifest.insert(EPUBPath("OEBPS/toc.html"), "application/xhtml+xml", "toc.html", "nav");
|
|
-+ m_manifest.insert(EPUBPath("OEBPS/toc.xhtml"), "application/xhtml+xml", "toc.xhtml", "nav");
|
|
- else
|
|
- m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
|
|
- m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
|
|
-@@ -151,7 +151,7 @@ void EPUBGenerator::writeNavigation()
|
|
-
|
|
- if (m_version == 30)
|
|
- {
|
|
-- const EPUBPath path("OEBPS/toc.html");
|
|
-+ const EPUBPath path("OEBPS/toc.xhtml");
|
|
- RVNGPropertyList htmlAttrs;
|
|
- htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml");
|
|
- htmlAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops");
|
|
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
|
|
-index 7b17304..be56cc7 100644
|
|
---- a/src/lib/EPUBHTMLManager.cpp
|
|
-+++ b/src/lib/EPUBHTMLManager.cpp
|
|
-@@ -33,7 +33,7 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana
|
|
- nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next();
|
|
- m_ids.push_back(nameBuf.str());
|
|
-
|
|
-- nameBuf << ".html";
|
|
-+ nameBuf << ".xhtml";
|
|
- m_paths.push_back(EPUBPath("OEBPS/sections") / nameBuf.str());
|
|
-
|
|
- m_manifest.insert(m_paths.back(), "application/xhtml+xml", m_ids.back(), "");
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From c30bc184c18837203e9f249386711e9cd616c9f0 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 11 Aug 2017 10:50:47 +0200
|
|
-Subject: [PATCH] EPUB3: write the deprecated NCX navication as well
|
|
-
|
|
-<http://www.idpf.org/epub/30/spec/epub30-changes.html#sec-new-changed-nav>
|
|
-"3.2 Navigation" says:
|
|
-
|
|
- EPUB 3 Publications may include the EPUB 2 NCX for EPUB 2 Reading System
|
|
- forward compatibility purposes.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 18 +++++++++---------
|
|
- 1 file changed, 9 insertions(+), 9 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index ca05ea7..8017ffe 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -56,8 +56,7 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
|
|
-
|
|
- if (m_version == 30)
|
|
- m_manifest.insert(EPUBPath("OEBPS/toc.xhtml"), "application/xhtml+xml", "toc.xhtml", "nav");
|
|
-- else
|
|
-- m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
|
|
-+ m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
|
|
- m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
|
|
- }
|
|
-
|
|
-@@ -147,10 +146,10 @@ void EPUBGenerator::writeContainer()
|
|
-
|
|
- void EPUBGenerator::writeNavigation()
|
|
- {
|
|
-- EPUBXMLSink sink;
|
|
--
|
|
- if (m_version == 30)
|
|
- {
|
|
-+ EPUBXMLSink sink;
|
|
-+
|
|
- const EPUBPath path("OEBPS/toc.xhtml");
|
|
- RVNGPropertyList htmlAttrs;
|
|
- htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml");
|
|
-@@ -174,10 +173,10 @@ void EPUBGenerator::writeNavigation()
|
|
- sink.closeElement("html");
|
|
-
|
|
- sink.writeTo(*m_package, path.str().c_str());
|
|
--
|
|
-- return;
|
|
- }
|
|
-
|
|
-+ EPUBXMLSink sink;
|
|
-+
|
|
- const EPUBPath path("OEBPS/toc.ncx");
|
|
- RVNGPropertyList ncxAttrs;
|
|
- ncxAttrs.insert("xmlns", "http://www.daisy.org/z3986/2005/ncx/");
|
|
-@@ -198,7 +197,9 @@ void EPUBGenerator::writeNavigation()
|
|
- sink.closeElement("docTitle");
|
|
-
|
|
- sink.openElement("navMap");
|
|
-- m_htmlManager.writeTocTo(sink, path, m_version);
|
|
-+ // In case of EPUB3 the (deprecated, but valid) EPUB2 markup is wanted, so
|
|
-+ // the version is unconditional here.
|
|
-+ m_htmlManager.writeTocTo(sink, path, /*version=*/20);
|
|
- sink.closeElement("navMap");
|
|
-
|
|
- sink.closeElement("ncx");
|
|
-@@ -284,8 +285,7 @@ void EPUBGenerator::writeRoot()
|
|
- sink.closeElement("manifest");
|
|
-
|
|
- RVNGPropertyList spineAttrs;
|
|
-- if (m_version == 20)
|
|
-- spineAttrs.insert("toc", "toc.ncx");
|
|
-+ spineAttrs.insert("toc", "toc.ncx");
|
|
-
|
|
- sink.openElement("spine", spineAttrs);
|
|
- m_htmlManager.writeSpineTo(sink);
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From d855721de6b4e55fb0b2a02a6a1132802dba5f63 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 11 Aug 2017 15:40:49 +0200
|
|
-Subject: [PATCH] EPUBGenerator: write title into content.opf
|
|
-
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 5 ++++-
|
|
- 1 file changed, 4 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 8017ffe..056c48c 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -253,8 +253,11 @@ void EPUBGenerator::writeRoot()
|
|
-
|
|
- // Zero-width space as it must be at least one character in length after
|
|
- // white space has been trimmed.
|
|
-+ RVNGString title("\u200b");
|
|
-+ if (m_metadata["dc:title"] && !m_metadata["dc:title"]->getStr().empty())
|
|
-+ title = m_metadata["dc:title"]->getStr();
|
|
- sink.openElement("dc:title");
|
|
-- sink.insertCharacters("\u200b");
|
|
-+ sink.insertCharacters(title);
|
|
- sink.closeElement("dc:title");
|
|
-
|
|
- sink.openElement("dc:language");
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 14da42819f1f96b87b2337da395e5ad6639dcebe Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 11 Aug 2017 16:43:10 +0200
|
|
-Subject: [PATCH] EPUBGenerator: write language and modification date into
|
|
- content.opf
|
|
-
|
|
-With this, all metadata which had a hardcoded value is now parsed and
|
|
-the old values are just defaults.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 32 +++++++++++++++++++++-----------
|
|
- 1 file changed, 21 insertions(+), 11 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 056c48c..fc6c848 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -260,24 +260,34 @@ void EPUBGenerator::writeRoot()
|
|
- sink.insertCharacters(title);
|
|
- sink.closeElement("dc:title");
|
|
-
|
|
-+ RVNGString language("en");
|
|
-+ if (m_metadata["dc:language"] && !m_metadata["dc:language"]->getStr().empty())
|
|
-+ language = m_metadata["dc:language"]->getStr();
|
|
- sink.openElement("dc:language");
|
|
-- sink.insertCharacters("en");
|
|
-+ sink.insertCharacters(language);
|
|
- sink.closeElement("dc:language");
|
|
-
|
|
-- time_t now = 0;
|
|
-- time(&now);
|
|
-- const struct tm *local = localtime(&now);
|
|
-- if (m_version == 30 && local)
|
|
-+ if (m_version == 30)
|
|
- {
|
|
-+ RVNGString date;
|
|
-+ time_t now = 0;
|
|
-+ time(&now);
|
|
-+ const struct tm *local = localtime(&now);
|
|
-+ if (local)
|
|
-+ {
|
|
-+ const int MAX_BUFFER = 1024;
|
|
-+ char buffer[MAX_BUFFER];
|
|
-+ strftime(&buffer[0], MAX_BUFFER-1, "%Y-%m-%dT%H:%M:%SZ", local);
|
|
-+ date.append(buffer);
|
|
-+ }
|
|
-+
|
|
-+ if (m_metadata["dc:date"] && !m_metadata["dc:date"]->getStr().empty())
|
|
-+ date = m_metadata["dc:date"]->getStr();
|
|
-+
|
|
- RVNGPropertyList metaAttrs;
|
|
- metaAttrs.insert("property", "dcterms:modified");
|
|
- sink.openElement("meta", metaAttrs);
|
|
-- const int MAX_BUFFER = 1024;
|
|
-- char buffer[MAX_BUFFER];
|
|
-- strftime(&buffer[0], MAX_BUFFER-1, "%Y-%m-%dT%H:%M:%SZ", local);
|
|
-- RVNGString result;
|
|
-- result.append(buffer);
|
|
-- sink.insertCharacters(result);
|
|
-+ sink.insertCharacters(date);
|
|
- sink.closeElement("meta");
|
|
- }
|
|
-
|
|
---
|
|
-2.12.3
|
|
-From c8cba54a7025ee0f1129233912f6e9ceda254c64 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 11 Aug 2017 17:40:10 +0200
|
|
-Subject: [PATCH] EPUB3: fix validation error with doc modified date format
|
|
-
|
|
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,420): Error while parsing file: dcterms:modified illegal syntax (expecting: 'CCYY-MM-DDThh:mm:ssZ')
|
|
-
|
|
-Both of them looked like XML date formats, but actually librevenge is
|
|
-more precise, so truncate it.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 6 +++++-
|
|
- 1 file changed, 5 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index fc6c848..4bffb8b 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -282,7 +282,11 @@ void EPUBGenerator::writeRoot()
|
|
- }
|
|
-
|
|
- if (m_metadata["dc:date"] && !m_metadata["dc:date"]->getStr().empty())
|
|
-- date = m_metadata["dc:date"]->getStr();
|
|
-+ {
|
|
-+ // Expecting CCYY-MM-DDThh:mm:ssZ, librevenge provides CCYY-MM-DDThh:mm:ss.sssssssss
|
|
-+ date = std::string(m_metadata["dc:date"]->getStr().cstr()).substr(0, 19).c_str();
|
|
-+ date.append("Z");
|
|
-+ }
|
|
-
|
|
- RVNGPropertyList metaAttrs;
|
|
- metaAttrs.insert("property", "dcterms:modified");
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From c28f02f21a6d80ad258cf8f052705508567e2418 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 11 Aug 2017 18:19:15 +0200
|
|
-Subject: [PATCH 1/3] Fix image mime-type key
|
|
-
|
|
-libepubgen expected librevenge:mimetype, but:
|
|
-
|
|
-1) LO's ODF output has loext:mime-type
|
|
-2) libabw generates librevenge:mime-type
|
|
-3) libodfgen expects librevenge:mime-type
|
|
-
|
|
-So probably this one has to be adjusted.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 2 +-
|
|
- src/lib/EPUBTextGenerator.cpp | 4 ++--
|
|
- 2 files changed, 3 insertions(+), 3 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index 5ef5e14..40c507e 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -866,7 +866,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
|
|
-
|
|
- const EPUBPath &path = m_impl->m_imageManager.insert(
|
|
- RVNGBinaryData(propList["office:binary-data"]->getStr()),
|
|
-- propList["librevenge:mimetype"]->getStr());
|
|
-+ propList["librevenge:mime-type"]->getStr());
|
|
-
|
|
- RVNGPropertyList attrs;
|
|
- attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str());
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index e8f785e..cb557b2 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -596,7 +596,7 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
|
|
-
|
|
- for (RVNGPropertyList::Iter iter(propList); !iter.last(); iter.next())
|
|
- {
|
|
-- if (RVNGString("librevenge:mimetype") == iter.key())
|
|
-+ if (RVNGString("librevenge:mime-type") == iter.key())
|
|
- mimetype.reset(iter()->clone());
|
|
- else if (RVNGString("office:binary-data") == iter.key())
|
|
- data.reset(iter()->clone());
|
|
-@@ -627,7 +627,7 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
|
|
- }
|
|
- }
|
|
-
|
|
-- newPropList.insert("librevenge:mimetype", mimetype->clone());
|
|
-+ newPropList.insert("librevenge:mime-type", mimetype->clone());
|
|
- newPropList.insert("office:binary-data", data->clone());
|
|
-
|
|
- if (m_impl->m_inHeader || m_impl->m_inFooter)
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 39470cf360cfc67f2dd078646162a63168a84c05 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 15 Aug 2017 12:12:12 +0200
|
|
-Subject: [PATCH 2/3] EPUBSplitGuard: fix tracking current size
|
|
-
|
|
-In case incrementing size and split affects the reference size, the
|
|
-current size won't be ever greather than zero in
|
|
-EPUBSplitGuard::canSplit(), and it will always return false.
|
|
-
|
|
-With this, EPUB_SPLIT_METHOD_PAGE_BREAK works again.
|
|
----
|
|
- src/lib/EPUBSplitGuard.cpp | 4 ++--
|
|
- 1 file changed, 2 insertions(+), 2 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
|
|
-index 8c279c8..15ba20f 100644
|
|
---- a/src/lib/EPUBSplitGuard.cpp
|
|
-+++ b/src/lib/EPUBSplitGuard.cpp
|
|
-@@ -46,7 +46,7 @@ void EPUBSplitGuard::closeLevel()
|
|
-
|
|
- void EPUBSplitGuard::incrementSize(const unsigned size)
|
|
- {
|
|
-- m_size += size;
|
|
-+ m_currentSize += size;
|
|
- }
|
|
-
|
|
- bool EPUBSplitGuard::splitOnPageBreak() const
|
|
-@@ -66,7 +66,7 @@ bool EPUBSplitGuard::splitOnSize() const
|
|
-
|
|
- void EPUBSplitGuard::onSplit()
|
|
- {
|
|
-- m_size = 0;
|
|
-+ m_currentSize = 0;
|
|
- }
|
|
-
|
|
- bool EPUBSplitGuard::canSplit(const EPUBSplitMethod method) const
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 3155cb6164f04fa8170dd9912c579ad90586c8a8 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 15 Aug 2017 13:53:16 +0200
|
|
-Subject: [PATCH 3/3] EPUBTextGenerator: handle EPUB_SPLIT_METHOD_HEADING
|
|
-
|
|
-It seems to me this was unimplemented so far.
|
|
----
|
|
- src/lib/EPUBTextGenerator.cpp | 6 ++++++
|
|
- 1 file changed, 6 insertions(+)
|
|
-
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index cb557b2..aba8827 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -255,6 +255,12 @@ void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propLi
|
|
- m_impl->m_breakAfterPara = breakAfter && ("column" != breakAfter->getStr());
|
|
- if (m_impl->getSplitGuard().splitOnSize())
|
|
- m_impl->startNewHtmlFile();
|
|
-+
|
|
-+ // Handle split by chapters.
|
|
-+ const RVNGProperty *const outlineLevel = propList["text:outline-level"];
|
|
-+ if (outlineLevel && m_impl->getSplitGuard().splitOnHeading(outlineLevel->getInt()))
|
|
-+ m_impl->startNewHtmlFile();
|
|
-+
|
|
- m_impl->getSplitGuard().openLevel();
|
|
-
|
|
- if (m_impl->m_inHeader || m_impl->m_inFooter)
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 576c2472e384ea1a71739b15f42561cd34de5bba Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 16 Aug 2017 17:52:37 +0200
|
|
-Subject: [PATCH] EPUB_SPLIT_METHOD_HEADING: try to use real chapter names, not
|
|
- Section N
|
|
-
|
|
-What users call "chapter title" is the text of a paragraph with an
|
|
-outline level set.
|
|
-
|
|
-To keep this simple just handle the text after opening such a paragraph,
|
|
-but no other paragraph is opened, i.e. assume that in:
|
|
-
|
|
-<para outline=y>A<para outline=n>B</para>C</para>
|
|
-
|
|
-only A is interesting, but not B, neither C. (Which could happen with an
|
|
-at-character anchored frame inside a heading text e.g.)
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 5 +++++
|
|
- src/lib/EPUBGenerator.h | 2 ++
|
|
- src/lib/EPUBHTMLManager.cpp | 26 ++++++++++++++++++++++++--
|
|
- src/lib/EPUBHTMLManager.h | 3 +++
|
|
- src/lib/EPUBPath.cpp | 11 +++++++++++
|
|
- src/lib/EPUBPath.h | 4 ++++
|
|
- src/lib/EPUBTextGenerator.cpp | 6 ++++++
|
|
- 7 files changed, 55 insertions(+), 2 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 4bffb8b..4ce2964 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -106,6 +106,11 @@ const EPUBHTMLGeneratorPtr_t &EPUBGenerator::getHtml() const
|
|
- return m_currentHtml;
|
|
- }
|
|
-
|
|
-+EPUBHTMLManager &EPUBGenerator::getHtmlManager()
|
|
-+{
|
|
-+ return m_htmlManager;
|
|
-+}
|
|
-+
|
|
- const EPUBSplitGuard &EPUBGenerator::getSplitGuard() const
|
|
- {
|
|
- return m_splitGuard;
|
|
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
|
|
-index 1a67a88..f98c80f 100644
|
|
---- a/src/lib/EPUBGenerator.h
|
|
-+++ b/src/lib/EPUBGenerator.h
|
|
-@@ -45,6 +45,8 @@ public:
|
|
-
|
|
- const EPUBHTMLGeneratorPtr_t &getHtml() const;
|
|
-
|
|
-+ EPUBHTMLManager &getHtmlManager();
|
|
-+
|
|
- const EPUBSplitGuard &getSplitGuard() const;
|
|
- EPUBSplitGuard &getSplitGuard();
|
|
- int getVersion() const;
|
|
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
|
|
-index be56cc7..5141f31 100644
|
|
---- a/src/lib/EPUBHTMLManager.cpp
|
|
-+++ b/src/lib/EPUBHTMLManager.cpp
|
|
-@@ -18,6 +18,20 @@
|
|
- namespace libepubgen
|
|
- {
|
|
-
|
|
-+namespace
|
|
-+{
|
|
-+
|
|
-+/// Extracts a title string from a path and provides a fallback if it would be empty.
|
|
-+void getPathTitle(std::ostringstream &label, const EPUBPath &path, std::vector<EPUBPath>::size_type index)
|
|
-+{
|
|
-+ if (path.getTitle().empty())
|
|
-+ label << "Section " << (index + 1);
|
|
-+ else
|
|
-+ label << path.getTitle();
|
|
-+}
|
|
-+
|
|
-+}
|
|
-+
|
|
- EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
|
|
- : m_manifest(manifest)
|
|
- , m_paths()
|
|
-@@ -78,7 +92,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
|
|
- anchorAttrs.insert("href", m_paths[i].relativeTo(tocPath).str().c_str());
|
|
- sink.openElement("a", anchorAttrs);
|
|
- std::ostringstream label;
|
|
-- label << "Section " << (i + 1);
|
|
-+ getPathTitle(label, m_paths[i], i);
|
|
- sink.insertCharacters(label.str().c_str());
|
|
- sink.closeElement("a");
|
|
- sink.closeElement("li");
|
|
-@@ -101,7 +115,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
|
|
- sink.openElement("navLabel");
|
|
- sink.openElement("text");
|
|
- std::ostringstream label;
|
|
-- label << "Section " << (i + 1);
|
|
-+ getPathTitle(label, m_paths[i], i);
|
|
- sink.insertCharacters(label.str().c_str());
|
|
- sink.closeElement("text");
|
|
- sink.closeElement("navLabel");
|
|
-@@ -112,6 +126,14 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
|
|
- }
|
|
- }
|
|
-
|
|
-+void EPUBHTMLManager::insertHeadingText(const std::string &text)
|
|
-+{
|
|
-+ if (m_paths.empty())
|
|
-+ return;
|
|
-+
|
|
-+ m_paths.back().appendTitle(text);
|
|
-+}
|
|
-+
|
|
- }
|
|
-
|
|
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
|
|
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
|
|
-index 2ec7bb7..6b480c4 100644
|
|
---- a/src/lib/EPUBHTMLManager.h
|
|
-+++ b/src/lib/EPUBHTMLManager.h
|
|
-@@ -48,6 +48,9 @@ public:
|
|
- void writeSpineTo(EPUBXMLSink &sink);
|
|
- void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version);
|
|
-
|
|
-+ /// Appends text to the title of the current heading.
|
|
-+ void insertHeadingText(const std::string &text);
|
|
-+
|
|
- private:
|
|
- EPUBManifest &m_manifest;
|
|
- std::vector<EPUBPath> m_paths;
|
|
-diff --git a/src/lib/EPUBPath.cpp b/src/lib/EPUBPath.cpp
|
|
-index 9def6f6..e1c05ed 100644
|
|
---- a/src/lib/EPUBPath.cpp
|
|
-+++ b/src/lib/EPUBPath.cpp
|
|
-@@ -53,6 +53,7 @@ EPUBPath::Relative::Relative(const std::vector<std::string> &components)
|
|
-
|
|
- EPUBPath::EPUBPath(const std::string &path)
|
|
- : m_components()
|
|
-+ , m_title()
|
|
- {
|
|
- const std::string trimmed(algorithm::trim_left_copy_if(path, algorithm::is_any_of("/")));
|
|
- algorithm::split(m_components, trimmed, algorithm::is_any_of("/"), algorithm::token_compress_on);
|
|
-@@ -110,6 +111,16 @@ const EPUBPath::Relative EPUBPath::relativeTo(const EPUBPath &base) const
|
|
- return Relative(components);
|
|
- }
|
|
-
|
|
-+void EPUBPath::appendTitle(const std::string &title)
|
|
-+{
|
|
-+ m_title += title;
|
|
-+}
|
|
-+
|
|
-+std::string EPUBPath::getTitle() const
|
|
-+{
|
|
-+ return m_title;
|
|
-+}
|
|
-+
|
|
- bool operator==(const EPUBPath &left, const EPUBPath &right)
|
|
- {
|
|
- return left.m_components == right.m_components;
|
|
-diff --git a/src/lib/EPUBPath.h b/src/lib/EPUBPath.h
|
|
-index 18bf058..12b8f25 100644
|
|
---- a/src/lib/EPUBPath.h
|
|
-+++ b/src/lib/EPUBPath.h
|
|
-@@ -48,8 +48,12 @@ public:
|
|
-
|
|
- const Relative relativeTo(const EPUBPath &base) const;
|
|
-
|
|
-+ void appendTitle(const std::string &title);
|
|
-+ std::string getTitle() const;
|
|
-+
|
|
- private:
|
|
- std::vector<std::string> m_components;
|
|
-+ std::string m_title;
|
|
- };
|
|
-
|
|
- bool operator==(const EPUBPath &left, const EPUBPath &right);
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index aba8827..b1e33f8 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -67,6 +67,7 @@ public:
|
|
- bool m_inPageSpan;
|
|
- bool m_inHeader;
|
|
- bool m_inFooter;
|
|
-+ bool m_inHeading;
|
|
-
|
|
- RVNGPropertyList m_pageSpanProps;
|
|
- shared_ptr<EPUBTextElements> m_currentHeader;
|
|
-@@ -88,6 +89,7 @@ EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod
|
|
- , m_inPageSpan(false)
|
|
- , m_inHeader(false)
|
|
- , m_inFooter(false)
|
|
-+ , m_inHeading(false)
|
|
- , m_pageSpanProps()
|
|
- , m_currentHeader()
|
|
- , m_currentFooter()
|
|
-@@ -260,6 +262,7 @@ void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propLi
|
|
- const RVNGProperty *const outlineLevel = propList["text:outline-level"];
|
|
- if (outlineLevel && m_impl->getSplitGuard().splitOnHeading(outlineLevel->getInt()))
|
|
- m_impl->startNewHtmlFile();
|
|
-+ m_impl->m_inHeading = outlineLevel != nullptr;
|
|
-
|
|
- m_impl->getSplitGuard().openLevel();
|
|
-
|
|
-@@ -366,6 +369,9 @@ void EPUBTextGenerator::insertText(const librevenge::RVNGString &text)
|
|
- if (m_impl->m_inHeader || m_impl->m_inFooter)
|
|
- m_impl->m_currentHeaderOrFooter->addInsertText(text);
|
|
-
|
|
-+ if (m_impl->m_inHeading)
|
|
-+ m_impl->getHtmlManager().insertHeadingText(text.cstr());
|
|
-+
|
|
- m_impl->getSplitGuard().incrementSize(text.len());
|
|
-
|
|
- m_impl->getHtml()->insertText(text);
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 8a3cc9733f567864ad0658cf1a25c60d5e7205a6 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Thu, 17 Aug 2017 12:01:44 +0200
|
|
-Subject: [PATCH] EPUB_SPLIT_METHOD_HEADING: fix unexpected text in chapter
|
|
- names
|
|
-
|
|
-We used to add text for all headings for the chapter name, but if we
|
|
-split on heading 1, then text of heading2+ should not be included.
|
|
----
|
|
- src/lib/EPUBSplitGuard.cpp | 14 ++++++++++++++
|
|
- src/lib/EPUBSplitGuard.h | 3 +++
|
|
- src/lib/EPUBTextGenerator.cpp | 6 ++----
|
|
- 3 files changed, 19 insertions(+), 4 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
|
|
-index 15ba20f..25eae87 100644
|
|
---- a/src/lib/EPUBSplitGuard.cpp
|
|
-+++ b/src/lib/EPUBSplitGuard.cpp
|
|
-@@ -18,6 +18,7 @@ static const unsigned DEFAULT_SPLIT_SIZE = 1 << 16;
|
|
- EPUBSplitGuard::EPUBSplitGuard(const EPUBSplitMethod method)
|
|
- : m_method(method)
|
|
- , m_headingLevel(DEFAULT_SPLIT_HEADING_LEVEL)
|
|
-+ , m_currentHeadingLevel(0)
|
|
- , m_size(DEFAULT_SPLIT_SIZE)
|
|
- , m_currentSize(0)
|
|
- , m_nestingLevel(0)
|
|
-@@ -29,6 +30,11 @@ void EPUBSplitGuard::setSplitHeadingLevel(const unsigned level)
|
|
- m_headingLevel = level;
|
|
- }
|
|
-
|
|
-+void EPUBSplitGuard::setCurrentHeadingLevel(const unsigned level)
|
|
-+{
|
|
-+ m_currentHeadingLevel = level;
|
|
-+}
|
|
-+
|
|
- void EPUBSplitGuard::setSplitSize(const unsigned size)
|
|
- {
|
|
- m_size = size;
|
|
-@@ -59,6 +65,14 @@ bool EPUBSplitGuard::splitOnHeading(const unsigned level) const
|
|
- return canSplit(EPUB_SPLIT_METHOD_HEADING) && (m_headingLevel >= level);
|
|
- }
|
|
-
|
|
-+bool EPUBSplitGuard::inHeading() const
|
|
-+{
|
|
-+ if (!m_currentHeadingLevel)
|
|
-+ return false;
|
|
-+
|
|
-+ return m_headingLevel >= m_currentHeadingLevel;
|
|
-+}
|
|
-+
|
|
- bool EPUBSplitGuard::splitOnSize() const
|
|
- {
|
|
- return canSplit(EPUB_SPLIT_METHOD_SIZE) && (m_size <= m_currentSize);
|
|
-diff --git a/src/lib/EPUBSplitGuard.h b/src/lib/EPUBSplitGuard.h
|
|
-index 17613ac..7bc53ce 100644
|
|
---- a/src/lib/EPUBSplitGuard.h
|
|
-+++ b/src/lib/EPUBSplitGuard.h
|
|
-@@ -21,6 +21,7 @@ public:
|
|
- explicit EPUBSplitGuard(EPUBSplitMethod method);
|
|
-
|
|
- void setSplitHeadingLevel(unsigned level);
|
|
-+ void setCurrentHeadingLevel(unsigned level);
|
|
- void setSplitSize(unsigned size);
|
|
-
|
|
- void openLevel();
|
|
-@@ -29,6 +30,7 @@ public:
|
|
-
|
|
- bool splitOnPageBreak() const;
|
|
- bool splitOnHeading(unsigned level) const;
|
|
-+ bool inHeading() const;
|
|
- bool splitOnSize() const;
|
|
-
|
|
- void onSplit();
|
|
-@@ -39,6 +41,7 @@ private:
|
|
- private:
|
|
- const EPUBSplitMethod m_method;
|
|
- unsigned m_headingLevel;
|
|
-+ unsigned m_currentHeadingLevel;
|
|
- unsigned m_size;
|
|
- unsigned m_currentSize;
|
|
- unsigned m_nestingLevel;
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index b1e33f8..5206b37 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -67,7 +67,6 @@ public:
|
|
- bool m_inPageSpan;
|
|
- bool m_inHeader;
|
|
- bool m_inFooter;
|
|
-- bool m_inHeading;
|
|
-
|
|
- RVNGPropertyList m_pageSpanProps;
|
|
- shared_ptr<EPUBTextElements> m_currentHeader;
|
|
-@@ -89,7 +88,6 @@ EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod
|
|
- , m_inPageSpan(false)
|
|
- , m_inHeader(false)
|
|
- , m_inFooter(false)
|
|
-- , m_inHeading(false)
|
|
- , m_pageSpanProps()
|
|
- , m_currentHeader()
|
|
- , m_currentFooter()
|
|
-@@ -262,7 +260,7 @@ void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propLi
|
|
- const RVNGProperty *const outlineLevel = propList["text:outline-level"];
|
|
- if (outlineLevel && m_impl->getSplitGuard().splitOnHeading(outlineLevel->getInt()))
|
|
- m_impl->startNewHtmlFile();
|
|
-- m_impl->m_inHeading = outlineLevel != nullptr;
|
|
-+ m_impl->getSplitGuard().setCurrentHeadingLevel(outlineLevel ? outlineLevel->getInt() : 0);
|
|
-
|
|
- m_impl->getSplitGuard().openLevel();
|
|
-
|
|
-@@ -369,7 +367,7 @@ void EPUBTextGenerator::insertText(const librevenge::RVNGString &text)
|
|
- if (m_impl->m_inHeader || m_impl->m_inFooter)
|
|
- m_impl->m_currentHeaderOrFooter->addInsertText(text);
|
|
-
|
|
-- if (m_impl->m_inHeading)
|
|
-+ if (m_impl->getSplitGuard().inHeading())
|
|
- m_impl->getHtmlManager().insertHeadingText(text.cstr());
|
|
-
|
|
- m_impl->getSplitGuard().incrementSize(text.len());
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From a4e85e191813e7c8f4e6b5bcf2458504f9d06aeb Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 22 Aug 2017 12:05:28 +0200
|
|
-Subject: [PATCH] EPUB_SPLIT_METHOD_HEADING: fix unexpected first chapter name
|
|
-
|
|
-If the structure of the document is like this:
|
|
-
|
|
- Heading 2
|
|
-Heading 1
|
|
- Heading 2
|
|
-Heading 1
|
|
- Heading 2
|
|
-
|
|
-Then this resulted in 3 chapters: Section 1, Heading 1 and Heading 1.
|
|
-The first one is unexpected; so in case we don't have a heading 1
|
|
-paragraph for the first section, then fall back to any other heading.
|
|
----
|
|
- src/lib/EPUBHTMLManager.cpp | 8 ++++++++
|
|
- src/lib/EPUBHTMLManager.h | 3 +++
|
|
- src/lib/EPUBSplitGuard.cpp | 5 ++++-
|
|
- src/lib/EPUBSplitGuard.h | 2 +-
|
|
- src/lib/EPUBTextGenerator.cpp | 2 +-
|
|
- 5 files changed, 17 insertions(+), 3 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
|
|
-index 5141f31..7753160 100644
|
|
---- a/src/lib/EPUBHTMLManager.cpp
|
|
-+++ b/src/lib/EPUBHTMLManager.cpp
|
|
-@@ -134,6 +134,14 @@ void EPUBHTMLManager::insertHeadingText(const std::string &text)
|
|
- m_paths.back().appendTitle(text);
|
|
- }
|
|
-
|
|
-+bool EPUBHTMLManager::hasHeadingText() const
|
|
-+{
|
|
-+ if (m_paths.empty())
|
|
-+ return false;
|
|
-+
|
|
-+ return !m_paths.back().getTitle().empty();
|
|
-+}
|
|
-+
|
|
- }
|
|
-
|
|
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
|
|
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
|
|
-index 6b480c4..158b466 100644
|
|
---- a/src/lib/EPUBHTMLManager.h
|
|
-+++ b/src/lib/EPUBHTMLManager.h
|
|
-@@ -51,6 +51,9 @@ public:
|
|
- /// Appends text to the title of the current heading.
|
|
- void insertHeadingText(const std::string &text);
|
|
-
|
|
-+ /// If the current heading has a title.
|
|
-+ bool hasHeadingText() const;
|
|
-+
|
|
- private:
|
|
- EPUBManifest &m_manifest;
|
|
- std::vector<EPUBPath> m_paths;
|
|
-diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp
|
|
-index 25eae87..890500b 100644
|
|
---- a/src/lib/EPUBSplitGuard.cpp
|
|
-+++ b/src/lib/EPUBSplitGuard.cpp
|
|
-@@ -65,11 +65,14 @@ bool EPUBSplitGuard::splitOnHeading(const unsigned level) const
|
|
- return canSplit(EPUB_SPLIT_METHOD_HEADING) && (m_headingLevel >= level);
|
|
- }
|
|
-
|
|
--bool EPUBSplitGuard::inHeading() const
|
|
-+bool EPUBSplitGuard::inHeading(bool any) const
|
|
- {
|
|
- if (!m_currentHeadingLevel)
|
|
- return false;
|
|
-
|
|
-+ if (any)
|
|
-+ return true;
|
|
-+
|
|
- return m_headingLevel >= m_currentHeadingLevel;
|
|
- }
|
|
-
|
|
-diff --git a/src/lib/EPUBSplitGuard.h b/src/lib/EPUBSplitGuard.h
|
|
-index 7bc53ce..1a74079 100644
|
|
---- a/src/lib/EPUBSplitGuard.h
|
|
-+++ b/src/lib/EPUBSplitGuard.h
|
|
-@@ -30,7 +30,7 @@ public:
|
|
-
|
|
- bool splitOnPageBreak() const;
|
|
- bool splitOnHeading(unsigned level) const;
|
|
-- bool inHeading() const;
|
|
-+ bool inHeading(bool any) const;
|
|
- bool splitOnSize() const;
|
|
-
|
|
- void onSplit();
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index 5206b37..a39f266 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -367,7 +367,7 @@ void EPUBTextGenerator::insertText(const librevenge::RVNGString &text)
|
|
- if (m_impl->m_inHeader || m_impl->m_inFooter)
|
|
- m_impl->m_currentHeaderOrFooter->addInsertText(text);
|
|
-
|
|
-- if (m_impl->getSplitGuard().inHeading())
|
|
-+ if (m_impl->getSplitGuard().inHeading(!m_impl->getHtmlManager().hasHeadingText()))
|
|
- m_impl->getHtmlManager().insertHeadingText(text.cstr());
|
|
-
|
|
- m_impl->getSplitGuard().incrementSize(text.len());
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 1376b91046ad50f3a443b6fd4887252c1922870c Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 22 Aug 2017 16:23:55 +0200
|
|
-Subject: [PATCH] EPUBHTMLGenerator: fix validation problem with non-page
|
|
- anchored images
|
|
-
|
|
-In most cases (except for at-page anchored images) there is a paragraph
|
|
-already opened, and writing <p> inside <span> results in a validation
|
|
-error.
|
|
-
|
|
-So just write <p> in case we're not in paragraph already.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 35 +++++++++++++++++++++++++++++------
|
|
- 1 file changed, 29 insertions(+), 6 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index 40c507e..019404f 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -360,6 +360,7 @@ struct EPUBHTMLGeneratorImpl
|
|
- , m_stylesheetPath(stylesheetPath)
|
|
- , m_actualPage(0)
|
|
- , m_ignore(false)
|
|
-+ , m_frameAnchorTypes()
|
|
- , m_actualSink()
|
|
- , m_sinkStack()
|
|
- {
|
|
-@@ -446,6 +447,8 @@ struct EPUBHTMLGeneratorImpl
|
|
- int m_actualPage;
|
|
- bool m_ignore;
|
|
-
|
|
-+ std::stack<std::string> m_frameAnchorTypes;
|
|
-+
|
|
- protected:
|
|
- std::unique_ptr<TextZoneSink> m_actualSink;
|
|
- std::stack<std::unique_ptr<TextZoneSink>> m_sinkStack;
|
|
-@@ -846,8 +849,32 @@ void EPUBHTMLGenerator::closeTable()
|
|
- m_impl->m_tableManager.closeTable();
|
|
- }
|
|
-
|
|
--void EPUBHTMLGenerator::openFrame(const RVNGPropertyList & /* propList */) {}
|
|
--void EPUBHTMLGenerator::closeFrame() {}
|
|
-+void EPUBHTMLGenerator::openFrame(const RVNGPropertyList &propList)
|
|
-+{
|
|
-+ librevenge::RVNGPropertyList::Iter i(propList);
|
|
-+ std::string anchorType;
|
|
-+ for (i.rewind(); i.next();)
|
|
-+ {
|
|
-+ if (std::string("text:anchor-type") == i.key())
|
|
-+ anchorType = i()->getStr().cstr();
|
|
-+ }
|
|
-+
|
|
-+ if (anchorType == "page")
|
|
-+ // Other anchor types are already inside a paragraph.
|
|
-+ m_impl->output().openElement("p", RVNGPropertyList());
|
|
-+ m_impl->m_frameAnchorTypes.push(anchorType);
|
|
-+}
|
|
-+
|
|
-+void EPUBHTMLGenerator::closeFrame()
|
|
-+{
|
|
-+ if (m_impl->m_frameAnchorTypes.empty())
|
|
-+ return;
|
|
-+
|
|
-+ if (m_impl->m_frameAnchorTypes.top() == "page")
|
|
-+ m_impl->output().closeElement("p");
|
|
-+
|
|
-+ m_impl->m_frameAnchorTypes.pop();
|
|
-+}
|
|
-
|
|
- void EPUBHTMLGenerator::openGroup(const librevenge::RVNGPropertyList & /* propList */) {}
|
|
- void EPUBHTMLGenerator::closeGroup() {}
|
|
-@@ -862,8 +889,6 @@ void EPUBHTMLGenerator::drawConnector(const librevenge::RVNGPropertyList & /* pr
|
|
-
|
|
- void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
|
|
- {
|
|
-- m_impl->output().openElement("p", RVNGPropertyList());
|
|
--
|
|
- const EPUBPath &path = m_impl->m_imageManager.insert(
|
|
- RVNGBinaryData(propList["office:binary-data"]->getStr()),
|
|
- propList["librevenge:mime-type"]->getStr());
|
|
-@@ -873,8 +898,6 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList)
|
|
- // FIXME: use alternative repr. if available
|
|
- attrs.insert("alt", path.str().c_str());
|
|
- m_impl->output().insertEmptyElement("img", attrs);
|
|
--
|
|
-- m_impl->output().closeElement("p");
|
|
- }
|
|
-
|
|
- void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {}
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 89ae3e392890b9360d271f1c1796cb27e36be26f Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Thu, 24 Aug 2017 17:11:17 +0200
|
|
-Subject: [PATCH] EPUBTextGenerator: empty mime type is the same as no mime
|
|
- type
|
|
-
|
|
-epubcheck says:
|
|
-
|
|
- ERROR(RSC-005): image.epub/OEBPS/content.opf(11,69): Error while parsing file: value of attribute "media-type" is invalid; must be a string matching the regular expression "[a-zA-Z0-9!#$&+\-\^_]+/[a-zA-Z0-9!#$&+\-\^_]+.*"
|
|
----
|
|
- src/lib/EPUBTextGenerator.cpp | 2 +-
|
|
- src/test/EPUBTextGeneratorTest.cpp | 24 ++++++++++++++++++++++++
|
|
- 2 files changed, 25 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index a39f266..0f7f1e0 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -614,7 +614,7 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
|
|
- newPropList.insert(iter.key(), iter()->clone());
|
|
- }
|
|
-
|
|
-- if (!mimetype || !data)
|
|
-+ if (!mimetype || mimetype->getStr().empty() || !data)
|
|
- {
|
|
- EPUBGEN_DEBUG_MSG(("invalid binary object dropped"));
|
|
- return;
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 28e5e30c20aba54dff6505df4c03d6a3da0ee0f3 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Thu, 24 Aug 2017 17:41:49 +0200
|
|
-Subject: [PATCH] EPUBHTMLGenerator: sanitize URLs a bit in openLink()
|
|
-
|
|
-epubcheck warns on this:
|
|
-
|
|
- WARNING(RSC-023): large.epub/OEBPS/sections/section0018.xhtml(2,5171): The URL 'https:///www.fsf.org' is missing 1 slash(es) '/' after the protocol 'https:'
|
|
----
|
|
- configure.ac | 1 +
|
|
- src/lib/EPUBHTMLGenerator.cpp | 12 +++++++++++-
|
|
- src/test/EPUBTextGeneratorTest.cpp | 40 ++++++++++++++++++++++++++++++++++++++
|
|
- 3 files changed, 52 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index 019404f..aa09332 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -12,6 +12,8 @@
|
|
- #include <stack>
|
|
- #include <string>
|
|
-
|
|
-+#include <boost/algorithm/string/replace.hpp>
|
|
-+
|
|
- #include "EPUBHTMLGenerator.h"
|
|
- #include "EPUBImageManager.h"
|
|
- #include "EPUBListStyleManager.h"
|
|
-@@ -625,7 +627,15 @@ void EPUBHTMLGenerator::openLink(const RVNGPropertyList &propList)
|
|
- }
|
|
- RVNGPropertyList attrs;
|
|
- if (propList["xlink:href"])
|
|
-- attrs.insert("href", propList["xlink:href"]->getStr().cstr());
|
|
-+ {
|
|
-+ std::string href(propList["xlink:href"]->getStr().cstr());
|
|
-+
|
|
-+ // Basic URL sanitization.
|
|
-+ boost::replace_all(href, "http:///", "http://");
|
|
-+ boost::replace_all(href, "https:///", "https://");
|
|
-+
|
|
-+ attrs.insert("href", href.c_str());
|
|
-+ }
|
|
- m_impl->output(false).openElement("a", attrs);
|
|
- }
|
|
-
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 143a470f190aaf2f420d2f84b5f08e9b01b40473 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 25 Aug 2017 17:44:38 +0200
|
|
-Subject: [PATCH] Export generator
|
|
-
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 28 ++++++++++++++++++++++++++++
|
|
- src/test/EPUBTextGeneratorTest.cpp | 17 +++++++++++++++++
|
|
- 2 files changed, 45 insertions(+)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 4ce2964..1661064 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -7,6 +7,10 @@
|
|
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
- */
|
|
-
|
|
-+#ifdef HAVE_CONFIG_H
|
|
-+#include "config.h"
|
|
-+#endif
|
|
-+
|
|
- #include <ctime>
|
|
- #include <sstream>
|
|
-
|
|
-@@ -298,6 +302,30 @@ void EPUBGenerator::writeRoot()
|
|
- sink.openElement("meta", metaAttrs);
|
|
- sink.insertCharacters(date);
|
|
- sink.closeElement("meta");
|
|
-+
|
|
-+#ifdef VERSION
|
|
-+ const std::string version(VERSION);
|
|
-+#else
|
|
-+ const std::string version("unknown");
|
|
-+#endif
|
|
-+ std::string generator;
|
|
-+ if (m_metadata["meta:generator"])
|
|
-+ generator = m_metadata["meta:generator"]->getStr().cstr();
|
|
-+
|
|
-+ if (generator.empty())
|
|
-+ generator = "libepubgen/" + version;
|
|
-+ else
|
|
-+ {
|
|
-+ generator += " (";
|
|
-+ generator += "libepubgen/" + version;
|
|
-+ generator += ")";
|
|
-+ }
|
|
-+
|
|
-+ metaAttrs.clear();
|
|
-+ metaAttrs.insert("name", "generator");
|
|
-+ metaAttrs.insert("content", generator.c_str());
|
|
-+ sink.openElement("meta", metaAttrs);
|
|
-+ sink.closeElement("meta");
|
|
- }
|
|
-
|
|
- sink.closeElement("metadata");
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 7e3b5186616326534b1ae95c6d2d188c5e522c7f Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Mon, 4 Sep 2017 17:18:49 +0200
|
|
-Subject: [PATCH] EPUBGenerator: always write author and title
|
|
-
|
|
-Some EPUB3 readers categorize books by author and then title, so if
|
|
-these are empty, then it's next to impossible to reach the export result
|
|
-there.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 11 ++++++++---
|
|
- src/test/EPUBTextGeneratorTest.cpp | 11 +++++++++++
|
|
- 2 files changed, 19 insertions(+), 3 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 1661064..3340643 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -260,15 +260,20 @@ void EPUBGenerator::writeRoot()
|
|
- sink.insertCharacters(identifierCharactrs.c_str());
|
|
- sink.closeElement("dc:identifier");
|
|
-
|
|
-- // Zero-width space as it must be at least one character in length after
|
|
-- // white space has been trimmed.
|
|
-- RVNGString title("\u200b");
|
|
-+ RVNGString title("Unknown Title");
|
|
- if (m_metadata["dc:title"] && !m_metadata["dc:title"]->getStr().empty())
|
|
- title = m_metadata["dc:title"]->getStr();
|
|
- sink.openElement("dc:title");
|
|
- sink.insertCharacters(title);
|
|
- sink.closeElement("dc:title");
|
|
-
|
|
-+ RVNGString creator("Unknown Author");
|
|
-+ if (m_metadata["meta:initial-creator"] && !m_metadata["meta:initial-creator"]->getStr().empty())
|
|
-+ creator = m_metadata["meta:initial-creator"]->getStr();
|
|
-+ sink.openElement("dc:creator");
|
|
-+ sink.insertCharacters(creator);
|
|
-+ sink.closeElement("dc:creator");
|
|
-+
|
|
- RVNGString language("en");
|
|
- if (m_metadata["dc:language"] && !m_metadata["dc:language"]->getStr().empty())
|
|
- language = m_metadata["dc:language"]->getStr();
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From bce7c05a18a4c5089d5ac77bc61b9f6978e7224b Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 8 Sep 2017 11:21:32 +0200
|
|
-Subject: [PATCH] EPUBHTMLGenerator: write un-escaped NBSP
|
|
-
|
|
-Package implementations are supposed to take care of escaping, like it
|
|
-was already a requirement for normal text.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 3 ++-
|
|
- src/test/EPUBTextGeneratorTest.cpp | 18 ++++++++++++++++++
|
|
- 2 files changed, 20 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index aa09332..ed968bf 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -681,7 +681,8 @@ void EPUBHTMLGenerator::insertSpace()
|
|
- {
|
|
- if (m_impl->m_ignore)
|
|
- return;
|
|
-- m_impl->output().insertCharacters(" ");
|
|
-+ // NBSP.
|
|
-+ m_impl->output().insertCharacters("\xc2\xa0");
|
|
- }
|
|
-
|
|
- void EPUBHTMLGenerator::openOrderedListLevel(const RVNGPropertyList &propList)
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 7cf3c6541a61f9d74cd51fb2a01344df783cb26d Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 8 Sep 2017 16:25:36 +0200
|
|
-Subject: [PATCH] EPUBTextGenerator: ignore invalid media types
|
|
-
|
|
-This assumes there is no image type that is valid in EPUB2, but not in
|
|
-EPUB3.
|
|
----
|
|
- src/lib/EPUBTextGenerator.cpp | 26 +++++++++++++++++++++++++-
|
|
- src/test/EPUBTextGeneratorTest.cpp | 23 +++++++++++++++++++++++
|
|
- 2 files changed, 48 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index 0f7f1e0..1bd1e16 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -595,6 +595,27 @@ void EPUBTextGenerator::closeFrame()
|
|
- m_impl->getHtml()->closeFrame();
|
|
- }
|
|
-
|
|
-+/// Checks if the media type is an EPUB 3 Core Media Type or not.
|
|
-+static bool isValidMimeType(const RVNGString& mediaType)
|
|
-+{
|
|
-+ // Defined at <https://idpf.github.io/epub-cmt/v3/#sec-cmt-supported>.
|
|
-+ static char const *(types[])=
|
|
-+ {
|
|
-+ "image/gif",
|
|
-+ "image/png",
|
|
-+ "image/jpeg",
|
|
-+ "image/svg+xml"
|
|
-+ };
|
|
-+
|
|
-+ for (const auto& i : types)
|
|
-+ {
|
|
-+ if (mediaType == i)
|
|
-+ return true;
|
|
-+ }
|
|
-+
|
|
-+ return false;
|
|
-+}
|
|
-+
|
|
- void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &propList)
|
|
- {
|
|
- if (m_impl->getSplitGuard().splitOnSize())
|
|
-@@ -607,7 +628,10 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p
|
|
- for (RVNGPropertyList::Iter iter(propList); !iter.last(); iter.next())
|
|
- {
|
|
- if (RVNGString("librevenge:mime-type") == iter.key())
|
|
-- mimetype.reset(iter()->clone());
|
|
-+ {
|
|
-+ if (isValidMimeType(iter()->getStr()))
|
|
-+ mimetype.reset(iter()->clone());
|
|
-+ }
|
|
- else if (RVNGString("office:binary-data") == iter.key())
|
|
- data.reset(iter()->clone());
|
|
- else
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 7be89d1881e175182039ca93a1546d79933cab85 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Mon, 11 Sep 2017 11:03:03 +0200
|
|
-Subject: [PATCH] EPUBSpanStyleManager: ignore line though type/style 'none'
|
|
-
|
|
-In CSS this is a boolean property, but in ODF it's an enum, so map none
|
|
-to false and everything else to true.
|
|
----
|
|
- src/lib/EPUBSpanStyleManager.cpp | 11 +++++++-
|
|
- src/lib/EPUBTextGenerator.cpp | 4 +--
|
|
- src/test/EPUBTextGeneratorTest.cpp | 58 ++++++++++++++++++++++++++++++++++++--
|
|
- 3 files changed, 68 insertions(+), 5 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBSpanStyleManager.cpp b/src/lib/EPUBSpanStyleManager.cpp
|
|
-index 4887858..211946c 100644
|
|
---- a/src/lib/EPUBSpanStyleManager.cpp
|
|
-+++ b/src/lib/EPUBSpanStyleManager.cpp
|
|
-@@ -137,8 +137,17 @@ void EPUBSpanStyleManager::extractDecorations(RVNGPropertyList const &pList, EPU
|
|
- // replaceme by text-decoration-line when its implementation will appear in browser
|
|
- std::stringstream s;
|
|
-
|
|
-- if (pList["style:text-line-through-style"] || pList["style:text-line-through-type"])
|
|
-+ // line-though style or type 'none' is not line-though, everything else is.
|
|
-+ const librevenge::RVNGProperty *textLineThoughStyle = pList["style:text-line-through-style"];
|
|
-+ bool lineThough = textLineThoughStyle && textLineThoughStyle->getStr() != "none";
|
|
-+ if (!lineThough)
|
|
-+ {
|
|
-+ const librevenge::RVNGProperty *textLineThoughType = pList["style:text-line-through-type"];
|
|
-+ lineThough = textLineThoughType && textLineThoughType->getStr() != "none";
|
|
-+ }
|
|
-+ if (lineThough)
|
|
- s << " line-through";
|
|
-+
|
|
- if (pList["style:text-overline-style"] || pList["style:text-overline-type"])
|
|
- s << " overline";
|
|
- if (pList["style:text-underline-style"] || pList["style:text-underline-type"])
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index 1bd1e16..07aa50d 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -596,7 +596,7 @@ void EPUBTextGenerator::closeFrame()
|
|
- }
|
|
-
|
|
- /// Checks if the media type is an EPUB 3 Core Media Type or not.
|
|
--static bool isValidMimeType(const RVNGString& mediaType)
|
|
-+static bool isValidMimeType(const RVNGString &mediaType)
|
|
- {
|
|
- // Defined at <https://idpf.github.io/epub-cmt/v3/#sec-cmt-supported>.
|
|
- static char const *(types[])=
|
|
-@@ -607,7 +607,7 @@ static bool isValidMimeType(const RVNGString& mediaType)
|
|
- "image/svg+xml"
|
|
- };
|
|
-
|
|
-- for (const auto& i : types)
|
|
-+ for (const auto &i : types)
|
|
- {
|
|
- if (mediaType == i)
|
|
- return true;
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From d8ee84ff50a6113f49105a70f946b23acfa2566f Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Mon, 18 Sep 2017 17:49:13 +0200
|
|
-Subject: [PATCH] [ABI CHANGE] optionally support not writing formatting to CSS
|
|
- files
|
|
-
|
|
-This should help a number of poor readers, which don't support the old
|
|
-method. Examples:
|
|
-
|
|
-- Sigil
|
|
-- Readium
|
|
-- Moon+ reader
|
|
-- Calibre
|
|
-- MS Edge
|
|
----
|
|
- inc/libepubgen/EPUBTextGenerator.h | 1 +
|
|
- inc/libepubgen/libepubgen-decls.h | 8 ++++++++
|
|
- src/lib/EPUBGenerator.cpp | 8 +++++++-
|
|
- src/lib/EPUBGenerator.h | 3 +++
|
|
- src/lib/EPUBHTMLGenerator.cpp | 29 ++++++++++++++++++++++++-----
|
|
- src/lib/EPUBHTMLGenerator.h | 2 +-
|
|
- src/lib/EPUBHTMLManager.cpp | 4 ++--
|
|
- src/lib/EPUBHTMLManager.h | 2 +-
|
|
- src/lib/EPUBParagraphStyleManager.cpp | 11 +++++++++++
|
|
- src/lib/EPUBParagraphStyleManager.h | 2 ++
|
|
- src/lib/EPUBSpanStyleManager.cpp | 11 +++++++++++
|
|
- src/lib/EPUBSpanStyleManager.h | 2 ++
|
|
- src/lib/EPUBTextGenerator.cpp | 5 +++++
|
|
- src/test/EPUBTextGeneratorTest.cpp | 26 ++++++++++++++++++++++++++
|
|
- 14 files changed, 104 insertions(+), 10 deletions(-)
|
|
-
|
|
-diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h
|
|
-index 664f673..cb2d9a6 100644
|
|
---- a/inc/libepubgen/EPUBTextGenerator.h
|
|
-+++ b/inc/libepubgen/EPUBTextGenerator.h
|
|
-@@ -42,6 +42,7 @@ public:
|
|
-
|
|
- void setSplitHeadingLevel(unsigned level);
|
|
- void setSplitSize(unsigned size);
|
|
-+ void setStylesMethod(EPUBStylesMethod styles);
|
|
-
|
|
- /** Register a handler for embedded images.
|
|
- *
|
|
-diff --git a/inc/libepubgen/libepubgen-decls.h b/inc/libepubgen/libepubgen-decls.h
|
|
-index 3fb0220..2657a2d 100644
|
|
---- a/inc/libepubgen/libepubgen-decls.h
|
|
-+++ b/inc/libepubgen/libepubgen-decls.h
|
|
-@@ -61,6 +61,14 @@ typedef bool (*EPUBEmbeddedImage)(const librevenge::RVNGBinaryData &input, libre
|
|
- */
|
|
- typedef bool (*EPUBEmbeddedObject)(const librevenge::RVNGBinaryData &data, const EPUBEmbeddingContact &contact);
|
|
-
|
|
-+/** The possible ways to represent styles in CSS/HTML files.
|
|
-+ */
|
|
-+enum EPUBStylesMethod
|
|
-+{
|
|
-+ EPUB_STYLES_METHOD_CSS, //< The styles will be described in a seprarate CSS file.
|
|
-+ EPUB_STYLES_METHOD_INLINE, //< The styles will be described inline.
|
|
-+};
|
|
-+
|
|
- }
|
|
-
|
|
- #endif // INCLUDED_LIBEPUBGEN_LIBEPUBGEN_DECLS_H
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 3340643..75c3076 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -45,6 +45,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
|
|
- , m_currentHtml()
|
|
- , m_splitGuard(split)
|
|
- , m_version(version)
|
|
-+ , m_stylesMethod(EPUB_STYLES_METHOD_CSS)
|
|
- {
|
|
- }
|
|
-
|
|
-@@ -96,7 +97,7 @@ void EPUBGenerator::startNewHtmlFile()
|
|
-
|
|
- m_splitGuard.onSplit();
|
|
-
|
|
-- m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath);
|
|
-+ m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod);
|
|
-
|
|
- // restore state in the new file
|
|
- m_currentHtml->startDocument(m_documentProps);
|
|
-@@ -130,6 +131,11 @@ int EPUBGenerator::getVersion() const
|
|
- return m_version;
|
|
- }
|
|
-
|
|
-+void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles)
|
|
-+{
|
|
-+ m_stylesMethod = styles;
|
|
-+}
|
|
-+
|
|
- void EPUBGenerator::writeContainer()
|
|
- {
|
|
- EPUBXMLSink sink;
|
|
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
|
|
-index f98c80f..099eb4a 100644
|
|
---- a/src/lib/EPUBGenerator.h
|
|
-+++ b/src/lib/EPUBGenerator.h
|
|
-@@ -51,6 +51,8 @@ public:
|
|
- EPUBSplitGuard &getSplitGuard();
|
|
- int getVersion() const;
|
|
-
|
|
-+ void setStylesMethod(EPUBStylesMethod stylesMethod);
|
|
-+
|
|
- private:
|
|
- virtual void startHtmlFile() = 0;
|
|
- virtual void endHtmlFile() = 0;
|
|
-@@ -80,6 +82,7 @@ private:
|
|
- EPUBSplitGuard m_splitGuard;
|
|
-
|
|
- int m_version;
|
|
-+ EPUBStylesMethod m_stylesMethod;
|
|
- };
|
|
-
|
|
- }
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index ed968bf..f3b30a6 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -351,7 +351,7 @@ std::string EPUBHTMLTextZone::label(int id) const
|
|
- struct EPUBHTMLGeneratorImpl
|
|
- {
|
|
- //! constructor
|
|
-- EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath)
|
|
-+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
|
|
- : m_document(document)
|
|
- , m_imageManager(imageManager)
|
|
- , m_listManager(listStyleManager)
|
|
-@@ -363,6 +363,7 @@ struct EPUBHTMLGeneratorImpl
|
|
- , m_actualPage(0)
|
|
- , m_ignore(false)
|
|
- , m_frameAnchorTypes()
|
|
-+ , m_stylesMethod(stylesMethod)
|
|
- , m_actualSink()
|
|
- , m_sinkStack()
|
|
- {
|
|
-@@ -451,6 +452,8 @@ struct EPUBHTMLGeneratorImpl
|
|
-
|
|
- std::stack<std::string> m_frameAnchorTypes;
|
|
-
|
|
-+ EPUBStylesMethod m_stylesMethod;
|
|
-+
|
|
- protected:
|
|
- std::unique_ptr<TextZoneSink> m_actualSink;
|
|
- std::stack<std::unique_ptr<TextZoneSink>> m_sinkStack;
|
|
-@@ -461,8 +464,8 @@ private:
|
|
- EPUBHTMLGeneratorImpl operator=(EPUBHTMLGeneratorImpl const &orig);
|
|
- };
|
|
-
|
|
--EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath)
|
|
-- : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath))
|
|
-+EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
|
|
-+ : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod))
|
|
- {
|
|
- }
|
|
-
|
|
-@@ -582,7 +585,15 @@ void EPUBHTMLGenerator::openParagraph(const RVNGPropertyList &propList)
|
|
- return;
|
|
-
|
|
- RVNGPropertyList attrs;
|
|
-- attrs.insert("class", m_impl->m_paragraphManager.getClass(propList).c_str());
|
|
-+ switch (m_impl->m_stylesMethod)
|
|
-+ {
|
|
-+ case EPUB_STYLES_METHOD_CSS:
|
|
-+ attrs.insert("class", m_impl->m_paragraphManager.getClass(propList).c_str());
|
|
-+ break;
|
|
-+ case EPUB_STYLES_METHOD_INLINE:
|
|
-+ attrs.insert("style", m_impl->m_paragraphManager.getStyle(propList).c_str());
|
|
-+ break;
|
|
-+ }
|
|
- m_impl->output(false).openElement("p", attrs);
|
|
- }
|
|
-
|
|
-@@ -605,7 +616,15 @@ void EPUBHTMLGenerator::openSpan(const RVNGPropertyList &propList)
|
|
- return;
|
|
-
|
|
- RVNGPropertyList attrs;
|
|
-- attrs.insert("class", m_impl->m_spanManager.getClass(propList).c_str());
|
|
-+ switch (m_impl->m_stylesMethod)
|
|
-+ {
|
|
-+ case EPUB_STYLES_METHOD_CSS:
|
|
-+ attrs.insert("class", m_impl->m_spanManager.getClass(propList).c_str());
|
|
-+ break;
|
|
-+ case EPUB_STYLES_METHOD_INLINE:
|
|
-+ attrs.insert("style", m_impl->m_spanManager.getStyle(propList).c_str());
|
|
-+ break;
|
|
-+ }
|
|
- m_impl->output(false).openElement("span", attrs);
|
|
- }
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h
|
|
-index 88059ec..d8783ed 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.h
|
|
-+++ b/src/lib/EPUBHTMLGenerator.h
|
|
-@@ -30,7 +30,7 @@ class EPUBPath;
|
|
- class EPUBHTMLGenerator : public librevenge::RVNGTextInterface
|
|
- {
|
|
- public:
|
|
-- EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath);
|
|
-+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod);
|
|
- ~EPUBHTMLGenerator() override;
|
|
-
|
|
- void setDocumentMetaData(const librevenge::RVNGPropertyList &propList) override;
|
|
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
|
|
-index 7753160..2dedb7f 100644
|
|
---- a/src/lib/EPUBHTMLManager.cpp
|
|
-+++ b/src/lib/EPUBHTMLManager.cpp
|
|
-@@ -41,7 +41,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
|
|
- {
|
|
- }
|
|
-
|
|
--const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath)
|
|
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod)
|
|
- {
|
|
- std::ostringstream nameBuf;
|
|
- nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next();
|
|
-@@ -55,7 +55,7 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana
|
|
- m_contents.push_back(EPUBXMLSink());
|
|
-
|
|
- const EPUBHTMLGeneratorPtr_t gen(
|
|
-- new EPUBHTMLGenerator(m_contents.back(), imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath));
|
|
-+ new EPUBHTMLGenerator(m_contents.back(), imageManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod));
|
|
-
|
|
- return gen;
|
|
- }
|
|
-diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
|
|
-index 158b466..f034657 100644
|
|
---- a/src/lib/EPUBHTMLManager.h
|
|
-+++ b/src/lib/EPUBHTMLManager.h
|
|
-@@ -41,7 +41,7 @@ class EPUBHTMLManager
|
|
- public:
|
|
- explicit EPUBHTMLManager(EPUBManifest &manifest);
|
|
-
|
|
-- const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath);
|
|
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod);
|
|
-
|
|
- void writeTo(EPUBPackage &package);
|
|
-
|
|
-diff --git a/src/lib/EPUBParagraphStyleManager.cpp b/src/lib/EPUBParagraphStyleManager.cpp
|
|
-index b03f185..836e678 100644
|
|
---- a/src/lib/EPUBParagraphStyleManager.cpp
|
|
-+++ b/src/lib/EPUBParagraphStyleManager.cpp
|
|
-@@ -41,6 +41,17 @@ std::string EPUBParagraphStyleManager::getClass(RVNGPropertyList const &pList)
|
|
- return s.str();
|
|
- }
|
|
-
|
|
-+std::string EPUBParagraphStyleManager::getStyle(RVNGPropertyList const &pList)
|
|
-+{
|
|
-+ EPUBCSSProperties content;
|
|
-+ extractProperties(pList, false, content);
|
|
-+
|
|
-+ std::stringstream s;
|
|
-+ for (const auto &property : content)
|
|
-+ s << property.first << ": " << property.second << "; ";
|
|
-+ return s.str();
|
|
-+}
|
|
-+
|
|
- void EPUBParagraphStyleManager::defineParagraph(RVNGPropertyList const &propList)
|
|
- {
|
|
- if (!propList["librevenge:paragraph-id"])
|
|
-diff --git a/src/lib/EPUBParagraphStyleManager.h b/src/lib/EPUBParagraphStyleManager.h
|
|
-index 2fdfff4..433f0e9 100644
|
|
---- a/src/lib/EPUBParagraphStyleManager.h
|
|
-+++ b/src/lib/EPUBParagraphStyleManager.h
|
|
-@@ -43,6 +43,8 @@ public:
|
|
- void defineParagraph(librevenge::RVNGPropertyList const &pList);
|
|
- //! returns the class name corresponding to a propertylist
|
|
- std::string getClass(librevenge::RVNGPropertyList const &pList);
|
|
-+ //! returns the style string corresponding to a propertylist
|
|
-+ std::string getStyle(librevenge::RVNGPropertyList const &pList);
|
|
- //! send the data to the sink
|
|
- void send(EPUBCSSSink &out);
|
|
- protected:
|
|
-diff --git a/src/lib/EPUBSpanStyleManager.cpp b/src/lib/EPUBSpanStyleManager.cpp
|
|
-index 211946c..5e53ee2 100644
|
|
---- a/src/lib/EPUBSpanStyleManager.cpp
|
|
-+++ b/src/lib/EPUBSpanStyleManager.cpp
|
|
-@@ -41,6 +41,17 @@ std::string EPUBSpanStyleManager::getClass(RVNGPropertyList const &pList)
|
|
- return s.str();
|
|
- }
|
|
-
|
|
-+std::string EPUBSpanStyleManager::getStyle(RVNGPropertyList const &pList)
|
|
-+{
|
|
-+ EPUBCSSProperties content;
|
|
-+ extractProperties(pList, content);
|
|
-+
|
|
-+ std::stringstream s;
|
|
-+ for (const auto &property : content)
|
|
-+ s << property.first << ": " << property.second << "; ";
|
|
-+ return s.str();
|
|
-+}
|
|
-+
|
|
- void EPUBSpanStyleManager::defineSpan(RVNGPropertyList const &propList)
|
|
- {
|
|
- if (!propList["librevenge:span-id"])
|
|
-diff --git a/src/lib/EPUBSpanStyleManager.h b/src/lib/EPUBSpanStyleManager.h
|
|
-index 263ab3a..ec9d0e5 100644
|
|
---- a/src/lib/EPUBSpanStyleManager.h
|
|
-+++ b/src/lib/EPUBSpanStyleManager.h
|
|
-@@ -43,6 +43,8 @@ public:
|
|
- void defineSpan(librevenge::RVNGPropertyList const &pList);
|
|
- //! returns the class name corresponding to a propertylist
|
|
- std::string getClass(librevenge::RVNGPropertyList const &pList);
|
|
-+ //! returns the style string corresponding to a propertylist
|
|
-+ std::string getStyle(librevenge::RVNGPropertyList const &pList);
|
|
- //! send the data to the sink
|
|
- void send(EPUBCSSSink &out);
|
|
- protected:
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index 07aa50d..26675af 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -142,6 +142,11 @@ void EPUBTextGenerator::setSplitSize(const unsigned size)
|
|
- m_impl->getSplitGuard().setSplitSize(size);
|
|
- }
|
|
-
|
|
-+void EPUBTextGenerator::setStylesMethod(EPUBStylesMethod styles)
|
|
-+{
|
|
-+ m_impl->setStylesMethod(styles);
|
|
-+}
|
|
-+
|
|
- void EPUBTextGenerator::registerEmbeddedImageHandler(const librevenge::RVNGString &mimeType, EPUBEmbeddedImage imageHandler)
|
|
- {
|
|
- if (!mimeType.empty() && imageHandler)
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 4f46bc715a5fc8a0e13bb1596f6f5dbb55ca0632 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 17 Oct 2017 10:22:35 +0200
|
|
-Subject: [PATCH] EPUBSpanStyleManager: ignore underline type/style 'none'
|
|
-
|
|
-This is similar to commit 7be89d1881e175182039ca93a1546d79933cab85
|
|
-(EPUBSpanStyleManager: ignore line though type/style 'none',
|
|
-2017-09-11).
|
|
----
|
|
- src/lib/EPUBSpanStyleManager.cpp | 9 ++++++++-
|
|
- src/test/EPUBTextGeneratorTest.cpp | 22 ++++++++++++++++++++++
|
|
- 2 files changed, 30 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBSpanStyleManager.cpp b/src/lib/EPUBSpanStyleManager.cpp
|
|
-index 5e53ee2..e25fa26 100644
|
|
---- a/src/lib/EPUBSpanStyleManager.cpp
|
|
-+++ b/src/lib/EPUBSpanStyleManager.cpp
|
|
-@@ -161,7 +161,14 @@ void EPUBSpanStyleManager::extractDecorations(RVNGPropertyList const &pList, EPU
|
|
-
|
|
- if (pList["style:text-overline-style"] || pList["style:text-overline-type"])
|
|
- s << " overline";
|
|
-- if (pList["style:text-underline-style"] || pList["style:text-underline-type"])
|
|
-+ const librevenge::RVNGProperty *textUnderlineStyle = pList["style:text-underline-style"];
|
|
-+ bool underline = textUnderlineStyle && textUnderlineStyle->getStr() != "none";
|
|
-+ if (!underline)
|
|
-+ {
|
|
-+ const librevenge::RVNGProperty *textUnderlineType = pList["style:text-underline-type"];
|
|
-+ underline = textUnderlineType && textUnderlineType->getStr() != "none";
|
|
-+ }
|
|
-+ if (underline)
|
|
- s << " underline";
|
|
- if (s.str().length())
|
|
- cssProps["text-decoration"] = s.str();
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 383f315b067e9fc1aa840913c581e7451949c2db Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 17 Oct 2017 12:21:26 +0200
|
|
-Subject: [PATCH] EPUBHTMLGenerator: better handling of empty paragraphs
|
|
-
|
|
-The ODF/librevenge concept is that empty paragraphs still take their
|
|
-vertical space, i.e. inserting lots of them is a (poor) equivalent of a
|
|
-page break.
|
|
-
|
|
-HTML collapses empty paragraphs by default, so empty paragraphs need
|
|
-some content to preserve this effect. Do the same trick what LibreOffice
|
|
-Writer does: if the text has no content, add a <br/> element inside the
|
|
-paragraph.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 8 ++++++++
|
|
- src/test/EPUBTextGeneratorTest.cpp | 15 +++++++++++++++
|
|
- 2 files changed, 23 insertions(+)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index f3b30a6..d822571 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -362,6 +362,7 @@ struct EPUBHTMLGeneratorImpl
|
|
- , m_stylesheetPath(stylesheetPath)
|
|
- , m_actualPage(0)
|
|
- , m_ignore(false)
|
|
-+ , m_hasText(false)
|
|
- , m_frameAnchorTypes()
|
|
- , m_stylesMethod(stylesMethod)
|
|
- , m_actualSink()
|
|
-@@ -449,6 +450,8 @@ struct EPUBHTMLGeneratorImpl
|
|
-
|
|
- int m_actualPage;
|
|
- bool m_ignore;
|
|
-+ /// Does the currently opened paragraph have some text?
|
|
-+ bool m_hasText;
|
|
-
|
|
- std::stack<std::string> m_frameAnchorTypes;
|
|
-
|
|
-@@ -595,6 +598,7 @@ void EPUBHTMLGenerator::openParagraph(const RVNGPropertyList &propList)
|
|
- break;
|
|
- }
|
|
- m_impl->output(false).openElement("p", attrs);
|
|
-+ m_impl->m_hasText = false;
|
|
- }
|
|
-
|
|
- void EPUBHTMLGenerator::closeParagraph()
|
|
-@@ -602,6 +606,9 @@ void EPUBHTMLGenerator::closeParagraph()
|
|
- if (m_impl->m_ignore)
|
|
- return;
|
|
-
|
|
-+ if (!m_impl->m_hasText)
|
|
-+ insertLineBreak();
|
|
-+
|
|
- m_impl->output().closeElement("p");
|
|
- }
|
|
-
|
|
-@@ -694,6 +701,7 @@ void EPUBHTMLGenerator::insertText(const RVNGString &text)
|
|
- if (m_impl->m_ignore)
|
|
- return;
|
|
- m_impl->output().insertCharacters(text);
|
|
-+ m_impl->m_hasText = true;
|
|
- }
|
|
-
|
|
- void EPUBHTMLGenerator::insertSpace()
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 8166fc972e3d4b930ad0baab164f99b3c717252e Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 18 Oct 2017 10:04:32 +0200
|
|
-Subject: [PATCH] EPUBTextGenerator: handle headings inside sections
|
|
-
|
|
-On one hand, we don't want to split inside a section as there might be
|
|
-elements we need to close/open at split boundary, OTOH this is currently
|
|
-not a problem as we don't produce any output for sections.
|
|
-
|
|
-So remove the level management for sections (this way allowing headings
|
|
-to split inside sections), let's get back to this when there is a
|
|
-concept how e.g. multiple columns would be represented in EPUB.
|
|
-
|
|
-Use case is when sections are used to just group paragraph together and
|
|
-mark all of them read-only: in this case it's unexpected that headings
|
|
-are handled differently to not-in-section ones.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 14 ++++++++++++--
|
|
- src/lib/EPUBTextGenerator.cpp | 3 ---
|
|
- src/test/EPUBTextGeneratorTest.cpp | 38 ++++++++++++++++++++++++++++++++++++++
|
|
- 3 files changed, 50 insertions(+), 5 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index d822571..11bf7de 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -574,8 +574,18 @@ void EPUBHTMLGenerator::closeFooter()
|
|
- }
|
|
-
|
|
- void EPUBHTMLGenerator::defineSectionStyle(const RVNGPropertyList &) {}
|
|
--void EPUBHTMLGenerator::openSection(const RVNGPropertyList & /* propList */) {}
|
|
--void EPUBHTMLGenerator::closeSection() {}
|
|
-+
|
|
-+void EPUBHTMLGenerator::openSection(const RVNGPropertyList & /* propList */)
|
|
-+{
|
|
-+ // Once output is produced here, EPUBTextGenerator::openSection() will need
|
|
-+ // to call EPUBSplitGuard::openLevel().
|
|
-+}
|
|
-+
|
|
-+void EPUBHTMLGenerator::closeSection()
|
|
-+{
|
|
-+ // Once output is produced here, EPUBTextGenerator::closeSection() will need
|
|
-+ // to call EPUBSplitGuard::closeLevel().
|
|
-+}
|
|
-
|
|
- void EPUBHTMLGenerator::defineParagraphStyle(const RVNGPropertyList &propList)
|
|
- {
|
|
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
|
|
-index 26675af..5d4e8f2 100644
|
|
---- a/src/lib/EPUBTextGenerator.cpp
|
|
-+++ b/src/lib/EPUBTextGenerator.cpp
|
|
-@@ -335,15 +335,12 @@ void EPUBTextGenerator::openSection(const librevenge::RVNGPropertyList &propList
|
|
- {
|
|
- if (m_impl->getSplitGuard().splitOnSize())
|
|
- m_impl->startNewHtmlFile();
|
|
-- m_impl->getSplitGuard().openLevel();
|
|
-
|
|
- m_impl->getHtml()->openSection(propList);
|
|
- }
|
|
-
|
|
- void EPUBTextGenerator::closeSection()
|
|
- {
|
|
-- m_impl->getSplitGuard().closeLevel();
|
|
--
|
|
- m_impl->getHtml()->closeSection();
|
|
- }
|
|
-
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From c5bb9ad8922c9f537f0d613d42c33487717455c3 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 18 Oct 2017 10:52:01 +0200
|
|
-Subject: [PATCH] EPUBHTMLGenerator: better handling of tabs
|
|
-
|
|
-Mapping ODF/librevenge tab to \t in HTML is not a great idea, as it's
|
|
-ignorable whitespace. Go with NBSPs and a breakable space instead, that
|
|
-is much closer visually (15 is just an arbitrary number, it's what MS
|
|
-Word uses in its HTML export, LO Writer HTML export doesn't handle
|
|
-this).
|
|
-
|
|
-Adapt the empty paragraph case to also use NBSP for consistency.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 10 +++++++---
|
|
- src/test/EPUBTextGeneratorTest.cpp | 18 +++++++++++++++++-
|
|
- 2 files changed, 24 insertions(+), 4 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index 11bf7de..25294c6 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -617,7 +617,7 @@ void EPUBHTMLGenerator::closeParagraph()
|
|
- return;
|
|
-
|
|
- if (!m_impl->m_hasText)
|
|
-- insertLineBreak();
|
|
-+ insertSpace();
|
|
-
|
|
- m_impl->output().closeElement("p");
|
|
- }
|
|
-@@ -687,8 +687,12 @@ void EPUBHTMLGenerator::insertTab()
|
|
- if (m_impl->m_ignore)
|
|
- return;
|
|
-
|
|
-- // Does not have a lot of effect since tabs in html are ignorable white-space
|
|
-- m_impl->output().insertCharacters("\t");
|
|
-+ // \t would not have a lot of effect since tabs in html are ignorable
|
|
-+ // white-space. Write NBSPs and a breakable space instead.
|
|
-+ for (int i = 0; i < 15; ++i)
|
|
-+ m_impl->output().insertCharacters("\xc2\xa0");
|
|
-+ m_impl->output().insertCharacters(" ");
|
|
-+ m_impl->m_hasText = true;
|
|
- }
|
|
-
|
|
- void EPUBHTMLGenerator::insertLineBreak()
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From f3a04df200d818b4aaa9d54910b670cd6cf3149f Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 31 Oct 2017 15:50:50 +0100
|
|
-Subject: [PATCH] EPUBHTMLGenerator: librevenge:type -> xlink:type
|
|
-
|
|
-That's what libetonyek and LO's librevenge producer generates, also
|
|
-matches librevenge documentation. This isn't really a behavior change,
|
|
-just makes the warning go away in the xlink case.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 4 ++--
|
|
- 1 file changed, 2 insertions(+), 2 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index 25294c6..0d39c00 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -657,9 +657,9 @@ void EPUBHTMLGenerator::openLink(const RVNGPropertyList &propList)
|
|
- if (m_impl->m_ignore)
|
|
- return;
|
|
-
|
|
-- if (!propList["librevenge:type"])
|
|
-+ if (!propList["xlink:type"])
|
|
- {
|
|
-- EPUBGEN_DEBUG_MSG(("EPUBHTMLGenerator::openLink: librevenge:type: not filled, suppose link\n"));
|
|
-+ EPUBGEN_DEBUG_MSG(("EPUBHTMLGenerator::openLink: xlink:type: not filled, suppose link\n"));
|
|
- }
|
|
- RVNGPropertyList attrs;
|
|
- if (propList["xlink:href"])
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From c5e32608ecea8410b11760284d49e1f1958c6f75 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 31 Oct 2017 16:50:50 +0100
|
|
-Subject: [PATCH] EPUBTableStyleManager: handle EPUB_STYLES_METHOD_INLINE for
|
|
- rows
|
|
-
|
|
-This was working for paragraphs and spans only previously.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 10 +++++++++-
|
|
- src/lib/EPUBTableStyleManager.cpp | 11 +++++++++++
|
|
- src/lib/EPUBTableStyleManager.h | 2 ++
|
|
- src/test/EPUBTextGeneratorTest.cpp | 28 ++++++++++++++++++++++++++++
|
|
- 4 files changed, 50 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index 0d39c00..42e8e3e 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -858,7 +858,15 @@ void EPUBHTMLGenerator::openTableRow(const RVNGPropertyList &propList)
|
|
- if (m_impl->m_ignore)
|
|
- return;
|
|
- RVNGPropertyList attrs;
|
|
-- attrs.insert("class", m_impl->m_tableManager.getRowClass(propList).c_str());
|
|
-+ switch (m_impl->m_stylesMethod)
|
|
-+ {
|
|
-+ case EPUB_STYLES_METHOD_CSS:
|
|
-+ attrs.insert("class", m_impl->m_tableManager.getRowClass(propList).c_str());
|
|
-+ break;
|
|
-+ case EPUB_STYLES_METHOD_INLINE:
|
|
-+ attrs.insert("style", m_impl->m_tableManager.getRowStyle(propList).c_str());
|
|
-+ break;
|
|
-+ }
|
|
- m_impl->output().openElement("tr", attrs);
|
|
- }
|
|
-
|
|
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
|
|
-index 52b6959..ead9170 100644
|
|
---- a/src/lib/EPUBTableStyleManager.cpp
|
|
-+++ b/src/lib/EPUBTableStyleManager.cpp
|
|
-@@ -111,6 +111,17 @@ std::string EPUBTableStyleManager::getRowClass(RVNGPropertyList const &pList)
|
|
- return s.str();
|
|
- }
|
|
-
|
|
-+std::string EPUBTableStyleManager::getRowStyle(RVNGPropertyList const &pList)
|
|
-+{
|
|
-+ EPUBCSSProperties content;
|
|
-+ extractRowProperties(pList, content);
|
|
-+
|
|
-+ std::stringstream s;
|
|
-+ for (const auto &property : content)
|
|
-+ s << property.first << ": " << property.second << "; ";
|
|
-+ return s.str();
|
|
-+}
|
|
-+
|
|
- void EPUBTableStyleManager::send(EPUBCSSSink &out)
|
|
- {
|
|
- for (ContentNameMap_t::const_iterator it=m_cellContentNameMap.begin(); m_cellContentNameMap.end() != it; ++it)
|
|
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
|
|
-index e6d09bc..20056ad 100644
|
|
---- a/src/lib/EPUBTableStyleManager.h
|
|
-+++ b/src/lib/EPUBTableStyleManager.h
|
|
-@@ -47,6 +47,8 @@ public:
|
|
- std::string getCellClass(librevenge::RVNGPropertyList const &pList);
|
|
- //! returns the class name corresponding to a propertylist
|
|
- std::string getRowClass(librevenge::RVNGPropertyList const &pList);
|
|
-+ //! returns the style string corresponding to a propertylist
|
|
-+ std::string getRowStyle(librevenge::RVNGPropertyList const &pList);
|
|
- //! send the data to the sink
|
|
- void send(EPUBCSSSink &out);
|
|
- private:
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 258dcc4a98405238f4e32f89d122a7ccbb9a1357 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 31 Oct 2017 17:45:22 +0100
|
|
-Subject: [PATCH] EPUBTableStyleManager: handle EPUB_STYLES_METHOD_INLINE for
|
|
- cells
|
|
-
|
|
-So that a typical table has an empty CSS when requested.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 10 +++++++++-
|
|
- src/lib/EPUBTableStyleManager.cpp | 11 +++++++++++
|
|
- src/lib/EPUBTableStyleManager.h | 2 ++
|
|
- src/test/EPUBTextGeneratorTest.cpp | 13 +++++++++----
|
|
- 4 files changed, 31 insertions(+), 5 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index 42e8e3e..86b3ac2 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -882,7 +882,15 @@ void EPUBHTMLGenerator::openTableCell(const RVNGPropertyList &propList)
|
|
- if (m_impl->m_ignore)
|
|
- return;
|
|
- RVNGPropertyList attrs;
|
|
-- attrs.insert("class", m_impl->m_tableManager.getCellClass(propList).c_str());
|
|
-+ switch (m_impl->m_stylesMethod)
|
|
-+ {
|
|
-+ case EPUB_STYLES_METHOD_CSS:
|
|
-+ attrs.insert("class", m_impl->m_tableManager.getCellClass(propList).c_str());
|
|
-+ break;
|
|
-+ case EPUB_STYLES_METHOD_INLINE:
|
|
-+ attrs.insert("style", m_impl->m_tableManager.getCellStyle(propList).c_str());
|
|
-+ break;
|
|
-+ }
|
|
- if (propList["table:number-columns-spanned"])
|
|
- attrs.insert("colspan", propList["table:number-columns-spanned"]->getInt());
|
|
- if (propList["table:number-rows-spanned"])
|
|
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
|
|
-index ead9170..4e24611 100644
|
|
---- a/src/lib/EPUBTableStyleManager.cpp
|
|
-+++ b/src/lib/EPUBTableStyleManager.cpp
|
|
-@@ -98,6 +98,17 @@ std::string EPUBTableStyleManager::getCellClass(RVNGPropertyList const &pList)
|
|
- return s.str();
|
|
- }
|
|
-
|
|
-+std::string EPUBTableStyleManager::getCellStyle(RVNGPropertyList const &pList)
|
|
-+{
|
|
-+ EPUBCSSProperties content;
|
|
-+ extractCellProperties(pList, content);
|
|
-+
|
|
-+ std::stringstream s;
|
|
-+ for (const auto &property : content)
|
|
-+ s << property.first << ": " << property.second << "; ";
|
|
-+ return s.str();
|
|
-+}
|
|
-+
|
|
- std::string EPUBTableStyleManager::getRowClass(RVNGPropertyList const &pList)
|
|
- {
|
|
- EPUBCSSProperties content;
|
|
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
|
|
-index 20056ad..135a144 100644
|
|
---- a/src/lib/EPUBTableStyleManager.h
|
|
-+++ b/src/lib/EPUBTableStyleManager.h
|
|
-@@ -45,6 +45,8 @@ public:
|
|
- void closeTable();
|
|
- //! returns the class name corresponding to a propertylist
|
|
- std::string getCellClass(librevenge::RVNGPropertyList const &pList);
|
|
-+ //! returns the style string corresponding to a propertylist
|
|
-+ std::string getCellStyle(librevenge::RVNGPropertyList const &pList);
|
|
- //! returns the class name corresponding to a propertylist
|
|
- std::string getRowClass(librevenge::RVNGPropertyList const &pList);
|
|
- //! returns the style string corresponding to a propertylist
|
|
---
|
|
-2.12.3
|
|
-
|
|
-From 6c8e86ccebb11df7ece32d10da2894c6698c5515 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Thu, 2 Nov 2017 12:07:02 +0100
|
|
-Subject: [PATCH 1/4] EPUBTableStyleManager: witdh -> width
|
|
-
|
|
----
|
|
- src/lib/EPUBTableStyleManager.cpp | 4 ++--
|
|
- 1 file changed, 2 insertions(+), 2 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
|
|
-index 4e24611..5795524 100644
|
|
---- a/src/lib/EPUBTableStyleManager.cpp
|
|
-+++ b/src/lib/EPUBTableStyleManager.cpp
|
|
-@@ -48,7 +48,7 @@ void EPUBTableStyleManager::closeTable()
|
|
- {
|
|
- if (!m_columWitdhsStack.size())
|
|
- {
|
|
-- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::closeTable: can not find the columns witdh\n"));
|
|
-+ EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::closeTable: can not find the columns width\n"));
|
|
- return;
|
|
- }
|
|
- m_columWitdhsStack.pop_back();
|
|
-@@ -61,7 +61,7 @@ bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w)
|
|
- std::vector<double> const &widths=m_columWitdhsStack.back();
|
|
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
|
|
- {
|
|
-- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns witdh\n"));
|
|
-+ EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
|
|
- return false;
|
|
- }
|
|
- bool fixed = true;
|
|
---
|
|
-2.13.6
|
|
-
|
|
-From 45bf16a8b384010814148538d86ee584b9295c7a Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 3 Nov 2017 12:30:13 +0100
|
|
-Subject: [PATCH 2/4] Witdh -> Width
|
|
-
|
|
----
|
|
- src/lib/EPUBTableStyleManager.cpp | 10 +++++-----
|
|
- src/lib/EPUBTableStyleManager.h | 4 ++--
|
|
- 2 files changed, 7 insertions(+), 7 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
|
|
-index 5795524..6f8b2af 100644
|
|
---- a/src/lib/EPUBTableStyleManager.cpp
|
|
-+++ b/src/lib/EPUBTableStyleManager.cpp
|
|
-@@ -41,24 +41,24 @@ void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
|
|
- }
|
|
- colWidths.push_back(width);
|
|
- }
|
|
-- m_columWitdhsStack.push_back(colWidths);
|
|
-+ m_columWidthsStack.push_back(colWidths);
|
|
- }
|
|
-
|
|
- void EPUBTableStyleManager::closeTable()
|
|
- {
|
|
-- if (!m_columWitdhsStack.size())
|
|
-+ if (!m_columWidthsStack.size())
|
|
- {
|
|
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::closeTable: can not find the columns width\n"));
|
|
- return;
|
|
- }
|
|
-- m_columWitdhsStack.pop_back();
|
|
-+ m_columWidthsStack.pop_back();
|
|
- }
|
|
-
|
|
- bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w) const
|
|
- {
|
|
-- if (!m_columWitdhsStack.size())
|
|
-+ if (!m_columWidthsStack.size())
|
|
- return false;
|
|
-- std::vector<double> const &widths=m_columWitdhsStack.back();
|
|
-+ std::vector<double> const &widths=m_columWidthsStack.back();
|
|
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
|
|
- {
|
|
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
|
|
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
|
|
-index 135a144..5f704a1 100644
|
|
---- a/src/lib/EPUBTableStyleManager.h
|
|
-+++ b/src/lib/EPUBTableStyleManager.h
|
|
-@@ -32,7 +32,7 @@ class EPUBTableStyleManager
|
|
-
|
|
- public:
|
|
- //! constructor
|
|
-- EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columWitdhsStack()
|
|
-+ EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columWidthsStack()
|
|
- {
|
|
- }
|
|
- //! destructor
|
|
-@@ -65,7 +65,7 @@ private:
|
|
- //! a map row content -> name
|
|
- ContentNameMap_t m_rowContentNameMap;
|
|
- //! a stack of column width (in inches )
|
|
-- std::vector<std::vector<double> > m_columWitdhsStack;
|
|
-+ std::vector<std::vector<double> > m_columWidthsStack;
|
|
-
|
|
- EPUBTableStyleManager(EPUBTableStyleManager const &orig);
|
|
- EPUBTableStyleManager operator=(EPUBTableStyleManager const &orig);
|
|
---
|
|
-2.13.6
|
|
-
|
|
-From 85fe982b2ad158f6e050c15e4a59d51d863cc28d Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 3 Nov 2017 15:33:35 +0100
|
|
-Subject: [PATCH 3/4] columWidths -> columnWidths
|
|
-
|
|
----
|
|
- src/lib/EPUBTableStyleManager.cpp | 10 +++++-----
|
|
- src/lib/EPUBTableStyleManager.h | 4 ++--
|
|
- 2 files changed, 7 insertions(+), 7 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
|
|
-index 6f8b2af..b610c20 100644
|
|
---- a/src/lib/EPUBTableStyleManager.cpp
|
|
-+++ b/src/lib/EPUBTableStyleManager.cpp
|
|
-@@ -41,24 +41,24 @@ void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
|
|
- }
|
|
- colWidths.push_back(width);
|
|
- }
|
|
-- m_columWidthsStack.push_back(colWidths);
|
|
-+ m_columnWidthsStack.push_back(colWidths);
|
|
- }
|
|
-
|
|
- void EPUBTableStyleManager::closeTable()
|
|
- {
|
|
-- if (!m_columWidthsStack.size())
|
|
-+ if (!m_columnWidthsStack.size())
|
|
- {
|
|
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::closeTable: can not find the columns width\n"));
|
|
- return;
|
|
- }
|
|
-- m_columWidthsStack.pop_back();
|
|
-+ m_columnWidthsStack.pop_back();
|
|
- }
|
|
-
|
|
- bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w) const
|
|
- {
|
|
-- if (!m_columWidthsStack.size())
|
|
-+ if (!m_columnWidthsStack.size())
|
|
- return false;
|
|
-- std::vector<double> const &widths=m_columWidthsStack.back();
|
|
-+ std::vector<double> const &widths=m_columnWidthsStack.back();
|
|
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
|
|
- {
|
|
- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
|
|
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
|
|
-index 5f704a1..4de70e3 100644
|
|
---- a/src/lib/EPUBTableStyleManager.h
|
|
-+++ b/src/lib/EPUBTableStyleManager.h
|
|
-@@ -32,7 +32,7 @@ class EPUBTableStyleManager
|
|
-
|
|
- public:
|
|
- //! constructor
|
|
-- EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columWidthsStack()
|
|
-+ EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columnWidthsStack()
|
|
- {
|
|
- }
|
|
- //! destructor
|
|
-@@ -65,7 +65,7 @@ private:
|
|
- //! a map row content -> name
|
|
- ContentNameMap_t m_rowContentNameMap;
|
|
- //! a stack of column width (in inches )
|
|
-- std::vector<std::vector<double> > m_columWidthsStack;
|
|
-+ std::vector<std::vector<double> > m_columnWidthsStack;
|
|
-
|
|
- EPUBTableStyleManager(EPUBTableStyleManager const &orig);
|
|
- EPUBTableStyleManager operator=(EPUBTableStyleManager const &orig);
|
|
---
|
|
-2.13.6
|
|
-
|
|
-From 20930e2d8151fd2ec44feb9cdb8ca502df99365f Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Fri, 3 Nov 2017 17:00:12 +0100
|
|
-Subject: [PATCH 4/4] EPUBTableStyleManager: handle style:rel-column-width col
|
|
- prop
|
|
-
|
|
-Previously only fixed width was supported, but relative width works
|
|
-better for reflowable formats and ODF has markup to express this.
|
|
----
|
|
- src/lib/EPUBTableStyleManager.cpp | 42 ++++++++++++++++++++++++++++++++----
|
|
- src/lib/EPUBTableStyleManager.h | 6 +++++-
|
|
- src/test/EPUBTextGeneratorTest.cpp | 44 ++++++++++++++++++++++++++++++++++++++
|
|
- 3 files changed, 87 insertions(+), 5 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
|
|
-index b610c20..92078a2 100644
|
|
---- a/src/lib/EPUBTableStyleManager.cpp
|
|
-+++ b/src/lib/EPUBTableStyleManager.cpp
|
|
-@@ -7,6 +7,7 @@
|
|
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
- */
|
|
-
|
|
-+#include <numeric>
|
|
- #include <sstream>
|
|
-
|
|
- #include <librevenge/librevenge.h>
|
|
-@@ -25,6 +26,7 @@ using librevenge::RVNGString;
|
|
- void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
|
|
- {
|
|
- std::vector<double> colWidths;
|
|
-+ std::vector<double> relColWidths;
|
|
- for (unsigned long i = 0; i < colList.count(); i++)
|
|
- {
|
|
- RVNGPropertyList const &prop=colList[i];
|
|
-@@ -40,8 +42,15 @@ void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
|
|
- width=prop["style:column-width"]->getDouble()/1440.;
|
|
- }
|
|
- colWidths.push_back(width);
|
|
-+
|
|
-+ if (prop["style:rel-column-width"])
|
|
-+ {
|
|
-+ width = prop["style:rel-column-width"]->getDouble();
|
|
-+ relColWidths.push_back(width);
|
|
-+ }
|
|
- }
|
|
- m_columnWidthsStack.push_back(colWidths);
|
|
-+ m_relColumnWidthsStack.push_back(relColWidths);
|
|
- }
|
|
-
|
|
- void EPUBTableStyleManager::closeTable()
|
|
-@@ -54,14 +63,18 @@ void EPUBTableStyleManager::closeTable()
|
|
- m_columnWidthsStack.pop_back();
|
|
- }
|
|
-
|
|
--bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w) const
|
|
-+namespace
|
|
- {
|
|
-- if (!m_columnWidthsStack.size())
|
|
-+bool extractColumnsWidth(const std::vector< std::vector<double> > &columnWidthsStack, int col, int numSpanned, bool relative, double &w)
|
|
-+{
|
|
-+ if (!columnWidthsStack.size())
|
|
- return false;
|
|
-- std::vector<double> const &widths=m_columnWidthsStack.back();
|
|
-+ std::vector<double> const &widths=columnWidthsStack.back();
|
|
-+ double total = std::accumulate(widths.begin(), widths.end(), static_cast<double>(0));
|
|
- if (col < 0 || size_t(col+numSpanned-1) >= widths.size())
|
|
- {
|
|
-- EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
|
|
-+ if (!relative)
|
|
-+ EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n"));
|
|
- return false;
|
|
- }
|
|
- bool fixed = true;
|
|
-@@ -82,8 +95,22 @@ bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w)
|
|
- }
|
|
- }
|
|
- if (!fixed) w = -w;
|
|
-+ if (relative)
|
|
-+ // Expected unit is percents.
|
|
-+ w = w * 100 / total;
|
|
- return true;
|
|
- }
|
|
-+}
|
|
-+
|
|
-+bool EPUBTableStyleManager::getColumnsWidth(int col, int numSpanned, double &w) const
|
|
-+{
|
|
-+ return extractColumnsWidth(m_columnWidthsStack, col, numSpanned, false, w);
|
|
-+}
|
|
-+
|
|
-+bool EPUBTableStyleManager::getRelColumnsWidth(int col, int numSpanned, double &w) const
|
|
-+{
|
|
-+ return extractColumnsWidth(m_relColumnWidthsStack, col, numSpanned, true, w);
|
|
-+}
|
|
-
|
|
- std::string EPUBTableStyleManager::getCellClass(RVNGPropertyList const &pList)
|
|
- {
|
|
-@@ -176,6 +203,13 @@ void EPUBTableStyleManager::extractCellProperties(RVNGPropertyList const &pList,
|
|
- width << -w << "in";
|
|
- cssProps["min-width"] = width.str();
|
|
- }
|
|
-+
|
|
-+ if (getRelColumnsWidth(c, span, w))
|
|
-+ {
|
|
-+ std::ostringstream width;
|
|
-+ width << w << "%";
|
|
-+ cssProps["width"] = width.str();
|
|
-+ }
|
|
- }
|
|
- if (pList["fo:text-align"])
|
|
- {
|
|
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
|
|
-index 4de70e3..24ae1a5 100644
|
|
---- a/src/lib/EPUBTableStyleManager.h
|
|
-+++ b/src/lib/EPUBTableStyleManager.h
|
|
-@@ -32,7 +32,7 @@ class EPUBTableStyleManager
|
|
-
|
|
- public:
|
|
- //! constructor
|
|
-- EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columnWidthsStack()
|
|
-+ EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columnWidthsStack(), m_relColumnWidthsStack()
|
|
- {
|
|
- }
|
|
- //! destructor
|
|
-@@ -60,12 +60,16 @@ private:
|
|
- void extractRowProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
|
|
- //! try to return the col width
|
|
- bool getColumnsWidth(int i, int numSpanned, double &w) const;
|
|
-+ //! try to return the relative col width
|
|
-+ bool getRelColumnsWidth(int i, int numSpanned, double &w) const;
|
|
- //! a map cell content -> name
|
|
- ContentNameMap_t m_cellContentNameMap;
|
|
- //! a map row content -> name
|
|
- ContentNameMap_t m_rowContentNameMap;
|
|
- //! a stack of column width (in inches )
|
|
- std::vector<std::vector<double> > m_columnWidthsStack;
|
|
-+ //! a stack of relative column width (in percents )
|
|
-+ std::vector<std::vector<double> > m_relColumnWidthsStack;
|
|
-
|
|
- EPUBTableStyleManager(EPUBTableStyleManager const &orig);
|
|
- EPUBTableStyleManager operator=(EPUBTableStyleManager const &orig);
|
|
---
|
|
-2.13.6
|
|
-
|
|
-From d5bd8c9078eeb63769ff1807be1a9571430eaed1 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Mon, 6 Nov 2017 10:19:32 +0100
|
|
-Subject: [PATCH] EPUBTableStyleManager: handle table props
|
|
-
|
|
-Other than column properties. Only width and relative width for now.
|
|
----
|
|
- src/lib/EPUBHTMLGenerator.cpp | 16 +++++--
|
|
- src/lib/EPUBTableStyleManager.cpp | 87 ++++++++++++++++++++++++++++----------
|
|
- src/lib/EPUBTableStyleManager.h | 12 +++++-
|
|
- src/test/EPUBTextGeneratorTest.cpp | 27 ++++++++++++
|
|
- 4 files changed, 114 insertions(+), 28 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
|
|
-index 86b3ac2..e00bea8 100644
|
|
---- a/src/lib/EPUBHTMLGenerator.cpp
|
|
-+++ b/src/lib/EPUBHTMLGenerator.cpp
|
|
-@@ -846,10 +846,18 @@ void EPUBHTMLGenerator::openTable(const RVNGPropertyList &propList)
|
|
- if (m_impl->m_ignore)
|
|
- return;
|
|
-
|
|
-- const librevenge::RVNGPropertyListVector *columns = propList.child("librevenge:table-columns");
|
|
-- if (columns)
|
|
-- m_impl->m_tableManager.openTable(*columns);
|
|
-- m_impl->output().openElement("table", RVNGPropertyList());
|
|
-+ m_impl->m_tableManager.openTable(propList);
|
|
-+ RVNGPropertyList attrs;
|
|
-+ switch (m_impl->m_stylesMethod)
|
|
-+ {
|
|
-+ case EPUB_STYLES_METHOD_CSS:
|
|
-+ attrs.insert("class", m_impl->m_tableManager.getTableClass(propList).c_str());
|
|
-+ break;
|
|
-+ case EPUB_STYLES_METHOD_INLINE:
|
|
-+ attrs.insert("style", m_impl->m_tableManager.getTableStyle(propList).c_str());
|
|
-+ break;
|
|
-+ }
|
|
-+ m_impl->output().openElement("table", attrs);
|
|
- m_impl->output().openElement("tbody", RVNGPropertyList());
|
|
- }
|
|
-
|
|
-diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp
|
|
-index 92078a2..d5e650c 100644
|
|
---- a/src/lib/EPUBTableStyleManager.cpp
|
|
-+++ b/src/lib/EPUBTableStyleManager.cpp
|
|
-@@ -23,34 +23,38 @@ using librevenge::RVNGPropertyList;
|
|
- using librevenge::RVNGPropertyListVector;
|
|
- using librevenge::RVNGString;
|
|
-
|
|
--void EPUBTableStyleManager::openTable(RVNGPropertyListVector const &colList)
|
|
-+void EPUBTableStyleManager::openTable(RVNGPropertyList const &propList)
|
|
- {
|
|
-- std::vector<double> colWidths;
|
|
-- std::vector<double> relColWidths;
|
|
-- for (unsigned long i = 0; i < colList.count(); i++)
|
|
-+ const librevenge::RVNGPropertyListVector *columns = propList.child("librevenge:table-columns");
|
|
-+ if (columns)
|
|
- {
|
|
-- RVNGPropertyList const &prop=colList[i];
|
|
-- double width=0;
|
|
-- if (prop["style:column-width"])
|
|
-+ std::vector<double> colWidths;
|
|
-+ std::vector<double> relColWidths;
|
|
-+ for (unsigned long i = 0; i < columns->count(); i++)
|
|
- {
|
|
-- librevenge::RVNGUnit unit=prop["style:column-width"]->getUnit();
|
|
-- if (unit==librevenge::RVNG_POINT)
|
|
-- width=prop["style:column-width"]->getDouble()/72.;
|
|
-- else if (unit==librevenge::RVNG_INCH)
|
|
-- width=prop["style:column-width"]->getDouble();
|
|
-- else if (unit==librevenge::RVNG_TWIP)
|
|
-- width=prop["style:column-width"]->getDouble()/1440.;
|
|
-- }
|
|
-- colWidths.push_back(width);
|
|
-+ RVNGPropertyList const &prop=(*columns)[i];
|
|
-+ double width=0;
|
|
-+ if (prop["style:column-width"])
|
|
-+ {
|
|
-+ librevenge::RVNGUnit unit=prop["style:column-width"]->getUnit();
|
|
-+ if (unit==librevenge::RVNG_POINT)
|
|
-+ width=prop["style:column-width"]->getDouble()/72.;
|
|
-+ else if (unit==librevenge::RVNG_INCH)
|
|
-+ width=prop["style:column-width"]->getDouble();
|
|
-+ else if (unit==librevenge::RVNG_TWIP)
|
|
-+ width=prop["style:column-width"]->getDouble()/1440.;
|
|
-+ }
|
|
-+ colWidths.push_back(width);
|
|
-
|
|
-- if (prop["style:rel-column-width"])
|
|
-- {
|
|
-- width = prop["style:rel-column-width"]->getDouble();
|
|
-- relColWidths.push_back(width);
|
|
-+ if (prop["style:rel-column-width"])
|
|
-+ {
|
|
-+ width = prop["style:rel-column-width"]->getDouble();
|
|
-+ relColWidths.push_back(width);
|
|
-+ }
|
|
- }
|
|
-+ m_columnWidthsStack.push_back(colWidths);
|
|
-+ m_relColumnWidthsStack.push_back(relColWidths);
|
|
- }
|
|
-- m_columnWidthsStack.push_back(colWidths);
|
|
-- m_relColumnWidthsStack.push_back(relColWidths);
|
|
- }
|
|
-
|
|
- void EPUBTableStyleManager::closeTable()
|
|
-@@ -160,6 +164,30 @@ std::string EPUBTableStyleManager::getRowStyle(RVNGPropertyList const &pList)
|
|
- return s.str();
|
|
- }
|
|
-
|
|
-+std::string EPUBTableStyleManager::getTableClass(RVNGPropertyList const &pList)
|
|
-+{
|
|
-+ EPUBCSSProperties content;
|
|
-+ extractTableProperties(pList, content);
|
|
-+ ContentNameMap_t::const_iterator it=m_tableContentNameMap.find(content);
|
|
-+ if (it != m_tableContentNameMap.end())
|
|
-+ return it->second;
|
|
-+ std::stringstream s;
|
|
-+ s << "table" << m_tableContentNameMap.size();
|
|
-+ m_tableContentNameMap[content]=s.str();
|
|
-+ return s.str();
|
|
-+}
|
|
-+
|
|
-+std::string EPUBTableStyleManager::getTableStyle(RVNGPropertyList const &pList)
|
|
-+{
|
|
-+ EPUBCSSProperties content;
|
|
-+ extractTableProperties(pList, content);
|
|
-+
|
|
-+ std::stringstream s;
|
|
-+ for (const auto &property : content)
|
|
-+ s << property.first << ": " << property.second << "; ";
|
|
-+ return s.str();
|
|
-+}
|
|
-+
|
|
- void EPUBTableStyleManager::send(EPUBCSSSink &out)
|
|
- {
|
|
- for (ContentNameMap_t::const_iterator it=m_cellContentNameMap.begin(); m_cellContentNameMap.end() != it; ++it)
|
|
-@@ -175,6 +203,13 @@ void EPUBTableStyleManager::send(EPUBCSSSink &out)
|
|
- fillPropertyList(it->first, props);
|
|
- out.insertRule(("." + it->second).c_str(), props);
|
|
- }
|
|
-+
|
|
-+ for (ContentNameMap_t::const_iterator it=m_tableContentNameMap.begin(); m_tableContentNameMap.end() != it; ++it)
|
|
-+ {
|
|
-+ RVNGPropertyList props;
|
|
-+ fillPropertyList(it->first, props);
|
|
-+ out.insertRule(("." + it->second).c_str(), props);
|
|
-+ }
|
|
- }
|
|
-
|
|
- void EPUBTableStyleManager::extractCellProperties(RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const
|
|
-@@ -244,6 +279,14 @@ void EPUBTableStyleManager::extractRowProperties(RVNGPropertyList const &pList,
|
|
- cssProps["height"] = pList["style:row-height"]->getStr().cstr();
|
|
- }
|
|
-
|
|
-+void EPUBTableStyleManager::extractTableProperties(RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const
|
|
-+{
|
|
-+ if (pList["style:rel-width"])
|
|
-+ cssProps["width"] = pList["style:rel-width"]->getStr().cstr();
|
|
-+ else if (pList["style:width"])
|
|
-+ cssProps["width"] = pList["style:width"]->getStr().cstr();
|
|
-+}
|
|
-+
|
|
- }
|
|
-
|
|
- /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
|
|
-diff --git a/src/lib/EPUBTableStyleManager.h b/src/lib/EPUBTableStyleManager.h
|
|
-index 24ae1a5..ab1f9e6 100644
|
|
---- a/src/lib/EPUBTableStyleManager.h
|
|
-+++ b/src/lib/EPUBTableStyleManager.h
|
|
-@@ -32,7 +32,7 @@ class EPUBTableStyleManager
|
|
-
|
|
- public:
|
|
- //! constructor
|
|
-- EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_columnWidthsStack(), m_relColumnWidthsStack()
|
|
-+ EPUBTableStyleManager() : m_cellContentNameMap(), m_rowContentNameMap(), m_tableContentNameMap(), m_columnWidthsStack(), m_relColumnWidthsStack()
|
|
- {
|
|
- }
|
|
- //! destructor
|
|
-@@ -40,7 +40,7 @@ public:
|
|
- {
|
|
- }
|
|
- //! open a table
|
|
-- void openTable(librevenge::RVNGPropertyListVector const &colList);
|
|
-+ void openTable(librevenge::RVNGPropertyList const &propList);
|
|
- //! close a table
|
|
- void closeTable();
|
|
- //! returns the class name corresponding to a propertylist
|
|
-@@ -51,6 +51,10 @@ public:
|
|
- std::string getRowClass(librevenge::RVNGPropertyList const &pList);
|
|
- //! returns the style string corresponding to a propertylist
|
|
- std::string getRowStyle(librevenge::RVNGPropertyList const &pList);
|
|
-+ //! returns the class name corresponding to a propertylist
|
|
-+ std::string getTableClass(librevenge::RVNGPropertyList const &pList);
|
|
-+ //! returns the style string corresponding to a propertylist
|
|
-+ std::string getTableStyle(librevenge::RVNGPropertyList const &pList);
|
|
- //! send the data to the sink
|
|
- void send(EPUBCSSSink &out);
|
|
- private:
|
|
-@@ -58,6 +62,8 @@ private:
|
|
- void extractCellProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
|
|
- //! convert a property list into a CSS property map
|
|
- void extractRowProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
|
|
-+ //! convert a property list into a CSS property map
|
|
-+ void extractTableProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const;
|
|
- //! try to return the col width
|
|
- bool getColumnsWidth(int i, int numSpanned, double &w) const;
|
|
- //! try to return the relative col width
|
|
-@@ -66,6 +72,8 @@ private:
|
|
- ContentNameMap_t m_cellContentNameMap;
|
|
- //! a map row content -> name
|
|
- ContentNameMap_t m_rowContentNameMap;
|
|
-+ //! a map table content -> name
|
|
-+ ContentNameMap_t m_tableContentNameMap;
|
|
- //! a stack of column width (in inches )
|
|
- std::vector<std::vector<double> > m_columnWidthsStack;
|
|
- //! a stack of relative column width (in percents )
|
|
---
|
|
-2.13.6
|
|
-
|
|
diff --git a/external/libepubgen/libepubgen-validation1.patch.1 b/external/libepubgen/libepubgen-validation1.patch.1
|
|
deleted file mode 100644
|
|
index 18707e76205d..000000000000
|
|
--- a/external/libepubgen/libepubgen-validation1.patch.1
|
|
+++ /dev/null
|
|
@@ -1,49 +0,0 @@
|
|
-From 96e9786f5aba1078251f36e58feefc8d953cdea0 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 8 Aug 2017 16:54:24 +0200
|
|
-Subject: [PATCH 1/3] EPUBGenerator: fix validation error with empty
|
|
- dc:identifier element
|
|
-
|
|
-<http://www.idpf.org/epub/31/spec/epub-packages.html#sec-opf-dcidentifier>
|
|
-"3.4.3.2.1 The identifier Element" says that the character content is
|
|
-not optional, so write it.
|
|
----
|
|
- configure.ac | 3 +++
|
|
- src/lib/EPUBGenerator.cpp | 14 +++++++++++++-
|
|
- 2 files changed, 16 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 0d0f866..507eb14 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -7,6 +7,10 @@
|
|
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
- */
|
|
-
|
|
-+#include <boost/uuid/uuid.hpp>
|
|
-+#include <boost/uuid/uuid_generators.hpp>
|
|
-+#include <boost/uuid/uuid_io.hpp>
|
|
-+
|
|
- #include "EPUBCSSSink.h"
|
|
- #include "EPUBHTMLGenerator.h"
|
|
- #include "EPUBGenerator.h"
|
|
-@@ -193,7 +197,15 @@ void EPUBGenerator::writeRoot()
|
|
-
|
|
- RVNGPropertyList identifierAttrs;
|
|
- identifierAttrs.insert("id", uniqueId);
|
|
-- sink.insertEmptyElement("dc:identifier", identifierAttrs);
|
|
-+ identifierAttrs.insert("opf:scheme", "UUID");
|
|
-+ sink.openElement("dc:identifier", identifierAttrs);
|
|
-+ // The identifier element is required to have a unique character content.
|
|
-+ std::stringstream identifierStream("urn:uuid:");
|
|
-+ boost::uuids::uuid uuid = boost::uuids::random_generator()();
|
|
-+ identifierStream << uuid;
|
|
-+ std::string identifierCharactrs = identifierStream.str();
|
|
-+ sink.insertCharacters(identifierCharactrs.c_str());
|
|
-+ sink.closeElement("dc:identifier");
|
|
-
|
|
- sink.openElement("dc:title");
|
|
- sink.closeElement("dc:title");
|
|
---
|
|
-2.12.3
|
|
-
|
|
diff --git a/external/libepubgen/libepubgen-validation2.patch.1 b/external/libepubgen/libepubgen-validation2.patch.1
|
|
deleted file mode 100644
|
|
index a1807f33841b..000000000000
|
|
--- a/external/libepubgen/libepubgen-validation2.patch.1
|
|
+++ /dev/null
|
|
@@ -1,34 +0,0 @@
|
|
-From 2e51fb9163bbc6b9a27fa524382c5aad9700dd0d Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 8 Aug 2017 17:23:38 +0200
|
|
-Subject: [PATCH 2/3] EPUBGenerator: don't write empty guide element
|
|
-
|
|
-<http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.6> "2.6:
|
|
-Guide" requires:
|
|
-
|
|
- Within the package there may be one guide element, containing one or
|
|
- more reference elements.
|
|
-
|
|
-Given that we never wrote reference child-elements, just don't write the
|
|
-guide element at all, especially seeing that it's deprecated in OPF3.
|
|
----
|
|
- src/lib/EPUBGenerator.cpp | 3 ---
|
|
- 1 file changed, 3 deletions(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 507eb14..9dbccac 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -225,9 +225,6 @@ void EPUBGenerator::writeRoot()
|
|
- m_htmlManager.writeSpineTo(sink);
|
|
- sink.closeElement("spine");
|
|
-
|
|
-- sink.openElement("guide");
|
|
-- sink.closeElement("guide");
|
|
--
|
|
- sink.closeElement("package");
|
|
-
|
|
- sink.writeTo(*m_package, "OEBPS/content.opf");
|
|
---
|
|
-2.12.3
|
|
-
|
|
diff --git a/external/libepubgen/libepubgen-validation3.patch.1 b/external/libepubgen/libepubgen-validation3.patch.1
|
|
deleted file mode 100644
|
|
index b543e5a96e38..000000000000
|
|
--- a/external/libepubgen/libepubgen-validation3.patch.1
|
|
+++ /dev/null
|
|
@@ -1,35 +0,0 @@
|
|
-From 9041ef42f9e0a5c4bc3b0a912d36683c4e10ca84 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Tue, 8 Aug 2017 17:39:18 +0200
|
|
-Subject: [PATCH 3/3] EPUBHTMLManager: fix value of <navPoint playOrder"...">
|
|
-
|
|
-<http://www.niso.org/workrooms/daisy/Z39-86-2005.html#NCXplay> "8.4.3
|
|
-playOrder Attribute" says:
|
|
-
|
|
- playOrder is a positive integer; the first playOrder value in a document
|
|
- shall be 1.
|
|
-
|
|
-So instead of writing an empty attribute, write the same number that's
|
|
-already used for <navPoint id="...">.
|
|
----
|
|
- src/lib/EPUBHTMLManager.cpp | 4 +++-
|
|
- 1 file changed, 3 insertions(+), 1 deletion(-)
|
|
-
|
|
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
|
|
-index e5add82..03dbf21 100644
|
|
---- a/src/lib/EPUBHTMLManager.cpp
|
|
-+++ b/src/lib/EPUBHTMLManager.cpp
|
|
-@@ -75,7 +75,9 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath)
|
|
- id << "section" << (i + 1);
|
|
- navPointAttrs.insert("id", id.str().c_str());
|
|
- navPointAttrs.insert("class", "document");
|
|
-- navPointAttrs.insert("playOrder", "");
|
|
-+ std::ostringstream playOrder;
|
|
-+ playOrder << (i + 1);
|
|
-+ navPointAttrs.insert("playOrder", playOrder.str().c_str());
|
|
- sink.openElement("navPoint", navPointAttrs);
|
|
- sink.openElement("navLabel");
|
|
- sink.openElement("text");
|
|
---
|
|
-2.12.3
|
|
-
|
|
diff --git a/external/libepubgen/libepubgen-vc.patch.1 b/external/libepubgen/libepubgen-vc.patch.1
|
|
deleted file mode 100644
|
|
index 4c929ed47a86..000000000000
|
|
--- a/external/libepubgen/libepubgen-vc.patch.1
|
|
+++ /dev/null
|
|
@@ -1,59 +0,0 @@
|
|
-From 49f6461d4751d3b16e32ab8f9c93a3856b33be49 Mon Sep 17 00:00:00 2001
|
|
-From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
-Date: Wed, 2 Aug 2017 14:53:36 +0200
|
|
-Subject: [PATCH] m4: MSVC defines __cplusplus as 199711L still
|
|
-
|
|
-See e.g.
|
|
-<https://stackoverflow.com/questions/37503029/cplusplus-is-equal-to-199711-in-msvc-does-it-support-c11>,
|
|
-on MSVC we can't depend on the value of __cplusplus, since that one is a
|
|
-too low value, even if everything else works fine.
|
|
----
|
|
- m4/ax_cxx_compile_stdcxx.m4 | 2 +-
|
|
- 1 file changed, 1 insertion(+), 1 deletion(-)
|
|
-
|
|
-diff -Naur a/configure b/configure
|
|
---- a/configure 2017-08-02 14:50:09.000000000 +0200
|
|
-+++ b/configure 2017-08-02 14:50:57.000000000 +0200
|
|
-@@ -16001,7 +16001,7 @@
|
|
-
|
|
- #error "This is not a C++ compiler"
|
|
-
|
|
--#elif __cplusplus < 201103L
|
|
-+#elif __cplusplus < 201103L && !(defined _MSC_VER)
|
|
-
|
|
- #error "This is not a C++11 compiler"
|
|
-
|
|
-@@ -16314,7 +16314,7 @@
|
|
-
|
|
- #error "This is not a C++ compiler"
|
|
-
|
|
--#elif __cplusplus < 201103L
|
|
-+#elif __cplusplus < 201103L && !(defined _MSC_VER)
|
|
-
|
|
- #error "This is not a C++11 compiler"
|
|
-
|
|
-@@ -16636,7 +16636,7 @@
|
|
-
|
|
- #error "This is not a C++ compiler"
|
|
-
|
|
--#elif __cplusplus < 201103L
|
|
-+#elif __cplusplus < 201103L && !(defined _MSC_VER)
|
|
-
|
|
- #error "This is not a C++11 compiler"
|
|
-
|
|
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
|
|
-index 9dbccac..3357cf2 100644
|
|
---- a/src/lib/EPUBGenerator.cpp
|
|
-+++ b/src/lib/EPUBGenerator.cpp
|
|
-@@ -7,6 +7,8 @@
|
|
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
- */
|
|
-
|
|
-+#include <sstream>
|
|
-+
|
|
- #include <boost/uuid/uuid.hpp>
|
|
- #include <boost/uuid/uuid_generators.hpp>
|
|
- #include <boost/uuid/uuid_io.hpp>
|
|
---
|
|
-2.12.3
|
|
-
|
|
diff --git a/writerperfect/Module_writerperfect.mk b/writerperfect/Module_writerperfect.mk
|
|
index 01f8a0dc5e59..6fa274bc8ce5 100644
|
|
--- a/writerperfect/Module_writerperfect.mk
|
|
+++ b/writerperfect/Module_writerperfect.mk
|
|
@@ -40,7 +40,7 @@ $(eval $(call gb_Module_add_check_targets,writerperfect,\
|
|
$(eval $(call gb_Module_add_slowcheck_targets,writerperfect,\
|
|
CppunitTest_writerperfect_calc \
|
|
CppunitTest_writerperfect_draw \
|
|
- $(if $(SYSTEM_EPUBGEN),,CppunitTest_writerperfect_epubexport) \
|
|
+ CppunitTest_writerperfect_epubexport \
|
|
CppunitTest_writerperfect_import \
|
|
CppunitTest_writerperfect_impress \
|
|
CppunitTest_writerperfect_writer \
|
|
diff --git a/writerperfect/source/writer/EPUBExportFilter.cxx b/writerperfect/source/writer/EPUBExportFilter.cxx
|
|
index 1b0eea21725c..3ef5384a8b96 100644
|
|
--- a/writerperfect/source/writer/EPUBExportFilter.cxx
|
|
+++ b/writerperfect/source/writer/EPUBExportFilter.cxx
|
|
@@ -9,8 +9,6 @@
|
|
|
|
#include "EPUBExportFilter.hxx"
|
|
|
|
-#include <config_libepubgen.h>
|
|
-
|
|
#include <libepubgen/EPUBTextGenerator.h>
|
|
#include <libepubgen/libepubgen-decls.h>
|
|
|
|
@@ -25,17 +23,6 @@
|
|
|
|
using namespace com::sun::star;
|
|
|
|
-#if !LIBEPUBGEN_VERSION_SUPPORT
|
|
-namespace libepubgen
|
|
-{
|
|
-enum EPUBStylesMethod
|
|
-{
|
|
- EPUB_STYLES_METHOD_CSS, //< The styles will be described in a separate CSS file.
|
|
- EPUB_STYLES_METHOD_INLINE, //< The styles will be described inline.
|
|
-};
|
|
-}
|
|
-#endif
|
|
-
|
|
namespace writerperfect
|
|
{
|
|
|
|
@@ -88,14 +75,9 @@ sal_Bool EPUBExportFilter::filter(const uno::Sequence<beans::PropertyValue> &rDe
|
|
// file, the flat ODF filter has access to the doc model, everything else
|
|
// is in-between.
|
|
EPUBPackage aPackage(mxContext, rDescriptor);
|
|
- libepubgen::EPUBTextGenerator aGenerator(&aPackage, static_cast<libepubgen::EPUBSplitMethod>(nSplitMethod)
|
|
-#if LIBEPUBGEN_VERSION_SUPPORT
|
|
- , nVersion
|
|
-#endif
|
|
- );
|
|
-#if LIBEPUBGEN_VERSION_SUPPORT
|
|
- aGenerator.setStylesMethod(static_cast<libepubgen::EPUBStylesMethod>(nStylesMethod));
|
|
-#endif
|
|
+ libepubgen::EPUBTextGenerator aGenerator(&aPackage, nVersion);
|
|
+ aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_SPLIT, nSplitMethod);
|
|
+ aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_STYLES, nStylesMethod);
|
|
uno::Reference<xml::sax::XDocumentHandler> xExportHandler(new exp::XMLImport(aGenerator));
|
|
|
|
uno::Reference<lang::XInitialization> xInitialization(mxContext->getServiceManager()->createInstanceWithContext("com.sun.star.comp.Writer.XMLOasisExporter", mxContext), uno::UNO_QUERY);
|
|
--
|
|
2.14.3
|
|
|