diff --git a/README.md b/README.md index dd897984..6349e85f 100644 --- a/README.md +++ b/README.md @@ -43,17 +43,17 @@ To create a parse tree from input source, do the following: ```java String input = - " \n"; -Template template = Template.parse(input); + " \n"; +Template template = TemplateParser.DEFAULT.parse(input); ParseTree root = template.getParseTree(); ``` @@ -77,7 +77,8 @@ In Ruby, you'd render a template like this: With Liqp, the equivalent looks like this: ```java -Template template = Template.parse("hi {{name}}"); +TemplateParser parser = new TemplateParser.Builder().build(); +Template template = parser.parse("hi {{name}}"); String rendered = template.render("name", "tobi"); System.out.println(rendered); /* @@ -99,8 +100,8 @@ The following examples are equivalent to the previous Liqp example: #### Map example ```java -Template template = Template.parse("hi {{name}}"); -Map map = new HashMap(); +Template template = new TemplateParser.Builder().build().parse("hi {{name}}"); +Map map = new HashMap<>(); map.put("name", "tobi"); String rendered = template.render(map); System.out.println(rendered); @@ -112,7 +113,7 @@ System.out.println(rendered); #### JSON example ```java -Template template = Template.parse("hi {{name}}"); +Template template = new TemplateParser.Builder().build().parse("hi {{name}}"); String rendered = template.render("{\"name\" : \"tobi\"}"); System.out.println(rendered); /* @@ -124,10 +125,10 @@ System.out.println(rendered); ```java class MyParams implements Inspectable { - public String name = "tobi"; + public String name = "tobi"; }; -Template template = Template.parse("hi {{name}}"); -String rendered =template.render(new MyParams()); +Template template = TemplateParser.DEFAULT.parse("hi {{name}}"); +String rendered = template.render(new MyParams()); System.out.println(rendered); /* hi tobi @@ -142,7 +143,7 @@ class MyLazy implements LiquidSupport { return Collections.singletonMap("name", "tobi"); } }; -Template template = Template.parse("hi {{name}}"); +Template template = TemplateParser.DEFAULT.parse("hi {{name}}"); String rendered = template.render(new MyLazy()); System.out.println(rendered); /* @@ -150,43 +151,38 @@ System.out.println(rendered); */ ``` -#### Strict variables example +#### Controlling library behavior +The library has a set of keys to control the parsing/rendering process. Even if you might think that's too many of them, the defaults will work for you in most cases. All of them are set on `TemplateParser.Builder` class. Here they are: +* `withFlavor(Flavor flavor)` - flavor of the liquid language. Flavor is nothing else than a predefined set of other settings. Here are supported flavors: + * `Flavor.JEKYLL` - flavor that defines all settings, so it tries to behave like jekyll's templates + * `Flavor.LIQUID` - the same for liquid's templates + * `Flavor.LIQP` (default) - developer of this library found some default behavior of two flavors above somehow weird in selected cases. So this flavor appears. +* `withStripSingleLine(boolean stripSingleLine)`- if `true` then all blank lines left by outputless tags are removed. Default is `false`. +* `withStripSpaceAroundTags(boolean stripSpacesAroundTags)` - if `true` then all whitespaces around tags are removed. Default is `false`. +* `withObjectMapper(ObjectMapper mapper)` - if provided then this mapper is used for converting json strings to objects and internal object conversion. If not provided, then default mapper is used. Default one is good. Also, the default one is always accessible via TemplateContext instance:`context.getParser().getMapper();` +* `withTag(Tag tag)` - register custom tag to be used in templates. +* `withBlock(Block block)` - register custom block to be used in templates. The difference between tag and block is that block has open and closing tag and can contain other content like a text, tags and blocks. +* `withFilter(Filter filter)` - register custom filter to be used in templates. See below for examples. +* `withEvaluateInOutputTag(boolean evaluateInOutputTag)` - both `Flavor.JEKYLL` and `Flavor.LIQUID` are not allows to evaluate expressions in output tags, simply ignoring the expression and printing out very first token of the expression. Yes, this: `{{ 97 > 96 }}` will print `97`. This is known [bug/feature](https://github.com/Shopify/liquid/issues/1102) of those templators. If you want to change this behavior and evaluate those expressions, set this flag to `true`. Also, the default flavor `Flavor.LIQP` has this flag set to `true` already. +* `withStrictTypedExpressions(boolean strictTypedExpressions)` - ruby is strong-typed language. So comparing different types is not allowed there. This library tries to mimic ruby's type system in a way so all not explicit types (created or manipulated inside of templates) are converted with this schema: `nil` -> `null`; `boolean` -> `boolean`; `string` -> `java.lang.String`; any numbers -> `java.math.BigDecimal`, any datetime -> `java.time.ZonedDateTime`. If you want to change this behavior, and allow comparing in expressions in a less restricted way, set this flag to `true`, then the lax (javascript-like) approach for comparing in expressions will be used. Also, the default flavor `Flavor.LIQP` has this flag set to `true` already, others have it `false` by default. +* `withLiquidStyleInclude(boolean liquidStyleInclude)` - if `true` then include tag will use [syntax from liquid](https://shopify.dev/docs/api/liquid/tags/include), otherwice [jekyll syntax](https://jekyllrb.com/docs/includes/) will be used. Default depends on flavor. `Flavor.LIQUID` and `Flavor.LIQP` has this flag set to `true` already. `Flavor.JEKYLL` has it `false`. +* `withStrictVariables(boolean strictVariables)` - if set to `true` then all variables must be defined before usage, if some variable is not defined, the exception will be thrown. If `false` then all undefined variables will be treated as `null`. Default is `false`. +* `withShowExceptionsFromInclude(boolean showExceptionsFromInclude)` - if set to `true` then all exceptions from included templates will be thrown. If `false` then all exceptions from included templates will be ignored. Default is `true`. +* `withEvaluateMode(TemplateParser.EvaluateMode evaluateMode)` - there exists two rendering modes: `TemplateParser.EvaluateMode.LAZY` and `TemplateParser.EvaluateMode.EAGER`. By default, the `lazy` one is used. This should do the work in most cases. + * In `lazy` mode the template parameters are evaluating on demand and specific properties are read from there only if they are needed. Each filter/tag trying to do its work with its own parameter object, that can be literally anything. + * In `eager` the entire parameter object is converted into plain data tree structure made **only** from maps and lists, so tags/filters do know how to work with these kinds of objects. Special case - temporal objects, they are consumed as is. +* `withRenderTransformer(RenderTransformer renderTransformer)` - even if most of elements (filters/tags/blocks) returns its results most cases as `String`, the task of combining all those strings into a final result is a task of `liqp.RenderTransformer` implementation. The default `liqp.RenderTransformerDefaultImpl` uses `StringBuilder` for that task, so template rendering is fast. Although, you might have special needs or environment to render the results. +* `withLocale(Locale locale)` - locale to be used for rendering. Default is `Locale.ENGLISH`. Used mostly for time rendering. +* `withDefaultTimeZone(ZoneId defaultTimeZone)` - default time zone to be used for rendering. Default is `ZoneId.systemDefault()`. Used mostly for time rendering. +* `withEnvironmentMapConfigurator(Consumer> configurator)` - if provided then this configurator is called before each template rendering. It can be used to set some global variables for all templates built with given `TemplateParser`. +* `withSnippetsFolderName(String snippetsFolderName)` - define folder to be used for searching files by `include` tag. Defaults depend on flavor: `Flavor.LIQUID` and `Flavor.LIQP` has this set to `snippets`; `Flavor.JEKYLL` uses `_includes`. +* `withNameResolver(NameResolver nameResolver)` - if provided then this resolver is used for resolving names of included files. If not provided, then default resolver is used. Default resolver is `liqp.antlr.LocalFSNameResolver` that uses `java.nio.file.Path` for resolving names in local file system. That can be changed to any other resolver, for example, to resolve names in classpath or in remote file system or even build templates dynamically by name. +* `withMaxIterations(int maxIterations)` - maximum number of iterations allowed in a template. Default is `Integer.MAX_VALUE`. Used to prevent infinite loops. Example use: evaluate templates from untrusted sources. +* `withMaxSizeRenderedString(int maxSizeRenderedString)` - maximum size of rendered string. Default is `Integer.MAX_VALUE`. Used to prevent out of memory errors. Example use: evaluate templates from untrusted sources. +* `withMaxRenderTimeMillis(long maxRenderTimeMillis)` - maximum time allowed for template rendering. Default is `Long.MAX_VALUE`. Used to prevent never-ending rendering. Example use: evaluate templates from untrusted sources. +* `withMaxTemplateSizeBytes(long maxTemplateSizeBytes)` - maximum size of template. Default is `Long.MAX_VALUE`. Used to prevent out of memory errors. Example use: evaluate templates from untrusted sources. +* `withErrorMode(ErrorMode errorMode)` - error mode to be used. Default is `ErrorMode.STRICT`. -Strict variables means that value for every key must be provided, otherwise an exception occurs. - -```java -Template template = Template.parse("hi {{name}}") - .withRenderSettings(new RenderSettings.Builder().withStrictVariables(true).build()); -String rendered = template.render(); // no value for "name" -// exception is thrown -``` - -#### Eager and Lazy evaluate mode -There exists two rendering modes: lazy and eager. -* In `lazy` mode the template parameters are evaluating on demand and specific properties are read from there only if they are needed. Each filter/tag trying to do its work with its own parameter object, that can be literally anything. -* In `eager` the entire parameter object is converted into plain data tree structure that are made only from maps and lists, so tags/filters do know how to work with these kinds of objects. Special case - temporal objects, they are consumed as is. - -By default, the `lazy` one is used. This should do the work in most cases. - -Switching mode is possible via providing special `RenderSettings`. -Example usage of `lazy` mode: -```java -RenderSettings renderSettings = new RenderSettings.Builder() - .withEvaluateMode(RenderSettings.EvaluateMode.EAGER) - .build(); - -Map in = Collections.singletonMap("a", new Object() { - public String val = "tobi"; -}); - -String res = Template.parse("hi {{a.val}}") - .withRenderSettings(renderSettings) - .render(in); -System.out.println(res); -/* - hi tobi -*/ -``` ### 2.1 Custom filters @@ -196,20 +192,20 @@ Let's say you want to create a custom filter, called `b`, that changes a string You can do that as follows: ```java -// first register your custom filter -Filter.registerFilter(new Filter("b"){ + // first create template parser with new filter +TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("b") { @Override - public Object apply(Object value, TemplateContext context, Object... params) { - // create a string from the value + public Object apply(TemplateContext context, Object value, Object... params) { + // create a string from the value String text = super.asString(value, context); // replace and return *...* with ... return text.replaceAll("\\*(\\w(.*?\\w)?)\\*", "$1"); } -}); +}).build(); // use your filter -Template template = Template.parse("{{ wiki | b }}"); +Template template = parser.parse("{{ wiki | b }}"); String rendered = template.render("{\"wiki\" : \"Some *bold* text *in here*.\"}"); System.out.println(rendered); /* @@ -219,11 +215,10 @@ System.out.println(rendered); And to use an optional parameter in your filter, do something like this: ```java -// first register your custom filter -Filter.registerFilter(new Filter("repeat"){ +// first create template parser with your filter +TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("repeat"){ @Override - public Object apply(Object value, TemplateContext context, Object... params) { - + public Object apply(TemplateContext context, Object value, Object... params) { // get the text of the value String text = super.asString(value, context); @@ -238,23 +233,23 @@ Filter.registerFilter(new Filter("repeat"){ return builder.toString(); } -}); +}).build(); // use your filter -Template template = Template.parse("{{ 'a' | repeat }}\n{{ 'b' | repeat:5 }}"); +Template template = parser.parse("{{ 'a' | repeat }}\n{{ 'b' | repeat:5 }}"); String rendered = template.render(); System.out.println(rendered); /* - a - bbbbb +a +bbbbb */ ``` You can use an array (or list) as well, and can also return a numerical value: ```java -Filter.registerFilter(new Filter("sum"){ +TemplateParser parser = new TemplateParser.Builder().withFilter((new Filter("sum"){ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Object[] numbers = super.asArray(value, context); @@ -266,25 +261,25 @@ Filter.registerFilter(new Filter("sum"){ return sum; } -}); +})).build(); -Template template = Template.parse("{{ numbers | sum }}"); +Template template = parser.parse("{{ numbers | sum }}"); String rendered = template.render("{\"numbers\" : [1, 2, 3, 4, 5]}"); System.out.println(rendered); /* 15.0 */ ``` -In short, override one of the `apply()` methods of the `Filter` class to create your own custom filter behaviour. +In short, override one of the `apply()` methods of the `Filter` class to create your own custom filter behavior. ### 2.2 Tags and blocks Both blocks and tags are kinds of insertions. Literally: `Block extends Insertion` and `Tag extends Insertion`. Class `Insertion` used as basic abstraction for parser. -Let's define the difference between tags and blocks. +Below is defined the difference between tags and blocks. #### Tags -Tag is simple insertion in the template that will be processed and the result of it will be replaced in output, if any. Example is `include` tag: +Tag is a simple insertion in the template that will be processed and the result of it will be replaced in output, if any. Example is `include` tag: ```liquid See these data: {% include data.liquid %} ``` @@ -296,20 +291,19 @@ Hello {{name}}! It has no input but still is an insertion. #### Blocks -Block is a kind of insertions that wraps some text and/or other blocks or tags and perform some operations on the given input. Blocks have opening and closing tags. Example of block is `if`: +Block is a kind of insertions that wraps some text and/or other blocks or tags and performs some operations on the given input. Blocks have opening and closing tags. Example of block is `if`: ```liquid {% if user %} Hello {{ user.name }} {% endif %}" ``` where `{% if user %}` is opening tag and `{% endif %}` is closing one. The `user` in this sample is just a parameter for given block. #### Custom Tags and Blocks -Let's say you would like to create a block that makes it easy to loop for a fixed amount of times, -executing a block of Liquid code. +Let's say you would like to create a block that makes it easy to loop for a fixed number of times executing a block of Liquid code. Here's a way to create, and use, such a custom `loop` block: ```java -Block.registerBlock(new Block("loop"){ +TemplateParser parser = new TemplateParser.Builder().withBlock(new Block("loop"){ @Override public Object render(TemplateContext context, LNode... nodes) { int n = super.asNumber(nodes[0].render(context)).intValue(); @@ -320,9 +314,9 @@ Block.registerBlock(new Block("loop"){ } return builder.toString(); } -}); +}).build(); -Template template = Template.parse("{% loop 5 %}looping!\n{% endloop %}"); +Template template = parser.parse("{% loop 5 %}looping!\n{% endloop %}"); String rendered = template.render(); System.out.println(rendered); /* @@ -333,94 +327,8 @@ System.out.println(rendered); looping! */ ``` -Note: `Block.registerBlock` is just a fluent shortcut for `Insertion.registerInsertion`. -For registering custom Tags there exists equivalent `Tags.registerTag` function (that also wraps `Insertion.registerInsertion`). - -Note that all of: - * `Insertion.registerInsertion(Insertion)` - * `Block.registerBlock(Block)` - * `Tag.registerTag(Tag)` - * `Filer.registerFilter(Filter)` - -will add tags, blocks and filters per JVM instance. If you want templates to use specific filters, create your `Template` instance as follows: - -```java - - -Template.parse(source, new ParseSettings.Builder() - .with(tag) - .build()); - -Template.parse(source, new ParseSettings.Builder() - .with(block) - .build()); - -Template.parse(source, new ParseSettings.Builder() - .with(filter) - .build()); - -// Or combine them: -Template.parse(source, new ParseSettings.Builder() - .with(filter) - .with(tag) - .build()); -``` - -For example, using the `sum` filter for just 1 template, would look like this: - -```java -Template template = Template.parse("{{ numbers | sum }}", new ParseSettings.Builder() - .with(new Filter("sum"){ - @Override - public Object apply(Object value, TemplateContext context, Object... params) { - - Object[] numbers = super.asArray(value, context); - double sum = 0; - - for(Object obj : numbers) { - sum += super.asNumber(obj).doubleValue(); - } - - return sum; - } - }).build()); - - String rendered = template.render("{\"numbers\" : [1, 2, 3, 4, 5]}"); - System.out.println(rendered); -/* - 15.0 -*/ -``` -Also note that `ParseSettings` object have unmodifiable fields and so can be shared across templates without side effects. - -### 2.3 Guards - -If you're evaluating templates from untrusted sources, there are a couple of -ways you can guard against unwanted input. - -For example, if you'd like the input template to be no larger than 125 characters, -the templating engine should not perform more than 15 iterations in total, -the generated string should not exceed 300 characters and the total rendering (and parsing!) -time should not exceed 100 milliseconds, you could do something like this: - -```java -ProtectionSettings protectionSettings = new ProtectionSettings.Builder() - .withMaxSizeRenderedString(300) - .withMaxIterations(15) - .withMaxRenderTimeMillis(100L) - .withMaxTemplateSizeBytes(125) - .build(); - -String rendered = Template.parse("{% for i in (1..10) %}{{ text }}{% endfor %}") - .withProtectionSettings(protectionSettings) - .render("{\"text\": \"abcdefghijklmnopqrstuvwxyz\"}"); - -System.out.println(rendered); -``` - -Note that not providing a `ProtectionSettings`, is the same as not having any guards in -place (or better, very large limits). +For registering custom Tags there exists equivalent `Builder.withTag` function. ## Build and Release diff --git a/src/main/java/liqp/Examples.java b/src/main/java/liqp/Examples.java index e535525a..b6c46143 100644 --- a/src/main/java/liqp/Examples.java +++ b/src/main/java/liqp/Examples.java @@ -51,7 +51,7 @@ private static void demoCustomStrongFilter() { // first register your custom filter TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("b") { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { // create a string from the value String text = super.asString(value, context); @@ -69,7 +69,7 @@ public Object apply(Object value, TemplateContext context, Object... params) { private static void demoCustomRepeatFilter() { TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("repeat") { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { // check if an optional parameter is provided int times = params.length == 0 ? 1 : super.asNumber(params[0]).intValue(); @@ -96,7 +96,7 @@ public Object apply(Object value, TemplateContext context, Object... params) { private static void demoCustomSumFilter() { TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("sum") { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Object[] numbers = super.asArray(value, context); @@ -117,7 +117,7 @@ public Object apply(Object value, TemplateContext context, Object... params) { private static void customLoopBlock() { - TemplateParser parser = new TemplateParser.Builder().withInsertion(new Block("loop") { + TemplateParser parser = new TemplateParser.Builder().withBlock(new Block("loop") { @Override public Object render(TemplateContext context, LNode... nodes) { @@ -147,7 +147,7 @@ public static void instanceFilter() { TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("sum") { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Object[] numbers = super.asArray(value, context); @@ -181,7 +181,7 @@ public static void demoStrictVariables() { } public static void customRandomTag() { - TemplateParser parser = new TemplateParser.Builder().withInsertion(new Tag("rand") { + TemplateParser parser = new TemplateParser.Builder().withTag(new Tag("rand") { private final Random rand = new Random(); @Override @@ -199,7 +199,7 @@ public static void customFilter() { TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("sum") { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Object[] numbers = super.asArray(value, context); double sum = 0; diff --git a/src/main/java/liqp/PlainBigDecimal.java b/src/main/java/liqp/PlainBigDecimal.java index a833c63c..33c16337 100644 --- a/src/main/java/liqp/PlainBigDecimal.java +++ b/src/main/java/liqp/PlainBigDecimal.java @@ -11,6 +11,9 @@ public final class PlainBigDecimal extends BigDecimal { private static final long serialVersionUID = 1L; + public PlainBigDecimal(BigDecimal val) { + super(val.toPlainString()); + } public PlainBigDecimal(String val) { super(val); } diff --git a/src/main/java/liqp/TemplateParser.java b/src/main/java/liqp/TemplateParser.java index 1177c323..b6d954d5 100644 --- a/src/main/java/liqp/TemplateParser.java +++ b/src/main/java/liqp/TemplateParser.java @@ -5,10 +5,12 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import liqp.antlr.LocalFSNameResolver; import liqp.antlr.NameResolver; +import liqp.blocks.Block; import liqp.filters.Filter; import liqp.filters.Filters; import liqp.parser.Flavor; import liqp.parser.LiquidSupport; +import liqp.tags.Tag; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; @@ -127,7 +129,7 @@ public static class Builder { private Flavor flavor; private boolean stripSpacesAroundTags = false; - private boolean stripSingleLine; + private boolean stripSingleLine = false; private ObjectMapper mapper; private List insertions = new ArrayList<>(); private List filters = new ArrayList<>(); @@ -139,7 +141,7 @@ public static class Builder { private boolean strictVariables = false; - private boolean showExceptionsFromInclude; + private boolean showExceptionsFromInclude = true; private EvaluateMode evaluateMode = EvaluateMode.LAZY; private Locale locale = DEFAULT_LOCALE; private ZoneId defaultTimeZone; @@ -221,8 +223,13 @@ public Builder withObjectMapper(ObjectMapper mapper) { return this; } - public Builder withInsertion(Insertion insertion) { - this.insertions.add(insertion); + public Builder withBlock(Block block) { + this.insertions.add(block); + return this; + } + + public Builder withTag(Tag tag) { + this.insertions.add(tag); return this; } @@ -319,6 +326,11 @@ public Builder withSnippetsFolderName(String snippetsFolderName) { return this; } + public Builder withNameResolver(NameResolver nameResolver) { + this.nameResolver = nameResolver; + return this; + } + public Builder withMaxIterations(int maxIterations) { this.limitMaxIterations = maxIterations; return this; @@ -345,10 +357,6 @@ public Builder withErrorMode(ErrorMode errorMode) { return this; } - public Builder withNameResolver(NameResolver nameResolver) { - this.nameResolver = nameResolver; - return this; - } @SuppressWarnings("hiding") public TemplateParser build() { @@ -409,6 +417,9 @@ public TemplateParser build() { } } + /** + * Private constructor. Use: new TemplateParser.Builder().build() instead. + */ TemplateParser(boolean strictVariables, boolean showExceptionsFromInclude, EvaluateMode evaluateMode, RenderTransformer renderTransformer, Locale locale, ZoneId defaultTimeZone, Consumer> environmentMapConfigurator, ErrorMode errorMode, Flavor flavor, boolean stripSpacesAroundTags, boolean stripSingleLine, @@ -453,21 +464,21 @@ public Template parse(File file) throws IOException { } public Template parse(String input) { - return new Template(this, CharStreams.fromString(input), pwd()); + return new Template(this, CharStreams.fromString(input), Paths.get(".").toAbsolutePath()); } public Template parse(InputStream input) throws IOException { Path location = getLocationFromInputStream(input); - return new Template(this, CharStreams.fromStream(input), Optional.ofNullable(location).orElseGet(TemplateParser::pwd)); + return new Template(this, CharStreams.fromStream(input), Optional.ofNullable(location).orElseGet(() -> Paths.get(".").toAbsolutePath())); } public Template parse(Reader reader) throws IOException { - return new Template(this, CharStreams.fromReader(reader), pwd()); + return new Template(this, CharStreams.fromReader(reader), Paths.get(".").toAbsolutePath()); } public Template parse(CharStream input) { Path location = NameResolver.getLocationFromCharStream(input); - return new Template(this, input, Optional.ofNullable(location).orElseGet(TemplateParser::pwd)); + return new Template(this, input, Optional.ofNullable(location).orElseGet(() -> Paths.get(".").toAbsolutePath())); } @@ -525,11 +536,4 @@ private Path getLocationFromInputStream(InputStream input) { return null; } } - - - public static Path pwd() { - return Paths.get(".").toAbsolutePath(); - } - - } diff --git a/src/main/java/liqp/filters/Abs.java b/src/main/java/liqp/filters/Abs.java index 97bf33e9..4a02c391 100644 --- a/src/main/java/liqp/filters/Abs.java +++ b/src/main/java/liqp/filters/Abs.java @@ -1,6 +1,8 @@ package liqp.filters; import liqp.PlainBigDecimal; +import liqp.TemplateContext; + public class Abs extends Filter { @@ -22,7 +24,7 @@ public class Abs extends Filter { end */ @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (super.isInteger(value) || super.canBeInteger(value)) { return Math.abs(super.asNumber(value).longValue()); diff --git a/src/main/java/liqp/filters/Absolute_Url.java b/src/main/java/liqp/filters/Absolute_Url.java index c682ea4a..cb60a8d4 100644 --- a/src/main/java/liqp/filters/Absolute_Url.java +++ b/src/main/java/liqp/filters/Absolute_Url.java @@ -27,7 +27,7 @@ def compute_absolute_url(input) */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String valAsString = asString(value, context); if (isValidAbsoluteUrl(valAsString)) { return valAsString; diff --git a/src/main/java/liqp/filters/Append.java b/src/main/java/liqp/filters/Append.java index 0a17bc5a..02306d6d 100644 --- a/src/main/java/liqp/filters/Append.java +++ b/src/main/java/liqp/filters/Append.java @@ -10,7 +10,7 @@ public class Append extends Filter { * add one string to another */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { return super.asString(value, context) + super.asString(super.get(0, params), context); } diff --git a/src/main/java/liqp/filters/At_Least.java b/src/main/java/liqp/filters/At_Least.java index 73b97980..cbeff72a 100644 --- a/src/main/java/liqp/filters/At_Least.java +++ b/src/main/java/liqp/filters/At_Least.java @@ -1,9 +1,11 @@ package liqp.filters; +import liqp.TemplateContext; + public class At_Least extends Filter { @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (params == null || params.length == 0) { return value; diff --git a/src/main/java/liqp/filters/At_Most.java b/src/main/java/liqp/filters/At_Most.java index 2587d98e..a52d957f 100644 --- a/src/main/java/liqp/filters/At_Most.java +++ b/src/main/java/liqp/filters/At_Most.java @@ -1,9 +1,11 @@ package liqp.filters; +import liqp.TemplateContext; + public class At_Most extends Filter { @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (params == null || params.length == 0) { return value; diff --git a/src/main/java/liqp/filters/Capitalize.java b/src/main/java/liqp/filters/Capitalize.java index ba3af4e3..8caf49cc 100644 --- a/src/main/java/liqp/filters/Capitalize.java +++ b/src/main/java/liqp/filters/Capitalize.java @@ -10,7 +10,7 @@ public class Capitalize extends Filter { * capitalize words in the input sentence */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String original = super.asString(value, context); diff --git a/src/main/java/liqp/filters/Ceil.java b/src/main/java/liqp/filters/Ceil.java index 4b73b733..c868687f 100644 --- a/src/main/java/liqp/filters/Ceil.java +++ b/src/main/java/liqp/filters/Ceil.java @@ -1,9 +1,11 @@ package liqp.filters; +import liqp.TemplateContext; + public class Ceil extends Filter { @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isNumber(value)) { return value; diff --git a/src/main/java/liqp/filters/Compact.java b/src/main/java/liqp/filters/Compact.java index 6eb9e96e..49513285 100644 --- a/src/main/java/liqp/filters/Compact.java +++ b/src/main/java/liqp/filters/Compact.java @@ -8,7 +8,7 @@ public class Compact extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isArray(value)) { return value; diff --git a/src/main/java/liqp/filters/Concat.java b/src/main/java/liqp/filters/Concat.java index c5a87190..117d72da 100644 --- a/src/main/java/liqp/filters/Concat.java +++ b/src/main/java/liqp/filters/Concat.java @@ -9,7 +9,7 @@ public class Concat extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { super.checkParams(params, 1); diff --git a/src/main/java/liqp/filters/Date.java b/src/main/java/liqp/filters/Date.java index f430b262..2e40f579 100644 --- a/src/main/java/liqp/filters/Date.java +++ b/src/main/java/liqp/filters/Date.java @@ -28,7 +28,7 @@ protected Date(CustomDateFormatSupport typeSupport) { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Locale locale = context.getParser().locale; if (isArray(value) && asArray(value, context).length ==1) { diff --git a/src/main/java/liqp/filters/Default.java b/src/main/java/liqp/filters/Default.java index 8bfff254..fbbd61bc 100644 --- a/src/main/java/liqp/filters/Default.java +++ b/src/main/java/liqp/filters/Default.java @@ -5,7 +5,7 @@ public class Default extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (params == null || params.length == 0) { return value; diff --git a/src/main/java/liqp/filters/Divided_By.java b/src/main/java/liqp/filters/Divided_By.java index 60dfb612..63804212 100644 --- a/src/main/java/liqp/filters/Divided_By.java +++ b/src/main/java/liqp/filters/Divided_By.java @@ -1,5 +1,7 @@ package liqp.filters; +import liqp.TemplateContext; + public class Divided_By extends Filter { /* @@ -8,7 +10,7 @@ public class Divided_By extends Filter { * division */ @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if(value == null) { value = 0L; diff --git a/src/main/java/liqp/filters/Downcase.java b/src/main/java/liqp/filters/Downcase.java index 2754b300..c70386f8 100644 --- a/src/main/java/liqp/filters/Downcase.java +++ b/src/main/java/liqp/filters/Downcase.java @@ -10,7 +10,7 @@ public class Downcase extends Filter { * convert a input string to DOWNCASE */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { return super.asString(value, context).toLowerCase(); } diff --git a/src/main/java/liqp/filters/Escape.java b/src/main/java/liqp/filters/Escape.java index f0c43852..8713fd00 100644 --- a/src/main/java/liqp/filters/Escape.java +++ b/src/main/java/liqp/filters/Escape.java @@ -10,7 +10,7 @@ public class Escape extends Filter { * escape a string */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String str = super.asString(value, context); diff --git a/src/main/java/liqp/filters/Escape_Once.java b/src/main/java/liqp/filters/Escape_Once.java index 35fcc411..7d6dfb3f 100644 --- a/src/main/java/liqp/filters/Escape_Once.java +++ b/src/main/java/liqp/filters/Escape_Once.java @@ -11,7 +11,7 @@ public class Escape_Once extends Filter { * existing escaped entities */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String str = super.asString(value, context); diff --git a/src/main/java/liqp/filters/Filter.java b/src/main/java/liqp/filters/Filter.java index 66ebed12..9e450c69 100644 --- a/src/main/java/liqp/filters/Filter.java +++ b/src/main/java/liqp/filters/Filter.java @@ -47,39 +47,17 @@ public String getName() { return name; } - /** - * Applies the filter on the 'value'. - * - * @param value - * the string value `AAA` in: `{{ 'AAA' | f:1,2,3 }}` - * @param params - * the values [1, 2, 3] in: `{{ 'AAA' | f:1,2,3 }}` - * - * @deprecated use {@link #apply(Object, TemplateContext, Object...)} - * @return the result of the filter. - */ - @Deprecated - public Object apply(Object value, Object... params) { - - // Default "no-op" filter. - return value; - } - /** * Applies the filter on the 'value', with the given 'context'. * - * @param value - * the string value `AAA` in: `{{ 'AAA' | f:1,2,3 }}` - * @param context - * the template context. - * @param params - * the values [1, 2, 3] in: `{{ 'AAA' | f:1,2,3 }}` - * + * @param context the template context. + * @param value the string value `AAA` in: `{{ 'AAA' | f:1,2,3 }}` + * @param params the values [1, 2, 3] in: `{{ 'AAA' | f:1,2,3 }}` * @return the result of the filter. */ - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { - return apply(value, params); + return value; } /** diff --git a/src/main/java/liqp/filters/First.java b/src/main/java/liqp/filters/First.java index 3f2834da..f9e06211 100644 --- a/src/main/java/liqp/filters/First.java +++ b/src/main/java/liqp/filters/First.java @@ -10,7 +10,7 @@ public class First extends Filter { * Get the first element of the passed in array */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Object[] array = super.asArray(value, context); diff --git a/src/main/java/liqp/filters/Floor.java b/src/main/java/liqp/filters/Floor.java index 26e27e79..7f797423 100644 --- a/src/main/java/liqp/filters/Floor.java +++ b/src/main/java/liqp/filters/Floor.java @@ -1,9 +1,11 @@ package liqp.filters; +import liqp.TemplateContext; + public class Floor extends Filter { @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isNumber(value)) { return value; diff --git a/src/main/java/liqp/filters/H.java b/src/main/java/liqp/filters/H.java index 41b4ad44..5afd1239 100644 --- a/src/main/java/liqp/filters/H.java +++ b/src/main/java/liqp/filters/H.java @@ -10,7 +10,7 @@ public class H extends Filter { * Alias for: escape */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { - return Filters.COMMON_FILTERS.get("escape").apply(value, context, params); + public Object apply(TemplateContext context, Object value, Object... params) { + return Filters.COMMON_FILTERS.get("escape").apply(context, value, params); } } diff --git a/src/main/java/liqp/filters/Join.java b/src/main/java/liqp/filters/Join.java index 4b664aa3..21eb40f7 100644 --- a/src/main/java/liqp/filters/Join.java +++ b/src/main/java/liqp/filters/Join.java @@ -11,7 +11,7 @@ public class Join extends Filter { * Join elements of the array with certain character between them */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (value == null) { return ""; diff --git a/src/main/java/liqp/filters/Last.java b/src/main/java/liqp/filters/Last.java index d3084345..c4b5a263 100644 --- a/src/main/java/liqp/filters/Last.java +++ b/src/main/java/liqp/filters/Last.java @@ -10,7 +10,7 @@ public class Last extends Filter { * Get the last element of the passed in array */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Object[] array = super.asArray(value, context); diff --git a/src/main/java/liqp/filters/Lstrip.java b/src/main/java/liqp/filters/Lstrip.java index cf042691..6951a944 100644 --- a/src/main/java/liqp/filters/Lstrip.java +++ b/src/main/java/liqp/filters/Lstrip.java @@ -5,7 +5,7 @@ public class Lstrip extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isString(value)) { return value; diff --git a/src/main/java/liqp/filters/Map.java b/src/main/java/liqp/filters/Map.java index b87f8e9d..295a5b30 100644 --- a/src/main/java/liqp/filters/Map.java +++ b/src/main/java/liqp/filters/Map.java @@ -15,7 +15,7 @@ public class Map extends Filter { * map/collect on a given property */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (value == null) { return ""; diff --git a/src/main/java/liqp/filters/Minus.java b/src/main/java/liqp/filters/Minus.java index 583d290c..40f68064 100644 --- a/src/main/java/liqp/filters/Minus.java +++ b/src/main/java/liqp/filters/Minus.java @@ -1,5 +1,7 @@ package liqp.filters; +import liqp.TemplateContext; + import java.math.BigDecimal; import liqp.PlainBigDecimal; @@ -12,7 +14,7 @@ public class Minus extends Filter { * subtraction */ @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!isNumber(value)) { value = 0; diff --git a/src/main/java/liqp/filters/Modulo.java b/src/main/java/liqp/filters/Modulo.java index 0d3c7957..b9ae7f54 100644 --- a/src/main/java/liqp/filters/Modulo.java +++ b/src/main/java/liqp/filters/Modulo.java @@ -13,7 +13,7 @@ public class Modulo extends Filter { * modulus */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if(value == null) { value = 0L; diff --git a/src/main/java/liqp/filters/Newline_To_Br.java b/src/main/java/liqp/filters/Newline_To_Br.java index 138c20c3..90263f46 100644 --- a/src/main/java/liqp/filters/Newline_To_Br.java +++ b/src/main/java/liqp/filters/Newline_To_Br.java @@ -10,7 +10,7 @@ public class Newline_To_Br extends Filter { * Add
tags in front of all newlines in input string */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { return super.asString(value, context).replaceAll("[\n]", "
\n"); } diff --git a/src/main/java/liqp/filters/Normalize_Whitespace.java b/src/main/java/liqp/filters/Normalize_Whitespace.java index 03c346db..2b7bdde1 100644 --- a/src/main/java/liqp/filters/Normalize_Whitespace.java +++ b/src/main/java/liqp/filters/Normalize_Whitespace.java @@ -1,5 +1,7 @@ package liqp.filters; +import liqp.TemplateContext; + import java.util.regex.Pattern; public class Normalize_Whitespace extends Filter { @@ -11,7 +13,7 @@ public Normalize_Whitespace() { } @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (value == null) { return ""; } diff --git a/src/main/java/liqp/filters/Plus.java b/src/main/java/liqp/filters/Plus.java index e8bbde92..0f5b7f5f 100644 --- a/src/main/java/liqp/filters/Plus.java +++ b/src/main/java/liqp/filters/Plus.java @@ -1,5 +1,7 @@ package liqp.filters; +import liqp.TemplateContext; + import java.math.BigDecimal; import liqp.PlainBigDecimal; @@ -12,7 +14,7 @@ public class Plus extends Filter { * addition */ @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!isNumber(value)) { value = 0; diff --git a/src/main/java/liqp/filters/Pop.java b/src/main/java/liqp/filters/Pop.java index f456cd64..1064c4ad 100644 --- a/src/main/java/liqp/filters/Pop.java +++ b/src/main/java/liqp/filters/Pop.java @@ -16,7 +16,7 @@ public class Pop extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isArray(value)) { return value; } diff --git a/src/main/java/liqp/filters/Prepend.java b/src/main/java/liqp/filters/Prepend.java index a9878df4..af1e2f38 100644 --- a/src/main/java/liqp/filters/Prepend.java +++ b/src/main/java/liqp/filters/Prepend.java @@ -10,7 +10,7 @@ public class Prepend extends Filter { * add one string to another */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { return super.asString(super.get(0, params), context) + super.asString(value, context); } diff --git a/src/main/java/liqp/filters/Push.java b/src/main/java/liqp/filters/Push.java index b2c1e2fa..d9628dbb 100644 --- a/src/main/java/liqp/filters/Push.java +++ b/src/main/java/liqp/filters/Push.java @@ -15,7 +15,7 @@ public class Push extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isArray(value)) { return value; } diff --git a/src/main/java/liqp/filters/Relative_Url.java b/src/main/java/liqp/filters/Relative_Url.java index 28d3d8d9..f8d40743 100644 --- a/src/main/java/liqp/filters/Relative_Url.java +++ b/src/main/java/liqp/filters/Relative_Url.java @@ -18,7 +18,7 @@ public class Relative_Url extends Filter { public static final String site = "site"; public static final String baseurl = "baseurl"; @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String valAsString = asString(value, context); // fast exit for valid absolute urls diff --git a/src/main/java/liqp/filters/Remove.java b/src/main/java/liqp/filters/Remove.java index ffcc0c95..9c1ffe9e 100644 --- a/src/main/java/liqp/filters/Remove.java +++ b/src/main/java/liqp/filters/Remove.java @@ -10,7 +10,7 @@ public class Remove extends Filter { * remove a substring */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String original = super.asString(value, context); diff --git a/src/main/java/liqp/filters/Remove_First.java b/src/main/java/liqp/filters/Remove_First.java index 458bc50b..7e9684b0 100644 --- a/src/main/java/liqp/filters/Remove_First.java +++ b/src/main/java/liqp/filters/Remove_First.java @@ -12,7 +12,7 @@ public class Remove_First extends Filter { * remove the first occurrences of a substring */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String original = super.asString(value, context); diff --git a/src/main/java/liqp/filters/Replace.java b/src/main/java/liqp/filters/Replace.java index bb87b53a..e0845c91 100644 --- a/src/main/java/liqp/filters/Replace.java +++ b/src/main/java/liqp/filters/Replace.java @@ -10,7 +10,7 @@ public class Replace extends Filter { * Replace occurrences of a string with another */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String original = super.asString(value, context); diff --git a/src/main/java/liqp/filters/Replace_First.java b/src/main/java/liqp/filters/Replace_First.java index 824a8ed8..30f7fee2 100644 --- a/src/main/java/liqp/filters/Replace_First.java +++ b/src/main/java/liqp/filters/Replace_First.java @@ -13,7 +13,7 @@ public class Replace_First extends Filter { * Replace the first occurrences of a string with another */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String original = super.asString(value, context); diff --git a/src/main/java/liqp/filters/Reverse.java b/src/main/java/liqp/filters/Reverse.java index 21ef7a83..d1c89649 100644 --- a/src/main/java/liqp/filters/Reverse.java +++ b/src/main/java/liqp/filters/Reverse.java @@ -10,7 +10,7 @@ public class Reverse extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isArray(value)) { return value; diff --git a/src/main/java/liqp/filters/Round.java b/src/main/java/liqp/filters/Round.java index f089a776..86ebfb96 100644 --- a/src/main/java/liqp/filters/Round.java +++ b/src/main/java/liqp/filters/Round.java @@ -1,5 +1,6 @@ package liqp.filters; +import liqp.TemplateContext; import java.math.RoundingMode; import java.text.DecimalFormat; @@ -8,7 +9,7 @@ public class Round extends Filter { @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.canBeDouble(value)) { return 0; diff --git a/src/main/java/liqp/filters/Rstrip.java b/src/main/java/liqp/filters/Rstrip.java index 81e2200c..0d433bc6 100644 --- a/src/main/java/liqp/filters/Rstrip.java +++ b/src/main/java/liqp/filters/Rstrip.java @@ -5,7 +5,7 @@ public class Rstrip extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isString(value)) { return value; diff --git a/src/main/java/liqp/filters/Shift.java b/src/main/java/liqp/filters/Shift.java index 647a6cab..cc63cd28 100644 --- a/src/main/java/liqp/filters/Shift.java +++ b/src/main/java/liqp/filters/Shift.java @@ -16,7 +16,7 @@ public class Shift extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isArray(value)) { return value; } diff --git a/src/main/java/liqp/filters/Size.java b/src/main/java/liqp/filters/Size.java index b0222a00..51093d51 100644 --- a/src/main/java/liqp/filters/Size.java +++ b/src/main/java/liqp/filters/Size.java @@ -12,7 +12,7 @@ public class Size extends Filter { * Return the size of an array or of an string */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (value instanceof Inspectable) { LiquidSupport evaluated = context.getParser().evaluate(value); diff --git a/src/main/java/liqp/filters/Slice.java b/src/main/java/liqp/filters/Slice.java index 857ccb8a..8fb9acc4 100644 --- a/src/main/java/liqp/filters/Slice.java +++ b/src/main/java/liqp/filters/Slice.java @@ -7,7 +7,7 @@ public class Slice extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { super.checkParams(params,1, 2); diff --git a/src/main/java/liqp/filters/Sort.java b/src/main/java/liqp/filters/Sort.java index 258a098b..342d87fe 100644 --- a/src/main/java/liqp/filters/Sort.java +++ b/src/main/java/liqp/filters/Sort.java @@ -22,7 +22,7 @@ public class Sort extends Filter { */ @SuppressWarnings("unchecked") @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (value == null) { return ""; diff --git a/src/main/java/liqp/filters/Sort_Natural.java b/src/main/java/liqp/filters/Sort_Natural.java index c67b021b..37cbfdf9 100644 --- a/src/main/java/liqp/filters/Sort_Natural.java +++ b/src/main/java/liqp/filters/Sort_Natural.java @@ -7,7 +7,7 @@ public class Sort_Natural extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isArray(value)) { return value; diff --git a/src/main/java/liqp/filters/Split.java b/src/main/java/liqp/filters/Split.java index 097be4e5..127cc6d6 100644 --- a/src/main/java/liqp/filters/Split.java +++ b/src/main/java/liqp/filters/Split.java @@ -14,7 +14,7 @@ public class Split extends Filter { * E.g. {{ "a~b" | split:'~' | first }} #=> 'a' */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String original = super.asString(value, context); if (original.isEmpty()) { diff --git a/src/main/java/liqp/filters/Strip.java b/src/main/java/liqp/filters/Strip.java index f17c8c0a..db7b2be2 100644 --- a/src/main/java/liqp/filters/Strip.java +++ b/src/main/java/liqp/filters/Strip.java @@ -5,7 +5,7 @@ public class Strip extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isString(value)) { return value; diff --git a/src/main/java/liqp/filters/Strip_HTML.java b/src/main/java/liqp/filters/Strip_HTML.java index 49b2e401..69cd07e4 100644 --- a/src/main/java/liqp/filters/Strip_HTML.java +++ b/src/main/java/liqp/filters/Strip_HTML.java @@ -11,7 +11,7 @@ public class Strip_HTML extends Filter { * Remove all HTML tags from the string */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String html = super.asString(value, context); diff --git a/src/main/java/liqp/filters/Strip_Newlines.java b/src/main/java/liqp/filters/Strip_Newlines.java index 50f8a668..a9f0dd61 100644 --- a/src/main/java/liqp/filters/Strip_Newlines.java +++ b/src/main/java/liqp/filters/Strip_Newlines.java @@ -10,7 +10,7 @@ public class Strip_Newlines extends Filter { * Remove all newlines from the string */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { return super.asString(value, context).replaceAll("[\r\n]++", ""); } diff --git a/src/main/java/liqp/filters/Times.java b/src/main/java/liqp/filters/Times.java index 0be4932a..b3f48549 100644 --- a/src/main/java/liqp/filters/Times.java +++ b/src/main/java/liqp/filters/Times.java @@ -1,5 +1,7 @@ package liqp.filters; +import liqp.TemplateContext; + import java.math.BigDecimal; import liqp.PlainBigDecimal; @@ -12,7 +14,7 @@ public class Times extends Filter { * multiplication */ @Override - public Object apply(Object value, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if(value == null) { value = 0L; @@ -28,6 +30,6 @@ public Object apply(Object value, Object... params) { BigDecimal first = new PlainBigDecimal(super.asNumber(value).toString()); BigDecimal second = new PlainBigDecimal(super.asNumber(rhsObj).toString()); - return first.multiply(second); + return new PlainBigDecimal(first.multiply(second)); } } diff --git a/src/main/java/liqp/filters/Truncate.java b/src/main/java/liqp/filters/Truncate.java index d100ccf0..86b2cc26 100644 --- a/src/main/java/liqp/filters/Truncate.java +++ b/src/main/java/liqp/filters/Truncate.java @@ -10,7 +10,7 @@ public class Truncate extends Filter { * Truncate a string down to x characters */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (value == null) { return ""; diff --git a/src/main/java/liqp/filters/Truncatewords.java b/src/main/java/liqp/filters/Truncatewords.java index ed65ea3f..81f47462 100644 --- a/src/main/java/liqp/filters/Truncatewords.java +++ b/src/main/java/liqp/filters/Truncatewords.java @@ -10,7 +10,7 @@ public class Truncatewords extends Filter { * Truncate a string down to x words */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (value == null) { return ""; diff --git a/src/main/java/liqp/filters/Uniq.java b/src/main/java/liqp/filters/Uniq.java index 50b16552..b419f132 100644 --- a/src/main/java/liqp/filters/Uniq.java +++ b/src/main/java/liqp/filters/Uniq.java @@ -9,7 +9,7 @@ public class Uniq extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isArray(value)) { return value; diff --git a/src/main/java/liqp/filters/Unshift.java b/src/main/java/liqp/filters/Unshift.java index 0983b827..e4f6b3f6 100644 --- a/src/main/java/liqp/filters/Unshift.java +++ b/src/main/java/liqp/filters/Unshift.java @@ -15,7 +15,7 @@ public class Unshift extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { if (!super.isArray(value)) { return value; } diff --git a/src/main/java/liqp/filters/Upcase.java b/src/main/java/liqp/filters/Upcase.java index 4c9ad8f7..f6550f4d 100644 --- a/src/main/java/liqp/filters/Upcase.java +++ b/src/main/java/liqp/filters/Upcase.java @@ -10,7 +10,7 @@ public class Upcase extends Filter { * convert a input string to UPCASE */ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { return super.asString(value, context).toUpperCase(); } diff --git a/src/main/java/liqp/filters/Url_Decode.java b/src/main/java/liqp/filters/Url_Decode.java index e267f19d..1fdde673 100644 --- a/src/main/java/liqp/filters/Url_Decode.java +++ b/src/main/java/liqp/filters/Url_Decode.java @@ -7,7 +7,7 @@ public class Url_Decode extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { try { return URLDecoder.decode(super.asString(value, context), "UTF-8"); diff --git a/src/main/java/liqp/filters/Url_Encode.java b/src/main/java/liqp/filters/Url_Encode.java index ed44fb3b..a24f73fc 100644 --- a/src/main/java/liqp/filters/Url_Encode.java +++ b/src/main/java/liqp/filters/Url_Encode.java @@ -7,7 +7,7 @@ public class Url_Encode extends Filter { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { try { return URLEncoder.encode(super.asString(value, context), "UTF-8"); diff --git a/src/main/java/liqp/filters/Where.java b/src/main/java/liqp/filters/Where.java index 218fbb78..3996895c 100644 --- a/src/main/java/liqp/filters/Where.java +++ b/src/main/java/liqp/filters/Where.java @@ -29,7 +29,7 @@ public Where(){ } @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { WhereImpl delegate; if (context.getParser().liquidStyleInclude) { checkParams(params, 1, 2); diff --git a/src/main/java/liqp/filters/Where_Exp.java b/src/main/java/liqp/filters/Where_Exp.java index bc099615..fd675800 100644 --- a/src/main/java/liqp/filters/Where_Exp.java +++ b/src/main/java/liqp/filters/Where_Exp.java @@ -38,7 +38,7 @@ public Where_Exp(){ } @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Object[] items = null; if (isArray(value)) { items = asArray(value, context); diff --git a/src/main/java/liqp/nodes/FilterNode.java b/src/main/java/liqp/nodes/FilterNode.java index c72abeb3..2823088f 100644 --- a/src/main/java/liqp/nodes/FilterNode.java +++ b/src/main/java/liqp/nodes/FilterNode.java @@ -43,7 +43,7 @@ public Object apply(Object value, TemplateContext context) { for (LNode node : params) { paramValues.add(node.render(context)); } - return filter.apply(value, context, paramValues.toArray(new Object[0])); + return filter.apply(context, value, paramValues.toArray(new Object[0])); } catch (Exception e) { throw new RuntimeException("error on line " + line + ", index " + tokenStartIndex + ": " + e.getMessage(), e); diff --git a/src/main/java/liqp/nodes/InsertionNode.java b/src/main/java/liqp/nodes/InsertionNode.java index 8dafe061..a6240344 100644 --- a/src/main/java/liqp/nodes/InsertionNode.java +++ b/src/main/java/liqp/nodes/InsertionNode.java @@ -7,11 +7,11 @@ public class InsertionNode implements LNode { - private Insertion insertion; - private LNode[] tokens; + private final Insertion insertion; + private final LNode[] tokens; public InsertionNode(Insertion insertion, List tokens) { - this(insertion.name, insertion, tokens.toArray(new LNode[tokens.size()])); + this(insertion.name, insertion, tokens.toArray(new LNode[0])); } public InsertionNode(Insertion insertion, LNode... tokens) { diff --git a/src/main/java/liqp/tags/IncludeRelative.java b/src/main/java/liqp/tags/IncludeRelative.java index e025ee5e..9eb603e5 100644 --- a/src/main/java/liqp/tags/IncludeRelative.java +++ b/src/main/java/liqp/tags/IncludeRelative.java @@ -2,13 +2,10 @@ import liqp.TemplateContext; import liqp.antlr.CharStreamWithLocation; -import liqp.nodes.LNode; import java.io.IOException; import java.nio.file.Path; -import java.util.Map; - -import static liqp.TemplateParser.pwd; +import java.nio.file.Paths; /** *
@@ -44,7 +41,7 @@ public IncludeRelative() {
     protected CharStreamWithLocation detectSource(TemplateContext context, String includeResource) throws IOException {
         Path rootPath = context.getRootFolder();
         if (rootPath == null) {
-            rootPath = pwd();
+            rootPath = Paths.get(".").toAbsolutePath();
         }
         Path includePath = rootPath.resolve(includeResource);
         return new CharStreamWithLocation(includePath);
diff --git a/src/test/java/liqp/InsertionTest.java b/src/test/java/liqp/InsertionTest.java
index 4fa66ae6..9bd4dc91 100644
--- a/src/test/java/liqp/InsertionTest.java
+++ b/src/test/java/liqp/InsertionTest.java
@@ -16,7 +16,7 @@ public class InsertionTest {
     public void testNestedCustomTagsAndBlocks() {
 
         TemplateParser templateParser = new TemplateParser.Builder()
-                .withInsertion(new Block("block") {
+                .withBlock(new Block("block") {
                     @Override
                     public Object render(TemplateContext context, LNode... nodes) {
                         String data = (nodes.length >= 2 ? nodes[1].render(context) : nodes[0].render(
@@ -25,7 +25,7 @@ public Object render(TemplateContext context, LNode... nodes) {
                         return "blk[" + data + "]";
                     }
                 })
-                .withInsertion(new Tag("simple") {
+                .withTag(new Tag("simple") {
                     @Override
                     public Object render(TemplateContext context, LNode... nodes) {
                         return "(sim)";
@@ -41,7 +41,7 @@ public Object render(TemplateContext context, LNode... nodes) {
     public void testNestedCustomTagsAndBlocksAsOneCollection() {
         String templateString = "{% block %}a{% simple %}b{% block %}c{% endblock %}d{% endblock %}";
         
-        TemplateParser parser = new TemplateParser.Builder().withInsertion(
+        TemplateParser parser = new TemplateParser.Builder().withBlock(
                 new Block("block") {
                     @Override
                     public Object render(TemplateContext context, LNode... nodes) {
@@ -50,7 +50,7 @@ public Object render(TemplateContext context, LNode... nodes) {
 
                         return "blk[" + data + "]";
                     }
-                }).withInsertion(new Tag("simple") {
+                }).withTag(new Tag("simple") {
             @Override
             public Object render(TemplateContext context, LNode... nodes) {
                 return "(sim)";
@@ -64,7 +64,7 @@ public Object render(TemplateContext context, LNode... nodes) {
     @Test
     public void testCustomTag() throws RecognitionException {
 
-        TemplateParser parser = new TemplateParser.Builder().withInsertion(new Tag("twice") {
+        TemplateParser parser = new TemplateParser.Builder().withTag(new Tag("twice") {
             @Override
             public Object render(TemplateContext context, LNode... nodes) {
                 Double number = super.asNumber(nodes[0].render(context)).doubleValue();
@@ -80,7 +80,7 @@ public Object render(TemplateContext context, LNode... nodes) {
 
     @Test
     public void testCustomTagBlock() throws RecognitionException {
-        TemplateParser templateParser = new TemplateParser.Builder().withInsertion(new Block("twice") {
+        TemplateParser templateParser = new TemplateParser.Builder().withBlock(new Block("twice") {
             @Override
             public Object render(TemplateContext context, LNode... nodes) {
                 LNode blockNode = nodes[nodes.length - 1];
@@ -186,7 +186,7 @@ public void no_transformTest() throws RecognitionException {
     @Test
     public void testCustomTagRegistration() {
         TemplateParser parser = new TemplateParser.Builder()
-                .withInsertion(new Tag("custom_tag") {
+                .withTag(new Tag("custom_tag") {
                     @Override
                     public Object render(TemplateContext context, LNode... nodes) {
                         return "xxx";
diff --git a/src/test/java/liqp/ReadmeSamplesTest.java b/src/test/java/liqp/ReadmeSamplesTest.java
index 8f1caa41..16e48947 100644
--- a/src/test/java/liqp/ReadmeSamplesTest.java
+++ b/src/test/java/liqp/ReadmeSamplesTest.java
@@ -1,23 +1,73 @@
 package liqp;
 
+import liqp.blocks.Block;
+import liqp.filters.Filter;
+import liqp.nodes.LNode;
 import liqp.parser.Inspectable;
 import liqp.parser.LiquidSupport;
+import org.antlr.v4.runtime.tree.ParseTree;
 import org.junit.Test;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
 
 public class ReadmeSamplesTest {
+
+
     @Test
+    public void testRenderTree() {
+        String input =
+                "
    \n" + + " {% for product in products %} \n" + + "
  • \n" + + "

    {{ product.name }}

    \n" + + " Only {{ product.price | price }} \n" + + " \n" + + " {{ product.description | prettyprint | paragraph }} \n" + + "
  • \n" + + " {% endfor %} \n" + + "
\n"; + Template template = TemplateParser.DEFAULT.parse(input); + + ParseTree root = template.getParseTree(); + } + + @Test + public void testReadMeIntro() { + TemplateParser parser = new TemplateParser.Builder().build(); + Template template = parser.parse("hi {{name}}"); + String rendered = template.render("name", "tobi"); + System.out.println(rendered); + } + + @Test + public void testReadMeMap() { + Template template = new TemplateParser.Builder().build().parse("hi {{name}}"); + Map map = new HashMap<>(); + map.put("name", "tobi"); + String rendered = template.render(map); + System.out.println(rendered); + } + + @Test + public void testReadMeJson() { + Template template = new TemplateParser.Builder().build().parse("hi {{name}}"); + String rendered = template.render("{\"name\" : \"tobi\"}"); + System.out.println(rendered); + } + + @Test + @SuppressWarnings({"unused", "FieldMayBeFinal"}) public void testInspectable() { class MyParams implements Inspectable { - @SuppressWarnings("unused") public String name = "tobi"; }; Template template = TemplateParser.DEFAULT.parse("hi {{name}}"); String rendered = template.render(new MyParams()); + System.out.println(rendered); assertEquals("hi tobi", rendered); } @@ -31,6 +81,7 @@ public Map toLiquid() { }; Template template = TemplateParser.DEFAULT.parse("hi {{name}}"); String rendered = template.render(new MyLazy()); + System.out.println(rendered); assertEquals("hi tobi", rendered); } @@ -48,5 +99,113 @@ public void testEagerMode() { assertEquals("hi tobi", res); // System.out.println(res); } + + @Test + public void testFilterRegistration() { + // first create template parser with new filter + TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("b") { + @Override + public Object apply(TemplateContext context, Object value, Object... params) { + // create a string from the value + String text = super.asString(value, context); + + // replace and return *...* with ... + return text.replaceAll("\\*(\\w(.*?\\w)?)\\*", "$1"); + } + }).build(); + + + // use your filter + Template template = parser.parse("{{ wiki | b }}"); + String rendered = template.render("{\"wiki\" : \"Some *bold* text *in here*.\"}"); + System.out.println(rendered); + /* + Some bold text in here. + */ + } + + @Test + public void testFilerWithOptionalParams() { + TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("repeat"){ + @Override + public Object apply(TemplateContext context, Object value, Object... params) { + // get the text of the value + String text = super.asString(value, context); + + // check if an optional parameter is provided + int times = params.length == 0 ? 1 : super.asNumber(params[0]).intValue(); + + StringBuilder builder = new StringBuilder(); + + while(times-- > 0) { + builder.append(text); + } + + return builder.toString(); + } + }).build(); + + // use your filter + Template template = parser.parse("{{ 'a' | repeat }}\n{{ 'b' | repeat:5 }}"); + String rendered = template.render(); + System.out.println(rendered); + /* + a + bbbbb + */ + } + + @Test + public void testFilterCanBeAnything() { + TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("sum"){ + @Override + public Object apply(TemplateContext context, Object value, Object... params) { + + Object[] numbers = super.asArray(value, context); + + double sum = 0; + + for(Object obj : numbers) { + sum += super.asNumber(obj).doubleValue(); + } + + return sum; + } + }).build(); + + Template template = parser.parse("{{ numbers | sum }}"); + String rendered = template.render("{\"numbers\" : [1, 2, 3, 4, 5]}"); + System.out.println(rendered); + /* + 15.0 + */ + } + + @Test + public void testBlockSample() { + TemplateParser parser = new TemplateParser.Builder().withBlock(new Block("loop"){ + @Override + public Object render(TemplateContext context, LNode... nodes) { + int n = super.asNumber(nodes[0].render(context)).intValue(); + LNode block = nodes[1]; + StringBuilder builder = new StringBuilder(); + while(n-- > 0) { + builder.append(super.asString(block.render(context), context)); + } + return builder.toString(); + } + }).build(); + + Template template = parser.parse("{% loop 5 %}looping!\n{% endloop %}"); + String rendered = template.render(); + System.out.println(rendered); + /* + looping! + looping! + looping! + looping! + looping! + */ + } } diff --git a/src/test/java/liqp/RenderSettingsTest.java b/src/test/java/liqp/RenderSettingsTest.java index 179cc953..b9934ab8 100644 --- a/src/test/java/liqp/RenderSettingsTest.java +++ b/src/test/java/liqp/RenderSettingsTest.java @@ -153,7 +153,7 @@ public void testEnvironmentMapConfigurator() throws Exception { TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("secret") { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { ObjectAppender.Controller sb = context.newObjectAppender(3); sb.append(value); sb.append(" "); diff --git a/src/test/java/liqp/TemplateTest.java b/src/test/java/liqp/TemplateTest.java index e8169331..2e3b8949 100644 --- a/src/test/java/liqp/TemplateTest.java +++ b/src/test/java/liqp/TemplateTest.java @@ -267,7 +267,7 @@ public void testCustomTagMissingErrorReporting() { @Test public void testWithCustomTag() { // given - TemplateParser parser = new TemplateParser.Builder().withInsertion(new Tag("custom_tag") { + TemplateParser parser = new TemplateParser.Builder().withTag(new Tag("custom_tag") { @Override public Object render(TemplateContext context, LNode... nodes) { return "xxx"; @@ -283,7 +283,7 @@ public Object render(TemplateContext context, LNode... nodes) { @Test public void testWithCustomBlock() { // given - TemplateParser parser = new TemplateParser.Builder().withInsertion(new Block("custom_uppercase_block") { + TemplateParser parser = new TemplateParser.Builder().withBlock(new Block("custom_uppercase_block") { @Override public Object render(TemplateContext context, LNode... nodes) { LNode block = nodes[0]; @@ -307,7 +307,7 @@ public void testWithCustomFilter() { // given TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("sum"){ @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { Object[] numbers = super.asArray(value, context); double sum = 0; for(Object obj : numbers) { diff --git a/src/test/java/liqp/filters/CapitalizeTest.java b/src/test/java/liqp/filters/CapitalizeTest.java index 156a23ce..67581f69 100644 --- a/src/test/java/liqp/filters/CapitalizeTest.java +++ b/src/test/java/liqp/filters/CapitalizeTest.java @@ -39,7 +39,7 @@ public void applyOriginalTest() { Filter filter = Filters.COMMON_FILTERS.get("capitalize"); TemplateContext context = new TemplateContext(); - assertThat(filter.apply("testing", context), is((Object)"Testing")); - assertThat(filter.apply(null, context), is((Object)"")); + assertThat(filter.apply(context, "testing"), is((Object)"Testing")); + assertThat(filter.apply(context, null), is((Object)"")); } } diff --git a/src/test/java/liqp/filters/DateTest.java b/src/test/java/liqp/filters/DateTest.java index bb9db6c6..b92c8caa 100644 --- a/src/test/java/liqp/filters/DateTest.java +++ b/src/test/java/liqp/filters/DateTest.java @@ -117,34 +117,34 @@ public void applyOriginalTest() throws Exception { TemplateContext context = new TemplateContext(); final Filter filter = dateFilterSetting.filters.get("date"); - assertThat(filter.apply("Fri Jul 16 01:00:00 2004", context,"%m/%d/%Y"), is((Object)"07/16/2004")); + assertThat(filter.apply(context, "Fri Jul 16 01:00:00 2004", "%m/%d/%Y"), is((Object)"07/16/2004")); - assertThat(filter.apply("Fri Jul 16 01:00 2004", context,"%m/%d/%Y"), is((Object)"07/16/2004")); + assertThat(filter.apply(context, "Fri Jul 16 01:00 2004", "%m/%d/%Y"), is((Object)"07/16/2004")); - assertThat(filter.apply(seconds("2006-05-05 10:00:00"), context, "%B"), is((Object)"May")); - assertThat(filter.apply(seconds("2006-06-05 10:00:00"), context,"%B"), is((Object)"June")); - assertThat(filter.apply(seconds("2006-07-05 10:00:00"), context,"%B"), is((Object)"July")); + assertThat(filter.apply(context, seconds("2006-05-05 10:00:00"), "%B"), is((Object)"May")); + assertThat(filter.apply(context, seconds("2006-06-05 10:00:00"), "%B"), is((Object)"June")); + assertThat(filter.apply(context, seconds("2006-07-05 10:00:00"), "%B"), is((Object)"July")); - assertThat(filter.apply("2006-05-05 10:00:00", context,"%B"), is((Object)"May")); - assertThat(filter.apply("2006-06-05 10:00:00", context,"%B"), is((Object)"June")); - assertThat(filter.apply("2006-07-05 10:00:00", context,"%B"), is((Object)"July")); + assertThat(filter.apply(context, "2006-05-05 10:00:00", "%B"), is((Object)"May")); + assertThat(filter.apply(context, "2006-06-05 10:00:00", "%B"), is((Object)"June")); + assertThat(filter.apply(context, "2006-07-05 10:00:00", "%B"), is((Object)"July")); - assertThat(filter.apply("2006-07-05 10:00:00", context,""), is((Object)"2006-07-05 10:00:00")); - assertThat(filter.apply("2006-07-05 10:00:00", context), is((Object)"2006-07-05 10:00:00")); - assertThat(filter.apply("2006-07-05 10:00:00", context, (Object)null), is((Object)"2006-07-05 10:00:00")); - assertThat(filter.apply("2006-07-05 10:00:00", context, (Object[])null), is((Object)"2006-07-05 10:00:00")); - assertThat(filter.apply("2006-07-05 10:00:00", context, new Object[0]), is((Object)"2006-07-05 10:00:00")); + assertThat(filter.apply(context, "2006-07-05 10:00:00", ""), is((Object)"2006-07-05 10:00:00")); + assertThat(filter.apply(context, "2006-07-05 10:00:00"), is((Object)"2006-07-05 10:00:00")); + assertThat(filter.apply(context, "2006-07-05 10:00:00", (Object)null), is((Object)"2006-07-05 10:00:00")); + assertThat(filter.apply(context, "2006-07-05 10:00:00", (Object[])null), is((Object)"2006-07-05 10:00:00")); + assertThat(filter.apply(context, "2006-07-05 10:00:00", new Object[0]), is((Object)"2006-07-05 10:00:00")); - assertThat(filter.apply("2006-07-05 10:00:00", context,"%m/%d/%Y"), is((Object)"07/05/2006")); + assertThat(filter.apply(context, "2006-07-05 10:00:00", "%m/%d/%Y"), is((Object)"07/05/2006")); - assertThat(filter.apply(null, context,"%B"), is((Object)null)); + assertThat(filter.apply(context, null, "%B"), is((Object)null)); - assertThat(filter.apply(1152098955, context,"%m/%d/%Y"), is((Object)"07/05/2006")); - assertThat(filter.apply("1152098955", context,"%m/%d/%Y"), is((Object)"07/05/2006")); + assertThat(filter.apply(context, 1152098955, "%m/%d/%Y"), is((Object)"07/05/2006")); + assertThat(filter.apply(context, "1152098955", "%m/%d/%Y"), is((Object)"07/05/2006")); TemplateParser parser = new TemplateParser.Builder().withFlavor(Flavor.LIQUID).withDefaultTimeZone(ZoneOffset.UTC).build(); TemplateContext anotherZone = new TemplateContext(parser, new LinkedHashMap<>()); - assertThat(filter.apply("1152098955", anotherZone,"%H"), is((Object)"11")); - assertThat(filter.apply(1152098955, anotherZone,"%H"), is((Object)"11")); + assertThat(filter.apply(anotherZone, "1152098955", "%H"), is((Object)"11")); + assertThat(filter.apply(anotherZone, 1152098955, "%H"), is((Object)"11")); } private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH); @@ -188,7 +188,7 @@ public boolean support(Object in) { // then TemplateContext context = new TemplateContext(); - assertThat(parser.filters.get("date").apply(customDate, context, "%m/%d/%Y"), is( + assertThat(parser.filters.get("date").apply(context, customDate, "%m/%d/%Y"), is( (Object) "07/05/2006")); } @@ -199,7 +199,7 @@ public void testParseWithZoneInfo() { // String val = "2021-01-27 00:00:00 EST"; // when - Object res = dateFilterSetting.filters.get("date").apply(val, new TemplateContext(), + Object res = dateFilterSetting.filters.get("date").apply(new TemplateContext(), val, "%Y-%m-%d %H:%M:%S %z"); // then diff --git a/src/test/java/liqp/filters/Divided_ByTest.java b/src/test/java/liqp/filters/Divided_ByTest.java index 92ab4d89..0a7000ea 100644 --- a/src/test/java/liqp/filters/Divided_ByTest.java +++ b/src/test/java/liqp/filters/Divided_ByTest.java @@ -36,19 +36,19 @@ public void applyTest() throws RecognitionException { @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid1() { - Filters.COMMON_FILTERS.get("divided_by").apply(1); + Filters.COMMON_FILTERS.get("divided_by").apply(null, 1); } @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid2() { - Filters.COMMON_FILTERS.get("divided_by").apply(1, 2, 3); + Filters.COMMON_FILTERS.get("divided_by").apply(null, 1, 2, 3); } @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid3() { - Filters.COMMON_FILTERS.get("divided_by").apply(15L, 0L); + Filters.COMMON_FILTERS.get("divided_by").apply(null, 15L, 0L); } /* @@ -69,9 +69,9 @@ public void applyOriginalTest() { Filter filter = Filters.COMMON_FILTERS.get("divided_by"); - assertThat(filter.apply(12L, 3L), is((Object)4L)); - assertThat(filter.apply(14L, 3L), is((Object)4L)); - assertTrue(String.valueOf(filter.apply(14L, 3.0)).matches("4[,.]6{10,}7")); + assertThat(filter.apply(null, 12L, 3L), is((Object)4L)); + assertThat(filter.apply(null, 14L, 3L), is((Object)4L)); + assertTrue(String.valueOf(filter.apply(null, 14L, 3.0)).matches("4[,.]6{10,}7")); // see: applyTestInvalid3() // assert_template_result "Liquid error: divided by 0", "{{ 5 | divided_by:0 }}" diff --git a/src/test/java/liqp/filters/DowncaseTest.java b/src/test/java/liqp/filters/DowncaseTest.java index 1d893667..0523992b 100644 --- a/src/test/java/liqp/filters/DowncaseTest.java +++ b/src/test/java/liqp/filters/DowncaseTest.java @@ -42,7 +42,7 @@ public void applyOriginalTest() { final Filter filter = Filters.COMMON_FILTERS.get("downcase"); TemplateContext templateContext = new TemplateContext(); - assertThat(filter.apply("Testing", templateContext), is((Object)"testing")); - assertThat(filter.apply(null, templateContext), is((Object)"")); + assertThat(filter.apply(templateContext, "Testing"), is((Object)"testing")); + assertThat(filter.apply(templateContext, null), is((Object)"")); } } diff --git a/src/test/java/liqp/filters/EscapeTest.java b/src/test/java/liqp/filters/EscapeTest.java index 3de0e3b5..67e968ca 100644 --- a/src/test/java/liqp/filters/EscapeTest.java +++ b/src/test/java/liqp/filters/EscapeTest.java @@ -45,6 +45,6 @@ public void applyOriginalTest() { Filter filter = Filters.COMMON_FILTERS.get("escape"); - assertThat(filter.apply("", new TemplateContext()), is((Object)"<strong>")); + assertThat(filter.apply(new TemplateContext(), ""), is((Object)"<strong>")); } } diff --git a/src/test/java/liqp/filters/Escape_OnceTest.java b/src/test/java/liqp/filters/Escape_OnceTest.java index 86176ccc..665b9108 100644 --- a/src/test/java/liqp/filters/Escape_OnceTest.java +++ b/src/test/java/liqp/filters/Escape_OnceTest.java @@ -47,10 +47,10 @@ public void applyOriginalTest() { final Filter filter = Filters.COMMON_FILTERS.get("escape_once"); TemplateContext context = new TemplateContext(); - assertThat(filter.apply(Filters.COMMON_FILTERS.get("escape").apply("", context), - context), is((Object) "<strong>")); + assertThat(filter.apply(context, Filters.COMMON_FILTERS.get("escape").apply(context, "") + ), is((Object) "<strong>")); // the same test: - assertThat(filter.apply("<strong>", context), is((Object)"<strong>")); + assertThat(filter.apply(context, "<strong>"), is((Object)"<strong>")); } } diff --git a/src/test/java/liqp/filters/FilterTest.java b/src/test/java/liqp/filters/FilterTest.java index 5b3385bc..b36ae12f 100644 --- a/src/test/java/liqp/filters/FilterTest.java +++ b/src/test/java/liqp/filters/FilterTest.java @@ -18,7 +18,7 @@ public void testCustomFilter() throws RecognitionException { TemplateParser parser = new TemplateParser.Builder().withFilter(new Filter("textilize") { @Override - public Object apply(Object value, TemplateContext context, Object... params) { + public Object apply(TemplateContext context, Object value, Object... params) { String s = super.asString(value, context).trim(); return "" + s.substring(1, s.length() - 1) + ""; } diff --git a/src/test/java/liqp/filters/FirstTest.java b/src/test/java/liqp/filters/FirstTest.java index 6c0ea084..e4faa4cd 100644 --- a/src/test/java/liqp/filters/FirstTest.java +++ b/src/test/java/liqp/filters/FirstTest.java @@ -45,7 +45,7 @@ public void applyOriginalTest() { Filter filter = Filters.COMMON_FILTERS.get("first"); TemplateContext context = new TemplateContext(); - assertThat(filter.apply(new Integer[]{1, 2, 3}, context), is((Object)1)); - assertThat(filter.apply(new Integer[]{}, context), is((Object)null)); + assertThat(filter.apply(context, new Integer[]{1, 2, 3}), is((Object)1)); + assertThat(filter.apply(context, new Integer[]{}), is((Object)null)); } } diff --git a/src/test/java/liqp/filters/HTest.java b/src/test/java/liqp/filters/HTest.java index f49a1c1c..8c6509e7 100644 --- a/src/test/java/liqp/filters/HTest.java +++ b/src/test/java/liqp/filters/HTest.java @@ -44,6 +44,6 @@ public void applyOriginalTest() { Filter filter = Filters.COMMON_FILTERS.get("h"); - assertThat(filter.apply("", new TemplateContext()), is((Object)"<strong>")); + assertThat(filter.apply(new TemplateContext(), ""), is((Object)"<strong>")); } } diff --git a/src/test/java/liqp/filters/JoinTest.java b/src/test/java/liqp/filters/JoinTest.java index 819d61b0..b7070e76 100644 --- a/src/test/java/liqp/filters/JoinTest.java +++ b/src/test/java/liqp/filters/JoinTest.java @@ -44,7 +44,7 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); Filter filter = Filters.COMMON_FILTERS.get("join"); - assertThat(filter.apply(new Integer[]{1,2,3,4}, context), is((Object)"1 2 3 4")); - assertThat(filter.apply(new Integer[]{1,2,3,4}, context, " - "), is((Object)"1 - 2 - 3 - 4")); + assertThat(filter.apply(context, new Integer[]{1,2,3,4}), is((Object)"1 2 3 4")); + assertThat(filter.apply(context, new Integer[]{1,2,3,4}, " - "), is((Object)"1 - 2 - 3 - 4")); } } diff --git a/src/test/java/liqp/filters/LastTest.java b/src/test/java/liqp/filters/LastTest.java index 2c17eec6..33db71bb 100644 --- a/src/test/java/liqp/filters/LastTest.java +++ b/src/test/java/liqp/filters/LastTest.java @@ -44,7 +44,7 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); Filter filter = Filters.COMMON_FILTERS.get("last"); - assertThat(filter.apply(new Integer[]{1, 2, 3}, context), is((Object)3)); - assertThat(filter.apply(new Integer[]{}, context), is((Object)null)); + assertThat(filter.apply(context, new Integer[]{1, 2, 3}), is((Object)3)); + assertThat(filter.apply(context, new Integer[]{}), is((Object)null)); } } diff --git a/src/test/java/liqp/filters/MapTest.java b/src/test/java/liqp/filters/MapTest.java index 6d36cc9c..c303209d 100644 --- a/src/test/java/liqp/filters/MapTest.java +++ b/src/test/java/liqp/filters/MapTest.java @@ -53,13 +53,12 @@ public void applyOriginalTest() { Filter filter = Filters.COMMON_FILTERS.get("map"); Object[] rendered = (Object[]) filter.apply( - new java.util.Map[]{ + new TemplateContext(), new java.util.Map[]{ Collections.singletonMap("a", 1), Collections.singletonMap("a", 2), Collections.singletonMap("a", 3), Collections.singletonMap("a", 4), }, - new TemplateContext(), "a" ); diff --git a/src/test/java/liqp/filters/MinusTest.java b/src/test/java/liqp/filters/MinusTest.java index 31b9f04b..a02fa15b 100644 --- a/src/test/java/liqp/filters/MinusTest.java +++ b/src/test/java/liqp/filters/MinusTest.java @@ -38,13 +38,13 @@ public void applyTest() throws RecognitionException { @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid1() { - Filters.COMMON_FILTERS.get("minus").apply(1); + Filters.COMMON_FILTERS.get("minus").apply(null, 1); } @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid2() { - Filters.COMMON_FILTERS.get("minus").apply(1, 2, 3); + Filters.COMMON_FILTERS.get("minus").apply(null, 1, 2, 3); } /* diff --git a/src/test/java/liqp/filters/ModuloTest.java b/src/test/java/liqp/filters/ModuloTest.java index f20ad9a0..a6717da0 100644 --- a/src/test/java/liqp/filters/ModuloTest.java +++ b/src/test/java/liqp/filters/ModuloTest.java @@ -35,13 +35,13 @@ public void applyTest() throws RecognitionException { @Test(expected=RuntimeException.class) public void applyTestInvalid1() { TemplateContext context = new TemplateContext(); - Filters.COMMON_FILTERS.get("modulo").apply(1, context); + Filters.COMMON_FILTERS.get("modulo").apply(context, 1); } @Test(expected=RuntimeException.class) public void applyTestInvalid2() { TemplateContext context = new TemplateContext(); - Filters.COMMON_FILTERS.get("modulo").apply(1, context, 2, 3); + Filters.COMMON_FILTERS.get("modulo").apply(context, 1, 2, 3); } diff --git a/src/test/java/liqp/filters/Normalize_WhitespaceTest.java b/src/test/java/liqp/filters/Normalize_WhitespaceTest.java index 4323af80..fac3c3b1 100644 --- a/src/test/java/liqp/filters/Normalize_WhitespaceTest.java +++ b/src/test/java/liqp/filters/Normalize_WhitespaceTest.java @@ -50,7 +50,7 @@ public void testNormalizeWhitespace() { {"a", " a ", "strip whitespace from beginning and end of string"} }; for (String[] caze: cases) { - Object actual = filter.apply(caze[1]); + Object actual = filter.apply(null, caze[1]); assertEquals(caze[2], caze[0], actual); } } diff --git a/src/test/java/liqp/filters/PlusTest.java b/src/test/java/liqp/filters/PlusTest.java index 42ccbc46..ed8b0412 100644 --- a/src/test/java/liqp/filters/PlusTest.java +++ b/src/test/java/liqp/filters/PlusTest.java @@ -34,13 +34,13 @@ public void applyTest() throws RecognitionException { @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid1() { - Filters.COMMON_FILTERS.get("plus").apply(1); + Filters.COMMON_FILTERS.get("plus").apply(null, 1); } @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid2() { - Filters.COMMON_FILTERS.get("plus").apply(1, 2, 3); + Filters.COMMON_FILTERS.get("plus").apply(null, 1, 2, 3); } /* diff --git a/src/test/java/liqp/filters/RemoveTest.java b/src/test/java/liqp/filters/RemoveTest.java index 5193fe32..ff80a4e6 100644 --- a/src/test/java/liqp/filters/RemoveTest.java +++ b/src/test/java/liqp/filters/RemoveTest.java @@ -48,6 +48,6 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); Filter filter = Filters.COMMON_FILTERS.get("remove"); - assertThat(filter.apply("a a a a", context, "a"), is((Object)" ")); + assertThat(filter.apply(context, "a a a a", "a"), is((Object)" ")); } } diff --git a/src/test/java/liqp/filters/Remove_FirstTest.java b/src/test/java/liqp/filters/Remove_FirstTest.java index 35f02566..e8d93e1b 100644 --- a/src/test/java/liqp/filters/Remove_FirstTest.java +++ b/src/test/java/liqp/filters/Remove_FirstTest.java @@ -48,7 +48,7 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); Filter filter = Filters.COMMON_FILTERS.get("remove_first"); - assertThat(filter.apply("a a a a", context, "a "), is((Object)"a a a")); + assertThat(filter.apply(context, "a a a a", "a "), is((Object)"a a a")); assertThat(TemplateParser.DEFAULT.parse("{{ 'a a a a' | remove_first: 'a ' }}").render(), is((Object)"a a a")); } } diff --git a/src/test/java/liqp/filters/ReplaceTest.java b/src/test/java/liqp/filters/ReplaceTest.java index e3fdbafa..470fae3c 100644 --- a/src/test/java/liqp/filters/ReplaceTest.java +++ b/src/test/java/liqp/filters/ReplaceTest.java @@ -53,6 +53,6 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); Filter filter = Filters.COMMON_FILTERS.get("replace"); - assertThat(filter.apply("a a a a", context, "a", "b"), is((Object)"b b b b")); + assertThat(filter.apply(context, "a a a a", "a", "b"), is((Object)"b b b b")); } } diff --git a/src/test/java/liqp/filters/Replace_FirstTest.java b/src/test/java/liqp/filters/Replace_FirstTest.java index 4940301f..c335af28 100644 --- a/src/test/java/liqp/filters/Replace_FirstTest.java +++ b/src/test/java/liqp/filters/Replace_FirstTest.java @@ -53,7 +53,7 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); Filter filter = Filters.COMMON_FILTERS.get("replace_first"); - assertThat(filter.apply("a a a a", context, "a", "b"), is((Object)"b a a a")); + assertThat(filter.apply(context, "a a a a", "a", "b"), is((Object)"b a a a")); assertThat(TemplateParser.DEFAULT.parse("{{ 'a a a a' | replace_first: 'a', 'b' }}").render(), is("b a a a")); } } diff --git a/src/test/java/liqp/filters/SizeTest.java b/src/test/java/liqp/filters/SizeTest.java index 995ab196..1c6d0e2d 100644 --- a/src/test/java/liqp/filters/SizeTest.java +++ b/src/test/java/liqp/filters/SizeTest.java @@ -52,12 +52,12 @@ public void applyOriginalTest() { final Filter filter = Filters.COMMON_FILTERS.get("size"); TemplateContext context = new TemplateContext(); - assertThat(filter.apply(new Integer[]{1, 2, 3}, context), is( 3)); - assertThat(filter.apply(new Object[0], context), is(0)); - assertThat(filter.apply(null, context), is(0)); - assertThat(filter.apply(new HashMap<>(), context), is(0)); - assertThat(filter.apply(Collections.singletonMap("a", 1), context), is(1)); - assertThat(filter.apply(new Inspectable() { + assertThat(filter.apply(context, new Integer[]{1, 2, 3}), is( 3)); + assertThat(filter.apply(context, new Object[0]), is(0)); + assertThat(filter.apply(context, null), is(0)); + assertThat(filter.apply(context, new HashMap<>()), is(0)); + assertThat(filter.apply(context, Collections.singletonMap("a", 1)), is(1)); + assertThat(filter.apply(context, new Inspectable() { @SuppressWarnings("unused") public final String a = "a"; @SuppressWarnings("unused") @@ -66,6 +66,6 @@ public void applyOriginalTest() { public final String c = "c"; @SuppressWarnings("unused") public final String d = "d"; - }, context), is(4)); + }), is(4)); } } diff --git a/src/test/java/liqp/filters/SortTest.java b/src/test/java/liqp/filters/SortTest.java index cd5b6bd1..bcfe600c 100644 --- a/src/test/java/liqp/filters/SortTest.java +++ b/src/test/java/liqp/filters/SortTest.java @@ -59,7 +59,7 @@ public void applyOriginalTest() { Filter filter = Filters.COMMON_FILTERS.get("sort"); - assertThat(filter.apply(new Integer[]{4,3,2,1}, context), is((Object)new Integer[]{1,2,3,4})); + assertThat(filter.apply(context, new Integer[]{4,3,2,1}), is((Object)new Integer[]{1,2,3,4})); java.util.Map[] unsorted = new java.util.Map[]{ Collections.singletonMap("a", 4), @@ -68,7 +68,7 @@ public void applyOriginalTest() { Collections.singletonMap("a", 1), }; - java.util.Map[] sorted = (Sort.SortableMap[])filter.apply(unsorted, context, "a"); + java.util.Map[] sorted = (Sort.SortableMap[])filter.apply(context, unsorted, "a"); java.util.Map[] expected = new java.util.Map[]{ Collections.singletonMap("a", 1), @@ -104,7 +104,7 @@ public void testInspectable() { new Pojo(4), new Pojo(3), new Pojo(2), new Pojo(1) }; - java.util.Map[] sorted = (Sort.SortableMap[]) filter.apply(unsortedIns, context, "a"); + java.util.Map[] sorted = (Sort.SortableMap[]) filter.apply(context, unsortedIns, "a"); java.util.Map[] expected = new java.util.Map[]{ Collections.singletonMap("a", 1), Collections.singletonMap("a", 2), @@ -136,7 +136,7 @@ public void testLiquidSupport() { new PojoWithSupport(4), new PojoWithSupport(3), new PojoWithSupport(2), new PojoWithSupport(1) }; - java.util.Map[] sorted = (Sort.SortableMap[]) filter.apply(unsortedIns, context, "a"); + java.util.Map[] sorted = (Sort.SortableMap[]) filter.apply(context, unsortedIns, "a"); java.util.Map[] expected = new java.util.Map[]{ Collections.singletonMap("a", 1), Collections.singletonMap("a", 2), diff --git a/src/test/java/liqp/filters/SplitTest.java b/src/test/java/liqp/filters/SplitTest.java index 1df62a79..af57ed6a 100644 --- a/src/test/java/liqp/filters/SplitTest.java +++ b/src/test/java/liqp/filters/SplitTest.java @@ -51,9 +51,9 @@ public void applyOriginalTest() { final Filter filter = Filters.COMMON_FILTERS.get("split"); - assertThat(filter.apply("12~34", context, "~"), is((Object)new String[]{"12", "34"})); - assertThat(filter.apply("A? ~ ~ ~ ,Z", context, "~ ~ ~"), is((Object)new String[]{"A? ", " ,Z"})); - assertThat(filter.apply("A?Z", context, "~"), is((Object)new String[]{"A?Z"})); - assertThat(filter.apply("AxZ", context, Pattern.compile("x")), is((Object)new String[]{"A", "Z"})); + assertThat(filter.apply(context, "12~34", "~"), is((Object)new String[]{"12", "34"})); + assertThat(filter.apply(context, "A? ~ ~ ~ ,Z", "~ ~ ~"), is((Object)new String[]{"A? ", " ,Z"})); + assertThat(filter.apply(context, "A?Z", "~"), is((Object)new String[]{"A?Z"})); + assertThat(filter.apply(context, "AxZ", Pattern.compile("x")), is((Object)new String[]{"A", "Z"})); } } diff --git a/src/test/java/liqp/filters/Strip_HTMLTest.java b/src/test/java/liqp/filters/Strip_HTMLTest.java index 710fb088..e9a96569 100644 --- a/src/test/java/liqp/filters/Strip_HTMLTest.java +++ b/src/test/java/liqp/filters/Strip_HTMLTest.java @@ -47,9 +47,9 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); Filter filter = Filters.COMMON_FILTERS.get("strip_html"); - assertThat(filter.apply("
test
", context), is((Object)"test")); - assertThat(filter.apply("
test
", context), is((Object)"test")); - assertThat(filter.apply("", context), is((Object)"")); - assertThat(filter.apply(null, context), is((Object)"")); + assertThat(filter.apply(context, "
test
"), is((Object)"test")); + assertThat(filter.apply(context, "
test
"), is((Object)"test")); + assertThat(filter.apply(context, ""), is((Object)"")); + assertThat(filter.apply(context, null), is((Object)"")); } } diff --git a/src/test/java/liqp/filters/TimesTest.java b/src/test/java/liqp/filters/TimesTest.java index 2438a535..5682651d 100644 --- a/src/test/java/liqp/filters/TimesTest.java +++ b/src/test/java/liqp/filters/TimesTest.java @@ -42,13 +42,13 @@ public void applyTest() throws RecognitionException { @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid1() { - Filters.COMMON_FILTERS.get("times").apply(1); + Filters.COMMON_FILTERS.get("times").apply(null, 1); } @SuppressWarnings("deprecation") @Test(expected=RuntimeException.class) public void applyTestInvalid2() { - Filters.COMMON_FILTERS.get("times").apply(1, 2, 3); + Filters.COMMON_FILTERS.get("times").apply(null, 1, 2, 3); } /* @@ -69,14 +69,11 @@ public void applyoriginaltest() { Filter filter = Filters.COMMON_FILTERS.get("times"); - assertThat(filter.apply(3L, 4L), is((Object)12L)); + assertThat(filter.apply(null, 3L, 4L), is((Object)12L)); // assert_template_result "0", "{{ 'foo' | times:4 }}" // see: applyTest() - assertTrue(String.valueOf(filter.apply(2.1, 3L)).matches("6[.,]3")); - assertEquals(new PlainBigDecimal("7.25"), LValue.asFormattedNumber((BigDecimal) filter.apply( - 0.0725, 100))); - assertEquals(new PlainBigDecimal("-7.25"), LValue.asFormattedNumber((BigDecimal) filter.apply( - -0.0725, 100))); - assertEquals(new PlainBigDecimal("7.25"), LValue.asFormattedNumber((BigDecimal) filter.apply( - -0.0725, -100))); + assertTrue(String.valueOf(filter.apply(null, 2.1, 3L)).matches("6[.,]3")); + assertEquals(new PlainBigDecimal("7.25"), LValue.asFormattedNumber((PlainBigDecimal) filter.apply(null, 0.0725, 100))); + assertEquals(new PlainBigDecimal("-7.25"), LValue.asFormattedNumber((PlainBigDecimal) filter.apply(null, -0.0725, 100))); + assertEquals(new PlainBigDecimal("7.25"), LValue.asFormattedNumber((PlainBigDecimal) filter.apply(null, -0.0725, -100))); } } diff --git a/src/test/java/liqp/filters/TruncateTest.java b/src/test/java/liqp/filters/TruncateTest.java index 352f4697..a4439d35 100644 --- a/src/test/java/liqp/filters/TruncateTest.java +++ b/src/test/java/liqp/filters/TruncateTest.java @@ -51,9 +51,9 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); final Filter filter = Filters.COMMON_FILTERS.get("truncate"); - assertThat(filter.apply("1234567890", context, 7), is((Object)"1234...")); - assertThat(filter.apply("1234567890", context, 20), is((Object)"1234567890")); - assertThat(filter.apply("1234567890", context, 0), is((Object)"...")); - assertThat(filter.apply("1234567890", context), is((Object)"1234567890")); + assertThat(filter.apply(context, "1234567890", 7), is((Object)"1234...")); + assertThat(filter.apply(context, "1234567890", 20), is((Object)"1234567890")); + assertThat(filter.apply(context, "1234567890", 0), is((Object)"...")); + assertThat(filter.apply(context, "1234567890"), is((Object)"1234567890")); } } diff --git a/src/test/java/liqp/filters/TruncatewordsTest.java b/src/test/java/liqp/filters/TruncatewordsTest.java index eb70024b..169d2f2d 100644 --- a/src/test/java/liqp/filters/TruncatewordsTest.java +++ b/src/test/java/liqp/filters/TruncatewordsTest.java @@ -52,10 +52,10 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); final Filter filter = Filters.COMMON_FILTERS.get("truncatewords"); - assertThat(filter.apply("one two three", context, 4), is((Object)"one two three")); - assertThat(filter.apply("one two three", context, 2), is((Object)"one two...")); - assertThat(filter.apply("one two three", context, 3), is((Object)"one two three")); - assertThat(filter.apply("Two small (13” x 5.5” x 10” high) baskets fit inside one large basket (13” x 16” x 10.5” high) with cover.", context, 15), + assertThat(filter.apply(context, "one two three", 4), is((Object)"one two three")); + assertThat(filter.apply(context, "one two three", 2), is((Object)"one two...")); + assertThat(filter.apply(context, "one two three", 3), is((Object)"one two three")); + assertThat(filter.apply(context, "Two small (13” x 5.5” x 10” high) baskets fit inside one large basket (13” x 16” x 10.5” high) with cover.", 15), is((Object)"Two small (13” x 5.5” x 10” high) baskets fit inside one large basket (13”...")); } } diff --git a/src/test/java/liqp/filters/UpcaseTest.java b/src/test/java/liqp/filters/UpcaseTest.java index 1776141a..4e9bcb92 100644 --- a/src/test/java/liqp/filters/UpcaseTest.java +++ b/src/test/java/liqp/filters/UpcaseTest.java @@ -42,7 +42,7 @@ public void applyOriginalTest() { TemplateContext context = new TemplateContext(); final Filter filter = Filters.COMMON_FILTERS.get("upcase"); - assertThat(filter.apply("Testing", context), is((Object)"TESTING")); - assertThat(filter.apply(null, context), is((Object)"")); + assertThat(filter.apply(context, "Testing"), is((Object)"TESTING")); + assertThat(filter.apply(context, null), is((Object)"")); } } diff --git a/src/test/java/liqp/nodes/BlockNodeTest.java b/src/test/java/liqp/nodes/BlockNodeTest.java index 0852b0b5..3c0b7900 100644 --- a/src/test/java/liqp/nodes/BlockNodeTest.java +++ b/src/test/java/liqp/nodes/BlockNodeTest.java @@ -19,7 +19,7 @@ public class BlockNodeTest { */ @Test public void customTagTest() throws RecognitionException { - TemplateParser parser = new TemplateParser.Builder().withInsertion(new Block("testtag"){ + TemplateParser parser = new TemplateParser.Builder().withBlock(new Block("testtag"){ @Override public Object render(TemplateContext context, LNode... nodes) { return null; diff --git a/src/test/java/liqp/parser/ParseTest.java b/src/test/java/liqp/parser/ParseTest.java index 12df5f4a..f0a36471 100644 --- a/src/test/java/liqp/parser/ParseTest.java +++ b/src/test/java/liqp/parser/ParseTest.java @@ -2,7 +2,10 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; +import liqp.Template; +import liqp.TemplateContext; import org.junit.Test; import liqp.TemplateParser; @@ -123,4 +126,37 @@ public void keywords_as_identifier() throws Exception { .render(" { \"var\": { \"end\": \"content\" } } "), is("var2: var2:content")); } + + @Test + public void testStripSpaces() { + String source = "a \n \n {{ a }} \n \n c"; + + // default + String res = new TemplateParser.Builder() + .build() + .parse(source).render("a", "b"); + assertEquals("a \n \n b \n \n c", res); + + + // false is default + res = new TemplateParser.Builder() + .withStripSpaceAroundTags(false) + .build() + .parse(source).render("a", "b"); + assertEquals("a \n \n b \n \n c", res); + + // true + res = new TemplateParser.Builder() + .withStripSpaceAroundTags(true) + .build() + .parse(source).render("a", "b"); + assertEquals("abc", res); + + res = new TemplateParser.Builder() + .withStripSpaceAroundTags(true) + .withStripSingleLine(true) + .build() + .parse(source).render("a", "b"); + assertEquals("a \n \nb \n c", res); + } } diff --git a/src/test/java/liqp/tags/IncludeRelativeTest.java b/src/test/java/liqp/tags/IncludeRelativeTest.java index dab0bfde..29fab57c 100644 --- a/src/test/java/liqp/tags/IncludeRelativeTest.java +++ b/src/test/java/liqp/tags/IncludeRelativeTest.java @@ -11,15 +11,15 @@ import java.io.IOException; import java.nio.file.Path; +import java.nio.file.Paths; -import static liqp.TemplateParser.pwd; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class IncludeRelativeTest { @Test public void testSimpleCase() throws IOException { - Path root = pwd().resolve("src/test/jekyll/relative_include"); + Path root = Paths.get(".").toAbsolutePath().resolve("src/test/jekyll/relative_include"); Path index = root.resolve("hello.liquid"); TemplateParser parser = new TemplateParser.Builder() @@ -34,7 +34,7 @@ public void testSimpleCase() throws IOException { @Test public void testLiquid() throws IOException { - Path root = pwd().resolve("src/test/jekyll/relative_include"); + Path root = Paths.get(".").toAbsolutePath().resolve("src/test/jekyll/relative_include"); Path index = root.resolve("hello.liquid"); TemplateParser parser = new TemplateParser.Builder() @@ -51,12 +51,12 @@ public void testLiquid() throws IOException { @Test public void testLiquidWithCustomIncludeShouldAllowOverride() throws IOException { - Path root = pwd().resolve("src/test/jekyll/relative_include"); + Path root = Paths.get(".").toAbsolutePath().resolve("src/test/jekyll/relative_include"); Path index = root.resolve("hello.liquid"); TemplateParser parser = new TemplateParser.Builder() .withFlavor(Flavor.LIQUID) - .withInsertion(new Tag("include_relative") { + .withTag(new Tag("include_relative") { @Override public Object render(TemplateContext context, LNode... nodes) { return "World"; @@ -86,7 +86,7 @@ public Object render(TemplateContext context, LNode... nodes) { // And I should see "Welcome back Dear Reader!" in "_site/2018/09/02/star-wars.html" @Test public void testIncludeANestedFileRelativeToAPost() throws IOException { - Path root = pwd().resolve("src/test/jekyll/relative_include"); + Path root = Paths.get(".").toAbsolutePath().resolve("src/test/jekyll/relative_include"); Path index = root.resolve("nested_include.liquid"); TemplateParser parser = new TemplateParser.Builder() @@ -103,14 +103,14 @@ public void testIncludeANestedFileRelativeToAPost() throws IOException { public void testCustomBlocksStackWithCustomBlockIncludeRelative() { TemplateParser parser = new TemplateParser.Builder() .withFlavor(Flavor.LIQUID) - .withInsertion(new Block("another") { + .withBlock(new Block("another") { @Override public Object render(TemplateContext context, LNode... nodes) { LNode blockNode = nodes[nodes.length - 1]; return "[" + super.asString(blockNode.render(context), context) + "]"; } }) - .withInsertion(new Block("include_relative") { + .withBlock(new Block("include_relative") { @Override public Object render(TemplateContext context, LNode... nodes) { return "World"; diff --git a/src/test/java/liqp/tags/IncludeTest.java b/src/test/java/liqp/tags/IncludeTest.java index 3106f36b..8b1ecd88 100644 --- a/src/test/java/liqp/tags/IncludeTest.java +++ b/src/test/java/liqp/tags/IncludeTest.java @@ -322,6 +322,7 @@ public void errorInIncludeCauseIgnoreErrorWhenNoExceptionsFromIncludeLegacy() th File index = new File(jekyll, "index_with_errored_include.html"); Template template = new TemplateParser.Builder() .withFlavor(Flavor.JEKYLL) + .withShowExceptionsFromInclude(false) .build() .parse(index); @@ -348,7 +349,7 @@ public void errorInIncludeCauseMissingIncludeWithCustomRendering() throws IOExce // when template.render(); - // them + // then fail(); }