summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/wsgi/atomutil.py
blob: 92ad02344957796ee1dde698d67a4444daa40912 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#    
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.

# ATOM data conversion functions

from util import *
from elemutil import *
from xmlutil import *

# Convert a list of elements to a list of values representing an ATOM entry
def entryElementValues(e):
    lt = filter(selector((element, "'title")), e)
    t = "" if isNull(lt) else elementValue(car(lt))
    li = filter(selector((element, "'id")), e)
    i = "" if isNull(li) else elementValue(car(li))
    lc = filter(selector((element, "'content")), e)
    return append((element, "'entry", (element, "'title", t), (element, "'id", i)),
            () if isNull(lc) else () if isAttribute(elementValue(car(lc))) else ((element, "'content", elementValue(car(lc))),))

# Convert a list of elements to a list of values representing ATOM entries
def entriesElementValues(e):
    if isNull(e):
        return e
    return cons(entryElementValues(car(e)), entriesElementValues(cdr(e)))

# Convert a list of strings to a list of values representing an ATOM entry
def readATOMEntry(l):
    e = readXML(l)
    if isNull(e):
        return ()
    return (entryElementValues(car(e)),)

# Return true if a list of strings represents an ATOM feed
def isATOMFeed(l):
    if not isXML(l):
        return False
    return contains(car(l), "<feed") and contains(car(l), "=\"http://www.w3.org/2005/Atom\"")

# Return true if a list of strings represents an ATOM entry
def isATOMEntry(l):
    if not isXML(l):
        return False
    return contains(car(l), "<entry") and not contains(car(l), "<feed") and contains(car(l), "=\"http://www.w3.org/2005/Atom\"")

# Convert a list of strings to a list of values representing an ATOM feed
def readATOMFeed(l):
    f = readXML(l)
    if isNull(f):
        return ()
    t = filter(selector((element, "'title")), car(f))
    i = filter(selector((element, "'id")), car(f))
    e = filter(selector((element, "'entry")), car(f))
    return (append(
                (element, "'feed", (element, "'title", elementValue(car(t))), (element, "'id", elementValue(car(i)))),
                entriesElementValues(e)),)

# Convert a list of values representy an ATOM entry to a list of elements
def entryElement(l):
    etitle = namedElementChild("'title", l)
    title = elementValue(etitle) if elementHasValue(etitle) else ''
    id = elementValue(namedElementChild("'id", l))
    content = namedElementChild("'content", l)
    text = False if isNull(content) else elementHasValue(content)
    return append(append(
            (element, "'entry", (attribute, "'xmlns", "http://www.w3.org/2005/Atom"),
             (element, "'title", (attribute, "'type", "text"), title),
             (element, "'id", id)),
            () if isNull(content) else (append(
                (element, "'content", (attribute, "'type", "text" if text else "application/xml")), (elementValue(content),) if text else elementChildren(content)),)),
            ((element, "'link", (attribute, "'href", id)),))

# Convert a list of values representing ATOM entries to a list of elements
def entriesElements(l):
    if isNull(l):
        return l
    return cons(entryElement(car(l)), entriesElements(cdr(l)))

# Convert a list of values representing an ATOM entry to an ATOM entry
def writeATOMEntry(ll):
    l = ll if isNull(ll) else car(ll)
    return writeXML((entryElement(l),), True)

# Convert a list of values representing an ATOM feed to an ATOM feed
def writeATOMFeed(ll):
    l = ll if isNull(ll) else car(ll)
    lt = filter(selector((element, "'title")), l)
    t = '' if isNull(lt) else elementValue(car(lt))
    li = filter(selector((element, "'id")), l)
    i = '' if isNull(li) else elementValue(car(li))
    f = (element, "'feed", (attribute, "'xmlns", "http://www.w3.org/2005/Atom"),
            (element, "'title", (attribute, "'type", "text"), t),
            (element, "'id", i))

    # Write ATOM entries
    le = filter(selector((element, "'entry")), l)
    if isNull(le):
        return writeXML((f,), True)

    # Write a single ATOM entry element with a list of values
    if not isNull(le) and not isNull(car(le)) and isList(car(caddr(car(le)))):
        fe = append(f, entriesElements(caddr(car(le))))
        return writeXML((fe,), True)

    # Write separate ATOM entry elements
    fe = append(f, entriesElements(le))
    return writeXML((fe,), True)