12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- """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')
|