1 (***************************************************************************
3 * The Parser is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU Lesser General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 ***************************************************************************)
13 open System.Reflection;
14 open System.Runtime.CompilerServices;
15 open System.Runtime.InteropServices;
17 module internal Filter =
19 let FILTER_VARIABLE_NAME = "$filter"
21 type FilterNode(provider, token, filter: FilterExpression, node_list) =
22 inherit TagNode(provider, token)
24 override this.walk manager walker =
26 new NDjango.ASTWalker.Reader (manager, {walker with parent=None; nodes=node_list; context=walker.context})
27 match filter.ResolveForOutput manager
28 {walker with context=walker.context.add(FILTER_VARIABLE_NAME, (reader.ReadToEnd():>obj))}
33 /// Filters the contents of the block through variable filters.
35 /// Filters can also be piped through each other, and they can have
36 /// arguments -- just like in variable syntax.
40 /// {% filter force_escape|lower %}
41 /// This text will be HTML-escaped, and will appear in lowercase.
45 member this.Perform token provider tokens =
48 let filter_expr = new FilterExpression(provider, Block token, FILTER_VARIABLE_NAME + "|" + filter)
49 let node_list, remaining = (provider :?> IParser).Parse (Some token) tokens ["endfilter"]
50 (new FilterNode(provider, token, filter_expr, node_list) :> INodeImpl), remaining
51 | _ -> raise (SyntaxError ("'filter' tag requires one argument"))