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