diff --git a/js/test_cases/filters/README.md b/js/test_cases/filters/README.md new file mode 100644 index 0000000..d7bdc6e --- /dev/null +++ b/js/test_cases/filters/README.md @@ -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) diff --git a/js/test_cases/filters/input1.json b/js/test_cases/filters/input1.json new file mode 100644 index 0000000..3c23767 --- /dev/null +++ b/js/test_cases/filters/input1.json @@ -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\\!@#$%^&*()[]{}<>,./?:;_-+=`" +} diff --git a/js/test_cases/filters/main.dust b/js/test_cases/filters/main.dust new file mode 100644 index 0000000..202d4a2 --- /dev/null +++ b/js/test_cases/filters/main.dust @@ -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} diff --git a/js/test_cases/generated_filters/array.json b/js/test_cases/generated_filters/array.json new file mode 100644 index 0000000..21ac75d --- /dev/null +++ b/js/test_cases/generated_filters/array.json @@ -0,0 +1,6 @@ +{ + "name": [ + "foo", + "bar" + ] +} diff --git a/js/test_cases/generated_filters/boolean.json b/js/test_cases/generated_filters/boolean.json new file mode 100644 index 0000000..925ccd9 --- /dev/null +++ b/js/test_cases/generated_filters/boolean.json @@ -0,0 +1,3 @@ +{ + "name": true +} diff --git a/js/test_cases/generated_filters/float.json b/js/test_cases/generated_filters/float.json new file mode 100644 index 0000000..e84feaa --- /dev/null +++ b/js/test_cases/generated_filters/float.json @@ -0,0 +1,3 @@ +{ + "name": 7.4 +} diff --git a/js/test_cases/generated_filters/integer.json b/js/test_cases/generated_filters/integer.json new file mode 100644 index 0000000..4c5ec73 --- /dev/null +++ b/js/test_cases/generated_filters/integer.json @@ -0,0 +1,3 @@ +{ + "name": 4 +} diff --git a/js/test_cases/generated_filters/main.dust b/js/test_cases/generated_filters/main.dust new file mode 100644 index 0000000..c057b22 --- /dev/null +++ b/js/test_cases/generated_filters/main.dust @@ -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} diff --git a/js/test_cases/generated_filters/null.json b/js/test_cases/generated_filters/null.json new file mode 100644 index 0000000..298db8f --- /dev/null +++ b/js/test_cases/generated_filters/null.json @@ -0,0 +1,3 @@ +{ + "name": null +} diff --git a/js/test_cases/generated_filters/object.json b/js/test_cases/generated_filters/object.json new file mode 100644 index 0000000..7a016fe --- /dev/null +++ b/js/test_cases/generated_filters/object.json @@ -0,0 +1,5 @@ +{ + "name": { + "foo": "bar" + } +} diff --git a/js/test_cases/generated_filters/string.json b/js/test_cases/generated_filters/string.json new file mode 100644 index 0000000..6b66c0f --- /dev/null +++ b/js/test_cases/generated_filters/string.json @@ -0,0 +1,3 @@ +{ + "name": "{\"foo\": \"bar\"}" +} diff --git a/js/test_cases/generated_filters_two/README.md b/js/test_cases/generated_filters_two/README.md new file mode 100644 index 0000000..c32a73e --- /dev/null +++ b/js/test_cases/generated_filters_two/README.md @@ -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). diff --git a/js/test_cases/generated_filters_two/array.json b/js/test_cases/generated_filters_two/array.json new file mode 100644 index 0000000..21ac75d --- /dev/null +++ b/js/test_cases/generated_filters_two/array.json @@ -0,0 +1,6 @@ +{ + "name": [ + "foo", + "bar" + ] +} diff --git a/js/test_cases/generated_filters_two/boolean.json b/js/test_cases/generated_filters_two/boolean.json new file mode 100644 index 0000000..925ccd9 --- /dev/null +++ b/js/test_cases/generated_filters_two/boolean.json @@ -0,0 +1,3 @@ +{ + "name": true +} diff --git a/js/test_cases/generated_filters_two/float.json b/js/test_cases/generated_filters_two/float.json new file mode 100644 index 0000000..e84feaa --- /dev/null +++ b/js/test_cases/generated_filters_two/float.json @@ -0,0 +1,3 @@ +{ + "name": 7.4 +} diff --git a/js/test_cases/generated_filters_two/integer.json b/js/test_cases/generated_filters_two/integer.json new file mode 100644 index 0000000..4c5ec73 --- /dev/null +++ b/js/test_cases/generated_filters_two/integer.json @@ -0,0 +1,3 @@ +{ + "name": 4 +} diff --git a/js/test_cases/generated_filters_two/main.dust b/js/test_cases/generated_filters_two/main.dust new file mode 100644 index 0000000..b3a9f1c --- /dev/null +++ b/js/test_cases/generated_filters_two/main.dust @@ -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} diff --git a/js/test_cases/generated_filters_two/null.json b/js/test_cases/generated_filters_two/null.json new file mode 100644 index 0000000..298db8f --- /dev/null +++ b/js/test_cases/generated_filters_two/null.json @@ -0,0 +1,3 @@ +{ + "name": null +} diff --git a/js/test_cases/generated_filters_two/object.json b/js/test_cases/generated_filters_two/object.json new file mode 100644 index 0000000..7a016fe --- /dev/null +++ b/js/test_cases/generated_filters_two/object.json @@ -0,0 +1,5 @@ +{ + "name": { + "foo": "bar" + } +} diff --git a/js/test_cases/generated_filters_two/string.json b/js/test_cases/generated_filters_two/string.json new file mode 100644 index 0000000..6b66c0f --- /dev/null +++ b/js/test_cases/generated_filters_two/string.json @@ -0,0 +1,3 @@ +{ + "name": "{\"foo\": \"bar\"}" +} diff --git a/src/bin.rs b/src/bin.rs index 34f0f02..2b19174 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -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("<"), + '>' => output.push_str(">"), + '"' => output.push_str("""), + '\'' => output.push_str("'"), + '&' => output.push_str("&"), + _ => 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 { + 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 { + 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) -> Result { - 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("<>&\"'"), "<>&"'".to_owned()) + } } diff --git a/src/renderer/errors.rs b/src/renderer/errors.rs index a72ef61..8c458d7 100644 --- a/src/renderer/errors.rs +++ b/src/renderer/errors.rs @@ -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 + ), } } } diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 1546e12..7cf4e99 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -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) -> Vec { + let mut final_filters: Vec = 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 {}