feeds: add json support
parent
6d5aa8c222
commit
4ba4d73ce6
|
@ -94,6 +94,28 @@ item_updated =
|
||||||
atom:updated
|
atom:updated
|
||||||
atom03:updated
|
atom03:updated
|
||||||
|
|
||||||
|
[json]
|
||||||
|
mode = json
|
||||||
|
path =
|
||||||
|
N/A
|
||||||
|
|
||||||
|
mimetype = application/json
|
||||||
|
timeformat = YYYY-MM-DDTHH:MM:SS
|
||||||
|
base = {}
|
||||||
|
|
||||||
|
title = title
|
||||||
|
desc = desc
|
||||||
|
items = items.[]
|
||||||
|
|
||||||
|
item_title = title
|
||||||
|
item_link = url
|
||||||
|
item_desc = desc
|
||||||
|
item_content = content
|
||||||
|
item_id = id
|
||||||
|
item_is_permalink = is_permalink
|
||||||
|
item_time = time
|
||||||
|
item_updated = updated
|
||||||
|
|
||||||
[twitter]
|
[twitter]
|
||||||
mode = xpath
|
mode = xpath
|
||||||
path =
|
path =
|
||||||
|
|
108
morss/feeds.py
108
morss/feeds.py
|
@ -394,6 +394,97 @@ def parse_time(value):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class ParserJSON(ParserBase):
|
||||||
|
ruleset = 'json'
|
||||||
|
|
||||||
|
def parse(self, raw):
|
||||||
|
return json.loads(raw)
|
||||||
|
|
||||||
|
def remove(self):
|
||||||
|
# delete oneself FIXME
|
||||||
|
pass
|
||||||
|
|
||||||
|
def tostring(self):
|
||||||
|
return json.dumps(self.root, indent=True, ensure_ascii=False)
|
||||||
|
# ensure_ascii = False to have proper utf-8 string and not \u00
|
||||||
|
|
||||||
|
def _rule_parse(self, rule):
|
||||||
|
return rule.split(".")
|
||||||
|
|
||||||
|
def rule_search_all(self, rule):
|
||||||
|
try:
|
||||||
|
rrule = self._rule_parse(rule)
|
||||||
|
cur = self.root
|
||||||
|
|
||||||
|
for node in rrule:
|
||||||
|
if node == '[]':
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
cur = cur[node]
|
||||||
|
|
||||||
|
return cur if isinstance(cur, list) else [cur,]
|
||||||
|
|
||||||
|
except (AttributeError, KeyError):
|
||||||
|
return []
|
||||||
|
|
||||||
|
def rule_create(self, rule):
|
||||||
|
# create from scracth
|
||||||
|
rrule = self._rule_parse(rule)
|
||||||
|
cur = self.root
|
||||||
|
|
||||||
|
for (i, node) in enumerate(rrule):
|
||||||
|
if rrule[i+1] == '[]':
|
||||||
|
if node in cur and isinstance(cur[node], list):
|
||||||
|
cur[node].append({})
|
||||||
|
|
||||||
|
else:
|
||||||
|
cur[node] = [{}]
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
else:
|
||||||
|
if node in cur:
|
||||||
|
# yay, go on
|
||||||
|
cur = cur[node]
|
||||||
|
else:
|
||||||
|
# opps need to create
|
||||||
|
cur[node] = {}
|
||||||
|
|
||||||
|
def rule_remove(self, rule):
|
||||||
|
if '[]' in rule:
|
||||||
|
raise ValueError('not supported') # FIXME
|
||||||
|
|
||||||
|
rrule = self._rule_parse(rule)
|
||||||
|
cur = self.root
|
||||||
|
|
||||||
|
for node in rrule[:-1]:
|
||||||
|
cur = cur[node]
|
||||||
|
|
||||||
|
del cur[rrule[-1]]
|
||||||
|
|
||||||
|
def rule_set(self, rule, value):
|
||||||
|
if '[]' in rule:
|
||||||
|
raise ValueError('not supported') # FIXME
|
||||||
|
|
||||||
|
rrule = self._rule_parse(rule)
|
||||||
|
cur = self.root
|
||||||
|
|
||||||
|
for node in rrule[:-1]:
|
||||||
|
cur = cur[node]
|
||||||
|
|
||||||
|
cur[rrule[-1]] = value
|
||||||
|
|
||||||
|
def rule_str(self, rule):
|
||||||
|
out = self.rule_search(rule)
|
||||||
|
return str(out).replace('\n', '<br/>') if out else out
|
||||||
|
|
||||||
|
def bool_prs(self, x):
|
||||||
|
return (x or '').lower() != 'false'
|
||||||
|
|
||||||
|
def bool_fmt(self, x):
|
||||||
|
return str(bool(x))
|
||||||
|
|
||||||
|
|
||||||
class Uniq(object):
|
class Uniq(object):
|
||||||
_map = {}
|
_map = {}
|
||||||
_id = None
|
_id = None
|
||||||
|
@ -518,3 +609,20 @@ class FeedXML(Feed, ParserXML):
|
||||||
|
|
||||||
class ItemXML(Item, ParserXML):
|
class ItemXML(Item, ParserXML):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class FeedJSON(Feed, ParserJSON):
|
||||||
|
itemsClass = 'ItemJSON'
|
||||||
|
|
||||||
|
|
||||||
|
class ItemJSON(Item, ParserJSON):
|
||||||
|
def remove(self):
|
||||||
|
rrule = self._rule_parse(self.rules['items'])
|
||||||
|
cur = self.parent.root
|
||||||
|
|
||||||
|
for node in rrule:
|
||||||
|
if node == '[]':
|
||||||
|
cur.remove(self.root)
|
||||||
|
return
|
||||||
|
|
||||||
|
cur = cur[node]
|
||||||
|
|
Loading…
Reference in New Issue