source: git/modules/openmathserver/omxmlreader.py @ e96c8d

spielwiese
Last change on this file since e96c8d was e96c8d, checked in by Michael Brickenstein <bricken@…>, 19 years ago
*bricken: strings git-svn-id: file:///usr/local/Singular/svn/trunk@8375 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 4.4 KB
Line 
1from xml.dom.xmlbuilder import *
2#from xml.dom.ext import PrettyPrint
3from xml.dom import Node
4import xml.dom as dom
5#from
6from StringIO import StringIO
7import re
8import sys
9import os.path
10from objects import *
11from binding import *
12from cd import *
13from exceptions import *
14from omexceptions import *
15def 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   
25def  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
31def 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       
44class 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=="OMSTR"):
51            content=get_text_in_children(node)
52            #print "data", content
53            erg=OMString(content)
54        if (node.nodeName=="OMV"):
55            name=node.getAttribute("name") #node.attributes["name"]
56            #print dir(name)
57            erg= OMVar(name)
58        if (node.nodeName=="OMS"):
59            if node.hasAttribute("cdbase"):
60                #FIXME: obtain from ancestors
61                cdbase=node.getAttribute("cdbase")
62            else: 
63                cdbase=None
64            cdname=node.getAttribute("cd")
65            name=node.getAttribute("name")
66            #print repr(node)
67            #print node.attributes
68            #print "cdbase", cdbase
69            if cdbase==None:
70                cd=OMCD(cdname)
71            else:
72                cd=OMCD(cdname,cdbase)
73            erg=OMSymbol(name,cd)
74        if (node.nodeName=="OMA"):
75            children=[self.buildFromNode(c) for c in node.childNodes]
76            erg= OMApply(children[0],children[1:])
77        if (node.nodeName=="OMBIND"):
78            children=[self.buildFromNode(c) for c in node.childNodes]
79            erg= OMBinding(children[0],children[1:-1],children[-1])
80        if (node.nodeName=="OMF"):
81            if (node.hasAttribute("dec")):
82                value=float(node.getAttribute("dec"))
83            else:
84                raise NotImplementedError
85            erg=OMfloat(value)
86        if (node.nodeName=="OMR"):
87            if node.hasAttribute("xref"):
88                erg=OMRef(node.getAttribute("xref"))
89                self.refs.append(erg)
90            else:
91                raise UnresolvedReference
92        if None==erg:
93            raise NotImplementedError
94        else:
95            if node.hasAttribute("id"):
96                id=node.getAttribute("id")
97                self.ids[id]=erg
98            return erg
99    def __init__(self):
100        self.refs=[]
101        self.ids={}
102    def build(self, root):
103        remove_white_space(root)
104        erg=self.buildFromNode(root)
105        for r in self.refs:
106            r.ref=self.ids[r.ref]
107        return erg
108#TODO: handle hex floats
109#TODO: handle floats
110#TODO: handle ancestors cdbase
111if __name__=='__main__':
112    import arith1
113   
114    if len(sys.argv)<=2:
115        print "Usage: python omxmlreader [--evaluate] input output"
116    state=0
117    eval=False
118    #TODO: use optparse
119    for arg in sys.argv[1:]:
120        if state==0:
121            if arg=="--evaluate":
122                eval=True
123            else:
124                inputf=arg
125                state=1
126            continue
127        if state==1:
128            outputf=arg
129            continue
130        if state==2:
131            print "argument ignored:", arg
132    from context import Context
133    #inputf=sys.argv[1]
134    root=readFile(inputf)
135    builder=OMFromXMLBuilder()
136    context=Context()
137    context.addCDImplementation(arith1.implementation)
138    doc=builder.build(root)
139    if eval:
140        doc=context.evaluate(doc)
141    output=context.XMLEncodeObject(doc)
142    try:
143        out=open(outputf,"w")
144    except NameError:
145        print "no output file"
146        sys.exit(1)
147    out.write(output)
148    out.close()
149    #print repr(root.getAttribute("blabla"))
Note: See TracBrowser for help on using the repository browser.