diff --git a/plugins/Forums.py b/plugins/Forums.py
index 562d71532..2915111cc 100644
--- a/plugins/Forums.py
+++ b/plugins/Forums.py
@@ -40,15 +40,12 @@ from baseplugin import *
import re
import urllib2
+import utils
import debug
import ircmsgs
import ircutils
import callbacks
-htmlStripper = re.compile(r'<[^>]+>')
-def stripHtml(s):
- return htmlStripper.sub('', s)
-
class Forums(callbacks.PrivmsgRegexp):
threaded = True
_ggThread = re.compile(r'from thread "(.*?)"')
diff --git a/plugins/Http.py b/plugins/Http.py
index 9ec18a260..d78d9ff2d 100644
--- a/plugins/Http.py
+++ b/plugins/Http.py
@@ -48,17 +48,13 @@ import re
import time
import urllib
import urllib2
-import htmlentitydefs
import xml.dom.minidom
+import utils
import debug
import privmsgs
import callbacks
-_htmlstripper = re.compile('<[^>]+>')
-def stripHtml(s):
- return _htmlstripper.sub('', s)
-
class FreshmeatException(Exception):
pass
@@ -132,7 +128,7 @@ class Http(callbacks.Privmsg):
text = html.split('
\n', 2)[1]
text = text.replace('.\n', '. ')
text = text.replace('\n', ' ')
- text = stripHtml(text)
+ text = utils.htmlToText(text)
irc.reply(msg, text.strip())
_gkrating = re.compile(r'(\d+)')
@@ -246,10 +242,8 @@ class Http(callbacks.Privmsg):
if m is None:
irc.error(msg, 'No quote found.')
return
- quote = m.group(1)
+ quote = utils.htmlToText(m.group(1))
quote = ' // '.join(quote.splitlines())
- for (entity, replacement) in htmlentitydefs.entitydefs.iteritems():
- quote = quote.replace(entity, replacement)
irc.reply(msg, quote)
_acronymre = re.compile('
]*>[^<]+ | [^<]+]*>(\w+)')
diff --git a/plugins/Relay.py b/plugins/Relay.py
index b268da0ae..202476710 100644
--- a/plugins/Relay.py
+++ b/plugins/Relay.py
@@ -59,6 +59,7 @@ class Relay(privmsgs.CapabilityCheckingPrivmsg):
callbacks.Privmsg.__init__(self)
self.ircs = {}
self.started = False
+ self.channels = set()
self.abbreviations = {}
def startrelay(self, irc, msg, args):
@@ -97,6 +98,7 @@ class Relay(privmsgs.CapabilityCheckingPrivmsg):
def relayjoin(self, irc, msg, args):
""
channel = privmsgs.getArgs(args)
+ self.channels.add(channel)
for otherIrc in self.ircs.itervalues():
if channel not in otherIrc.state.channels:
otherIrc.queueMsg(ircmsgs.join(channel))
@@ -105,6 +107,7 @@ class Relay(privmsgs.CapabilityCheckingPrivmsg):
def relaypart(self, irc, msg, args):
""
channel = privmsgs.getArgs(args)
+ self.channels.remove(channel)
for otherIrc in self.ircs.itervalues():
if channel in otherIrc.state.channels:
otherIrc.queueMsg(ircmsgs.part(channel))
@@ -122,6 +125,8 @@ class Relay(privmsgs.CapabilityCheckingPrivmsg):
irc = irc.getRealIrc()
if self.started and ircutils.isChannel(msg.args[0]):
channel = msg.args[0]
+ if channel not in self.channels:
+ return
#debug.printf('self.abbreviations = %s' % self.abbreviations)
#debug.printf('self.ircs = %s' % self.ircs)
#debug.printf('irc = %s' % irc)
@@ -171,6 +176,8 @@ class Relay(privmsgs.CapabilityCheckingPrivmsg):
rAction = re.compile(r'\* \w+/(?:%s) ' % '|'.join(abbreviations))
if not (rPrivmsg.match(msg.args[1]) or rAction.match(msg.args[1])):
channel = msg.args[0]
+ if channel not in self.channels:
+ return
abbreviation = self.abbreviations[irc]
s = self._formatPrivmsg(irc.nick, abbreviation, msg)
for otherIrc in self.ircs.itervalues():
diff --git a/src/utils.py b/src/utils.py
new file mode 100755
index 000000000..b0d9ec584
--- /dev/null
+++ b/src/utils.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+###
+# Copyright (c) 2002, Jeremiah Fincher
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+# this list of conditions, and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions, and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of the author of this software nor the name of
+# contributors to this software may be used to endorse or promote products
+# derived from this software without specific prior written consent.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+###
+
+"""
+Simple utility functions.
+"""
+
+from fix import *
+
+import sgmllib
+import htmlentitydefs
+
+class HtmlToText(sgmllib.SGMLParser):
+ """Taken from some eff-bot code on c.l.p."""
+ entitydefs = htmlentitydefs.entitydefs
+ def __init__(self):
+ self.data = []
+ sgmllib.SGMLParser.__init__(self)
+
+ def unknown_starttag(self, tag, attrib):
+ self.data.append(" ")
+
+ def unknown_endtag(self, tag):
+ self.data.append(" ")
+
+ def handle_data(self, data):
+ self.data.append(data)
+
+ def getText(self):
+ text = ''.join(self.data).strip()
+ return ''.join(text.split()) # normalize whitespace
+
+def htmlToText(s):
+ x = HtmlToText()
+ x.feed(s)
+ return x.getText()
+
+# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78:
|