Project

General

Profile

« Previous | Next » 

Revision 1234

xml_func.py: Added _if and _eq. Added cast() to throw SyntaxException if can't cast and use it in conv_items(). _merge: Check types of input using conv_items(strings.ustr, items).

View differences:

lib/xml_func.py
7 7
import dates
8 8
import exc
9 9
import maps
10
import strings
10 11
import term
11 12
import util
12 13
import xml_dom
......
33 34
            str_ = str(node)
34 35
            exc.add_msg(e, 'function:\n'+str_)
35 36
            xml_dom.replace(node, node.ownerDocument.createComment(
36
                '\n'+term.emph_multiline(str_)))
37
                '\n'+term.emph_multiline(str_).replace('--','-')))
38
                # comments can't contain '--'
37 39
            on_error(e)
38 40
        else: xml_dom.replace_with_text(node, value)
39 41

  
40 42
def map_items(func, items):
41 43
    return [(name, func(value)) for name, value in items]
42 44

  
45
def cast(type_, val):
46
    '''Throws SyntaxException if can't cast'''
47
    try: return type_(val)
48
    except ValueError, e: raise SyntaxException(e)
49

  
43 50
def conv_items(type_, items):
44
    def conv(val):
45
        try: return type_(val)
46
        except ValueError, e: raise SyntaxException(e)
47
    return map_items(conv, xml_dom.TextEntryOnlyIter(items))
51
    return map_items(lambda val: cast(type_, val),
52
        xml_dom.TextEntryOnlyIter(items))
48 53

  
49 54
#### XML functions
50 55

  
......
56 61
    return None
57 62
funcs['_ignore'] = _ignore
58 63

  
64
def _eq(items):
65
    items = dict(items)
66
    try:
67
        left = items['left']
68
        right = items['right']
69
    except KeyError: return '' # a value was None
70
    return util.bool2str(left == right)
71
funcs['_eq'] = _eq
72

  
73
def _if(items):
74
    items = dict(items)
75
    try:
76
        cond = items['cond']
77
        then = items['then']
78
    except KeyError, e: raise SyntaxException(e)
79
    else_ = items.get('else', None)
80
    cond = bool(cast(str, cond))
81
    if cond: return then
82
    else: return else_
83
funcs['_if'] = _if
84

  
59 85
def _alt(items):
60 86
    items = list(items)
61 87
    items.sort()
......
64 90
funcs['_alt'] = _alt
65 91

  
66 92
def _merge(items):
67
    items = list(items)
93
    items = list(conv_items(strings.ustr, items))
94
        # get *once* from iter and check types
68 95
    items.sort()
69 96
    return maps.merge_values(*[v for k, v in items])
70 97
funcs['_merge'] = _merge
......
198 225
        out_items.append((part, ' '.join(value.split(' ')[slice_])))
199 226
    return _name(out_items)
200 227
funcs['_namePart'] = _namePart
201

  

Also available in: Unified diff