source: git/modules/openmathserver/omxmlreader.py @ 666465b

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