Revision 1234
Added by Aaron Marcuse-Kubitza almost 13 years ago
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
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).