]> git.sommitrealweird.co.uk Git - rss2maildir.git/blobdiff - rss2maildir.py
Fix bug when link/guid contains characters not in ascii by encoding the keys as utf-8
[rss2maildir.git] / rss2maildir.py
index 86387f96ac01c2d8c1dfa12e9e6f4efddef92d27..533e34d614c810bda43514a118f1677dcfaffe4f 100755 (executable)
@@ -44,6 +44,8 @@ import md5
 import cgi
 import dbm
 
+import re
+
 from HTMLParser import HTMLParser
 
 class HTML2Text(HTMLParser):
@@ -188,7 +190,7 @@ class HTML2Text(HTMLParser):
         u'dt',
         u'dd',
         u'div',
-        #u'blockquote',
+        u'blockquote',
         ]
 
     liststarttags = [
@@ -407,11 +409,11 @@ class HTML2Text(HTMLParser):
             quote = unicode( \
                 " ".join(self.curdata.encode("utf-8").strip().split()), \
                 "utf-8")
-            seperator = u'\n' + u' ' * self.indentlevel + u'> '
+            seperator = u'\n' + u' ' * self.indentlevel + u'    '
             if len(self.text) > 0 and self.text[-1] != u'\n':
                 self.text = self.text + u'\n'
             self.text = self.text \
-                + u'> ' \
+                + u'    ' \
                 + seperator.join( \
                     textwrap.wrap( \
                         quote, \
@@ -556,12 +558,24 @@ class HTML2Text(HTMLParser):
             self.opentags.append(u'p')
         self.curdata = self.curdata + data.decode("utf-8")
 
+    def handle_charref(self, name):
+        try:
+            entity = unichr(int(name))
+        except:
+            if name[0] == 'x':
+                try:
+                    entity = unichr(int('0%s' %(name,), 16))
+                except:
+                    entity = u'#%s' %(name,)
+            else:
+                entity = u'#%s' %(name,)
+        self.curdata = self.curdata + unicode(entity.encode('utf-8'), \
+            "utf-8")
+
     def handle_entityref(self, name):
         entity = name
         if HTML2Text.entities.has_key(name):
             entity = HTML2Text.entities[name]
-        elif name[0] == "#":
-            entity = unichr(int(name[1:]))
         else:
             entity = "&" + name + ";"
 
@@ -669,23 +683,29 @@ def parse_and_deliver(maildir, url, statedir):
         if item.has_key("content"):
             content = item["content"][0]["value"]
         else:
-            content = item["summary"]
+            if item.has_key("description"):
+                content = item["description"]
+            else:
+                content = u''
 
         md5sum = md5.md5(content.encode("utf-8")).hexdigest()
 
         prevmessageid = None
 
+        db_guid_key = (url + u'|' + item["guid"]).encode("utf-8")
+        db_link_key = (url + u'|' + item["link"]).encode("utf-8")
+
         # check if there's a guid too - if that exists and we match the md5,
         # return
         if item.has_key("guid"):
-            if db.has_key(url + "|" + item["guid"]):
-                data = db[url + "|" + item["guid"]]
+            if db.has_key(db_guid_key):
+                data = db[db_guid_key]
                 data = cgi.parse_qs(data)
                 if data["contentmd5"][0] == md5sum:
                     continue
 
-        if db.has_key(url + "|" + item["link"]):
-            data = db[url + "|" + item["link"]]
+        if db.has_key(db_link_key):
+            data = db[db_link_key]
             data = cgi.parse_qs(data)
             if data.has_key("message-id"):
                 prevmessageid = data["message-id"][0]
@@ -722,7 +742,10 @@ def parse_and_deliver(maildir, url, statedir):
             pass
         msg.add_header("Date", createddate)
         subj_gen = HTML2Text()
-        subj_gen.feed(item["title"].encode("utf-8"))
+        title = item["title"]
+        title = re.sub(u'<', u'&lt;', title)
+        title = re.sub(u'>', u'&gt;', title)
+        subj_gen.feed(title.encode("utf-8"))
         msg.add_header("Subject", subj_gen.gettext())
         msg.set_default_type("text/plain")
 
@@ -770,25 +793,25 @@ def parse_and_deliver(maildir, url, statedir):
                 ("created", createddate), \
                 ("contentmd5", md5sum) \
                 ))
-            db[url + "|" + item["guid"]] = data
+            db[db_guid_key] = data
             try:
-                data = db[url + "|" + item["link"]]
+                data = db[db_link_key]
                 data = cgi.parse_qs(data)
                 newdata = urllib.urlencode(( \
                     ("message-id", messageid), \
                     ("created", data["created"][0]), \
                     ("contentmd5", data["contentmd5"][0]) \
                     ))
-                db[url + "|" + item["link"]] = newdata
+                db[db_link_key] = newdata
             except:
-                db[url + "|" + item["link"]] = data
+                db[db_link_key] = data
         else:
             data = urllib.urlencode(( \
                 ("message-id", messageid), \
                 ("created", createddate), \
                 ("contentmd5", md5sum) \
                 ))
-            db[url + "|" + item["link"]] = data
+            db[db_link_key] = data
 
     if headers:
         data = []