summaryrefslogtreecommitdiff
path: root/external/libepubgen/libepubgen-epub3.patch.1
diff options
context:
space:
mode:
Diffstat (limited to 'external/libepubgen/libepubgen-epub3.patch.1')
-rw-r--r--external/libepubgen/libepubgen-epub3.patch.13318
1 files changed, 0 insertions, 3318 deletions
diff --git a/external/libepubgen/libepubgen-epub3.patch.1 b/external/libepubgen/libepubgen-epub3.patch.1
deleted file mode 100644
index 98ce658e5705..000000000000
--- a/external/libepubgen/libepubgen-epub3.patch.1
+++ /dev/null
@@ -1,3318 +0,0 @@
-From 17b4d0a2b595d1504f3d957268e2085ae0f80db7 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 9 Aug 2017 15:53:02 +0200
-Subject: [PATCH 1/9] EPUBGenerator: avoid container version roundtrip to
- double
-
-This will be an error for EPUB3:
-
-ERROR(RSC-005): test.epub/META-INF/container.xml(2,85): Error while parsing file: value of attribute "version" is invalid; must be equal to "1.0"
-
-But it does not hurt for EPUB2, either.
----
- src/lib/EPUBGenerator.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 3357cf2..1033c0f 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -117,7 +117,7 @@ void EPUBGenerator::writeContainer()
- EPUBXMLSink sink;
-
- RVNGPropertyList containerAttrs;
-- containerAttrs.insert("version", "1.0");
-+ containerAttrs.insert("version", RVNGPropertyFactory::newStringProp("1.0"));
- containerAttrs.insert("xmlns", "urn:oasis:names:tc:opendocument:xmlns:container");
-
- sink.openElement("container", containerAttrs);
---
-2.12.3
-
-From 8ca1fe2b9db9bacd6e868e69a0909a441fb6a7f8 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 9 Aug 2017 16:00:05 +0200
-Subject: [PATCH 2/9] EPUBGenerator: avoid opf:scheme attribute when writing
- the UUID
-
-This will be an error for EPUB3:
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,292): Error while parsing file: found attribute "opf:scheme", but no attributes allowed here
-
-But it's optional for EPUB2 already.
----
- src/lib/EPUBGenerator.cpp | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 1033c0f..14e3c58 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -199,7 +199,6 @@ void EPUBGenerator::writeRoot()
-
- RVNGPropertyList identifierAttrs;
- identifierAttrs.insert("id", uniqueId);
-- identifierAttrs.insert("opf:scheme", "UUID");
- sink.openElement("dc:identifier", identifierAttrs);
- // The identifier element is required to have a unique character content.
- std::stringstream identifierStream("urn:uuid:");
---
-2.12.3
-
-From aa71784fcee0404c2f136f035887ca4c52d0e756 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 9 Aug 2017 16:11:13 +0200
-Subject: [PATCH 3/9] EPUBGenerator: avoid empty dc:title element
-
-This is a warning for EPUB2, but it'll be an error for EPUB3:
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,337): Error while parsing file: character content of element "dc:title" invalid; must be a string with length at least 1 (actual length was 0)
-
-The problem is that for ODF/librevenge this element is optional, so work
-it around by adding a zero-width space.
-
-A later commit should read the optional title of declared with a
-librevenge API call, though.
----
- src/lib/EPUBGenerator.cpp | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 14e3c58..75ccb5a 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -208,8 +208,12 @@ void EPUBGenerator::writeRoot()
- sink.insertCharacters(identifierCharactrs.c_str());
- sink.closeElement("dc:identifier");
-
-+ // Zero-width space as it must be at least one character in length after
-+ // white space has been trimmed.
- sink.openElement("dc:title");
-+ sink.insertCharacters("\u200b");
- sink.closeElement("dc:title");
-+
- sink.openElement("dc:language");
- sink.closeElement("dc:language");
-
---
-2.12.3
-
-From a4585b8f35c76472eb91688c9177b9f532c290d8 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 9 Aug 2017 16:15:12 +0200
-Subject: [PATCH 4/9] EPUBGenerator: avoid empty dc:language element
-
-Same story as with dc:title:
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,362): Error while parsing file: character content of element "dc:language" invalid; must be an RFC 3066 language identifier
-
-(This is a warning for EPUB2, but it'll be an error for EPUB3; this is optional
-for ODF; later commit should read the this info, though.)
----
- src/lib/EPUBGenerator.cpp | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 75ccb5a..40ae0cc 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -215,6 +215,7 @@ void EPUBGenerator::writeRoot()
- sink.closeElement("dc:title");
-
- sink.openElement("dc:language");
-+ sink.insertCharacters("en");
- sink.closeElement("dc:language");
-
- sink.closeElement("metadata");
---
-2.12.3
-
-From 862ec6735c25760edadf05d83717daaf65f39f99 Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 9 Aug 2017 16:47:12 +0200
-Subject: [PATCH 5/9] [ABI CHANGE] optionally support generating EPUB3 output
-
-Versions are 20 and 30 to be consistent with
-<https://github.com/idpf/epubcheck/tree/master/src/main/resources/com/adobe/epubcheck/schema/>.
----
- inc/libepubgen/EPUBDrawingGenerator.h | 6 +++++-
- inc/libepubgen/EPUBPresentationGenerator.h | 6 +++++-
- inc/libepubgen/EPUBTextGenerator.h | 6 +++++-
- src/lib/EPUBDrawingGenerator.cpp | 10 +++++-----
- src/lib/EPUBGenerator.cpp | 8 ++++++--
- src/lib/EPUBGenerator.h | 4 +++-
- src/lib/EPUBPagedGenerator.cpp | 10 +++++-----
- src/lib/EPUBPagedGenerator.h | 2 +-
- src/lib/EPUBPresentationGenerator.cpp | 10 +++++-----
- src/lib/EPUBTextGenerator.cpp | 10 +++++-----
- 10 files changed, 45 insertions(+), 27 deletions(-)
-
-diff --git a/inc/libepubgen/EPUBDrawingGenerator.h b/inc/libepubgen/EPUBDrawingGenerator.h
-index 48bfc99..963e3b8 100644
---- a/inc/libepubgen/EPUBDrawingGenerator.h
-+++ b/inc/libepubgen/EPUBDrawingGenerator.h
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBDrawingGenerator : public librevenge::RVNGDrawingInterface
- class Impl;
-
- public:
-- explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
-+ /** Constructor.
-+ *
-+ * @param[in] version possible values: 20, 30.
-+ */
-+ explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
- EPUBDrawingGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
- ~EPUBDrawingGenerator() override;
-
-diff --git a/inc/libepubgen/EPUBPresentationGenerator.h b/inc/libepubgen/EPUBPresentationGenerator.h
-index 0a8152a..512c52d 100644
---- a/inc/libepubgen/EPUBPresentationGenerator.h
-+++ b/inc/libepubgen/EPUBPresentationGenerator.h
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBPresentationGenerator: public librevenge::RVNGPresentationI
- class Impl;
-
- public:
-- explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
-+ /** Constructor.
-+ *
-+ * @param[in] version possible values: 20, 30.
-+ */
-+ explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
- EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
- ~EPUBPresentationGenerator() override;
-
-diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h
-index abf9e7f..664f673 100644
---- a/inc/libepubgen/EPUBTextGenerator.h
-+++ b/inc/libepubgen/EPUBTextGenerator.h
-@@ -32,7 +32,11 @@ class EPUBGENAPI EPUBTextGenerator : public librevenge::RVNGTextInterface
- struct Impl;
-
- public:
-- explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK);
-+ /** Constructor.
-+ *
-+ * @param[in] version possible values: 20, 30.
-+ */
-+ explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
- EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
- ~EPUBTextGenerator() override;
-
-diff --git a/src/lib/EPUBDrawingGenerator.cpp b/src/lib/EPUBDrawingGenerator.cpp
-index e25a377..bcb4994 100644
---- a/src/lib/EPUBDrawingGenerator.cpp
-+++ b/src/lib/EPUBDrawingGenerator.cpp
-@@ -20,16 +20,16 @@ using librevenge::RVNGString;
- class EPUBDrawingGenerator::Impl : public EPUBPagedGenerator
- {
- public:
-- Impl(EPUBPackage *const package, const EPUBSplitMethod method);
-+ Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version);
- };
-
--EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
-- : EPUBPagedGenerator(package, method)
-+EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+ : EPUBPagedGenerator(package, method, version)
- {
- }
-
--EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split)
-- : m_impl(new Impl(package, split))
-+EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split, int version)
-+ : m_impl(new Impl(package, split, version))
- {
- }
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 40ae0cc..4888677 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -25,7 +25,7 @@ using librevenge::RVNGPropertyFactory;
- using librevenge::RVNGPropertyList;
- using librevenge::RVNGString;
-
--EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split)
-+EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split, int version)
- : m_package(package)
- , m_manifest()
- , m_htmlManager(m_manifest)
-@@ -39,6 +39,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
- , m_metadata()
- , m_currentHtml()
- , m_splitGuard(split)
-+ , m_version(version)
- {
- }
-
-@@ -190,7 +191,10 @@ void EPUBGenerator::writeRoot()
- packageAttrs.insert("xmlns:dc", "http://purl.org/dc/elements/1.1/");
- packageAttrs.insert("xmlns:dcterms", "http://purl.org/dc/terms/");
- packageAttrs.insert("xmlns:opf", "http://www.idpf.org/2007/opf");
-- packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0"));
-+ if (m_version == 30)
-+ packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("3.0"));
-+ else
-+ packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0"));
- packageAttrs.insert("unique-identifier", uniqueId);
-
- sink.openElement("package", packageAttrs);
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index 51dd911..a0ef8ac 100644
---- a/src/lib/EPUBGenerator.h
-+++ b/src/lib/EPUBGenerator.h
-@@ -33,7 +33,7 @@ class EPUBGenerator
- EPUBGenerator &operator=(const EPUBGenerator &);
-
- public:
-- EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method);
-+ EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
- virtual ~EPUBGenerator();
-
- void startDocument(const librevenge::RVNGPropertyList &props);
-@@ -75,6 +75,8 @@ private:
- EPUBHTMLGeneratorPtr_t m_currentHtml;
-
- EPUBSplitGuard m_splitGuard;
-+
-+ int m_version;
- };
-
- }
-diff --git a/src/lib/EPUBPagedGenerator.cpp b/src/lib/EPUBPagedGenerator.cpp
-index 913a592..6a3bff0 100644
---- a/src/lib/EPUBPagedGenerator.cpp
-+++ b/src/lib/EPUBPagedGenerator.cpp
-@@ -25,7 +25,7 @@ class EPUBPagedGenerator::Impl : public EPUBGenerator
- Impl &operator=(const Impl &);
-
- public:
-- Impl(EPUBPackage *const package, EPUBSplitMethod method);
-+ Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
-
- private:
- void startHtmlFile() override;
-@@ -35,8 +35,8 @@ public:
- bool m_firstPage;
- };
-
--EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
-- : EPUBGenerator(package, method)
-+EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+ : EPUBGenerator(package, method, version)
- , m_firstPage(true)
- {
- }
-@@ -59,8 +59,8 @@ void EPUBPagedGenerator::Impl::endHtmlFile()
- {
- }
-
--EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method)
-- : m_impl(new Impl(package, method))
-+EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+ : m_impl(new Impl(package, method, version))
- {
- }
-
-diff --git a/src/lib/EPUBPagedGenerator.h b/src/lib/EPUBPagedGenerator.h
-index f1d124f..74d70da 100644
---- a/src/lib/EPUBPagedGenerator.h
-+++ b/src/lib/EPUBPagedGenerator.h
-@@ -26,7 +26,7 @@ class EPUBPagedGenerator: public librevenge::RVNGPresentationInterface
- class Impl;
-
- public:
-- EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method);
-+ EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
-
- void setSplitHeadingLevel(unsigned level);
- void setSplitSize(unsigned size);
-diff --git a/src/lib/EPUBPresentationGenerator.cpp b/src/lib/EPUBPresentationGenerator.cpp
-index 5b2a2e9..80b5ac2 100644
---- a/src/lib/EPUBPresentationGenerator.cpp
-+++ b/src/lib/EPUBPresentationGenerator.cpp
-@@ -20,16 +20,16 @@ using librevenge::RVNGString;
- class EPUBPresentationGenerator::Impl : public EPUBPagedGenerator
- {
- public:
-- Impl(EPUBPackage *const package, EPUBSplitMethod method);
-+ Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
- };
-
--EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
-- : EPUBPagedGenerator(package, method)
-+EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+ : EPUBPagedGenerator(package, method, version)
- {
- }
-
--EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method)
-- : m_impl(new Impl(package, method))
-+EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method, int version)
-+ : m_impl(new Impl(package, method, version))
- {
- (void) method;
- }
-diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
-index b3ca626..e8f785e 100644
---- a/src/lib/EPUBTextGenerator.cpp
-+++ b/src/lib/EPUBTextGenerator.cpp
-@@ -57,7 +57,7 @@ bool operator!=(const char *const left, const RVNGString &right)
-
- struct EPUBTextGenerator::Impl : public EPUBGenerator
- {
-- Impl(EPUBPackage *package, EPUBSplitMethod method);
-+ Impl(EPUBPackage *package, EPUBSplitMethod method, int version);
-
- private:
- void startHtmlFile() override;
-@@ -83,8 +83,8 @@ private:
- Impl &operator=(const Impl &);
- };
-
--EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method)
-- : EPUBGenerator(package, method)
-+EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+ : EPUBGenerator(package, method, version)
- , m_inPageSpan(false)
- , m_inHeader(false)
- , m_inFooter(false)
-@@ -113,8 +113,8 @@ void EPUBTextGenerator::Impl::endHtmlFile()
- m_currentFooter->write(getHtml().get());
- }
-
--EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method)
-- : m_impl(new Impl(package, method))
-+EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
-+ : m_impl(new Impl(package, method, version))
- {
- (void) method;
- }
---
-2.12.3
-
-From cfd57f50c9d33781f90018d40902ccce68a13a5c Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 9 Aug 2017 17:19:06 +0200
-Subject: [PATCH 6/9] EPUB3: write missing modification date
-
-ERROR(RSC-005): test.epub/OEBPS/content.opf(2,236): Error while parsing file: package dcterms:modified meta element must occur exactly once
-
-But not for EPUB2, which doesn't allow so.
-
-(Similar story as with dc:title: later commit should read the this
-optional info from librevenge.)
----
- src/lib/EPUBGenerator.cpp | 18 ++++++++++++++++++
- 1 file changed, 18 insertions(+)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 4888677..1628a2b 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -7,6 +7,7 @@
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-+#include <ctime>
- #include <sstream>
-
- #include <boost/uuid/uuid.hpp>
-@@ -222,6 +223,23 @@ void EPUBGenerator::writeRoot()
- sink.insertCharacters("en");
- sink.closeElement("dc:language");
-
-+ time_t now = 0;
-+ time(&now);
-+ const struct tm *local = localtime(&now);
-+ if (m_version == 30 && local)
-+ {
-+ RVNGPropertyList metaAttrs;
-+ metaAttrs.insert("property", "dcterms:modified");
-+ sink.openElement("meta", metaAttrs);
-+ const int MAX_BUFFER = 1024;
-+ char buffer[MAX_BUFFER];
-+ strftime(&buffer[0], MAX_BUFFER-1, "%Y-%m-%dT%H:%M:%SZ", local);
-+ RVNGString result;
-+ result.append(buffer);
-+ sink.insertCharacters(result);
-+ sink.closeElement("meta");
-+ }
-+
- sink.closeElement("metadata");
-
- sink.openElement("manifest");
---
-2.12.3
-
-From 575a09f637b5afe4d61387c7be3c8b2b67039ccb Mon Sep 17 00:00:00 2001
-From: Miklos Vajna <vmiklos@collabora.co.uk>
-Date: Wed, 9 Aug 2017 17:39:51 +0200
-Subject: [PATCH 7/9] EPUB3: add missing nav property on first HTML stream
-
-ERROR(RSC-005): test30.epub/OEBPS/content.opf(2,459): Error while parsing file: Exactly one manifest item must declare the 'nav' property (number of 'nav' items: 0).
-
-This is the last error in OEBPS/content.opf in case of EPUB3.
----
- src/lib/EPUBGenerator.cpp | 11 ++++++++---
- src/lib/EPUBGenerator.h | 1 +
- src/lib/EPUBHTMLManager.cpp | 9 +++++++--
- src/lib/EPUBHTMLManager.h | 3 ++-
- src/lib/EPUBImageManager.cpp | 2 +-
- src/lib/EPUBManifest.cpp | 11 +++++++----
- src/lib/EPUBManifest.h | 5 +++--
- 7 files changed, 29 insertions(+), 13 deletions(-)
-
-diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
-index 1628a2b..f77aa6c 100644
---- a/src/lib/EPUBGenerator.cpp
-+++ b/src/lib/EPUBGenerator.cpp
-@@ -54,8 +54,8 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
-
- startNewHtmlFile();
-
-- m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx");
-- m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css");
-+ m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
-+ m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
- }
-
- void EPUBGenerator::endDocument()
-@@ -90,7 +90,7 @@ void EPUBGenerator::startNewHtmlFile()
-
- m_splitGuard.onSplit();
-
-- m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath);
-+ m_currentHtml = m_htmlManager.create(m_imageManager, m_listStyleManager, m_paragraphStyleManager, m_spanStyleManager, m_tableStyleManager, m_stylesheetPath, *this);
-
- // restore state in the new file
- m_currentHtml->startDocument(m_documentProps);
-@@ -114,6 +114,11 @@ EPUBSplitGuard &EPUBGenerator::getSplitGuard()
- return m_splitGuard;
- }
-
-+int EPUBGenerator::getVersion() const
-+{
-+ return m_version;
-+}
-+
- void EPUBGenerator::writeContainer()
- {
- EPUBXMLSink sink;
-diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
-index a0ef8ac..1a67a88 100644
---- a/src/lib/EPUBGenerator.h
-+++ b/src/lib/EPUBGenerator.h
-@@ -47,6 +47,7 @@ public:
-
- const EPUBSplitGuard &getSplitGuard() const;
- EPUBSplitGuard &getSplitGuard();
-+ int getVersion() const;
-
- private:
- virtual void startHtmlFile() = 0;
-diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
-index 03dbf21..57636b9 100644
---- a/src/lib/EPUBHTMLManager.cpp
-+++ b/src/lib/EPUBHTMLManager.cpp
-@@ -13,6 +13,7 @@
-
- #include "EPUBHTMLManager.h"
- #include "EPUBManifest.h"
-+#include "EPUBGenerator.h"
-
- namespace libepubgen
- {
-@@ -26,7 +27,7 @@ EPUBHTMLManager::EPUBHTMLManager(EPUBManifest &manifest)
- {
- }
-
--const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, 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 &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath);
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, 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 &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, 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 &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath, const EPUBGenerator &generator);
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, 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;");
-+ // 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 &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath)
-+ EPUBHTMLGeneratorImpl(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, 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 &paragraphStyleManager, 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 &paragraphStyleManager, 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 &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &path, const EPUBPath &stylesheetPath);
-+ EPUBHTMLGenerator(EPUBXMLSink &document, EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, 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 &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath)
-+const EPUBHTMLGeneratorPtr_t EPUBHTMLManager::create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, 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 &paragraphStyleManager, EPUBSpanStyleManager &spanStyleManager, EPUBTableStyleManager &tableStyleManager, const EPUBPath &stylesheetPath);
-+ const EPUBHTMLGeneratorPtr_t create(EPUBImageManager &imageManager, EPUBListStyleManager &listStyleManager, EPUBParagraphStyleManager &paragraphStyleManager, 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
-