OTWO-1213 Works around lost encoding in Ruby/C binding layer
[ohcount] / test / src_dir / fs1.fs
1 (***************************************************************************
2  * 
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.
7  *  
8  ***************************************************************************)
9
10 namespace Tags
11
12 open System
13 open System.Reflection;
14 open System.Runtime.CompilerServices;
15 open System.Runtime.InteropServices;
16
17 module internal Filter =
18
19     let FILTER_VARIABLE_NAME = "$filter"
20
21     type FilterNode(provider, token, filter: FilterExpression, node_list) =
22         inherit TagNode(provider, token)
23
24         override this.walk manager walker = 
25             let reader = 
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))}
29                 with
30             | Some w -> w
31             | None -> walker
32
33     /// Filters the contents of the block through variable filters.
34     /// 
35     /// Filters can also be piped through each other, and they can have
36     /// arguments -- just like in variable syntax.
37     /// 
38     /// Sample usage::
39     /// 
40     ///     {% filter force_escape|lower %}
41     ///         This text will be HTML-escaped, and will appear in lowercase.
42     ///     {% endfilter %}
43     type FilterTag() =
44         interface ITag with
45             member this.Perform token provider tokens =
46                 match token.Args with
47                 | filter::[] ->
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"))