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

spielwiese
Last change on this file since aeb6d3 was aeb6d3, checked in by Michael Brickenstein <bricken@…>, 19 years ago
*bricken: refactoring git-svn-id: file:///usr/local/Singular/svn/trunk@8372 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 4.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
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=="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= OMApply(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
107if __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"))
Note: See TracBrowser for help on using the repository browser.