Excellent.

Pablo, can you please send a PR with this? We'll then improve it there
and I can help with setting up the tests. Please ask if you get stuck.

Ondrej

On Wed, Jul 3, 2013 at 9:49 AM, Aaron Meurer <[email protected]> wrote:
> Yes, definitely. Eventually, I would like to have a nice framework to
> make parsing things like this easier and have a nicer, more extensible
> API, but for now, I think even simple parsers like this are better
> than nothing.
>
> Aaron Meurer
>
> On Wed, Jul 3, 2013 at 10:48 AM, Ondřej Čertík <[email protected]> 
> wrote:
>> Pablo,
>>
>> On Wed, Jul 3, 2013 at 5:38 AM, peibol <[email protected]> wrote:
>>> It will be something like that. For the moment, I'm just implemented the
>>> basics of presentation mathml. I will add features as I need them.
>>>
>>> After running it, sympify should be called. What do you think about it?
>>>
>>> def parseMML(mmlinput):
>>> from lxml import etree
>>> from StringIO import *
>>> from lxml import objectify
>>> mmlinput= mmlinput.replace(' xmlns="', ' xmlnamespace="')
>>> parser = etree.XMLParser(ns_clean=True,remove_pis=True,remove_comments=True)
>>> tree   = etree.parse(StringIO(mmlinput), parser)
>>> objectify.deannotate(tree,cleanup_namespaces=True,xsi=True,xsi_nil=True)
>>> mmlinput=etree.tostring(tree.getroot())
>>> exppy="" #this is the python expression
>>> symvars=[]  #these are symbolic variables which can eventually take part in
>>> the expression
>>> events = ("start", "end")
>>> level = 0
>>> context = etree.iterparse(StringIO(mmlinput),events=events)
>>> for action, elem in context:
>>> if (action=='start') and (elem.tag=='mfrac'):
>>> level += 1
>>> mmlaux=etree.tostring(elem[0])
>>> (a,b)=parseMML(mmlaux)
>>> symvars.append(b)
>>> exppy+=a
>>> exppy+='/'
>>> mmlaux=etree.tostring(elem[1])
>>> (a,b)=parseMML(mmlaux)
>>> symvars.append(b)
>>> exppy+=a
>>> if (action=='end') and (elem.tag=='mfrac'):
>>> level -= 1
>>> if level:
>>> continue
>>> if (action=='start') and (elem.tag=='mrow'):
>>> exppy+='('
>>> if (action=='end') and (elem.tag=='mrow'):
>>> exppy+=')'
>>> if action=='start' and elem.tag=='mn': #this is a number
>>> exppy+=elem.text
>>> if action=='start' and elem.tag=='mi': #this is a variable
>>> exppy+=elem.text
>>> symvars.append(elem.text) #we'll return the variable, so sympy can sympify
>>> it afterwards
>>> if action=='start' and elem.tag=='mo': #this is a operation
>>> exppy+=elem.text
>>> return (exppy, symvars)
>>>
>>>
>>> With the example: mmlinput='''<?xml version="1.0"?> <math
>>> xmlns="http://www.w3.org/1998/Math/MathML";
>>> 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";> <mrow> <mfrac> <mrow>
>>> <mn>3</mn> </mrow> <mrow> <mn>57</mn> </mrow> </mfrac> </mrow> </math>'''
>>>
>>> We get:
>>> exppy='((3)/(57))'
>>
>>
>> I think that's a great start. I assume you pass the expression to
>> sympify() and obtain a SymPy expression as a result.
>>
>> Aaron, I think we should have this in sympy, what do you think? We can
>> install lxml in .travis.yml and have this tested. If so, I can help
>> you Pablo with sending a PR and get it setup.
>>
>> Ondrej
>>
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "sympy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/sympy.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sympy.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to