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