summaryrefslogtreecommitdiff
path: root/writerperfect/source/writer/exp/xmlimp.cxx
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-08-11 09:11:22 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-08-11 10:41:21 +0200
commit9456afaa5aa12926b1aa6b74ece1654d47e1c650 (patch)
treef513f82cfbb258d7585f436f412c8106b6de44bf /writerperfect/source/writer/exp/xmlimp.cxx
parent7d30d029f4f95eed91c814469d700445ed6b019b (diff)
EPUB export: rework to use context classes
Before writerperfect::exp::XMLImport grows into a God object. Also, if I'm at it, recurse into text:h to include heading text. Change-Id: Iede56d00dbede40186b6484d0be92a2ac2e4768e Reviewed-on: https://gerrit.libreoffice.org/41005 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'writerperfect/source/writer/exp/xmlimp.cxx')
-rw-r--r--writerperfect/source/writer/exp/xmlimp.cxx94
1 files changed, 78 insertions, 16 deletions
diff --git a/writerperfect/source/writer/exp/xmlimp.cxx b/writerperfect/source/writer/exp/xmlimp.cxx
index 21c4809ffc57..b975bbcceebc 100644
--- a/writerperfect/source/writer/exp/xmlimp.cxx
+++ b/writerperfect/source/writer/exp/xmlimp.cxx
@@ -9,6 +9,9 @@
#include "xmlimp.hxx"
+#include "xmlictxt.hxx"
+#include "xmltext.hxx"
+
using namespace com::sun::star;
namespace writerperfect
@@ -16,11 +19,65 @@ namespace writerperfect
namespace exp
{
+/// Handler for <office:body>.
+class XMLBodyContext : public XMLImportContext
+{
+public:
+ XMLBodyContext(XMLImport &rImport);
+
+ XMLImportContext *CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/) override;
+};
+
+XMLBodyContext::XMLBodyContext(XMLImport &rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+XMLImportContext *XMLBodyContext::CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
+{
+ if (rName == "office:text")
+ return new XMLBodyContentContext(mrImport);
+ return nullptr;
+}
+
+/// Handler for <office:document>.
+class XMLOfficeDocContext : public XMLImportContext
+{
+public:
+ XMLOfficeDocContext(XMLImport &rImport);
+
+ XMLImportContext *CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/) override;
+};
+
+XMLOfficeDocContext::XMLOfficeDocContext(XMLImport &rImport)
+ : XMLImportContext(rImport)
+{
+}
+
+XMLImportContext *XMLOfficeDocContext::CreateChildContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
+{
+ if (rName == "office:body")
+ return new XMLBodyContext(mrImport);
+ return nullptr;
+}
+
XMLImport::XMLImport(librevenge::RVNGTextInterface &rGenerator)
: mrGenerator(rGenerator)
{
}
+XMLImportContext *XMLImport::CreateContext(const OUString &rName, const css::uno::Reference<css::xml::sax::XAttributeList> &/*xAttribs*/)
+{
+ if (rName == "office:document")
+ return new XMLOfficeDocContext(*this);
+ return nullptr;
+}
+
+librevenge::RVNGTextInterface &XMLImport::GetGenerator() const
+{
+ return mrGenerator;
+}
+
void XMLImport::startDocument()
{
mrGenerator.startDocument(librevenge::RVNGPropertyList());
@@ -31,31 +88,38 @@ 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")
+ rtl::Reference<XMLImportContext> xContext;
+ if (!maContexts.empty())
{
- mrGenerator.openParagraph(librevenge::RVNGPropertyList());
- mbParagraphOpened = true;
+ if (maContexts.top().is())
+ xContext = maContexts.top()->CreateChildContext(rName, xAttribs);
}
+ else
+ xContext = CreateContext(rName, xAttribs);
+
+ if (xContext.is())
+ xContext->startElement(rName, xAttribs);
+
+ maContexts.push(xContext);
}
void XMLImport::endElement(const OUString &rName)
{
- if (rName == "text:p")
- {
- mrGenerator.closeParagraph();
- mbParagraphOpened = false;
- }
+ if (maContexts.empty())
+ return;
+
+ if (maContexts.top().is())
+ maContexts.top()->endElement(rName);
+
+ maContexts.pop();
}
void XMLImport::characters(const OUString &rChars)
{
- if (mbParagraphOpened)
- {
- OString sCharU8 = OUStringToOString(rChars, RTL_TEXTENCODING_UTF8);
- mrGenerator.insertText(librevenge::RVNGString(sCharU8.getStr()));
- }
+ if (maContexts.top().is())
+ maContexts.top()->characters(rChars);
}
void XMLImport::ignorableWhitespace(const OUString &/*rWhitespaces*/)
@@ -64,12 +128,10 @@ void XMLImport::ignorableWhitespace(const OUString &/*rWhitespaces*/)
void XMLImport::processingInstruction(const OUString &/*rTarget*/, const OUString &/*rData*/)
{
- SAL_WARN("writerperfect", "XMLImport::processingInstruction: implement me");
}
void XMLImport::setDocumentLocator(const css::uno::Reference<css::xml::sax::XLocator> &/*xLocator*/)
{
- SAL_WARN("writerperfect", "XMLImport::setDocumentLocator: implement me");
}
} // namespace exp