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