Merge branch 'filters' into render

master
Tom Alexander 4 years ago
commit f16c3a4fa1
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE

@ -0,0 +1,13 @@
HTML Escaping
-------------
Dust automatically applies the `|h` filter to html escape unless `|s` is applied to disable automatic html escaping. It seems that if you manually specify `|h` and `|s` in the same filter, then it still html escapes, so my theory on the logic is:
Iterate over all filters
If `|s` is not present append `|h`, otherwise, leave filters as-in
During render, `|s` does nothing, so we can just remove it on the dust side to prevent confusion.
Quoting
-------
Oddly enough, `boolean|j|js` gets no quotes (meaning `boolean|j` remains a boolean) but `boolean|h|js` does get quotes (meaning that `boolean|h` becomes a string)

@ -0,0 +1,15 @@
{
"string": "{\"foo\": \"bar\"}",
"integer": 4,
"float": 7.4,
"boolean": true,
"null": null,
"array": [
"foo",
"bar"
],
"object": {
"foo": "bar"
},
"special_characters": "<>xx\b&\"'\t\f\n\r\\!@#$%^&*()[]{}<>,./?:;_-+=`"
}

@ -0,0 +1,40 @@
Special characters: {special_characters}{~n}
Special characters html escaping disabled: {special_characters|s}{~n}
Special characters html escaping disabled and enabled: {special_characters|s|h}{~n}
Special characters html escaping enabled and disabled: {special_characters|h|s}{~n}
Special characters html escaped once: {special_characters|h}{~n}
Special characters html escaped twice: {special_characters|h|h}{~n}
Object string parsed: {string|jp}{~n}
Object string parsed and stringified: {string|jp|js}{~n}
Object string stringified and parsed: {string|js|jp}{~n}
Array: {array}{~n}
Array stringified: {array|js}{~n}
Array stringified and parsed: {array|js|jp}{~n}
Object: {object}{~n}
Object html escaped: {object|h}{~n}
Object html escaping disabled: {object|s}{~n}
Object stringified: {object|js}{~n}
Object stringified and parsed: {object|js|jp}{~n}
Object stringified, html escaping disabled, parsed, stringified, and html escaped: {object|js|s|jp|js|h}{~n}
Special characters: {special_characters}{~n}
Special characters html escaping disabled and javascript escaped: {special_characters|s|j}{~n}
Special characters javascript escaped and html escaping disabled: {special_characters|j|s}{~n}
Special characters javascript escaped once: {special_characters|j}{~n}
Special characters javascript escaped twice: {special_characters|j|j}{~n}
Special characters: {special_characters}{~n}
Special characters html escaping disabled and encodeURI: {special_characters|s|u}{~n}
Special characters encodeURI and html escaping disabled: {special_characters|u|s}{~n}
Special characters encodeURI once: {special_characters|u}{~n}
Special characters encodeURI twice: {special_characters|u|u}{~n}
Special characters: {special_characters}{~n}
Special characters html escaping disabled and encodeURIComponent: {special_characters|s|uc}{~n}
Special characters encodeURIComponent and html escaping disabled: {special_characters|uc|s}{~n}
Special characters encodeURIComponent once: {special_characters|uc}{~n}
Special characters encodeURIComponent twice: {special_characters|uc|uc}{~n}

@ -0,0 +1,6 @@
{
"name": [
"foo",
"bar"
]
}

@ -0,0 +1,517 @@
Hello {name}!{~n}
Hello {name|s}!{~n}
Hello {name|h}!{~n}
Hello {name|j}!{~n}
Hello {name|u}!{~n}
Hello {name|uc}!{~n}
Hello {name|js}!{~n}
Hello {name|s|h}!{~n}
Hello {name|s|j}!{~n}
Hello {name|s|u}!{~n}
Hello {name|s|uc}!{~n}
Hello {name|s|js}!{~n}
Hello {name|h|s}!{~n}
Hello {name|h|j}!{~n}
Hello {name|h|u}!{~n}
Hello {name|h|uc}!{~n}
Hello {name|h|js}!{~n}
Hello {name|j|s}!{~n}
Hello {name|j|h}!{~n}
Hello {name|j|u}!{~n}
Hello {name|j|uc}!{~n}
Hello {name|j|js}!{~n}
Hello {name|u|s}!{~n}
Hello {name|u|h}!{~n}
Hello {name|u|j}!{~n}
Hello {name|u|uc}!{~n}
Hello {name|u|js}!{~n}
Hello {name|uc|s}!{~n}
Hello {name|uc|h}!{~n}
Hello {name|uc|j}!{~n}
Hello {name|uc|u}!{~n}
Hello {name|uc|js}!{~n}
Hello {name|js|s}!{~n}
Hello {name|js|h}!{~n}
Hello {name|js|j}!{~n}
Hello {name|js|u}!{~n}
Hello {name|js|uc}!{~n}
Hello {name|s|h|j}!{~n}
Hello {name|s|h|u}!{~n}
Hello {name|s|h|uc}!{~n}
Hello {name|s|h|js}!{~n}
Hello {name|s|j|h}!{~n}
Hello {name|s|j|u}!{~n}
Hello {name|s|j|uc}!{~n}
Hello {name|s|j|js}!{~n}
Hello {name|s|u|h}!{~n}
Hello {name|s|u|j}!{~n}
Hello {name|s|u|uc}!{~n}
Hello {name|s|u|js}!{~n}
Hello {name|s|uc|h}!{~n}
Hello {name|s|uc|j}!{~n}
Hello {name|s|uc|u}!{~n}
Hello {name|s|uc|js}!{~n}
Hello {name|s|js|h}!{~n}
Hello {name|s|js|j}!{~n}
Hello {name|s|js|u}!{~n}
Hello {name|s|js|uc}!{~n}
Hello {name|h|s|j}!{~n}
Hello {name|h|s|u}!{~n}
Hello {name|h|s|uc}!{~n}
Hello {name|h|s|js}!{~n}
Hello {name|h|j|s}!{~n}
Hello {name|h|j|u}!{~n}
Hello {name|h|j|uc}!{~n}
Hello {name|h|j|js}!{~n}
Hello {name|h|u|s}!{~n}
Hello {name|h|u|j}!{~n}
Hello {name|h|u|uc}!{~n}
Hello {name|h|u|js}!{~n}
Hello {name|h|uc|s}!{~n}
Hello {name|h|uc|j}!{~n}
Hello {name|h|uc|u}!{~n}
Hello {name|h|uc|js}!{~n}
Hello {name|h|js|s}!{~n}
Hello {name|h|js|j}!{~n}
Hello {name|h|js|u}!{~n}
Hello {name|h|js|uc}!{~n}
Hello {name|j|s|h}!{~n}
Hello {name|j|s|u}!{~n}
Hello {name|j|s|uc}!{~n}
Hello {name|j|s|js}!{~n}
Hello {name|j|h|s}!{~n}
Hello {name|j|h|u}!{~n}
Hello {name|j|h|uc}!{~n}
Hello {name|j|h|js}!{~n}
Hello {name|j|u|s}!{~n}
Hello {name|j|u|h}!{~n}
Hello {name|j|u|uc}!{~n}
Hello {name|j|u|js}!{~n}
Hello {name|j|uc|s}!{~n}
Hello {name|j|uc|h}!{~n}
Hello {name|j|uc|u}!{~n}
Hello {name|j|uc|js}!{~n}
Hello {name|j|js|s}!{~n}
Hello {name|j|js|h}!{~n}
Hello {name|j|js|u}!{~n}
Hello {name|j|js|uc}!{~n}
Hello {name|u|s|h}!{~n}
Hello {name|u|s|j}!{~n}
Hello {name|u|s|uc}!{~n}
Hello {name|u|s|js}!{~n}
Hello {name|u|h|s}!{~n}
Hello {name|u|h|j}!{~n}
Hello {name|u|h|uc}!{~n}
Hello {name|u|h|js}!{~n}
Hello {name|u|j|s}!{~n}
Hello {name|u|j|h}!{~n}
Hello {name|u|j|uc}!{~n}
Hello {name|u|j|js}!{~n}
Hello {name|u|uc|s}!{~n}
Hello {name|u|uc|h}!{~n}
Hello {name|u|uc|j}!{~n}
Hello {name|u|uc|js}!{~n}
Hello {name|u|js|s}!{~n}
Hello {name|u|js|h}!{~n}
Hello {name|u|js|j}!{~n}
Hello {name|u|js|uc}!{~n}
Hello {name|uc|s|h}!{~n}
Hello {name|uc|s|j}!{~n}
Hello {name|uc|s|u}!{~n}
Hello {name|uc|s|js}!{~n}
Hello {name|uc|h|s}!{~n}
Hello {name|uc|h|j}!{~n}
Hello {name|uc|h|u}!{~n}
Hello {name|uc|h|js}!{~n}
Hello {name|uc|j|s}!{~n}
Hello {name|uc|j|h}!{~n}
Hello {name|uc|j|u}!{~n}
Hello {name|uc|j|js}!{~n}
Hello {name|uc|u|s}!{~n}
Hello {name|uc|u|h}!{~n}
Hello {name|uc|u|j}!{~n}
Hello {name|uc|u|js}!{~n}
Hello {name|uc|js|s}!{~n}
Hello {name|uc|js|h}!{~n}
Hello {name|uc|js|j}!{~n}
Hello {name|uc|js|u}!{~n}
Hello {name|js|s|h}!{~n}
Hello {name|js|s|j}!{~n}
Hello {name|js|s|u}!{~n}
Hello {name|js|s|uc}!{~n}
Hello {name|js|h|s}!{~n}
Hello {name|js|h|j}!{~n}
Hello {name|js|h|u}!{~n}
Hello {name|js|h|uc}!{~n}
Hello {name|js|j|s}!{~n}
Hello {name|js|j|h}!{~n}
Hello {name|js|j|u}!{~n}
Hello {name|js|j|uc}!{~n}
Hello {name|js|u|s}!{~n}
Hello {name|js|u|h}!{~n}
Hello {name|js|u|j}!{~n}
Hello {name|js|u|uc}!{~n}
Hello {name|js|uc|s}!{~n}
Hello {name|js|uc|h}!{~n}
Hello {name|js|uc|j}!{~n}
Hello {name|js|uc|u}!{~n}
Hello {name|s|h|j|u}!{~n}
Hello {name|s|h|j|uc}!{~n}
Hello {name|s|h|j|js}!{~n}
Hello {name|s|h|u|j}!{~n}
Hello {name|s|h|u|uc}!{~n}
Hello {name|s|h|u|js}!{~n}
Hello {name|s|h|uc|j}!{~n}
Hello {name|s|h|uc|u}!{~n}
Hello {name|s|h|uc|js}!{~n}
Hello {name|s|h|js|j}!{~n}
Hello {name|s|h|js|u}!{~n}
Hello {name|s|h|js|uc}!{~n}
Hello {name|s|j|h|u}!{~n}
Hello {name|s|j|h|uc}!{~n}
Hello {name|s|j|h|js}!{~n}
Hello {name|s|j|u|h}!{~n}
Hello {name|s|j|u|uc}!{~n}
Hello {name|s|j|u|js}!{~n}
Hello {name|s|j|uc|h}!{~n}
Hello {name|s|j|uc|u}!{~n}
Hello {name|s|j|uc|js}!{~n}
Hello {name|s|j|js|h}!{~n}
Hello {name|s|j|js|u}!{~n}
Hello {name|s|j|js|uc}!{~n}
Hello {name|s|u|h|j}!{~n}
Hello {name|s|u|h|uc}!{~n}
Hello {name|s|u|h|js}!{~n}
Hello {name|s|u|j|h}!{~n}
Hello {name|s|u|j|uc}!{~n}
Hello {name|s|u|j|js}!{~n}
Hello {name|s|u|uc|h}!{~n}
Hello {name|s|u|uc|j}!{~n}
Hello {name|s|u|uc|js}!{~n}
Hello {name|s|u|js|h}!{~n}
Hello {name|s|u|js|j}!{~n}
Hello {name|s|u|js|uc}!{~n}
Hello {name|s|uc|h|j}!{~n}
Hello {name|s|uc|h|u}!{~n}
Hello {name|s|uc|h|js}!{~n}
Hello {name|s|uc|j|h}!{~n}
Hello {name|s|uc|j|u}!{~n}
Hello {name|s|uc|j|js}!{~n}
Hello {name|s|uc|u|h}!{~n}
Hello {name|s|uc|u|j}!{~n}
Hello {name|s|uc|u|js}!{~n}
Hello {name|s|uc|js|h}!{~n}
Hello {name|s|uc|js|j}!{~n}
Hello {name|s|uc|js|u}!{~n}
Hello {name|s|js|h|j}!{~n}
Hello {name|s|js|h|u}!{~n}
Hello {name|s|js|h|uc}!{~n}
Hello {name|s|js|j|h}!{~n}
Hello {name|s|js|j|u}!{~n}
Hello {name|s|js|j|uc}!{~n}
Hello {name|s|js|u|h}!{~n}
Hello {name|s|js|u|j}!{~n}
Hello {name|s|js|u|uc}!{~n}
Hello {name|s|js|uc|h}!{~n}
Hello {name|s|js|uc|j}!{~n}
Hello {name|s|js|uc|u}!{~n}
Hello {name|h|s|j|u}!{~n}
Hello {name|h|s|j|uc}!{~n}
Hello {name|h|s|j|js}!{~n}
Hello {name|h|s|u|j}!{~n}
Hello {name|h|s|u|uc}!{~n}
Hello {name|h|s|u|js}!{~n}
Hello {name|h|s|uc|j}!{~n}
Hello {name|h|s|uc|u}!{~n}
Hello {name|h|s|uc|js}!{~n}
Hello {name|h|s|js|j}!{~n}
Hello {name|h|s|js|u}!{~n}
Hello {name|h|s|js|uc}!{~n}
Hello {name|h|j|s|u}!{~n}
Hello {name|h|j|s|uc}!{~n}
Hello {name|h|j|s|js}!{~n}
Hello {name|h|j|u|s}!{~n}
Hello {name|h|j|u|uc}!{~n}
Hello {name|h|j|u|js}!{~n}
Hello {name|h|j|uc|s}!{~n}
Hello {name|h|j|uc|u}!{~n}
Hello {name|h|j|uc|js}!{~n}
Hello {name|h|j|js|s}!{~n}
Hello {name|h|j|js|u}!{~n}
Hello {name|h|j|js|uc}!{~n}
Hello {name|h|u|s|j}!{~n}
Hello {name|h|u|s|uc}!{~n}
Hello {name|h|u|s|js}!{~n}
Hello {name|h|u|j|s}!{~n}
Hello {name|h|u|j|uc}!{~n}
Hello {name|h|u|j|js}!{~n}
Hello {name|h|u|uc|s}!{~n}
Hello {name|h|u|uc|j}!{~n}
Hello {name|h|u|uc|js}!{~n}
Hello {name|h|u|js|s}!{~n}
Hello {name|h|u|js|j}!{~n}
Hello {name|h|u|js|uc}!{~n}
Hello {name|h|uc|s|j}!{~n}
Hello {name|h|uc|s|u}!{~n}
Hello {name|h|uc|s|js}!{~n}
Hello {name|h|uc|j|s}!{~n}
Hello {name|h|uc|j|u}!{~n}
Hello {name|h|uc|j|js}!{~n}
Hello {name|h|uc|u|s}!{~n}
Hello {name|h|uc|u|j}!{~n}
Hello {name|h|uc|u|js}!{~n}
Hello {name|h|uc|js|s}!{~n}
Hello {name|h|uc|js|j}!{~n}
Hello {name|h|uc|js|u}!{~n}
Hello {name|h|js|s|j}!{~n}
Hello {name|h|js|s|u}!{~n}
Hello {name|h|js|s|uc}!{~n}
Hello {name|h|js|j|s}!{~n}
Hello {name|h|js|j|u}!{~n}
Hello {name|h|js|j|uc}!{~n}
Hello {name|h|js|u|s}!{~n}
Hello {name|h|js|u|j}!{~n}
Hello {name|h|js|u|uc}!{~n}
Hello {name|h|js|uc|s}!{~n}
Hello {name|h|js|uc|j}!{~n}
Hello {name|h|js|uc|u}!{~n}
Hello {name|j|s|h|u}!{~n}
Hello {name|j|s|h|uc}!{~n}
Hello {name|j|s|h|js}!{~n}
Hello {name|j|s|u|h}!{~n}
Hello {name|j|s|u|uc}!{~n}
Hello {name|j|s|u|js}!{~n}
Hello {name|j|s|uc|h}!{~n}
Hello {name|j|s|uc|u}!{~n}
Hello {name|j|s|uc|js}!{~n}
Hello {name|j|s|js|h}!{~n}
Hello {name|j|s|js|u}!{~n}
Hello {name|j|s|js|uc}!{~n}
Hello {name|j|h|s|u}!{~n}
Hello {name|j|h|s|uc}!{~n}
Hello {name|j|h|s|js}!{~n}
Hello {name|j|h|u|s}!{~n}
Hello {name|j|h|u|uc}!{~n}
Hello {name|j|h|u|js}!{~n}
Hello {name|j|h|uc|s}!{~n}
Hello {name|j|h|uc|u}!{~n}
Hello {name|j|h|uc|js}!{~n}
Hello {name|j|h|js|s}!{~n}
Hello {name|j|h|js|u}!{~n}
Hello {name|j|h|js|uc}!{~n}
Hello {name|j|u|s|h}!{~n}
Hello {name|j|u|s|uc}!{~n}
Hello {name|j|u|s|js}!{~n}
Hello {name|j|u|h|s}!{~n}
Hello {name|j|u|h|uc}!{~n}
Hello {name|j|u|h|js}!{~n}
Hello {name|j|u|uc|s}!{~n}
Hello {name|j|u|uc|h}!{~n}
Hello {name|j|u|uc|js}!{~n}
Hello {name|j|u|js|s}!{~n}
Hello {name|j|u|js|h}!{~n}
Hello {name|j|u|js|uc}!{~n}
Hello {name|j|uc|s|h}!{~n}
Hello {name|j|uc|s|u}!{~n}
Hello {name|j|uc|s|js}!{~n}
Hello {name|j|uc|h|s}!{~n}
Hello {name|j|uc|h|u}!{~n}
Hello {name|j|uc|h|js}!{~n}
Hello {name|j|uc|u|s}!{~n}
Hello {name|j|uc|u|h}!{~n}
Hello {name|j|uc|u|js}!{~n}
Hello {name|j|uc|js|s}!{~n}
Hello {name|j|uc|js|h}!{~n}
Hello {name|j|uc|js|u}!{~n}
Hello {name|j|js|s|h}!{~n}
Hello {name|j|js|s|u}!{~n}
Hello {name|j|js|s|uc}!{~n}
Hello {name|j|js|h|s}!{~n}
Hello {name|j|js|h|u}!{~n}
Hello {name|j|js|h|uc}!{~n}
Hello {name|j|js|u|s}!{~n}
Hello {name|j|js|u|h}!{~n}
Hello {name|j|js|u|uc}!{~n}
Hello {name|j|js|uc|s}!{~n}
Hello {name|j|js|uc|h}!{~n}
Hello {name|j|js|uc|u}!{~n}
Hello {name|u|s|h|j}!{~n}
Hello {name|u|s|h|uc}!{~n}
Hello {name|u|s|h|js}!{~n}
Hello {name|u|s|j|h}!{~n}
Hello {name|u|s|j|uc}!{~n}
Hello {name|u|s|j|js}!{~n}
Hello {name|u|s|uc|h}!{~n}
Hello {name|u|s|uc|j}!{~n}
Hello {name|u|s|uc|js}!{~n}
Hello {name|u|s|js|h}!{~n}
Hello {name|u|s|js|j}!{~n}
Hello {name|u|s|js|uc}!{~n}
Hello {name|u|h|s|j}!{~n}
Hello {name|u|h|s|uc}!{~n}
Hello {name|u|h|s|js}!{~n}
Hello {name|u|h|j|s}!{~n}
Hello {name|u|h|j|uc}!{~n}
Hello {name|u|h|j|js}!{~n}
Hello {name|u|h|uc|s}!{~n}
Hello {name|u|h|uc|j}!{~n}
Hello {name|u|h|uc|js}!{~n}
Hello {name|u|h|js|s}!{~n}
Hello {name|u|h|js|j}!{~n}
Hello {name|u|h|js|uc}!{~n}
Hello {name|u|j|s|h}!{~n}
Hello {name|u|j|s|uc}!{~n}
Hello {name|u|j|s|js}!{~n}
Hello {name|u|j|h|s}!{~n}
Hello {name|u|j|h|uc}!{~n}
Hello {name|u|j|h|js}!{~n}
Hello {name|u|j|uc|s}!{~n}
Hello {name|u|j|uc|h}!{~n}
Hello {name|u|j|uc|js}!{~n}
Hello {name|u|j|js|s}!{~n}
Hello {name|u|j|js|h}!{~n}
Hello {name|u|j|js|uc}!{~n}
Hello {name|u|uc|s|h}!{~n}
Hello {name|u|uc|s|j}!{~n}
Hello {name|u|uc|s|js}!{~n}
Hello {name|u|uc|h|s}!{~n}
Hello {name|u|uc|h|j}!{~n}
Hello {name|u|uc|h|js}!{~n}
Hello {name|u|uc|j|s}!{~n}
Hello {name|u|uc|j|h}!{~n}
Hello {name|u|uc|j|js}!{~n}
Hello {name|u|uc|js|s}!{~n}
Hello {name|u|uc|js|h}!{~n}
Hello {name|u|uc|js|j}!{~n}
Hello {name|u|js|s|h}!{~n}
Hello {name|u|js|s|j}!{~n}
Hello {name|u|js|s|uc}!{~n}
Hello {name|u|js|h|s}!{~n}
Hello {name|u|js|h|j}!{~n}
Hello {name|u|js|h|uc}!{~n}
Hello {name|u|js|j|s}!{~n}
Hello {name|u|js|j|h}!{~n}
Hello {name|u|js|j|uc}!{~n}
Hello {name|u|js|uc|s}!{~n}
Hello {name|u|js|uc|h}!{~n}
Hello {name|u|js|uc|j}!{~n}
Hello {name|uc|s|h|j}!{~n}
Hello {name|uc|s|h|u}!{~n}
Hello {name|uc|s|h|js}!{~n}
Hello {name|uc|s|j|h}!{~n}
Hello {name|uc|s|j|u}!{~n}
Hello {name|uc|s|j|js}!{~n}
Hello {name|uc|s|u|h}!{~n}
Hello {name|uc|s|u|j}!{~n}
Hello {name|uc|s|u|js}!{~n}
Hello {name|uc|s|js|h}!{~n}
Hello {name|uc|s|js|j}!{~n}
Hello {name|uc|s|js|u}!{~n}
Hello {name|uc|h|s|j}!{~n}
Hello {name|uc|h|s|u}!{~n}
Hello {name|uc|h|s|js}!{~n}
Hello {name|uc|h|j|s}!{~n}
Hello {name|uc|h|j|u}!{~n}
Hello {name|uc|h|j|js}!{~n}
Hello {name|uc|h|u|s}!{~n}
Hello {name|uc|h|u|j}!{~n}
Hello {name|uc|h|u|js}!{~n}
Hello {name|uc|h|js|s}!{~n}
Hello {name|uc|h|js|j}!{~n}
Hello {name|uc|h|js|u}!{~n}
Hello {name|uc|j|s|h}!{~n}
Hello {name|uc|j|s|u}!{~n}
Hello {name|uc|j|s|js}!{~n}
Hello {name|uc|j|h|s}!{~n}
Hello {name|uc|j|h|u}!{~n}
Hello {name|uc|j|h|js}!{~n}
Hello {name|uc|j|u|s}!{~n}
Hello {name|uc|j|u|h}!{~n}
Hello {name|uc|j|u|js}!{~n}
Hello {name|uc|j|js|s}!{~n}
Hello {name|uc|j|js|h}!{~n}
Hello {name|uc|j|js|u}!{~n}
Hello {name|uc|u|s|h}!{~n}
Hello {name|uc|u|s|j}!{~n}
Hello {name|uc|u|s|js}!{~n}
Hello {name|uc|u|h|s}!{~n}
Hello {name|uc|u|h|j}!{~n}
Hello {name|uc|u|h|js}!{~n}
Hello {name|uc|u|j|s}!{~n}
Hello {name|uc|u|j|h}!{~n}
Hello {name|uc|u|j|js}!{~n}
Hello {name|uc|u|js|s}!{~n}
Hello {name|uc|u|js|h}!{~n}
Hello {name|uc|u|js|j}!{~n}
Hello {name|uc|js|s|h}!{~n}
Hello {name|uc|js|s|j}!{~n}
Hello {name|uc|js|s|u}!{~n}
Hello {name|uc|js|h|s}!{~n}
Hello {name|uc|js|h|j}!{~n}
Hello {name|uc|js|h|u}!{~n}
Hello {name|uc|js|j|s}!{~n}
Hello {name|uc|js|j|h}!{~n}
Hello {name|uc|js|j|u}!{~n}
Hello {name|uc|js|u|s}!{~n}
Hello {name|uc|js|u|h}!{~n}
Hello {name|uc|js|u|j}!{~n}
Hello {name|js|s|h|j}!{~n}
Hello {name|js|s|h|u}!{~n}
Hello {name|js|s|h|uc}!{~n}
Hello {name|js|s|j|h}!{~n}
Hello {name|js|s|j|u}!{~n}
Hello {name|js|s|j|uc}!{~n}
Hello {name|js|s|u|h}!{~n}
Hello {name|js|s|u|j}!{~n}
Hello {name|js|s|u|uc}!{~n}
Hello {name|js|s|uc|h}!{~n}
Hello {name|js|s|uc|j}!{~n}
Hello {name|js|s|uc|u}!{~n}
Hello {name|js|h|s|j}!{~n}
Hello {name|js|h|s|u}!{~n}
Hello {name|js|h|s|uc}!{~n}
Hello {name|js|h|j|s}!{~n}
Hello {name|js|h|j|u}!{~n}
Hello {name|js|h|j|uc}!{~n}
Hello {name|js|h|u|s}!{~n}
Hello {name|js|h|u|j}!{~n}
Hello {name|js|h|u|uc}!{~n}
Hello {name|js|h|uc|s}!{~n}
Hello {name|js|h|uc|j}!{~n}
Hello {name|js|h|uc|u}!{~n}
Hello {name|js|j|s|h}!{~n}
Hello {name|js|j|s|u}!{~n}
Hello {name|js|j|s|uc}!{~n}
Hello {name|js|j|h|s}!{~n}
Hello {name|js|j|h|u}!{~n}
Hello {name|js|j|h|uc}!{~n}
Hello {name|js|j|u|s}!{~n}
Hello {name|js|j|u|h}!{~n}
Hello {name|js|j|u|uc}!{~n}
Hello {name|js|j|uc|s}!{~n}
Hello {name|js|j|uc|h}!{~n}
Hello {name|js|j|uc|u}!{~n}
Hello {name|js|u|s|h}!{~n}
Hello {name|js|u|s|j}!{~n}
Hello {name|js|u|s|uc}!{~n}
Hello {name|js|u|h|s}!{~n}
Hello {name|js|u|h|j}!{~n}
Hello {name|js|u|h|uc}!{~n}
Hello {name|js|u|j|s}!{~n}
Hello {name|js|u|j|h}!{~n}
Hello {name|js|u|j|uc}!{~n}
Hello {name|js|u|uc|s}!{~n}
Hello {name|js|u|uc|h}!{~n}
Hello {name|js|u|uc|j}!{~n}
Hello {name|js|uc|s|h}!{~n}
Hello {name|js|uc|s|j}!{~n}
Hello {name|js|uc|s|u}!{~n}
Hello {name|js|uc|h|s}!{~n}
Hello {name|js|uc|h|j}!{~n}
Hello {name|js|uc|h|u}!{~n}
Hello {name|js|uc|j|s}!{~n}
Hello {name|js|uc|j|h}!{~n}
Hello {name|js|uc|j|u}!{~n}
Hello {name|js|uc|u|s}!{~n}
Hello {name|js|uc|u|h}!{~n}
Hello {name|js|uc|u|j}!{~n}

@ -0,0 +1,5 @@
{
"name": {
"foo": "bar"
}
}

@ -0,0 +1,3 @@
{
"name": "{\"foo\": \"bar\"}"
}

@ -0,0 +1 @@
I had to split the generated_filters test into two tests because dustjs is limited to 65536 characters of output (a shortcoming duster will not have).

@ -0,0 +1,6 @@
{
"name": [
"foo",
"bar"
]
}

@ -0,0 +1,720 @@
Hello {name|s|h|j|u|uc}!{~n}
Hello {name|s|h|j|u|js}!{~n}
Hello {name|s|h|j|uc|u}!{~n}
Hello {name|s|h|j|uc|js}!{~n}
Hello {name|s|h|j|js|u}!{~n}
Hello {name|s|h|j|js|uc}!{~n}
Hello {name|s|h|u|j|uc}!{~n}
Hello {name|s|h|u|j|js}!{~n}
Hello {name|s|h|u|uc|j}!{~n}
Hello {name|s|h|u|uc|js}!{~n}
Hello {name|s|h|u|js|j}!{~n}
Hello {name|s|h|u|js|uc}!{~n}
Hello {name|s|h|uc|j|u}!{~n}
Hello {name|s|h|uc|j|js}!{~n}
Hello {name|s|h|uc|u|j}!{~n}
Hello {name|s|h|uc|u|js}!{~n}
Hello {name|s|h|uc|js|j}!{~n}
Hello {name|s|h|uc|js|u}!{~n}
Hello {name|s|h|js|j|u}!{~n}
Hello {name|s|h|js|j|uc}!{~n}
Hello {name|s|h|js|u|j}!{~n}
Hello {name|s|h|js|u|uc}!{~n}
Hello {name|s|h|js|uc|j}!{~n}
Hello {name|s|h|js|uc|u}!{~n}
Hello {name|s|j|h|u|uc}!{~n}
Hello {name|s|j|h|u|js}!{~n}
Hello {name|s|j|h|uc|u}!{~n}
Hello {name|s|j|h|uc|js}!{~n}
Hello {name|s|j|h|js|u}!{~n}
Hello {name|s|j|h|js|uc}!{~n}
Hello {name|s|j|u|h|uc}!{~n}
Hello {name|s|j|u|h|js}!{~n}
Hello {name|s|j|u|uc|h}!{~n}
Hello {name|s|j|u|uc|js}!{~n}
Hello {name|s|j|u|js|h}!{~n}
Hello {name|s|j|u|js|uc}!{~n}
Hello {name|s|j|uc|h|u}!{~n}
Hello {name|s|j|uc|h|js}!{~n}
Hello {name|s|j|uc|u|h}!{~n}
Hello {name|s|j|uc|u|js}!{~n}
Hello {name|s|j|uc|js|h}!{~n}
Hello {name|s|j|uc|js|u}!{~n}
Hello {name|s|j|js|h|u}!{~n}
Hello {name|s|j|js|h|uc}!{~n}
Hello {name|s|j|js|u|h}!{~n}
Hello {name|s|j|js|u|uc}!{~n}
Hello {name|s|j|js|uc|h}!{~n}
Hello {name|s|j|js|uc|u}!{~n}
Hello {name|s|u|h|j|uc}!{~n}
Hello {name|s|u|h|j|js}!{~n}
Hello {name|s|u|h|uc|j}!{~n}
Hello {name|s|u|h|uc|js}!{~n}
Hello {name|s|u|h|js|j}!{~n}
Hello {name|s|u|h|js|uc}!{~n}
Hello {name|s|u|j|h|uc}!{~n}
Hello {name|s|u|j|h|js}!{~n}
Hello {name|s|u|j|uc|h}!{~n}
Hello {name|s|u|j|uc|js}!{~n}
Hello {name|s|u|j|js|h}!{~n}
Hello {name|s|u|j|js|uc}!{~n}
Hello {name|s|u|uc|h|j}!{~n}
Hello {name|s|u|uc|h|js}!{~n}
Hello {name|s|u|uc|j|h}!{~n}
Hello {name|s|u|uc|j|js}!{~n}
Hello {name|s|u|uc|js|h}!{~n}
Hello {name|s|u|uc|js|j}!{~n}
Hello {name|s|u|js|h|j}!{~n}
Hello {name|s|u|js|h|uc}!{~n}
Hello {name|s|u|js|j|h}!{~n}
Hello {name|s|u|js|j|uc}!{~n}
Hello {name|s|u|js|uc|h}!{~n}
Hello {name|s|u|js|uc|j}!{~n}
Hello {name|s|uc|h|j|u}!{~n}
Hello {name|s|uc|h|j|js}!{~n}
Hello {name|s|uc|h|u|j}!{~n}
Hello {name|s|uc|h|u|js}!{~n}
Hello {name|s|uc|h|js|j}!{~n}
Hello {name|s|uc|h|js|u}!{~n}
Hello {name|s|uc|j|h|u}!{~n}
Hello {name|s|uc|j|h|js}!{~n}
Hello {name|s|uc|j|u|h}!{~n}
Hello {name|s|uc|j|u|js}!{~n}
Hello {name|s|uc|j|js|h}!{~n}
Hello {name|s|uc|j|js|u}!{~n}
Hello {name|s|uc|u|h|j}!{~n}
Hello {name|s|uc|u|h|js}!{~n}
Hello {name|s|uc|u|j|h}!{~n}
Hello {name|s|uc|u|j|js}!{~n}
Hello {name|s|uc|u|js|h}!{~n}
Hello {name|s|uc|u|js|j}!{~n}
Hello {name|s|uc|js|h|j}!{~n}
Hello {name|s|uc|js|h|u}!{~n}
Hello {name|s|uc|js|j|h}!{~n}
Hello {name|s|uc|js|j|u}!{~n}
Hello {name|s|uc|js|u|h}!{~n}
Hello {name|s|uc|js|u|j}!{~n}
Hello {name|s|js|h|j|u}!{~n}
Hello {name|s|js|h|j|uc}!{~n}
Hello {name|s|js|h|u|j}!{~n}
Hello {name|s|js|h|u|uc}!{~n}
Hello {name|s|js|h|uc|j}!{~n}
Hello {name|s|js|h|uc|u}!{~n}
Hello {name|s|js|j|h|u}!{~n}
Hello {name|s|js|j|h|uc}!{~n}
Hello {name|s|js|j|u|h}!{~n}
Hello {name|s|js|j|u|uc}!{~n}
Hello {name|s|js|j|uc|h}!{~n}
Hello {name|s|js|j|uc|u}!{~n}
Hello {name|s|js|u|h|j}!{~n}
Hello {name|s|js|u|h|uc}!{~n}
Hello {name|s|js|u|j|h}!{~n}
Hello {name|s|js|u|j|uc}!{~n}
Hello {name|s|js|u|uc|h}!{~n}
Hello {name|s|js|u|uc|j}!{~n}
Hello {name|s|js|uc|h|j}!{~n}
Hello {name|s|js|uc|h|u}!{~n}
Hello {name|s|js|uc|j|h}!{~n}
Hello {name|s|js|uc|j|u}!{~n}
Hello {name|s|js|uc|u|h}!{~n}
Hello {name|s|js|uc|u|j}!{~n}
Hello {name|h|s|j|u|uc}!{~n}
Hello {name|h|s|j|u|js}!{~n}
Hello {name|h|s|j|uc|u}!{~n}
Hello {name|h|s|j|uc|js}!{~n}
Hello {name|h|s|j|js|u}!{~n}
Hello {name|h|s|j|js|uc}!{~n}
Hello {name|h|s|u|j|uc}!{~n}
Hello {name|h|s|u|j|js}!{~n}
Hello {name|h|s|u|uc|j}!{~n}
Hello {name|h|s|u|uc|js}!{~n}
Hello {name|h|s|u|js|j}!{~n}
Hello {name|h|s|u|js|uc}!{~n}
Hello {name|h|s|uc|j|u}!{~n}
Hello {name|h|s|uc|j|js}!{~n}
Hello {name|h|s|uc|u|j}!{~n}
Hello {name|h|s|uc|u|js}!{~n}
Hello {name|h|s|uc|js|j}!{~n}
Hello {name|h|s|uc|js|u}!{~n}
Hello {name|h|s|js|j|u}!{~n}
Hello {name|h|s|js|j|uc}!{~n}
Hello {name|h|s|js|u|j}!{~n}
Hello {name|h|s|js|u|uc}!{~n}
Hello {name|h|s|js|uc|j}!{~n}
Hello {name|h|s|js|uc|u}!{~n}
Hello {name|h|j|s|u|uc}!{~n}
Hello {name|h|j|s|u|js}!{~n}
Hello {name|h|j|s|uc|u}!{~n}
Hello {name|h|j|s|uc|js}!{~n}
Hello {name|h|j|s|js|u}!{~n}
Hello {name|h|j|s|js|uc}!{~n}
Hello {name|h|j|u|s|uc}!{~n}
Hello {name|h|j|u|s|js}!{~n}
Hello {name|h|j|u|uc|s}!{~n}
Hello {name|h|j|u|uc|js}!{~n}
Hello {name|h|j|u|js|s}!{~n}
Hello {name|h|j|u|js|uc}!{~n}
Hello {name|h|j|uc|s|u}!{~n}
Hello {name|h|j|uc|s|js}!{~n}
Hello {name|h|j|uc|u|s}!{~n}
Hello {name|h|j|uc|u|js}!{~n}
Hello {name|h|j|uc|js|s}!{~n}
Hello {name|h|j|uc|js|u}!{~n}
Hello {name|h|j|js|s|u}!{~n}
Hello {name|h|j|js|s|uc}!{~n}
Hello {name|h|j|js|u|s}!{~n}
Hello {name|h|j|js|u|uc}!{~n}
Hello {name|h|j|js|uc|s}!{~n}
Hello {name|h|j|js|uc|u}!{~n}
Hello {name|h|u|s|j|uc}!{~n}
Hello {name|h|u|s|j|js}!{~n}
Hello {name|h|u|s|uc|j}!{~n}
Hello {name|h|u|s|uc|js}!{~n}
Hello {name|h|u|s|js|j}!{~n}
Hello {name|h|u|s|js|uc}!{~n}
Hello {name|h|u|j|s|uc}!{~n}
Hello {name|h|u|j|s|js}!{~n}
Hello {name|h|u|j|uc|s}!{~n}
Hello {name|h|u|j|uc|js}!{~n}
Hello {name|h|u|j|js|s}!{~n}
Hello {name|h|u|j|js|uc}!{~n}
Hello {name|h|u|uc|s|j}!{~n}
Hello {name|h|u|uc|s|js}!{~n}
Hello {name|h|u|uc|j|s}!{~n}
Hello {name|h|u|uc|j|js}!{~n}
Hello {name|h|u|uc|js|s}!{~n}
Hello {name|h|u|uc|js|j}!{~n}
Hello {name|h|u|js|s|j}!{~n}
Hello {name|h|u|js|s|uc}!{~n}
Hello {name|h|u|js|j|s}!{~n}
Hello {name|h|u|js|j|uc}!{~n}
Hello {name|h|u|js|uc|s}!{~n}
Hello {name|h|u|js|uc|j}!{~n}
Hello {name|h|uc|s|j|u}!{~n}
Hello {name|h|uc|s|j|js}!{~n}
Hello {name|h|uc|s|u|j}!{~n}
Hello {name|h|uc|s|u|js}!{~n}
Hello {name|h|uc|s|js|j}!{~n}
Hello {name|h|uc|s|js|u}!{~n}
Hello {name|h|uc|j|s|u}!{~n}
Hello {name|h|uc|j|s|js}!{~n}
Hello {name|h|uc|j|u|s}!{~n}
Hello {name|h|uc|j|u|js}!{~n}
Hello {name|h|uc|j|js|s}!{~n}
Hello {name|h|uc|j|js|u}!{~n}
Hello {name|h|uc|u|s|j}!{~n}
Hello {name|h|uc|u|s|js}!{~n}
Hello {name|h|uc|u|j|s}!{~n}
Hello {name|h|uc|u|j|js}!{~n}
Hello {name|h|uc|u|js|s}!{~n}
Hello {name|h|uc|u|js|j}!{~n}
Hello {name|h|uc|js|s|j}!{~n}
Hello {name|h|uc|js|s|u}!{~n}
Hello {name|h|uc|js|j|s}!{~n}
Hello {name|h|uc|js|j|u}!{~n}
Hello {name|h|uc|js|u|s}!{~n}
Hello {name|h|uc|js|u|j}!{~n}
Hello {name|h|js|s|j|u}!{~n}
Hello {name|h|js|s|j|uc}!{~n}
Hello {name|h|js|s|u|j}!{~n}
Hello {name|h|js|s|u|uc}!{~n}
Hello {name|h|js|s|uc|j}!{~n}
Hello {name|h|js|s|uc|u}!{~n}
Hello {name|h|js|j|s|u}!{~n}
Hello {name|h|js|j|s|uc}!{~n}
Hello {name|h|js|j|u|s}!{~n}
Hello {name|h|js|j|u|uc}!{~n}
Hello {name|h|js|j|uc|s}!{~n}
Hello {name|h|js|j|uc|u}!{~n}
Hello {name|h|js|u|s|j}!{~n}
Hello {name|h|js|u|s|uc}!{~n}
Hello {name|h|js|u|j|s}!{~n}
Hello {name|h|js|u|j|uc}!{~n}
Hello {name|h|js|u|uc|s}!{~n}
Hello {name|h|js|u|uc|j}!{~n}
Hello {name|h|js|uc|s|j}!{~n}
Hello {name|h|js|uc|s|u}!{~n}
Hello {name|h|js|uc|j|s}!{~n}
Hello {name|h|js|uc|j|u}!{~n}
Hello {name|h|js|uc|u|s}!{~n}
Hello {name|h|js|uc|u|j}!{~n}
Hello {name|j|s|h|u|uc}!{~n}
Hello {name|j|s|h|u|js}!{~n}
Hello {name|j|s|h|uc|u}!{~n}
Hello {name|j|s|h|uc|js}!{~n}
Hello {name|j|s|h|js|u}!{~n}
Hello {name|j|s|h|js|uc}!{~n}
Hello {name|j|s|u|h|uc}!{~n}
Hello {name|j|s|u|h|js}!{~n}
Hello {name|j|s|u|uc|h}!{~n}
Hello {name|j|s|u|uc|js}!{~n}
Hello {name|j|s|u|js|h}!{~n}
Hello {name|j|s|u|js|uc}!{~n}
Hello {name|j|s|uc|h|u}!{~n}
Hello {name|j|s|uc|h|js}!{~n}
Hello {name|j|s|uc|u|h}!{~n}
Hello {name|j|s|uc|u|js}!{~n}
Hello {name|j|s|uc|js|h}!{~n}
Hello {name|j|s|uc|js|u}!{~n}
Hello {name|j|s|js|h|u}!{~n}
Hello {name|j|s|js|h|uc}!{~n}
Hello {name|j|s|js|u|h}!{~n}
Hello {name|j|s|js|u|uc}!{~n}
Hello {name|j|s|js|uc|h}!{~n}
Hello {name|j|s|js|uc|u}!{~n}
Hello {name|j|h|s|u|uc}!{~n}
Hello {name|j|h|s|u|js}!{~n}
Hello {name|j|h|s|uc|u}!{~n}
Hello {name|j|h|s|uc|js}!{~n}
Hello {name|j|h|s|js|u}!{~n}
Hello {name|j|h|s|js|uc}!{~n}
Hello {name|j|h|u|s|uc}!{~n}
Hello {name|j|h|u|s|js}!{~n}
Hello {name|j|h|u|uc|s}!{~n}
Hello {name|j|h|u|uc|js}!{~n}
Hello {name|j|h|u|js|s}!{~n}
Hello {name|j|h|u|js|uc}!{~n}
Hello {name|j|h|uc|s|u}!{~n}
Hello {name|j|h|uc|s|js}!{~n}
Hello {name|j|h|uc|u|s}!{~n}
Hello {name|j|h|uc|u|js}!{~n}
Hello {name|j|h|uc|js|s}!{~n}
Hello {name|j|h|uc|js|u}!{~n}
Hello {name|j|h|js|s|u}!{~n}
Hello {name|j|h|js|s|uc}!{~n}
Hello {name|j|h|js|u|s}!{~n}
Hello {name|j|h|js|u|uc}!{~n}
Hello {name|j|h|js|uc|s}!{~n}
Hello {name|j|h|js|uc|u}!{~n}
Hello {name|j|u|s|h|uc}!{~n}
Hello {name|j|u|s|h|js}!{~n}
Hello {name|j|u|s|uc|h}!{~n}
Hello {name|j|u|s|uc|js}!{~n}
Hello {name|j|u|s|js|h}!{~n}
Hello {name|j|u|s|js|uc}!{~n}
Hello {name|j|u|h|s|uc}!{~n}
Hello {name|j|u|h|s|js}!{~n}
Hello {name|j|u|h|uc|s}!{~n}
Hello {name|j|u|h|uc|js}!{~n}
Hello {name|j|u|h|js|s}!{~n}
Hello {name|j|u|h|js|uc}!{~n}
Hello {name|j|u|uc|s|h}!{~n}
Hello {name|j|u|uc|s|js}!{~n}
Hello {name|j|u|uc|h|s}!{~n}
Hello {name|j|u|uc|h|js}!{~n}
Hello {name|j|u|uc|js|s}!{~n}
Hello {name|j|u|uc|js|h}!{~n}
Hello {name|j|u|js|s|h}!{~n}
Hello {name|j|u|js|s|uc}!{~n}
Hello {name|j|u|js|h|s}!{~n}
Hello {name|j|u|js|h|uc}!{~n}
Hello {name|j|u|js|uc|s}!{~n}
Hello {name|j|u|js|uc|h}!{~n}
Hello {name|j|uc|s|h|u}!{~n}
Hello {name|j|uc|s|h|js}!{~n}
Hello {name|j|uc|s|u|h}!{~n}
Hello {name|j|uc|s|u|js}!{~n}
Hello {name|j|uc|s|js|h}!{~n}
Hello {name|j|uc|s|js|u}!{~n}
Hello {name|j|uc|h|s|u}!{~n}
Hello {name|j|uc|h|s|js}!{~n}
Hello {name|j|uc|h|u|s}!{~n}
Hello {name|j|uc|h|u|js}!{~n}
Hello {name|j|uc|h|js|s}!{~n}
Hello {name|j|uc|h|js|u}!{~n}
Hello {name|j|uc|u|s|h}!{~n}
Hello {name|j|uc|u|s|js}!{~n}
Hello {name|j|uc|u|h|s}!{~n}
Hello {name|j|uc|u|h|js}!{~n}
Hello {name|j|uc|u|js|s}!{~n}
Hello {name|j|uc|u|js|h}!{~n}
Hello {name|j|uc|js|s|h}!{~n}
Hello {name|j|uc|js|s|u}!{~n}
Hello {name|j|uc|js|h|s}!{~n}
Hello {name|j|uc|js|h|u}!{~n}
Hello {name|j|uc|js|u|s}!{~n}
Hello {name|j|uc|js|u|h}!{~n}
Hello {name|j|js|s|h|u}!{~n}
Hello {name|j|js|s|h|uc}!{~n}
Hello {name|j|js|s|u|h}!{~n}
Hello {name|j|js|s|u|uc}!{~n}
Hello {name|j|js|s|uc|h}!{~n}
Hello {name|j|js|s|uc|u}!{~n}
Hello {name|j|js|h|s|u}!{~n}
Hello {name|j|js|h|s|uc}!{~n}
Hello {name|j|js|h|u|s}!{~n}
Hello {name|j|js|h|u|uc}!{~n}
Hello {name|j|js|h|uc|s}!{~n}
Hello {name|j|js|h|uc|u}!{~n}
Hello {name|j|js|u|s|h}!{~n}
Hello {name|j|js|u|s|uc}!{~n}
Hello {name|j|js|u|h|s}!{~n}
Hello {name|j|js|u|h|uc}!{~n}
Hello {name|j|js|u|uc|s}!{~n}
Hello {name|j|js|u|uc|h}!{~n}
Hello {name|j|js|uc|s|h}!{~n}
Hello {name|j|js|uc|s|u}!{~n}
Hello {name|j|js|uc|h|s}!{~n}
Hello {name|j|js|uc|h|u}!{~n}
Hello {name|j|js|uc|u|s}!{~n}
Hello {name|j|js|uc|u|h}!{~n}
Hello {name|u|s|h|j|uc}!{~n}
Hello {name|u|s|h|j|js}!{~n}
Hello {name|u|s|h|uc|j}!{~n}
Hello {name|u|s|h|uc|js}!{~n}
Hello {name|u|s|h|js|j}!{~n}
Hello {name|u|s|h|js|uc}!{~n}
Hello {name|u|s|j|h|uc}!{~n}
Hello {name|u|s|j|h|js}!{~n}
Hello {name|u|s|j|uc|h}!{~n}
Hello {name|u|s|j|uc|js}!{~n}
Hello {name|u|s|j|js|h}!{~n}
Hello {name|u|s|j|js|uc}!{~n}
Hello {name|u|s|uc|h|j}!{~n}
Hello {name|u|s|uc|h|js}!{~n}
Hello {name|u|s|uc|j|h}!{~n}
Hello {name|u|s|uc|j|js}!{~n}
Hello {name|u|s|uc|js|h}!{~n}
Hello {name|u|s|uc|js|j}!{~n}
Hello {name|u|s|js|h|j}!{~n}
Hello {name|u|s|js|h|uc}!{~n}
Hello {name|u|s|js|j|h}!{~n}
Hello {name|u|s|js|j|uc}!{~n}
Hello {name|u|s|js|uc|h}!{~n}
Hello {name|u|s|js|uc|j}!{~n}
Hello {name|u|h|s|j|uc}!{~n}
Hello {name|u|h|s|j|js}!{~n}
Hello {name|u|h|s|uc|j}!{~n}
Hello {name|u|h|s|uc|js}!{~n}
Hello {name|u|h|s|js|j}!{~n}
Hello {name|u|h|s|js|uc}!{~n}
Hello {name|u|h|j|s|uc}!{~n}
Hello {name|u|h|j|s|js}!{~n}
Hello {name|u|h|j|uc|s}!{~n}
Hello {name|u|h|j|uc|js}!{~n}
Hello {name|u|h|j|js|s}!{~n}
Hello {name|u|h|j|js|uc}!{~n}
Hello {name|u|h|uc|s|j}!{~n}
Hello {name|u|h|uc|s|js}!{~n}
Hello {name|u|h|uc|j|s}!{~n}
Hello {name|u|h|uc|j|js}!{~n}
Hello {name|u|h|uc|js|s}!{~n}
Hello {name|u|h|uc|js|j}!{~n}
Hello {name|u|h|js|s|j}!{~n}
Hello {name|u|h|js|s|uc}!{~n}
Hello {name|u|h|js|j|s}!{~n}
Hello {name|u|h|js|j|uc}!{~n}
Hello {name|u|h|js|uc|s}!{~n}
Hello {name|u|h|js|uc|j}!{~n}
Hello {name|u|j|s|h|uc}!{~n}
Hello {name|u|j|s|h|js}!{~n}
Hello {name|u|j|s|uc|h}!{~n}
Hello {name|u|j|s|uc|js}!{~n}
Hello {name|u|j|s|js|h}!{~n}
Hello {name|u|j|s|js|uc}!{~n}
Hello {name|u|j|h|s|uc}!{~n}
Hello {name|u|j|h|s|js}!{~n}
Hello {name|u|j|h|uc|s}!{~n}
Hello {name|u|j|h|uc|js}!{~n}
Hello {name|u|j|h|js|s}!{~n}
Hello {name|u|j|h|js|uc}!{~n}
Hello {name|u|j|uc|s|h}!{~n}
Hello {name|u|j|uc|s|js}!{~n}
Hello {name|u|j|uc|h|s}!{~n}
Hello {name|u|j|uc|h|js}!{~n}
Hello {name|u|j|uc|js|s}!{~n}
Hello {name|u|j|uc|js|h}!{~n}
Hello {name|u|j|js|s|h}!{~n}
Hello {name|u|j|js|s|uc}!{~n}
Hello {name|u|j|js|h|s}!{~n}
Hello {name|u|j|js|h|uc}!{~n}
Hello {name|u|j|js|uc|s}!{~n}
Hello {name|u|j|js|uc|h}!{~n}
Hello {name|u|uc|s|h|j}!{~n}
Hello {name|u|uc|s|h|js}!{~n}
Hello {name|u|uc|s|j|h}!{~n}
Hello {name|u|uc|s|j|js}!{~n}
Hello {name|u|uc|s|js|h}!{~n}
Hello {name|u|uc|s|js|j}!{~n}
Hello {name|u|uc|h|s|j}!{~n}
Hello {name|u|uc|h|s|js}!{~n}
Hello {name|u|uc|h|j|s}!{~n}
Hello {name|u|uc|h|j|js}!{~n}
Hello {name|u|uc|h|js|s}!{~n}
Hello {name|u|uc|h|js|j}!{~n}
Hello {name|u|uc|j|s|h}!{~n}
Hello {name|u|uc|j|s|js}!{~n}
Hello {name|u|uc|j|h|s}!{~n}
Hello {name|u|uc|j|h|js}!{~n}
Hello {name|u|uc|j|js|s}!{~n}
Hello {name|u|uc|j|js|h}!{~n}
Hello {name|u|uc|js|s|h}!{~n}
Hello {name|u|uc|js|s|j}!{~n}
Hello {name|u|uc|js|h|s}!{~n}
Hello {name|u|uc|js|h|j}!{~n}
Hello {name|u|uc|js|j|s}!{~n}
Hello {name|u|uc|js|j|h}!{~n}
Hello {name|u|js|s|h|j}!{~n}
Hello {name|u|js|s|h|uc}!{~n}
Hello {name|u|js|s|j|h}!{~n}
Hello {name|u|js|s|j|uc}!{~n}
Hello {name|u|js|s|uc|h}!{~n}
Hello {name|u|js|s|uc|j}!{~n}
Hello {name|u|js|h|s|j}!{~n}
Hello {name|u|js|h|s|uc}!{~n}
Hello {name|u|js|h|j|s}!{~n}
Hello {name|u|js|h|j|uc}!{~n}
Hello {name|u|js|h|uc|s}!{~n}
Hello {name|u|js|h|uc|j}!{~n}
Hello {name|u|js|j|s|h}!{~n}
Hello {name|u|js|j|s|uc}!{~n}
Hello {name|u|js|j|h|s}!{~n}
Hello {name|u|js|j|h|uc}!{~n}
Hello {name|u|js|j|uc|s}!{~n}
Hello {name|u|js|j|uc|h}!{~n}
Hello {name|u|js|uc|s|h}!{~n}
Hello {name|u|js|uc|s|j}!{~n}
Hello {name|u|js|uc|h|s}!{~n}
Hello {name|u|js|uc|h|j}!{~n}
Hello {name|u|js|uc|j|s}!{~n}
Hello {name|u|js|uc|j|h}!{~n}
Hello {name|uc|s|h|j|u}!{~n}
Hello {name|uc|s|h|j|js}!{~n}
Hello {name|uc|s|h|u|j}!{~n}
Hello {name|uc|s|h|u|js}!{~n}
Hello {name|uc|s|h|js|j}!{~n}
Hello {name|uc|s|h|js|u}!{~n}
Hello {name|uc|s|j|h|u}!{~n}
Hello {name|uc|s|j|h|js}!{~n}
Hello {name|uc|s|j|u|h}!{~n}
Hello {name|uc|s|j|u|js}!{~n}
Hello {name|uc|s|j|js|h}!{~n}
Hello {name|uc|s|j|js|u}!{~n}
Hello {name|uc|s|u|h|j}!{~n}
Hello {name|uc|s|u|h|js}!{~n}
Hello {name|uc|s|u|j|h}!{~n}
Hello {name|uc|s|u|j|js}!{~n}
Hello {name|uc|s|u|js|h}!{~n}
Hello {name|uc|s|u|js|j}!{~n}
Hello {name|uc|s|js|h|j}!{~n}
Hello {name|uc|s|js|h|u}!{~n}
Hello {name|uc|s|js|j|h}!{~n}
Hello {name|uc|s|js|j|u}!{~n}
Hello {name|uc|s|js|u|h}!{~n}
Hello {name|uc|s|js|u|j}!{~n}
Hello {name|uc|h|s|j|u}!{~n}
Hello {name|uc|h|s|j|js}!{~n}
Hello {name|uc|h|s|u|j}!{~n}
Hello {name|uc|h|s|u|js}!{~n}
Hello {name|uc|h|s|js|j}!{~n}
Hello {name|uc|h|s|js|u}!{~n}
Hello {name|uc|h|j|s|u}!{~n}
Hello {name|uc|h|j|s|js}!{~n}
Hello {name|uc|h|j|u|s}!{~n}
Hello {name|uc|h|j|u|js}!{~n}
Hello {name|uc|h|j|js|s}!{~n}
Hello {name|uc|h|j|js|u}!{~n}
Hello {name|uc|h|u|s|j}!{~n}
Hello {name|uc|h|u|s|js}!{~n}
Hello {name|uc|h|u|j|s}!{~n}
Hello {name|uc|h|u|j|js}!{~n}
Hello {name|uc|h|u|js|s}!{~n}
Hello {name|uc|h|u|js|j}!{~n}
Hello {name|uc|h|js|s|j}!{~n}
Hello {name|uc|h|js|s|u}!{~n}
Hello {name|uc|h|js|j|s}!{~n}
Hello {name|uc|h|js|j|u}!{~n}
Hello {name|uc|h|js|u|s}!{~n}
Hello {name|uc|h|js|u|j}!{~n}
Hello {name|uc|j|s|h|u}!{~n}
Hello {name|uc|j|s|h|js}!{~n}
Hello {name|uc|j|s|u|h}!{~n}
Hello {name|uc|j|s|u|js}!{~n}
Hello {name|uc|j|s|js|h}!{~n}
Hello {name|uc|j|s|js|u}!{~n}
Hello {name|uc|j|h|s|u}!{~n}
Hello {name|uc|j|h|s|js}!{~n}
Hello {name|uc|j|h|u|s}!{~n}
Hello {name|uc|j|h|u|js}!{~n}
Hello {name|uc|j|h|js|s}!{~n}
Hello {name|uc|j|h|js|u}!{~n}
Hello {name|uc|j|u|s|h}!{~n}
Hello {name|uc|j|u|s|js}!{~n}
Hello {name|uc|j|u|h|s}!{~n}
Hello {name|uc|j|u|h|js}!{~n}
Hello {name|uc|j|u|js|s}!{~n}
Hello {name|uc|j|u|js|h}!{~n}
Hello {name|uc|j|js|s|h}!{~n}
Hello {name|uc|j|js|s|u}!{~n}
Hello {name|uc|j|js|h|s}!{~n}
Hello {name|uc|j|js|h|u}!{~n}
Hello {name|uc|j|js|u|s}!{~n}
Hello {name|uc|j|js|u|h}!{~n}
Hello {name|uc|u|s|h|j}!{~n}
Hello {name|uc|u|s|h|js}!{~n}
Hello {name|uc|u|s|j|h}!{~n}
Hello {name|uc|u|s|j|js}!{~n}
Hello {name|uc|u|s|js|h}!{~n}
Hello {name|uc|u|s|js|j}!{~n}
Hello {name|uc|u|h|s|j}!{~n}
Hello {name|uc|u|h|s|js}!{~n}
Hello {name|uc|u|h|j|s}!{~n}
Hello {name|uc|u|h|j|js}!{~n}
Hello {name|uc|u|h|js|s}!{~n}
Hello {name|uc|u|h|js|j}!{~n}
Hello {name|uc|u|j|s|h}!{~n}
Hello {name|uc|u|j|s|js}!{~n}
Hello {name|uc|u|j|h|s}!{~n}
Hello {name|uc|u|j|h|js}!{~n}
Hello {name|uc|u|j|js|s}!{~n}
Hello {name|uc|u|j|js|h}!{~n}
Hello {name|uc|u|js|s|h}!{~n}
Hello {name|uc|u|js|s|j}!{~n}
Hello {name|uc|u|js|h|s}!{~n}
Hello {name|uc|u|js|h|j}!{~n}
Hello {name|uc|u|js|j|s}!{~n}
Hello {name|uc|u|js|j|h}!{~n}
Hello {name|uc|js|s|h|j}!{~n}
Hello {name|uc|js|s|h|u}!{~n}
Hello {name|uc|js|s|j|h}!{~n}
Hello {name|uc|js|s|j|u}!{~n}
Hello {name|uc|js|s|u|h}!{~n}
Hello {name|uc|js|s|u|j}!{~n}
Hello {name|uc|js|h|s|j}!{~n}
Hello {name|uc|js|h|s|u}!{~n}
Hello {name|uc|js|h|j|s}!{~n}
Hello {name|uc|js|h|j|u}!{~n}
Hello {name|uc|js|h|u|s}!{~n}
Hello {name|uc|js|h|u|j}!{~n}
Hello {name|uc|js|j|s|h}!{~n}
Hello {name|uc|js|j|s|u}!{~n}
Hello {name|uc|js|j|h|s}!{~n}
Hello {name|uc|js|j|h|u}!{~n}
Hello {name|uc|js|j|u|s}!{~n}
Hello {name|uc|js|j|u|h}!{~n}
Hello {name|uc|js|u|s|h}!{~n}
Hello {name|uc|js|u|s|j}!{~n}
Hello {name|uc|js|u|h|s}!{~n}
Hello {name|uc|js|u|h|j}!{~n}
Hello {name|uc|js|u|j|s}!{~n}
Hello {name|uc|js|u|j|h}!{~n}
Hello {name|js|s|h|j|u}!{~n}
Hello {name|js|s|h|j|uc}!{~n}
Hello {name|js|s|h|u|j}!{~n}
Hello {name|js|s|h|u|uc}!{~n}
Hello {name|js|s|h|uc|j}!{~n}
Hello {name|js|s|h|uc|u}!{~n}
Hello {name|js|s|j|h|u}!{~n}
Hello {name|js|s|j|h|uc}!{~n}
Hello {name|js|s|j|u|h}!{~n}
Hello {name|js|s|j|u|uc}!{~n}
Hello {name|js|s|j|uc|h}!{~n}
Hello {name|js|s|j|uc|u}!{~n}
Hello {name|js|s|u|h|j}!{~n}
Hello {name|js|s|u|h|uc}!{~n}
Hello {name|js|s|u|j|h}!{~n}
Hello {name|js|s|u|j|uc}!{~n}
Hello {name|js|s|u|uc|h}!{~n}
Hello {name|js|s|u|uc|j}!{~n}
Hello {name|js|s|uc|h|j}!{~n}
Hello {name|js|s|uc|h|u}!{~n}
Hello {name|js|s|uc|j|h}!{~n}
Hello {name|js|s|uc|j|u}!{~n}
Hello {name|js|s|uc|u|h}!{~n}
Hello {name|js|s|uc|u|j}!{~n}
Hello {name|js|h|s|j|u}!{~n}
Hello {name|js|h|s|j|uc}!{~n}
Hello {name|js|h|s|u|j}!{~n}
Hello {name|js|h|s|u|uc}!{~n}
Hello {name|js|h|s|uc|j}!{~n}
Hello {name|js|h|s|uc|u}!{~n}
Hello {name|js|h|j|s|u}!{~n}
Hello {name|js|h|j|s|uc}!{~n}
Hello {name|js|h|j|u|s}!{~n}
Hello {name|js|h|j|u|uc}!{~n}
Hello {name|js|h|j|uc|s}!{~n}
Hello {name|js|h|j|uc|u}!{~n}
Hello {name|js|h|u|s|j}!{~n}
Hello {name|js|h|u|s|uc}!{~n}
Hello {name|js|h|u|j|s}!{~n}
Hello {name|js|h|u|j|uc}!{~n}
Hello {name|js|h|u|uc|s}!{~n}
Hello {name|js|h|u|uc|j}!{~n}
Hello {name|js|h|uc|s|j}!{~n}
Hello {name|js|h|uc|s|u}!{~n}
Hello {name|js|h|uc|j|s}!{~n}
Hello {name|js|h|uc|j|u}!{~n}
Hello {name|js|h|uc|u|s}!{~n}
Hello {name|js|h|uc|u|j}!{~n}
Hello {name|js|j|s|h|u}!{~n}
Hello {name|js|j|s|h|uc}!{~n}
Hello {name|js|j|s|u|h}!{~n}
Hello {name|js|j|s|u|uc}!{~n}
Hello {name|js|j|s|uc|h}!{~n}
Hello {name|js|j|s|uc|u}!{~n}
Hello {name|js|j|h|s|u}!{~n}
Hello {name|js|j|h|s|uc}!{~n}
Hello {name|js|j|h|u|s}!{~n}
Hello {name|js|j|h|u|uc}!{~n}
Hello {name|js|j|h|uc|s}!{~n}
Hello {name|js|j|h|uc|u}!{~n}
Hello {name|js|j|u|s|h}!{~n}
Hello {name|js|j|u|s|uc}!{~n}
Hello {name|js|j|u|h|s}!{~n}
Hello {name|js|j|u|h|uc}!{~n}
Hello {name|js|j|u|uc|s}!{~n}
Hello {name|js|j|u|uc|h}!{~n}
Hello {name|js|j|uc|s|h}!{~n}
Hello {name|js|j|uc|s|u}!{~n}
Hello {name|js|j|uc|h|s}!{~n}
Hello {name|js|j|uc|h|u}!{~n}
Hello {name|js|j|uc|u|s}!{~n}
Hello {name|js|j|uc|u|h}!{~n}
Hello {name|js|u|s|h|j}!{~n}
Hello {name|js|u|s|h|uc}!{~n}
Hello {name|js|u|s|j|h}!{~n}
Hello {name|js|u|s|j|uc}!{~n}
Hello {name|js|u|s|uc|h}!{~n}
Hello {name|js|u|s|uc|j}!{~n}
Hello {name|js|u|h|s|j}!{~n}
Hello {name|js|u|h|s|uc}!{~n}
Hello {name|js|u|h|j|s}!{~n}
Hello {name|js|u|h|j|uc}!{~n}
Hello {name|js|u|h|uc|s}!{~n}
Hello {name|js|u|h|uc|j}!{~n}
Hello {name|js|u|j|s|h}!{~n}
Hello {name|js|u|j|s|uc}!{~n}
Hello {name|js|u|j|h|s}!{~n}
Hello {name|js|u|j|h|uc}!{~n}
Hello {name|js|u|j|uc|s}!{~n}
Hello {name|js|u|j|uc|h}!{~n}
Hello {name|js|u|uc|s|h}!{~n}
Hello {name|js|u|uc|s|j}!{~n}
Hello {name|js|u|uc|h|s}!{~n}
Hello {name|js|u|uc|h|j}!{~n}
Hello {name|js|u|uc|j|s}!{~n}
Hello {name|js|u|uc|j|h}!{~n}
Hello {name|js|uc|s|h|j}!{~n}
Hello {name|js|uc|s|h|u}!{~n}
Hello {name|js|uc|s|j|h}!{~n}
Hello {name|js|uc|s|j|u}!{~n}
Hello {name|js|uc|s|u|h}!{~n}
Hello {name|js|uc|s|u|j}!{~n}
Hello {name|js|uc|h|s|j}!{~n}
Hello {name|js|uc|h|s|u}!{~n}
Hello {name|js|uc|h|j|s}!{~n}
Hello {name|js|uc|h|j|u}!{~n}
Hello {name|js|uc|h|u|s}!{~n}
Hello {name|js|uc|h|u|j}!{~n}
Hello {name|js|uc|j|s|h}!{~n}
Hello {name|js|uc|j|s|u}!{~n}
Hello {name|js|uc|j|h|s}!{~n}
Hello {name|js|uc|j|h|u}!{~n}
Hello {name|js|uc|j|u|s}!{~n}
Hello {name|js|uc|j|u|h}!{~n}
Hello {name|js|uc|u|s|h}!{~n}
Hello {name|js|uc|u|s|j}!{~n}
Hello {name|js|uc|u|h|s}!{~n}
Hello {name|js|uc|u|h|j}!{~n}
Hello {name|js|uc|u|j|s}!{~n}
Hello {name|js|uc|u|j|h}!{~n}

@ -0,0 +1,5 @@
{
"name": {
"foo": "bar"
}
}

@ -0,0 +1,3 @@
{
"name": "{\"foo\": \"bar\"}"
}

@ -73,11 +73,178 @@ fn read_context_from_stdin() -> serde_json::Value {
serde_json::from_str(&buffer).expect("Failed to parse json")
}
fn html_escape(inp: &str) -> String {
// Adding 10% space from the original to avoid re-allocations by
// leaving room for escaped sequences.
let mut output = String::with_capacity(((inp.len() as f64) * 1.1) as usize);
inp.chars().for_each(|c| match c {
'<' => output.push_str("&lt;"),
'>' => output.push_str("&gt;"),
'"' => output.push_str("&quot;"),
'\'' => output.push_str("&#39;"),
'&' => output.push_str("&amp;"),
_ => output.push(c),
});
output
}
fn javascript_escape(inp: &str) -> String {
// Adding 10% space from the original to avoid re-allocations by
// leaving room for escaped sequences.
let mut output = String::with_capacity(((inp.len() as f64) * 1.1) as usize);
inp.chars().for_each(|c| match c {
'"' => output.push_str(r#"\""#),
'\'' => output.push_str(r#"\'"#),
'\t' => output.push_str(r#"\t"#),
'\x0C' => output.push_str(r#"\f"#),
'\n' => output.push_str(r#"\n"#),
'\r' => output.push_str(r#"\r"#),
'\\' => output.push_str(r#"\\"#),
'/' => output.push_str(r#"\/"#),
_ => output.push(c),
});
output
}
fn get_utf8_hex(inp: char) -> String {
let num_bytes = inp.len_utf8();
let mut byte_buffer = [0; 4]; // UTF-8 supports up to 4 bytes per codepoint
let mut output = String::with_capacity(num_bytes * 2);
inp.encode_utf8(&mut byte_buffer);
for b in &byte_buffer[..num_bytes] {
output.push_str(&format!("{:02X}", b));
}
output
}
fn encode_uri(inp: &str) -> String {
// Adding 10% space from the original to avoid re-allocations by
// leaving room for escaped sequences.
let mut output = String::with_capacity(((inp.len() as f64) * 1.1) as usize);
inp.chars().for_each(|c| match c {
'0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'a' | 'b' | 'c' | 'd' | 'e'
| 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's'
| 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G'
| 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U'
| 'V' | 'W' | 'X' | 'Y' | 'Z' | ';' | ',' | '/' | '?' | ':' | '@' | '&' | '=' | '+'
| '$' | '-' | '_' | '.' | '!' | '~' | '*' | '\'' | '(' | ')' | '#' => output.push(c),
_ => {
output.push('%');
output.push_str(&get_utf8_hex(c));
}
});
output
}
fn encode_uri_component(inp: &str) -> String {
// Adding 10% space from the original to avoid re-allocations by
// leaving room for escaped sequences.
let mut output = String::with_capacity(((inp.len() as f64) * 1.1) as usize);
inp.chars().for_each(|c| match c {
'0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'a' | 'b' | 'c' | 'd' | 'e'
| 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's'
| 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G'
| 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U'
| 'V' | 'W' | 'X' | 'Y' | 'Z' | '-' | '_' | '.' | '!' | '~' | '*' | '\'' | '(' | ')' => {
output.push(c)
}
_ => {
output.push('%');
output.push_str(&get_utf8_hex(c));
}
});
output
}
fn apply_filter(
json_value: &serde_json::Value,
filter: &Filter,
) -> Result<serde_json::Value, RenderError> {
match (json_value, filter) {
// Html escape filter
(serde_json::Value::String(string), Filter::HtmlEncode) => {
Ok(serde_json::Value::String(html_escape(string)))
}
(_, Filter::HtmlEncode) => Ok(serde_json::Value::String(html_escape(
&json_value.render(&Vec::new())?,
))),
// Disable html escape filter
(_, Filter::DisableHtmlEncode) => panic!("The |s filter is automatically removed by the renderer since it is a no-op during rendering."),
// Parse JSON filter
(serde_json::Value::String(string), Filter::JsonParse) => {
serde_json::from_str(&string).or(Err(RenderError::InvalidJson(string.to_owned())))
}
(_, Filter::JsonParse) => {
let rendered_value = json_value.render(&Vec::new())?;
serde_json::from_str(&rendered_value).or(Err(RenderError::InvalidJson(rendered_value)))
}
// Json Stringify filter
(_, Filter::JsonStringify) => {
Ok(serde_json::Value::String(json_value.to_string()))
}
// Javascript escape filter
(serde_json::Value::String(string), Filter::JavascriptStringEncode) => {
Ok(serde_json::Value::String(javascript_escape(string)))
}
(serde_json::Value::Bool(boolean), Filter::JavascriptStringEncode) => {
Ok(serde_json::Value::Bool(*boolean))
}
(serde_json::Value::Number(number), Filter::JavascriptStringEncode) => {
Ok(serde_json::Value::Number(number.clone()))
}
(serde_json::Value::Array(arr), Filter::JavascriptStringEncode) => {
Ok(serde_json::Value::Array(arr.clone()))
}
(serde_json::Value::Object(obj), Filter::JavascriptStringEncode) => {
Ok(serde_json::Value::Object(obj.clone()))
}
(_, Filter::JavascriptStringEncode) => Ok(serde_json::Value::String(javascript_escape(
&json_value.render(&Vec::new())?,
))),
// EncodeURI filter
(serde_json::Value::String(string), Filter::EncodeUri) => {
Ok(serde_json::Value::String(encode_uri(string)))
}
(_, Filter::EncodeUri) => Ok(serde_json::Value::String(encode_uri(
&json_value.render(&Vec::new())?,
))),
// EncodeURIComponent filter
(serde_json::Value::String(string), Filter::EncodeUriComponent) => {
Ok(serde_json::Value::String(encode_uri_component(string)))
}
(_, Filter::EncodeUriComponent) => Ok(serde_json::Value::String(encode_uri_component(
&json_value.render(&Vec::new())?,
))),
}
}
fn apply_filters(
json_value: &serde_json::Value,
filters: &[Filter],
) -> Result<serde_json::Value, RenderError> {
let mut final_value: serde_json::Value = apply_filter(json_value, &filters[0])?;
for filter in &filters[1..] {
final_value = apply_filter(&final_value, filter)?;
}
Ok(final_value)
}
impl ContextElement for serde_json::Value {}
impl Renderable for serde_json::Value {
fn render(&self, _filters: &Vec<Filter>) -> Result<String, RenderError> {
match self {
let after_apply = if _filters.is_empty() {
None
} else {
Some(apply_filters(self, _filters)?)
};
match after_apply.as_ref().unwrap_or(self) {
serde_json::Value::Null => Ok("".to_owned()),
serde_json::Value::Bool(boolean) => Ok(boolean.to_string()),
serde_json::Value::Number(num) => Ok(num.to_string()),
@ -395,4 +562,9 @@ mod tests {
Ok::<_, RenderError>("3,5,7,9".to_owned())
);
}
#[test]
fn test_html_escape() {
assert_eq!(html_escape("<>&\"'"), "&lt;&gt;&amp;&quot;&#39;".to_owned())
}
}

@ -8,6 +8,7 @@ use std::fmt;
pub enum RenderError {
Generic(String),
TemplateNotFound(String),
InvalidJson(String),
}
#[derive(PartialEq)]
@ -27,6 +28,11 @@ impl fmt::Display for RenderError {
RenderError::TemplateNotFound(name) => {
write!(f, "No template named {} in context", name)
}
RenderError::InvalidJson(invalid_json) => write!(
f,
"Attempted to parse the following invalid JSON: {}",
invalid_json
),
}
}
}
@ -38,6 +44,11 @@ impl fmt::Debug for RenderError {
RenderError::TemplateNotFound(name) => {
write!(f, "No template named {} in context", name)
}
RenderError::InvalidJson(invalid_json) => write!(
f,
"Attempted to parse the following invalid JSON: {}",
invalid_json
),
}
}
}

@ -6,7 +6,7 @@ use crate::parser::PartialNameElement;
use crate::parser::RValue;
use crate::parser::Special;
use crate::parser::Template;
use crate::parser::TemplateElement;
use crate::parser::{Filter, TemplateElement};
use crate::renderer::context_element::ContextElement;
use crate::renderer::errors::CompileError;
use crate::renderer::errors::RenderError;
@ -15,7 +15,7 @@ use crate::renderer::inline_partial_tree::extract_inline_partials;
use crate::renderer::inline_partial_tree::InlinePartialTreeElement;
use crate::renderer::parameters_context::ParametersContext;
use crate::renderer::walking::walk_path;
use std::{cmp::Ordering, collections::HashMap};
use std::collections::HashMap;
#[derive(Clone, Debug)]
pub struct CompiledTemplate<'a> {
@ -153,7 +153,7 @@ impl<'a> DustRenderer<'a> {
if loop_elements.is_empty() {
return Ok("".to_owned());
} else {
return final_val.render(&reference.filters);
return final_val.render(&Self::preprocess_filters(&reference.filters));
}
}
}
@ -500,6 +500,21 @@ impl<'a> DustRenderer<'a> {
},
}
}
fn preprocess_filters(filters: &Vec<Filter>) -> Vec<Filter> {
let mut final_filters: Vec<Filter> = filters
.into_iter()
.filter(|f| f != &&Filter::DisableHtmlEncode)
.map(|f| f.clone())
.collect();
// If the user has not specified any escaping filter (|s or
// |h), automatically add an html escape filter
if !filters.iter().any(|f| f == &Filter::DisableHtmlEncode) {
final_filters.push(Filter::HtmlEncode);
}
final_filters
}
}
#[cfg(test)]
@ -510,6 +525,7 @@ mod tests {
use crate::renderer::context_element::Renderable;
use crate::renderer::context_element::Walkable;
use crate::renderer::CompareContextElement;
use std::cmp::Ordering;
impl ContextElement for String {}

Loading…
Cancel
Save