From ae8f28b86fa6247106bbdecfeac8367f942fb398 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 27 Nov 2017 08:23:24 +0100 Subject: EPUB export: handle non-image frames TextFrame on the Writer UI. Change-Id: I755fde113ef86a656b7f1f39c02642c22a5a6102 Reviewed-on: https://gerrit.libreoffice.org/45310 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- writerperfect/qa/unit/EPUBExportTest.cxx | 12 ++++++ .../qa/unit/data/writer/epubexport/text-box.fodt | 45 ++++++++++++++++++++++ .../source/writer/exp/XMLTextFrameContext.cxx | 36 +++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 writerperfect/qa/unit/data/writer/epubexport/text-box.fodt (limited to 'writerperfect') diff --git a/writerperfect/qa/unit/EPUBExportTest.cxx b/writerperfect/qa/unit/EPUBExportTest.cxx index 7f155c35de8e..fdcafe827147 100644 --- a/writerperfect/qa/unit/EPUBExportTest.cxx +++ b/writerperfect/qa/unit/EPUBExportTest.cxx @@ -82,6 +82,7 @@ public: void testLinkCharFormat(); void testLinkNamedCharFormat(); void testTableWidth(); + void testTextBox(); CPPUNIT_TEST_SUITE(EPUBExportTest); CPPUNIT_TEST(testOutlineLevel); @@ -112,6 +113,7 @@ public: CPPUNIT_TEST(testLinkCharFormat); CPPUNIT_TEST(testLinkNamedCharFormat); CPPUNIT_TEST(testTableWidth); + CPPUNIT_TEST(testTextBox); CPPUNIT_TEST_SUITE_END(); }; @@ -571,6 +573,16 @@ void EPUBExportTest::testTableWidth() CPPUNIT_ASSERT_EQUAL(OUString("50%"), EPUBExportTest::getCss(aCssDoc, aClass, "width")); } +void EPUBExportTest::testTextBox() +{ + createDoc("text-box.fodt", {}); + + mpXmlDoc = parseExport("OEBPS/sections/section0001.xhtml"); + + // This failed, image with caption was lost. + assertXPath(mpXmlDoc, "//xhtml:img", "class", "frame1"); +} + CPPUNIT_TEST_SUITE_REGISTRATION(EPUBExportTest); } diff --git a/writerperfect/qa/unit/data/writer/epubexport/text-box.fodt b/writerperfect/qa/unit/data/writer/epubexport/text-box.fodt new file mode 100644 index 000000000000..dad8d20b149b --- /dev/null +++ b/writerperfect/qa/unit/data/writer/epubexport/text-box.fodt @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAAAAFz + UkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA + AAJiS0dEAACqjSMyAAAACW9GRnMAAAAGAAAAAAAMc1XTAAAACXBIWXMAAA3XAAAN1wFCKJt4 + AAAACXZwQWcAAABMAAAAQACdMTgbAAABzUlEQVRo3u3ZPU/CQBjA8X+Jxs3ESUDj4iK+LA5+ + BBfjqBE1cXB2MlFAEqMgxvhNNL4sLsK3UPQL6ObkoAETz+FKW2mxCPRYnucWUu76/OC59C49 + cGOCKqrD9kHRc6ddPv7oW2WCwMh0nF63Myz7Tm8hPTNu0pgHMER3scepTbgK6enJNND83RLn + /878yRaPmgBZFDuMsNLeWB9gmFQHP77MIg9gsYciR50NFKvtjIy10yk84pSZA7DYpwR8scmF + QQCMuoQMpzbh0iAARrlnVn90CWHTsZcAiHPPdINQAuqsc2MQAAnKDUKWEhZ10twaBEDSJWQo + YlFj7S9CzwEegkXWIbQsRAQASFJhpplwbRAACS+hANRJBxMiAkDcJeQ4sQkBhYgMoJ+Ozlwo + 2YQ7AJ6CRxyiUGnVy3hVKb0Af9v7hUG2Wy9TEQCUelFTDULB2S+YKYGOMcpM6UIccOQnRA6A + cSp6ibfI+wkGADBGpTEd8xz1AaAfTQ7huA8AvUw5hVjuA0D/C5OaMN8XACRZ8F0zCggKAQhA + AAIQgAAEIAABCEAAAhCAAAQgAAH4zg3feY4w3Xs44M5+oW0qvCWoGcvaIlM3x/f/ab+O738A + hOCNQr34oD4AAAAldEVYdGNyZWF0ZS1kYXRlADIwMTAtMTItMjBUMTc6MDg6MzYrMDE6MDB6 + 5RscAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDEwLTEyLTIwVDE3OjA4OjM3KzAxOjAwgyNmnAAA + AABJRU5ErkJggg== + Illustration 1: foobar + + + diff --git a/writerperfect/source/writer/exp/XMLTextFrameContext.cxx b/writerperfect/source/writer/exp/XMLTextFrameContext.cxx index 556b6597cb42..78ea1b4d1e4b 100644 --- a/writerperfect/source/writer/exp/XMLTextFrameContext.cxx +++ b/writerperfect/source/writer/exp/XMLTextFrameContext.cxx @@ -12,6 +12,7 @@ #include "XMLBase64ImportContext.hxx" #include "txtparai.hxx" #include "xmlimp.hxx" +#include "xmltext.hxx" using namespace com::sun::star; @@ -20,6 +21,38 @@ namespace writerperfect namespace exp { +/// Handler for . +class XMLTextBoxContext : public XMLImportContext +{ +public: + XMLTextBoxContext(XMLImport &rImport); + + rtl::Reference CreateChildContext(const OUString &rName, const css::uno::Reference &xAttribs) override; + + void SAL_CALL startElement(const OUString &rName, const css::uno::Reference &xAttribs) override; + void SAL_CALL endElement(const OUString &rName) override; +}; + +XMLTextBoxContext::XMLTextBoxContext(XMLImport &rImport) + : XMLImportContext(rImport) +{ +} + +rtl::Reference XMLTextBoxContext::CreateChildContext(const OUString &rName, const css::uno::Reference &/*xAttribs*/) +{ + return CreateTextChildContext(mrImport, rName); +} + +void XMLTextBoxContext::startElement(const OUString &/*rName*/, const css::uno::Reference &/*xAttribs*/) +{ + mrImport.GetGenerator().openTextBox(librevenge::RVNGPropertyList()); +} + +void XMLTextBoxContext::endElement(const OUString &/*rName*/) +{ + mrImport.GetGenerator().closeTextBox(); +} + /// Handler for . class XMLTextImageContext : public XMLImportContext { @@ -81,6 +114,9 @@ rtl::Reference XMLTextFrameContext::CreateChildContext(const O { if (rName == "draw:image") return new XMLTextImageContext(mrImport); + if (rName == "draw:text-box") + return new XMLTextBoxContext(mrImport); + SAL_WARN("writerperfect", "XMLTextFrameContext::CreateChildContext: unhandled " << rName); return nullptr; } -- cgit