]> code.delx.au - pymsnt/blob - src/tlib/xmlw.py
Small fixes to xmlw.
[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 log.msg("Using Twisted >= 2.0, Words >= 0.3, Words DOM")
68 except ImportError:
69 try:
70 log.msg("Checking Twisted version...")
71 if checkTwisted():
72 from twisted.xish.domish import SuxElementStream, Element
73 from twisted.words.protocols.jabber import jid, component
74 log.msg("Using Twisted >= 2.0, Words < 0.3, Twisted DOM")
75 else:
76 from tlib.domish import SuxElementStream, Element
77 from tlib.jabber import jid, component
78 log.msg("Using Twisted < 2.0, Internal patched DOM")
79 except ImportError:
80 print "Could not find the XML DOM. If you're using Twisted 2.x make sure you have twisted.words installed."
81 raise
82
83
84 class TextParser:
85 """ Taken from http://xoomer.virgilio.it/dialtone/rsschannel.py """
86
87 def __init__(self, beExtremelyLenient=False):
88 self.root = None
89 self.beExtremelyLenient = beExtremelyLenient
90
91 def parseFile(self, filename):
92 return self.parseString(file(filename).read())
93
94 def parseString(self, data):
95 es = SuxElementStream()
96 es.beExtremelyLenient = self.beExtremelyLenient
97 es.DocumentStartEvent = self.docStart
98 es.DocumentEndEvent = self.docEnd
99 es.ElementEvent = self.element
100 es.parse(data)
101 return self.root
102
103 def docStart(self, e):
104 self.root = e
105
106 def docEnd(self):
107 pass
108
109 def element(self, e):
110 self.root.addChild(e)
111
112