include/oox/export/shapes.hxx | 1 oox/source/export/shapes.cxx | 67 ++++++++++++++++++++++++++++++++++++++++-- sd/qa/unit/data/odp/math.odp |binary sd/qa/unit/export-tests.cxx | 28 +++++++++++++++++ 4 files changed, 93 insertions(+), 3 deletions(-)
New commits: commit 68d351fff469d0ab75f817a4e217194735258da8 Author: Michael Stahl <mst...@redhat.com> Date: Fri Jan 15 15:26:43 2016 +0100 oox: export Math objects to PPTX files These hit the assert in lcl_StoreOwnAsOOXML now so better implement some export. (cherry picked from commit cb890ae43bacd2be24bc74fad2e2e5cce8910995) ugh, forgot to git add the test document (cherry picked from commit fc4fba0c77c849cf19d9c0e1b9270b745db60b89) Change-Id: I10c005a547e8a85f2a82198a49f9a03fc46a61d7 Reviewed-on: https://gerrit.libreoffice.org/21495 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> diff --git a/include/oox/export/shapes.hxx b/include/oox/export/shapes.hxx index 29f597f..ab67def 100644 --- a/include/oox/export/shapes.hxx +++ b/include/oox/export/shapes.hxx @@ -180,6 +180,7 @@ public: WriteTextShape( css::uno::Reference< css::drawing::XShape > xShape ); ShapeExport& WriteTableShape( css::uno::Reference< css::drawing::XShape > xShape ); + void WriteMathShape(css::uno::Reference<css::drawing::XShape> const& xShape); ShapeExport& WriteOLE2Shape( css::uno::Reference< css::drawing::XShape > xShape ); virtual ShapeExport& diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx index 7558feb..c3b8b8e 100644 --- a/oox/source/export/shapes.cxx +++ b/oox/source/export/shapes.cxx @@ -93,6 +93,7 @@ #include <editeng/svxenum.hxx> #include <svx/unoapi.hxx> #include <oox/export/chartexport.hxx> +#include <oox/mathml/export.hxx> using namespace ::css; using namespace ::css::beans; @@ -1579,13 +1580,64 @@ ShapeExport& ShapeExport::WriteTextShape( Reference< XShape > xShape ) return *this; } +void ShapeExport::WriteMathShape(Reference<XShape> const& xShape) +{ + Reference<XPropertySet> const xPropSet(xShape, UNO_QUERY); + assert(xPropSet.is()); + Reference<XModel> xMathModel; + xPropSet->getPropertyValue("Model") >>= xMathModel; + assert(xMathModel.is()); + assert(GetDocumentType() != DOCUMENT_DOCX); // should be written in DocxAttributeOutput + SAL_WARN_IF(GetDocumentType() == DOCUMENT_XLSX, "oox", "Math export to XLSX isn't tested, should it happen here?"); + + // ECMA standard does not actually allow oMath outside of + // WordProcessingML so write a MCE like PPT 2010 does + mpFS->startElementNS(XML_mc, XML_AlternateContent, FSEND); + mpFS->startElementNS(XML_mc, XML_Choice, + FSNS(XML_xmlns, XML_a14), "http://schemas.microsoft.com/office/drawing/2010/main", + XML_Requires, "a14", + FSEND); + mpFS->startElementNS(mnXmlNamespace, XML_sp, FSEND); + mpFS->startElementNS(mnXmlNamespace, XML_nvSpPr, FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_cNvPr, + XML_id, OString::number(GetNewShapeID(xShape)).getStr(), + XML_name, OString("Formula " + OString::number(mnShapeIdMax++)).getStr(), + FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_cNvSpPr, XML_txBox, "1", FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_nvPr, FSEND); + mpFS->endElementNS(mnXmlNamespace, XML_nvSpPr); + mpFS->startElementNS(mnXmlNamespace, XML_spPr, FSEND); + WriteShapeTransformation(xShape, XML_a); + WritePresetShape("rect"); + mpFS->endElementNS(mnXmlNamespace, XML_spPr); + mpFS->startElementNS(mnXmlNamespace, XML_txBody, FSEND); + mpFS->startElementNS(XML_a, XML_bodyPr, FSEND); + mpFS->endElementNS(XML_a, XML_bodyPr); + mpFS->startElementNS(XML_a, XML_p, FSEND); + mpFS->startElementNS(XML_a14, XML_m, FSEND); + + oox::FormulaExportBase *const pMagic(dynamic_cast<oox::FormulaExportBase*>(xMathModel.get())); + assert(pMagic); + pMagic->writeFormulaOoxml(GetFS(), GetFB()->getVersion(), GetDocumentType()); + + mpFS->endElementNS(XML_a14, XML_m); + mpFS->endElementNS(XML_a, XML_p); + mpFS->endElementNS(mnXmlNamespace, XML_txBody); + mpFS->endElementNS(mnXmlNamespace, XML_sp); + mpFS->endElementNS(XML_mc, XML_Choice); + mpFS->startElementNS(XML_mc, XML_Fallback, FSEND); + // TODO: export bitmap shape as fallback + mpFS->endElementNS(XML_mc, XML_Fallback); + mpFS->endElementNS(XML_mc, XML_AlternateContent); +} + ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) { Reference< XPropertySet > xPropSet( xShape, UNO_QUERY ); if (!xPropSet.is()) return *this; - bool bIsChart(false); + enum { CHART, MATH, OTHER } eType(OTHER); OUString clsid; xPropSet->getPropertyValue("CLSID") >>= clsid; if (!clsid.isEmpty()) @@ -1593,10 +1645,13 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) SvGlobalName aClassID; bool const isValid = aClassID.MakeId(clsid); assert(isValid); (void)isValid; - bIsChart = SotExchange::IsChart(aClassID); + if (SotExchange::IsChart(aClassID)) + eType = CHART; + else if (SotExchange::IsMath(aClassID)) + eType = MATH; } - if (bIsChart) + if (CHART == eType) { Reference< XChartDocument > xChartDoc; xPropSet->getPropertyValue("Model") >>= xChartDoc; @@ -1609,6 +1664,12 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) return *this; } + if (MATH == eType) + { + WriteMathShape(xShape); + return *this; + } + uno::Reference<embed::XEmbeddedObject> const xObj( xPropSet->getPropertyValue("EmbeddedObject"), uno::UNO_QUERY); diff --git a/sd/qa/unit/data/odp/math.odp b/sd/qa/unit/data/odp/math.odp new file mode 100644 index 0000000..c7605c5 Binary files /dev/null and b/sd/qa/unit/data/odp/math.odp differ diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx index da9d53f..33e1ba5 100644 --- a/sd/qa/unit/export-tests.cxx +++ b/sd/qa/unit/export-tests.cxx @@ -141,6 +141,7 @@ public: void testFdo90607(); void testTdf91378(); void testBnc822341(); + void testMathObject(); void testTdf80224(); void testTdf92527(); @@ -180,6 +181,7 @@ public: CPPUNIT_TEST(testTdf91378); CPPUNIT_TEST(testBnc822341); + CPPUNIT_TEST(testMathObject); CPPUNIT_TEST(testTdf80224); CPPUNIT_TEST(testExportTransitionsPPTX); @@ -208,10 +210,12 @@ public: { "v", "urn:schemas-microsoft-com:vml" }, { "a", "http://schemas.openxmlformats.org/drawingml/2006/main" }, { "c", "http://schemas.openxmlformats.org/drawingml/2006/chart" }, + { "m", "http://schemas.openxmlformats.org/officeDocument/2006/math" }, { "pic", "http://schemas.openxmlformats.org/drawingml/2006/picture" }, { "wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" }, { "p", "http://schemas.openxmlformats.org/presentationml/2006/main" }, { "w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main" }, + { "a14", "http://schemas.microsoft.com/office/drawing/2010/main" }, { "wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape" }, { "wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" }, }; @@ -1151,6 +1155,30 @@ void SdExportTest::testBnc822341() xDocShRef->DoClose(); } +void SdExportTest::testMathObject() +{ + // Check import / export of math object + ::sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("sd/qa/unit/data/odp/math.odp"), ODP); + utl::TempFile tempFile1; + xDocShRef = saveAndReload(xDocShRef, PPTX, &tempFile1); + + // Export an LO specific ole object (imported from an ODP document) + { + xmlDocPtr pXmlDocContent = parseExport(tempFile1, "ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice", + "Requires", + "a14"); + assertXPathContent(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice/p:sp/p:txBody/a:p/a14:m/m:oMath/m:r[1]/m:t", + "a"); + + // TODO can't import yet + } + + xDocShRef->DoClose(); +} + void SdExportTest::testBulletMarginAndIndentation() { ::sd::DrawDocShellRef xDocShRef = loadURL( getURLFromSrc("/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx"), PPTX ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits