summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorFrédéric Wang <fred.wang@free.fr>2013-06-23 21:32:37 +0200
committerFridrich Strba <fridrich@documentfoundation.org>2013-06-28 09:47:07 +0000
commit3b3ec32358aebd81ef5385f48dbf3ee4c93649e8 (patch)
treed70ad18dcb5756b55d4003e260323ce2e56d9c8e /starmath
parent6231979ce1b89ce36e0a68139c96c5c1c1e704bb (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.cxx48
-rw-r--r--starmath/source/mathmlexport.hxx1
-rw-r--r--starmath/source/mathmlimport.cxx38
-rw-r--r--starmath/source/mathmlimport.hxx5
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,