[9b973c] | 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 |
---|
[bf5590] | 5 | import base64 |
---|
[9b973c] | 6 | #from |
---|
| 7 | from StringIO import StringIO |
---|
| 8 | import re |
---|
| 9 | import sys |
---|
| 10 | import os.path |
---|
| 11 | from objects import * |
---|
[859b51] | 12 | from binding import * |
---|
[9b973c] | 13 | from cd import * |
---|
[859b51] | 14 | from exceptions import * |
---|
[04f6a4] | 15 | from omexceptions import * |
---|
[9b973c] | 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 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 |
---|
| 32 | def 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 | |
---|
| 45 | class OMFromXMLBuilder: |
---|
| 46 | def buildFromNode(self, node): |
---|
[04f6a4] | 47 | erg=None |
---|
[9b973c] | 48 | if (node.nodeName=="OMI"): |
---|
| 49 | content=get_text_in_children(node) |
---|
[04f6a4] | 50 | erg=OMint(content) |
---|
[e96c8d] | 51 | if (node.nodeName=="OMSTR"): |
---|
| 52 | content=get_text_in_children(node) |
---|
| 53 | #print "data", content |
---|
| 54 | erg=OMString(content) |
---|
[bf5590] | 55 | if (node.nodeName=="OMB"): |
---|
| 56 | content=get_text_in_children(node) |
---|
| 57 | #print "data", content |
---|
| 58 | erg=OMByteArray(base64.decodestring(content)) |
---|
[9b973c] | 59 | if (node.nodeName=="OMV"): |
---|
| 60 | name=node.getAttribute("name") #node.attributes["name"] |
---|
| 61 | #print dir(name) |
---|
[01cd17f] | 62 | erg= OMVar(name) |
---|
[9b973c] | 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: |
---|
[b1b9c0d] | 75 | cd=OMCD(cdname) |
---|
[9b973c] | 76 | else: |
---|
[b1b9c0d] | 77 | cd=OMCD(cdname,cdbase) |
---|
[01cd17f] | 78 | erg=OMSymbol(name,cd) |
---|
[9b973c] | 79 | if (node.nodeName=="OMA"): |
---|
| 80 | children=[self.buildFromNode(c) for c in node.childNodes] |
---|
[aeb6d3] | 81 | erg= OMApply(children[0],children[1:]) |
---|
[bf5590] | 82 | if (node.nodeName=="OMOBJ"): |
---|
| 83 | children=[self.buildFromNode(c) for c in node.childNodes] |
---|
| 84 | erg= OMObject(children) |
---|
[859b51] | 85 | if (node.nodeName=="OMBIND"): |
---|
| 86 | children=[self.buildFromNode(c) for c in node.childNodes] |
---|
[9122086] | 87 | erg= OMBinding(children[0],children[1:-1],children[-1]) |
---|
[d0eb8c] | 88 | if (node.nodeName=="OMF"): |
---|
| 89 | if (node.hasAttribute("dec")): |
---|
| 90 | value=float(node.getAttribute("dec")) |
---|
| 91 | else: |
---|
| 92 | raise NotImplementedError |
---|
[04f6a4] | 93 | erg=OMfloat(value) |
---|
| 94 | if (node.nodeName=="OMR"): |
---|
| 95 | if node.hasAttribute("xref"): |
---|
[01cd17f] | 96 | erg=OMRef(node.getAttribute("xref")) |
---|
[04f6a4] | 97 | self.refs.append(erg) |
---|
| 98 | else: |
---|
| 99 | raise UnresolvedReference |
---|
[d113d3] | 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) |
---|
[04f6a4] | 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={} |
---|
[9b973c] | 117 | def build(self, root): |
---|
| 118 | remove_white_space(root) |
---|
[04f6a4] | 119 | erg=self.buildFromNode(root) |
---|
| 120 | for r in self.refs: |
---|
| 121 | r.ref=self.ids[r.ref] |
---|
| 122 | return erg |
---|
[9b973c] | 123 | #TODO: handle hex floats |
---|
[b651ed] | 124 | #TODO: handle floats |
---|
[9b973c] | 125 | #TODO: handle ancestors cdbase |
---|
| 126 | if __name__=='__main__': |
---|
[8eb83d] | 127 | import CD.arith1 as arith1 |
---|
[b651ed] | 128 | |
---|
| 129 | if len(sys.argv)<=2: |
---|
[9b973c] | 130 | print "Usage: python omxmlreader [--evaluate] input output" |
---|
[b651ed] | 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 |
---|
[9b973c] | 147 | from context import Context |
---|
[b651ed] | 148 | #inputf=sys.argv[1] |
---|
[9b973c] | 149 | root=readFile(inputf) |
---|
| 150 | builder=OMFromXMLBuilder() |
---|
| 151 | context=Context() |
---|
[b651ed] | 152 | context.addCDImplementation(arith1.implementation) |
---|
| 153 | doc=builder.build(root) |
---|
| 154 | if eval: |
---|
| 155 | doc=context.evaluate(doc) |
---|
[666465b] | 156 | #import profile |
---|
| 157 | #profile.run('output=context.XMLEncodeObject(doc)','encodeprof') |
---|
[b651ed] | 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() |
---|
[01cd17f] | 166 | #print repr(root.getAttribute("blabla")) |
---|