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