# HG changeset patch # User Thierry Florac # Date 1432118419 -7200 # Node ID e1aca8c25e614abe8b44615b8905e2beb76357c7 # Parent c784991b55a465f5a585b36a4eadeb2725c43ac1 Updated "extension:" TALES expression to be able to handle inner attributes with dotted notation diff -r c784991b55a4 -r e1aca8c25e61 src/pyams_utils/tales.py --- a/src/pyams_utils/tales.py Wed May 20 12:39:38 2015 +0200 +++ b/src/pyams_utils/tales.py Wed May 20 12:40:19 2015 +0200 @@ -41,6 +41,19 @@ FUNCTION_EXPRESSION = re.compile('(.+)\((.+)\)') +ARGUMENTS_EXPRESSION = re.compile('[\'\"\w\.\+@]+') + + +def get_value(econtext, arg): + """Extract argument value from context""" + if arg.startswith('"') or arg.startswith("'"): + # may be a quoted string... + return arg[1:-1] + args = arg.split('.') + result = econtext.get(args.pop(0)) + for arg in args: + result = getattr(result, arg) + return result def render_extension(econtext, name): @@ -52,10 +65,10 @@ func_match = FUNCTION_EXPRESSION.match(name) if func_match: - name, argument = func_match.groups() - arg_value = econtext.get(argument, argument) + name, arguments = func_match.groups() + arg_value = map(lambda x: get_value(econtext, x), ARGUMENTS_EXPRESSION.findall(arguments)) else: - arg_value = None + arg_value = () registry = request.registry extension = registry.queryMultiAdapter((context, request, view), ITALESExtension, name=name) @@ -71,10 +84,13 @@ # Insert the data gotten from the context addTALNamespaceData(extension, econtext) - return extension.render(arg_value) + return extension.render(*arg_value) class ExtensionExpr(ContextExprMixin, StringExpr): - """extension: TALES expression""" + """extension: TALES expression + + This expression can be used a call a custom named adapter providing ITALESExtension interface. + """ transform = Symbol(render_extension)