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 | #from |
---|
6 | from StringIO import StringIO |
---|
7 | import re |
---|
8 | import sys |
---|
9 | import os.path |
---|
10 | from objects import * |
---|
11 | from binding import * |
---|
12 | from cd import * |
---|
13 | from exceptions import * |
---|
14 | from omexceptions import * |
---|
15 | def readFile(input_file_name): |
---|
16 | docstream = open(input_file_name) |
---|
17 | docIS=DOMInputSource() |
---|
18 | docIS.byteStream=docstream |
---|
19 | doc= DOMBuilder().parse(docIS) |
---|
20 | docstream.close() |
---|
21 | |
---|
22 | root=doc.lastChild |
---|
23 | return root |
---|
24 | |
---|
25 | def get_text_in_children(n): |
---|
26 | t = "" |
---|
27 | for c in n.childNodes: |
---|
28 | if c.nodeType== Node.TEXT_NODE: |
---|
29 | t += c.nodeValue |
---|
30 | return t |
---|
31 | def remove_white_space(node): |
---|
32 | remove_list=[] |
---|
33 | if node.nodeName=="OMC": |
---|
34 | return |
---|
35 | for child in node.childNodes: |
---|
36 | if child.nodeType==dom.Node.TEXT_NODE and not child.data.strip(): |
---|
37 | remove_list.append(child) |
---|
38 | elif child.hasChildNodes(): |
---|
39 | remove_white_space(child) |
---|
40 | for node in remove_list: |
---|
41 | node.parentNode.removeChild(node) |
---|
42 | node.unlink() |
---|
43 | |
---|
44 | class OMFromXMLBuilder: |
---|
45 | def buildFromNode(self, node): |
---|
46 | erg=None |
---|
47 | if (node.nodeName=="OMI"): |
---|
48 | content=get_text_in_children(node) |
---|
49 | erg=OMint(content) |
---|
50 | if (node.nodeName=="OMV"): |
---|
51 | name=node.getAttribute("name") #node.attributes["name"] |
---|
52 | #print dir(name) |
---|
53 | erg= OMvar(name) |
---|
54 | if (node.nodeName=="OMS"): |
---|
55 | if node.hasAttribute("cdbase"): |
---|
56 | #FIXME: obtain from ancestors |
---|
57 | cdbase=node.getAttribute("cdbase") |
---|
58 | else: |
---|
59 | cdbase=None |
---|
60 | cdname=node.getAttribute("cd") |
---|
61 | name=node.getAttribute("name") |
---|
62 | #print repr(node) |
---|
63 | #print node.attributes |
---|
64 | #print "cdbase", cdbase |
---|
65 | if cdbase==None: |
---|
66 | cd=OMcd(cdname) |
---|
67 | else: |
---|
68 | cd=OMcd(cdname,cdbase) |
---|
69 | erg=OMsymbol(name,cd) |
---|
70 | if (node.nodeName=="OMA"): |
---|
71 | children=[self.buildFromNode(c) for c in node.childNodes] |
---|
72 | erg= OMapplication(children[0],children[1:]) |
---|
73 | if (node.nodeName=="OMBIND"): |
---|
74 | children=[self.buildFromNode(c) for c in node.childNodes] |
---|
75 | erg= OMbinding(children[0],children[1:-1],children[-1]) |
---|
76 | if (node.nodeName=="OMF"): |
---|
77 | if (node.hasAttribute("dec")): |
---|
78 | value=float(node.getAttribute("dec")) |
---|
79 | else: |
---|
80 | raise NotImplementedError |
---|
81 | erg=OMfloat(value) |
---|
82 | if (node.nodeName=="OMR"): |
---|
83 | if node.hasAttribute("xref"): |
---|
84 | erg=OMref(node.getAttribute("xref")) |
---|
85 | self.refs.append(erg) |
---|
86 | else: |
---|
87 | raise UnresolvedReference |
---|
88 | if None==erg: |
---|
89 | raise NotImplementedError |
---|
90 | else: |
---|
91 | if node.hasAttribute("id"): |
---|
92 | id=node.getAttribute("id") |
---|
93 | self.ids[id]=erg |
---|
94 | return erg |
---|
95 | def __init__(self): |
---|
96 | self.refs=[] |
---|
97 | self.ids={} |
---|
98 | def build(self, root): |
---|
99 | remove_white_space(root) |
---|
100 | erg=self.buildFromNode(root) |
---|
101 | for r in self.refs: |
---|
102 | r.ref=self.ids[r.ref] |
---|
103 | return erg |
---|
104 | #TODO: handle hex floats |
---|
105 | #TODO: handle floats |
---|
106 | #TODO: handle ancestors cdbase |
---|
107 | if __name__=='__main__': |
---|
108 | import arith1 |
---|
109 | |
---|
110 | if len(sys.argv)<=2: |
---|
111 | print "Usage: python omxmlreader [--evaluate] input output" |
---|
112 | state=0 |
---|
113 | eval=False |
---|
114 | #TODO: use optparse |
---|
115 | for arg in sys.argv[1:]: |
---|
116 | if state==0: |
---|
117 | if arg=="--evaluate": |
---|
118 | eval=True |
---|
119 | else: |
---|
120 | inputf=arg |
---|
121 | state=1 |
---|
122 | continue |
---|
123 | if state==1: |
---|
124 | outputf=arg |
---|
125 | continue |
---|
126 | if state==2: |
---|
127 | print "argument ignored:", arg |
---|
128 | from context import Context |
---|
129 | #inputf=sys.argv[1] |
---|
130 | root=readFile(inputf) |
---|
131 | builder=OMFromXMLBuilder() |
---|
132 | context=Context() |
---|
133 | context.addCDImplementation(arith1.implementation) |
---|
134 | doc=builder.build(root) |
---|
135 | if eval: |
---|
136 | doc=context.evaluate(doc) |
---|
137 | output=context.XMLEncodeObject(doc) |
---|
138 | try: |
---|
139 | out=open(outputf,"w") |
---|
140 | except NameError: |
---|
141 | print "no output file" |
---|
142 | sys.exit(1) |
---|
143 | out.write(output) |
---|
144 | out.close() |
---|
145 | #print repr(root.getAttribute("blabla")) |
---|