summaryrefslogtreecommitdiff
path: root/writerperfect
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-08-07 10:09:19 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-08-07 11:20:26 +0200
commit7915f35d7fca5d0720d96954beaa97c00a2c3821 (patch)
tree711cc50fbdffe483f6d694dbb8c34322e3f40764 /writerperfect
parent147e20fc1bedfc9e9fc695a06d56445134f88021 (diff)
EPUB export: implement doc/para open/close and text in doc handler
This should be enough for plain text of multiple paragraphs, but the package part is still missing. Change-Id: I05fe87fd01e078262a1be9ce76eaaa016de484bf Reviewed-on: https://gerrit.libreoffice.org/40822 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'writerperfect')
-rw-r--r--writerperfect/source/writer/EPUBExportFilter.cxx14
-rw-r--r--writerperfect/source/writer/EPUBPackage.cxx4
-rw-r--r--writerperfect/source/writer/exp/xmlimp.cxx26
-rw-r--r--writerperfect/source/writer/exp/xmlimp.hxx7
4 files changed, 37 insertions, 14 deletions
diff --git a/writerperfect/source/writer/EPUBExportFilter.cxx b/writerperfect/source/writer/EPUBExportFilter.cxx
index 75032cae6ada..2bfe9b8b0824 100644
--- a/writerperfect/source/writer/EPUBExportFilter.cxx
+++ b/writerperfect/source/writer/EPUBExportFilter.cxx
@@ -9,6 +9,8 @@
#include "EPUBExportFilter.hxx"
+#include <libepubgen/EPUBTextGenerator.h>
+
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
@@ -30,16 +32,14 @@ EPUBExportFilter::EPUBExportFilter(const uno::Reference<uno::XComponentContext>
sal_Bool EPUBExportFilter::filter(const uno::Sequence<beans::PropertyValue> &rDescriptor)
{
- // The package writes to the output file.
+ // Build the export filter chain: the package has direct access to the ZIP
+ // file, the flat ODF filter has access to the doc model, everything else
+ // is in-between.
EPUBPackage aPackage(mxContext, rDescriptor);
+ libepubgen::EPUBTextGenerator aGenerator(&aPackage);
+ uno::Reference<xml::sax::XDocumentHandler> xExportHandler(new exp::XMLImport(aGenerator));
- // Create ODT exporter, this will feed our document handler.
uno::Reference<lang::XInitialization> xInitialization(mxContext->getServiceManager()->createInstanceWithContext("com.sun.star.comp.Writer.XMLOasisExporter", mxContext), uno::UNO_QUERY);
-
- // The document handler will make the calls on the text interface provided by the EPUB export.
- uno::Reference<xml::sax::XDocumentHandler> xExportHandler(new exp::XMLImport);
-
- // Let the ODT exporter read the doc model and invoke the doc handler.
xInitialization->initialize({uno::makeAny(xExportHandler)});
uno::Reference<document::XExporter> xExporter(xInitialization, uno::UNO_QUERY);
xExporter->setSourceDocument(mxSourceDocument);
diff --git a/writerperfect/source/writer/EPUBPackage.cxx b/writerperfect/source/writer/EPUBPackage.cxx
index 0296b183327c..54300c2fbf0a 100644
--- a/writerperfect/source/writer/EPUBPackage.cxx
+++ b/writerperfect/source/writer/EPUBPackage.cxx
@@ -38,9 +38,9 @@ void EPUBPackage::closeElement(const char *pName)
SAL_WARN("writerperfect", "EPUBPackage::closeElement, " << pName << ": implement me");
}
-void EPUBPackage::insertCharacters(const librevenge::RVNGString &/*rCharacters*/)
+void EPUBPackage::insertCharacters(const librevenge::RVNGString &rCharacters)
{
- SAL_WARN("writerperfect", "EPUBPackage::insertCharacters: implement me");
+ SAL_WARN("writerperfect", "EPUBPackage::insertCharacters, " << rCharacters.cstr() << ": implement me");
}
void EPUBPackage::closeXMLFile()
diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx
index 1c915857413e..21c4809ffc57 100644
--- a/writerperfect/source/writer/exp/xmlimp.cxx
+++ b/writerperfect/source/writer/exp/xmlimp.cxx
@@ -16,28 +16,46 @@ namespace writerperfect
namespace exp
{
-XMLImport::XMLImport()
+XMLImport::XMLImport(librevenge::RVNGTextInterface &rGenerator)
+ : mrGenerator(rGenerator)
{
}
void XMLImport::startDocument()
{
+ mrGenerator.startDocument(librevenge::RVNGPropertyList());
}
void XMLImport::endDocument()
{
+ mrGenerator.endDocument();
}
-void XMLImport::startElement(const OUString &/*rName*/, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
+void XMLImport::startElement(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
{
+ if (rName == "text:p")
+ {
+ mrGenerator.openParagraph(librevenge::RVNGPropertyList());
+ mbParagraphOpened = true;
+ }
}
-void XMLImport::endElement(const OUString &/*rName*/)
+void XMLImport::endElement(const OUString &rName)
{
+ if (rName == "text:p")
+ {
+ mrGenerator.closeParagraph();
+ mbParagraphOpened = false;
+ }
}
-void XMLImport::characters(const OUString &/*rChars*/)
+void XMLImport::characters(const OUString &rChars)
{
+ if (mbParagraphOpened)
+ {
+ OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
+ mrGenerator.insertText(librevenge::RVNGString(sCharU8.getStr()));
+ }
}
void XMLImport::ignorableWhitespace(const OUString &/*rWhitespaces*/)
diff --git a/writerperfect/source/writer/exp/xmlimp.hxx b/writerperfect/source/writer/exp/xmlimp.hxx
index 9d6d1eb4c0c6..2b1c743fcf03 100644
--- a/writerperfect/source/writer/exp/xmlimp.hxx
+++ b/writerperfect/source/writer/exp/xmlimp.hxx
@@ -12,6 +12,8 @@
#include <cppuhelper/implbase.hxx>
+#include <librevenge/librevenge.h>
+
#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
namespace writerperfect
@@ -25,8 +27,11 @@ class XMLImport : public cppu::WeakImplHelper
css::xml::sax::XDocumentHandler
>
{
+ librevenge::RVNGTextInterface &mrGenerator;
+ bool mbParagraphOpened = false;
+
public:
- XMLImport();
+ XMLImport(librevenge::RVNGTextInterface &rGenerator);
// XDocumentHandler
void SAL_CALL startDocument() override;