diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-12-13 10:54:27 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2017-12-14 09:09:35 +0100 |
commit | b2b1debf06589bd91e437df47a2904574aaae316 (patch) | |
tree | e23a119ed85efdc88d430e1ca94052b57db32638 /external | |
parent | f988c1b36454445a503f6d2c1d8dd52f902fcf0e (diff) |
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.
Change-Id: I0e456d85c9d84002cabcd77b31b02c9a7ad16ac5
Reviewed-on: https://gerrit.libreoffice.org/46386
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'external')
-rw-r--r-- | external/libepubgen/UnpackedTarball_libepubgen.mk | 11 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-epub3.patch.1 | 6419 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-validation1.patch.1 | 49 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-validation2.patch.1 | 34 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-validation3.patch.1 | 35 | ||||
-rw-r--r-- | external/libepubgen/libepubgen-vc.patch.1 | 59 |
6 files changed, 0 insertions, 6607 deletions
diff --git a/external/libepubgen/UnpackedTarball_libepubgen.mk b/external/libepubgen/UnpackedTarball_libepubgen.mk index 0134768c57aa..14efadb337c0 100644 --- a/external/libepubgen/UnpackedTarball_libepubgen.mk +++ b/external/libepubgen/UnpackedTarball_libepubgen.mk @@ -8,17 +8,6 @@ # epubgen_patches := -# Backport of <https://sourceforge.net/p/libepubgen/code/ci/96e9786f5aba1078251f36e58feefc8d953cdea0/>. -epubgen_patches += libepubgen-validation1.patch.1 -# Backport of <https://sourceforge.net/p/libepubgen/code/ci/2e51fb9163bbc6b9a27fa524382c5aad9700dd0d/>. -epubgen_patches += libepubgen-validation2.patch.1 -# Backport of <https://sourceforge.net/p/libepubgen/code/ci/9041ef42f9e0a5c4bc3b0a912d36683c4e10ca84/>. -epubgen_patches += libepubgen-validation3.patch.1 -# Backport of <https://sourceforge.net/p/libepubgen/code/ci/49f6461d4751d3b16e32ab8f9c93a3856b33be49/>. -epubgen_patches += libepubgen-vc.patch.1 -# Backport of <https://sourceforge.net/p/libepubgen/code/ci/2e9e9af9f49a78cca75d3c862c8dd4b5f7cc7eb2/> (and its deps). -epubgen_patches += libepubgen-epub3.patch.1 - ifeq ($(COM_IS_CLANG),TRUE) ifneq ($(filter -fsanitize=%,$(CC)),) diff --git a/external/libepubgen/libepubgen-epub3.patch.1 b/external/libepubgen/libepubgen-epub3.patch.1 deleted file mode 100644 index bf9670995049..000000000000 --- a/external/libepubgen/libepubgen-epub3.patch.1 +++ /dev/null @@ -1,6419 +0,0 @@ -From 17b4d0a2b595d1504f3d957268e2085ae0f80db7 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 9 Aug 2017 15:53:02 +0200 -Subject: [PATCH 1/9] EPUBGenerator: avoid container version roundtrip to - double - -This will be an error for EPUB3: - -ERROR(RSC-005): test.epub/META-INF/container.xml(2,85): Error while parsing file: value of attribute "version" is invalid; must be equal to "1.0" - -But it does not hurt for EPUB2, either. ---- - src/lib/EPUBGenerator.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 3357cf2..1033c0f 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -117,7 +117,7 @@ void EPUBGenerator::writeContainer() - EPUBXMLSink sink; - - RVNGPropertyList containerAttrs; -- containerAttrs.insert("version", "1.0"); -+ containerAttrs.insert("version", RVNGPropertyFactory::newStringProp("1.0")); - containerAttrs.insert("xmlns", "urn:oasis:names:tc:opendocument:xmlns:container"); - - sink.openElement("container", containerAttrs); --- -2.12.3 - -From 8ca1fe2b9db9bacd6e868e69a0909a441fb6a7f8 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 9 Aug 2017 16:00:05 +0200 -Subject: [PATCH 2/9] EPUBGenerator: avoid opf:scheme attribute when writing - the UUID - -This will be an error for EPUB3: - -ERROR(RSC-005): test.epub/OEBPS/content.opf(2,292): Error while parsing file: found attribute "opf:scheme", but no attributes allowed here - -But it's optional for EPUB2 already. ---- - src/lib/EPUBGenerator.cpp | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 1033c0f..14e3c58 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -199,7 +199,6 @@ void EPUBGenerator::writeRoot() - - RVNGPropertyList identifierAttrs; - identifierAttrs.insert("id", uniqueId); -- identifierAttrs.insert("opf:scheme", "UUID"); - sink.openElement("dc:identifier", identifierAttrs); - // The identifier element is required to have a unique character content. - std::stringstream identifierStream("urn:uuid:"); --- -2.12.3 - -From aa71784fcee0404c2f136f035887ca4c52d0e756 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 9 Aug 2017 16:11:13 +0200 -Subject: [PATCH 3/9] EPUBGenerator: avoid empty dc:title element - -This is a warning for EPUB2, but it'll be an error for EPUB3: - -ERROR(RSC-005): test.epub/OEBPS/content.opf(2,337): Error while parsing file: character content of element "dc:title" invalid; must be a string with length at least 1 (actual length was 0) - -The problem is that for ODF/librevenge this element is optional, so work -it around by adding a zero-width space. - -A later commit should read the optional title of declared with a -librevenge API call, though. ---- - src/lib/EPUBGenerator.cpp | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 14e3c58..75ccb5a 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -208,8 +208,12 @@ void EPUBGenerator::writeRoot() - sink.insertCharacters(identifierCharactrs.c_str()); - sink.closeElement("dc:identifier"); - -+ // Zero-width space as it must be at least one character in length after -+ // white space has been trimmed. - sink.openElement("dc:title"); -+ sink.insertCharacters("\u200b"); - sink.closeElement("dc:title"); -+ - sink.openElement("dc:language"); - sink.closeElement("dc:language"); - --- -2.12.3 - -From a4585b8f35c76472eb91688c9177b9f532c290d8 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 9 Aug 2017 16:15:12 +0200 -Subject: [PATCH 4/9] EPUBGenerator: avoid empty dc:language element - -Same story as with dc:title: - -ERROR(RSC-005): test.epub/OEBPS/content.opf(2,362): Error while parsing file: character content of element "dc:language" invalid; must be an RFC 3066 language identifier - -(This is a warning for EPUB2, but it'll be an error for EPUB3; this is optional -for ODF; later commit should read the this info, though.) ---- - src/lib/EPUBGenerator.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 75ccb5a..40ae0cc 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -215,6 +215,7 @@ void EPUBGenerator::writeRoot() - sink.closeElement("dc:title"); - - sink.openElement("dc:language"); -+ sink.insertCharacters("en"); - sink.closeElement("dc:language"); - - sink.closeElement("metadata"); --- -2.12.3 - -From 862ec6735c25760edadf05d83717daaf65f39f99 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 9 Aug 2017 16:47:12 +0200 -Subject: [PATCH 5/9] [ABI CHANGE] optionally support generating EPUB3 output - -Versions are 20 and 30 to be consistent with -<https://github.com/idpf/epubcheck/tree/master/src/main/resources/com/adobe/epubcheck/schema/>. ---- - inc/libepubgen/EPUBDrawingGenerator.h | 6 +++++- - inc/libepubgen/EPUBPresentationGenerator.h | 6 +++++- - inc/libepubgen/EPUBTextGenerator.h | 6 +++++- - src/lib/EPUBDrawingGenerator.cpp | 10 +++++----- - src/lib/EPUBGenerator.cpp | 8 ++++++-- - src/lib/EPUBGenerator.h | 4 +++- - src/lib/EPUBPagedGenerator.cpp | 10 +++++----- - src/lib/EPUBPagedGenerator.h | 2 +- - src/lib/EPUBPresentationGenerator.cpp | 10 +++++----- - src/lib/EPUBTextGenerator.cpp | 10 +++++----- - 10 files changed, 45 insertions(+), 27 deletions(-) - -diff --git a/inc/libepubgen/EPUBDrawingGenerator.h b/inc/libepubgen/EPUBDrawingGenerator.h -index 48bfc99..963e3b8 100644 ---- a/inc/libepubgen/EPUBDrawingGenerator.h -+++ b/inc/libepubgen/EPUBDrawingGenerator.h -@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBDrawingGenerator : public librevenge::RVNGDrawingInterface - class Impl; - - public: -- explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK); -+ /** Constructor. -+ * -+ * @param[in] version possible values: 20, 30. -+ */ -+ explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20); - EPUBDrawingGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package); - ~EPUBDrawingGenerator() override; - -diff --git a/inc/libepubgen/EPUBPresentationGenerator.h b/inc/libepubgen/EPUBPresentationGenerator.h -index 0a8152a..512c52d 100644 ---- a/inc/libepubgen/EPUBPresentationGenerator.h -+++ b/inc/libepubgen/EPUBPresentationGenerator.h -@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBPresentationGenerator: public librevenge::RVNGPresentationI - class Impl; - - public: -- explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK); -+ /** Constructor. -+ * -+ * @param[in] version possible values: 20, 30. -+ */ -+ explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20); - EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package); - ~EPUBPresentationGenerator() override; - -diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h -index abf9e7f..664f673 100644 ---- a/inc/libepubgen/EPUBTextGenerator.h -+++ b/inc/libepubgen/EPUBTextGenerator.h -@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBTextGenerator : public librevenge::RVNGTextInterface - struct Impl; - - public: -- explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK); -+ /** Constructor. -+ * -+ * @param[in] version possible values: 20, 30. -+ */ -+ explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20); - EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package); - ~EPUBTextGenerator() override; - -diff --git a/src/lib/EPUBDrawingGenerator.cpp b/src/lib/EPUBDrawingGenerator.cpp -index e25a377..bcb4994 100644 ---- a/src/lib/EPUBDrawingGenerator.cpp -+++ b/src/lib/EPUBDrawingGenerator.cpp -@@ -20,16 +20,16 @@ using librevenge::RVNGString; - class EPUBDrawingGenerator::Impl : public EPUBPagedGenerator - { - public: -- Impl(EPUBPackage *const package, const EPUBSplitMethod method); -+ Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version); - }; - --EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method) -- : EPUBPagedGenerator(package, method) -+EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version) -+ : EPUBPagedGenerator(package, method, version) - { - } - --EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split) -- : m_impl(new Impl(package, split)) -+EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split, int version) -+ : m_impl(new Impl(package, split, version)) - { - } - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 40ae0cc..4888677 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -25,7 +25,7 @@ using librevenge::RVNGPropertyFactory; - using librevenge::RVNGPropertyList; - using librevenge::RVNGString; - --EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split) -+EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split, int version) - : m_package(package) - , m_manifest() - , m_htmlManager(m_manifest) -@@ -39,6 +39,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s - , m_metadata() - , m_currentHtml() - , m_splitGuard(split) -+ , m_version(version) - { - } - -@@ -190,7 +191,10 @@ void EPUBGenerator::writeRoot() - packageAttrs.insert("xmlns:dc", "http://purl.org/dc/elements/1.1/"); - packageAttrs.insert("xmlns:dcterms", "http://purl.org/dc/terms/"); - packageAttrs.insert("xmlns:opf", "http://www.idpf.org/2007/opf"); -- packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0")); -+ if (m_version == 30) -+ packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("3.0")); -+ else -+ packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0")); - packageAttrs.insert("unique-identifier", uniqueId); - - sink.openElement("package", packageAttrs); -diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h -index 51dd911..a0ef8ac 100644 ---- a/src/lib/EPUBGenerator.h -+++ b/src/lib/EPUBGenerator.h -@@ -33,7 +33,7 @@ class EPUBGenerator - EPUBGenerator &operator=(const EPUBGenerator &); - - public: -- EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method); -+ EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method, int version); - virtual ~EPUBGenerator(); - - void startDocument(const librevenge::RVNGPropertyList &props); -@@ -75,6 +75,8 @@ private: - EPUBHTMLGeneratorPtr_t m_currentHtml; - - EPUBSplitGuard m_splitGuard; -+ -+ int m_version; - }; - - } -diff --git a/src/lib/EPUBPagedGenerator.cpp b/src/lib/EPUBPagedGenerator.cpp -index 913a592..6a3bff0 100644 ---- a/src/lib/EPUBPagedGenerator.cpp -+++ b/src/lib/EPUBPagedGenerator.cpp -@@ -25,7 +25,7 @@ class EPUBPagedGenerator::Impl : public EPUBGenerator - Impl &operator=(const Impl &); - - public: -- Impl(EPUBPackage *const package, EPUBSplitMethod method); -+ Impl(EPUBPackage *const package, EPUBSplitMethod method, int version); - - private: - void startHtmlFile() override; -@@ -35,8 +35,8 @@ public: - bool m_firstPage; - }; - --EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method) -- : EPUBGenerator(package, method) -+EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version) -+ : EPUBGenerator(package, method, version) - , m_firstPage(true) - { - } -@@ -59,8 +59,8 @@ void EPUBPagedGenerator::Impl::endHtmlFile() - { - } - --EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method) -- : m_impl(new Impl(package, method)) -+EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version) -+ : m_impl(new Impl(package, method, version)) - { - } - -diff --git a/src/lib/EPUBPagedGenerator.h b/src/lib/EPUBPagedGenerator.h -index f1d124f..74d70da 100644 ---- a/src/lib/EPUBPagedGenerator.h -+++ b/src/lib/EPUBPagedGenerator.h -@@ -26,7 +26,7 @@ class EPUBPagedGenerator: public librevenge::RVNGPresentationInterface - class Impl; - - public: -- EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method); -+ EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method, int version); - - void setSplitHeadingLevel(unsigned level); - void setSplitSize(unsigned size); -diff --git a/src/lib/EPUBPresentationGenerator.cpp b/src/lib/EPUBPresentationGenerator.cpp -index 5b2a2e9..80b5ac2 100644 ---- a/src/lib/EPUBPresentationGenerator.cpp -+++ b/src/lib/EPUBPresentationGenerator.cpp -@@ -20,16 +20,16 @@ using librevenge::RVNGString; - class EPUBPresentationGenerator::Impl : public EPUBPagedGenerator - { - public: -- Impl(EPUBPackage *const package, EPUBSplitMethod method); -+ Impl(EPUBPackage *const package, EPUBSplitMethod method, int version); - }; - --EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method) -- : EPUBPagedGenerator(package, method) -+EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version) -+ : EPUBPagedGenerator(package, method, version) - { - } - --EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method) -- : m_impl(new Impl(package, method)) -+EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method, int version) -+ : m_impl(new Impl(package, method, version)) - { - (void) method; - } -diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp -index b3ca626..e8f785e 100644 ---- a/src/lib/EPUBTextGenerator.cpp -+++ b/src/lib/EPUBTextGenerator.cpp -@@ -57,7 +57,7 @@ bool operator!=(const char *const left, const RVNGString &right) - - struct EPUBTextGenerator::Impl : public EPUBGenerator - { -- Impl(EPUBPackage *package, EPUBSplitMethod method); -+ Impl(EPUBPackage *package, EPUBSplitMethod method, int version); - - private: - void startHtmlFile() override; -@@ -83,8 +83,8 @@ private: - Impl &operator=(const Impl &); - }; - --EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method) -- : EPUBGenerator(package, method) -+EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version) -+ : EPUBGenerator(package, method, version) - , m_inPageSpan(false) - , m_inHeader(false) - , m_inFooter(false) -@@ -113,8 +113,8 @@ void EPUBTextGenerator::Impl::endHtmlFile() - m_currentFooter->write(getHtml().get()); - } - --EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method) -- : m_impl(new Impl(package, method)) -+EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version) -+ : m_impl(new Impl(package, method, version)) - { - (void) method; - } --- -2.12.3 - -From cfd57f50c9d33781f90018d40902ccce68a13a5c Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 9 Aug 2017 17:19:06 +0200 -Subject: [PATCH 6/9] EPUB3: write missing modification date - -ERROR(RSC-005): test.epub/OEBPS/content.opf(2,236): Error while parsing file: package dcterms:modified meta element must occur exactly once - -But not for EPUB2, which doesn't allow so. - -(Similar story as with dc:title: later commit should read the this -optional info from librevenge.) ---- - src/lib/EPUBGenerator.cpp | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 4888677..1628a2b 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -7,6 +7,7 @@ - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -+#include <ctime> - #include <sstream> - - #include <boost/uuid/uuid.hpp> -@@ -222,6 +223,23 @@ void EPUBGenerator::writeRoot() - sink.insertCharacters("en"); - sink.closeElement("dc:language"); - -+ time_t now = 0; -+ time(&now); -+ const struct tm *local = localtime(&now); -+ if (m_version == 30 && local) -+ { -+ RVNGPropertyList metaAttrs; -+ metaAttrs.insert("property", "dcterms:modified"); -+ sink.openElement("meta", metaAttrs); -+ const int MAX_BUFFER = 1024; -+ char buffer[MAX_BUFFER]; -+ strftime(&buffer[0], MAX_BUFFER-1, "%Y-%m-%dT%H:%M:%SZ", local); -+ RVNGString result; -+ result.append(buffer); -+ sink.insertCharacters(result); -+ sink.closeElement("meta"); -+ } -+ - sink.closeElement("metadata"); - - sink.openElement("manifest"); --- -2.12.3 - -From 575a09f637b5afe4d61387c7be3c8b2b67039ccb Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 9 Aug 2017 17:39:51 +0200 -Subject: [PATCH 7/9] EPUB3: add missing nav property on first HTML stream - -ERROR(RSC-005): test30.epub/OEBPS/content.opf(2,459): Error while parsing file: Exactly one manifest item must declare the 'nav' property (number of 'nav' items: 0). - -This is the last error in OEBPS/content.opf in case of EPUB3. ---- - src/lib/EPUBGenerator.cpp | 11 ++++++++--- - src/lib/EPUBGenerator.h | 1 + - src/lib/EPUBHTMLManager.cpp | 9 +++++++-- - src/lib/EPUBHTMLManager.h | 3 ++- - src/lib/EPUBImageManager.cpp | 2 +- - src/lib/EPUBManifest.cpp | 11 +++++++---- - src/lib/EPUBManifest.h | 5 +++-- - 7 files changed, 29 insertions(+), 13 deletions(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 1628a2b..f77aa6c 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -54,8 +54,8 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props) - - startNewHtmlFile(); - -- m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx"); -- m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css"); -+ m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", ""); -+ m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", ""); - } - - void EPUBGenerator::endDocument() -@@ -90,7 +90,7 @@ void EPUBGenerator::startNewHtmlFile() - - m_splitGuard.onSplit(); - -- m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath); -+ m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, *this); - - // restore state in the new file - m_currentHtml->startDocument(m_documentProps); -@@ -114,6 +114,11 @@ EPUBSplitGuard &EPUBGenerator::getSplitGuard() - return m_splitGuard; - } - -+int EPUBGenerator::getVersion() const -+{ -+ return m_version; -+} -+ - void EPUBGenerator::writeContainer() - { - EPUBXMLSink sink; -diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h -index a0ef8ac..1a67a88 100644 ---- a/src/lib/EPUBGenerator.h -+++ b/src/lib/EPUBGenerator.h -@@ -47,6 +47,7 @@ public: - - const EPUBSplitGuard &getSplitGuard() const; - EPUBSplitGuard &getSplitGuard(); -+ int getVersion() const; - - private: - virtual void startHtmlFile() = 0; -diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp -index 03dbf21..57636b9 100644 ---- a/src/lib/EPUBHTMLManager.cpp -+++ b/src/lib/EPUBHTMLManager.cpp -@@ -13,6 +13,7 @@ - - #include "EPUBHTMLManager.h" - #include "EPUBManifest.h" -+#include "EPUBGenerator.h" - - namespace libepubgen - { -@@ -26,7 +27,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest) - { - } - --const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶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 - -From 801367ee905aa70bb2ba2ad5b8257cd2a25bed9b Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 8 Nov 2017 10:50:11 +0100 -Subject: [PATCH] EPUBImageManager: add support for borders - -The properties are on the frame, but the inner binary object emits the -"img" element that has the properties in XHTML. Solve this by -maintaining a stack of currently opened frames, with their properties. ---- - src/lib/EPUBGenerator.cpp | 1 + - src/lib/EPUBHTMLGenerator.cpp | 26 ++++++++++++++++++++ - src/lib/EPUBImageManager.cpp | 50 ++++++++++++++++++++++++++++++++++++++ - src/lib/EPUBImageManager.h | 16 ++++++++++++ - src/test/EPUBTextGeneratorTest.cpp | 26 ++++++++++++++++++++ - 5 files changed, 119 insertions(+) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 75c3076..38c3188 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -230,6 +230,7 @@ void EPUBGenerator::writeStylesheet() - m_paragraphStyleManager.send(sink); - m_spanStyleManager.send(sink); - m_tableStyleManager.send(sink); -+ m_imageManager.send(sink); - - sink.writeTo(*m_package, m_stylesheetPath.str().c_str()); - } -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index e00bea8..4ffa55d 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -364,6 +364,7 @@ struct EPUBHTMLGeneratorImpl - , m_ignore(false) - , m_hasText(false) - , m_frameAnchorTypes() -+ , m_framePropertiesStack() - , m_stylesMethod(stylesMethod) - , m_actualSink() - , m_sinkStack() -@@ -454,6 +455,7 @@ struct EPUBHTMLGeneratorImpl - bool m_hasText; - - std::stack<std::string> m_frameAnchorTypes; -+ std::stack<RVNGPropertyList> m_framePropertiesStack; - - EPUBStylesMethod m_stylesMethod; - -@@ -929,20 +931,29 @@ void EPUBHTMLGenerator::openFrame(const RVNGPropertyList &propList) - { - librevenge::RVNGPropertyList::Iter i(propList); - std::string anchorType; -+ RVNGPropertyList frameProperties; - for (i.rewind(); i.next();) - { - if (std::string("text:anchor-type") == i.key()) - anchorType = i()->getStr().cstr(); -+ -+ // Remember the property for binary object purposes. -+ frameProperties.insert(i.key(), i()->clone()); - } - - if (anchorType == "page") - // Other anchor types are already inside a paragraph. - m_impl->output().openElement("p", RVNGPropertyList()); - m_impl->m_frameAnchorTypes.push(anchorType); -+ -+ m_impl->m_framePropertiesStack.push(frameProperties); - } - - void EPUBHTMLGenerator::closeFrame() - { -+ if (!m_impl->m_framePropertiesStack.empty()) -+ m_impl->m_framePropertiesStack.pop(); -+ - if (m_impl->m_frameAnchorTypes.empty()) - return; - -@@ -970,6 +981,21 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - propList["librevenge:mime-type"]->getStr()); - - RVNGPropertyList attrs; -+ -+ if (!m_impl->m_framePropertiesStack.empty()) -+ { -+ RVNGPropertyList &frameProperties = m_impl->m_framePropertiesStack.top(); -+ switch (m_impl->m_stylesMethod) -+ { -+ case EPUB_STYLES_METHOD_CSS: -+ attrs.insert("class", m_impl->m_imageManager.getImageClass(frameProperties).c_str()); -+ break; -+ case EPUB_STYLES_METHOD_INLINE: -+ attrs.insert("style", m_impl->m_imageManager.getImageStyle(frameProperties).c_str()); -+ break; -+ } -+ } -+ - attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str()); - // FIXME: use alternative repr. if available - attrs.insert("alt", path.str().c_str()); -diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp -index 0179cad..2311e76 100644 ---- a/src/lib/EPUBImageManager.cpp -+++ b/src/lib/EPUBImageManager.cpp -@@ -16,6 +16,7 @@ - #include "EPUBBinarySink.h" - #include "EPUBImageManager.h" - #include "EPUBManifest.h" -+#include "EPUBCSSSink.h" - - namespace libepubgen - { -@@ -68,6 +69,7 @@ EPUBImageManager::EPUBImageManager(EPUBManifest &manifest) - : m_manifest(manifest) - , m_map() - , m_number() -+ , m_imageContentNameMap() - { - } - -@@ -105,6 +107,54 @@ void EPUBImageManager::writeTo(EPUBPackage &package) - } - } - -+std::string EPUBImageManager::getImageClass(librevenge::RVNGPropertyList const &pList) -+{ -+ EPUBCSSProperties content; -+ extractImageProperties(pList, content); -+ ContentNameMap_t::const_iterator it=m_imageContentNameMap.find(content); -+ if (it != m_imageContentNameMap.end()) -+ return it->second; -+ std::stringstream s; -+ s << "image" << m_imageContentNameMap.size(); -+ m_imageContentNameMap[content]=s.str(); -+ return s.str(); -+} -+ -+std::string EPUBImageManager::getImageStyle(librevenge::RVNGPropertyList const &pList) -+{ -+ EPUBCSSProperties content; -+ extractImageProperties(pList, content); -+ -+ std::stringstream s; -+ for (const auto &property : content) -+ s << property.first << ": " << property.second << "; "; -+ return s.str(); -+} -+ -+void EPUBImageManager::extractImageProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const -+{ -+ // Extract borders. -+ static char const *(type[]) = {"border", "border-left", "border-top", "border-right", "border-bottom" }; -+ for (int i = 0; i < 5; i++) -+ { -+ std::string field("fo:"); -+ field+=type[i]; -+ if (!pList[field.c_str()]) -+ continue; -+ cssProps[type[i]] = pList[field.c_str()]->getStr().cstr(); -+ } -+} -+ -+void EPUBImageManager::send(EPUBCSSSink &out) -+{ -+ for (auto it = m_imageContentNameMap.begin(); m_imageContentNameMap.end() != it; ++it) -+ { -+ librevenge::RVNGPropertyList props; -+ fillPropertyList(it->first, props); -+ out.insertRule(("." + it->second).c_str(), props); -+ } -+} -+ - } - - /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ -diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h -index 21a1b37..c9f4236 100644 ---- a/src/lib/EPUBImageManager.h -+++ b/src/lib/EPUBImageManager.h -@@ -12,8 +12,10 @@ - - #include <unordered_map> - -+#include <boost/functional/hash.hpp> - #include <librevenge/librevenge.h> - -+#include "EPUBCSSProperties.h" - #include "EPUBCounter.h" - #include "EPUBPath.h" - -@@ -22,6 +24,7 @@ namespace libepubgen - - class EPUBManifest; - class EPUBPackage; -+class EPUBCSSSink; - - class EPUBImageManager - { -@@ -40,6 +43,7 @@ class EPUBImageManager - }; - - typedef std::unordered_map<librevenge::RVNGBinaryData, EPUBPath, BinaryDataHash, BinaryDataEqual> MapType_t; -+ typedef std::unordered_map<EPUBCSSProperties, std::string, boost::hash<EPUBCSSProperties>> ContentNameMap_t; - - public: - explicit EPUBImageManager(EPUBManifest &manifest); -@@ -48,10 +52,22 @@ public: - - void writeTo(EPUBPackage &package); - -+ //! returns the class name corresponding to a propertylist -+ std::string getImageClass(librevenge::RVNGPropertyList const &pList); -+ //! returns the style string corresponding to a propertylist -+ std::string getImageStyle(librevenge::RVNGPropertyList const &pList); -+ //! send the data to the sink -+ void send(EPUBCSSSink &out); -+ - private: -+ //! convert a property list into a CSS property map -+ void extractImageProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const; -+ - EPUBManifest &m_manifest; - MapType_t m_map; - EPUBCounter m_number; -+ //! a map image content -> name -+ ContentNameMap_t m_imageContentNameMap; - }; - - } --- -2.13.6 - -From 094db625e36b91b57e152296a1f7db1bdcc682c5 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 8 Nov 2017 14:10:26 +0100 -Subject: [PATCH] EPUBHTMLGenerator: add missing rel attribute for CSS - reference - -Turns out a number of readers (checked Calibre and Aldiko on Android) do -support taking formatting from an external CSS, but only in case this -attribute is present. ---- - src/lib/EPUBHTMLGenerator.cpp | 1 + - src/test/EPUBTextGeneratorTest.cpp | 24 ++++++++++++++++++++++++ - 2 files changed, 25 insertions(+) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 4ffa55d..d81a905 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -531,6 +531,7 @@ void EPUBHTMLGenerator::endDocument() - RVNGPropertyList linkAttrs; - linkAttrs.insert("href", m_impl->m_stylesheetPath.relativeTo(m_impl->m_path).str().c_str()); - linkAttrs.insert("type", "text/css"); -+ linkAttrs.insert("rel", "stylesheet"); - m_impl->m_document.insertEmptyElement("link", linkAttrs); - m_impl->m_document.closeElement("head"); - m_impl->m_document.openElement("body", RVNGPropertyList()); --- -2.13.6 - -From 0f5073481b094562f2c78481475a660fb6826cdb Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Thu, 9 Nov 2017 11:32:27 +0100 -Subject: [PATCH] EPUBImageManager: initial horizontal positioning - -For now position everything to the left, except for explicit "right". ---- - src/lib/EPUBImageManager.cpp | 17 ++++++++++ - src/test/EPUBTextGeneratorTest.cpp | 66 ++++++++++++++++++++++++++++++++++++++ - 2 files changed, 83 insertions(+) - -diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp -index 2311e76..8414da5 100644 ---- a/src/lib/EPUBImageManager.cpp -+++ b/src/lib/EPUBImageManager.cpp -@@ -133,6 +133,23 @@ std::string EPUBImageManager::getImageStyle(librevenge::RVNGPropertyList const & - - void EPUBImageManager::extractImageProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const - { -+ // Positioning. -+ librevenge::RVNGString anchorType; -+ if (pList["text:anchor-type"]) -+ anchorType = pList["text:anchor-type"]->getStr(); -+ if (anchorType != "as-char") -+ { -+ // Horizontal position. -+ librevenge::RVNGString horizontalPos; -+ if (pList["style:horizontal-pos"]) -+ horizontalPos = pList["style:horizontal-pos"]->getStr(); -+ -+ if (horizontalPos == "right") -+ cssProps["float"] = "right"; -+ else -+ cssProps["float"] = "left"; -+ } -+ - // Extract borders. - static char const *(type[]) = {"border", "border-left", "border-top", "border-right", "border-bottom" }; - for (int i = 0; i < 5; i++) --- -2.13.6 - -From 3d47458738729c86992a1ed0002726cba5ec315c Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 10 Nov 2017 12:27:35 +0100 -Subject: [PATCH] EPUBImageManager: initial wrap type handling - -You could assume that the wrap is the opposide of clear, but given it's -an attribute on the next element, they are the same at the end in case -of left and right. ---- - src/lib/EPUBHTMLGenerator.cpp | 24 ++++++++++++++++++++++++ - src/test/EPUBTextGeneratorTest.cpp | 38 ++++++++++++++++++++++++++++++++++++++ - 2 files changed, 62 insertions(+) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index d81a905..a90ac68 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -982,6 +982,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - propList["librevenge:mime-type"]->getStr()); - - RVNGPropertyList attrs; -+ RVNGString wrap; - - if (!m_impl->m_framePropertiesStack.empty()) - { -@@ -995,12 +996,35 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - attrs.insert("style", m_impl->m_imageManager.getImageStyle(frameProperties).c_str()); - break; - } -+ -+ if (frameProperties["style:wrap"]) -+ wrap = frameProperties["style:wrap"]->getStr(); - } - - attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str()); - // FIXME: use alternative repr. if available - attrs.insert("alt", path.str().c_str()); - m_impl->output().insertEmptyElement("img", attrs); -+ -+ // Emulate wrap type with a break after the image. -+ RVNGString brStyle; -+ if (wrap == "none") -+ brStyle = "clear: both;"; -+ else if (wrap == "left") -+ // We want content on the left side, space on the right side, so the next -+ // element should clear on its left. -+ brStyle = "clear: left;"; -+ else if (wrap == "right") -+ // Same here. -+ brStyle = "clear: right;"; -+ else if (wrap == "parallel") -+ brStyle = "clear: none;"; -+ if (!brStyle.empty()) -+ { -+ attrs.clear(); -+ attrs.insert("style", brStyle); -+ m_impl->output().insertEmptyElement("br", attrs); -+ } - } - - void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {} --- -2.13.6 - -From 40111db25a92537c922a768dd04916cb5edd0239 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 10 Nov 2017 14:13:29 +0100 -Subject: [PATCH] EPUBHTMLGenerator: map TextBox to <div> - -This way e.g. image with caption is no longer lost from the text -generator. This generalizes image and textbox styles as "frame" styles. ---- - src/lib/EPUBHTMLGenerator.cpp | 27 ++++++++++++++++++---- - src/lib/EPUBImageManager.cpp | 6 ++--- - src/lib/EPUBImageManager.h | 4 ++-- - src/test/EPUBTextGeneratorTest.cpp | 47 +++++++++++++++++++++++++++++++++----- - 4 files changed, 68 insertions(+), 16 deletions(-) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index a90ac68..5f10902 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -833,15 +833,32 @@ void EPUBHTMLGenerator::openTextBox(const RVNGPropertyList & /*propList*/) - { - if (m_impl->m_ignore) - return; -- m_impl->push(EPUBHTMLTextZone::Z_TextBox); -- m_impl->getSink().addLabel(m_impl->output()); -+ -+ RVNGPropertyList attrs; -+ -+ if (!m_impl->m_framePropertiesStack.empty()) -+ { -+ RVNGPropertyList &frameProperties = m_impl->m_framePropertiesStack.top(); -+ switch (m_impl->m_stylesMethod) -+ { -+ case EPUB_STYLES_METHOD_CSS: -+ attrs.insert("class", m_impl->m_imageManager.getFrameClass(frameProperties).c_str()); -+ break; -+ case EPUB_STYLES_METHOD_INLINE: -+ attrs.insert("style", m_impl->m_imageManager.getFrameStyle(frameProperties).c_str()); -+ break; -+ } -+ } -+ -+ m_impl->output().openElement("div", attrs); - } - - void EPUBHTMLGenerator::closeTextBox() - { - if (m_impl->m_ignore) - return; -- m_impl->pop(); -+ -+ m_impl->output().closeElement("div"); - } - - void EPUBHTMLGenerator::openTable(const RVNGPropertyList &propList) -@@ -990,10 +1007,10 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - switch (m_impl->m_stylesMethod) - { - case EPUB_STYLES_METHOD_CSS: -- attrs.insert("class", m_impl->m_imageManager.getImageClass(frameProperties).c_str()); -+ attrs.insert("class", m_impl->m_imageManager.getFrameClass(frameProperties).c_str()); - break; - case EPUB_STYLES_METHOD_INLINE: -- attrs.insert("style", m_impl->m_imageManager.getImageStyle(frameProperties).c_str()); -+ attrs.insert("style", m_impl->m_imageManager.getFrameStyle(frameProperties).c_str()); - break; - } - -diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp -index 8414da5..dfa0cb7 100644 ---- a/src/lib/EPUBImageManager.cpp -+++ b/src/lib/EPUBImageManager.cpp -@@ -107,7 +107,7 @@ void EPUBImageManager::writeTo(EPUBPackage &package) - } - } - --std::string EPUBImageManager::getImageClass(librevenge::RVNGPropertyList const &pList) -+std::string EPUBImageManager::getFrameClass(librevenge::RVNGPropertyList const &pList) - { - EPUBCSSProperties content; - extractImageProperties(pList, content); -@@ -115,12 +115,12 @@ std::string EPUBImageManager::getImageClass(librevenge::RVNGPropertyList const & - if (it != m_imageContentNameMap.end()) - return it->second; - std::stringstream s; -- s << "image" << m_imageContentNameMap.size(); -+ s << "frame" << m_imageContentNameMap.size(); - m_imageContentNameMap[content]=s.str(); - return s.str(); - } - --std::string EPUBImageManager::getImageStyle(librevenge::RVNGPropertyList const &pList) -+std::string EPUBImageManager::getFrameStyle(librevenge::RVNGPropertyList const &pList) - { - EPUBCSSProperties content; - extractImageProperties(pList, content); -diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h -index c9f4236..939d350 100644 ---- a/src/lib/EPUBImageManager.h -+++ b/src/lib/EPUBImageManager.h -@@ -53,9 +53,9 @@ public: - void writeTo(EPUBPackage &package); - - //! returns the class name corresponding to a propertylist -- std::string getImageClass(librevenge::RVNGPropertyList const &pList); -+ std::string getFrameClass(librevenge::RVNGPropertyList const &pList); - //! returns the style string corresponding to a propertylist -- std::string getImageStyle(librevenge::RVNGPropertyList const &pList); -+ std::string getFrameStyle(librevenge::RVNGPropertyList const &pList); - //! send the data to the sink - void send(EPUBCSSSink &out); - --- -2.13.6 - -From da840df8eaacfcfbd93d82751a774371d7e5c9b9 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 10 Nov 2017 15:29:47 +0100 -Subject: [PATCH] EPUBHTMLGenerator: avoid wrap type for as-char anchored - images - ---- - src/lib/EPUBHTMLGenerator.cpp | 40 ++++++++++++++++++++++---------------- - src/test/EPUBTextGeneratorTest.cpp | 15 +++++++++++++- - 2 files changed, 37 insertions(+), 18 deletions(-) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 5f10902..156f042 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -1000,6 +1000,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - - RVNGPropertyList attrs; - RVNGString wrap; -+ RVNGString anchorType; - - if (!m_impl->m_framePropertiesStack.empty()) - { -@@ -1016,6 +1017,8 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - - if (frameProperties["style:wrap"]) - wrap = frameProperties["style:wrap"]->getStr(); -+ if (frameProperties["text:anchor-type"]) -+ anchorType = frameProperties["text:anchor-type"]->getStr(); - } - - attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str()); -@@ -1023,24 +1026,27 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - attrs.insert("alt", path.str().c_str()); - m_impl->output().insertEmptyElement("img", attrs); - -- // Emulate wrap type with a break after the image. -- RVNGString brStyle; -- if (wrap == "none") -- brStyle = "clear: both;"; -- else if (wrap == "left") -- // We want content on the left side, space on the right side, so the next -- // element should clear on its left. -- brStyle = "clear: left;"; -- else if (wrap == "right") -- // Same here. -- brStyle = "clear: right;"; -- else if (wrap == "parallel") -- brStyle = "clear: none;"; -- if (!brStyle.empty()) -+ if (anchorType != "as-char") - { -- attrs.clear(); -- attrs.insert("style", brStyle); -- m_impl->output().insertEmptyElement("br", attrs); -+ // Emulate wrap type with a break after the image. -+ RVNGString brStyle; -+ if (wrap == "none") -+ brStyle = "clear: both;"; -+ else if (wrap == "left") -+ // We want content on the left side, space on the right side, so the next -+ // element should clear on its left. -+ brStyle = "clear: left;"; -+ else if (wrap == "right") -+ // Same here. -+ brStyle = "clear: right;"; -+ else if (wrap == "parallel") -+ brStyle = "clear: none;"; -+ if (!brStyle.empty()) -+ { -+ attrs.clear(); -+ attrs.insert("style", brStyle); -+ m_impl->output().insertEmptyElement("br", attrs); -+ } - } - } - --- -2.13.6 - -From 3da66e7b1fbda75e43b3ab63502d66097f39ef7a Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 10 Nov 2017 16:36:11 +0100 -Subject: [PATCH] EPUBImageManager: handle text box wrap types - -By sharing the image and textbox wrap code. ---- - src/lib/EPUBHTMLGenerator.cpp | 44 ++++++++++++++++---------------------- - src/lib/EPUBImageManager.cpp | 29 +++++++++++++++++++++++++ - src/lib/EPUBImageManager.h | 2 ++ - src/test/EPUBTextGeneratorTest.cpp | 2 ++ - 4 files changed, 51 insertions(+), 26 deletions(-) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 156f042..9d39333 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -859,6 +859,18 @@ void EPUBHTMLGenerator::closeTextBox() - return; - - m_impl->output().closeElement("div"); -+ -+ if (!m_impl->m_framePropertiesStack.empty()) -+ { -+ RVNGPropertyList &frameProperties = m_impl->m_framePropertiesStack.top(); -+ RVNGString wrapStyle = m_impl->m_imageManager.getWrapStyle(frameProperties).c_str(); -+ if (!wrapStyle.empty()) -+ { -+ RVNGPropertyList attrs; -+ attrs.insert("style", wrapStyle); -+ m_impl->output().insertEmptyElement("br", attrs); -+ } -+ } - } - - void EPUBHTMLGenerator::openTable(const RVNGPropertyList &propList) -@@ -999,8 +1011,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - propList["librevenge:mime-type"]->getStr()); - - RVNGPropertyList attrs; -- RVNGString wrap; -- RVNGString anchorType; -+ RVNGString wrapStyle; - - if (!m_impl->m_framePropertiesStack.empty()) - { -@@ -1015,10 +1026,7 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - break; - } - -- if (frameProperties["style:wrap"]) -- wrap = frameProperties["style:wrap"]->getStr(); -- if (frameProperties["text:anchor-type"]) -- anchorType = frameProperties["text:anchor-type"]->getStr(); -+ wrapStyle = m_impl->m_imageManager.getWrapStyle(frameProperties).c_str(); - } - - attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str()); -@@ -1026,27 +1034,11 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - attrs.insert("alt", path.str().c_str()); - m_impl->output().insertEmptyElement("img", attrs); - -- if (anchorType != "as-char") -+ if (!wrapStyle.empty()) - { -- // Emulate wrap type with a break after the image. -- RVNGString brStyle; -- if (wrap == "none") -- brStyle = "clear: both;"; -- else if (wrap == "left") -- // We want content on the left side, space on the right side, so the next -- // element should clear on its left. -- brStyle = "clear: left;"; -- else if (wrap == "right") -- // Same here. -- brStyle = "clear: right;"; -- else if (wrap == "parallel") -- brStyle = "clear: none;"; -- if (!brStyle.empty()) -- { -- attrs.clear(); -- attrs.insert("style", brStyle); -- m_impl->output().insertEmptyElement("br", attrs); -- } -+ attrs.clear(); -+ attrs.insert("style", wrapStyle); -+ m_impl->output().insertEmptyElement("br", attrs); - } - } - -diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp -index dfa0cb7..c31fb82 100644 ---- a/src/lib/EPUBImageManager.cpp -+++ b/src/lib/EPUBImageManager.cpp -@@ -162,6 +162,35 @@ void EPUBImageManager::extractImageProperties(librevenge::RVNGPropertyList const - } - } - -+std::string EPUBImageManager::getWrapStyle(librevenge::RVNGPropertyList const &pList) -+{ -+ librevenge::RVNGString wrap; -+ librevenge::RVNGString anchorType; -+ std::string ret; -+ -+ if (pList["style:wrap"]) -+ wrap = pList["style:wrap"]->getStr(); -+ if (pList["text:anchor-type"]) -+ anchorType = pList["text:anchor-type"]->getStr(); -+ -+ if (anchorType == "as-char") -+ return ret; -+ -+ // Emulate wrap type with a break after the image. -+ if (wrap == "none") -+ ret = "clear: both;"; -+ else if (wrap == "left") -+ // We want content on the left side, space on the right side, so the next -+ // element should clear on its left. -+ ret = "clear: left;"; -+ else if (wrap == "right") -+ ret = "clear: right;"; -+ else if (wrap == "parallel") -+ ret = "clear: none;"; -+ -+ return ret; -+} -+ - void EPUBImageManager::send(EPUBCSSSink &out) - { - for (auto it = m_imageContentNameMap.begin(); m_imageContentNameMap.end() != it; ++it) -diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h -index 939d350..9d1da4e 100644 ---- a/src/lib/EPUBImageManager.h -+++ b/src/lib/EPUBImageManager.h -@@ -56,6 +56,8 @@ public: - std::string getFrameClass(librevenge::RVNGPropertyList const &pList); - //! returns the style string corresponding to a propertylist - std::string getFrameStyle(librevenge::RVNGPropertyList const &pList); -+ //! returns the style for a follow-up <br> element, based on wrapping properties. -+ static std::string getWrapStyle(librevenge::RVNGPropertyList const &pList); - //! send the data to the sink - void send(EPUBCSSSink &out); - --- -2.13.6 - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 38c3188..64707c5 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -35,6 +35,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s - , m_manifest() - , m_htmlManager(m_manifest) - , m_imageManager(m_manifest) -+ , m_fontManager(m_manifest) - , m_listStyleManager() - , m_paragraphStyleManager() - , m_spanStyleManager() -@@ -79,6 +80,7 @@ void EPUBGenerator::endDocument() - writeStylesheet(); - m_htmlManager.writeTo(*m_package); - m_imageManager.writeTo(*m_package); -+ m_fontManager.writeTo(*m_package); - } - - void EPUBGenerator::setDocumentMetaData(const RVNGPropertyList &props) -@@ -97,7 +99,7 @@ void EPUBGenerator::startNewHtmlFile() - - m_splitGuard.onSplit(); - -- m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod); -+ m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod); - - // restore state in the new file - m_currentHtml->startDocument(m_documentProps); -@@ -226,6 +228,7 @@ void EPUBGenerator::writeStylesheet() - { - EPUBCSSSink sink; - -+ m_fontManager.send(sink); - m_listStyleManager.send(sink); - m_paragraphStyleManager.send(sink); - m_spanStyleManager.send(sink); -diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h -index 099eb4a..abc6a9a 100644 ---- a/src/lib/EPUBGenerator.h -+++ b/src/lib/EPUBGenerator.h -@@ -68,6 +68,7 @@ private: - EPUBManifest m_manifest; - EPUBHTMLManager m_htmlManager; - EPUBImageManager m_imageManager; -+ EPUBFontManager m_fontManager; - EPUBListStyleManager m_listStyleManager; - EPUBParagraphStyleManager m_paragraphStyleManager; - EPUBSpanStyleManager m_spanStyleManager; -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 9d39333..614dd02 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -351,9 +351,10 @@ std::string EPUBHTMLTextZone::label(int id) const - struct EPUBHTMLGeneratorImpl - { - //! constructor -- EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod) -+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod) - : m_document(document) - , m_imageManager(imageManager) -+ , m_fontManager(fontManager) - , m_listManager(listStyleManager) - , m_paragraphManager(paragraphStyleManager) - , m_spanManager(spanStyleManager) -@@ -442,6 +443,7 @@ struct EPUBHTMLGeneratorImpl - - EPUBXMLSink &m_document; - EPUBImageManager &m_imageManager; -+ EPUBFontManager &m_fontManager; - EPUBListStyleManager &m_listManager; - EPUBParagraphStyleManager &m_paragraphManager; - EPUBSpanStyleManager &m_spanManager; -@@ -469,8 +471,8 @@ private: - EPUBHTMLGeneratorImpl operator=(EPUBHTMLGeneratorImpl const &orig); - }; - --EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶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)) -+EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod) -+ : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod)) - { - } - -@@ -540,8 +542,9 @@ void EPUBHTMLGenerator::endDocument() - m_impl->m_document.closeElement("html"); - } - --void EPUBHTMLGenerator::defineEmbeddedFont(const RVNGPropertyList &/*propList*/) -+void EPUBHTMLGenerator::defineEmbeddedFont(const RVNGPropertyList &propList) - { -+ m_impl->m_fontManager.insert(propList, m_impl->m_path); - } - - void EPUBHTMLGenerator::openPageSpan(const RVNGPropertyList & /* propList */) -diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h -index d8783ed..49f76a3 100644 ---- a/src/lib/EPUBHTMLGenerator.h -+++ b/src/lib/EPUBHTMLGenerator.h -@@ -21,6 +21,7 @@ namespace libepubgen - - struct EPUBHTMLGeneratorImpl; - class EPUBImageManager; -+class EPUBFontManager; - class EPUBListStyleManager; - class EPUBSpanStyleManager; - class EPUBParagraphStyleManager; -@@ -30,7 +31,7 @@ class EPUBPath; - class EPUBHTMLGenerator : public librevenge::RVNGTextInterface - { - public: -- EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod); -+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, 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 33cba11..9d4c507 100644 ---- a/src/lib/EPUBHTMLManager.cpp -+++ b/src/lib/EPUBHTMLManager.cpp -@@ -41,7 +41,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest) - { - } - --const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod) -+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, 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, stylesMethod)); -+ new EPUBHTMLGenerator(m_contents.back(), imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod)); - - return gen; - } -diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h -index f034657..ef56a52 100644 ---- a/src/lib/EPUBHTMLManager.h -+++ b/src/lib/EPUBHTMLManager.h -@@ -41,7 +41,7 @@ class EPUBHTMLManager - public: - explicit EPUBHTMLManager(EPUBManifest &manifest); - -- const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod); -+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod); - - void writeTo(EPUBPackage &package); - -diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp -index c31fb82..c4c9457 100644 ---- a/src/lib/EPUBImageManager.cpp -+++ b/src/lib/EPUBImageManager.cpp -@@ -42,6 +42,17 @@ string getExtension(const string &mimetype) - return (extensionMap.end() == it) ? string("img") : it->second; - } - -+std::string getFontExtension(const std::string &mimetype) -+{ -+ static const std::unordered_map<std::string, std::string> extensionMap = -+ { -+ {"application/vnd.ms-opentype", "otf"}, -+ }; -+ -+ const auto it = extensionMap.find(mimetype); -+ return it == extensionMap.end() ? std::string("ttf") : it->second; -+} -+ - } - - std::size_t EPUBImageManager::BinaryDataHash::operator()(const librevenge::RVNGBinaryData &data) const -@@ -201,6 +212,113 @@ void EPUBImageManager::send(EPUBCSSSink &out) - } - } - -+std::size_t EPUBFontManager::BinaryDataHash::operator()(const librevenge::RVNGBinaryData &data) const -+{ -+ size_t seed = 0; -+ -+ const unsigned char *const buf = data.getDataBuffer(); -+ for (size_t i = 0; data.size() != i; ++i) -+ boost::hash_combine(seed, buf[i]); -+ -+ return seed; -+} -+ -+bool EPUBFontManager::BinaryDataEqual::operator()(const librevenge::RVNGBinaryData &left, const librevenge::RVNGBinaryData &right) const -+{ -+ if (left.empty() && right.empty()) -+ return true; -+ if (left.size() != right.size()) -+ return false; -+ const unsigned char *const leftData = left.getDataBuffer(); -+ return std::equal(leftData, leftData + left.size(), right.getDataBuffer()); -+} -+ -+EPUBFontManager::EPUBFontManager(EPUBManifest &manifest) -+ : m_manifest(manifest) -+ , m_map() -+ , m_number() -+ , m_set() -+{ -+} -+ -+void EPUBFontManager::insert(const librevenge::RVNGPropertyList &propertyList, const EPUBPath &base) -+{ -+ librevenge::RVNGBinaryData data(propertyList["office:binary-data"]->getStr()); -+ librevenge::RVNGString mimetype(propertyList["librevenge:mime-type"]->getStr()); -+ if (mimetype == "truetype") -+ // librevenge's truetype is EPUB's opentype. -+ mimetype = "application/vnd.ms-opentype"; -+ -+ MapType_t::const_iterator it = m_map.find(data); -+ if (m_map.end() == it) -+ { -+ const std::string mime(mimetype.cstr()); -+ -+ std::ostringstream nameBuf; -+ nameBuf << "font" << std::setw(4) << std::setfill('0') << m_number.next(); -+ const std::string id = nameBuf.str(); -+ -+ nameBuf << "." << getFontExtension(mime); -+ -+ const EPUBPath path(EPUBPath("OEBPS/fonts") / nameBuf.str()); -+ -+ m_manifest.insert(path, mime, id, ""); -+ it = m_map.insert(MapType_t::value_type(data, path)).first; -+ } -+ -+ assert(m_map.end() != it); // the font must be present at this point -+ -+ // Now collect CSS properties. -+ EPUBCSSProperties content; -+ extractFontProperties(propertyList, content); -+ std::stringstream ss; -+ ss << "url("; -+ ss << it->second.relativeTo(base).str(); -+ ss << ")"; -+ content["src"] = ss.str(); -+ SetType_t::const_iterator contentIt = m_set.find(content); -+ if (contentIt != m_set.end()) -+ return; -+ -+ m_set.insert(content); -+} -+ -+void EPUBFontManager::extractFontProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const -+{ -+ if (pList["librevenge:name"]) -+ { -+ std::ostringstream name; -+ name << '\'' << pList["librevenge:name"]->getStr().cstr() << '\''; -+ cssProps["font-family"] = name.str(); -+ } -+ -+ if (pList["librevenge:font-style"]) -+ cssProps["font-style"] = pList["librevenge:font-style"]->getStr().cstr(); -+ -+ if (pList["librevenge:font-weight"]) -+ cssProps["font-weight"] = pList["librevenge:font-weight"]->getStr().cstr(); -+} -+ -+void EPUBFontManager::writeTo(EPUBPackage &package) -+{ -+ for (MapType_t::const_iterator it = m_map.begin(); m_map.end() != it; ++it) -+ { -+ EPUBBinarySink sink; -+ sink.insertBinaryData(it->first); -+ sink.writeTo(package, it->second.str().c_str()); -+ } -+} -+ -+void EPUBFontManager::send(EPUBCSSSink &out) -+{ -+ for (const auto &fontProperties : m_set) -+ { -+ librevenge::RVNGPropertyList props; -+ fillPropertyList(fontProperties, props); -+ out.insertRule("@font-face", props); -+ } -+} -+ - } - - /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ -diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h -index 9d1da4e..3f4bf3c 100644 ---- a/src/lib/EPUBImageManager.h -+++ b/src/lib/EPUBImageManager.h -@@ -11,6 +11,7 @@ - #define INCLUDED_EPUBIMAGEMANAGER_H - - #include <unordered_map> -+#include <unordered_set> - - #include <boost/functional/hash.hpp> - #include <librevenge/librevenge.h> -@@ -72,6 +73,48 @@ private: - ContentNameMap_t m_imageContentNameMap; - }; - -+/// Manages embedded fonts. -+class EPUBFontManager -+{ -+ // disable copying -+ EPUBFontManager(const EPUBFontManager &); -+ EPUBFontManager &operator=(const EPUBFontManager &); -+ -+ struct BinaryDataHash // : public std::unary_function<librevenge::RVNGBinaryData, std::size_t> -+ { -+ std::size_t operator()(const librevenge::RVNGBinaryData &data) const; -+ }; -+ -+ struct BinaryDataEqual // : public std::binary_function<librevenge::RVNGBinaryData, librevenge::RVNGBinaryData, bool> -+ { -+ bool operator()(const librevenge::RVNGBinaryData &left, const librevenge::RVNGBinaryData &right) const; -+ }; -+ -+ typedef std::unordered_map<librevenge::RVNGBinaryData, EPUBPath, BinaryDataHash, BinaryDataEqual> MapType_t; -+ typedef std::unordered_set<EPUBCSSProperties, boost::hash<EPUBCSSProperties>> SetType_t; -+ -+public: -+ explicit EPUBFontManager(EPUBManifest &manifest); -+ -+ void insert(const librevenge::RVNGPropertyList &propertyList, const EPUBPath &path); -+ -+ void writeTo(EPUBPackage &package); -+ -+ //! send the data to the sink -+ void send(EPUBCSSSink &out); -+ -+private: -+ //! convert a property list into a CSS property map -+ void extractFontProperties(librevenge::RVNGPropertyList const &pList, EPUBCSSProperties &cssProps) const; -+ -+ EPUBManifest &m_manifest; -+ /// Font filename -> content map. -+ MapType_t m_map; -+ EPUBCounter m_number; -+ /// Set of font properties. -+ SetType_t m_set; -+}; -+ - } - - #endif // INCLUDED_EPUBIMAGEMANAGER -diff --git a/src/lib/EPUBTableStyleManager.cpp b/src/lib/EPUBTableStyleManager.cpp -index d5e650c..a1ce33e 100644 ---- a/src/lib/EPUBTableStyleManager.cpp -+++ b/src/lib/EPUBTableStyleManager.cpp -@@ -78,7 +78,9 @@ bool extractColumnsWidth(const std::vector< std::vector<double> > &columnWidthsS - if (col < 0 || size_t(col+numSpanned-1) >= widths.size()) - { - if (!relative) -+ { - EPUBGEN_DEBUG_MSG(("EPUBTableStyleManager::getColumnsWidth: can not compute the columns width\n")); -+ } - return false; - } - bool fixed = true; -From 0d06b60d45b3e1465976eb027c3fde31fccdc025 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 17 Nov 2017 15:45:12 +0100 -Subject: [PATCH] EPUBGenerator: add support for cover image metadata - -The librevenge:cover-images key can't have a property list as a value, -so go with a list of cover images, though in practice more than one -won't result in a valid EPUB3 file. ---- - src/lib/EPUBGenerator.cpp | 18 ++++++++++++++++++ - src/lib/EPUBImageManager.cpp | 4 ++-- - src/lib/EPUBImageManager.h | 2 +- - src/test/EPUBTextGeneratorTest.cpp | 31 +++++++++++++++++++++++++++++++ - 4 files changed, 52 insertions(+), 3 deletions(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 64707c5..62dac6e 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -86,6 +86,24 @@ void EPUBGenerator::endDocument() - void EPUBGenerator::setDocumentMetaData(const RVNGPropertyList &props) - { - m_metadata = props; -+ -+ if (m_version == 30) -+ { -+ const librevenge::RVNGPropertyListVector *coverImages = props.child("librevenge:cover-images"); -+ if (coverImages) -+ { -+ for (size_t i = 0; i < coverImages->count(); ++i) -+ { -+ librevenge::RVNGPropertyList const &propertyList = (*coverImages)[i]; -+ if (propertyList["office:binary-data"] && propertyList["librevenge:mime-type"]) -+ { -+ m_imageManager.insert(librevenge::RVNGBinaryData(propertyList["office:binary-data"]->getStr()), -+ propertyList["librevenge:mime-type"]->getStr(), -+ "cover-image"); -+ } -+ } -+ } -+ } - } - - void EPUBGenerator::startNewHtmlFile() -diff --git a/src/lib/EPUBImageManager.cpp b/src/lib/EPUBImageManager.cpp -index c4c9457..bdf3bf0 100644 ---- a/src/lib/EPUBImageManager.cpp -+++ b/src/lib/EPUBImageManager.cpp -@@ -84,7 +84,7 @@ EPUBImageManager::EPUBImageManager(EPUBManifest &manifest) - { - } - --const EPUBPath &EPUBImageManager::insert(const librevenge::RVNGBinaryData &data, const librevenge::RVNGString &mimetype) -+const EPUBPath &EPUBImageManager::insert(const librevenge::RVNGBinaryData &data, const librevenge::RVNGString &mimetype, const librevenge::RVNGString &properties) - { - MapType_t::const_iterator it = m_map.find(data); - if (m_map.end() == it) -@@ -99,7 +99,7 @@ const EPUBPath &EPUBImageManager::insert(const librevenge::RVNGBinaryData &data, - - const EPUBPath path(EPUBPath("OEBPS/images") / nameBuf.str()); - -- m_manifest.insert(path, mime, id, ""); -+ m_manifest.insert(path, mime, id, properties.cstr()); - it = m_map.insert(MapType_t::value_type(data, path)).first; - } - -diff --git a/src/lib/EPUBImageManager.h b/src/lib/EPUBImageManager.h -index 3f4bf3c..cbb83b7 100644 ---- a/src/lib/EPUBImageManager.h -+++ b/src/lib/EPUBImageManager.h -@@ -49,7 +49,7 @@ class EPUBImageManager - public: - explicit EPUBImageManager(EPUBManifest &manifest); - -- const EPUBPath &insert(const librevenge::RVNGBinaryData &data, const librevenge::RVNGString &mimetype); -+ const EPUBPath &insert(const librevenge::RVNGBinaryData &data, const librevenge::RVNGString &mimetype, const librevenge::RVNGString &properties=""); - - void writeTo(EPUBPackage &package); - --- -2.13.6 - -From 631b21834883aa8f2ee83a20717dd37900331696 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Tue, 21 Nov 2017 11:52:03 +0100 -Subject: [PATCH] EPUBGenerator: allow overwriting dc:identifier default - -All other types had a way to be overwritten. ---- - src/lib/EPUBGenerator.cpp | 5 ++++- - src/test/EPUBTextGeneratorTest.cpp | 3 +++ - 2 files changed, 7 insertions(+), 1 deletion(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 62dac6e..1cb1112 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -285,7 +285,10 @@ void EPUBGenerator::writeRoot() - boost::uuids::uuid uuid = boost::uuids::random_generator()(); - identifierStream << uuid; - std::string identifierCharactrs = identifierStream.str(); -- sink.insertCharacters(identifierCharactrs.c_str()); -+ RVNGString identifier = identifierCharactrs.c_str(); -+ if (m_metadata["dc:identifier"] && !m_metadata["dc:identifier"]->getStr().empty()) -+ identifier = m_metadata["dc:identifier"]->getStr(); -+ sink.insertCharacters(identifier); - sink.closeElement("dc:identifier"); - - RVNGString title("Unknown Title"); --- -2.13.6 - -From 8c447caee18b4400170ecce36ea3714fdc377989 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Thu, 23 Nov 2017 16:42:13 +0100 -Subject: [PATCH 1/4] EPUBHTMLGenerator: fix footnotes/endnotes/comments - -There were two problems here: - -- when working with two sinks (footnote and main), make sure that we - save the main one before the push of the sink stack - -- when handing out a non-const xml sink reference, make sure there is no - parallel empty bool that tracks its size, otherwise these can out of - sync (empty is still true, even if there is footnote content) ---- - src/lib/EPUBHTMLGenerator.cpp | 24 +++++++----------------- - src/lib/EPUBXMLSink.cpp | 5 +++++ - src/lib/EPUBXMLSink.h | 2 ++ - src/test/EPUBTextGeneratorTest.cpp | 24 ++++++++++++++++++++++++ - 4 files changed, 38 insertions(+), 17 deletions(-) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 614dd02..3c8862b 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -51,20 +51,16 @@ public: - const EPUBXMLSink &get() const; - EPUBXMLSink &get(); - -- bool empty() const; -- - bool endsInLineBreak() const; - - private: - EPUBXMLSink m_sink; - std::string m_lastCloseElement; -- bool m_empty; - }; - - ZoneSinkImpl::ZoneSinkImpl() - : m_sink() - , m_lastCloseElement() -- , m_empty(true) - { - } - -@@ -72,28 +68,24 @@ void ZoneSinkImpl::openElement(const char *const name, const librevenge::RVNGPro - { - m_sink.openElement(name, attributes); - m_lastCloseElement.clear(); -- m_empty = false; - } - - void ZoneSinkImpl::closeElement(const char *const name) - { - m_sink.closeElement(name); - m_lastCloseElement = name; -- m_empty = false; - } - - void ZoneSinkImpl::insertCharacters(const librevenge::RVNGString &characters) - { - m_sink.insertCharacters(characters); - m_lastCloseElement.clear(); -- m_empty = false; - } - - void ZoneSinkImpl::append(const ZoneSinkImpl &other) - { - m_sink.append(other.m_sink); - m_lastCloseElement = other.m_lastCloseElement; -- m_empty |= other.m_empty; - } - - const EPUBXMLSink &ZoneSinkImpl::get() const -@@ -106,11 +98,6 @@ EPUBXMLSink &ZoneSinkImpl::get() - return m_sink; - } - --bool ZoneSinkImpl::empty() const --{ -- return m_empty; --} -- - bool ZoneSinkImpl::endsInLineBreak() const - { - return m_lastCloseElement == "p" -@@ -154,7 +141,7 @@ struct EPUBHTMLTextZone - bool isEmpty() const - { - for (const auto &zoneSink : m_zoneSinks) -- if (!zoneSink.empty()) -+ if (!zoneSink.get().empty()) - return false; - return true; - } -@@ -791,8 +778,9 @@ void EPUBHTMLGenerator::openFootnote(const RVNGPropertyList &) - { - if (m_impl->m_ignore) - return; -+ EPUBXMLSink &output = m_impl->output(); - m_impl->push(EPUBHTMLTextZone::Z_FootNote); -- m_impl->getSink().addLabel(m_impl->output()); -+ m_impl->getSink().addLabel(output); - } - - void EPUBHTMLGenerator::closeFootnote() -@@ -806,8 +794,9 @@ void EPUBHTMLGenerator::openEndnote(const RVNGPropertyList &) - { - if (m_impl->m_ignore) - return; -+ EPUBXMLSink &output = m_impl->output(); - m_impl->push(EPUBHTMLTextZone::Z_EndNote); -- m_impl->getSink().addLabel(m_impl->output()); -+ m_impl->getSink().addLabel(output); - } - - void EPUBHTMLGenerator::closeEndnote() -@@ -821,8 +810,9 @@ void EPUBHTMLGenerator::openComment(const RVNGPropertyList & /*propList*/) - { - if (m_impl->m_ignore) - return; -+ EPUBXMLSink &output = m_impl->output(); - m_impl->push(EPUBHTMLTextZone::Z_Comment); -- m_impl->getSink().addLabel(m_impl->output()); -+ m_impl->getSink().addLabel(output); - } - - void EPUBHTMLGenerator::closeComment() -diff --git a/src/lib/EPUBXMLSink.cpp b/src/lib/EPUBXMLSink.cpp -index 7c12c6d..db480d7 100644 ---- a/src/lib/EPUBXMLSink.cpp -+++ b/src/lib/EPUBXMLSink.cpp -@@ -155,6 +155,11 @@ void EPUBXMLSink::append(const EPUBXMLSink &other) - m_elements.insert(m_elements.end(), other.m_elements.begin(), other.m_elements.end()); - } - -+bool EPUBXMLSink::empty() const -+{ -+ return m_elements.empty(); -+} -+ - void EPUBXMLSink::writeTo(EPUBPackage &package, const char *const name) - { - package.openXMLFile(name); -diff --git a/src/lib/EPUBXMLSink.h b/src/lib/EPUBXMLSink.h -index ea7ac7a..a2bf951 100644 ---- a/src/lib/EPUBXMLSink.h -+++ b/src/lib/EPUBXMLSink.h -@@ -40,6 +40,8 @@ public: - - void writeTo(EPUBPackage &package, const char *name); - -+ bool empty() const; -+ - private: - std::deque<EPUBXMLElementPtr_t> m_elements; - }; --- -2.13.6 - - -From 9c723bbe42673906d8d0faf5083a186cf86d05ce Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Thu, 23 Nov 2017 17:27:00 +0100 -Subject: [PATCH 2/4] EPUBHTMLGenerator: avoid <title> in EPUB3 XHTML content - documents - -- there were multiple of them, which is invalid -- just don't write them, content.opf has the same info ---- - src/lib/EPUBGenerator.cpp | 2 +- - src/lib/EPUBHTMLGenerator.cpp | 18 ++++++++++++------ - src/lib/EPUBHTMLGenerator.h | 2 +- - src/lib/EPUBHTMLManager.cpp | 4 ++-- - src/lib/EPUBHTMLManager.h | 2 +- - src/test/EPUBTextGeneratorTest.cpp | 5 ++++- - 6 files changed, 21 insertions(+), 12 deletions(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 1cb1112..571f0eb 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -117,7 +117,7 @@ void EPUBGenerator::startNewHtmlFile() - - m_splitGuard.onSplit(); - -- m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod); -+ m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_version); - - // restore state in the new file - m_currentHtml->startDocument(m_documentProps); -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 3c8862b..209e7e1 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -338,7 +338,7 @@ std::string EPUBHTMLTextZone::label(int id) const - struct EPUBHTMLGeneratorImpl - { - //! constructor -- EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod) -+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version) - : m_document(document) - , m_imageManager(imageManager) - , m_fontManager(fontManager) -@@ -351,6 +351,7 @@ struct EPUBHTMLGeneratorImpl - , m_actualPage(0) - , m_ignore(false) - , m_hasText(false) -+ , m_version(version) - , m_frameAnchorTypes() - , m_framePropertiesStack() - , m_stylesMethod(stylesMethod) -@@ -442,6 +443,7 @@ struct EPUBHTMLGeneratorImpl - bool m_ignore; - /// Does the currently opened paragraph have some text? - bool m_hasText; -+ int m_version; - - std::stack<std::string> m_frameAnchorTypes; - std::stack<RVNGPropertyList> m_framePropertiesStack; -@@ -458,8 +460,8 @@ private: - EPUBHTMLGeneratorImpl operator=(EPUBHTMLGeneratorImpl const &orig); - }; - --EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod) -- : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod)) -+EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version) -+ : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod, version)) - { - } - -@@ -509,14 +511,18 @@ void EPUBHTMLGenerator::endDocument() - htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml"); - m_impl->m_document.openElement("html", htmlAttrs); - m_impl->m_document.openElement("head", RVNGPropertyList()); -- m_impl->m_document.openElement("title", RVNGPropertyList()); -- m_impl->m_document.closeElement("title"); -+ if (m_impl->m_version != 30) -+ { -+ m_impl->m_document.openElement("title", RVNGPropertyList()); -+ m_impl->m_document.closeElement("title"); -+ } - RVNGPropertyList metaAttrs; - metaAttrs.insert("http-equiv", "content-type"); - metaAttrs.insert("content", "text/html; charset=UTF-8"); - m_impl->m_document.openElement("meta", metaAttrs); - m_impl->m_document.closeElement("meta"); -- m_impl->sendMetaData(m_impl->m_document); -+ if (m_impl->m_version != 30) -+ m_impl->sendMetaData(m_impl->m_document); - RVNGPropertyList linkAttrs; - linkAttrs.insert("href", m_impl->m_stylesheetPath.relativeTo(m_impl->m_path).str().c_str()); - linkAttrs.insert("type", "text/css"); -diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h -index 49f76a3..11f20cb 100644 ---- a/src/lib/EPUBHTMLGenerator.h -+++ b/src/lib/EPUBHTMLGenerator.h -@@ -31,7 +31,7 @@ class EPUBPath; - class EPUBHTMLGenerator : public librevenge::RVNGTextInterface - { - public: -- EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod); -+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version); - ~EPUBHTMLGenerator() override; - - void setDocumentMetaData(const librevenge::RVNGPropertyList &propList) override; -diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp -index 9d4c507..d2c21da 100644 ---- a/src/lib/EPUBHTMLManager.cpp -+++ b/src/lib/EPUBHTMLManager.cpp -@@ -41,7 +41,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest) - { - } - --const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod) -+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version) - { - std::ostringstream nameBuf; - nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next(); -@@ -55,7 +55,7 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana - m_contents.push_back(EPUBXMLSink()); - - const EPUBHTMLGeneratorPtr_t gen( -- new EPUBHTMLGenerator(m_contents.back(), imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod)); -+ new EPUBHTMLGenerator(m_contents.back(), imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod, version)); - - return gen; - } -diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h -index ef56a52..e1205e6 100644 ---- a/src/lib/EPUBHTMLManager.h -+++ b/src/lib/EPUBHTMLManager.h -@@ -41,7 +41,7 @@ class EPUBHTMLManager - public: - explicit EPUBHTMLManager(EPUBManifest &manifest); - -- const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod); -+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version); - - void writeTo(EPUBPackage &package); - --- -2.13.6 - - -From 502948041df07729572bf4f2b222e03073baa6c8 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 24 Nov 2017 10:29:15 +0100 -Subject: [PATCH 3/4] EPUBHTMLGenerator: implement EPUB3 footnote markup - -The main difference is that in the EPUB3 case the footnote has an -explicit end. ---- - src/lib/EPUBHTMLGenerator.cpp | 56 ++++++++++++++++++++++++++++---------- - src/test/EPUBTextGeneratorTest.cpp | 26 ++++++++++++++++++ - 2 files changed, 68 insertions(+), 14 deletions(-) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 209e7e1..96e7623 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -122,7 +122,7 @@ struct EPUBHTMLTextZone - //! the different zone - enum Type { Z_Comment=0, Z_EndNote, Z_FootNote, Z_Main, Z_MetaData, Z_TextBox, Z_Unknown, Z_NumZones= Z_Unknown+1}; - //! constructor for basic stream -- EPUBHTMLTextZone(Type tp=Z_Unknown) : m_type(tp), m_actualId(0), m_zoneSinks() -+ EPUBHTMLTextZone(Type tp=Z_Unknown) : m_type(tp), m_actualId(0), m_zoneSinks(), m_version(20) - { - } - //! the type -@@ -135,6 +135,14 @@ struct EPUBHTMLTextZone - { - m_type=tp; - } -+ void setVersion(int version) -+ { -+ m_version = version; -+ } -+ int getVersion() const -+ { -+ return m_version; -+ } - //! returns a new sink corresponding to this zone - std::unique_ptr<TextZoneSink> getNewSink(); - //! returns true if there is no data -@@ -150,7 +158,7 @@ struct EPUBHTMLTextZone - { - if (isEmpty() || m_type==Z_Unknown || m_type==Z_Main) - return; -- if (m_type!=Z_MetaData) -+ if (m_type!=Z_MetaData && m_version < 30) - { - out.openElement("hr", RVNGPropertyList()); - out.closeElement("hr"); -@@ -197,6 +205,7 @@ protected: - mutable int m_actualId; - //! the list of data string - std::vector<ZoneSinkImpl> m_zoneSinks; -+ int m_version; - private: - EPUBHTMLTextZone(EPUBHTMLTextZone const &orig); - EPUBHTMLTextZone operator=(EPUBHTMLTextZone const &orig); -@@ -218,11 +227,16 @@ struct TextZoneSink - std::string lbl=label(); - if (!lbl.length()) - return; -+ int version = 20; -+ if (m_zone) -+ version = m_zone->getVersion(); - { - RVNGPropertyList supAttrs; - supAttrs.insert("id", ("called" + lbl).c_str()); - output.openElement("sup", supAttrs); - RVNGPropertyList aAttrs; -+ if (version == 30) -+ aAttrs.insert("epub:type", "noteref"); - aAttrs.insert("href", ("#data" + lbl).c_str()); - output.openElement("a", aAttrs); - output.insertCharacters(lbl.c_str()); -@@ -230,17 +244,23 @@ struct TextZoneSink - output.closeElement("sup"); - } - flush(); -+ if (version == 30) - { -- RVNGPropertyList supAttrs; -- supAttrs.insert("id", ("data" + lbl).c_str()); -- m_delayedLabel.openElement("sup", supAttrs); -- RVNGPropertyList aAttrs; -- aAttrs.insert("href", ("#called" + lbl).c_str()); -- m_delayedLabel.openElement("a", aAttrs); -- m_delayedLabel.insertCharacters(lbl.c_str()); -- m_delayedLabel.closeElement("a"); -- m_delayedLabel.closeElement("sup"); -+ RVNGPropertyList asideAttrs; -+ asideAttrs.insert("epub:type", "footnote"); -+ asideAttrs.insert("id", ("data" + lbl).c_str()); -+ m_sink.openElement("aside", asideAttrs); - } -+ RVNGPropertyList supAttrs; -+ if (version < 30) -+ supAttrs.insert("id", ("data" + lbl).c_str()); -+ m_delayedLabel.openElement("sup", supAttrs); -+ RVNGPropertyList aAttrs; -+ aAttrs.insert("href", ("#called" + lbl).c_str()); -+ m_delayedLabel.openElement("a", aAttrs); -+ m_delayedLabel.insertCharacters(lbl.c_str()); -+ m_delayedLabel.closeElement("a"); -+ m_delayedLabel.closeElement("sup"); - } - //! flush delayed label, ... - void flush() -@@ -359,7 +379,10 @@ struct EPUBHTMLGeneratorImpl - , m_sinkStack() - { - for (int i = 0; i < EPUBHTMLTextZone::Z_NumZones; ++i) -+ { - m_zones[i].setType(EPUBHTMLTextZone::Type(i)); -+ m_zones[i].setVersion(version); -+ } - m_actualSink=m_zones[EPUBHTMLTextZone::Z_Main].getNewSink(); - } - //! destructor -@@ -511,7 +534,7 @@ void EPUBHTMLGenerator::endDocument() - htmlAttrs.insert("xmlns", "http://www.w3.org/1999/xhtml"); - m_impl->m_document.openElement("html", htmlAttrs); - m_impl->m_document.openElement("head", RVNGPropertyList()); -- if (m_impl->m_version != 30) -+ if (m_impl->m_version < 30) - { - m_impl->m_document.openElement("title", RVNGPropertyList()); - m_impl->m_document.closeElement("title"); -@@ -521,7 +544,7 @@ void EPUBHTMLGenerator::endDocument() - metaAttrs.insert("content", "text/html; charset=UTF-8"); - m_impl->m_document.openElement("meta", metaAttrs); - m_impl->m_document.closeElement("meta"); -- if (m_impl->m_version != 30) -+ if (m_impl->m_version < 30) - m_impl->sendMetaData(m_impl->m_document); - RVNGPropertyList linkAttrs; - linkAttrs.insert("href", m_impl->m_stylesheetPath.relativeTo(m_impl->m_path).str().c_str()); -@@ -529,7 +552,10 @@ void EPUBHTMLGenerator::endDocument() - linkAttrs.insert("rel", "stylesheet"); - m_impl->m_document.insertEmptyElement("link", linkAttrs); - m_impl->m_document.closeElement("head"); -- m_impl->m_document.openElement("body", RVNGPropertyList()); -+ RVNGPropertyList bodyAttrs; -+ if (m_impl->m_version == 30) -+ bodyAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops"); -+ m_impl->m_document.openElement("body", bodyAttrs); - m_impl->flushUnsent(m_impl->m_document); - m_impl->m_document.closeElement("body"); - m_impl->m_document.closeElement("html"); -@@ -793,6 +819,8 @@ void EPUBHTMLGenerator::closeFootnote() - { - if (m_impl->m_ignore) - return; -+ if (m_impl->m_version == 30) -+ m_impl->output().closeElement("aside"); - m_impl->pop(); - } - --- -2.13.6 - - -From a8444b113df52769849ad45ea440def8d1884b15 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 24 Nov 2017 11:10:34 +0100 -Subject: [PATCH 4/4] EPUBHTMLGenerator: implement custom footnote anchor text - -Try to avoid our default F<N> anchor text if possible, which only makes -sense in English. ---- - src/lib/EPUBHTMLGenerator.cpp | 22 +++++++++++++++------- - src/test/EPUBTextGeneratorTest.cpp | 25 +++++++++++++++++++++++++ - 2 files changed, 40 insertions(+), 7 deletions(-) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 96e7623..6b4c7c2 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -222,9 +222,14 @@ struct TextZoneSink - //! destructor - ~TextZoneSink() { } - //! add a label called on main and a label in this ( delayed to allow openParagraph to be called ) -- void addLabel(EPUBXMLSink &output) -+ void addLabel(EPUBXMLSink &output, const librevenge::RVNGString &number) - { -+ // Unique label, e.g. 'F1' for the first footnote. - std::string lbl=label(); -+ // User-visible label, e.g. '1'. -+ std::string uiLabel = lbl; -+ if (!number.empty()) -+ uiLabel = number.cstr(); - if (!lbl.length()) - return; - int version = 20; -@@ -239,7 +244,7 @@ struct TextZoneSink - aAttrs.insert("epub:type", "noteref"); - aAttrs.insert("href", ("#data" + lbl).c_str()); - output.openElement("a", aAttrs); -- output.insertCharacters(lbl.c_str()); -+ output.insertCharacters(uiLabel.c_str()); - output.closeElement("a"); - output.closeElement("sup"); - } -@@ -258,7 +263,7 @@ struct TextZoneSink - RVNGPropertyList aAttrs; - aAttrs.insert("href", ("#called" + lbl).c_str()); - m_delayedLabel.openElement("a", aAttrs); -- m_delayedLabel.insertCharacters(lbl.c_str()); -+ m_delayedLabel.insertCharacters(uiLabel.c_str()); - m_delayedLabel.closeElement("a"); - m_delayedLabel.closeElement("sup"); - } -@@ -806,13 +811,16 @@ void EPUBHTMLGenerator::closeListElement() - m_impl->output().closeElement("li"); - } - --void EPUBHTMLGenerator::openFootnote(const RVNGPropertyList &) -+void EPUBHTMLGenerator::openFootnote(const RVNGPropertyList &propList) - { - if (m_impl->m_ignore) - return; - EPUBXMLSink &output = m_impl->output(); - m_impl->push(EPUBHTMLTextZone::Z_FootNote); -- m_impl->getSink().addLabel(output); -+ librevenge::RVNGString number; -+ if (const librevenge::RVNGProperty *numProp = propList["librevenge:number"]) -+ number = numProp->getStr(); -+ m_impl->getSink().addLabel(output, number); - } - - void EPUBHTMLGenerator::closeFootnote() -@@ -830,7 +838,7 @@ void EPUBHTMLGenerator::openEndnote(const RVNGPropertyList &) - return; - EPUBXMLSink &output = m_impl->output(); - m_impl->push(EPUBHTMLTextZone::Z_EndNote); -- m_impl->getSink().addLabel(output); -+ m_impl->getSink().addLabel(output, librevenge::RVNGString()); - } - - void EPUBHTMLGenerator::closeEndnote() -@@ -846,7 +854,7 @@ void EPUBHTMLGenerator::openComment(const RVNGPropertyList & /*propList*/) - return; - EPUBXMLSink &output = m_impl->output(); - m_impl->push(EPUBHTMLTextZone::Z_Comment); -- m_impl->getSink().addLabel(output); -+ m_impl->getSink().addLabel(output, librevenge::RVNGString()); - } - - void EPUBHTMLGenerator::closeComment() --- -2.13.6 - -From bc80bf98172e8e0f8c803dec0b8e74e233ac482e Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 24 Nov 2017 16:28:58 +0100 -Subject: [PATCH 1/2] EPUBHTMLGenerator: support image popup for images - -If the user of the lib uses the librevenge:mime-type and -office:binary-data keys (instead of xlink:href) for a link around an -image, then open that image in a popup (using the footnote markup). - -The usual assumption is that the footnote anchor is trivial (just a -string) and the content is complex, but here the situation is the -opposite: the anchor can be something complex, OTOH the footnote content -is always a single inline image -- this requires the new -closeAnchor mode when adding the footnote label. ---- - src/lib/EPUBHTMLGenerator.cpp | 79 ++++++++++++++++++++++++++++++-------- - src/test/EPUBTextGeneratorTest.cpp | 34 ++++++++++++++++ - 2 files changed, 96 insertions(+), 17 deletions(-) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 6b4c7c2..75b0866 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -222,7 +222,8 @@ struct TextZoneSink - //! destructor - ~TextZoneSink() { } - //! add a label called on main and a label in this ( delayed to allow openParagraph to be called ) -- void addLabel(EPUBXMLSink &output, const librevenge::RVNGString &number) -+ //! @param closeAnchor determintes if the anchor on the main sink should be closed or not. -+ void addLabel(EPUBXMLSink &output, const librevenge::RVNGString &number, bool closeAnchor) - { - // Unique label, e.g. 'F1' for the first footnote. - std::string lbl=label(); -@@ -244,9 +245,12 @@ struct TextZoneSink - aAttrs.insert("epub:type", "noteref"); - aAttrs.insert("href", ("#data" + lbl).c_str()); - output.openElement("a", aAttrs); -- output.insertCharacters(uiLabel.c_str()); -- output.closeElement("a"); -- output.closeElement("sup"); -+ if (closeAnchor) -+ { -+ output.insertCharacters(uiLabel.c_str()); -+ output.closeElement("a"); -+ output.closeElement("sup"); -+ } - } - flush(); - if (version == 30) -@@ -259,13 +263,16 @@ struct TextZoneSink - RVNGPropertyList supAttrs; - if (version < 30) - supAttrs.insert("id", ("data" + lbl).c_str()); -- m_delayedLabel.openElement("sup", supAttrs); -- RVNGPropertyList aAttrs; -- aAttrs.insert("href", ("#called" + lbl).c_str()); -- m_delayedLabel.openElement("a", aAttrs); -- m_delayedLabel.insertCharacters(uiLabel.c_str()); -- m_delayedLabel.closeElement("a"); -- m_delayedLabel.closeElement("sup"); -+ if (closeAnchor) -+ { -+ m_delayedLabel.openElement("sup", supAttrs); -+ RVNGPropertyList aAttrs; -+ aAttrs.insert("href", ("#called" + lbl).c_str()); -+ m_delayedLabel.openElement("a", aAttrs); -+ m_delayedLabel.insertCharacters(uiLabel.c_str()); -+ m_delayedLabel.closeElement("a"); -+ m_delayedLabel.closeElement("sup"); -+ } - } - //! flush delayed label, ... - void flush() -@@ -379,6 +386,7 @@ struct EPUBHTMLGeneratorImpl - , m_version(version) - , m_frameAnchorTypes() - , m_framePropertiesStack() -+ , m_linkPropertiesStack() - , m_stylesMethod(stylesMethod) - , m_actualSink() - , m_sinkStack() -@@ -475,6 +483,8 @@ struct EPUBHTMLGeneratorImpl - - std::stack<std::string> m_frameAnchorTypes; - std::stack<RVNGPropertyList> m_framePropertiesStack; -+ /// This is used for links which don't have a href. -+ std::stack<RVNGPropertyList> m_linkPropertiesStack; - - EPUBStylesMethod m_stylesMethod; - -@@ -702,14 +712,29 @@ void EPUBHTMLGenerator::openLink(const RVNGPropertyList &propList) - - attrs.insert("href", href.c_str()); - } -- m_impl->output(false).openElement("a", attrs); -+ const librevenge::RVNGProperty *binaryDataProp = propList["office:binary-data"]; -+ const librevenge::RVNGProperty *mimeTypeProp = propList["librevenge:mime-type"]; -+ if (binaryDataProp && mimeTypeProp) -+ { -+ // This is not a real link, but more an additional image on top of an -+ // existing one, map it to footnotes instead. -+ RVNGPropertyList linkProperties; -+ linkProperties.insert("office:binary-data", binaryDataProp->clone()); -+ linkProperties.insert("librevenge:mime-type", mimeTypeProp->clone()); -+ m_impl->m_linkPropertiesStack.push(linkProperties); -+ } -+ else -+ m_impl->output(false).openElement("a", attrs); - } - - void EPUBHTMLGenerator::closeLink() - { - if (m_impl->m_ignore) - return; -- m_impl->output().closeElement("a"); -+ if (!m_impl->m_linkPropertiesStack.empty()) -+ m_impl->m_linkPropertiesStack.pop(); -+ else -+ m_impl->output().closeElement("a"); - } - - void EPUBHTMLGenerator::insertTab() -@@ -820,7 +845,8 @@ void EPUBHTMLGenerator::openFootnote(const RVNGPropertyList &propList) - librevenge::RVNGString number; - if (const librevenge::RVNGProperty *numProp = propList["librevenge:number"]) - number = numProp->getStr(); -- m_impl->getSink().addLabel(output, number); -+ bool closeAnchor = m_impl->m_linkPropertiesStack.empty(); -+ m_impl->getSink().addLabel(output, number, closeAnchor); - } - - void EPUBHTMLGenerator::closeFootnote() -@@ -838,7 +864,7 @@ void EPUBHTMLGenerator::openEndnote(const RVNGPropertyList &) - return; - EPUBXMLSink &output = m_impl->output(); - m_impl->push(EPUBHTMLTextZone::Z_EndNote); -- m_impl->getSink().addLabel(output, librevenge::RVNGString()); -+ m_impl->getSink().addLabel(output, librevenge::RVNGString(), true); - } - - void EPUBHTMLGenerator::closeEndnote() -@@ -854,7 +880,7 @@ void EPUBHTMLGenerator::openComment(const RVNGPropertyList & /*propList*/) - return; - EPUBXMLSink &output = m_impl->output(); - m_impl->push(EPUBHTMLTextZone::Z_Comment); -- m_impl->getSink().addLabel(output, librevenge::RVNGString()); -+ m_impl->getSink().addLabel(output, librevenge::RVNGString(), true); - } - - void EPUBHTMLGenerator::closeComment() -@@ -1067,7 +1093,26 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str()); - // FIXME: use alternative repr. if available - attrs.insert("alt", path.str().c_str()); -- m_impl->output().insertEmptyElement("img", attrs); -+ if (!m_impl->m_linkPropertiesStack.empty()) -+ { -+ RVNGPropertyList &linkProperties = m_impl->m_linkPropertiesStack.top(); -+ // Save the main sink, as m_impl->output() will point to the footnote sink. -+ libepubgen::EPUBXMLSink &main = m_impl->output(); -+ openFootnote(RVNGPropertyList()); -+ main.insertEmptyElement("img", attrs); -+ main.closeElement("a"); -+ main.closeElement("sup"); -+ const EPUBPath &linkPath = m_impl->m_imageManager.insert( -+ RVNGBinaryData(linkProperties["office:binary-data"]->getStr()), -+ linkProperties["librevenge:mime-type"]->getStr()); -+ RVNGPropertyList linkAttrs; -+ linkAttrs.insert("src", linkPath.relativeTo(m_impl->m_path).str().c_str()); -+ linkAttrs.insert("alt", linkPath.str().c_str()); -+ m_impl->output().insertEmptyElement("img", linkAttrs); -+ closeFootnote(); -+ } -+ else -+ m_impl->output().insertEmptyElement("img", attrs); - - if (!wrapStyle.empty()) - { --- -2.13.6 - - -From 6e094bbe9fd8c1784ef3c348d04e2add8b48fc67 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Fri, 24 Nov 2017 17:18:53 +0100 -Subject: [PATCH 2/2] EPUBHTMLGenerator: support image popup for text - -And also make sure that the popup anchor is not superscript. ---- - src/lib/EPUBHTMLGenerator.cpp | 44 ++++++++++++++++++++++++++------------ - src/lib/EPUBHTMLGenerator.h | 4 ++++ - src/test/EPUBTextGeneratorTest.cpp | 31 ++++++++++++++++++++++++++- - 3 files changed, 64 insertions(+), 15 deletions(-) - -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 75b0866..5c6421c 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -239,7 +239,8 @@ struct TextZoneSink - { - RVNGPropertyList supAttrs; - supAttrs.insert("id", ("called" + lbl).c_str()); -- output.openElement("sup", supAttrs); -+ if (closeAnchor) -+ output.openElement("sup", supAttrs); - RVNGPropertyList aAttrs; - if (version == 30) - aAttrs.insert("epub:type", "noteref"); -@@ -769,7 +770,9 @@ void EPUBHTMLGenerator::insertText(const RVNGString &text) - { - if (m_impl->m_ignore) - return; -- m_impl->output().insertCharacters(text); -+ EPUBXMLSink &sink = openPopup(); -+ sink.insertCharacters(text); -+ closePopup(sink); - m_impl->m_hasText = true; - } - -@@ -1093,15 +1096,37 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - attrs.insert("src", path.relativeTo(m_impl->m_path).str().c_str()); - // FIXME: use alternative repr. if available - attrs.insert("alt", path.str().c_str()); -+ EPUBXMLSink &sink = openPopup(); -+ sink.insertEmptyElement("img", attrs); -+ closePopup(sink); -+ -+ if (!wrapStyle.empty()) -+ { -+ attrs.clear(); -+ attrs.insert("style", wrapStyle); -+ m_impl->output().insertEmptyElement("br", attrs); -+ } -+} -+ -+EPUBXMLSink &EPUBHTMLGenerator::openPopup() -+{ - if (!m_impl->m_linkPropertiesStack.empty()) - { -- RVNGPropertyList &linkProperties = m_impl->m_linkPropertiesStack.top(); - // Save the main sink, as m_impl->output() will point to the footnote sink. - libepubgen::EPUBXMLSink &main = m_impl->output(); - openFootnote(RVNGPropertyList()); -- main.insertEmptyElement("img", attrs); -+ return main; -+ } -+ else -+ return m_impl->output(); -+} -+ -+void EPUBHTMLGenerator::closePopup(EPUBXMLSink &main) -+{ -+ if (!m_impl->m_linkPropertiesStack.empty()) -+ { -+ RVNGPropertyList &linkProperties = m_impl->m_linkPropertiesStack.top(); - main.closeElement("a"); -- main.closeElement("sup"); - const EPUBPath &linkPath = m_impl->m_imageManager.insert( - RVNGBinaryData(linkProperties["office:binary-data"]->getStr()), - linkProperties["librevenge:mime-type"]->getStr()); -@@ -1111,15 +1136,6 @@ void EPUBHTMLGenerator::insertBinaryObject(const RVNGPropertyList &propList) - m_impl->output().insertEmptyElement("img", linkAttrs); - closeFootnote(); - } -- else -- m_impl->output().insertEmptyElement("img", attrs); -- -- if (!wrapStyle.empty()) -- { -- attrs.clear(); -- attrs.insert("style", wrapStyle); -- m_impl->output().insertEmptyElement("br", attrs); -- } - } - - void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {} -diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h -index 11f20cb..3699179 100644 ---- a/src/lib/EPUBHTMLGenerator.h -+++ b/src/lib/EPUBHTMLGenerator.h -@@ -27,6 +27,7 @@ class EPUBSpanStyleManager; - class EPUBParagraphStyleManager; - class EPUBTableStyleManager; - class EPUBPath; -+class EPUBXMLSink; - - class EPUBHTMLGenerator : public librevenge::RVNGTextInterface - { -@@ -112,6 +113,9 @@ public: - void insertEquation(const librevenge::RVNGPropertyList &propList) override; - - private: -+ EPUBXMLSink &openPopup(); -+ void closePopup(EPUBXMLSink &main); -+ - std::unique_ptr<EPUBHTMLGeneratorImpl> m_impl; - - // Unimplemented to prevent compiler from creating crasher ones --- -2.13.6 - -From bd49e1672d0e914736824dadc8f89c26ae955088 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Tue, 28 Nov 2017 14:50:34 +0100 -Subject: [PATCH] [ABI CHANGE] optionally support the EPUB3 fixed layout - -Default is still the reflowable method, of course. ---- - inc/libepubgen/EPUBTextGenerator.h | 1 + - inc/libepubgen/libepubgen-decls.h | 8 ++++++++ - src/lib/EPUBGenerator.cpp | 17 +++++++++++++++- - src/lib/EPUBGenerator.h | 3 +++ - src/lib/EPUBHTMLGenerator.cpp | 41 ++++++++++++++++++++++++++++++++++---- - src/lib/EPUBHTMLGenerator.h | 2 +- - src/lib/EPUBHTMLManager.cpp | 4 ++-- - src/lib/EPUBHTMLManager.h | 2 +- - src/lib/EPUBTextGenerator.cpp | 5 +++++ - src/test/EPUBTextGeneratorTest.cpp | 27 +++++++++++++++++++++++++ - 10 files changed, 101 insertions(+), 9 deletions(-) - -diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h -index cb2d9a6..beb05aa 100644 ---- a/inc/libepubgen/EPUBTextGenerator.h -+++ b/inc/libepubgen/EPUBTextGenerator.h -@@ -43,6 +43,7 @@ public: - void setSplitHeadingLevel(unsigned level); - void setSplitSize(unsigned size); - void setStylesMethod(EPUBStylesMethod styles); -+ void setLayoutMethod(EPUBLayoutMethod layout); - - /** Register a handler for embedded images. - * -diff --git a/inc/libepubgen/libepubgen-decls.h b/inc/libepubgen/libepubgen-decls.h -index 2657a2d..3eb206e 100644 ---- a/inc/libepubgen/libepubgen-decls.h -+++ b/inc/libepubgen/libepubgen-decls.h -@@ -69,6 +69,14 @@ enum EPUBStylesMethod - EPUB_STYLES_METHOD_INLINE, //< The styles will be described inline. - }; - -+/** The possible ways to lay out HTML files. -+ */ -+enum EPUBLayoutMethod -+{ -+ EPUB_LAYOUT_METHOD_REFLOWABLE, //< Dynamic pagination. -+ EPUB_LAYOUT_METHOD_FIXED, //< Exactly one page per HTML file. -+}; -+ - } - - #endif // INCLUDED_LIBEPUBGEN_LIBEPUBGEN_DECLS_H -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 571f0eb..4a62d7f 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -47,6 +47,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s - , m_splitGuard(split) - , m_version(version) - , m_stylesMethod(EPUB_STYLES_METHOD_CSS) -+ , m_layoutMethod(EPUB_LAYOUT_METHOD_REFLOWABLE) - { - } - -@@ -117,7 +118,7 @@ void EPUBGenerator::startNewHtmlFile() - - m_splitGuard.onSplit(); - -- m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_version); -+ m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_layoutMethod, m_version); - - // restore state in the new file - m_currentHtml->startDocument(m_documentProps); -@@ -156,6 +157,11 @@ void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles) - m_stylesMethod = styles; - } - -+void EPUBGenerator::setLayoutMethod(EPUBLayoutMethod layout) -+{ -+ m_layoutMethod = layout; -+} -+ - void EPUBGenerator::writeContainer() - { - EPUBXMLSink sink; -@@ -362,6 +368,15 @@ void EPUBGenerator::writeRoot() - metaAttrs.insert("content", generator.c_str()); - sink.openElement("meta", metaAttrs); - sink.closeElement("meta"); -+ -+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED) -+ { -+ metaAttrs.clear(); -+ metaAttrs.insert("property", "rendition:layout"); -+ sink.openElement("meta", metaAttrs); -+ sink.insertCharacters("pre-paginated"); -+ sink.closeElement("meta"); -+ } - } - - sink.closeElement("metadata"); -diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h -index abc6a9a..5a0df86 100644 ---- a/src/lib/EPUBGenerator.h -+++ b/src/lib/EPUBGenerator.h -@@ -53,6 +53,8 @@ public: - - void setStylesMethod(EPUBStylesMethod stylesMethod); - -+ void setLayoutMethod(EPUBLayoutMethod layoutMethod); -+ - private: - virtual void startHtmlFile() = 0; - virtual void endHtmlFile() = 0; -@@ -84,6 +86,7 @@ private: - - int m_version; - EPUBStylesMethod m_stylesMethod; -+ EPUBLayoutMethod m_layoutMethod; - }; - - } -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 5c6421c..4260858 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -7,6 +7,7 @@ - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -+#include <cmath> - #include <memory> - #include <sstream> - #include <stack> -@@ -107,6 +108,11 @@ bool ZoneSinkImpl::endsInLineBreak() const - ; - } - -+/// Convers inches to CSS pixels. -+int inchToCSSPixel(const librevenge::RVNGProperty *property) -+{ -+ return round(property->getDouble() * 96); -+} - } - - namespace -@@ -371,7 +377,7 @@ std::string EPUBHTMLTextZone::label(int id) const - struct EPUBHTMLGeneratorImpl - { - //! constructor -- EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version) -+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version) - : m_document(document) - , m_imageManager(imageManager) - , m_fontManager(fontManager) -@@ -382,6 +388,7 @@ struct EPUBHTMLGeneratorImpl - , m_path(path) - , m_stylesheetPath(stylesheetPath) - , m_actualPage(0) -+ , m_actualPageProperties() - , m_ignore(false) - , m_hasText(false) - , m_version(version) -@@ -389,6 +396,7 @@ struct EPUBHTMLGeneratorImpl - , m_framePropertiesStack() - , m_linkPropertiesStack() - , m_stylesMethod(stylesMethod) -+ , m_layoutMethod(layoutMethod) - , m_actualSink() - , m_sinkStack() - { -@@ -477,6 +485,7 @@ struct EPUBHTMLGeneratorImpl - const EPUBPath m_stylesheetPath; - - int m_actualPage; -+ RVNGPropertyList m_actualPageProperties; - bool m_ignore; - /// Does the currently opened paragraph have some text? - bool m_hasText; -@@ -488,6 +497,7 @@ struct EPUBHTMLGeneratorImpl - std::stack<RVNGPropertyList> m_linkPropertiesStack; - - EPUBStylesMethod m_stylesMethod; -+ EPUBLayoutMethod m_layoutMethod; - - protected: - std::unique_ptr<TextZoneSink> m_actualSink; -@@ -499,8 +509,8 @@ private: - EPUBHTMLGeneratorImpl operator=(EPUBHTMLGeneratorImpl const &orig); - }; - --EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version) -- : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod, version)) -+EPUBHTMLGenerator::EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version) -+ : m_impl(new EPUBHTMLGeneratorImpl(document, imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, path, stylesheetPath, stylesMethod, layoutMethod, version)) - { - } - -@@ -560,6 +570,25 @@ void EPUBHTMLGenerator::endDocument() - metaAttrs.insert("content", "text/html; charset=UTF-8"); - m_impl->m_document.openElement("meta", metaAttrs); - m_impl->m_document.closeElement("meta"); -+ if (m_impl->m_version >= 30 && m_impl->m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED) -+ { -+ metaAttrs.clear(); -+ metaAttrs.insert("name", "viewport"); -+ std::stringstream content; -+ if (const librevenge::RVNGProperty *pageWidth = m_impl->m_actualPageProperties["fo:page-width"]) -+ { -+ content << "width="; -+ content << inchToCSSPixel(pageWidth); -+ } -+ if (const librevenge::RVNGProperty *pageHeight = m_impl->m_actualPageProperties["fo:page-height"]) -+ { -+ content << ", height="; -+ content << inchToCSSPixel(pageHeight); -+ } -+ metaAttrs.insert("content", content.str().c_str()); -+ m_impl->m_document.openElement("meta", metaAttrs); -+ m_impl->m_document.closeElement("meta"); -+ } - if (m_impl->m_version < 30) - m_impl->sendMetaData(m_impl->m_document); - RVNGPropertyList linkAttrs; -@@ -582,9 +611,13 @@ void EPUBHTMLGenerator::defineEmbeddedFont(const RVNGPropertyList &propList) - m_impl->m_fontManager.insert(propList, m_impl->m_path); - } - --void EPUBHTMLGenerator::openPageSpan(const RVNGPropertyList & /* propList */) -+void EPUBHTMLGenerator::openPageSpan(const RVNGPropertyList &propList) - { - m_impl->m_actualPage++; -+ -+ librevenge::RVNGPropertyList::Iter i(propList); -+ for (i.rewind(); i.next();) -+ m_impl->m_actualPageProperties.insert(i.key(), i()->clone()); - } - - void EPUBHTMLGenerator::closePageSpan() -diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h -index 3699179..3c6577f 100644 ---- a/src/lib/EPUBHTMLGenerator.h -+++ b/src/lib/EPUBHTMLGenerator.h -@@ -32,7 +32,7 @@ class EPUBXMLSink; - class EPUBHTMLGenerator : public librevenge::RVNGTextInterface - { - public: -- EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version); -+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version); - ~EPUBHTMLGenerator() override; - - void setDocumentMetaData(const librevenge::RVNGPropertyList &propList) override; -diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp -index d2c21da..363b33e 100644 ---- a/src/lib/EPUBHTMLManager.cpp -+++ b/src/lib/EPUBHTMLManager.cpp -@@ -41,7 +41,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest) - { - } - --const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version) -+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version) - { - std::ostringstream nameBuf; - nameBuf << "section" << std::setw(4) << std::setfill('0') << m_number.next(); -@@ -55,7 +55,7 @@ const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageMana - m_contents.push_back(EPUBXMLSink()); - - const EPUBHTMLGeneratorPtr_t gen( -- new EPUBHTMLGenerator(m_contents.back(), imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod, version)); -+ new EPUBHTMLGenerator(m_contents.back(), imageManager, fontManager, listStyleManager, paragraphStyleManager, spanStyleManager, tableStyleManager, m_paths.back(), stylesheetPath, stylesMethod, layoutMethod, version)); - - return gen; - } -diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h -index e1205e6..31e6dfe 100644 ---- a/src/lib/EPUBHTMLManager.h -+++ b/src/lib/EPUBHTMLManager.h -@@ -41,7 +41,7 @@ class EPUBHTMLManager - public: - explicit EPUBHTMLManager(EPUBManifest &manifest); - -- const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, int version); -+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBFontManager &fontManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager ¶graphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, EPUBStylesMethod stylesMethod, EPUBLayoutMethod layoutMethod, int version); - - void writeTo(EPUBPackage &package); - -diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp -index 5d4e8f2..c3bc963 100644 ---- a/src/lib/EPUBTextGenerator.cpp -+++ b/src/lib/EPUBTextGenerator.cpp -@@ -147,6 +147,11 @@ void EPUBTextGenerator::setStylesMethod(EPUBStylesMethod styles) - m_impl->setStylesMethod(styles); - } - -+void EPUBTextGenerator::setLayoutMethod(EPUBLayoutMethod layout) -+{ -+ m_impl->setLayoutMethod(layout); -+} -+ - void EPUBTextGenerator::registerEmbeddedImageHandler(const librevenge::RVNGString &mimeType, EPUBEmbeddedImage imageHandler) - { - if (!mimeType.empty() && imageHandler) --- -2.13.6 - -From 38aa728708641942371507b975193f0ab60f0b50 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 29 Nov 2017 11:00:32 +0100 -Subject: [PATCH] EPUBGenerator: fixed layout implies split on page break - ---- - Makefile.am | 3 +++ - src/lib/EPUBGenerator.cpp | 8 ++++++++ - src/lib/EPUBHTMLGenerator.cpp | 16 ++++++++++++++++ - src/lib/EPUBHTMLGenerator.h | 5 +++++ - src/lib/EPUBSplitGuard.cpp | 5 +++++ - src/lib/EPUBSplitGuard.h | 4 +++- - src/test/EPUBTextGeneratorTest.cpp | 31 +++++++++++++++++++++++++++++++ - 7 files changed, 71 insertions(+), 1 deletion(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 4a62d7f..f608331 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -118,7 +118,12 @@ void EPUBGenerator::startNewHtmlFile() - - m_splitGuard.onSplit(); - -+ librevenge::RVNGPropertyList pageProperties; -+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED && m_currentHtml) -+ m_currentHtml->getPageProperties(pageProperties); - m_currentHtml = m_htmlManager.create(m_imageManager, m_fontManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, m_stylesMethod, m_layoutMethod, m_version); -+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED) -+ m_currentHtml->setPageProperties(pageProperties); - - // restore state in the new file - m_currentHtml->startDocument(m_documentProps); -@@ -160,6 +165,9 @@ void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles) - void EPUBGenerator::setLayoutMethod(EPUBLayoutMethod layout) - { - m_layoutMethod = layout; -+ if (m_layoutMethod == EPUB_LAYOUT_METHOD_FIXED) -+ // Fixed layout implies split on page break. -+ m_splitGuard.setSplitMethod(EPUB_SPLIT_METHOD_PAGE_BREAK); - } - - void EPUBGenerator::writeContainer() -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 4260858..7a53ce3 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -1173,6 +1173,22 @@ void EPUBHTMLGenerator::closePopup(EPUBXMLSink &main) - - void EPUBHTMLGenerator::insertEquation(const RVNGPropertyList & /* propList */) {} - -+void EPUBHTMLGenerator::getPageProperties(librevenge::RVNGPropertyList &propList) const -+{ -+ propList.clear(); -+ librevenge::RVNGPropertyList::Iter i(m_impl->m_actualPageProperties); -+ for (i.rewind(); i.next();) -+ propList.insert(i.key(), i()->clone()); -+} -+ -+void EPUBHTMLGenerator::setPageProperties(const librevenge::RVNGPropertyList &propList) -+{ -+ m_impl->m_actualPageProperties.clear(); -+ librevenge::RVNGPropertyList::Iter i(propList); -+ for (i.rewind(); i.next();) -+ m_impl->m_actualPageProperties.insert(i.key(), i()->clone()); -+} -+ - } - - /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ -diff --git a/src/lib/EPUBHTMLGenerator.h b/src/lib/EPUBHTMLGenerator.h -index 3c6577f..ef7d542 100644 ---- a/src/lib/EPUBHTMLGenerator.h -+++ b/src/lib/EPUBHTMLGenerator.h -@@ -112,6 +112,11 @@ public: - void insertBinaryObject(const librevenge::RVNGPropertyList &propList) override; - void insertEquation(const librevenge::RVNGPropertyList &propList) override; - -+ /// Gets the actual page properties into propList. -+ void getPageProperties(librevenge::RVNGPropertyList &propList) const; -+ /// Sets the actual page properties from propList. -+ void setPageProperties(const librevenge::RVNGPropertyList &propList); -+ - private: - EPUBXMLSink &openPopup(); - void closePopup(EPUBXMLSink &main); -diff --git a/src/lib/EPUBSplitGuard.cpp b/src/lib/EPUBSplitGuard.cpp -index 890500b..4f7531d 100644 ---- a/src/lib/EPUBSplitGuard.cpp -+++ b/src/lib/EPUBSplitGuard.cpp -@@ -40,6 +40,11 @@ void EPUBSplitGuard::setSplitSize(const unsigned size) - m_size = size; - } - -+void EPUBSplitGuard::setSplitMethod(EPUBSplitMethod method) -+{ -+ m_method = method; -+} -+ - void EPUBSplitGuard::openLevel() - { - ++m_nestingLevel; -diff --git a/src/lib/EPUBSplitGuard.h b/src/lib/EPUBSplitGuard.h -index 1a74079..ff55846 100644 ---- a/src/lib/EPUBSplitGuard.h -+++ b/src/lib/EPUBSplitGuard.h -@@ -23,6 +23,8 @@ public: - void setSplitHeadingLevel(unsigned level); - void setCurrentHeadingLevel(unsigned level); - void setSplitSize(unsigned size); -+ /// Allows overwriting the value given in the constructor. -+ void setSplitMethod(EPUBSplitMethod method); - - void openLevel(); - void closeLevel(); -@@ -39,7 +41,7 @@ private: - bool canSplit(EPUBSplitMethod method) const; - - private: -- const EPUBSplitMethod m_method; -+ EPUBSplitMethod m_method; - unsigned m_headingLevel; - unsigned m_currentHeadingLevel; - unsigned m_size; --- -2.13.6 - -From d9921c47befa3eabcfc916e26e273667232be637 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 29 Nov 2017 14:44:55 +0100 -Subject: [PATCH] EPUBTextGenerator: page-break=auto is not a page break - ---- - src/lib/EPUBTextGenerator.cpp | 14 ++++++++++++-- - src/test/EPUBTextGeneratorTest.cpp | 21 +++++++++++++++++++++ - 2 files changed, 33 insertions(+), 2 deletions(-) - -diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp -index c3bc963..02c299a 100644 ---- a/src/lib/EPUBTextGenerator.cpp -+++ b/src/lib/EPUBTextGenerator.cpp -@@ -53,6 +53,16 @@ bool operator!=(const char *const left, const RVNGString &right) - return right != left; - } - -+/// Determines if this break property a page break one. -+bool isPageBreak(const librevenge::RVNGProperty *property) -+{ -+ if (!property) -+ return false; -+ -+ librevenge::RVNGString str = property->getStr(); -+ return str != "column" && str != "auto"; -+} -+ - } - - struct EPUBTextGenerator::Impl : public EPUBGenerator -@@ -259,10 +269,10 @@ void EPUBTextGenerator::defineParagraphStyle(const librevenge::RVNGPropertyList - void EPUBTextGenerator::openParagraph(const librevenge::RVNGPropertyList &propList) - { - const RVNGProperty *const breakBefore = propList["fo:break-before"]; -- if (breakBefore && ("column" != breakBefore->getStr()) && m_impl->getSplitGuard().splitOnPageBreak()) -+ if (isPageBreak(breakBefore) && m_impl->getSplitGuard().splitOnPageBreak()) - m_impl->startNewHtmlFile(); - const RVNGProperty *const breakAfter = propList["fo:break-after"]; -- m_impl->m_breakAfterPara = breakAfter && ("column" != breakAfter->getStr()); -+ m_impl->m_breakAfterPara = isPageBreak(breakAfter); - if (m_impl->getSplitGuard().splitOnSize()) - m_impl->startNewHtmlFile(); - --- -2.13.6 - -From 88b9d9a1efb9b064ea99c57ec273f76712d361ff Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Thu, 30 Nov 2017 11:32:41 +0100 -Subject: [PATCH] EPUBTextGenerator: allow a single image on a page - ---- - src/lib/EPUBTextGenerator.cpp | 1 + - src/test/EPUBTextGeneratorTest.cpp | 24 ++++++++++++++++++++++++ - 2 files changed, 25 insertions(+) - -diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp -index 02c299a..38573ec 100644 ---- a/src/lib/EPUBTextGenerator.cpp -+++ b/src/lib/EPUBTextGenerator.cpp -@@ -684,6 +684,7 @@ void EPUBTextGenerator::insertBinaryObject(const librevenge::RVNGPropertyList &p - if (m_impl->m_inHeader || m_impl->m_inFooter) - m_impl->m_currentHeaderOrFooter->addInsertBinaryObject(newPropList); - -+ m_impl->getSplitGuard().incrementSize(1); - m_impl->getHtml()->insertBinaryObject(newPropList); - } - --- -2.13.6 - -diff --git a/NEWS b/NEWS -index 912efbc..ad3d4d1 100644 ---- a/NEWS -+++ b/NEWS -@@ -1,3 +1,13 @@ -+- Fix various validation problems, pointed out by epubcheck. -+- Add EPUB3 support. -+- Split on headings: add user-friendly section names. -+- Support writing CSS styles inline in the XHTML streams. -+- Support various image wrap types. -+- Support embedded fonts. -+- Support cover images. -+- Support footnotes. -+- Support EPUB3 fixed layout. -+ - libepubgen-0.0.1 - - - Fix escaping of HTML entities. -diff --git a/inc/libepubgen/EPUBDrawingGenerator.h b/inc/libepubgen/EPUBDrawingGenerator.h -index 963e3b8..8f14959 100644 ---- a/inc/libepubgen/EPUBDrawingGenerator.h -+++ b/inc/libepubgen/EPUBDrawingGenerator.h -@@ -36,13 +36,19 @@ public: - * - * @param[in] version possible values: 20, 30. - */ -- explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20); -+ explicit EPUBDrawingGenerator(EPUBPackage *package, int version = 30); - EPUBDrawingGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package); - ~EPUBDrawingGenerator() override; - - void setSplitHeadingLevel(unsigned level); - void setSplitSize(unsigned size); - -+ /** Set an option for the EPUB generator -+ * @param[in] key a value from the EPUBGeneratorOption enumeration -+ * @param[in] value depends on the value of key -+ */ -+ void setOption(int key, int value); -+ - /** Register a handler for embedded images. - * - * The handler must convert the image to one of the OPS Core Media Types. -diff --git a/inc/libepubgen/EPUBPresentationGenerator.h b/inc/libepubgen/EPUBPresentationGenerator.h -index 512c52d..b7ad190 100644 ---- a/inc/libepubgen/EPUBPresentationGenerator.h -+++ b/inc/libepubgen/EPUBPresentationGenerator.h -@@ -36,13 +36,19 @@ public: - * - * @param[in] version possible values: 20, 30. - */ -- explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20); -+ explicit EPUBPresentationGenerator(EPUBPackage *package, int version = 30); - EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package); - ~EPUBPresentationGenerator() override; - - void setSplitHeadingLevel(unsigned level); - void setSplitSize(unsigned size); - -+ /** Set an option for the EPUB generator -+ * @param[in] key a value from the EPUBGeneratorOption enumeration -+ * @param[in] value depends on the value of key -+ */ -+ void setOption(int key, int value); -+ - /** Register a handler for embedded images. - * - * The handler must convert the image to one of the OPS Core Media Types. -diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h -index beb05aa..809078a 100644 ---- a/inc/libepubgen/EPUBTextGenerator.h -+++ b/inc/libepubgen/EPUBTextGenerator.h -@@ -36,14 +36,19 @@ public: - * - * @param[in] version possible values: 20, 30. - */ -- explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20); -+ explicit EPUBTextGenerator(EPUBPackage *package, int version = 30); - EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package); - ~EPUBTextGenerator() override; - - void setSplitHeadingLevel(unsigned level); - void setSplitSize(unsigned size); -- void setStylesMethod(EPUBStylesMethod styles); -- void setLayoutMethod(EPUBLayoutMethod layout); -+ -+ /** Set an option for the EPUB generator -+ * -+ * @param[in] key a value from the EPUBGeneratorOption enumeration -+ * @param[in] value depends on the value of key -+ */ -+ void setOption(int key, int value); - - /** Register a handler for embedded images. - * -diff --git a/inc/libepubgen/libepubgen-decls.h b/inc/libepubgen/libepubgen-decls.h -index 3eb206e..490dbc3 100644 ---- a/inc/libepubgen/libepubgen-decls.h -+++ b/inc/libepubgen/libepubgen-decls.h -@@ -77,6 +77,15 @@ enum EPUBLayoutMethod - EPUB_LAYOUT_METHOD_FIXED, //< Exactly one page per HTML file. - }; - -+/** The possible options for a generator. -+ */ -+enum EPUBGeneratorOption -+{ -+ EPUB_GENERATOR_OPTION_SPLIT, //< EPUBSplitMethod. -+ EPUB_GENERATOR_OPTION_STYLES, //< EPUBStylesMethod. -+ EPUB_GENERATOR_OPTION_LAYOUT //< EPUBLayoutMethod. -+}; -+ - } - - #endif // INCLUDED_LIBEPUBGEN_LIBEPUBGEN_DECLS_H -diff --git a/src/lib/EPUBDrawingGenerator.cpp b/src/lib/EPUBDrawingGenerator.cpp -index bcb4994..aef43ad 100644 ---- a/src/lib/EPUBDrawingGenerator.cpp -+++ b/src/lib/EPUBDrawingGenerator.cpp -@@ -20,16 +20,16 @@ using librevenge::RVNGString; - class EPUBDrawingGenerator::Impl : public EPUBPagedGenerator - { - public: -- Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version); -+ Impl(EPUBPackage *const package, int version); - }; - --EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version) -- : EPUBPagedGenerator(package, method, version) -+EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, int version) -+ : EPUBPagedGenerator(package, version) - { - } - --EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split, int version) -- : m_impl(new Impl(package, split, version)) -+EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, int version) -+ : m_impl(new Impl(package, version)) - { - } - -@@ -51,6 +51,16 @@ void EPUBDrawingGenerator::setSplitHeadingLevel(const unsigned level) - m_impl->setSplitHeadingLevel(level); - } - -+void EPUBDrawingGenerator::setOption(int key, int value) -+{ -+ switch (key) -+ { -+ case EPUB_GENERATOR_OPTION_SPLIT: -+ m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value)); -+ break; -+ } -+} -+ - void EPUBDrawingGenerator::setSplitSize(const unsigned size) - { - m_impl->setSplitSize(size); -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index f608331..83f3f40 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -30,7 +30,7 @@ using librevenge::RVNGPropertyFactory; - using librevenge::RVNGPropertyList; - using librevenge::RVNGString; - --EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split, int version) -+EPUBGenerator::EPUBGenerator(EPUBPackage *const package, int version) - : m_package(package) - , m_manifest() - , m_htmlManager(m_manifest) -@@ -44,7 +44,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s - , m_documentProps() - , m_metadata() - , m_currentHtml() -- , m_splitGuard(split) -+ , m_splitGuard(EPUB_SPLIT_METHOD_PAGE_BREAK) - , m_version(version) - , m_stylesMethod(EPUB_STYLES_METHOD_CSS) - , m_layoutMethod(EPUB_LAYOUT_METHOD_REFLOWABLE) -@@ -61,7 +61,7 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props) - - startNewHtmlFile(); - -- if (m_version == 30) -+ if (m_version >= 30) - m_manifest.insert(EPUBPath("OEBPS/toc.xhtml"), "application/xhtml+xml", "toc.xhtml", "nav"); - m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", ""); - m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", ""); -@@ -88,7 +88,7 @@ void EPUBGenerator::setDocumentMetaData(const RVNGPropertyList &props) - { - m_metadata = props; - -- if (m_version == 30) -+ if (m_version >= 30) - { - const librevenge::RVNGPropertyListVector *coverImages = props.child("librevenge:cover-images"); - if (coverImages) -@@ -157,6 +157,11 @@ int EPUBGenerator::getVersion() const - return m_version; - } - -+void EPUBGenerator::setSplitMethod(EPUBSplitMethod split) -+{ -+ m_splitGuard.setSplitMethod(split); -+} -+ - void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles) - { - m_stylesMethod = styles; -@@ -195,7 +200,7 @@ void EPUBGenerator::writeContainer() - - void EPUBGenerator::writeNavigation() - { -- if (m_version == 30) -+ if (m_version >= 30) - { - EPUBXMLSink sink; - -@@ -214,7 +219,7 @@ void EPUBGenerator::writeNavigation() - sink.openElement("nav", navAttrs); - - sink.openElement("ol"); -- m_htmlManager.writeTocTo(sink, path, m_version); -+ m_htmlManager.writeTocTo(sink, path, m_version, m_layoutMethod); - sink.closeElement("ol"); - - sink.closeElement("nav"); -@@ -248,7 +253,7 @@ void EPUBGenerator::writeNavigation() - sink.openElement("navMap"); - // In case of EPUB3 the (deprecated, but valid) EPUB2 markup is wanted, so - // the version is unconditional here. -- m_htmlManager.writeTocTo(sink, path, /*version=*/20); -+ m_htmlManager.writeTocTo(sink, path, /*version=*/20, m_layoutMethod); - sink.closeElement("navMap"); - - sink.closeElement("ncx"); -@@ -281,7 +286,7 @@ void EPUBGenerator::writeRoot() - packageAttrs.insert("xmlns:dc", "http://purl.org/dc/elements/1.1/"); - packageAttrs.insert("xmlns:dcterms", "http://purl.org/dc/terms/"); - packageAttrs.insert("xmlns:opf", "http://www.idpf.org/2007/opf"); -- if (m_version == 30) -+ if (m_version >= 30) - packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("3.0")); - else - packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0")); -@@ -326,7 +331,7 @@ void EPUBGenerator::writeRoot() - sink.insertCharacters(language); - sink.closeElement("dc:language"); - -- if (m_version == 30) -+ if (m_version >= 30) - { - RVNGString date; - time_t now = 0; -diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h -index 5a0df86..bcb54c5 100644 ---- a/src/lib/EPUBGenerator.h -+++ b/src/lib/EPUBGenerator.h -@@ -33,7 +33,7 @@ class EPUBGenerator - EPUBGenerator &operator=(const EPUBGenerator &); - - public: -- EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method, int version); -+ EPUBGenerator(EPUBPackage *package, int version); - virtual ~EPUBGenerator(); - - void startDocument(const librevenge::RVNGPropertyList &props); -@@ -51,6 +51,8 @@ public: - EPUBSplitGuard &getSplitGuard(); - int getVersion() const; - -+ void setSplitMethod(EPUBSplitMethod splitMethod); -+ - void setStylesMethod(EPUBStylesMethod stylesMethod); - - void setLayoutMethod(EPUBLayoutMethod layoutMethod); -diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp -index 7a53ce3..342213e 100644 ---- a/src/lib/EPUBHTMLGenerator.cpp -+++ b/src/lib/EPUBHTMLGenerator.cpp -@@ -239,7 +239,7 @@ struct TextZoneSink - uiLabel = number.cstr(); - if (!lbl.length()) - return; -- int version = 20; -+ int version = 30; - if (m_zone) - version = m_zone->getVersion(); - { -@@ -248,7 +248,7 @@ struct TextZoneSink - if (closeAnchor) - output.openElement("sup", supAttrs); - RVNGPropertyList aAttrs; -- if (version == 30) -+ if (version >= 30) - aAttrs.insert("epub:type", "noteref"); - aAttrs.insert("href", ("#data" + lbl).c_str()); - output.openElement("a", aAttrs); -@@ -260,7 +260,7 @@ struct TextZoneSink - } - } - flush(); -- if (version == 30) -+ if (version >= 30) - { - RVNGPropertyList asideAttrs; - asideAttrs.insert("epub:type", "footnote"); -@@ -598,7 +598,7 @@ void EPUBHTMLGenerator::endDocument() - m_impl->m_document.insertEmptyElement("link", linkAttrs); - m_impl->m_document.closeElement("head"); - RVNGPropertyList bodyAttrs; -- if (m_impl->m_version == 30) -+ if (m_impl->m_version >= 30) - bodyAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops"); - m_impl->m_document.openElement("body", bodyAttrs); - m_impl->flushUnsent(m_impl->m_document); -@@ -889,7 +889,7 @@ void EPUBHTMLGenerator::closeFootnote() - { - if (m_impl->m_ignore) - return; -- if (m_impl->m_version == 30) -+ if (m_impl->m_version >= 30) - m_impl->output().closeElement("aside"); - m_impl->pop(); - } -diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp -index 363b33e..5e96d1d 100644 ---- a/src/lib/EPUBHTMLManager.cpp -+++ b/src/lib/EPUBHTMLManager.cpp -@@ -22,10 +22,16 @@ namespace - { - - /// Extracts a title string from a path and provides a fallback if it would be empty. --void getPathTitle(std::ostringstream &label, const EPUBPath &path, std::vector<EPUBPath>::size_type index) -+void getPathTitle(std::ostringstream &label, const EPUBPath &path, EPUBLayoutMethod layout, std::vector<EPUBPath>::size_type index) - { - if (path.getTitle().empty()) -- label << "Section " << (index + 1); -+ { -+ if (layout == EPUB_LAYOUT_METHOD_FIXED) -+ label << "Page "; -+ else -+ label << "Section "; -+ label << (index + 1); -+ } - else - label << path.getTitle(); - } -@@ -81,9 +87,9 @@ void EPUBHTMLManager::writeSpineTo(EPUBXMLSink &sink) - } - } - --void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version) -+void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version, EPUBLayoutMethod layout) - { -- if (version == 30) -+ if (version >= 30) - { - for (std::vector<EPUBPath>::size_type i = 0; m_paths.size() != i; ++i) - { -@@ -92,7 +98,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int - anchorAttrs.insert("href", m_paths[i].relativeTo(tocPath).str().c_str()); - sink.openElement("a", anchorAttrs); - std::ostringstream label; -- getPathTitle(label, m_paths[i], i); -+ getPathTitle(label, m_paths[i], layout, i); - sink.insertCharacters(label.str().c_str()); - sink.closeElement("a"); - sink.closeElement("li"); -@@ -115,7 +121,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int - sink.openElement("navLabel"); - sink.openElement("text"); - std::ostringstream label; -- getPathTitle(label, m_paths[i], i); -+ getPathTitle(label, m_paths[i], layout, i); - sink.insertCharacters(label.str().c_str()); - sink.closeElement("text"); - sink.closeElement("navLabel"); -diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h -index 31e6dfe..157896b 100644 ---- a/src/lib/EPUBHTMLManager.h -+++ b/src/lib/EPUBHTMLManager.h -@@ -46,7 +46,7 @@ public: - void writeTo(EPUBPackage &package); - - void writeSpineTo(EPUBXMLSink &sink); -- void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version); -+ void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version, EPUBLayoutMethod layout); - - /// Appends text to the title of the current heading. - void insertHeadingText(const std::string &text); -diff --git a/src/lib/EPUBPagedGenerator.cpp b/src/lib/EPUBPagedGenerator.cpp -index 6a3bff0..b3a06e4 100644 ---- a/src/lib/EPUBPagedGenerator.cpp -+++ b/src/lib/EPUBPagedGenerator.cpp -@@ -25,7 +25,7 @@ class EPUBPagedGenerator::Impl : public EPUBGenerator - Impl &operator=(const Impl &); - - public: -- Impl(EPUBPackage *const package, EPUBSplitMethod method, int version); -+ Impl(EPUBPackage *const package, int version); - - private: - void startHtmlFile() override; -@@ -35,12 +35,17 @@ public: - bool m_firstPage; - }; - --EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version) -- : EPUBGenerator(package, method, version) -+EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, int version) -+ : EPUBGenerator(package, version) - , m_firstPage(true) - { - } - -+void EPUBPagedGenerator::setSplitMethod(EPUBSplitMethod split) -+{ -+ m_impl->setSplitMethod(split); -+} -+ - void EPUBPagedGenerator::setSplitHeadingLevel(const unsigned level) - { - m_impl->getSplitGuard().setSplitHeadingLevel(level); -@@ -59,8 +64,8 @@ void EPUBPagedGenerator::Impl::endHtmlFile() - { - } - --EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version) -- : m_impl(new Impl(package, method, version)) -+EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, int version) -+ : m_impl(new Impl(package, version)) - { - } - -diff --git a/src/lib/EPUBPagedGenerator.h b/src/lib/EPUBPagedGenerator.h -index 74d70da..4effb65 100644 ---- a/src/lib/EPUBPagedGenerator.h -+++ b/src/lib/EPUBPagedGenerator.h -@@ -26,8 +26,9 @@ class EPUBPagedGenerator: public librevenge::RVNGPresentationInterface - class Impl; - - public: -- EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method, int version); -+ EPUBPagedGenerator(EPUBPackage *package, int version); - -+ void setSplitMethod(EPUBSplitMethod split); - void setSplitHeadingLevel(unsigned level); - void setSplitSize(unsigned size); - -diff --git a/src/lib/EPUBPresentationGenerator.cpp b/src/lib/EPUBPresentationGenerator.cpp -index 80b5ac2..3ebca24 100644 ---- a/src/lib/EPUBPresentationGenerator.cpp -+++ b/src/lib/EPUBPresentationGenerator.cpp -@@ -20,18 +20,17 @@ using librevenge::RVNGString; - class EPUBPresentationGenerator::Impl : public EPUBPagedGenerator - { - public: -- Impl(EPUBPackage *const package, EPUBSplitMethod method, int version); -+ Impl(EPUBPackage *const package, int version); - }; - --EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version) -- : EPUBPagedGenerator(package, method, version) -+EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, int version) -+ : EPUBPagedGenerator(package, version) - { - } - --EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method, int version) -- : m_impl(new Impl(package, method, version)) -+EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, int version) -+ : m_impl(new Impl(package, version)) - { -- (void) method; - } - - EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *const package) -@@ -47,6 +46,16 @@ EPUBPresentationGenerator::~EPUBPresentationGenerator() - delete m_impl; - } - -+void EPUBPresentationGenerator::setOption(int key, int value) -+{ -+ switch (key) -+ { -+ case EPUB_GENERATOR_OPTION_SPLIT: -+ m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value)); -+ break; -+ } -+} -+ - void EPUBPresentationGenerator::setSplitHeadingLevel(const unsigned level) - { - m_impl->setSplitHeadingLevel(level); -diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp -index 38573ec..78eeaae 100644 ---- a/src/lib/EPUBTextGenerator.cpp -+++ b/src/lib/EPUBTextGenerator.cpp -@@ -67,7 +67,7 @@ bool isPageBreak(const librevenge::RVNGProperty *property) - - struct EPUBTextGenerator::Impl : public EPUBGenerator - { -- Impl(EPUBPackage *package, EPUBSplitMethod method, int version); -+ Impl(EPUBPackage *package, int version); - - private: - void startHtmlFile() override; -@@ -93,8 +93,8 @@ private: - Impl &operator=(const Impl &); - }; - --EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version) -- : EPUBGenerator(package, method, version) -+EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, int version) -+ : EPUBGenerator(package, version) - , m_inPageSpan(false) - , m_inHeader(false) - , m_inFooter(false) -@@ -123,10 +123,9 @@ void EPUBTextGenerator::Impl::endHtmlFile() - m_currentFooter->write(getHtml().get()); - } - --EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version) -- : m_impl(new Impl(package, method, version)) -+EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, int version) -+ : m_impl(new Impl(package, version)) - { -- (void) method; - } - - EPUBTextGenerator::EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *const package) -@@ -152,14 +151,20 @@ void EPUBTextGenerator::setSplitSize(const unsigned size) - m_impl->getSplitGuard().setSplitSize(size); - } - --void EPUBTextGenerator::setStylesMethod(EPUBStylesMethod styles) -+void EPUBTextGenerator::setOption(int key, int value) - { -- m_impl->setStylesMethod(styles); --} -- --void EPUBTextGenerator::setLayoutMethod(EPUBLayoutMethod layout) --{ -- m_impl->setLayoutMethod(layout); -+ switch (key) -+ { -+ case EPUB_GENERATOR_OPTION_SPLIT: -+ m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value)); -+ break; -+ case EPUB_GENERATOR_OPTION_STYLES: -+ m_impl->setStylesMethod(static_cast<EPUBStylesMethod>(value)); -+ break; -+ case EPUB_GENERATOR_OPTION_LAYOUT: -+ m_impl->setLayoutMethod(static_cast<EPUBLayoutMethod>(value)); -+ break; -+ } - } - - void EPUBTextGenerator::registerEmbeddedImageHandler(const librevenge::RVNGString &mimeType, EPUBEmbeddedImage imageHandler) diff --git a/external/libepubgen/libepubgen-validation1.patch.1 b/external/libepubgen/libepubgen-validation1.patch.1 deleted file mode 100644 index 18707e76205d..000000000000 --- a/external/libepubgen/libepubgen-validation1.patch.1 +++ /dev/null @@ -1,49 +0,0 @@ -From 96e9786f5aba1078251f36e58feefc8d953cdea0 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Tue, 8 Aug 2017 16:54:24 +0200 -Subject: [PATCH 1/3] EPUBGenerator: fix validation error with empty - dc:identifier element - -<http://www.idpf.org/epub/31/spec/epub-packages.html#sec-opf-dcidentifier> -"3.4.3.2.1 The identifier Element" says that the character content is -not optional, so write it. ---- - configure.ac | 3 +++ - src/lib/EPUBGenerator.cpp | 14 +++++++++++++- - 2 files changed, 16 insertions(+), 1 deletion(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 0d0f866..507eb14 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -7,6 +7,10 @@ - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -+#include <boost/uuid/uuid.hpp> -+#include <boost/uuid/uuid_generators.hpp> -+#include <boost/uuid/uuid_io.hpp> -+ - #include "EPUBCSSSink.h" - #include "EPUBHTMLGenerator.h" - #include "EPUBGenerator.h" -@@ -193,7 +197,15 @@ void EPUBGenerator::writeRoot() - - RVNGPropertyList identifierAttrs; - identifierAttrs.insert("id", uniqueId); -- sink.insertEmptyElement("dc:identifier", identifierAttrs); -+ identifierAttrs.insert("opf:scheme", "UUID"); -+ sink.openElement("dc:identifier", identifierAttrs); -+ // The identifier element is required to have a unique character content. -+ std::stringstream identifierStream("urn:uuid:"); -+ boost::uuids::uuid uuid = boost::uuids::random_generator()(); -+ identifierStream << uuid; -+ std::string identifierCharactrs = identifierStream.str(); -+ sink.insertCharacters(identifierCharactrs.c_str()); -+ sink.closeElement("dc:identifier"); - - sink.openElement("dc:title"); - sink.closeElement("dc:title"); --- -2.12.3 - diff --git a/external/libepubgen/libepubgen-validation2.patch.1 b/external/libepubgen/libepubgen-validation2.patch.1 deleted file mode 100644 index a1807f33841b..000000000000 --- a/external/libepubgen/libepubgen-validation2.patch.1 +++ /dev/null @@ -1,34 +0,0 @@ -From 2e51fb9163bbc6b9a27fa524382c5aad9700dd0d Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Tue, 8 Aug 2017 17:23:38 +0200 -Subject: [PATCH 2/3] EPUBGenerator: don't write empty guide element - -<http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.6> "2.6: -Guide" requires: - - Within the package there may be one guide element, containing one or - more reference elements. - -Given that we never wrote reference child-elements, just don't write the -guide element at all, especially seeing that it's deprecated in OPF3. ---- - src/lib/EPUBGenerator.cpp | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 507eb14..9dbccac 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -225,9 +225,6 @@ void EPUBGenerator::writeRoot() - m_htmlManager.writeSpineTo(sink); - sink.closeElement("spine"); - -- sink.openElement("guide"); -- sink.closeElement("guide"); -- - sink.closeElement("package"); - - sink.writeTo(*m_package, "OEBPS/content.opf"); --- -2.12.3 - diff --git a/external/libepubgen/libepubgen-validation3.patch.1 b/external/libepubgen/libepubgen-validation3.patch.1 deleted file mode 100644 index b543e5a96e38..000000000000 --- a/external/libepubgen/libepubgen-validation3.patch.1 +++ /dev/null @@ -1,35 +0,0 @@ -From 9041ef42f9e0a5c4bc3b0a912d36683c4e10ca84 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Tue, 8 Aug 2017 17:39:18 +0200 -Subject: [PATCH 3/3] EPUBHTMLManager: fix value of <navPoint playOrder"..."> - -<http://www.niso.org/workrooms/daisy/Z39-86-2005.html#NCXplay> "8.4.3 -playOrder Attribute" says: - - playOrder is a positive integer; the first playOrder value in a document - shall be 1. - -So instead of writing an empty attribute, write the same number that's -already used for <navPoint id="...">. ---- - src/lib/EPUBHTMLManager.cpp | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp -index e5add82..03dbf21 100644 ---- a/src/lib/EPUBHTMLManager.cpp -+++ b/src/lib/EPUBHTMLManager.cpp -@@ -75,7 +75,9 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath) - id << "section" << (i + 1); - navPointAttrs.insert("id", id.str().c_str()); - navPointAttrs.insert("class", "document"); -- navPointAttrs.insert("playOrder", ""); -+ std::ostringstream playOrder; -+ playOrder << (i + 1); -+ navPointAttrs.insert("playOrder", playOrder.str().c_str()); - sink.openElement("navPoint", navPointAttrs); - sink.openElement("navLabel"); - sink.openElement("text"); --- -2.12.3 - diff --git a/external/libepubgen/libepubgen-vc.patch.1 b/external/libepubgen/libepubgen-vc.patch.1 deleted file mode 100644 index 4c929ed47a86..000000000000 --- a/external/libepubgen/libepubgen-vc.patch.1 +++ /dev/null @@ -1,59 +0,0 @@ -From 49f6461d4751d3b16e32ab8f9c93a3856b33be49 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna <vmiklos@collabora.co.uk> -Date: Wed, 2 Aug 2017 14:53:36 +0200 -Subject: [PATCH] m4: MSVC defines __cplusplus as 199711L still - -See e.g. -<https://stackoverflow.com/questions/37503029/cplusplus-is-equal-to-199711-in-msvc-does-it-support-c11>, -on MSVC we can't depend on the value of __cplusplus, since that one is a -too low value, even if everything else works fine. ---- - m4/ax_cxx_compile_stdcxx.m4 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff -Naur a/configure b/configure ---- a/configure 2017-08-02 14:50:09.000000000 +0200 -+++ b/configure 2017-08-02 14:50:57.000000000 +0200 -@@ -16001,7 +16001,7 @@ - - #error "This is not a C++ compiler" - --#elif __cplusplus < 201103L -+#elif __cplusplus < 201103L && !(defined _MSC_VER) - - #error "This is not a C++11 compiler" - -@@ -16314,7 +16314,7 @@ - - #error "This is not a C++ compiler" - --#elif __cplusplus < 201103L -+#elif __cplusplus < 201103L && !(defined _MSC_VER) - - #error "This is not a C++11 compiler" - -@@ -16636,7 +16636,7 @@ - - #error "This is not a C++ compiler" - --#elif __cplusplus < 201103L -+#elif __cplusplus < 201103L && !(defined _MSC_VER) - - #error "This is not a C++11 compiler" - -diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp -index 9dbccac..3357cf2 100644 ---- a/src/lib/EPUBGenerator.cpp -+++ b/src/lib/EPUBGenerator.cpp -@@ -7,6 +7,8 @@ - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -+#include <sstream> -+ - #include <boost/uuid/uuid.hpp> - #include <boost/uuid/uuid_generators.hpp> - #include <boost/uuid/uuid_io.hpp> --- -2.12.3 - |