external/libepubgen/libepubgen-epub3.patch.1 |  126 +++++++++++++++++++++++++++
 writerperfect/Library_wpftwriter.mk          |    1 
 writerperfect/source/writer/exp/xmlimp.cxx   |    3 
 writerperfect/source/writer/exp/xmlmetai.cxx |  111 +++++++++++++++++++++++
 writerperfect/source/writer/exp/xmlmetai.hxx |   40 ++++++++
 5 files changed, 281 insertions(+)

New commits:
commit aa2265c511bcf704f116e71c3cd440e4fe133289
Author: Miklos Vajna <vmik...@collabora.co.uk>
Date:   Fri Aug 11 18:39:33 2017 +0200

    EPUB export: improve metadata handling
    
    Handle language and document modification date, these two were the
    remaining ones where EPUB3 mandates a value.
    
    With this, the default values are not used if the document has custom
    values.
    
    Change-Id: Ief36e8143a530fe03ae9f96bbf5b3e33527f1555
    Reviewed-on: https://gerrit.libreoffice.org/41052
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk>

diff --git a/external/libepubgen/libepubgen-epub3.patch.1 
b/external/libepubgen/libepubgen-epub3.patch.1
index 5739f189a6dc..9f3493908b4e 100644
--- a/external/libepubgen/libepubgen-epub3.patch.1
+++ b/external/libepubgen/libepubgen-epub3.patch.1
@@ -971,3 +971,100 @@ index 8017ffe..056c48c 100644
 -- 
 2.12.3
 
+From 14da42819f1f96b87b2337da395e5ad6639dcebe Mon Sep 17 00:00:00 2001
+From: Miklos Vajna <vmik...@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 <vmik...@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
+
diff --git a/writerperfect/source/writer/exp/xmlmetai.cxx 
b/writerperfect/source/writer/exp/xmlmetai.cxx
index c6251dccafff..cc8b37f43a0a 100644
--- a/writerperfect/source/writer/exp/xmlmetai.cxx
+++ b/writerperfect/source/writer/exp/xmlmetai.cxx
@@ -40,6 +40,50 @@ void XMLDcTitleContext::characters(const OUString &rChars)
     mrMeta.m_aPropertyList.insert("dc:title", 
librevenge::RVNGString(sCharU8.getStr()));
 }
 
+/// Handler for <dc:language>.
+class XMLDcLanguageContext : public XMLImportContext
+{
+public:
+    XMLDcLanguageContext(XMLImport &rImport, XMLMetaDocumentContext &rMeta);
+
+    void SAL_CALL characters(const OUString &rChars) override;
+
+    XMLMetaDocumentContext &mrMeta;
+};
+
+XMLDcLanguageContext::XMLDcLanguageContext(XMLImport &rImport, 
XMLMetaDocumentContext &rMeta)
+    : XMLImportContext(rImport), mrMeta(rMeta)
+{
+}
+
+void XMLDcLanguageContext::characters(const OUString &rChars)
+{
+    OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+    mrMeta.m_aPropertyList.insert("dc:language", 
librevenge::RVNGString(sCharU8.getStr()));
+}
+
+/// Handler for <dc:date>.
+class XMLDcDateContext : public XMLImportContext
+{
+public:
+    XMLDcDateContext(XMLImport &rImport, XMLMetaDocumentContext &rMeta);
+
+    void SAL_CALL characters(const OUString &rChars) override;
+
+    XMLMetaDocumentContext &mrMeta;
+};
+
+XMLDcDateContext::XMLDcDateContext(XMLImport &rImport, XMLMetaDocumentContext 
&rMeta)
+    : XMLImportContext(rImport), mrMeta(rMeta)
+{
+}
+
+void XMLDcDateContext::characters(const OUString &rChars)
+{
+    OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+    mrMeta.m_aPropertyList.insert("dc:date", 
librevenge::RVNGString(sCharU8.getStr()));
+}
+
 XMLMetaDocumentContext::XMLMetaDocumentContext(XMLImport &rImport)
     : XMLImportContext(rImport)
 {
@@ -49,6 +93,10 @@ XMLImportContext 
*XMLMetaDocumentContext::CreateChildContext(const OUString &rNa
 {
     if (rName == "dc:title")
         return new XMLDcTitleContext(mrImport, *this);
+    if (rName == "dc:language")
+        return new XMLDcLanguageContext(mrImport, *this);
+    if (rName == "dc:date")
+        return new XMLDcDateContext(mrImport, *this);
     return nullptr;
 }
 
commit a4eddfffaa1d2fd76a4c8a1013c11d80ccd8f1b2
Author: Miklos Vajna <vmik...@collabora.co.uk>
Date:   Fri Aug 11 18:38:51 2017 +0200

    EPUB export: add initial metadata support, document title
    
    librevenge also uses librevenge:descriptive-name next to dc:title for
    this purpose, but the later seems to be recommended in new code.
    
    Change-Id: I3c3887911945ad14960c7cbbccfa66716e519893
    Reviewed-on: https://gerrit.libreoffice.org/41044
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk>

diff --git a/external/libepubgen/libepubgen-epub3.patch.1 
b/external/libepubgen/libepubgen-epub3.patch.1
index a41fce29acef..5739f189a6dc 100644
--- a/external/libepubgen/libepubgen-epub3.patch.1
+++ b/external/libepubgen/libepubgen-epub3.patch.1
@@ -942,3 +942,32 @@ index ca05ea7..8017ffe 100644
 -- 
 2.12.3
 
+From d855721de6b4e55fb0b2a02a6a1132802dba5f63 Mon Sep 17 00:00:00 2001
+From: Miklos Vajna <vmik...@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
+
diff --git a/writerperfect/Library_wpftwriter.mk 
b/writerperfect/Library_wpftwriter.mk
index cf567b0af9f8..ba2172100f00 100644
--- a/writerperfect/Library_wpftwriter.mk
+++ b/writerperfect/Library_wpftwriter.mk
@@ -78,6 +78,7 @@ $(eval $(call gb_Library_add_exception_objects,wpftwriter,\
        writerperfect/source/writer/exp/txtparai \
        writerperfect/source/writer/exp/xmlictxt \
        writerperfect/source/writer/exp/xmlimp \
+       writerperfect/source/writer/exp/xmlmetai \
        writerperfect/source/writer/exp/xmltext \
 ))
 
diff --git a/writerperfect/source/writer/exp/xmlimp.cxx 
b/writerperfect/source/writer/exp/xmlimp.cxx
index b975bbcceebc..1b2365e16f5e 100644
--- a/writerperfect/source/writer/exp/xmlimp.cxx
+++ b/writerperfect/source/writer/exp/xmlimp.cxx
@@ -10,6 +10,7 @@
 #include "xmlimp.hxx"
 
 #include "xmlictxt.hxx"
+#include "xmlmetai.hxx"
 #include "xmltext.hxx"
 
 using namespace com::sun::star;
@@ -58,6 +59,8 @@ XMLImportContext 
*XMLOfficeDocContext::CreateChildContext(const OUString &rName,
 {
     if (rName == "office:body")
         return new XMLBodyContext(mrImport);
+    else if (rName == "office:meta")
+        return new XMLMetaDocumentContext(mrImport);
     return nullptr;
 }
 
diff --git a/writerperfect/source/writer/exp/xmlmetai.cxx 
b/writerperfect/source/writer/exp/xmlmetai.cxx
new file mode 100644
index 000000000000..c6251dccafff
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlmetai.cxx
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "xmlmetai.hxx"
+
+#include "xmlimp.hxx"
+
+using namespace com::sun::star;
+
+namespace writerperfect
+{
+namespace exp
+{
+
+/// Handler for <dc:title>.
+class XMLDcTitleContext : public XMLImportContext
+{
+public:
+    XMLDcTitleContext(XMLImport &rImport, XMLMetaDocumentContext &rMeta);
+
+    void SAL_CALL characters(const OUString &rChars) override;
+
+    XMLMetaDocumentContext &mrMeta;
+};
+
+XMLDcTitleContext::XMLDcTitleContext(XMLImport &rImport, 
XMLMetaDocumentContext &rMeta)
+    : XMLImportContext(rImport), mrMeta(rMeta)
+{
+}
+
+void XMLDcTitleContext::characters(const OUString &rChars)
+{
+    OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+    mrMeta.m_aPropertyList.insert("dc:title", 
librevenge::RVNGString(sCharU8.getStr()));
+}
+
+XMLMetaDocumentContext::XMLMetaDocumentContext(XMLImport &rImport)
+    : XMLImportContext(rImport)
+{
+}
+
+XMLImportContext *XMLMetaDocumentContext::CreateChildContext(const OUString 
&rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
+{
+    if (rName == "dc:title")
+        return new XMLDcTitleContext(mrImport, *this);
+    return nullptr;
+}
+
+void XMLMetaDocumentContext::endElement(const OUString &/*rName*/)
+{
+    mrImport.GetGenerator().setDocumentMetaData(m_aPropertyList);
+}
+
+} // namespace exp
+} // namespace writerperfect
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/writer/exp/xmlmetai.hxx 
b/writerperfect/source/writer/exp/xmlmetai.hxx
new file mode 100644
index 000000000000..b02e1f21caaf
--- /dev/null
+++ b/writerperfect/source/writer/exp/xmlmetai.hxx
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLMETAI_HXX
+#define INCLUDED_WRITERPERFECT_SOURCE_WRITER_EXP_XMLMETAI_HXX
+
+#include <librevenge/librevenge.h>
+
+#include "xmlictxt.hxx"
+
+namespace writerperfect
+{
+namespace exp
+{
+
+/// Handler for <office:meta>.
+class XMLMetaDocumentContext : public XMLImportContext
+{
+public:
+    XMLMetaDocumentContext(XMLImport &rImport);
+
+    XMLImportContext *CreateChildContext(const OUString &rName, const 
css::uno::Reference<css::xml::sax::XAttributeList> &xAttribs) override;
+
+    void SAL_CALL endElement(const OUString &rName) override;
+
+    librevenge::RVNGPropertyList m_aPropertyList;
+};
+
+} // namespace exp
+} // namespace writerperfect
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to