summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/wsgi/atomutil.py
blob: 8e812abbe941edc1b8a6642d89b96102ed27e12e (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
122
123
124
125
126
#  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 entryElementsToValues(e):
    lt = filter(selector((element, "'title")), e)
    t = "" if isNil(lt) else elementValue(car(lt))
    li = filter(selector((element, "'id")), e)
    i = "" if isNil(li) else elementValue(car(li))
    lc = filter(selector((element, "'content")), e)
    return (t, i, elementValue(car(lc)))

# Convert a list of elements to a list of values representing ATOM entries
def entriesElementsToValues(e):
    if isNil(e):
        return e
    return cons(entryElementsToValues(car(e)), entriesElementsToValues(cdr(e)))

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

# Convert a list of values representing an ATOM entry to a value
def entryValue(e):
    v = elementsToValues((caddr(e),))
    return cons(car(e), (cadr(e), cdr(car(v))))

# 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 isNil(f):
        return ()
    t = filter(selector((element, "'title")), car(f))
    i = filter(selector((element, "'id")), car(f))
    e = filter(selector((element, "'entry")), car(f))
    if isNil(e):
        return (elementValue(car(t)), elementValue(car(i)))
    return cons(elementValue(car(t)), cons(elementValue(car(i)), entriesElementsToValues(e)))

# Convert an ATOM feed containing elements to an ATOM feed containing values
def feedValuesLoop(e):
    if (isNil(e)):
        return e
    return cons(entryValue(car(e)), feedValuesLoop(cdr(e)))

def feedValues(e):
    return cons(car(e), cons(cadr(e), feedValuesLoop(cddr(e))))

# Convert a list of values representy an ATOM entry to a list of elements
def entryElement(l):
    return (element, "'entry", (attribute, "'xmlns", "http://www.w3.org/2005/Atom"),
            (element, "'title", (attribute, "'type", "text"), car(l)),
            (element, "'id", cadr(l)),
            (element, "'content", (attribute, "'type", ("application/xml" if isList(caddr(l)) else "text")), caddr(l)),
            (element, "'link", (attribute, "'href", cadr(l))))

# Convert a list of values representing ATOM entries to a list of elements
def entriesElements(l):
    if isNil(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(l):
    return writeXML((entryElement(l),), True)

# Convert a list of values representing an ATOM feed to an ATOM feed
def writeATOMFeed(l):
    f = (element, "'feed", (attribute, "'xmlns", "http://www.w3.org/2005/Atom"),
            (element, "'title", (attribute, "'type", "text"), car(l)),
            (element, "'id", cadr(l)))
    if isNil(cddr(l)):
        return writeXML((f,), True)
    fe = append(f, entriesElements(cddr(l)))
    return writeXML((fe,), True)

# Convert an ATOM entry containing a value to an ATOM entry containing an item element
def entryValuesToElements(v):
    if isList(caddr(v)):
        return cons(car(v), cons(cadr(v), valuesToElements((cons("'item", caddr(v)),))))
    return cons(car(v), cons(cadr(v), valuesToElements((("'item", caddr(v)),))))

# Convert an ATOM feed containing values to an ATOM feed containing elements
def feedValuesToElementsLoop(v):
    if isNil(v):
        return v
    return cons(entryValuesToElements(car(v)), feedValuesToElementsLoop(cdr(v)))

def feedValuesToElements(v):
    return cons(car(v), cons(cadr(v), feedValuesToElementsLoop(cddr(v))))