1 /* 2 * Hunt - A high-level D Programming Language Web framework that encourages rapid development and clean, pragmatic design. 3 * 4 * Copyright (C) 2015-2019, HuntLabs 5 * 6 * Website: https://www.huntlabs.net/ 7 * 8 * Licensed under the Apache-2.0 License. 9 * 10 */ 11 12 module hunt.framework.view.algo.Filters; 13 14 private 15 { 16 import hunt.framework.view.algo.Wrapper; 17 import hunt.framework.view.Uninode; 18 } 19 20 // dfmt off 21 Function[string] globalFilters() 22 { 23 return cast(immutable) 24 [ 25 "default": wrapper!defaultVal, 26 "d": wrapper!defaultVal, 27 "escape": wrapper!escape, 28 "e": wrapper!escape, 29 "upper": wrapper!upper, 30 "lower": wrapper!lower, 31 "sort": wrapper!sort, 32 "keys": wrapper!keys, 33 ]; 34 } 35 // dfmt on 36 37 UniNode defaultVal(UniNode value, UniNode default_value = UniNode(""), bool boolean = false) 38 { 39 if (value.kind == UniNode.Kind.nil) 40 return default_value; 41 42 if (!boolean) 43 return value; 44 45 value.toBoolType; 46 if (!value.get!bool) 47 return default_value; 48 49 return value; 50 } 51 52 53 string escape(string s) 54 { 55 import std.array : appender; 56 57 auto w = appender!string; 58 w.reserve(s.length); 59 60 foreach (char ch; s) 61 switch (ch) 62 { 63 case '&': w.put("&"); break; 64 case '\"': w.put("""); break; 65 case '\'': w.put("'"); break; 66 case '<': w.put("<"); break; 67 case '>': w.put(">"); break; 68 default: w.put(ch); break; 69 } 70 71 return w.data; 72 } 73 74 75 string upper(string str) 76 { 77 import std.uni : toUpper; 78 return str.toUpper; 79 } 80 81 string lower(string str) 82 { 83 import std.uni : toLower; 84 return str.toLower; 85 } 86 87 UniNode sort(UniNode value) 88 { 89 import std.algorithm : sort; 90 91 switch (value.kind) with (UniNode.Kind) 92 { 93 case array: 94 auto arr = value.get!(UniNode[]); 95 sort!((a, b) => a.getAsString < b.getAsString)(arr); 96 return UniNode(arr); 97 98 case object: 99 UniNode[] arr; 100 foreach (string key, val; value) 101 arr ~= UniNode([UniNode(key), val]); 102 sort!"a[0].get!string < b[0].get!string"(arr); 103 return UniNode(arr); 104 105 default: 106 return value; 107 } 108 } 109 110 111 UniNode keys(UniNode value) 112 { 113 if (value.kind != UniNode.Kind.object) 114 return UniNode(null); 115 116 UniNode[] arr; 117 foreach (string key, val; value) 118 arr ~= UniNode(key); 119 return UniNode(arr); 120 }