summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYves Fischer <yvesf-git@xapek.org>2015-11-22 01:36:39 +0100
committerYves Fischer <yvesf-git@xapek.org>2015-11-22 01:36:39 +0100
commitf8cfab4db9e197a403da6c444de1eb295357c9c3 (patch)
tree1ed6772d966c68f4e457c4a2612ef256d01a4efb
parent6080b38fb2b6b3c1017bdd34bb7552bc7e26a4a0 (diff)
downloadwatchnews-f8cfab4db9e197a403da6c444de1eb295357c9c3.tar.gz
watchnews-f8cfab4db9e197a403da6c444de1eb295357c9c3.zip
generation of rss feed
-rwxr-xr-xwatchnews-cli7
-rw-r--r--watchnews/rss.py50
-rw-r--r--watchnews/web.py26
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: