#@+leo-ver=5-thin
#@+node:ville.20110206142055.10640: * @file leofeeds.py
#@+<< docstring >>
#@+node:ville.20110206142055.10641: ** << docstring >>
'''
Read feeds from rss / atom / whatever sources
Usage: Create node with a headline like:
@feed http://www.planetqt.org/atom.xml
(or somesuch).
Do alt-x act-on-node on that node to populate the subtree from the feed data. Requires "feedparser" python module
'''
#@-<< docstring >>
# By Ville M. Vainio.
#@+<< imports >>
#@+node:ville.20110206142055.10643: ** << imports >>
import leo.core.leoGlobals as g
from leo.core import leoPlugins
# Uses leoPlugins.TryNext
import feedparser
if g.isPython3:
# pylint: disable=no-name-in-module
import html.parser as HTMLParser
else:
import HTMLParser
# import pprint
# import sys
#@-<< imports >>
#@+others
#@+node:ville.20110206142055.10644: ** init
[docs]def init ():
g.registerHandler('after-create-leo-frame',onCreate)
g.plugin_signon(__name__)
return True
#@+node:ville.20110206142055.10645: ** onCreate
[docs]def onCreate (tag, keys):
c = keys.get('c')
if not c: return
# c not needed
feeds_install()
#@+node:ville.20110206142055.10648: ** fetch
[docs]class MLStripper(HTMLParser.HTMLParser):
# pylint: disable=super-init-not-called
# pylint: disable=abstract-method
def __init__(self):
self.reset()
self.fed = []
[docs] def handle_data(self, data):
self.fed.append(data)
[docs] def get_fed_data(self):
return ''.join(self.fed)
[docs]def chi(p):
return p.insertAsLastChild()
[docs]def emit(r, h, b):
chi = r.insertAsLastChild()
chi.h = h
chi.b = b
[docs]def emitfeed(url, p):
# pylint: disable=no-member
# feedparser *does* have a parse method.
d = feedparser.parse(url)
r = p.insertAsLastChild()
r.h = d.channel.title
for ent in d.entries:
#print "Entry"
#pprint.pprint(ent)
e = chi(r)
try:
cnt = ent.content[0].value
except AttributeError:
cnt = ent['summary']
e.b = strip_tags(cnt)
#e.b = str(ent)
e.h = ent.title
for li in ent.links:
lnk = chi(e)
lnk.h = '@url ' + li.rel
lnk.b = li.href
if 'enclosures' in ent:
for enc in ent.enclosures:
ec = chi(e)
ec.h = '@url Enclosure: ' + enc.get('type','notype') + " " + enc.get('length','')
ec.b = enc.get('href', '')
full = chi(e)
full.h = "orig"
full.b = cnt
[docs]def feeds_act_on_node(c,p,event):
sp = p.h.split(None, 1)
if sp[0] not in ['@feed']:
raise leoPlugins.TryNext
emitfeed(sp[1], p)
c.redraw()
[docs]def feeds_install():
g.act_on_node.add(feeds_act_on_node, 99)
#emitfeed("http://feedparser.org/docs/examples/atom10.xml", p)
#c.redraw()
#@-others
#@-leo