template: fixed the use of eval_context_filter in item_filter

This commit is contained in:
Goffi 2017-11-05 23:36:45 +01:00
commit 95508766f5

View file

@ -427,7 +427,8 @@ class Renderer(object):
continue
return u' '.join(classes) or None
def _item_filter(self, item, filters):
@jinja2.contextfilter
def _item_filter(self, ctx, item, filters):
"""return item's value, filtered if suitable
@param item(object): item to filter
@ -446,14 +447,28 @@ class Renderer(object):
if filter_ is None:
return value
elif isinstance(filter_, dict):
filter_args = filter_.get(u'filter_args')
filters_args = filter_.get(u'filters_args')
for idx, f_name in enumerate(filter_.get(u'filters', [])):
kwargs = filter_args[idx] if filter_args is not None else {}
value = self.env.filters[f_name](value, **kwargs)
template = filter_.get(u'template', u'{value}')
return template.format(value=value)
else:
return filter_(item.value)
kwargs = filters_args[idx] if filters_args is not None else {}
filter_func = self.env.filters[f_name]
try:
eval_context_filter = filter_func.evalcontextfilter
except AttributeError:
eval_context_filter = False
if eval_context_filter:
value = filter_func(ctx.eval_ctx, value, **kwargs)
else:
value = filter_func(value, **kwargs)
template = filter_.get(u'template')
if template:
# format will return a string, so we need to check first
# if the value is safe or not, and re-mark it after formatting
is_safe = isinstance(value, safe)
value = template.format(value=value)
if is_safe:
value = safe(value)
return value
def _adv_format(self, value, template, **kwargs):
"""Advancer formatter