1 | from xml.dom.xmlbuilder import * |
---|
2 | #from xml.dom.ext import PrettyPrint |
---|
3 | from xml.dom import Node |
---|
4 | import xml.dom as dom |
---|
5 | import base64 |
---|
6 | #from |
---|
7 | from StringIO import StringIO |
---|
8 | import re |
---|
9 | import sys |
---|
10 | import os.path |
---|
11 | from objects import * |
---|
12 | from binding import * |
---|
13 | from cd import * |
---|
14 | from exceptions import * |
---|
15 | from omexceptions import * |
---|
16 | def 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 | |
---|
26 | def readStream(input_stream): |
---|
27 | docIS=DOMInputSource() |
---|
28 | docIS.byteStream=input_stream |
---|
29 | doc= DOMBuilder().parse(docIS) |
---|
30 | |
---|
31 | root=doc.lastChild |
---|
32 | return root |
---|
33 | def 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 |
---|
39 | def 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 | |
---|
52 | class 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 |
---|
133 | if __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")) |
---|