[Libreoffice-commits] core.git: 3 commits - configure.ac external/libepubgen filter/source writerperfect/qa writerperfect/source

Miklos Vajna vmiklos at collabora.co.uk
Mon Dec 4 08:09:05 UTC 2017


 configure.ac                                     |    3 
 external/libepubgen/libepubgen-epub3.patch.1     |  561 +++++++++++++++++++++++
 filter/source/svg/impsvgdialog.hxx               |    1 
 filter/source/svg/svgexport.cxx                  |    5 
 filter/source/svg/svgfilter.hxx                  |    2 
 writerperfect/qa/unit/EPUBExportTest.cxx         |   25 +
 writerperfect/source/writer/EPUBExportFilter.cxx |    5 
 writerperfect/source/writer/exp/txtparai.cxx     |    7 
 writerperfect/source/writer/exp/txtstyli.cxx     |   96 ---
 writerperfect/source/writer/exp/txtstyli.hxx     |   29 -
 writerperfect/source/writer/exp/xmlfmt.cxx       |   13 
 writerperfect/source/writer/exp/xmlfmt.hxx       |    8 
 writerperfect/source/writer/exp/xmlimp.cxx       |   33 -
 writerperfect/source/writer/exp/xmlimp.hxx       |    7 
 14 files changed, 606 insertions(+), 189 deletions(-)

New commits:
commit d4246aeaa2b182c3defcefb68426d1be8e2caf75
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Dec 1 12:00:35 2017 +0100

    EPUB export, fixed layout: fix spine names
    
    They are pages, not sections.
    
    Change-Id: Ifd72d5ebec1d372a9bd99653d849479a6ffb6bfa
    Reviewed-on: https://gerrit.libreoffice.org/45690
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/configure.ac b/configure.ac
index 8c5434bd1883..264e4ba99750 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7688,7 +7688,8 @@ AS_IF([test "$SYSTEM_EPUBGEN" = "TRUE"], [
     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
             #include <libepubgen/libepubgen.h>
         ], [
-            const libepubgen::EPUBTextGenerator generator(nullptr, EPUB_SPLIT_METHOD_NONE, 30);
+            libepubgen::EPUBTextGenerator generator(nullptr);
+            generator.setOption(libepubgen::EPUB_GENERATOR_OPTION_SPLIT, libepubgen::EPUB_SPLIT_METHOD_NONE);
         ])],
         [
             AC_MSG_RESULT([yes])
diff --git a/external/libepubgen/libepubgen-epub3.patch.1 b/external/libepubgen/libepubgen-epub3.patch.1
index af6c9366fbc1..bf9670995049 100644
--- a/external/libepubgen/libepubgen-epub3.patch.1
+++ b/external/libepubgen/libepubgen-epub3.patch.1
@@ -5856,3 +5856,564 @@ index 02c299a..38573ec 100644
 -- 
 2.13.6
 
+diff --git a/NEWS b/NEWS
+index 912efbc..ad3d4d1 100644
+--- a/NEWS
++++ b/NEWS
+@@ -1,3 +1,13 @@
++- Fix various validation problems, pointed out by epubcheck.
++- Add EPUB3 support.
++- Split on headings: add user-friendly section names.
++- Support writing CSS styles inline in the XHTML streams.
++- Support various image wrap types.
++- Support embedded fonts.
++- Support cover images.
++- Support footnotes.
++- Support EPUB3 fixed layout.
++
+ libepubgen-0.0.1
+ 
+ - Fix escaping of HTML entities.
+diff --git a/inc/libepubgen/EPUBDrawingGenerator.h b/inc/libepubgen/EPUBDrawingGenerator.h
+index 963e3b8..8f14959 100644
+--- a/inc/libepubgen/EPUBDrawingGenerator.h
++++ b/inc/libepubgen/EPUBDrawingGenerator.h
+@@ -36,13 +36,19 @@ public:
+     *
+     * @param[in] version possible values: 20, 30.
+     */
+-  explicit EPUBDrawingGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
++  explicit EPUBDrawingGenerator(EPUBPackage *package, int version = 30);
+   EPUBDrawingGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
+   ~EPUBDrawingGenerator() override;
+ 
+   void setSplitHeadingLevel(unsigned level);
+   void setSplitSize(unsigned size);
+ 
++  /** Set an option for the EPUB generator
++   * @param[in] key a value from the EPUBGeneratorOption enumeration
++   * @param[in] value depends on the value of key
++   */
++  void setOption(int key, int value);
++
+   /** Register a handler for embedded images.
+     *
+     * The handler must convert the image to one of the OPS Core Media Types.
+diff --git a/inc/libepubgen/EPUBPresentationGenerator.h b/inc/libepubgen/EPUBPresentationGenerator.h
+index 512c52d..b7ad190 100644
+--- a/inc/libepubgen/EPUBPresentationGenerator.h
++++ b/inc/libepubgen/EPUBPresentationGenerator.h
+@@ -36,13 +36,19 @@ public:
+     *
+     * @param[in] version possible values: 20, 30.
+     */
+-  explicit EPUBPresentationGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
++  explicit EPUBPresentationGenerator(EPUBPackage *package, int version = 30);
+   EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
+   ~EPUBPresentationGenerator() override;
+ 
+   void setSplitHeadingLevel(unsigned level);
+   void setSplitSize(unsigned size);
+ 
++  /** Set an option for the EPUB generator
++   * @param[in] key a value from the EPUBGeneratorOption enumeration
++   * @param[in] value depends on the value of key
++   */
++  void setOption(int key, int value);
++
+   /** Register a handler for embedded images.
+     *
+     * The handler must convert the image to one of the OPS Core Media Types.
+diff --git a/inc/libepubgen/EPUBTextGenerator.h b/inc/libepubgen/EPUBTextGenerator.h
+index beb05aa..809078a 100644
+--- a/inc/libepubgen/EPUBTextGenerator.h
++++ b/inc/libepubgen/EPUBTextGenerator.h
+@@ -36,14 +36,19 @@ public:
+     *
+     * @param[in] version possible values: 20, 30.
+     */
+-  explicit EPUBTextGenerator(EPUBPackage *package, EPUBSplitMethod split = EPUB_SPLIT_METHOD_PAGE_BREAK, int version = 20);
++  explicit EPUBTextGenerator(EPUBPackage *package, int version = 30);
+   EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *package);
+   ~EPUBTextGenerator() override;
+ 
+   void setSplitHeadingLevel(unsigned level);
+   void setSplitSize(unsigned size);
+-  void setStylesMethod(EPUBStylesMethod styles);
+-  void setLayoutMethod(EPUBLayoutMethod layout);
++
++  /** Set an option for the EPUB generator
++   *
++   * @param[in] key a value from the EPUBGeneratorOption enumeration
++   * @param[in] value depends on the value of key
++   */
++  void setOption(int key, int value);
+ 
+   /** Register a handler for embedded images.
+     *
+diff --git a/inc/libepubgen/libepubgen-decls.h b/inc/libepubgen/libepubgen-decls.h
+index 3eb206e..490dbc3 100644
+--- a/inc/libepubgen/libepubgen-decls.h
++++ b/inc/libepubgen/libepubgen-decls.h
+@@ -77,6 +77,15 @@ enum EPUBLayoutMethod
+   EPUB_LAYOUT_METHOD_FIXED, //< Exactly one page per HTML file.
+ };
+ 
++/** The possible options for a generator.
++  */
++enum EPUBGeneratorOption
++{
++  EPUB_GENERATOR_OPTION_SPLIT, //< EPUBSplitMethod.
++  EPUB_GENERATOR_OPTION_STYLES, //< EPUBStylesMethod.
++  EPUB_GENERATOR_OPTION_LAYOUT //< EPUBLayoutMethod.
++};
++
+ }
+ 
+ #endif // INCLUDED_LIBEPUBGEN_LIBEPUBGEN_DECLS_H
+diff --git a/src/lib/EPUBDrawingGenerator.cpp b/src/lib/EPUBDrawingGenerator.cpp
+index bcb4994..aef43ad 100644
+--- a/src/lib/EPUBDrawingGenerator.cpp
++++ b/src/lib/EPUBDrawingGenerator.cpp
+@@ -20,16 +20,16 @@ using librevenge::RVNGString;
+ class EPUBDrawingGenerator::Impl : public EPUBPagedGenerator
+ {
+ public:
+-  Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version);
++  Impl(EPUBPackage *const package, int version);
+ };
+ 
+-EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
+-  : EPUBPagedGenerator(package, method, version)
++EPUBDrawingGenerator::Impl::Impl(EPUBPackage *const package, int version)
++  : EPUBPagedGenerator(package, version)
+ {
+ }
+ 
+-EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, EPUBSplitMethod split, int version)
+-  : m_impl(new Impl(package, split, version))
++EPUBDrawingGenerator::EPUBDrawingGenerator(EPUBPackage *const package, int version)
++  : m_impl(new Impl(package, version))
+ {
+ }
+ 
+@@ -51,6 +51,16 @@ void EPUBDrawingGenerator::setSplitHeadingLevel(const unsigned level)
+   m_impl->setSplitHeadingLevel(level);
+ }
+ 
++void EPUBDrawingGenerator::setOption(int key, int value)
++{
++  switch (key)
++  {
++  case EPUB_GENERATOR_OPTION_SPLIT:
++    m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value));
++    break;
++  }
++}
++
+ void EPUBDrawingGenerator::setSplitSize(const unsigned size)
+ {
+   m_impl->setSplitSize(size);
+diff --git a/src/lib/EPUBGenerator.cpp b/src/lib/EPUBGenerator.cpp
+index f608331..83f3f40 100644
+--- a/src/lib/EPUBGenerator.cpp
++++ b/src/lib/EPUBGenerator.cpp
+@@ -30,7 +30,7 @@ using librevenge::RVNGPropertyFactory;
+ using librevenge::RVNGPropertyList;
+ using librevenge::RVNGString;
+ 
+-EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod split, int version)
++EPUBGenerator::EPUBGenerator(EPUBPackage *const package, int version)
+   : m_package(package)
+   , m_manifest()
+   , m_htmlManager(m_manifest)
+@@ -44,7 +44,7 @@ EPUBGenerator::EPUBGenerator(EPUBPackage *const package, const EPUBSplitMethod s
+   , m_documentProps()
+   , m_metadata()
+   , m_currentHtml()
+-  , m_splitGuard(split)
++  , m_splitGuard(EPUB_SPLIT_METHOD_PAGE_BREAK)
+   , m_version(version)
+   , m_stylesMethod(EPUB_STYLES_METHOD_CSS)
+   , m_layoutMethod(EPUB_LAYOUT_METHOD_REFLOWABLE)
+@@ -61,7 +61,7 @@ void EPUBGenerator::startDocument(const RVNGPropertyList &props)
+ 
+   startNewHtmlFile();
+ 
+-  if (m_version == 30)
++  if (m_version >= 30)
+     m_manifest.insert(EPUBPath("OEBPS/toc.xhtml"), "application/xhtml+xml", "toc.xhtml", "nav");
+   m_manifest.insert(EPUBPath("OEBPS/toc.ncx"), "application/x-dtbncx+xml", "toc.ncx", "");
+   m_manifest.insert(m_stylesheetPath, "text/css", "stylesheet.css", "");
+@@ -88,7 +88,7 @@ void EPUBGenerator::setDocumentMetaData(const RVNGPropertyList &props)
+ {
+   m_metadata = props;
+ 
+-  if (m_version == 30)
++  if (m_version >= 30)
+   {
+     const librevenge::RVNGPropertyListVector *coverImages = props.child("librevenge:cover-images");
+     if (coverImages)
+@@ -157,6 +157,11 @@ int EPUBGenerator::getVersion() const
+   return m_version;
+ }
+ 
++void EPUBGenerator::setSplitMethod(EPUBSplitMethod split)
++{
++  m_splitGuard.setSplitMethod(split);
++}
++
+ void EPUBGenerator::setStylesMethod(EPUBStylesMethod styles)
+ {
+   m_stylesMethod = styles;
+@@ -195,7 +200,7 @@ void EPUBGenerator::writeContainer()
+ 
+ void EPUBGenerator::writeNavigation()
+ {
+-  if (m_version == 30)
++  if (m_version >= 30)
+   {
+     EPUBXMLSink sink;
+ 
+@@ -214,7 +219,7 @@ void EPUBGenerator::writeNavigation()
+     sink.openElement("nav", navAttrs);
+ 
+     sink.openElement("ol");
+-    m_htmlManager.writeTocTo(sink, path, m_version);
++    m_htmlManager.writeTocTo(sink, path, m_version, m_layoutMethod);
+     sink.closeElement("ol");
+ 
+     sink.closeElement("nav");
+@@ -248,7 +253,7 @@ void EPUBGenerator::writeNavigation()
+   sink.openElement("navMap");
+   // In case of EPUB3 the (deprecated, but valid) EPUB2 markup is wanted, so
+   // the version is unconditional here.
+-  m_htmlManager.writeTocTo(sink, path, /*version=*/20);
++  m_htmlManager.writeTocTo(sink, path, /*version=*/20, m_layoutMethod);
+   sink.closeElement("navMap");
+ 
+   sink.closeElement("ncx");
+@@ -281,7 +286,7 @@ void EPUBGenerator::writeRoot()
+   packageAttrs.insert("xmlns:dc", "http://purl.org/dc/elements/1.1/");
+   packageAttrs.insert("xmlns:dcterms", "http://purl.org/dc/terms/");
+   packageAttrs.insert("xmlns:opf", "http://www.idpf.org/2007/opf");
+-  if (m_version == 30)
++  if (m_version >= 30)
+     packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("3.0"));
+   else
+     packageAttrs.insert("version", RVNGPropertyFactory::newStringProp("2.0"));
+@@ -326,7 +331,7 @@ void EPUBGenerator::writeRoot()
+   sink.insertCharacters(language);
+   sink.closeElement("dc:language");
+ 
+-  if (m_version == 30)
++  if (m_version >= 30)
+   {
+     RVNGString date;
+     time_t now = 0;
+diff --git a/src/lib/EPUBGenerator.h b/src/lib/EPUBGenerator.h
+index 5a0df86..bcb54c5 100644
+--- a/src/lib/EPUBGenerator.h
++++ b/src/lib/EPUBGenerator.h
+@@ -33,7 +33,7 @@ class EPUBGenerator
+   EPUBGenerator &operator=(const EPUBGenerator &);
+ 
+ public:
+-  EPUBGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
++  EPUBGenerator(EPUBPackage *package, int version);
+   virtual ~EPUBGenerator();
+ 
+   void startDocument(const librevenge::RVNGPropertyList &props);
+@@ -51,6 +51,8 @@ public:
+   EPUBSplitGuard &getSplitGuard();
+   int getVersion() const;
+ 
++  void setSplitMethod(EPUBSplitMethod splitMethod);
++
+   void setStylesMethod(EPUBStylesMethod stylesMethod);
+ 
+   void setLayoutMethod(EPUBLayoutMethod layoutMethod);
+diff --git a/src/lib/EPUBHTMLGenerator.cpp b/src/lib/EPUBHTMLGenerator.cpp
+index 7a53ce3..342213e 100644
+--- a/src/lib/EPUBHTMLGenerator.cpp
++++ b/src/lib/EPUBHTMLGenerator.cpp
+@@ -239,7 +239,7 @@ struct TextZoneSink
+       uiLabel = number.cstr();
+     if (!lbl.length())
+       return;
+-    int version = 20;
++    int version = 30;
+     if (m_zone)
+       version = m_zone->getVersion();
+     {
+@@ -248,7 +248,7 @@ struct TextZoneSink
+       if (closeAnchor)
+         output.openElement("sup", supAttrs);
+       RVNGPropertyList aAttrs;
+-      if (version == 30)
++      if (version >= 30)
+         aAttrs.insert("epub:type", "noteref");
+       aAttrs.insert("href", ("#data" + lbl).c_str());
+       output.openElement("a", aAttrs);
+@@ -260,7 +260,7 @@ struct TextZoneSink
+       }
+     }
+     flush();
+-    if (version == 30)
++    if (version >= 30)
+     {
+       RVNGPropertyList asideAttrs;
+       asideAttrs.insert("epub:type", "footnote");
+@@ -598,7 +598,7 @@ void EPUBHTMLGenerator::endDocument()
+   m_impl->m_document.insertEmptyElement("link", linkAttrs);
+   m_impl->m_document.closeElement("head");
+   RVNGPropertyList bodyAttrs;
+-  if (m_impl->m_version == 30)
++  if (m_impl->m_version >= 30)
+     bodyAttrs.insert("xmlns:epub", "http://www.idpf.org/2007/ops");
+   m_impl->m_document.openElement("body", bodyAttrs);
+   m_impl->flushUnsent(m_impl->m_document);
+@@ -889,7 +889,7 @@ void EPUBHTMLGenerator::closeFootnote()
+ {
+   if (m_impl->m_ignore)
+     return;
+-  if (m_impl->m_version == 30)
++  if (m_impl->m_version >= 30)
+     m_impl->output().closeElement("aside");
+   m_impl->pop();
+ }
+diff --git a/src/lib/EPUBHTMLManager.cpp b/src/lib/EPUBHTMLManager.cpp
+index 363b33e..5e96d1d 100644
+--- a/src/lib/EPUBHTMLManager.cpp
++++ b/src/lib/EPUBHTMLManager.cpp
+@@ -22,10 +22,16 @@ namespace
+ {
+ 
+ /// Extracts a title string from a path and provides a fallback if it would be empty.
+-void getPathTitle(std::ostringstream &label, const EPUBPath &path, std::vector<EPUBPath>::size_type index)
++void getPathTitle(std::ostringstream &label, const EPUBPath &path, EPUBLayoutMethod layout, std::vector<EPUBPath>::size_type index)
+ {
+   if (path.getTitle().empty())
+-    label << "Section " << (index + 1);
++  {
++    if (layout == EPUB_LAYOUT_METHOD_FIXED)
++      label << "Page ";
++    else
++      label << "Section ";
++    label << (index + 1);
++  }
+   else
+     label << path.getTitle();
+ }
+@@ -81,9 +87,9 @@ void EPUBHTMLManager::writeSpineTo(EPUBXMLSink &sink)
+   }
+ }
+ 
+-void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version)
++void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version, EPUBLayoutMethod layout)
+ {
+-  if (version == 30)
++  if (version >= 30)
+   {
+     for (std::vector<EPUBPath>::size_type i = 0; m_paths.size() != i; ++i)
+     {
+@@ -92,7 +98,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
+       anchorAttrs.insert("href", m_paths[i].relativeTo(tocPath).str().c_str());
+       sink.openElement("a", anchorAttrs);
+       std::ostringstream label;
+-      getPathTitle(label, m_paths[i], i);
++      getPathTitle(label, m_paths[i], layout, i);
+       sink.insertCharacters(label.str().c_str());
+       sink.closeElement("a");
+       sink.closeElement("li");
+@@ -115,7 +121,7 @@ void EPUBHTMLManager::writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int
+     sink.openElement("navLabel");
+     sink.openElement("text");
+     std::ostringstream label;
+-    getPathTitle(label, m_paths[i], i);
++    getPathTitle(label, m_paths[i], layout, i);
+     sink.insertCharacters(label.str().c_str());
+     sink.closeElement("text");
+     sink.closeElement("navLabel");
+diff --git a/src/lib/EPUBHTMLManager.h b/src/lib/EPUBHTMLManager.h
+index 31e6dfe..157896b 100644
+--- a/src/lib/EPUBHTMLManager.h
++++ b/src/lib/EPUBHTMLManager.h
+@@ -46,7 +46,7 @@ public:
+   void writeTo(EPUBPackage &package);
+ 
+   void writeSpineTo(EPUBXMLSink &sink);
+-  void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version);
++  void writeTocTo(EPUBXMLSink &sink, const EPUBPath &tocPath, int version, EPUBLayoutMethod layout);
+ 
+   /// Appends text to the title of the current heading.
+   void insertHeadingText(const std::string &text);
+diff --git a/src/lib/EPUBPagedGenerator.cpp b/src/lib/EPUBPagedGenerator.cpp
+index 6a3bff0..b3a06e4 100644
+--- a/src/lib/EPUBPagedGenerator.cpp
++++ b/src/lib/EPUBPagedGenerator.cpp
+@@ -25,7 +25,7 @@ class EPUBPagedGenerator::Impl : public EPUBGenerator
+   Impl &operator=(const Impl &);
+ 
+ public:
+-  Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
++  Impl(EPUBPackage *const package, int version);
+ 
+ private:
+   void startHtmlFile() override;
+@@ -35,12 +35,17 @@ public:
+   bool m_firstPage;
+ };
+ 
+-EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
+-  : EPUBGenerator(package, method, version)
++EPUBPagedGenerator::Impl::Impl(EPUBPackage *const package, int version)
++  : EPUBGenerator(package, version)
+   , m_firstPage(true)
+ {
+ }
+ 
++void EPUBPagedGenerator::setSplitMethod(EPUBSplitMethod split)
++{
++  m_impl->setSplitMethod(split);
++}
++
+ void EPUBPagedGenerator::setSplitHeadingLevel(const unsigned level)
+ {
+   m_impl->getSplitGuard().setSplitHeadingLevel(level);
+@@ -59,8 +64,8 @@ void EPUBPagedGenerator::Impl::endHtmlFile()
+ {
+ }
+ 
+-EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
+-  : m_impl(new Impl(package, method, version))
++EPUBPagedGenerator::EPUBPagedGenerator(EPUBPackage *const package, int version)
++  : m_impl(new Impl(package, version))
+ {
+ }
+ 
+diff --git a/src/lib/EPUBPagedGenerator.h b/src/lib/EPUBPagedGenerator.h
+index 74d70da..4effb65 100644
+--- a/src/lib/EPUBPagedGenerator.h
++++ b/src/lib/EPUBPagedGenerator.h
+@@ -26,8 +26,9 @@ class EPUBPagedGenerator: public librevenge::RVNGPresentationInterface
+   class Impl;
+ 
+ public:
+-  EPUBPagedGenerator(EPUBPackage *package, EPUBSplitMethod method, int version);
++  EPUBPagedGenerator(EPUBPackage *package, int version);
+ 
++  void setSplitMethod(EPUBSplitMethod split);
+   void setSplitHeadingLevel(unsigned level);
+   void setSplitSize(unsigned size);
+ 
+diff --git a/src/lib/EPUBPresentationGenerator.cpp b/src/lib/EPUBPresentationGenerator.cpp
+index 80b5ac2..3ebca24 100644
+--- a/src/lib/EPUBPresentationGenerator.cpp
++++ b/src/lib/EPUBPresentationGenerator.cpp
+@@ -20,18 +20,17 @@ using librevenge::RVNGString;
+ class EPUBPresentationGenerator::Impl : public EPUBPagedGenerator
+ {
+ public:
+-  Impl(EPUBPackage *const package, EPUBSplitMethod method, int version);
++  Impl(EPUBPackage *const package, int version);
+ };
+ 
+-EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
+-  : EPUBPagedGenerator(package, method, version)
++EPUBPresentationGenerator::Impl::Impl(EPUBPackage *const package, int version)
++  : EPUBPagedGenerator(package, version)
+ {
+ }
+ 
+-EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, EPUBSplitMethod method, int version)
+-  : m_impl(new Impl(package, method, version))
++EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBPackage *const package, int version)
++  : m_impl(new Impl(package, version))
+ {
+-  (void) method;
+ }
+ 
+ EPUBPresentationGenerator::EPUBPresentationGenerator(EPUBEmbeddingContact &contact, EPUBPackage *const package)
+@@ -47,6 +46,16 @@ EPUBPresentationGenerator::~EPUBPresentationGenerator()
+   delete m_impl;
+ }
+ 
++void EPUBPresentationGenerator::setOption(int key, int value)
++{
++  switch (key)
++  {
++  case EPUB_GENERATOR_OPTION_SPLIT:
++    m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value));
++    break;
++  }
++}
++
+ void EPUBPresentationGenerator::setSplitHeadingLevel(const unsigned level)
+ {
+   m_impl->setSplitHeadingLevel(level);
+diff --git a/src/lib/EPUBTextGenerator.cpp b/src/lib/EPUBTextGenerator.cpp
+index 38573ec..78eeaae 100644
+--- a/src/lib/EPUBTextGenerator.cpp
++++ b/src/lib/EPUBTextGenerator.cpp
+@@ -67,7 +67,7 @@ bool isPageBreak(const librevenge::RVNGProperty *property)
+ 
+ struct EPUBTextGenerator::Impl : public EPUBGenerator
+ {
+-  Impl(EPUBPackage *package, EPUBSplitMethod method, int version);
++  Impl(EPUBPackage *package, int version);
+ 
+ private:
+   void startHtmlFile() override;
+@@ -93,8 +93,8 @@ private:
+   Impl &operator=(const Impl &);
+ };
+ 
+-EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, const EPUBSplitMethod method, int version)
+-  : EPUBGenerator(package, method, version)
++EPUBTextGenerator::Impl::Impl(EPUBPackage *const package, int version)
++  : EPUBGenerator(package, version)
+   , m_inPageSpan(false)
+   , m_inHeader(false)
+   , m_inFooter(false)
+@@ -123,10 +123,9 @@ void EPUBTextGenerator::Impl::endHtmlFile()
+     m_currentFooter->write(getHtml().get());
+ }
+ 
+-EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, const EPUBSplitMethod method, int version)
+-  : m_impl(new Impl(package, method, version))
++EPUBTextGenerator::EPUBTextGenerator(EPUBPackage *const package, int version)
++  : m_impl(new Impl(package, version))
+ {
+-  (void) method;
+ }
+ 
+ EPUBTextGenerator::EPUBTextGenerator(EPUBEmbeddingContact &contact, EPUBPackage *const package)
+@@ -152,14 +151,20 @@ void EPUBTextGenerator::setSplitSize(const unsigned size)
+   m_impl->getSplitGuard().setSplitSize(size);
+ }
+ 
+-void EPUBTextGenerator::setStylesMethod(EPUBStylesMethod styles)
++void EPUBTextGenerator::setOption(int key, int value)
+ {
+-  m_impl->setStylesMethod(styles);
+-}
+-
+-void EPUBTextGenerator::setLayoutMethod(EPUBLayoutMethod layout)
+-{
+-  m_impl->setLayoutMethod(layout);
++  switch (key)
++  {
++  case EPUB_GENERATOR_OPTION_SPLIT:
++    m_impl->setSplitMethod(static_cast<EPUBSplitMethod>(value));
++    break;
++  case EPUB_GENERATOR_OPTION_STYLES:
++    m_impl->setStylesMethod(static_cast<EPUBStylesMethod>(value));
++    break;
++  case EPUB_GENERATOR_OPTION_LAYOUT:
++    m_impl->setLayoutMethod(static_cast<EPUBLayoutMethod>(value));
++    break;
++  }
+ }
+ 
+ void EPUBTextGenerator::registerEmbeddedImageHandler(const librevenge::RVNGString &mimeType, EPUBEmbeddedImage imageHandler)
diff --git a/writerperfect/source/writer/EPUBExportFilter.cxx b/writerperfect/source/writer/EPUBExportFilter.cxx
index 301bdeb6f460..2d06e2c2e34f 100644
--- a/writerperfect/source/writer/EPUBExportFilter.cxx
+++ b/writerperfect/source/writer/EPUBExportFilter.cxx
@@ -95,13 +95,14 @@ sal_Bool EPUBExportFilter::filter(const uno::Sequence<beans::PropertyValue> &rDe
     // file, the flat ODF filter has access to the doc model, everything else
     // is in-between.
     EPUBPackage aPackage(mxContext, rDescriptor);
-    libepubgen::EPUBTextGenerator aGenerator(&aPackage, static_cast<libepubgen::EPUBSplitMethod>(nSplitMethod)
+    libepubgen::EPUBTextGenerator aGenerator(&aPackage
 #if LIBEPUBGEN_VERSION_SUPPORT
                                              , nVersion
 #endif
                                             );
 #if LIBEPUBGEN_VERSION_SUPPORT
-    aGenerator.setLayoutMethod(static_cast<libepubgen::EPUBLayoutMethod>(nLayoutMethod));
+    aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_SPLIT, nSplitMethod);
+    aGenerator.setOption(libepubgen::EPUB_GENERATOR_OPTION_LAYOUT, nLayoutMethod);
 #endif
     OUString aSourceURL;
     uno::Reference<frame::XModel> xSourceModel(mxSourceDocument, uno::UNO_QUERY);
commit 19339e79e41cb9bbbbf0bd9a0e0d4a2cccc1f6a5
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Dec 1 11:00:09 2017 +0100

    EPUB export, fixed layout: remove old non-metafile-based page size approach
    
    This was unused code.
    
    Change-Id: I7f728544127dc283cd74e4425e699d598caeae1a
    Reviewed-on: https://gerrit.libreoffice.org/45649
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/writerperfect/source/writer/exp/txtparai.cxx b/writerperfect/source/writer/exp/txtparai.cxx
index 95f85d86f454..309f80ce607a 100644
--- a/writerperfect/source/writer/exp/txtparai.cxx
+++ b/writerperfect/source/writer/exp/txtparai.cxx
@@ -397,13 +397,6 @@ void XMLParaContext::startElement(const OUString &/*rName*/, const css::uno::Ref
         }
     }
 
-    if (!mrImport.IsPageSpanOpened())
-    {
-        auto it = mrImport.GetMasterPages().find("Standard");
-        if (it != mrImport.GetMasterPages().end())
-            mrImport.GetGenerator().openPageSpan(it->second);
-        mrImport.SetPageSpanOpened(true);
-    }
     mrImport.GetGenerator().openParagraph(aPropertyList);
 }
 
diff --git a/writerperfect/source/writer/exp/txtstyli.cxx b/writerperfect/source/writer/exp/txtstyli.cxx
index 38b32768ddf0..e8fe1a43bea0 100644
--- a/writerperfect/source/writer/exp/txtstyli.cxx
+++ b/writerperfect/source/writer/exp/txtstyli.cxx
@@ -320,102 +320,6 @@ librevenge::RVNGPropertyList &XMLStyleContext::GetGraphicPropertyList()
     return m_aGraphicPropertyList;
 }
 
-XMLMasterPageContext::XMLMasterPageContext(XMLImport &rImport, XMLStylesContext &rStyles)
-    : XMLImportContext(rImport),
-      m_rStyles(rStyles)
-{
-    // I'll remove this in a follow-up commit.
-    (void)m_rStyles;
-}
-
-void XMLMasterPageContext::startElement(const OUString &/*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs)
-{
-    OUString aName;
-    OUString aPageLayoutName;
-    for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
-    {
-        const OUString &rAttributeName = xAttribs->getNameByIndex(i);
-        const OUString &rAttributeValue = xAttribs->getValueByIndex(i);
-        if (rAttributeName == "style:name")
-            aName = rAttributeValue;
-        else if (rAttributeName == "style:page-layout-name")
-            aPageLayoutName = rAttributeValue;
-    }
-    auto it = mrImport.GetPageLayouts().find(aPageLayoutName);
-    if (it == mrImport.GetPageLayouts().end())
-        return;
-
-    librevenge::RVNGPropertyList::Iter itProp(it->second);
-    librevenge::RVNGPropertyList aPropertyList;
-    for (itProp.rewind(); itProp.next();)
-        aPropertyList.insert(itProp.key(), itProp()->clone());
-    mrImport.GetMasterPages()[aName] = aPropertyList;
-}
-
-/// Handler for <style:page-layout-properties>.
-class XMLPageLayoutPropertiesContext : public XMLImportContext
-{
-public:
-    XMLPageLayoutPropertiesContext(XMLImport &rImport, XMLPageLayoutContext &rStyle);
-
-    void SAL_CALL startElement(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
-
-private:
-    XMLPageLayoutContext &m_rStyle;
-};
-
-XMLPageLayoutPropertiesContext::XMLPageLayoutPropertiesContext(XMLImport &rImport, XMLPageLayoutContext &rStyle)
-    : XMLImportContext(rImport)
-    , m_rStyle(rStyle)
-{
-}
-
-void XMLPageLayoutPropertiesContext::startElement(const OUString &/*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs)
-{
-    for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
-    {
-        OString sName = OUStringToOString(xAttribs->getNameByIndex(i), RTL_TEXTENCODING_UTF8);
-        OString sValue = OUStringToOString(xAttribs->getValueByIndex(i), RTL_TEXTENCODING_UTF8);
-        m_rStyle.GetPropertyList().insert(sName.getStr(), sValue.getStr());
-    }
-}
-
-XMLPageLayoutContext::XMLPageLayoutContext(XMLImport &rImport, XMLStylesContext &rStyles)
-    : XMLImportContext(rImport),
-      m_rStyles(rStyles)
-{
-}
-
-void XMLPageLayoutContext::startElement(const OUString &/*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs)
-{
-    for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i)
-    {
-        const OUString &rAttributeName = xAttribs->getNameByIndex(i);
-        const OUString &rAttributeValue = xAttribs->getValueByIndex(i);
-        if (rAttributeName == "style:name")
-            m_aName = rAttributeValue;
-    }
-}
-
-rtl::Reference<XMLImportContext> XMLPageLayoutContext::CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
-{
-    if (rName == "style:page-layout-properties")
-        return new XMLPageLayoutPropertiesContext(mrImport, *this);
-    return nullptr;
-}
-
-void XMLPageLayoutContext::endElement(const OUString &/*rName*/)
-{
-    if (m_aName.isEmpty())
-        return;
-
-    m_rStyles.GetCurrentPageLayouts()[m_aName] = m_aPropertyList;
-}
-
-librevenge::RVNGPropertyList &XMLPageLayoutContext::GetPropertyList()
-{
-    return m_aPropertyList;
-}
 } // namespace exp
 } // namespace writerperfect
 
diff --git a/writerperfect/source/writer/exp/txtstyli.hxx b/writerperfect/source/writer/exp/txtstyli.hxx
index 06ae15e503f8..f3b3b6da38c9 100644
--- a/writerperfect/source/writer/exp/txtstyli.hxx
+++ b/writerperfect/source/writer/exp/txtstyli.hxx
@@ -52,35 +52,6 @@ private:
     XMLStylesContext &m_rStyles;
 };
 
-/// Handler for <style:master-page>.
-class XMLMasterPageContext : public XMLImportContext
-{
-public:
-    XMLMasterPageContext(XMLImport &rImport, XMLStylesContext &rStyles);
-
-    void SAL_CALL startElement(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
-
-private:
-    XMLStylesContext &m_rStyles;
-};
-
-/// Handler for <style:page-layout>.
-class XMLPageLayoutContext : public XMLImportContext
-{
-public:
-    XMLPageLayoutContext(XMLImport &rImport, XMLStylesContext &rStyles);
-
-    rtl::Reference<XMLImportContext> CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
-    void SAL_CALL startElement(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
-    void SAL_CALL endElement(const OUString &rName) override;
-
-    librevenge::RVNGPropertyList &GetPropertyList();
-private:
-    OUString m_aName;
-    librevenge::RVNGPropertyList m_aPropertyList;
-    XMLStylesContext &m_rStyles;
-};
-
 } // namespace exp
 } // namespace writerperfect
 
diff --git a/writerperfect/source/writer/exp/xmlfmt.cxx b/writerperfect/source/writer/exp/xmlfmt.cxx
index a4b0781c73f9..e33f299f5c0e 100644
--- a/writerperfect/source/writer/exp/xmlfmt.cxx
+++ b/writerperfect/source/writer/exp/xmlfmt.cxx
@@ -28,9 +28,7 @@ XMLStylesContext::XMLStylesContext(XMLImport &rImport, StyleType eType)
       m_rColumnStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticColumnStyles() : mrImport.GetColumnStyles()),
       m_rRowStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticRowStyles() : mrImport.GetRowStyles()),
       m_rTableStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticTableStyles() : mrImport.GetTableStyles()),
-      m_rGraphicStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticGraphicStyles() : mrImport.GetGraphicStyles()),
-      m_rPageLayouts(mrImport.GetPageLayouts()),
-      m_eType(eType)
+      m_rGraphicStyles(eType == StyleType_AUTOMATIC ? mrImport.GetAutomaticGraphicStyles() : mrImport.GetGraphicStyles())
 {
 }
 
@@ -38,10 +36,6 @@ rtl::Reference<XMLImportContext> XMLStylesContext::CreateChildContext(const OUSt
 {
     if (rName == "style:style")
         return new XMLStyleContext(mrImport, *this);
-    if (m_eType == StyleType_MASTER && rName == "style:master-page")
-        return new XMLMasterPageContext(mrImport, *this);
-    if (m_eType == StyleType_AUTOMATIC && rName == "style:page-layout")
-        return new XMLPageLayoutContext(mrImport, *this);
     return nullptr;
 }
 
@@ -80,11 +74,6 @@ std::map<OUString, librevenge::RVNGPropertyList> &XMLStylesContext::GetCurrentGr
     return m_rGraphicStyles;
 }
 
-std::map<OUString, librevenge::RVNGPropertyList> &XMLStylesContext::GetCurrentPageLayouts()
-{
-    return m_rPageLayouts;
-}
-
 /// Handler for <style:font-face>.
 class XMLFontFaceContext : public XMLImportContext
 {
diff --git a/writerperfect/source/writer/exp/xmlfmt.hxx b/writerperfect/source/writer/exp/xmlfmt.hxx
index 24ee493cd660..e66f37dc8846 100644
--- a/writerperfect/source/writer/exp/xmlfmt.hxx
+++ b/writerperfect/source/writer/exp/xmlfmt.hxx
@@ -21,15 +21,14 @@ namespace writerperfect
 namespace exp
 {
 
-/// Handler for <office:automatic-styles>/<office:master-styles>/<office:styles>.
+/// Handler for <office:automatic-styles>/<office:styles>.
 class XMLStylesContext : public XMLImportContext
 {
 public:
     enum StyleType
     {
         StyleType_NONE,
-        StyleType_AUTOMATIC,
-        StyleType_MASTER
+        StyleType_AUTOMATIC
     };
     XMLStylesContext(XMLImport &rImport, StyleType eType);
 
@@ -42,7 +41,6 @@ public:
     std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentRowStyles();
     std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentTableStyles();
     std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentGraphicStyles();
-    std::map<OUString, librevenge::RVNGPropertyList> &GetCurrentPageLayouts();
 private:
     std::map<OUString, librevenge::RVNGPropertyList> &m_rParagraphStyles;
     std::map<OUString, librevenge::RVNGPropertyList> &m_rTextStyles;
@@ -51,8 +49,6 @@ private:
     std::map<OUString, librevenge::RVNGPropertyList> &m_rRowStyles;
     std::map<OUString, librevenge::RVNGPropertyList> &m_rTableStyles;
     std::map<OUString, librevenge::RVNGPropertyList> &m_rGraphicStyles;
-    std::map<OUString, librevenge::RVNGPropertyList> &m_rPageLayouts;
-    StyleType m_eType;
 };
 
 /// Handler for <office:font-face-decls>.
diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx
index 6750019216e3..f8defce11dc4 100644
--- a/writerperfect/source/writer/exp/xmlimp.cxx
+++ b/writerperfect/source/writer/exp/xmlimp.cxx
@@ -255,8 +255,6 @@ rtl::Reference<XMLImportContext> XMLOfficeDocContext::CreateChildContext(const O
         return new XMLStylesContext(mrImport, XMLStylesContext::StyleType_NONE);
     if (rName == "office:font-face-decls")
         return new XMLFontFaceDeclsContext(mrImport);
-    if (rName == "office:master-styles")
-        return new XMLStylesContext(mrImport, XMLStylesContext::StyleType_MASTER);
     if (rName == "office:body")
     {
         if (mrImport.GetPageMetafiles().empty())
@@ -409,16 +407,6 @@ bool XMLImport::FillPopupData(const OUString &rURL, librevenge::RVNGPropertyList
     return false;
 }
 
-void XMLImport::SetPageSpanOpened(bool bPageSpanOpened)
-{
-    mbPageSpanOpened = bPageSpanOpened;
-}
-
-bool XMLImport::IsPageSpanOpened() const
-{
-    return mbPageSpanOpened;
-}
-
 const std::vector<std::pair<uno::Sequence<sal_Int8>, Size>> &XMLImport::GetPageMetafiles() const
 {
     return mrPageMetafiles;
@@ -511,16 +499,6 @@ std::map<OUString, librevenge::RVNGPropertyList> &XMLImport::GetGraphicStyles()
     return maGraphicStyles;
 }
 
-std::map<OUString, librevenge::RVNGPropertyList> &XMLImport::GetPageLayouts()
-{
-    return maPageLayouts;
-}
-
-std::map<OUString, librevenge::RVNGPropertyList> &XMLImport::GetMasterPages()
-{
-    return maMasterPages;
-}
-
 void XMLImport::startDocument()
 {
     mrGenerator.startDocument(librevenge::RVNGPropertyList());
@@ -528,11 +506,6 @@ void XMLImport::startDocument()
 
 void XMLImport::endDocument()
 {
-    if (mbPageSpanOpened)
-    {
-        mrGenerator.closePageSpan();
-        mbPageSpanOpened = false;
-    }
     mrGenerator.endDocument();
 }
 
diff --git a/writerperfect/source/writer/exp/xmlimp.hxx b/writerperfect/source/writer/exp/xmlimp.hxx
index c5a84852603b..a6d2a49f1f59 100644
--- a/writerperfect/source/writer/exp/xmlimp.hxx
+++ b/writerperfect/source/writer/exp/xmlimp.hxx
@@ -54,15 +54,12 @@ class XMLImport : public cppu::WeakImplHelper
     std::map<OUString, librevenge::RVNGPropertyList> maTableStyles;
     std::map<OUString, librevenge::RVNGPropertyList> maAutomaticGraphicStyles;
     std::map<OUString, librevenge::RVNGPropertyList> maGraphicStyles;
-    std::map<OUString, librevenge::RVNGPropertyList> maPageLayouts;
-    std::map<OUString, librevenge::RVNGPropertyList> maMasterPages;
     librevenge::RVNGPropertyListVector maCoverImages;
     /// Author, date, etc -- overwrites what would be from the document out of the box.
     librevenge::RVNGPropertyList maMetaData;
     const css::uno::Reference<css::uno::XComponentContext> &mxContext;
     css::uno::Reference<css::uri::XUriReferenceFactory> mxUriReferenceFactory;
     OUString maMediaDir;
-    bool mbPageSpanOpened = false;
     const std::vector<std::pair<css::uno::Sequence<sal_Int8>, Size>> &mrPageMetafiles;
 
 public:
@@ -85,13 +82,9 @@ public:
     std::map<OUString, librevenge::RVNGPropertyList> &GetRowStyles();
     std::map<OUString, librevenge::RVNGPropertyList> &GetTableStyles();
     std::map<OUString, librevenge::RVNGPropertyList> &GetGraphicStyles();
-    std::map<OUString, librevenge::RVNGPropertyList> &GetPageLayouts();
-    std::map<OUString, librevenge::RVNGPropertyList> &GetMasterPages();
     const librevenge::RVNGPropertyListVector &GetCoverImages();
     const librevenge::RVNGPropertyList &GetMetaData();
     bool FillPopupData(const OUString &rURL, librevenge::RVNGPropertyList &rPropList);
-    void SetPageSpanOpened(bool bPageSpanOpened);
-    bool IsPageSpanOpened() const;
     const std::vector<std::pair<css::uno::Sequence<sal_Int8>, Size>> &GetPageMetafiles() const;
     const css::uno::Reference<css::uno::XComponentContext> &GetComponentContext() const;
 
commit e83d7993d46b096ecc18c01d92d39e170cce18c1
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Dec 1 10:59:36 2017 +0100

    EPUB export, fixed layout: disable DTD string in SVG header
    
    epubcheck complains:
    
    ERROR(HTM-003): test.epub/OEBPS/images/image0001.svg(5675,37): External entities are not allowed in EPUB v3 documents. External entity declaration found: %svg-extensibility.mod.
    
    and similar ones. Just not writing the DTD header is enough to address
    the error.
    
    Change-Id: I5307e932a0f07585297cce734aceae77e43cc7a6
    Reviewed-on: https://gerrit.libreoffice.org/45648
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/filter/source/svg/impsvgdialog.hxx b/filter/source/svg/impsvgdialog.hxx
index 0e31fc33bef1..9f1d04fa9a32 100644
--- a/filter/source/svg/impsvgdialog.hxx
+++ b/filter/source/svg/impsvgdialog.hxx
@@ -31,6 +31,7 @@
 
 #define SVG_EXPORTFILTER_CONFIGPATH         "Office.Common/Filter/SVG/Export/"
 #define SVG_PROP_TINYPROFILE                "TinyMode"
+#define SVG_PROP_DTDSTRING                  "DTDString"
 #define SVG_PROP_EMBEDFONTS                 "EmbedFonts"
 #define SVG_PROP_NATIVEDECORATION           "UseNativeTextDecoration"
 #define SVG_PROP_OPACITY                    "Opacity"
diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx
index ce4c169f78bc..ab4cb14f5910 100644
--- a/filter/source/svg/svgexport.cxx
+++ b/filter/source/svg/svgexport.cxx
@@ -317,6 +317,9 @@ SVGExport::SVGExport(
     // TinyProfile
     mbIsUseTinyProfile = aFilterDataHashMap.getUnpackedValueOrDefault(SVG_PROP_TINYPROFILE, false);
 
+    // DTD string
+    mbIsUseDTDString = aFilterDataHashMap.getUnpackedValueOrDefault(SVG_PROP_DTDSTRING, true);
+
     // Font Embedding
     comphelper::SequenceAsHashMap::const_iterator iter = aFilterDataHashMap.find(SVG_PROP_EMBEDFONTS);
     if(iter==aFilterDataHashMap.end())
@@ -2307,7 +2310,7 @@ void SVGExport::writeMtf( const GDIMetaFile& rMtf )
     rtl::OUString aAttr;
     Reference< XExtendedDocumentHandler> xExtDocHandler( GetDocHandler(), UNO_QUERY );
 
-    if( xExtDocHandler.is() )
+    if( xExtDocHandler.is() && IsUseDTDString() )
         xExtDocHandler->unknown( SVG_DTD_STRING );
 
     aAttr = OUString::number( aSize.Width() );
diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx
index 11ae4dea86cc..e006e8071684 100644
--- a/filter/source/svg/svgfilter.hxx
+++ b/filter/source/svg/svgfilter.hxx
@@ -71,6 +71,7 @@ static const OUString sPlaceholderTag( "<[:isPlaceholder:]>" );
 class SVGExport : public SvXMLExport
 {
     bool    mbIsUseTinyProfile;
+    bool    mbIsUseDTDString;
     bool    mbIsEmbedFonts;
     bool    mbIsUseOpacity;
     bool    mbIsUseNativeTextDecoration;
@@ -85,6 +86,7 @@ public:
     virtual ~SVGExport() override;
 
     bool IsUseTinyProfile() const { return mbIsUseTinyProfile; };
+    bool IsUseDTDString() const { return mbIsUseDTDString; };
     bool IsEmbedFonts() const { return mbIsEmbedFonts; };
     bool IsUseOpacity() const { return mbIsUseOpacity; };
     bool IsUseNativeTextDecoration() const { return mbIsUseNativeTextDecoration; };
diff --git a/writerperfect/qa/unit/EPUBExportTest.cxx b/writerperfect/qa/unit/EPUBExportTest.cxx
index bd42356e60ce..178041d9c0da 100644
--- a/writerperfect/qa/unit/EPUBExportTest.cxx
+++ b/writerperfect/qa/unit/EPUBExportTest.cxx
@@ -96,6 +96,7 @@ public:
     void testPopup();
     void testPopupAPI();
     void testPageSize();
+    void testSVG();
 
     CPPUNIT_TEST_SUITE(EPUBExportTest);
     CPPUNIT_TEST(testOutlineLevel);
@@ -139,6 +140,7 @@ public:
     CPPUNIT_TEST(testPopup);
     CPPUNIT_TEST(testPopupAPI);
     CPPUNIT_TEST(testPageSize);
+    CPPUNIT_TEST(testSVG);
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -813,6 +815,29 @@ void EPUBExportTest::testPageSize()
     assertXPath(mpXmlDoc, "/xhtml:html/xhtml:head/xhtml:meta[@name='viewport']", "content", "width=816, height=1056");
 }
 
+void EPUBExportTest::testSVG()
+{
+    uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence(
+    {
+        {"EPUBLayoutMethod", uno::makeAny(static_cast<sal_Int32>(libepubgen::EPUB_LAYOUT_METHOD_FIXED))}
+    }));
+    createDoc("hello.fodt", aFilterData);
+
+    CPPUNIT_ASSERT(mxZipFile->hasByName("OEBPS/images/image0001.svg"));
+    uno::Reference<io::XInputStream> xInputStream(mxZipFile->getByName("OEBPS/images/image0001.svg"), uno::UNO_QUERY);
+    std::shared_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+
+    SvMemoryStream aMemoryStream;
+    aMemoryStream.WriteStream(*pStream);
+    OString aExpected("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<svg");
+    CPPUNIT_ASSERT(aMemoryStream.GetSize() > static_cast<sal_uInt64>(aExpected.getLength()));
+
+    // This failed, there was a '<!DOCTYPE' line between the xml and the svg
+    // one, causing a validation error.
+    OString aActual(static_cast<const char *>(aMemoryStream.GetBuffer()), aExpected.getLength());
+    CPPUNIT_ASSERT_EQUAL(aExpected, aActual);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(EPUBExportTest);
 
 }
diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx
index 4686cd95ad64..6750019216e3 100644
--- a/writerperfect/source/writer/exp/xmlimp.cxx
+++ b/writerperfect/source/writer/exp/xmlimp.cxx
@@ -17,6 +17,7 @@
 #include <com/sun/star/xml/sax/InputSource.hpp>
 #include <com/sun/star/xml/sax/Parser.hpp>
 #include <com/sun/star/xml/sax/Writer.hpp>
+#include <comphelper/propertyvalue.hxx>
 #include <rtl/uri.hxx>
 #include <tools/stream.hxx>
 #include <tools/urlobj.hxx>
@@ -283,7 +284,10 @@ void XMLOfficeDocContext::HandleFixedLayoutPage(const uno::Sequence<sal_Int8> &r
     if (!xSaxWriter.is())
         return;
 
-    uno::Sequence<uno::Any> aArguments;
+    uno::Sequence<uno::Any> aArguments =
+    {
+        uno::makeAny(uno::Sequence<beans::PropertyValue>({comphelper::makePropertyValue("DTDString", false)}))
+    };
     uno::Reference<svg::XSVGWriter> xSVGWriter(xCtx->getServiceManager()->createInstanceWithArgumentsAndContext("com.sun.star.svg.SVGWriter", aArguments, xCtx), uno::UNO_QUERY);
     if (!xSVGWriter.is())
         return;


More information about the Libreoffice-commits mailing list