jtlt 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.md +9 -0
- package/demo/index.css +4 -0
- package/demo/index.html +4 -4
- package/demo/index.js +6 -2
- package/demo/vendor/fontoxpath/dist/fontoxpath.esm.js +600 -0
- package/demo/vendor/prsc/dist/prsc.esm.js +2 -0
- package/demo/vendor/whynot/dist/whynot.esm.js +2 -0
- package/demo/vendor/xspattern/dist/xspattern.esm.js +2 -0
- package/dist/AbstractJoiningTransformer.d.ts +27 -0
- package/dist/AbstractJoiningTransformer.d.ts.map +1 -1
- package/dist/DOMJoiningTransformer.d.ts +60 -8
- package/dist/DOMJoiningTransformer.d.ts.map +1 -1
- package/dist/JSONJoiningTransformer.d.ts +8 -9
- package/dist/JSONJoiningTransformer.d.ts.map +1 -1
- package/dist/JSONPathTransformer.d.ts.map +1 -1
- package/dist/JSONPathTransformerContext.d.ts +137 -2
- package/dist/JSONPathTransformerContext.d.ts.map +1 -1
- package/dist/StringJoiningTransformer.d.ts +7 -7
- package/dist/StringJoiningTransformer.d.ts.map +1 -1
- package/dist/XPathTransformer.d.ts.map +1 -1
- package/dist/XPathTransformerContext.d.ts +69 -0
- package/dist/XPathTransformerContext.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/docs/TO-DO.md +8 -6
- package/package.json +6 -2
- package/src/AbstractJoiningTransformer.js +42 -0
- package/src/DOMJoiningTransformer.js +115 -23
- package/src/JSONJoiningTransformer.js +50 -26
- package/src/JSONPathTransformer.js +2 -0
- package/src/JSONPathTransformerContext.js +520 -7
- package/src/StringJoiningTransformer.js +25 -21
- package/src/XPathTransformer.js +2 -0
- package/src/XPathTransformerContext.js +426 -8
- package/src/index.js +7 -1
|
@@ -98,6 +98,11 @@ declare class XPathTransformerContext {
|
|
|
98
98
|
match: string;
|
|
99
99
|
use: string;
|
|
100
100
|
}>;
|
|
101
|
+
/**
|
|
102
|
+
* @type {Record<string,
|
|
103
|
+
* import('./JSONPathTransformerContext.js').DecimalFormatSymbols>}
|
|
104
|
+
*/
|
|
105
|
+
decimalFormats: Record<string, import("./JSONPathTransformerContext.js").DecimalFormatSymbols>;
|
|
101
106
|
/** @type {boolean|undefined} */
|
|
102
107
|
_initialized: boolean | undefined;
|
|
103
108
|
/** @type {string|undefined} */
|
|
@@ -162,6 +167,39 @@ declare class XPathTransformerContext {
|
|
|
162
167
|
* @returns {XPathTransformerContext}
|
|
163
168
|
*/
|
|
164
169
|
forEach(select: string, cb: (this: XPathTransformerContext, node: Node) => void): XPathTransformerContext;
|
|
170
|
+
/**
|
|
171
|
+
* Groups items and executes callback for each group.
|
|
172
|
+
* Equivalent to XSLT's xsl:for-each-group.
|
|
173
|
+
* @param {string} select - XPath selector for items to group
|
|
174
|
+
* @param {object} options - Grouping options
|
|
175
|
+
* @param {string} [options.groupBy] - XPath expression to group by value
|
|
176
|
+
* @param {string} [options.groupAdjacent] - Groups adjacent items with
|
|
177
|
+
* same value
|
|
178
|
+
* @param {string} [options.groupStartingWith] - Starts new group when
|
|
179
|
+
* expression matches
|
|
180
|
+
* @param {string} [options.groupEndingWith] - Ends group when expression
|
|
181
|
+
* matches
|
|
182
|
+
* @param {(
|
|
183
|
+
* this: XPathTransformerContext, key: any, items: Node[], ctx: any
|
|
184
|
+
* ) => void} cb - Callback receives (groupingKey, groupItems, context)
|
|
185
|
+
* @returns {this}
|
|
186
|
+
*/
|
|
187
|
+
forEachGroup(select: string, options: {
|
|
188
|
+
groupBy?: string | undefined;
|
|
189
|
+
groupAdjacent?: string | undefined;
|
|
190
|
+
groupStartingWith?: string | undefined;
|
|
191
|
+
groupEndingWith?: string | undefined;
|
|
192
|
+
}, cb: (this: XPathTransformerContext, key: any, items: Node[], ctx: any) => void): this;
|
|
193
|
+
/**
|
|
194
|
+
* Returns the current group (for use within forEachGroup callback).
|
|
195
|
+
* @returns {Node[]|undefined}
|
|
196
|
+
*/
|
|
197
|
+
currentGroup(): Node[] | undefined;
|
|
198
|
+
/**
|
|
199
|
+
* Returns the current grouping key (for use within forEachGroup callback).
|
|
200
|
+
* @returns {any}
|
|
201
|
+
*/
|
|
202
|
+
currentGroupingKey(): any;
|
|
165
203
|
/**
|
|
166
204
|
* Append the value from an XPath expression or the context node text.
|
|
167
205
|
* @param {string|object} [select]
|
|
@@ -210,6 +248,7 @@ declare class XPathTransformerContext {
|
|
|
210
248
|
* level?: 'single'|'multiple'|'any',
|
|
211
249
|
* from?: string,
|
|
212
250
|
* format?: string,
|
|
251
|
+
* decimalFormat?: string,
|
|
213
252
|
* groupingSeparator?: string,
|
|
214
253
|
* groupingSize?: number
|
|
215
254
|
* }} num - Number value, "position()" string, or options object
|
|
@@ -221,6 +260,7 @@ declare class XPathTransformerContext {
|
|
|
221
260
|
level?: "single" | "multiple" | "any";
|
|
222
261
|
from?: string;
|
|
223
262
|
format?: string;
|
|
263
|
+
decimalFormat?: string;
|
|
224
264
|
groupingSeparator?: string;
|
|
225
265
|
groupingSize?: number;
|
|
226
266
|
}): XPathTransformerContext;
|
|
@@ -246,6 +286,7 @@ declare class XPathTransformerContext {
|
|
|
246
286
|
* @param {string} format - Format string (1, a, A, i, I, 01, etc.)
|
|
247
287
|
* @param {string} [groupingSeparator] - Separator for grouping (e.g., ',')
|
|
248
288
|
* @param {number} [groupingSize] - Size of groups (e.g., 3 for 1,000)
|
|
289
|
+
* @param {string} [decimalFormatName] - Named decimal format to use
|
|
249
290
|
* @param {string} [locale]
|
|
250
291
|
* @returns {string}
|
|
251
292
|
* @private
|
|
@@ -307,6 +348,13 @@ declare class XPathTransformerContext {
|
|
|
307
348
|
* @returns {XPathTransformerContext}
|
|
308
349
|
*/
|
|
309
350
|
output(cfg: import("./StringJoiningTransformer.js").OutputConfig): XPathTransformerContext;
|
|
351
|
+
/**
|
|
352
|
+
* @param {string} name
|
|
353
|
+
* @param {import('./AbstractJoiningTransformer.js').
|
|
354
|
+
* OutputCharacters} outputCharacters
|
|
355
|
+
* @returns {this}
|
|
356
|
+
*/
|
|
357
|
+
characterMap(name: string, outputCharacters: import("./AbstractJoiningTransformer.js").OutputCharacters): this;
|
|
310
358
|
/**
|
|
311
359
|
* Append element.
|
|
312
360
|
* @param {string} name Tag name
|
|
@@ -318,6 +366,27 @@ declare class XPathTransformerContext {
|
|
|
318
366
|
* @returns {XPathTransformerContext}
|
|
319
367
|
*/
|
|
320
368
|
element(name: string, atts?: Record<string, string> | any[] | ((this: XPathTransformerContext) => void), children?: any[] | ((this: XPathTransformerContext) => void), cb?: (this: XPathTransformerContext) => void): XPathTransformerContext;
|
|
369
|
+
/**
|
|
370
|
+
* Adds a prefixed namespace declaration to the most recently opened
|
|
371
|
+
* element. Mirrors the joining
|
|
372
|
+
* transformer API so templates can call `this.attribute()`.
|
|
373
|
+
* @param {string} prefix - Prefix
|
|
374
|
+
* @param {string} namespaceURI - Namespace
|
|
375
|
+
* @returns {this}
|
|
376
|
+
*/
|
|
377
|
+
namespace(prefix: string, namespaceURI: string): this;
|
|
378
|
+
/**
|
|
379
|
+
* Define a decimal format with custom symbols for number formatting.
|
|
380
|
+
* Equivalent to xsl:decimal-format. If no name is provided, defines
|
|
381
|
+
* the default format.
|
|
382
|
+
* @param {string|import('./JSONPathTransformerContext.js').
|
|
383
|
+
* DecimalFormatSymbols} nameOrSymbols - Format name or symbols object
|
|
384
|
+
* if defining default
|
|
385
|
+
* @param {import('./JSONPathTransformerContext.js').
|
|
386
|
+
* DecimalFormatSymbols} [symbols] - Format symbols
|
|
387
|
+
* @returns {this}
|
|
388
|
+
*/
|
|
389
|
+
decimalFormat(nameOrSymbols: string | import("./JSONPathTransformerContext.js").DecimalFormatSymbols, symbols?: import("./JSONPathTransformerContext.js").DecimalFormatSymbols): this;
|
|
321
390
|
/**
|
|
322
391
|
* Append attribute.
|
|
323
392
|
* @param {string} name Attribute name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XPathTransformerContext.d.ts","sourceRoot":"","sources":["../src/XPathTransformerContext.js"],"names":[],"mappings":";;;;;WAOc,OAAO;;;;;;;;wBAEP,OAAO,YAAY,EAC5B,kBAAkB;;0CAEF,MAAM,KAAK,MAAM;;AAPtC;;;;;;;;GAQG;AAEH;;;;;;;;;;;;GAYG;AACH;
|
|
1
|
+
{"version":3,"file":"XPathTransformerContext.d.ts","sourceRoot":"","sources":["../src/XPathTransformerContext.js"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":"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"}
|
package/docs/TO-DO.md
CHANGED
|
@@ -84,7 +84,9 @@
|
|
|
84
84
|
|
|
85
85
|
7. See code for other possible to-dos
|
|
86
86
|
|
|
87
|
-
8.
|
|
87
|
+
8. Promise-based templates
|
|
88
|
+
|
|
89
|
+
9. Consider implementing the following elements from <https://www.w3.org/TR/xslt-30/>
|
|
88
90
|
which are not yet implemented.
|
|
89
91
|
|
|
90
92
|
xsl:accept
|
|
@@ -99,20 +101,20 @@
|
|
|
99
101
|
xsl:break
|
|
100
102
|
~~"xsl:call-template",~~
|
|
101
103
|
xsl:catch
|
|
102
|
-
"xsl:character-map"
|
|
104
|
+
~~"xsl:character-map",~~
|
|
103
105
|
~~"xsl:choose",~~
|
|
104
106
|
~~"xsl:comment",~~
|
|
105
107
|
xsl:context-item
|
|
106
108
|
~~"xsl:copy",~~
|
|
107
109
|
~~"xsl:copy-of",~~
|
|
108
|
-
"xsl:decimal-format"
|
|
110
|
+
~~"xsl:decimal-format",~~
|
|
109
111
|
~~"xsl:document",~~
|
|
110
112
|
~~"xsl:element",~~
|
|
111
113
|
xsl:evaluate
|
|
112
114
|
xsl:expose
|
|
113
115
|
"xsl:fallback",
|
|
114
116
|
~~"xsl:for-each",~~
|
|
115
|
-
"xsl:for-each-group"
|
|
117
|
+
~~"xsl:for-each-group",~~
|
|
116
118
|
xsl:fork
|
|
117
119
|
"xsl:function",
|
|
118
120
|
xsl:global-context-item
|
|
@@ -131,7 +133,7 @@
|
|
|
131
133
|
xsl:merge-source
|
|
132
134
|
~~"xsl:message",~~
|
|
133
135
|
xsl:mode
|
|
134
|
-
"xsl:namespace"
|
|
136
|
+
~~"xsl:namespace",~~
|
|
135
137
|
"xsl:namespace-alias",
|
|
136
138
|
xsl:next-iteration
|
|
137
139
|
"xsl:next-match",
|
|
@@ -142,7 +144,7 @@
|
|
|
142
144
|
xsl:on-non-empty
|
|
143
145
|
~~"xsl:otherwise",~~
|
|
144
146
|
~~"xsl:output",~~
|
|
145
|
-
"xsl:output-character"
|
|
147
|
+
~~"xsl:output-character",~~
|
|
146
148
|
xsl:override
|
|
147
149
|
xsl:package
|
|
148
150
|
"xsl:param",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jtlt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"author": "Brett Zamir",
|
|
6
6
|
"contributors": [],
|
|
@@ -77,7 +77,11 @@
|
|
|
77
77
|
"copy-jhtml": "cp -Rf node_modules/jhtml/src demo/vendor/jhtml",
|
|
78
78
|
"copy-jamilih": "cp node_modules/jamilih/dist/jml.mjs demo/vendor/jamilih/dist/jml.mjs",
|
|
79
79
|
"copy-jsonpath-plus": "cp node_modules/jsonpath-plus/dist/index-browser-esm.js demo/vendor/jsonpath-plus/dist/index-browser-esm.js",
|
|
80
|
-
"copy": "
|
|
80
|
+
"copy-fontoxpath": "cp node_modules/fontoxpath/dist/fontoxpath.esm.js demo/vendor/fontoxpath/dist/fontoxpath.esm.js",
|
|
81
|
+
"copy-xspattern": "cp node_modules/xspattern/dist/xspattern.esm.js demo/vendor/xspattern/dist/xspattern.esm.js",
|
|
82
|
+
"copy-prsc": "cp node_modules/prsc/dist/prsc.esm.js demo/vendor/prsc/dist/prsc.esm.js",
|
|
83
|
+
"copy-whynot": "cp node_modules/whynot/dist/whynot.esm.js demo/vendor/whynot/dist/whynot.esm.js",
|
|
84
|
+
"copy": "pnpm copy-simple-get-json && pnpm copy-jhtml && pnpm copy-jamilih && pnpm copy-jsonpath-plus && pnpm copy-fontoxpath && pnpm copy-xspattern && pnpm copy-prsc && pnpm copy-whynot",
|
|
81
85
|
"lint": "eslint .",
|
|
82
86
|
"mocha": "mocha",
|
|
83
87
|
"test:browser": "open http://localhost:8020/test/browser/ && static -p 8020",
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
// mid-transformation (e.g., building strings with
|
|
3
3
|
// string transformer but adding as text node in a DOM transformer)
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {{character: string, string: string}[]} OutputCharacters
|
|
7
|
+
*/
|
|
8
|
+
|
|
5
9
|
/**
|
|
6
10
|
* @typedef {{
|
|
7
11
|
* requireSameChildren?: boolean,
|
|
@@ -66,6 +70,8 @@ class AbstractJoiningTransformer {
|
|
|
66
70
|
constructor (cfg) {
|
|
67
71
|
// Todo: Might set some reasonable defaults across all classes
|
|
68
72
|
this._cfg = cfg ?? /** @type {JoiningTransformerConfig<T>} */ ({});
|
|
73
|
+
/** @type {Record<string, OutputCharacters>} */
|
|
74
|
+
this._characterMap = {};
|
|
69
75
|
}
|
|
70
76
|
|
|
71
77
|
/**
|
|
@@ -76,6 +82,42 @@ class AbstractJoiningTransformer {
|
|
|
76
82
|
this._cfg = cfg;
|
|
77
83
|
}
|
|
78
84
|
|
|
85
|
+
/**
|
|
86
|
+
* @param {import('./StringJoiningTransformer.js').OutputConfig} cfg
|
|
87
|
+
* @returns {this}
|
|
88
|
+
*/
|
|
89
|
+
output (cfg) {
|
|
90
|
+
// We wait until first element is set in `element()` to add
|
|
91
|
+
// XML declaration and DOCTYPE as latter depends on root element
|
|
92
|
+
this._outputConfig = cfg;
|
|
93
|
+
|
|
94
|
+
// Use for file extension if making downloadable?
|
|
95
|
+
this.mediaType = cfg.mediaType;
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* @param {string} name
|
|
101
|
+
* @param {OutputCharacters} outputCharacters
|
|
102
|
+
* @returns {void}
|
|
103
|
+
*/
|
|
104
|
+
characterMap (name, outputCharacters) {
|
|
105
|
+
this._characterMap[name] = outputCharacters;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @param {string} str
|
|
110
|
+
* @returns {string}
|
|
111
|
+
*/
|
|
112
|
+
_replaceCharacterMaps (str) {
|
|
113
|
+
this._outputConfig?.useCharacterMaps?.forEach((name) => {
|
|
114
|
+
this._characterMap[name].forEach(({character, string}) => {
|
|
115
|
+
str = str.replaceAll(character, string);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
return str;
|
|
119
|
+
}
|
|
120
|
+
|
|
79
121
|
/**
|
|
80
122
|
* @param {string} type - Type name
|
|
81
123
|
* @param {string} embedType - Embed type name
|
|
@@ -182,31 +182,84 @@ class DOMJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
/**
|
|
185
|
-
* @
|
|
185
|
+
* @overload
|
|
186
|
+
* @param {Element|string} elName
|
|
187
|
+
* @param {Record<string, string>} atts
|
|
188
|
+
* @param {(Node|string)[]} childNodes
|
|
189
|
+
* @param {(this: DOMJoiningTransformer) => void} cb
|
|
190
|
+
* @returns {DOMJoiningTransformer}
|
|
191
|
+
*/
|
|
192
|
+
/**
|
|
193
|
+
* @overload
|
|
194
|
+
* @param {Element|string} elName
|
|
195
|
+
* @param {Record<string, string>} atts
|
|
196
|
+
* @param {(Node|string)[]} childNodes
|
|
197
|
+
* @returns {DOMJoiningTransformer}
|
|
198
|
+
*/
|
|
199
|
+
/**
|
|
200
|
+
* @overload
|
|
201
|
+
* @param {Element|string} elName
|
|
202
|
+
* @param {Record<string, string>} atts
|
|
203
|
+
* @param {(this: DOMJoiningTransformer) => void} cb
|
|
204
|
+
* @returns {DOMJoiningTransformer}
|
|
205
|
+
*/
|
|
206
|
+
/**
|
|
207
|
+
* @overload
|
|
208
|
+
* @param {Element|string} elName
|
|
209
|
+
* @param {Record<string, string>} atts
|
|
210
|
+
* @returns {DOMJoiningTransformer}
|
|
211
|
+
*/
|
|
212
|
+
/**
|
|
213
|
+
* @overload
|
|
214
|
+
* @param {Element|string} elName
|
|
215
|
+
* @param {(Node|string)[]} childNodes
|
|
216
|
+
* @param {(this: DOMJoiningTransformer) => void} cb
|
|
217
|
+
* @returns {DOMJoiningTransformer}
|
|
218
|
+
*/
|
|
219
|
+
/**
|
|
220
|
+
* @overload
|
|
221
|
+
* @param {Element|string} elName
|
|
222
|
+
* @param {(Node|string)[]} childNodes
|
|
223
|
+
* @returns {DOMJoiningTransformer}
|
|
224
|
+
*/
|
|
225
|
+
/**
|
|
226
|
+
* @overload
|
|
227
|
+
* @param {Element|string} elName
|
|
228
|
+
* @param {(this: DOMJoiningTransformer) => void} cb
|
|
229
|
+
* @returns {DOMJoiningTransformer}
|
|
230
|
+
*/
|
|
231
|
+
/**
|
|
232
|
+
* @overload
|
|
233
|
+
* @param {Element|string} elName
|
|
186
234
|
* @returns {DOMJoiningTransformer}
|
|
187
235
|
*/
|
|
188
|
-
output (cfg) {
|
|
189
|
-
// We wait until first element is set in `element()` to add
|
|
190
|
-
// XML declaration and DOCTYPE as latter depends on root element
|
|
191
|
-
this._outputConfig = cfg;
|
|
192
|
-
|
|
193
|
-
// Use for file extension if making downloadable?
|
|
194
|
-
this.mediaType = cfg.mediaType;
|
|
195
|
-
return this;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
236
|
/**
|
|
199
237
|
* @param {Element|string} elName - Element name
|
|
200
|
-
* @param {Record<string, string
|
|
201
|
-
*
|
|
238
|
+
* @param {Record<string, string>|(Node|string)[
|
|
239
|
+
* ]|((this: DOMJoiningTransformer) => void)} [atts] - Attributes,
|
|
240
|
+
* childNodes, or callback
|
|
241
|
+
* @param {(Node|string)[]|((this: DOMJoiningTransformer) => void)
|
|
242
|
+
* } [childNodes] - Child nodes or callback
|
|
243
|
+
* @param {(this: DOMJoiningTransformer) => void} [cb] - Callback
|
|
202
244
|
* @returns {DOMJoiningTransformer}
|
|
203
245
|
*/
|
|
204
|
-
element (elName, atts, cb) {
|
|
205
|
-
//
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
246
|
+
element (elName, atts, childNodes, cb) {
|
|
247
|
+
// Handle argument overloading like other transformers
|
|
248
|
+
if (Array.isArray(atts)) {
|
|
249
|
+
cb = /** @type {(this: DOMJoiningTransformer) => void} */ (
|
|
250
|
+
/** @type {unknown} */ (childNodes)
|
|
251
|
+
);
|
|
252
|
+
childNodes = atts;
|
|
253
|
+
atts = {};
|
|
254
|
+
} else if (typeof atts === 'function') {
|
|
255
|
+
cb = /** @type {(this: DOMJoiningTransformer) => void} */ (atts);
|
|
256
|
+
childNodes = [];
|
|
257
|
+
atts = {};
|
|
258
|
+
}
|
|
259
|
+
if (typeof childNodes === 'function') {
|
|
260
|
+
cb = /** @type {(this: DOMJoiningTransformer) => void} */ (childNodes);
|
|
261
|
+
childNodes = [];
|
|
262
|
+
}
|
|
210
263
|
|
|
211
264
|
if (!this.root && this._outputConfig) {
|
|
212
265
|
this.root = elName;
|
|
@@ -277,13 +330,24 @@ class DOMJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
277
330
|
|
|
278
331
|
for (const att in atts) {
|
|
279
332
|
if (Object.hasOwn(atts, att)) {
|
|
280
|
-
el.setAttribute(att, atts[att]);
|
|
333
|
+
el.setAttribute(att, this._replaceCharacterMaps(atts[att]));
|
|
281
334
|
}
|
|
282
335
|
}
|
|
283
336
|
|
|
284
337
|
const oldDOM = this._dom;
|
|
285
338
|
this._dom = el;
|
|
286
339
|
|
|
340
|
+
// Add childNodes if provided
|
|
341
|
+
if (childNodes && childNodes.length) {
|
|
342
|
+
for (const child of childNodes) {
|
|
343
|
+
if (typeof child === 'string') {
|
|
344
|
+
el.append(this._replaceCharacterMaps(child));
|
|
345
|
+
} else {
|
|
346
|
+
el.append(child);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
287
351
|
if (cb) {
|
|
288
352
|
cb.call(this);
|
|
289
353
|
}
|
|
@@ -301,7 +365,7 @@ class DOMJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
301
365
|
|
|
302
366
|
for (const att in atts) {
|
|
303
367
|
if (Object.hasOwn(atts, att)) {
|
|
304
|
-
el.setAttribute(att, atts[att]);
|
|
368
|
+
el.setAttribute(att, this._replaceCharacterMaps(atts[att]));
|
|
305
369
|
}
|
|
306
370
|
}
|
|
307
371
|
this.append(el);
|
|
@@ -310,6 +374,17 @@ class DOMJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
310
374
|
|
|
311
375
|
this._dom = el;
|
|
312
376
|
|
|
377
|
+
// Add childNodes if provided
|
|
378
|
+
if (childNodes && childNodes.length) {
|
|
379
|
+
for (const child of childNodes) {
|
|
380
|
+
if (typeof child === 'string') {
|
|
381
|
+
el.append(this._replaceCharacterMaps(child));
|
|
382
|
+
} else {
|
|
383
|
+
el.append(child);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
313
388
|
if (cb) {
|
|
314
389
|
cb.call(this);
|
|
315
390
|
}
|
|
@@ -318,6 +393,21 @@ class DOMJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
318
393
|
return this;
|
|
319
394
|
}
|
|
320
395
|
|
|
396
|
+
/**
|
|
397
|
+
* @param {string} prefix
|
|
398
|
+
* @param {string} namespaceURI
|
|
399
|
+
* @returns {DOMJoiningTransformer}
|
|
400
|
+
*/
|
|
401
|
+
namespace (prefix, namespaceURI) {
|
|
402
|
+
/** @type {Element} */
|
|
403
|
+
(this._dom).setAttributeNS(
|
|
404
|
+
'http://www.w3.org/2000/xmlns/',
|
|
405
|
+
'xmlns:' + prefix,
|
|
406
|
+
this._replaceCharacterMaps(namespaceURI)
|
|
407
|
+
);
|
|
408
|
+
return this;
|
|
409
|
+
}
|
|
410
|
+
|
|
321
411
|
/**
|
|
322
412
|
* @param {string} name
|
|
323
413
|
* @param {string} val
|
|
@@ -328,7 +418,9 @@ class DOMJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
328
418
|
this._dom.nodeType !== 1) {
|
|
329
419
|
throw new Error('You may only set an attribute on an element');
|
|
330
420
|
}
|
|
331
|
-
(/** @type {Element} */ (this._dom)).setAttribute(
|
|
421
|
+
(/** @type {Element} */ (this._dom)).setAttribute(
|
|
422
|
+
name, this._replaceCharacterMaps(val)
|
|
423
|
+
);
|
|
332
424
|
return this;
|
|
333
425
|
}
|
|
334
426
|
|
|
@@ -337,7 +429,7 @@ class DOMJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
337
429
|
* @returns {DOMJoiningTransformer}
|
|
338
430
|
*/
|
|
339
431
|
text (txt) {
|
|
340
|
-
this.append(txt);
|
|
432
|
+
this.append(this._replaceCharacterMaps(txt));
|
|
341
433
|
return this;
|
|
342
434
|
}
|
|
343
435
|
|
|
@@ -36,7 +36,7 @@ function _makeDatasetAttribute (n0) {
|
|
|
36
36
|
* plus special helpers: dataset (object) and $a (ordered attribute array).
|
|
37
37
|
* @typedef {Record<string, unknown> & {
|
|
38
38
|
* dataset?: Record<string, string>,
|
|
39
|
-
* $a?:
|
|
39
|
+
* $a?: [string, string][]
|
|
40
40
|
* }} ElementAttributes
|
|
41
41
|
*/
|
|
42
42
|
|
|
@@ -329,20 +329,6 @@ class JSONJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
329
329
|
return this;
|
|
330
330
|
}
|
|
331
331
|
|
|
332
|
-
/**
|
|
333
|
-
* @param {import('./StringJoiningTransformer.js').OutputConfig} cfg
|
|
334
|
-
* @returns {JSONJoiningTransformer}
|
|
335
|
-
*/
|
|
336
|
-
output (cfg) {
|
|
337
|
-
// We wait until first element is set in `element()` to add
|
|
338
|
-
// XML declaration and DOCTYPE as latter depends on root element
|
|
339
|
-
this._outputConfig = cfg;
|
|
340
|
-
|
|
341
|
-
// Use for file extension if making downloadable?
|
|
342
|
-
this.mediaType = cfg.mediaType;
|
|
343
|
-
return this;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
332
|
/**
|
|
347
333
|
* Build a Jamilih-style element JSON array and append to current container.
|
|
348
334
|
* Result form: ['tag', {attr: 'val'}, child1, child2, ...]
|
|
@@ -401,23 +387,35 @@ class JSONJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
401
387
|
for (const k in ds) {
|
|
402
388
|
if (Object.hasOwn(ds, k)) {
|
|
403
389
|
const dashed = k.replaceAll(camelCase, _makeDatasetAttribute);
|
|
404
|
-
attsObj['data-' + dashed] = ds[k];
|
|
390
|
+
attsObj['data-' + dashed] = this._replaceCharacterMaps(ds[k]);
|
|
405
391
|
}
|
|
406
392
|
}
|
|
407
393
|
delete attsObj.dataset;
|
|
408
394
|
}
|
|
409
395
|
if (Array.isArray(attsObj.$a)) {
|
|
410
|
-
|
|
396
|
+
attsObj.$a.forEach((pair) => {
|
|
411
397
|
if (Array.isArray(pair) && pair.length > 1) {
|
|
412
|
-
attsObj[String(pair[0])] = pair[1];
|
|
398
|
+
attsObj[String(pair[0])] = this._replaceCharacterMaps(pair[1]);
|
|
413
399
|
}
|
|
414
400
|
});
|
|
415
401
|
delete attsObj.$a;
|
|
416
402
|
}
|
|
417
403
|
|
|
404
|
+
// Apply character maps to all regular attribute values
|
|
405
|
+
for (const key in attsObj) {
|
|
406
|
+
if (Object.hasOwn(attsObj, key) && typeof attsObj[key] === 'string') {
|
|
407
|
+
attsObj[key] = this._replaceCharacterMaps(attsObj[key]);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
418
411
|
// If children provided as array, copy (may be primitives or nested JML)
|
|
419
412
|
if (Array.isArray(childNodes) && childNodes.length) {
|
|
420
|
-
jmlChildren.push(...childNodes)
|
|
413
|
+
jmlChildren.push(...childNodes.map((childNode) => {
|
|
414
|
+
if (typeof childNode === 'string') {
|
|
415
|
+
return this._replaceCharacterMaps(childNode);
|
|
416
|
+
}
|
|
417
|
+
return childNode;
|
|
418
|
+
}));
|
|
421
419
|
}
|
|
422
420
|
|
|
423
421
|
// Callback-driven building (attribute/text/nested element mutate stack)
|
|
@@ -435,9 +433,10 @@ class JSONJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
435
433
|
/** @type {any[]} */
|
|
436
434
|
const jmlEl = [elementName];
|
|
437
435
|
if (Object.keys(attsObj).length) {
|
|
438
|
-
jmlEl.push(attsObj);
|
|
436
|
+
jmlEl.push(attsObj, jmlChildren);
|
|
437
|
+
} else {
|
|
438
|
+
jmlEl.push(jmlChildren);
|
|
439
439
|
}
|
|
440
|
-
jmlEl.push(...jmlChildren);
|
|
441
440
|
|
|
442
441
|
if (isRoot) {
|
|
443
442
|
// todo: indent, cdataSectionElements
|
|
@@ -490,6 +489,29 @@ class JSONJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
490
489
|
return this;
|
|
491
490
|
}
|
|
492
491
|
|
|
492
|
+
/**
|
|
493
|
+
* @param {string} prefix
|
|
494
|
+
* @param {string} namespaceURI
|
|
495
|
+
* @returns {JSONJoiningTransformer}
|
|
496
|
+
*/
|
|
497
|
+
namespace (prefix, namespaceURI) {
|
|
498
|
+
if (!this._elementStack.length) {
|
|
499
|
+
// No-op outside an element() callback (JSON joiner semantics)
|
|
500
|
+
return this;
|
|
501
|
+
}
|
|
502
|
+
const top = /** @type {ElementInfo} */ (this._elementStack.at(-1));
|
|
503
|
+
const {attsObj} = top;
|
|
504
|
+
|
|
505
|
+
if (!attsObj.xmlns) {
|
|
506
|
+
attsObj.xmlns = {};
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/** @type {Record<string, string>} */
|
|
510
|
+
(attsObj.xmlns)[prefix] = this._replaceCharacterMaps(namespaceURI);
|
|
511
|
+
|
|
512
|
+
return this;
|
|
513
|
+
}
|
|
514
|
+
|
|
493
515
|
/**
|
|
494
516
|
* Adds/updates an attribute for the most recently open element built via
|
|
495
517
|
* a callback-driven element(). When not in an element callback context,
|
|
@@ -513,20 +535,22 @@ class JSONJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
513
535
|
for (const k in datasetObj) {
|
|
514
536
|
if (Object.hasOwn(datasetObj, k)) {
|
|
515
537
|
const dashed = k.replaceAll(camelCase, _makeDatasetAttribute);
|
|
516
|
-
attsObj['data-' + dashed] =
|
|
538
|
+
attsObj['data-' + dashed] = this._replaceCharacterMaps(
|
|
539
|
+
/** @type {string} */ (datasetObj[k])
|
|
540
|
+
);
|
|
517
541
|
}
|
|
518
542
|
}
|
|
519
543
|
return this;
|
|
520
544
|
}
|
|
521
545
|
if (name === '$a' && Array.isArray(val)) {
|
|
522
|
-
|
|
546
|
+
val.forEach((pair) => {
|
|
523
547
|
if (Array.isArray(pair) && pair.length > 1) {
|
|
524
|
-
attsObj[String(pair[0])] = pair[1];
|
|
548
|
+
attsObj[String(pair[0])] = this._replaceCharacterMaps(pair[1]);
|
|
525
549
|
}
|
|
526
550
|
});
|
|
527
551
|
return this;
|
|
528
552
|
}
|
|
529
|
-
attsObj[name] = val;
|
|
553
|
+
attsObj[name] = this._replaceCharacterMaps(/** @type {string} */ (val));
|
|
530
554
|
return this;
|
|
531
555
|
}
|
|
532
556
|
|
|
@@ -578,7 +602,7 @@ class JSONJoiningTransformer extends AbstractJoiningTransformer {
|
|
|
578
602
|
if (this._elementStack.length) {
|
|
579
603
|
const top = /** @type {ElementInfo} */ (this._elementStack.at(-1));
|
|
580
604
|
const {jmlChildren} = top;
|
|
581
|
-
jmlChildren.push(
|
|
605
|
+
jmlChildren.push(this._replaceCharacterMaps(txt));
|
|
582
606
|
return this;
|
|
583
607
|
}
|
|
584
608
|
// No-op outside element context in JSON joiner
|
|
@@ -70,6 +70,8 @@ class JSONPathTransformer {
|
|
|
70
70
|
if (len > 1) {
|
|
71
71
|
this._triggerEqualPriorityError();
|
|
72
72
|
}
|
|
73
|
+
// Set up parameter context for valueOf() access in root template
|
|
74
|
+
jte._params = {0: jte._contextObj};
|
|
73
75
|
const ret = /** @type {import('./index.js').JSONPathTemplateObject<T>} */ (
|
|
74
76
|
templateObj
|
|
75
77
|
).template.call(jte, undefined, {mode});
|