From 95508766f5aadee5b7128b921d662918705047fc Mon Sep 17 00:00:00 2001 From: Goffi Date: Sun, 5 Nov 2017 23:36:45 +0100 Subject: [PATCH] template: fixed the use of eval_context_filter in item_filter --- src/tools/common/template.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/tools/common/template.py b/src/tools/common/template.py index 6cd2c210..65453385 100644 --- a/src/tools/common/template.py +++ b/src/tools/common/template.py @@ -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