282 """Return an object which can be stringified possibly by using a legacy |
282 """Return an object which can be stringified possibly by using a legacy |
283 template""" |
283 template""" |
284 if not isinstance(thing, wrapped): |
284 if not isinstance(thing, wrapped): |
285 return thing |
285 return thing |
286 return thing.show(context, mapping) |
286 return thing.show(context, mapping) |
287 |
|
288 def unwrapvalue(context, mapping, thing): |
|
289 """Move the inner value object out of the wrapper""" |
|
290 if not isinstance(thing, wrapped): |
|
291 return thing |
|
292 return thing.tovalue(context, mapping) |
|
293 |
287 |
294 def wraphybridvalue(container, key, value): |
288 def wraphybridvalue(container, key, value): |
295 """Wrap an element of hybrid container to be mappable |
289 """Wrap an element of hybrid container to be mappable |
296 |
290 |
297 The key is passed to the makemap function of the given container, which |
291 The key is passed to the makemap function of the given container, which |
453 func, data = arg |
447 func, data = arg |
454 return func(context, mapping, data) |
448 return func(context, mapping, data) |
455 |
449 |
456 def evalfuncarg(context, mapping, arg): |
450 def evalfuncarg(context, mapping, arg): |
457 """Evaluate given argument as value type""" |
451 """Evaluate given argument as value type""" |
458 return _unwrapvalue(context, mapping, evalrawexp(context, mapping, arg)) |
452 return unwrapvalue(context, mapping, evalrawexp(context, mapping, arg)) |
459 |
453 |
460 # TODO: unify this with unwrapvalue() once the bug of templatefunc.join() |
454 def unwrapvalue(context, mapping, thing): |
461 # is fixed. we can't do that right now because join() has to take a generator |
455 """Move the inner value object out of the wrapper""" |
462 # of byte strings as it is, not a lazy byte string. |
|
463 def _unwrapvalue(context, mapping, thing): |
|
464 if isinstance(thing, wrapped): |
456 if isinstance(thing, wrapped): |
465 return thing.tovalue(context, mapping) |
457 return thing.tovalue(context, mapping) |
466 # evalrawexp() may return string, generator of strings or arbitrary object |
458 # evalrawexp() may return string, generator of strings or arbitrary object |
467 # such as date tuple, but filter does not want generator. |
459 # such as date tuple, but filter does not want generator. |
468 return _unthunk(context, mapping, thing) |
460 return _unthunk(context, mapping, thing) |
490 a (unixtime, offset) tuple""" |
482 a (unixtime, offset) tuple""" |
491 thing = evalrawexp(context, mapping, arg) |
483 thing = evalrawexp(context, mapping, arg) |
492 return unwrapdate(context, mapping, thing, err) |
484 return unwrapdate(context, mapping, thing, err) |
493 |
485 |
494 def unwrapdate(context, mapping, thing, err=None): |
486 def unwrapdate(context, mapping, thing, err=None): |
495 thing = _unwrapvalue(context, mapping, thing) |
487 thing = unwrapvalue(context, mapping, thing) |
496 try: |
488 try: |
497 return dateutil.parsedate(thing) |
489 return dateutil.parsedate(thing) |
498 except AttributeError: |
490 except AttributeError: |
499 raise error.ParseError(err or _('not a date tuple nor a string')) |
491 raise error.ParseError(err or _('not a date tuple nor a string')) |
500 except error.ParseError: |
492 except error.ParseError: |
505 def evalinteger(context, mapping, arg, err=None): |
497 def evalinteger(context, mapping, arg, err=None): |
506 thing = evalrawexp(context, mapping, arg) |
498 thing = evalrawexp(context, mapping, arg) |
507 return unwrapinteger(context, mapping, thing, err) |
499 return unwrapinteger(context, mapping, thing, err) |
508 |
500 |
509 def unwrapinteger(context, mapping, thing, err=None): |
501 def unwrapinteger(context, mapping, thing, err=None): |
510 thing = _unwrapvalue(context, mapping, thing) |
502 thing = unwrapvalue(context, mapping, thing) |
511 try: |
503 try: |
512 return int(thing) |
504 return int(thing) |
513 except (TypeError, ValueError): |
505 except (TypeError, ValueError): |
514 raise error.ParseError(err or _('not an integer')) |
506 raise error.ParseError(err or _('not an integer')) |
515 |
507 |