Skip to content

Commit 010bc71

Browse files
committed
js-1.3.2 js-core-1.3.2 java-0.9.3 - add to TextTemplate and function url encode parameters option
1 parent 457fc21 commit 010bc71

File tree

17 files changed

+264
-49
lines changed

17 files changed

+264
-49
lines changed

docs/docs/functions/template.md

+38-7
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,25 @@ Renders a specified text template with the given input or specified payload.
44

55
### Usage
66
```transformers
7-
"$$template([payload],[default_resolve]):{input}"
7+
"$$template([payload],[default_resolve],[url_encode]):{input}"
88
```
99
```transformers
1010
{
1111
"$$template": /* template */,
1212
"payload": /* any */,
13-
"default_resolve": "UNIQUE"
13+
"default_resolve": "UNIQUE",
14+
"url_encode": false
1415
}
1516
```
1617
### Returns
1718
`string`
1819
### Arguments
19-
| Argument | Type | Values | Required / Default Value | Description |
20-
|--------------------|----------|-------------------------------------|-------------------------------|------------------------------------------------------------------|
21-
| Primary | `String` | | Yes | The text template to render |
22-
| `payload` | | | | Additional context, referred to as `##current` from the template |
23-
| `default_resolve`* | `Enum` | `UNIQUE`/`FIRST_VALUE`/`LAST_VALUE` | `UNIQUE` | Resolve default value based on previous default values or not |
20+
| Argument | Type | Values | Required / Default Value | Description |
21+
|--------------------|-----------|-------------------------------------|-------------------------------|------------------------------------------------------------------|
22+
| Primary | `String` | | Yes | The text template to render |
23+
| `payload` | | | | Additional context, referred to as `##current` from the template |
24+
| `default_resolve`* | `Enum` | `UNIQUE`/`FIRST_VALUE`/`LAST_VALUE` | `UNIQUE` | Resolve default value based on previous default values or not |
25+
| `url_encode` | `Boolean` | | `false` | URL encode parameters |
2426

2527
#### * Different Types of default parameter resolving options
2628
| Type | Description |
@@ -81,6 +83,35 @@ Renders a specified text template with the given input or specified payload.
8183
"hello"
8284
```
8385

86+
```json
87+
{
88+
"id": "1"
89+
}
90+
```
91+
```transformers
92+
"$$template:{$.id} \\{type: {$.type,Unknown}}"
93+
```
94+
```json
95+
"1 {type: Unknown}"
96+
```
97+
98+
```json
99+
{
100+
"href": "https://example.com/"
101+
}
102+
```
103+
```transformers
104+
{
105+
"$$template": "href={$.href}",
106+
"payload": "$",
107+
"url_encode": true
108+
}
109+
```
110+
```json
111+
"href=https%3A%2F%2Fexample.com%2F"
112+
```
113+
114+
84115
```mdx-code-block
85116
</div>
86117
```

docs/package-lock.json

+8-8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
"@docusaurus/preset-classic": "3.7.0",
2020
"@mdx-js/react": "3.1.0",
2121
"@monaco-editor/react": "4.6.0",
22-
"@nlighten/json-transform": "^1.3.0",
23-
"@nlighten/json-transform-core": "^1.3.1",
22+
"@nlighten/json-transform": "^1.3.2",
23+
"@nlighten/json-transform-core": "^1.3.2",
2424
"buffer": "^6.0.3",
2525
"clsx": "2.1.0",
2626
"crypto-browserify": "^3.12.1",

java/json-transform/src/main/java/co/nlighten/jsontransform/functions/TransformerFunctionTemplate.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public TransformerFunctionTemplate() {
1616
super(FunctionDescription.of(
1717
Map.of(
1818
"payload", ArgumentType.of(ArgType.Any).position(0).defaultIsNull(true),
19-
"default_resolve", ArgumentType.of(ArgType.Enum).position(1).defaultEnum(ParameterDefaultResolveOptions.UNIQUE.name())
19+
"default_resolve", ArgumentType.of(ArgType.Enum).position(1).defaultEnum(ParameterDefaultResolveOptions.UNIQUE.name()),
20+
"url_encode", ArgumentType.of(ArgType.Boolean).position(2).defaultBoolean(false)
2021
)
2122
));
2223
}
@@ -31,6 +32,8 @@ public Object apply(FunctionContext context) {
3132
var defaultResolveValue = context.getEnum("default_resolve");
3233
var defaultResolver = ParameterDefaultResolveOptions.valueOf(defaultResolveValue);
3334

35+
var urlEncode = context.getBoolean("url_encode");
36+
3437
var currentResolver = context.getResolver();
3538
ParameterResolver resolver = currentResolver;
3639
var payload = context.getJsonElement("payload");
@@ -45,6 +48,6 @@ public Object apply(FunctionContext context) {
4548
}
4649

4750
var tt = TextTemplate.get(input, defaultResolver);
48-
return tt.render(resolver, adapter);
51+
return tt.render(resolver, adapter, urlEncode);
4952
}
5053
}

java/json-transform/src/main/java/co/nlighten/jsontransform/template/TextTemplate.java

+34-12
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import co.nlighten.jsontransform.ParameterResolver;
55
import co.nlighten.jsontransform.adapters.JsonAdapter;
66

7+
import java.net.URLEncoder;
8+
import java.nio.charset.StandardCharsets;
79
import java.util.*;
810
import java.util.regex.Pattern;
911

@@ -170,14 +172,16 @@ private void parse(String template, ParameterDefaultResolveOptions defaultResolv
170172
values.add(buffer.toString());
171173
}
172174

173-
String internalRender(ParameterResolver resolver, JsonAdapter<?,?,?> adapter) {
175+
String internalRender(ParameterResolver resolver, JsonAdapter<?,?,?> adapter, Boolean urlEncodeParameters) {
174176
StringBuilder sb = new StringBuilder();
175177
for (Object value : values) {
176178
if (value instanceof String s) {
177179
sb.append(s);
178180
} else if (value instanceof TemplateParameter param) {
179-
// escape param value
180-
sb.append(param.getStringValue(resolver, adapter));
181+
var renderedValue = param.getStringValue(resolver, adapter);
182+
sb.append(Boolean.TRUE.equals(urlEncodeParameters)
183+
? URLEncoder.encode(renderedValue, StandardCharsets.UTF_8)
184+
: renderedValue);
181185
}
182186
}
183187
return sb.toString();
@@ -187,19 +191,29 @@ String internalRender(ParameterResolver resolver, JsonAdapter<?,?,?> adapter) {
187191
* Renders the template after inserting the parameters
188192
*
189193
* @param resolver A resolver to extract parameter values
194+
* @param adapter The adapter to use for rendering
195+
* @param urlEncodeParameters if true, the parameters will be URL encoded
190196
* @return a string with its parameters replaced
191197
*/
192-
public String render(ParameterResolver resolver, JsonAdapter<?,?,?> adapter) {
193-
var res = internalRender(resolver, adapter);
198+
public String render(ParameterResolver resolver, JsonAdapter<?,?,?> adapter, Boolean urlEncodeParameters) {
199+
var res = internalRender(resolver, adapter, urlEncodeParameters);
194200
while (UNESCAPED_OPEN_CURLY_BRACKET.matcher(res).find()) {
195-
res = get(res, defaultResolver).internalRender(resolver, adapter);
201+
res = get(res, defaultResolver).internalRender(resolver, adapter, urlEncodeParameters);
196202
}
197203
// unescape
198204
return res.replace("\\{", "{").replace("\\}", "}");
199205
}
200206

201207
public String render(ParameterResolver resolver) {
202-
return render(resolver, JsonTransformerConfiguration.get().getAdapter());
208+
return render(resolver, JsonTransformerConfiguration.get().getAdapter(), false);
209+
}
210+
211+
public String render(ParameterResolver resolver, JsonAdapter<?,?,?> adapter) {
212+
return render(resolver, adapter, false);
213+
}
214+
215+
public String render(ParameterResolver resolver, Boolean urlEncodeParameters) {
216+
return render(resolver, JsonTransformerConfiguration.get().getAdapter(), urlEncodeParameters);
203217
}
204218

205219
public static Map<String, String> mapOf(String... parameters){
@@ -235,20 +249,28 @@ public String render(Map<String, ?> resolver) {
235249
return render(ParameterResolver.fromMap(resolver));
236250
}
237251

238-
public static String render(String template, ParameterResolver resolver, ParameterDefaultResolveOptions defaultResolver) {
239-
return get(template, defaultResolver).render(resolver);
252+
public static String render(String template, ParameterResolver resolver, ParameterDefaultResolveOptions defaultResolver, Boolean urlEncodeParameters) {
253+
return get(template, defaultResolver).render(resolver, urlEncodeParameters);
240254
}
241255

242256
public static String render(String template, Map<String, ?> resolver, ParameterDefaultResolveOptions defaultResolver) {
243-
return render(template, ParameterResolver.fromMap(resolver), defaultResolver);
257+
return render(template, ParameterResolver.fromMap(resolver), defaultResolver, false);
258+
}
259+
260+
public static String render(String template, ParameterResolver resolver, Boolean urlEncodeParameters) {
261+
return render(template, resolver, ParameterDefaultResolveOptions.UNIQUE, urlEncodeParameters);
262+
}
263+
264+
public static String render(String template, Map<String, ?> resolver, Boolean urlEncodeParameters) {
265+
return render(template, ParameterResolver.fromMap(resolver), ParameterDefaultResolveOptions.UNIQUE, urlEncodeParameters);
244266
}
245267

246268
public static String render(String template, ParameterResolver resolver) {
247-
return render(template, resolver, ParameterDefaultResolveOptions.UNIQUE);
269+
return render(template, resolver, ParameterDefaultResolveOptions.UNIQUE, false);
248270
}
249271

250272
public static String render(String template, Map<String, ?> resolver) {
251-
return render(template, ParameterResolver.fromMap(resolver), ParameterDefaultResolveOptions.UNIQUE);
273+
return render(template, ParameterResolver.fromMap(resolver), ParameterDefaultResolveOptions.UNIQUE, false);
252274
}
253275

254276
}

java/json-transform/src/test/java/co/nlighten/jsontransform/template/TextTemplateTests.java

+13
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,17 @@ void recursiveWithEscapedTemplateParameterDefaultValue3() {
117117
var def = new TextTemplate("{b,\\{a}}").render(resolver);
118118
Assertions.assertEquals("{a}", def);
119119
}
120+
121+
@Test
122+
void urlEncode() {
123+
var resolver = ParameterResolver.fromMap(Map.of(
124+
"href", "https://example.com/"
125+
));
126+
// true
127+
var def = new TextTemplate("href={href}").render(resolver, true);
128+
Assertions.assertEquals("href=https%3A%2F%2Fexample.com%2F", def);
129+
// false
130+
def = new TextTemplate("href={href}").render(resolver);
131+
Assertions.assertEquals("href=https://example.com/", def);
132+
}
120133
}

javascript/json-transform-core/package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

javascript/json-transform-core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@nlighten/json-transform-core",
33
"description": "Core types and utilities for handling JSON transformers",
4-
"version": "1.3.1",
4+
"version": "1.3.2",
55
"main": "dist/json-transform-core.js",
66
"umd:main": "dist/json-transform-core.umd.js",
77
"module": "dist/json-transform-core.module.js",

javascript/json-transform-core/src/functions/embeddedFunctions.ts

+7
Original file line numberDiff line numberDiff line change
@@ -1469,6 +1469,13 @@ export const embeddedFunctions: Record<EmbeddedTransformerFunction, FunctionDesc
14691469
enum: ["UNIQUE", "FIRST_VALUE", "LAST_VALUE"],
14701470
default: "UNIQUE",
14711471
},
1472+
{
1473+
name: "url_encode",
1474+
description: "URL encode parameters",
1475+
type: "boolean",
1476+
position: 2,
1477+
default: false,
1478+
},
14721479
],
14731480
},
14741481
test: {

javascript/json-transform/package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

javascript/json-transform/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@nlighten/json-transform",
33
"description": "JSON transformers JavaScript implementation",
4-
"version": "1.3.0",
4+
"version": "1.3.2",
55
"main": "dist/json-transform.js",
66
"umd:main": "dist/json-transform.umd.js",
77
"module": "dist/json-transform.module.js",

javascript/json-transform/src/JsonHelpers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ const getRootFromPath = (path: string) => {
9898
return endOfKeyIndex < 0 ? path : path.substring(0, endOfKeyIndex);
9999
};
100100

101-
const createPayloadResolver = (payload: any, additionalContext: Record<string, any>) => {
101+
const createPayloadResolver = (payload: any, additionalContext?: Record<string, any>) => {
102102
const json = getDocumentContext(payload);
103103
const additionalJsons = !additionalContext
104104
? {}

0 commit comments

Comments
 (0)