287 thing = func(context, mapping, data) |
287 thing = func(context, mapping, data) |
288 if isinstance(thing, types.GeneratorType): |
288 if isinstance(thing, types.GeneratorType): |
289 thing = stringify(thing) |
289 thing = stringify(thing) |
290 return thing |
290 return thing |
291 |
291 |
|
292 def evalboolean(context, mapping, arg): |
|
293 func, data = arg |
|
294 thing = func(context, mapping, data) |
|
295 if isinstance(thing, bool): |
|
296 return thing |
|
297 # other objects are evaluated as strings, which means 0 is True, but |
|
298 # empty dict/list should be False as they are expected to be '' |
|
299 return bool(stringify(thing)) |
|
300 |
292 def evalinteger(context, mapping, arg, err): |
301 def evalinteger(context, mapping, arg, err): |
293 v = evalfuncarg(context, mapping, arg) |
302 v = evalfuncarg(context, mapping, arg) |
294 try: |
303 try: |
295 return int(v) |
304 return int(v) |
296 except (TypeError, ValueError): |
305 except (TypeError, ValueError): |
558 an expression.""" |
567 an expression.""" |
559 if not (2 <= len(args) <= 3): |
568 if not (2 <= len(args) <= 3): |
560 # i18n: "if" is a keyword |
569 # i18n: "if" is a keyword |
561 raise error.ParseError(_("if expects two or three arguments")) |
570 raise error.ParseError(_("if expects two or three arguments")) |
562 |
571 |
563 test = evalstring(context, mapping, args[0]) |
572 test = evalboolean(context, mapping, args[0]) |
564 if test: |
573 if test: |
565 yield args[1][0](context, mapping, args[1][1]) |
574 yield args[1][0](context, mapping, args[1][1]) |
566 elif len(args) == 3: |
575 elif len(args) == 3: |
567 yield args[2][0](context, mapping, args[2][1]) |
576 yield args[2][0](context, mapping, args[2][1]) |
568 |
577 |