source: git/modules/openmath/lxmldecoder.py @ 0d4df5

spielwiese
Last change on this file since 0d4df5 was 0d4df5, checked in by Michael Brickenstein <bricken@…>, 18 years ago
*bricken: faster, simpler, yeah git-svn-id: file:///usr/local/Singular/svn/trunk@9004 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.6 KB
Line 
1import lxml.etree as et
2from objects import *
3
4class OMFromXMLBuilder:
5    def buildFromNode(self, node):
6        erg=None
7        if (node.tag=="OMI"):
8            erg=int(node.text)
9        if (node.tag=="OMSTR"):
10            #print "data", node.text
11            erg=node.text
12        if (node.tag=="OMB"):
13            erg=OMByteArray(base64.decodestring(node.text))
14        if (node.tag=="OMV"):
15            name=node.get("name") #node.attributes["name"]
16            #print dir(name)
17            erg= OMV(name)
18        if (node.tag=="OMS"):
19            if "cdbase" in node.attrib:
20                #FIXME: obtain from ancestors
21                cdbase=node.get("cdbase")
22            else: 
23                cdbase=None
24            cdname=node.get("cd")
25            name=node.get("name")
26            #print repr(node)
27            #print node.attributes
28            #print "cdbase", cdbase
29            if cdbase==None:
30                cd=OMCD(cdname)
31            else:
32                cd=OMCD(cdname,cdbase)
33            erg=OMS(name,cd)
34        if (node.tag=="OMA"):
35            children=[self.buildFromNode(c) for c in node]
36            erg= OMA(children[0],children[1:])
37        if (node.tag=="OMOBJ"):
38            children=[self.buildFromNode(c) for c in node]
39            erg= OMOBJ(children)
40        if (node.tag=="OMBIND"):
41            children=[self.buildFromNode(c) for c in node]
42            erg= OMBIND(children[0],children[1:-1],children[-1])
43        if (node.tag=="OMF"):
44            if (node.hasAttribute("dec")):
45                erg=float(node.getAttribute("dec"))
46            else:
47                raise NotImplementedError
48           
49        if (node.tag=="OMR"):
50            erg=OMRef(node.get("xref"))
51            self.refs.append(erg)
52        if (node.tag=="OMATP"):
53            children=[self.buildFromNode(c) for c in node]
54            assert(len(children)==2)
55            erg=OMAttributePair(children[0],children[1])
56        if (node.tag=="OMATTR"):
57            children=[self.buildFromNode(c) for c in node]
58            erg=OMAttribution(*children)
59        if None==erg:
60            raise NotImplementedError
61        else:
62            if "id" in node.attrib:
63                id=node.get("id")
64                self.ids[id]=erg
65        return erg
66    def __init__(self):
67        self.refs=[]
68        self.ids={}
69    def build(self, tree):
70        root=tree.getroot()
71        #remove_white_space(root)
72        erg=self.buildFromNode(root)
73        for r in self.refs:
74            r.ref=self.ids[r.ref]
75        return erg
76def decode(tree):
77    builder=OMFromXMLBuilder()
78    om=builder.build(tree)
79    return om
Note: See TracBrowser for help on using the repository browser.