diff options
author | Frédéric Wang <fred.wang@free.fr> | 2013-06-23 21:32:37 +0200 |
---|---|---|
committer | Fridrich Strba <fridrich@documentfoundation.org> | 2013-06-28 09:47:07 +0000 |
commit | 3b3ec32358aebd81ef5385f48dbf3ee4c93649e8 (patch) | |
tree | d70ad18dcb5756b55d4003e260323ce2e56d9c8e /starmath | |
parent | 6231979ce1b89ce36e0a68139c96c5c1c1e704bb (diff) |
fdo#66086 - MathML export: wideslash, widebslash and overstrike
Change-Id: I1e8da340ffdacab133b0cff6d6344fe56da34bf8
Reviewed-on: https://gerrit.libreoffice.org/4465
Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org>
Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
Diffstat (limited to 'starmath')
-rw-r--r-- | starmath/source/mathmlexport.cxx | 48 | ||||
-rw-r--r-- | starmath/source/mathmlexport.hxx | 1 | ||||
-rw-r--r-- | starmath/source/mathmlimport.cxx | 38 | ||||
-rw-r--r-- | starmath/source/mathmlimport.hxx | 5 |
4 files changed, 91 insertions, 1 deletions
diff --git a/starmath/source/mathmlexport.cxx b/starmath/source/mathmlexport.cxx index 8df9d28edb2a..f9e658998df3 100644 --- a/starmath/source/mathmlexport.cxx +++ b/starmath/source/mathmlexport.cxx @@ -766,6 +766,42 @@ void SmXMLExport::ExportBinaryVertical(const SmNode *pNode, int nLevel) ExportNodes(pNode->GetSubNode(2), nLevel); } +void SmXMLExport::ExportBinaryDiagonal(const SmNode *pNode, int nLevel) +{ + OSL_ENSURE(pNode->GetNumSubNodes()==3, "Bad Slash"); + + if (pNode->GetToken().eType == TWIDESLASH) + { + // wideslash + // export the node as <mfrac bevelled="true"> + AddAttribute(XML_NAMESPACE_MATH, XML_BEVELLED, XML_TRUE); + SvXMLElementExport aFraction(*this, XML_NAMESPACE_MATH, XML_MFRAC, + sal_True, sal_True); + ExportNodes(pNode->GetSubNode(0), nLevel); + ExportNodes(pNode->GetSubNode(1), nLevel); + } + else + { + // widebslash + // We can not use <mfrac> to a backslash, so just use <mo>\</mo> + SvXMLElementExport *pRow = new SvXMLElementExport(*this, + XML_NAMESPACE_MATH, XML_MROW, sal_True, sal_True); + + ExportNodes(pNode->GetSubNode(0), nLevel); + + { // Scoping for <mo> creation + SvXMLElementExport aMo(*this, XML_NAMESPACE_MATH, XML_MO, + sal_True,sal_True); + sal_Unicode nArse[2] = {MS_BACKSLASH,0x00}; + GetDocHandler()->characters(nArse); + } + + ExportNodes(pNode->GetSubNode(1), nLevel); + + delete pRow; + } +} + void SmXMLExport::ExportTable(const SmNode *pNode, int nLevel) { SvXMLElementExport *pTable=0; @@ -1090,7 +1126,14 @@ void SmXMLExport::ExportAttributes(const SmNode *pNode, int nLevel) pElement = new SvXMLElementExport(*this, XML_NAMESPACE_MATH, XML_MUNDER, sal_True,sal_True); } - else if (pNode->GetToken().eType != TOVERSTRIKE) + else if (pNode->GetToken().eType == TOVERSTRIKE) + { + // export as <menclose notation="horizontalstrike"> + AddAttribute(XML_NAMESPACE_MATH, XML_NOTATION, XML_HORIZONTALSTRIKE); + pElement = new SvXMLElementExport(*this, XML_NAMESPACE_MATH, + XML_MENCLOSE, sal_True, sal_True); + } + else { AddAttribute(XML_NAMESPACE_MATH, XML_ACCENT, XML_TRUE); @@ -1449,6 +1492,9 @@ void SmXMLExport::ExportNodes(const SmNode *pNode, int nLevel) case NBINVER: ExportBinaryVertical(pNode, nLevel); break; + case NBINDIAGONAL: + ExportBinaryDiagonal(pNode, nLevel); + break; case NSUBSUP: ExportSubSupScript(pNode, nLevel); break; diff --git a/starmath/source/mathmlexport.hxx b/starmath/source/mathmlexport.hxx index 52b558eeb51e..3cbaaae7c400 100644 --- a/starmath/source/mathmlexport.hxx +++ b/starmath/source/mathmlexport.hxx @@ -92,6 +92,7 @@ protected: void ExportUnaryHorizontal(const SmNode *pNode, int nLevel); void ExportBrace(const SmNode *pNode, int nLevel); void ExportBinaryVertical(const SmNode *pNode, int nLevel); + void ExportBinaryDiagonal(const SmNode *pNode, int nLevel); void ExportSubSupScript(const SmNode *pNode, int nLevel); void ExportRoot(const SmNode *pNode, int nLevel); void ExportOperator(const SmNode *pNode, int nLevel); diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx index a7133dfe5584..608ab7ac92ad 100644 --- a/starmath/source/mathmlimport.cxx +++ b/starmath/source/mathmlimport.cxx @@ -837,9 +837,35 @@ public: //////////////////////////////////////////////////////////// +class SmXMLEncloseContext_Impl : public SmXMLRowContext_Impl +{ +public: + // TODO/LATER: convert <menclose notation="horizontalstrike"> into + // "overstrike{}" and extend the Math syntax to support more notations + SmXMLEncloseContext_Impl(SmXMLImport &rImport,sal_uInt16 nPrefix, + const OUString& rLName) + : SmXMLRowContext_Impl(rImport,nPrefix,rLName) {} + + void EndElement(); +}; + +void SmXMLEncloseContext_Impl::EndElement() +{ + /* + <menclose> accepts any number of arguments; if this number is not 1, its + contents are treated as a single "inferred <mrow>" containing its + arguments + */ + if (GetSmImport().GetNodeStack().size() - nElementCount > 1) + SmXMLRowContext_Impl::EndElement(); +} + +//////////////////////////////////////////////////////////// + class SmXMLFracContext_Impl : public SmXMLRowContext_Impl { public: + // TODO/LATER: convert <mfrac bevelled="true"> into "wideslash{}{}" SmXMLFracContext_Impl(SmXMLImport &rImport,sal_uInt16 nPrefix, const OUString& rLName) : SmXMLRowContext_Impl(rImport,nPrefix,rLName) {} @@ -1867,6 +1893,7 @@ static SvXMLTokenMapEntry aPresLayoutElemTokenMap[] = { XML_NAMESPACE_MATH, XML_MERROR, XML_TOK_MERROR }, { XML_NAMESPACE_MATH, XML_MPHANTOM, XML_TOK_MPHANTOM }, { XML_NAMESPACE_MATH, XML_MROW, XML_TOK_MROW }, + { XML_NAMESPACE_MATH, XML_MENCLOSE, XML_TOK_MENCLOSE }, { XML_NAMESPACE_MATH, XML_MFRAC, XML_TOK_MFRAC }, { XML_NAMESPACE_MATH, XML_MSQRT, XML_TOK_MSQRT }, { XML_NAMESPACE_MATH, XML_MROOT, XML_TOK_MROOT }, @@ -2045,6 +2072,10 @@ SvXMLImportContext *SmXMLDocContext_Impl::CreateChildContext( pContext = GetSmImport().CreateRowContext(nPrefix,rLocalName, xAttrList); break; + case XML_TOK_MENCLOSE: + pContext = GetSmImport().CreateEncloseContext(nPrefix,rLocalName, + xAttrList); + break; case XML_TOK_MFRAC: pContext = GetSmImport().CreateFracContext(nPrefix,rLocalName, xAttrList); @@ -2683,6 +2714,13 @@ SvXMLImportContext *SmXMLImport::CreateSpaceContext(sal_uInt16 nPrefix, } +SvXMLImportContext *SmXMLImport::CreateEncloseContext(sal_uInt16 nPrefix, + const OUString &rLocalName, + const uno::Reference <xml::sax::XAttributeList> & /*xAttrList*/) +{ + return new SmXMLEncloseContext_Impl(*this,nPrefix,rLocalName); +} + SvXMLImportContext *SmXMLImport::CreateFracContext(sal_uInt16 nPrefix, const OUString &rLocalName, const uno::Reference <xml::sax::XAttributeList> & /*xAttrList*/) diff --git a/starmath/source/mathmlimport.hxx b/starmath/source/mathmlimport.hxx index 483256e7b554..76363dfec3b6 100644 --- a/starmath/source/mathmlimport.hxx +++ b/starmath/source/mathmlimport.hxx @@ -114,6 +114,10 @@ public: const OUString &rLocalName, const com::sun::star::uno::Reference < com::sun::star::xml::sax::XAttributeList> &xAttrList); + SvXMLImportContext *CreateEncloseContext(sal_uInt16 nPrefix, + const OUString &rLocalName, + const com::sun::star::uno::Reference < + com::sun::star::xml::sax::XAttributeList> &xAttrList); SvXMLImportContext *CreateFracContext(sal_uInt16 nPrefix, const OUString &rLocalName, const com::sun::star::uno::Reference < @@ -272,6 +276,7 @@ enum SmXMLPresLayoutElemTokenMap XML_TOK_MERROR, XML_TOK_MPHANTOM, XML_TOK_MROW, + XML_TOK_MENCLOSE, XML_TOK_MFRAC, XML_TOK_MSQRT, XML_TOK_MROOT, |