"""Module with some functions for MathML, like transforming MathML content in MathML presentation. To use this module, you will need lxml. """ from pathlib import Path from sympy.utilities.decorator import doctest_depends_on __doctest_requires__ = {('apply_xsl', 'c2p'): ['lxml']} def add_mathml_headers(s): return """""" + s + "" def _read_binary(pkgname, filename): import sys if sys.version_info >= (3, 10): # files was added in Python 3.9 but only seems to work here in 3.10+ from importlib.resources import files return files(pkgname).joinpath(filename).read_bytes() else: # read_binary was deprecated in Python 3.11 from importlib.resources import read_binary return read_binary(pkgname, filename) def _read_xsl(xsl): # Previously these values were allowed: if xsl == 'mathml/data/simple_mmlctop.xsl': xsl = 'simple_mmlctop.xsl' elif xsl == 'mathml/data/mmlctop.xsl': xsl = 'mmlctop.xsl' elif xsl == 'mathml/data/mmltex.xsl': xsl = 'mmltex.xsl' if xsl in ['simple_mmlctop.xsl', 'mmlctop.xsl', 'mmltex.xsl']: xslbytes = _read_binary('sympy.utilities.mathml.data', xsl) else: xslbytes = Path(xsl).read_bytes() return xslbytes @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 giving the name of an xsl (xml stylesheet) file which can be found in sympy/utilities/mathml/data. The following files are supplied with SymPy: - mmlctop.xsl - mmltex.xsl - simple_mmlctop.xsl Alternatively, a full path to an xsl file can be given. Examples ======== >>> from sympy.utilities.mathml import apply_xsl >>> xsl = 'simple_mmlctop.xsl' >>> mml = ' a b ' >>> res = apply_xsl(mml,xsl) >>> print(res) a + b """ from lxml import etree parser = etree.XMLParser(resolve_entities=False) ac = etree.XSLTAccessControl.DENY_ALL s = etree.XML(_read_xsl(xsl), 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 = ' 2 ' >>> c2p(mml,simple=True) != c2p(mml,simple=False) True """ if not mml.startswith('