source: git/dyn_modules/openmath/omxmlreader.py @ 3c473c

spielwiese
Last change on this file since 3c473c was 3c473c, checked in by Kai Krüger <krueger@…>, 14 years ago
rename directory modules to dyn_modules anticipating "modules" directory for cmake. git-svn-id: file:///usr/local/Singular/svn/trunk@13033 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.3 KB
Line 
1from xml.dom.xmlbuilder import *
2#from xml.dom.ext import PrettyPrint
3from xml.dom import Node
4import xml.dom as dom
5import base64
6#from
7from StringIO import StringIO
8import re
9import sys
10import os.path
11from objects import *
12from binding import *
13from cd import *
14from exceptions import *
15from omexceptions import *
16def readFile(input_file_name):
17    docstream = open(input_file_name)
18    docIS=DOMInputSource()
19    docIS.byteStream=docstream
20    doc= DOMBuilder().parse(docIS)
21    docstream.close()
22   
23    root=doc.lastChild
24    return root
25
26def readStream(input_stream):
27    docIS=DOMInputSource()
28    docIS.byteStream=input_stream
29    doc= DOMBuilder().parse(docIS)
30   
31    root=doc.lastChild
32    return root
33def  get_text_in_children(n):
34    t = ""
35    for c in n.childNodes:
36        if c.nodeType== Node.TEXT_NODE:
37            t += c.nodeValue
38    return t
39def remove_white_space(node):
40    remove_list=[]
41    if node.nodeName=="OMC":
42        return
43    for child in node.childNodes:
44        if child.nodeType==dom.Node.TEXT_NODE and not child.data.strip():
45            remove_list.append(child)
46        elif child.hasChildNodes():
47            remove_white_space(child)
48    for node in remove_list:
49        node.parentNode.removeChild(node)
50        node.unlink()
51       
52class OMFromXMLBuilder:
53    def buildFromNode(self, node):
54        erg=None
55        if (node.nodeName=="OMI"):
56            content=get_text_in_children(node)
57            erg=OMint(content)
58        if (node.nodeName=="OMSTR"):
59            content=get_text_in_children(node)
60            #print "data", content
61            erg=OMString(content)
62        if (node.nodeName=="OMB"):
63            content=get_text_in_children(node)
64            #print "data", content
65            erg=OMByteArray(base64.decodestring(content))
66        if (node.nodeName=="OMV"):
67            name=node.getAttribute("name") #node.attributes["name"]
68            #print dir(name)
69            erg= OMVar(name)
70        if (node.nodeName=="OMS"):
71            if node.hasAttribute("cdbase"):
72                #FIXME: obtain from ancestors
73                cdbase=node.getAttribute("cdbase")
74            else: 
75                cdbase=None
76            cdname=node.getAttribute("cd")
77            name=node.getAttribute("name")
78            #print repr(node)
79            #print node.attributes
80            #print "cdbase", cdbase
81            if cdbase==None:
82                cd=OMCD(cdname)
83            else:
84                cd=OMCD(cdname,cdbase)
85            erg=OMSymbol(name,cd)
86        if (node.nodeName=="OMA"):
87            children=[self.buildFromNode(c) for c in node.childNodes]
88            erg= OMApply(children[0],children[1:])
89        if (node.nodeName=="OMOBJ"):
90            children=[self.buildFromNode(c) for c in node.childNodes]
91            erg= OMObject(children)
92        if (node.nodeName=="OMBIND"):
93            children=[self.buildFromNode(c) for c in node.childNodes]
94            erg= OMBinding(children[0],children[1:-1],children[-1])
95        if (node.nodeName=="OMF"):
96            if (node.hasAttribute("dec")):
97                value=float(node.getAttribute("dec"))
98            else:
99                raise NotImplementedError
100            erg=OMfloat(value)
101        if (node.nodeName=="OMR"):
102            if node.hasAttribute("xref"):
103                erg=OMRef(node.getAttribute("xref"))
104                self.refs.append(erg)
105            else:
106                raise UnresolvedReference
107        if (node.nodeName=="OMATP"):
108            children=[self.buildFromNode(c) for c in node.childNodes]
109            assert(len(children)==2)
110            erg=OMAttributePair(children[0],children[1])
111        if (node.nodeName=="OMATTR"):
112            children=[self.buildFromNode(c) for c in node.childNodes]
113            erg=OMAttribution(*children)
114        if None==erg:
115            raise NotImplementedError
116        else:
117            if node.hasAttribute("id"):
118                id=node.getAttribute("id")
119                self.ids[id]=erg
120            return erg
121    def __init__(self):
122        self.refs=[]
123        self.ids={}
124    def build(self, root):
125        remove_white_space(root)
126        erg=self.buildFromNode(root)
127        for r in self.refs:
128            r.ref=self.ids[r.ref]
129        return erg
130#TODO: handle hex floats
131#TODO: handle floats
132#TODO: handle ancestors cdbase
133if __name__=='__main__':
134    import CD.arith1 as arith1
135   
136    if len(sys.argv)<=2:
137        print "Usage: python omxmlreader [--evaluate] input output"
138    state=0
139    eval=False
140    #TODO: use optparse
141    for arg in sys.argv[1:]:
142        if state==0:
143            if arg=="--evaluate":
144                eval=True
145            else:
146                inputf=arg
147                state=1
148            continue
149        if state==1:
150            outputf=arg
151            continue
152        if state==2:
153            print "argument ignored:", arg
154    from context import Context
155    #inputf=sys.argv[1]
156    root=readFile(inputf)
157    builder=OMFromXMLBuilder()
158    context=Context()
159    context.addCDImplementation(arith1.implementation2)
160    doc=builder.build(root)
161    if eval:
162        doc=context.evaluate(doc)
163    #import profile
164    #profile.run('output=context.XMLEncodeObject(doc)','encodeprof')
165    output=context.XMLEncodeObject(doc)
166    try:
167        out=open(outputf,"w")
168    except NameError:
169        print "no output file"
170        sys.exit(1)
171    out.write(output)
172    out.close()
173    #print repr(root.getAttribute("blabla"))
Note: See TracBrowser for help on using the repository browser.