[Libreoffice-commits] core.git: 2 commits - external/libepubgen writerperfect/Library_wpftwriter.mk writerperfect/source
Miklos Vajna
vmiklos at collabora.co.uk
Fri Aug 11 19:55:53 UTC 2017
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 <vmiklos at 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 <ci at libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos at 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 <vmiklos at 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 at 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 <vmiklos at 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 <ci at libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos at 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 <vmiklos at 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: */
More information about the Libreoffice-commits
mailing list