diff --git a/doc/build/filtering.rst b/doc/build/filtering.rst index 3bcb25a6..531b1552 100644 --- a/doc/build/filtering.rst +++ b/doc/build/filtering.rst @@ -169,6 +169,20 @@ will render ``myexpression`` with no filtering of any kind, and: will render ``myexpression`` using the ``trim`` filter only. +Including the ``n`` filter in a ``<%page>`` tag will only disable +``default_filters``. In effect this makes the filters from the tag replace +default filters instead of adding to them. For example: + +.. sourcecode:: mako + + <%page expression_filter="n, json.dumps"/> + data = {a: ${123}, b: ${"123"}}; + +will suppress turning the values into strings using the default filter, so that +``json.dumps`` (which requires ``imports=["import json"]`` or something +equivalent) can take the value type into account, formatting numbers as numeric +literals and strings as string literals. + Filtering Defs and Blocks ========================= diff --git a/mako/codegen.py b/mako/codegen.py index 1acc5e6a..5ca7b041 100644 --- a/mako/codegen.py +++ b/mako/codegen.py @@ -802,7 +802,7 @@ def locate_encode(name): if is_expression: if self.compiler.pagetag: args = self.compiler.pagetag.filter_args.args + args - if self.compiler.default_filters: + if self.compiler.default_filters and "n" not in args: args = self.compiler.default_filters + args for e in args: # if filter given as a function, get just the identifier portion diff --git a/test/test_filters.py b/test/test_filters.py index 598cb456..a58a01f9 100644 --- a/test/test_filters.py +++ b/test/test_filters.py @@ -294,6 +294,17 @@ def test_nflag(self): ) assert t.render().strip() == "<tag>this is html</tag>" + def test_global_json(self): + t = Template( + """ +<%! +import json +%><%page expression_filter="n, json.dumps"/> +data = {a: ${123}, b: ${"123"}}; + """ + ) + assert t.render().strip() == """data = {a: 123, b: "123"};""" + def test_non_expression(self): t = Template( """