]> code.delx.au - pymsnt/blob - src/tlib/xmlw.py
OOB file sending works.
[pymsnt] / src / tlib / xmlw.py
1 # Copyright 2004-2005 James Bunton <james@delx.cjb.net>
2 # Licensed for distribution under the GPL version 2, check COPYING for details
3
4 from twisted.python import log
5
6 checkTwistedCached = None
7 def checkTwisted():
8 """ Returns False if we're using an old version that needs tlib, otherwise returns True """
9 global checkTwistedCached
10 if checkTwistedCached == None:
11 import twisted.copyright
12 checkTwistedCached = (VersionNumber(twisted.copyright.version) >= VersionNumber("2.0.0"))
13 return checkTwistedCached
14
15 class VersionNumber:
16 def __init__(self, vstring):
17 self.varray = [0]
18 index = 0
19 flag = True
20 for c in vstring:
21 if c == '.':
22 self.varray.append(0)
23 index += 1
24 flag = True
25 elif c.isdigit() and flag:
26 self.varray[index] *= 10
27 self.varray[index] += int(c)
28 else:
29 flag = False
30
31 def __cmp__(self, other):
32 i = 0
33 while(True):
34 if i == len(other.varray):
35 if i < len(self.varray):
36 return 1
37 else:
38 return 0
39 if i == len(self.varray):
40 if i < len(other.varray):
41 return -1
42 else:
43 return 0
44
45 if self.varray[i] > other.varray[i]:
46 return 1
47 elif self.varray[i] < other.varray[i]:
48 return -1
49
50 i += 1
51
52
53
54 def parseText(text, beExtremelyLenient=False):
55 return TextParser(beExtremelyLenient).parseString(text)
56
57 def parseFile(filename, beExtremelyLenient=False):
58 t = TextParser(beExtremelyLenient)
59 t.parseFile(filename)
60 return t.root
61
62
63 try:
64 log.msg("Trying to import XML DOM")
65 from twisted.words.xish.domish import SuxElementStream, Element
66 from twisted.words.protocols.jabber import jid, component
67 jid.intern = jid.internJID # This got renamed for some reason
68 log.msg("Using Twisted >= 2.0, Words >= 0.3, Words DOM")
69 except ImportError:
70 try:
71 log.msg("Checking Twisted version...")
72 if checkTwisted():
73 from twisted.xish.domish import SuxElementStream, Element
74 from twisted.words.protocols.jabber import jid, component
75 jid.intern = jid.internJID # This got renamed for some reason
76 log.msg("Using Twisted >= 2.0, Words < 0.3, Twisted DOM")
77 else:
78 from tlib.domish import SuxElementStream, Element
79 from tlib.jabber import jid, component
80 log.msg("Using Twisted < 2.0, Internal patched DOM")
81 except ImportError:
82 print "Could not find the XML DOM. If you're using Twisted 2.x make sure you have twisted.words installed."
83 raise
84
85
86 class TextParser:
87 """ Taken from http://xoomer.virgilio.it/dialtone/rsschannel.py """
88
89 def __init__(self, beExtremelyLenient=False):
90 self.root = None
91 self.beExtremelyLenient = beExtremelyLenient
92
93 def parseFile(self, filename):
94 return self.parseString(file(filename).read())
95
96 def parseString(self, data):
97 es = SuxElementStream()
98 es.beExtremelyLenient = self.beExtremelyLenient
99 es.DocumentStartEvent = self.docStart
100 es.DocumentEndEvent = self.docEnd
101 es.ElementEvent = self.element
102 es.parse(data)
103 return self.root
104
105 def docStart(self, e):
106 self.root = e
107
108 def docEnd(self):
109 pass
110
111 def element(self, e):
112 self.root.addChild(e)
113
114