diff options
author | Yves Fischer <yvesf-git@xapek.org> | 2015-11-22 01:36:39 +0100 |
---|---|---|
committer | Yves Fischer <yvesf-git@xapek.org> | 2015-11-22 01:36:39 +0100 |
commit | f8cfab4db9e197a403da6c444de1eb295357c9c3 (patch) | |
tree | 1ed6772d966c68f4e457c4a2612ef256d01a4efb | |
parent | 6080b38fb2b6b3c1017bdd34bb7552bc7e26a4a0 (diff) | |
download | watchnews-f8cfab4db9e197a403da6c444de1eb295357c9c3.tar.gz watchnews-f8cfab4db9e197a403da6c444de1eb295357c9c3.zip |
generation of rss feed
-rwxr-xr-x | watchnews-cli | 7 | ||||
-rw-r--r-- | watchnews/rss.py | 50 | ||||
-rw-r--r-- | watchnews/web.py | 26 |
3 files changed, 76 insertions, 7 deletions
diff --git a/watchnews-cli b/watchnews-cli index 53f5104..2fe9cd5 100755 --- a/watchnews-cli +++ b/watchnews-cli @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -from watchnews import data, web, fetch +from watchnews import data, web, fetch, rss import os import argparse @@ -26,6 +26,8 @@ if __name__ == "__main__": parser.add_argument("--db", metavar="DBPATH", default=os.path.join(os.path.dirname(__file__), "db.sqlite"), help="Path to sqlite database file") + parser.add_argument("--rss", action='store_true', + help="Dump a RSS feeds") args = parser.parse_args() @@ -54,4 +56,7 @@ if __name__ == "__main__": feed, feed.created_date.strftime('%x %X'))) if args.web: web.get_app().run() + if args.rss: + print(rss.rss()) + diff --git a/watchnews/rss.py b/watchnews/rss.py new file mode 100644 index 0000000..30510c2 --- /dev/null +++ b/watchnews/rss.py @@ -0,0 +1,50 @@ +from . import data +from .web import Difftable + + +from ll.xist import xsc, parse +from ll.xist.ns import xml, rss20 + + +def rss(): + versions = data.Version.raw("""\ +SELECT * +FROM version v +WHERE EXISTS (SELECT 1 + FROM version v2 + WHERE v2.id != v.id + AND v2.item_id == v.item_id + AND v2.created_date < v.created_date) +ORDER BY v.created_date DESC +LIMIT 30""") + + items = [] + for to_version in versions: + from_version = data.Version.select() \ + .where((data.Version.id != to_version.id) & + (data.Version.item == to_version.item) & + (data.Version.created_date < to_version.created_date)) \ + .order_by(data.Version.created_date.desc()) \ + .first() + + difftable = Difftable(to_version, from_version, + inline_style=True).string("utf-8") + items.append(rss20.item( + rss20.title( + "{} - {}".format(to_version.item.feed.title, to_version.title)), + rss20.author(to_version.authors), + rss20.pubDate(to_version.created_date.strftime( + "%a, %d %b %Y %T %z")), + rss20.guid("from={},to={}".format(from_version.id, to_version.id)), + rss20.link(to_version.url), + rss20.description( + xsc.Text(difftable) + ) + )) + return xsc.Frag(xml.XML(), rss20.rss( + rss20.channel( + rss20.title("Watchnews change report"), + *items + ) + ) + ).string("utf-8") diff --git a/watchnews/web.py b/watchnews/web.py index 438e649..05ffcdc 100644 --- a/watchnews/web.py +++ b/watchnews/web.py @@ -9,6 +9,8 @@ import difflib class DiffSupport: + def __init__(self): + self.inline_style = False def _diff(self, line1, line2): diff = list(difflib._mdiff([line1], [line2])) @@ -27,21 +29,31 @@ class DiffSupport: html.td(*self._format_diff(diff2)) )) return html.table(rows, **{'class': 'textdiff'}) - + def _format_diff(self, line): + actionclass = { + '+': 'diff_add', + '-': 'diff_sub', + '^': 'diff_chg'} + actionname = { + '+': 'i', + '-': 'strike', + '^': 'strong'} elems = [] nextpos = line.find("\x00") while nextpos != -1 and nextpos + 1 < len(line): - actionclass = { - '+': 'diff_add', '-': 'diff_sub', - '^': 'diff_chg'}[line[nextpos + 1]] endpos = line.find("\x01", nextpos + 2) if nextpos != 0: # intermediate unchanged text elems += [html.span(line[:nextpos])] text = line[nextpos + 2:endpos] - elems += [html.span(text, **{'class': actionclass})] + if self.inline_style: + elem = html.span(text) + elem.xmlname = actionname[line[nextpos+1]] + elems += [elem] + else: + elems += [html.span(text, **{'class':actionclass[line[nextpos+1]]})] line = line[endpos:] nextpos = line.find("\x00") @@ -53,8 +65,10 @@ class DiffSupport: class Difftable(html.div, DiffSupport): - def __init__(self, to_version, from_version=None): + def __init__(self, to_version, from_version=None, inline_style=False): super().__init__() + self.xmlname = "div" + self.inline_style = inline_style if from_version == None: self.single_version(to_version) else: |