80 lines
2.2 KiB
Python
80 lines
2.2 KiB
Python
"""Module with some functions for MathML, like transforming MathML
|
|
content in MathML presentation.
|
|
|
|
To use this module, you will need lxml.
|
|
"""
|
|
|
|
from sympy.utilities.pkgdata import get_resource
|
|
from sympy.utilities.decorator import doctest_depends_on
|
|
|
|
|
|
__doctest_requires__ = {('apply_xsl', 'c2p'): ['lxml']}
|
|
|
|
|
|
def add_mathml_headers(s):
|
|
return """<math xmlns:mml="http://www.w3.org/1998/Math/MathML"
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
xsi:schemaLocation="http://www.w3.org/1998/Math/MathML
|
|
http://www.w3.org/Math/XMLSchema/mathml2/mathml2.xsd">""" + s + "</math>"
|
|
|
|
|
|
@doctest_depends_on(modules=('lxml',))
|
|
def apply_xsl(mml, xsl):
|
|
"""Apply a xsl to a MathML string.
|
|
|
|
Parameters
|
|
==========
|
|
|
|
mml
|
|
A string with MathML code.
|
|
xsl
|
|
A string representing a path to a xsl (xml stylesheet) file.
|
|
This file name is relative to the PYTHONPATH.
|
|
|
|
Examples
|
|
========
|
|
|
|
>>> from sympy.utilities.mathml import apply_xsl
|
|
>>> xsl = 'mathml/data/simple_mmlctop.xsl'
|
|
>>> mml = '<apply> <plus/> <ci>a</ci> <ci>b</ci> </apply>'
|
|
>>> res = apply_xsl(mml,xsl)
|
|
>>> ''.join(res.splitlines())
|
|
'<?xml version="1.0"?><mrow xmlns="http://www.w3.org/1998/Math/MathML"> <mi>a</mi> <mo> + </mo> <mi>b</mi></mrow>'
|
|
"""
|
|
from lxml import etree
|
|
|
|
parser = etree.XMLParser(resolve_entities=False)
|
|
ac = etree.XSLTAccessControl.DENY_ALL
|
|
|
|
s = etree.XML(get_resource(xsl).read(), parser=parser)
|
|
transform = etree.XSLT(s, access_control=ac)
|
|
doc = etree.XML(mml, parser=parser)
|
|
result = transform(doc)
|
|
s = str(result)
|
|
return s
|
|
|
|
|
|
@doctest_depends_on(modules=('lxml',))
|
|
def c2p(mml, simple=False):
|
|
"""Transforms a document in MathML content (like the one that sympy produces)
|
|
in one document in MathML presentation, more suitable for printing, and more
|
|
widely accepted
|
|
|
|
Examples
|
|
========
|
|
|
|
>>> from sympy.utilities.mathml import c2p
|
|
>>> mml = '<apply> <exp/> <cn>2</cn> </apply>'
|
|
>>> c2p(mml,simple=True) != c2p(mml,simple=False)
|
|
True
|
|
|
|
"""
|
|
|
|
if not mml.startswith('<math'):
|
|
mml = add_mathml_headers(mml)
|
|
|
|
if simple:
|
|
return apply_xsl(mml, 'mathml/data/simple_mmlctop.xsl')
|
|
|
|
return apply_xsl(mml, 'mathml/data/mmlctop.xsl')
|