]> git.frykholm.com Git - friends.git/blobdiff - friends/rd/jrd.py
Some xml fixes, added rd library
[friends.git] / friends / rd / jrd.py
diff --git a/friends/rd/jrd.py b/friends/rd/jrd.py
new file mode 100644 (file)
index 0000000..4dda5b5
--- /dev/null
@@ -0,0 +1,146 @@
+
+import json
+import isodate
+
+from rd.core import RD, Attribute, Element, Link, Property, Title
+
+
+def _clean_dict(d):
+    for key in list(d.keys()):
+        if not d[key]:
+            del d[key]
+
+
+def loads(content):
+
+    def expires_handler(key, val, obj):
+        obj.expires = isodate.parse_datetime(val)
+
+    def subject_handler(key, val, obj):
+        obj.subject = val
+
+    def aliases_handler(key, val, obj):
+        for alias in val:
+            obj.aliases.append(alias)
+
+    def properties_handler(key, val, obj):
+        for ptype, pvalue in list(val.items()):
+            obj.properties.append(Property(ptype, pvalue))
+
+    def titles_handler(key, val, obj):
+        for tlang, tvalue in list(val.items()):
+            if tlang == 'default':
+                tlang = None
+            obj.titles.append(Title(tvalue, tlang))
+
+    def links_handler(key, val, obj):
+        for link in val:
+            l = Link()
+            l.rel = link.get('rel', None)
+            l.type = link.get('type', None)
+            l.href = link.get('href', None)
+            l.template = link.get('template', None)
+            if 'titles' in link:
+                titles_handler('title', link['titles'], l)
+            if 'properties' in link:
+                properties_handler('property', link['properties'], l)
+            obj.links.append(l)
+
+    def namespace_handler(key, val, obj):
+        for namespace in val:
+            ns = list(namespace.keys())[0]
+            ns_uri = list(namespace.values())[0]
+            obj.attributes.append(Attribute("xmlns:%s" % ns, ns_uri))
+
+    handlers = {
+        'expires': expires_handler,
+        'subject': subject_handler,
+        'aliases': aliases_handler,
+        'properties': properties_handler,
+        'links': links_handler,
+        'titles': titles_handler,
+        'namespace': namespace_handler,
+    }
+
+    def unknown_handler(key, val, obj):
+        if ':' in key:
+            (ns, name) = key.split(':')
+            key = "%s:%s" % (ns, name.capitalize())
+        obj.elements.append(Element(key, val))
+
+    doc = json.loads(content)
+
+    rd = RD()
+
+    for key, value in list(doc.items()):
+        handler = handlers.get(key, unknown_handler)
+        handler(key, value, rd)
+
+    return rd
+
+
+def dumps(xrd):
+
+    doc = {
+        "aliases": [],
+        "links": [],
+        "namespace": [],
+        "properties": {},
+        "titles": [],
+    }
+
+    #list_keys = doc.keys()
+
+    for attr in xrd.attributes:
+        if attr.name.startswith("xmlns:"):
+            ns = attr.name.split(":")[1]
+            doc['namespace'].append({ns: attr.value})
+
+    if xrd.expires:
+        doc['expires'] = xrd.expires.isoformat()
+
+    if xrd.subject:
+        doc['subject'] = xrd.subject
+
+    for alias in xrd.aliases:
+        doc['aliases'].append(alias)
+
+    for prop in xrd.properties:
+        doc['properties'][prop.type] = prop.value
+
+    for link in xrd.links:
+
+        link_doc = {
+            'titles': {},
+            'properties': {},
+        }
+
+        if link.rel:
+            link_doc['rel'] = link.rel
+
+        if link.type:
+            link_doc['type'] = link.type
+
+        if link.href:
+            link_doc['href'] = link.href
+
+        if link.template:
+            link_doc['template'] = link.template
+
+        for prop in link.properties:
+            link_doc['properties'][prop.type] = prop.value
+
+        for title in link.titles:
+            lang = title.lang or "default"
+            link_doc['titles'][lang] = title.value
+
+        _clean_dict(link_doc)
+
+        doc['links'].append(link_doc)
+
+    for elem in xrd.elements:
+        doc[elem.name.lower()] = elem.value
+
+    _clean_dict(doc)
+
+    return json.dumps(doc)