xslt-processor 3.0.0 → 3.0.2

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.
Files changed (224) hide show
  1. package/README.md +2 -2
  2. package/constants.d.ts +12 -12
  3. package/constants.js +16 -16
  4. package/dom/functions.d.ts +14 -14
  5. package/dom/functions.js +56 -57
  6. package/dom/functions.js.map +1 -1
  7. package/dom/index.d.ts +6 -6
  8. package/dom/index.js +22 -22
  9. package/dom/util.d.ts +7 -7
  10. package/dom/util.js +42 -43
  11. package/dom/util.js.map +1 -1
  12. package/dom/xdocument.d.ts +16 -16
  13. package/dom/xdocument.js +73 -74
  14. package/dom/xdocument.js.map +1 -1
  15. package/dom/xml-functions.d.ts +58 -58
  16. package/dom/xml-functions.js +369 -370
  17. package/dom/xml-functions.js.map +1 -1
  18. package/dom/xml-output-options.d.ts +6 -6
  19. package/dom/xml-output-options.js +2 -2
  20. package/dom/xml-parser.d.ts +47 -47
  21. package/dom/xml-parser.js +307 -307
  22. package/dom/xml-parser.js.map +1 -1
  23. package/dom/xmltoken.d.ts +12 -12
  24. package/dom/xmltoken.js +101 -101
  25. package/dom/xnode.d.ts +73 -73
  26. package/dom/xnode.js +450 -450
  27. package/dom/xnode.js.map +1 -1
  28. package/index.d.ts +4 -4
  29. package/index.js +12 -12
  30. package/package.json +11 -11
  31. package/test-without-jest.d.ts +1 -0
  32. package/test-without-jest.js +63 -0
  33. package/test-without-jest.js.map +1 -0
  34. package/umd/constants.d.ts +12 -12
  35. package/umd/dom/functions.d.ts +14 -14
  36. package/umd/dom/index.d.ts +6 -6
  37. package/umd/dom/util.d.ts +7 -7
  38. package/umd/dom/xdocument.d.ts +16 -16
  39. package/umd/dom/xml-functions.d.ts +58 -58
  40. package/umd/dom/xml-output-options.d.ts +6 -6
  41. package/umd/dom/xml-parser.d.ts +47 -47
  42. package/umd/dom/xmltoken.d.ts +12 -12
  43. package/umd/dom/xnode.d.ts +73 -73
  44. package/umd/index.d.ts +4 -4
  45. package/umd/test-without-jest.d.ts +1 -0
  46. package/umd/xpath/common-function.d.ts +8 -8
  47. package/umd/xpath/expr-context.d.ts +111 -111
  48. package/umd/xpath/expressions/binary-expr.d.ts +11 -11
  49. package/umd/xpath/expressions/expression.d.ts +4 -4
  50. package/umd/xpath/expressions/filter-expr.d.ts +9 -9
  51. package/umd/xpath/expressions/function-call-expr.d.ts +12 -12
  52. package/umd/xpath/expressions/index.d.ts +13 -13
  53. package/umd/xpath/expressions/literal-expr.d.ts +7 -7
  54. package/umd/xpath/expressions/location-expr.d.ts +15 -15
  55. package/umd/xpath/expressions/number-expr.d.ts +7 -7
  56. package/umd/xpath/expressions/path-expr.d.ts +9 -9
  57. package/umd/xpath/expressions/predicate-expr.d.ts +8 -8
  58. package/umd/xpath/expressions/step-expr.d.ts +25 -25
  59. package/umd/xpath/expressions/token-expr.d.ts +7 -7
  60. package/umd/xpath/expressions/unary-minus-expr.d.ts +8 -8
  61. package/umd/xpath/expressions/union-expr.d.ts +9 -9
  62. package/umd/xpath/expressions/variable-expr.d.ts +7 -7
  63. package/umd/xpath/functions/index.d.ts +2 -2
  64. package/umd/xpath/functions/internal-functions.d.ts +2 -2
  65. package/umd/xpath/functions/non-standard.d.ts +12 -12
  66. package/umd/xpath/functions/standard-20.d.ts +5 -5
  67. package/umd/xpath/functions/standard.d.ts +40 -40
  68. package/umd/xpath/grammar-rule-candidate.d.ts +8 -8
  69. package/umd/xpath/index.d.ts +3 -3
  70. package/umd/xpath/match-resolver.d.ts +55 -55
  71. package/umd/xpath/node-tests/index.d.ts +8 -8
  72. package/umd/xpath/node-tests/node-test-any.d.ts +6 -6
  73. package/umd/xpath/node-tests/node-test-comment.d.ts +6 -6
  74. package/umd/xpath/node-tests/node-test-element-or-attribute.d.ts +6 -6
  75. package/umd/xpath/node-tests/node-test-name.d.ts +10 -10
  76. package/umd/xpath/node-tests/node-test-nc.d.ts +9 -9
  77. package/umd/xpath/node-tests/node-test-pi.d.ts +8 -8
  78. package/umd/xpath/node-tests/node-test-text.d.ts +6 -6
  79. package/umd/xpath/node-tests/node-test.d.ts +5 -5
  80. package/umd/xpath/tokens.d.ts +62 -62
  81. package/umd/xpath/values/boolean-value.d.ts +11 -11
  82. package/umd/xpath/values/index.d.ts +5 -5
  83. package/umd/xpath/values/node-set-value.d.ts +11 -11
  84. package/umd/xpath/values/node-value.d.ts +7 -7
  85. package/umd/xpath/values/number-value.d.ts +11 -11
  86. package/umd/xpath/values/string-value.d.ts +11 -11
  87. package/umd/xpath/xpath-grammar-rules.d.ts +68 -68
  88. package/umd/xpath/xpath-token-rule.d.ts +7 -7
  89. package/umd/xpath/xpath.d.ts +174 -170
  90. package/umd/xpathdebug.d.ts +2 -2
  91. package/umd/xslt/index.d.ts +3 -3
  92. package/umd/xslt/xslt-decimal-format-settings.d.ts +28 -28
  93. package/umd/xslt/xslt-options.d.ts +7 -7
  94. package/umd/xslt/xslt-parameter.d.ts +5 -5
  95. package/umd/xslt/xslt.d.ts +207 -190
  96. package/umd/xslt-processor.js +1 -15
  97. package/umd/xslt-processor.js.map +1 -1
  98. package/xpath/common-function.d.ts +8 -8
  99. package/xpath/common-function.js +31 -32
  100. package/xpath/common-function.js.map +1 -1
  101. package/xpath/expr-context.d.ts +111 -111
  102. package/xpath/expr-context.js +189 -189
  103. package/xpath/expr-context.js.map +1 -1
  104. package/xpath/expressions/binary-expr.d.ts +11 -11
  105. package/xpath/expressions/binary-expr.js +165 -165
  106. package/xpath/expressions/binary-expr.js.map +1 -1
  107. package/xpath/expressions/expression.d.ts +4 -4
  108. package/xpath/expressions/expression.js +9 -9
  109. package/xpath/expressions/filter-expr.d.ts +9 -9
  110. package/xpath/expressions/filter-expr.js +52 -52
  111. package/xpath/expressions/filter-expr.js.map +1 -1
  112. package/xpath/expressions/function-call-expr.d.ts +12 -12
  113. package/xpath/expressions/function-call-expr.js +95 -95
  114. package/xpath/expressions/function-call-expr.js.map +1 -1
  115. package/xpath/expressions/index.d.ts +13 -13
  116. package/xpath/expressions/index.js +29 -29
  117. package/xpath/expressions/literal-expr.d.ts +7 -7
  118. package/xpath/expressions/literal-expr.js +33 -33
  119. package/xpath/expressions/literal-expr.js.map +1 -1
  120. package/xpath/expressions/location-expr.d.ts +15 -15
  121. package/xpath/expressions/location-expr.js +98 -98
  122. package/xpath/expressions/location-expr.js.map +1 -1
  123. package/xpath/expressions/number-expr.d.ts +7 -7
  124. package/xpath/expressions/number-expr.js +33 -33
  125. package/xpath/expressions/number-expr.js.map +1 -1
  126. package/xpath/expressions/path-expr.d.ts +9 -9
  127. package/xpath/expressions/path-expr.js +51 -51
  128. package/xpath/expressions/path-expr.js.map +1 -1
  129. package/xpath/expressions/predicate-expr.d.ts +8 -8
  130. package/xpath/expressions/predicate-expr.js +40 -40
  131. package/xpath/expressions/predicate-expr.js.map +1 -1
  132. package/xpath/expressions/step-expr.d.ts +25 -25
  133. package/xpath/expressions/step-expr.js +280 -280
  134. package/xpath/expressions/step-expr.js.map +1 -1
  135. package/xpath/expressions/token-expr.d.ts +7 -7
  136. package/xpath/expressions/token-expr.js +33 -33
  137. package/xpath/expressions/token-expr.js.map +1 -1
  138. package/xpath/expressions/unary-minus-expr.d.ts +8 -8
  139. package/xpath/expressions/unary-minus-expr.js +33 -33
  140. package/xpath/expressions/unary-minus-expr.js.map +1 -1
  141. package/xpath/expressions/union-expr.d.ts +9 -9
  142. package/xpath/expressions/union-expr.js +50 -50
  143. package/xpath/expressions/union-expr.js.map +1 -1
  144. package/xpath/expressions/variable-expr.d.ts +7 -7
  145. package/xpath/expressions/variable-expr.js +32 -32
  146. package/xpath/expressions/variable-expr.js.map +1 -1
  147. package/xpath/functions/index.d.ts +2 -2
  148. package/xpath/functions/index.js +18 -18
  149. package/xpath/functions/internal-functions.d.ts +2 -2
  150. package/xpath/functions/internal-functions.js +21 -22
  151. package/xpath/functions/internal-functions.js.map +1 -1
  152. package/xpath/functions/non-standard.d.ts +12 -12
  153. package/xpath/functions/non-standard.js +44 -45
  154. package/xpath/functions/non-standard.js.map +1 -1
  155. package/xpath/functions/standard-20.d.ts +5 -5
  156. package/xpath/functions/standard-20.js +25 -26
  157. package/xpath/functions/standard-20.js.map +1 -1
  158. package/xpath/functions/standard.d.ts +40 -40
  159. package/xpath/functions/standard.js +441 -442
  160. package/xpath/functions/standard.js.map +1 -1
  161. package/xpath/grammar-rule-candidate.d.ts +8 -8
  162. package/xpath/grammar-rule-candidate.js +2 -2
  163. package/xpath/index.d.ts +3 -3
  164. package/xpath/index.js +19 -19
  165. package/xpath/match-resolver.d.ts +55 -55
  166. package/xpath/match-resolver.js +136 -136
  167. package/xpath/match-resolver.js.map +1 -1
  168. package/xpath/node-tests/index.d.ts +8 -8
  169. package/xpath/node-tests/index.js +17 -17
  170. package/xpath/node-tests/node-test-any.d.ts +6 -6
  171. package/xpath/node-tests/node-test-any.js +14 -14
  172. package/xpath/node-tests/node-test-comment.d.ts +6 -6
  173. package/xpath/node-tests/node-test-comment.js +14 -14
  174. package/xpath/node-tests/node-test-element-or-attribute.d.ts +6 -6
  175. package/xpath/node-tests/node-test-element-or-attribute.js +15 -15
  176. package/xpath/node-tests/node-test-name.d.ts +10 -10
  177. package/xpath/node-tests/node-test-name.js +38 -38
  178. package/xpath/node-tests/node-test-name.js.map +1 -1
  179. package/xpath/node-tests/node-test-nc.d.ts +9 -9
  180. package/xpath/node-tests/node-test-nc.js +16 -16
  181. package/xpath/node-tests/node-test-pi.d.ts +8 -8
  182. package/xpath/node-tests/node-test-pi.js +16 -16
  183. package/xpath/node-tests/node-test-pi.js.map +1 -1
  184. package/xpath/node-tests/node-test-text.d.ts +6 -6
  185. package/xpath/node-tests/node-test-text.js +14 -14
  186. package/xpath/node-tests/node-test.d.ts +5 -5
  187. package/xpath/node-tests/node-test.js +2 -2
  188. package/xpath/tokens.d.ts +62 -62
  189. package/xpath/tokens.js +300 -300
  190. package/xpath/tokens.js.map +1 -1
  191. package/xpath/values/boolean-value.d.ts +11 -11
  192. package/xpath/values/boolean-value.js +23 -23
  193. package/xpath/values/index.d.ts +5 -5
  194. package/xpath/values/index.js +46 -46
  195. package/xpath/values/node-set-value.d.ts +11 -11
  196. package/xpath/values/node-set-value.js +27 -27
  197. package/xpath/values/node-set-value.js.map +1 -1
  198. package/xpath/values/node-value.d.ts +7 -7
  199. package/xpath/values/node-value.js +2 -2
  200. package/xpath/values/number-value.d.ts +11 -11
  201. package/xpath/values/number-value.js +23 -23
  202. package/xpath/values/string-value.d.ts +11 -11
  203. package/xpath/values/string-value.js +23 -23
  204. package/xpath/xpath-grammar-rules.d.ts +68 -68
  205. package/xpath/xpath-grammar-rules.js +74 -74
  206. package/xpath/xpath-token-rule.d.ts +7 -7
  207. package/xpath/xpath-token-rule.js +2 -2
  208. package/xpath/xpath.d.ts +174 -170
  209. package/xpath/xpath.js +911 -909
  210. package/xpath/xpath.js.map +1 -1
  211. package/xpathdebug.d.ts +2 -2
  212. package/xpathdebug.js +187 -187
  213. package/xpathdebug.js.map +1 -1
  214. package/xslt/index.d.ts +3 -3
  215. package/xslt/index.js +19 -19
  216. package/xslt/xslt-decimal-format-settings.d.ts +28 -28
  217. package/xslt/xslt-decimal-format-settings.js +2 -2
  218. package/xslt/xslt-options.d.ts +7 -7
  219. package/xslt/xslt-options.js +2 -2
  220. package/xslt/xslt-parameter.d.ts +5 -5
  221. package/xslt/xslt-parameter.js +2 -2
  222. package/xslt/xslt.d.ts +207 -190
  223. package/xslt/xslt.js +1135 -1079
  224. package/xslt/xslt.js.map +1 -1
@@ -1,443 +1,442 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.xmlToJson = exports._true = exports.translate = exports.sum = exports.substringBefore = exports.substringAfter = exports.substring = exports.stringLength = exports._string = exports.startsWith = exports.round = exports.position = exports.number = exports.not = exports.normalizeSpace = exports.namespaceUri = exports._name = exports.matches = exports.localName = exports.last = exports.lang = exports.id = exports.generateId = exports.floor = exports.formatNumber = exports._false = exports.endsWith = exports.current = exports.count = exports.contains = exports.concat = exports.ceiling = exports.boolean = void 0;
4
- var dom_1 = require("../../dom");
5
- var values_1 = require("../values");
6
- var internal_functions_1 = require("./internal-functions");
7
- /* Support functions. They are not exported. */
8
- function cyrb53(str, seed) {
9
- if (seed === void 0) { seed = 0; }
10
- var h1 = 0xdeadbeef ^ seed;
11
- var h2 = 0x41c6ce57 ^ seed;
12
- for (var i = 0, ch = void 0; i < str.length; i++) {
13
- ch = str.charCodeAt(i);
14
- h1 = Math.imul(h1 ^ ch, 2654435761);
15
- h2 = Math.imul(h2 ^ ch, 1597334677);
16
- }
17
- h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);
18
- h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);
19
- h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);
20
- h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);
21
- return 4294967296 * (2097151 & h2) + (h1 >>> 0);
22
- }
23
- // Exported functions.
24
- // In theory none of the `this.args` should work here,
25
- // but `this` is replaced on `FunctionCallExpr.evaluate()`
26
- // executes.
27
- function boolean(context) {
28
- (0, internal_functions_1.assert)(this.args.length === 1);
29
- return new values_1.BooleanValue(this.args[0].evaluate(context).booleanValue());
30
- }
31
- exports.boolean = boolean;
32
- function ceiling(context) {
33
- (0, internal_functions_1.assert)(this.args.length === 1);
34
- var num = this.args[0].evaluate(context).numberValue();
35
- return new values_1.NumberValue(Math.ceil(num));
36
- }
37
- exports.ceiling = ceiling;
38
- function concat(context) {
39
- var ret = '';
40
- for (var i = 0; i < this.args.length; ++i) {
41
- ret += this.args[i].evaluate(context).stringValue();
42
- }
43
- return new values_1.StringValue(ret);
44
- }
45
- exports.concat = concat;
46
- function contains(context) {
47
- (0, internal_functions_1.assert)(this.args.length === 2);
48
- var s0 = this.args[0].evaluate(context).stringValue();
49
- var s1 = this.args[1].evaluate(context).stringValue();
50
- return new values_1.BooleanValue(s0.includes(s1));
51
- }
52
- exports.contains = contains;
53
- function count(context) {
54
- (0, internal_functions_1.assert)(this.args.length === 1);
55
- var v = this.args[0].evaluate(context);
56
- return new values_1.NumberValue(v.nodeSetValue().length);
57
- }
58
- exports.count = count;
59
- function current(context) {
60
- (0, internal_functions_1.assert)(this.args.length === 0);
61
- return new values_1.NodeSetValue([context.nodeList[context.position]]);
62
- }
63
- exports.current = current;
64
- function endsWith(context) {
65
- (0, internal_functions_1.assert)(this.args.length === 2);
66
- var s0 = this.args[0].evaluate(context).stringValue();
67
- var s1 = this.args[1].evaluate(context).stringValue();
68
- var re = new RegExp("".concat((0, internal_functions_1.regExpEscape)(s1), "$"));
69
- return new values_1.BooleanValue(re.test(s0));
70
- }
71
- exports.endsWith = endsWith;
72
- function _false() {
73
- (0, internal_functions_1.assert)(this.args.length === 0);
74
- return new values_1.BooleanValue(false);
75
- }
76
- exports._false = _false;
77
- /**
78
- * Formats the integer part of a number. Used by `formatNumber`.
79
- * @param _number The integer part of the number.
80
- * @param _mask The mask provided.
81
- * @returns The formatted integer part of the number as a string.
82
- */
83
- function formatNumberIntegerPart(_number, _mask, settings) {
84
- var formattedIntegerPart = "";
85
- var lastMaskPlaceholder = "";
86
- var numberPosition = _number.length - 1;
87
- for (var i = _mask.length - 1; i >= 0; i--) {
88
- lastMaskPlaceholder = _mask[i];
89
- switch (lastMaskPlaceholder) {
90
- case '#':
91
- formattedIntegerPart = _number[numberPosition] + formattedIntegerPart;
92
- numberPosition--;
93
- break;
94
- case '0':
95
- formattedIntegerPart = _number[numberPosition] + formattedIntegerPart;
96
- numberPosition--;
97
- break;
98
- case ',':
99
- formattedIntegerPart = settings.groupingSeparator + formattedIntegerPart;
100
- break;
101
- }
102
- }
103
- for (; numberPosition >= 0; numberPosition--) {
104
- formattedIntegerPart = _number[numberPosition] + formattedIntegerPart;
105
- }
106
- return formattedIntegerPart;
107
- }
108
- /**
109
- * Formats the decimal part of a number. Used by `formatNumber`.
110
- * @param _number The decimal part of the number.
111
- * @param _mask The mask provided.
112
- * @returns The formatted decimal part of the number as a string.
113
- */
114
- function formatNumberDecimalPart(_number, _mask, settings) {
115
- var formattedDecimalPart = "";
116
- // eslint-disable-next-line no-unused-vars
117
- var _settings = settings;
118
- if (_mask === null || _mask === undefined) {
119
- return formattedDecimalPart;
120
- }
121
- var i = 0;
122
- for (; i < _mask.length; i++) {
123
- switch (_mask[i]) {
124
- case '#':
125
- formattedDecimalPart += _number[i];
126
- break;
127
- case '0':
128
- if (i >= _number.length) {
129
- formattedDecimalPart += '0';
130
- }
131
- else {
132
- formattedDecimalPart += _number[i];
133
- }
134
- break;
135
- }
136
- }
137
- return formattedDecimalPart;
138
- }
139
- /**
140
- * XPath `format-number` function implementation.
141
- * @param context The Expression Context.
142
- * @returns A formatted number as string.
143
- */
144
- function formatNumber(context) {
145
- (0, internal_functions_1.assert)(this.args.length >= 2 && this.args.length < 4);
146
- var firstArgument = this.args[0].evaluate(context).stringValue();
147
- var secondArgument = this.args[1].evaluate(context).stringValue();
148
- var numberTest = parseFloat(firstArgument);
149
- if (isNaN(numberTest)) {
150
- return new values_1.StringValue(context.decimalFormatSettings.naN);
151
- }
152
- var numberParts = String(numberTest).split('.');
153
- var maskParts = secondArgument.split('.');
154
- switch (numberParts.length) {
155
- case 1: // Integer
156
- return new values_1.StringValue(formatNumberIntegerPart(numberParts[0], maskParts[0], context.decimalFormatSettings));
157
- case 2: // Decimal
158
- var decimalPart = formatNumberDecimalPart(numberParts[1], maskParts.length === 2 ? maskParts[1] : undefined, context.decimalFormatSettings);
159
- if (decimalPart.length === 0) {
160
- return new values_1.StringValue(formatNumberIntegerPart(numberParts[0], maskParts[0], context.decimalFormatSettings));
161
- }
162
- return new values_1.StringValue(formatNumberIntegerPart(numberParts[0], maskParts[0], context.decimalFormatSettings) +
163
- context.decimalFormatSettings.decimalSeparator +
164
- decimalPart);
165
- }
166
- }
167
- exports.formatNumber = formatNumber;
168
- function floor(context) {
169
- (0, internal_functions_1.assert)(this.args.length === 1);
170
- var num = this.args[0].evaluate(context).numberValue();
171
- return new values_1.NumberValue(Math.floor(num));
172
- }
173
- exports.floor = floor;
174
- function generateId(context) {
175
- return new values_1.StringValue('A' + cyrb53(JSON.stringify(context.nodeList[context.position].id)));
176
- }
177
- exports.generateId = generateId;
178
- function id(context) {
179
- (0, internal_functions_1.assert)(this.args.length === 1);
180
- var e = this.args[0].evaluate(context);
181
- var ret = [];
182
- var ids;
183
- if (e.type == 'node-set') {
184
- ids = [];
185
- var en = e.nodeSetValue();
186
- for (var i = 0; i < en.length; ++i) {
187
- var v = (0, dom_1.xmlValue)(en[i]).split(/\s+/);
188
- for (var ii = 0; ii < v.length; ++ii) {
189
- ids.push(v[ii]);
190
- }
191
- }
192
- }
193
- else {
194
- ids = e.stringValue().split(/\s+/);
195
- }
196
- var d = context.root;
197
- for (var i = 0; i < ids.length; ++i) {
198
- var n = d.getElementById(ids[i]);
199
- if (n) {
200
- ret.push(n);
201
- }
202
- }
203
- return new values_1.NodeSetValue(ret);
204
- }
205
- exports.id = id;
206
- function lang(context) {
207
- (0, internal_functions_1.assert)(this.args.length === 1);
208
- var lang = this.args[0].evaluate(context).stringValue();
209
- var xmlLang;
210
- var n = context.nodeList[context.position];
211
- while (n && n != n.parentNode /* just in case ... */) {
212
- xmlLang = n.getAttributeValue('xml:lang');
213
- if (xmlLang) {
214
- break;
215
- }
216
- n = n.parentNode;
217
- }
218
- if (!xmlLang) {
219
- return new values_1.BooleanValue(false);
220
- }
221
- var re = new RegExp("^".concat(lang, "$"), 'i');
222
- return new values_1.BooleanValue(xmlLang.match(re) || xmlLang.replace(/_.*$/, '').match(re));
223
- }
224
- exports.lang = lang;
225
- function last(context) {
226
- (0, internal_functions_1.assert)(this.args.length === 0);
227
- // NOTE(mesch): XPath position starts at 1.
228
- return new values_1.NumberValue(context.contextSize());
229
- }
230
- exports.last = last;
231
- function localName(context) {
232
- (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
233
- var n;
234
- if (this.args.length == 0) {
235
- n = [context.nodeList[context.position]];
236
- }
237
- else {
238
- n = this.args[0].evaluate(context).nodeSetValue();
239
- }
240
- if (n.length === 0) {
241
- return new values_1.StringValue('');
242
- }
243
- return new values_1.StringValue(n[0].localName);
244
- }
245
- exports.localName = localName;
246
- function matches(context) {
247
- (0, internal_functions_1.assert)(this.args.length >= 2);
248
- var s0 = this.args[0].evaluate(context).stringValue();
249
- var s1 = this.args[1].evaluate(context).stringValue();
250
- var s2;
251
- if (this.args.length > 2) {
252
- s2 = this.args[2].evaluate(context).stringValue();
253
- if (/[^mi]/.test(s2)) {
254
- throw new Error("Invalid regular expression syntax: ".concat(s2));
255
- }
256
- }
257
- var re;
258
- try {
259
- re = new RegExp(s1, s2);
260
- }
261
- catch (e) {
262
- throw new Error("Invalid matches argument: ".concat(s1));
263
- }
264
- return new values_1.BooleanValue(re.test(s0));
265
- }
266
- exports.matches = matches;
267
- function _name(context) {
268
- (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
269
- var n;
270
- if (this.args.length === 0) {
271
- n = [context.nodeList[context.position]];
272
- }
273
- else {
274
- n = this.args[0].evaluate(context).nodeSetValue();
275
- }
276
- if (n.length === 0) {
277
- return new values_1.StringValue('');
278
- }
279
- return new values_1.StringValue(n[0].nodeName);
280
- }
281
- exports._name = _name;
282
- function namespaceUri(context) {
283
- (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
284
- var nodes;
285
- if (this.args.length === 0) {
286
- nodes = [context.nodeList[context.position]];
287
- }
288
- else {
289
- nodes = this.args[0].evaluate(context).nodeSetValue();
290
- }
291
- if (nodes.length === 0) {
292
- return new values_1.StringValue('');
293
- }
294
- return new values_1.StringValue(nodes[0].namespaceUri || '');
295
- }
296
- exports.namespaceUri = namespaceUri;
297
- function normalizeSpace(context) {
298
- var s;
299
- if (this.args.length > 0) {
300
- s = this.args[0].evaluate(context).stringValue();
301
- }
302
- else {
303
- s = new values_1.NodeSetValue([context.nodeList[context.position]]).stringValue();
304
- }
305
- s = s.replace(/^\s*/, '').replace(/\s*$/, '').replace(/\s+/g, ' ');
306
- return new values_1.StringValue(s);
307
- }
308
- exports.normalizeSpace = normalizeSpace;
309
- function not(context) {
310
- (0, internal_functions_1.assert)(this.args.length === 1);
311
- var ret = !this.args[0].evaluate(context).booleanValue();
312
- return new values_1.BooleanValue(ret);
313
- }
314
- exports.not = not;
315
- function number(context) {
316
- (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
317
- if (this.args.length === 1) {
318
- return new values_1.NumberValue(this.args[0].evaluate(context).numberValue());
319
- }
320
- return new values_1.NumberValue(new values_1.NodeSetValue([context.nodeList[context.position]]).numberValue());
321
- }
322
- exports.number = number;
323
- function position(context) {
324
- (0, internal_functions_1.assert)(this.args.length === 0);
325
- // NOTE(mesch): XPath position starts at 1.
326
- return new values_1.NumberValue(context.position + 1);
327
- }
328
- exports.position = position;
329
- function round(context) {
330
- (0, internal_functions_1.assert)(this.args.length === 1);
331
- var num = this.args[0].evaluate(context).numberValue();
332
- return new values_1.NumberValue(Math.round(num));
333
- }
334
- exports.round = round;
335
- function startsWith(context) {
336
- (0, internal_functions_1.assert)(this.args.length == 2);
337
- var s0 = this.args[0].evaluate(context).stringValue();
338
- var s1 = this.args[1].evaluate(context).stringValue();
339
- return new values_1.BooleanValue(s0.indexOf(s1) === 0);
340
- }
341
- exports.startsWith = startsWith;
342
- function _string(context) {
343
- (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
344
- if (this.args.length === 0) {
345
- return new values_1.StringValue(new values_1.NodeSetValue([context.nodeList[context.position]]).stringValue());
346
- }
347
- return new values_1.StringValue(this.args[0].evaluate(context).stringValue());
348
- }
349
- exports._string = _string;
350
- function stringLength(context) {
351
- var s;
352
- if (this.args.length > 0) {
353
- s = this.args[0].evaluate(context).stringValue();
354
- }
355
- else {
356
- s = new values_1.NodeSetValue([context.nodeList[context.position]]).stringValue();
357
- }
358
- return new values_1.NumberValue(s.length);
359
- }
360
- exports.stringLength = stringLength;
361
- function substring(context) {
362
- // NOTE: XPath defines the position of the first character in a
363
- // string to be 1, in JavaScript this is 0 ([XPATH] Section 4.2).
364
- (0, internal_functions_1.assert)(this.args.length === 2 || this.args.length === 3);
365
- var s0 = this.args[0].evaluate(context).stringValue();
366
- var s1 = this.args[1].evaluate(context).numberValue();
367
- var ret;
368
- if (this.args.length === 2) {
369
- var i1 = Math.max(0, Math.round(s1) - 1);
370
- ret = s0.substr(i1);
371
- }
372
- else {
373
- var s2 = this.args[2].evaluate(context).numberValue();
374
- var i0 = Math.round(s1) - 1;
375
- var i1 = Math.max(0, i0);
376
- var i2 = Math.round(s2) - Math.max(0, -i0);
377
- ret = s0.substr(i1, i2);
378
- }
379
- return new values_1.StringValue(ret);
380
- }
381
- exports.substring = substring;
382
- function substringAfter(context) {
383
- (0, internal_functions_1.assert)(this.args.length === 2);
384
- var s0 = this.args[0].evaluate(context).stringValue();
385
- var s1 = this.args[1].evaluate(context).stringValue();
386
- var i = s0.indexOf(s1);
387
- var ret;
388
- if (i === -1) {
389
- ret = '';
390
- }
391
- else {
392
- ret = s0.substr(i + s1.length);
393
- }
394
- return new values_1.StringValue(ret);
395
- }
396
- exports.substringAfter = substringAfter;
397
- function substringBefore(context) {
398
- (0, internal_functions_1.assert)(this.args.length === 2);
399
- var s0 = this.args[0].evaluate(context).stringValue();
400
- var s1 = this.args[1].evaluate(context).stringValue();
401
- var i = s0.indexOf(s1);
402
- var ret;
403
- if (i === -1) {
404
- ret = '';
405
- }
406
- else {
407
- ret = s0.substr(0, i);
408
- }
409
- return new values_1.StringValue(ret);
410
- }
411
- exports.substringBefore = substringBefore;
412
- function sum(context) {
413
- (0, internal_functions_1.assert)(this.args.length === 1);
414
- var n = this.args[0].evaluate(context).nodeSetValue();
415
- var sum = 0;
416
- for (var i = 0; i < n.length; ++i) {
417
- sum += parseInt((0, dom_1.xmlValue)(n[i])) - 0;
418
- }
419
- return new values_1.NumberValue(sum);
420
- }
421
- exports.sum = sum;
422
- function translate(context) {
423
- (0, internal_functions_1.assert)(this.args.length === 3);
424
- var s0 = this.args[0].evaluate(context).stringValue();
425
- var s1 = this.args[1].evaluate(context).stringValue();
426
- var s2 = this.args[2].evaluate(context).stringValue();
427
- for (var i = 0; i < s1.length; ++i) {
428
- s0 = s0.replace(new RegExp(s1.charAt(i), 'g'), s2.charAt(i));
429
- }
430
- return new values_1.StringValue(s0);
431
- }
432
- exports.translate = translate;
433
- function _true() {
434
- (0, internal_functions_1.assert)(this.args.length === 0);
435
- return new values_1.BooleanValue(true);
436
- }
437
- exports._true = _true;
438
- function xmlToJson(context) {
439
- (0, internal_functions_1.assert)(this.args.length < 2);
440
- return new values_1.StringValue(JSON.stringify(!this.args.length ? 'null' : (0, dom_1.xmlValue)(context.nodeList[context.position])));
441
- }
442
- exports.xmlToJson = xmlToJson;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.boolean = boolean;
4
+ exports.ceiling = ceiling;
5
+ exports.concat = concat;
6
+ exports.contains = contains;
7
+ exports.count = count;
8
+ exports.current = current;
9
+ exports.endsWith = endsWith;
10
+ exports._false = _false;
11
+ exports.formatNumber = formatNumber;
12
+ exports.floor = floor;
13
+ exports.generateId = generateId;
14
+ exports.id = id;
15
+ exports.lang = lang;
16
+ exports.last = last;
17
+ exports.localName = localName;
18
+ exports.matches = matches;
19
+ exports._name = _name;
20
+ exports.namespaceUri = namespaceUri;
21
+ exports.normalizeSpace = normalizeSpace;
22
+ exports.not = not;
23
+ exports.number = number;
24
+ exports.position = position;
25
+ exports.round = round;
26
+ exports.startsWith = startsWith;
27
+ exports._string = _string;
28
+ exports.stringLength = stringLength;
29
+ exports.substring = substring;
30
+ exports.substringAfter = substringAfter;
31
+ exports.substringBefore = substringBefore;
32
+ exports.sum = sum;
33
+ exports.translate = translate;
34
+ exports._true = _true;
35
+ exports.xmlToJson = xmlToJson;
36
+ var dom_1 = require("../../dom");
37
+ var values_1 = require("../values");
38
+ var internal_functions_1 = require("./internal-functions");
39
+ /* Support functions. They are not exported. */
40
+ function cyrb53(str, seed) {
41
+ if (seed === void 0) { seed = 0; }
42
+ var h1 = 0xdeadbeef ^ seed;
43
+ var h2 = 0x41c6ce57 ^ seed;
44
+ for (var i = 0, ch = void 0; i < str.length; i++) {
45
+ ch = str.charCodeAt(i);
46
+ h1 = Math.imul(h1 ^ ch, 2654435761);
47
+ h2 = Math.imul(h2 ^ ch, 1597334677);
48
+ }
49
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);
50
+ h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);
51
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);
52
+ h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);
53
+ return 4294967296 * (2097151 & h2) + (h1 >>> 0);
54
+ }
55
+ // Exported functions.
56
+ // In theory none of the `this.args` should work here,
57
+ // but `this` is replaced on `FunctionCallExpr.evaluate()`
58
+ // executes.
59
+ function boolean(context) {
60
+ (0, internal_functions_1.assert)(this.args.length === 1);
61
+ return new values_1.BooleanValue(this.args[0].evaluate(context).booleanValue());
62
+ }
63
+ function ceiling(context) {
64
+ (0, internal_functions_1.assert)(this.args.length === 1);
65
+ var num = this.args[0].evaluate(context).numberValue();
66
+ return new values_1.NumberValue(Math.ceil(num));
67
+ }
68
+ function concat(context) {
69
+ var ret = '';
70
+ for (var i = 0; i < this.args.length; ++i) {
71
+ ret += this.args[i].evaluate(context).stringValue();
72
+ }
73
+ return new values_1.StringValue(ret);
74
+ }
75
+ function contains(context) {
76
+ (0, internal_functions_1.assert)(this.args.length === 2);
77
+ var s0 = this.args[0].evaluate(context).stringValue();
78
+ var s1 = this.args[1].evaluate(context).stringValue();
79
+ return new values_1.BooleanValue(s0.includes(s1));
80
+ }
81
+ function count(context) {
82
+ (0, internal_functions_1.assert)(this.args.length === 1);
83
+ var v = this.args[0].evaluate(context);
84
+ return new values_1.NumberValue(v.nodeSetValue().length);
85
+ }
86
+ function current(context) {
87
+ (0, internal_functions_1.assert)(this.args.length === 0);
88
+ return new values_1.NodeSetValue([context.nodeList[context.position]]);
89
+ }
90
+ function endsWith(context) {
91
+ (0, internal_functions_1.assert)(this.args.length === 2);
92
+ var s0 = this.args[0].evaluate(context).stringValue();
93
+ var s1 = this.args[1].evaluate(context).stringValue();
94
+ var re = new RegExp("".concat((0, internal_functions_1.regExpEscape)(s1), "$"));
95
+ return new values_1.BooleanValue(re.test(s0));
96
+ }
97
+ function _false() {
98
+ (0, internal_functions_1.assert)(this.args.length === 0);
99
+ return new values_1.BooleanValue(false);
100
+ }
101
+ /**
102
+ * Formats the integer part of a number. Used by `formatNumber`.
103
+ * @param _number The integer part of the number.
104
+ * @param _mask The mask provided.
105
+ * @returns The formatted integer part of the number as a string.
106
+ */
107
+ function formatNumberIntegerPart(_number, _mask, settings) {
108
+ var formattedIntegerPart = "";
109
+ var lastMaskPlaceholder = "";
110
+ var numberPosition = _number.length - 1;
111
+ for (var i = _mask.length - 1; i >= 0; i--) {
112
+ lastMaskPlaceholder = _mask[i];
113
+ switch (lastMaskPlaceholder) {
114
+ case '#':
115
+ formattedIntegerPart = _number[numberPosition] + formattedIntegerPart;
116
+ numberPosition--;
117
+ break;
118
+ case '0':
119
+ formattedIntegerPart = _number[numberPosition] + formattedIntegerPart;
120
+ numberPosition--;
121
+ break;
122
+ case ',':
123
+ formattedIntegerPart = settings.groupingSeparator + formattedIntegerPart;
124
+ break;
125
+ }
126
+ }
127
+ for (; numberPosition >= 0; numberPosition--) {
128
+ formattedIntegerPart = _number[numberPosition] + formattedIntegerPart;
129
+ }
130
+ return formattedIntegerPart;
131
+ }
132
+ /**
133
+ * Formats the decimal part of a number. Used by `formatNumber`.
134
+ * @param _number The decimal part of the number.
135
+ * @param _mask The mask provided.
136
+ * @returns The formatted decimal part of the number as a string.
137
+ */
138
+ function formatNumberDecimalPart(_number, _mask, settings) {
139
+ var formattedDecimalPart = "";
140
+ // eslint-disable-next-line no-unused-vars
141
+ var _settings = settings;
142
+ if (_mask === null || _mask === undefined) {
143
+ return formattedDecimalPart;
144
+ }
145
+ var i = 0;
146
+ for (; i < _mask.length; i++) {
147
+ switch (_mask[i]) {
148
+ case '#':
149
+ formattedDecimalPart += _number[i];
150
+ break;
151
+ case '0':
152
+ if (i >= _number.length) {
153
+ formattedDecimalPart += '0';
154
+ }
155
+ else {
156
+ formattedDecimalPart += _number[i];
157
+ }
158
+ break;
159
+ }
160
+ }
161
+ return formattedDecimalPart;
162
+ }
163
+ /**
164
+ * XPath `format-number` function implementation.
165
+ * @param context The Expression Context.
166
+ * @returns A formatted number as string.
167
+ */
168
+ function formatNumber(context) {
169
+ (0, internal_functions_1.assert)(this.args.length >= 2 && this.args.length < 4);
170
+ var firstArgument = this.args[0].evaluate(context).stringValue();
171
+ var secondArgument = this.args[1].evaluate(context).stringValue();
172
+ var numberTest = parseFloat(firstArgument);
173
+ if (isNaN(numberTest)) {
174
+ return new values_1.StringValue(context.decimalFormatSettings.naN);
175
+ }
176
+ var numberParts = String(numberTest).split('.');
177
+ var maskParts = secondArgument.split('.');
178
+ switch (numberParts.length) {
179
+ case 1: // Integer
180
+ return new values_1.StringValue(formatNumberIntegerPart(numberParts[0], maskParts[0], context.decimalFormatSettings));
181
+ case 2: // Decimal
182
+ var decimalPart = formatNumberDecimalPart(numberParts[1], maskParts.length === 2 ? maskParts[1] : undefined, context.decimalFormatSettings);
183
+ if (decimalPart.length === 0) {
184
+ return new values_1.StringValue(formatNumberIntegerPart(numberParts[0], maskParts[0], context.decimalFormatSettings));
185
+ }
186
+ return new values_1.StringValue(formatNumberIntegerPart(numberParts[0], maskParts[0], context.decimalFormatSettings) +
187
+ context.decimalFormatSettings.decimalSeparator +
188
+ decimalPart);
189
+ }
190
+ }
191
+ function floor(context) {
192
+ (0, internal_functions_1.assert)(this.args.length === 1);
193
+ var num = this.args[0].evaluate(context).numberValue();
194
+ return new values_1.NumberValue(Math.floor(num));
195
+ }
196
+ function generateId(context) {
197
+ return new values_1.StringValue('A' + cyrb53(JSON.stringify(context.nodeList[context.position].id)));
198
+ }
199
+ function id(context) {
200
+ (0, internal_functions_1.assert)(this.args.length === 1);
201
+ var e = this.args[0].evaluate(context);
202
+ var ret = [];
203
+ var ids;
204
+ if (e.type == 'node-set') {
205
+ ids = [];
206
+ var en = e.nodeSetValue();
207
+ for (var i = 0; i < en.length; ++i) {
208
+ var v = (0, dom_1.xmlValue)(en[i]).split(/\s+/);
209
+ for (var ii = 0; ii < v.length; ++ii) {
210
+ ids.push(v[ii]);
211
+ }
212
+ }
213
+ }
214
+ else {
215
+ ids = e.stringValue().split(/\s+/);
216
+ }
217
+ var d = context.root;
218
+ for (var i = 0; i < ids.length; ++i) {
219
+ var n = d.getElementById(ids[i]);
220
+ if (n) {
221
+ ret.push(n);
222
+ }
223
+ }
224
+ return new values_1.NodeSetValue(ret);
225
+ }
226
+ function lang(context) {
227
+ (0, internal_functions_1.assert)(this.args.length === 1);
228
+ var lang = this.args[0].evaluate(context).stringValue();
229
+ var xmlLang;
230
+ var n = context.nodeList[context.position];
231
+ while (n && n != n.parentNode /* just in case ... */) {
232
+ xmlLang = n.getAttributeValue('xml:lang');
233
+ if (xmlLang) {
234
+ break;
235
+ }
236
+ n = n.parentNode;
237
+ }
238
+ if (!xmlLang) {
239
+ return new values_1.BooleanValue(false);
240
+ }
241
+ var re = new RegExp("^".concat(lang, "$"), 'i');
242
+ return new values_1.BooleanValue(xmlLang.match(re) || xmlLang.replace(/_.*$/, '').match(re));
243
+ }
244
+ function last(context) {
245
+ (0, internal_functions_1.assert)(this.args.length === 0);
246
+ // NOTE(mesch): XPath position starts at 1.
247
+ return new values_1.NumberValue(context.contextSize());
248
+ }
249
+ function localName(context) {
250
+ (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
251
+ var n;
252
+ if (this.args.length == 0) {
253
+ n = [context.nodeList[context.position]];
254
+ }
255
+ else {
256
+ n = this.args[0].evaluate(context).nodeSetValue();
257
+ }
258
+ if (n.length === 0) {
259
+ return new values_1.StringValue('');
260
+ }
261
+ return new values_1.StringValue(n[0].localName);
262
+ }
263
+ function matches(context) {
264
+ (0, internal_functions_1.assert)(this.args.length >= 2);
265
+ var s0 = this.args[0].evaluate(context).stringValue();
266
+ var s1 = this.args[1].evaluate(context).stringValue();
267
+ var s2;
268
+ if (this.args.length > 2) {
269
+ s2 = this.args[2].evaluate(context).stringValue();
270
+ if (/[^mi]/.test(s2)) {
271
+ throw new Error("Invalid regular expression syntax: ".concat(s2));
272
+ }
273
+ }
274
+ var re;
275
+ try {
276
+ re = new RegExp(s1, s2);
277
+ }
278
+ catch (e) {
279
+ throw new Error("Invalid matches argument: ".concat(s1));
280
+ }
281
+ return new values_1.BooleanValue(re.test(s0));
282
+ }
283
+ function _name(context) {
284
+ (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
285
+ var n;
286
+ if (this.args.length === 0) {
287
+ n = [context.nodeList[context.position]];
288
+ }
289
+ else {
290
+ n = this.args[0].evaluate(context).nodeSetValue();
291
+ }
292
+ if (n.length === 0) {
293
+ return new values_1.StringValue('');
294
+ }
295
+ return new values_1.StringValue(n[0].nodeName);
296
+ }
297
+ function namespaceUri(context) {
298
+ (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
299
+ var nodes;
300
+ if (this.args.length === 0) {
301
+ nodes = [context.nodeList[context.position]];
302
+ }
303
+ else {
304
+ nodes = this.args[0].evaluate(context).nodeSetValue();
305
+ }
306
+ if (nodes.length === 0) {
307
+ return new values_1.StringValue('');
308
+ }
309
+ return new values_1.StringValue(nodes[0].namespaceUri || '');
310
+ }
311
+ function normalizeSpace(context) {
312
+ var s;
313
+ if (this.args.length > 0) {
314
+ s = this.args[0].evaluate(context).stringValue();
315
+ }
316
+ else {
317
+ s = new values_1.NodeSetValue([context.nodeList[context.position]]).stringValue();
318
+ }
319
+ s = s.replace(/^\s*/, '').replace(/\s*$/, '').replace(/\s+/g, ' ');
320
+ return new values_1.StringValue(s);
321
+ }
322
+ function not(context) {
323
+ (0, internal_functions_1.assert)(this.args.length === 1);
324
+ var ret = !this.args[0].evaluate(context).booleanValue();
325
+ return new values_1.BooleanValue(ret);
326
+ }
327
+ function number(context) {
328
+ (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
329
+ if (this.args.length === 1) {
330
+ return new values_1.NumberValue(this.args[0].evaluate(context).numberValue());
331
+ }
332
+ return new values_1.NumberValue(new values_1.NodeSetValue([context.nodeList[context.position]]).numberValue());
333
+ }
334
+ function position(context) {
335
+ (0, internal_functions_1.assert)(this.args.length === 0);
336
+ // NOTE(mesch): XPath position starts at 1.
337
+ return new values_1.NumberValue(context.position + 1);
338
+ }
339
+ function round(context) {
340
+ (0, internal_functions_1.assert)(this.args.length === 1);
341
+ var num = this.args[0].evaluate(context).numberValue();
342
+ return new values_1.NumberValue(Math.round(num));
343
+ }
344
+ function startsWith(context) {
345
+ (0, internal_functions_1.assert)(this.args.length == 2);
346
+ var s0 = this.args[0].evaluate(context).stringValue();
347
+ var s1 = this.args[1].evaluate(context).stringValue();
348
+ return new values_1.BooleanValue(s0.indexOf(s1) === 0);
349
+ }
350
+ function _string(context) {
351
+ (0, internal_functions_1.assert)(this.args.length === 1 || this.args.length === 0);
352
+ if (this.args.length === 0) {
353
+ return new values_1.StringValue(new values_1.NodeSetValue([context.nodeList[context.position]]).stringValue());
354
+ }
355
+ return new values_1.StringValue(this.args[0].evaluate(context).stringValue());
356
+ }
357
+ function stringLength(context) {
358
+ var s;
359
+ if (this.args.length > 0) {
360
+ s = this.args[0].evaluate(context).stringValue();
361
+ }
362
+ else {
363
+ s = new values_1.NodeSetValue([context.nodeList[context.position]]).stringValue();
364
+ }
365
+ return new values_1.NumberValue(s.length);
366
+ }
367
+ function substring(context) {
368
+ // NOTE: XPath defines the position of the first character in a
369
+ // string to be 1, in JavaScript this is 0 ([XPATH] Section 4.2).
370
+ (0, internal_functions_1.assert)(this.args.length === 2 || this.args.length === 3);
371
+ var s0 = this.args[0].evaluate(context).stringValue();
372
+ var s1 = this.args[1].evaluate(context).numberValue();
373
+ var ret;
374
+ if (this.args.length === 2) {
375
+ var i1 = Math.max(0, Math.round(s1) - 1);
376
+ ret = s0.substr(i1);
377
+ }
378
+ else {
379
+ var s2 = this.args[2].evaluate(context).numberValue();
380
+ var i0 = Math.round(s1) - 1;
381
+ var i1 = Math.max(0, i0);
382
+ var i2 = Math.round(s2) - Math.max(0, -i0);
383
+ ret = s0.substr(i1, i2);
384
+ }
385
+ return new values_1.StringValue(ret);
386
+ }
387
+ function substringAfter(context) {
388
+ (0, internal_functions_1.assert)(this.args.length === 2);
389
+ var s0 = this.args[0].evaluate(context).stringValue();
390
+ var s1 = this.args[1].evaluate(context).stringValue();
391
+ var i = s0.indexOf(s1);
392
+ var ret;
393
+ if (i === -1) {
394
+ ret = '';
395
+ }
396
+ else {
397
+ ret = s0.substr(i + s1.length);
398
+ }
399
+ return new values_1.StringValue(ret);
400
+ }
401
+ function substringBefore(context) {
402
+ (0, internal_functions_1.assert)(this.args.length === 2);
403
+ var s0 = this.args[0].evaluate(context).stringValue();
404
+ var s1 = this.args[1].evaluate(context).stringValue();
405
+ var i = s0.indexOf(s1);
406
+ var ret;
407
+ if (i === -1) {
408
+ ret = '';
409
+ }
410
+ else {
411
+ ret = s0.substr(0, i);
412
+ }
413
+ return new values_1.StringValue(ret);
414
+ }
415
+ function sum(context) {
416
+ (0, internal_functions_1.assert)(this.args.length === 1);
417
+ var n = this.args[0].evaluate(context).nodeSetValue();
418
+ var sum = 0;
419
+ for (var i = 0; i < n.length; ++i) {
420
+ sum += parseInt((0, dom_1.xmlValue)(n[i])) - 0;
421
+ }
422
+ return new values_1.NumberValue(sum);
423
+ }
424
+ function translate(context) {
425
+ (0, internal_functions_1.assert)(this.args.length === 3);
426
+ var s0 = this.args[0].evaluate(context).stringValue();
427
+ var s1 = this.args[1].evaluate(context).stringValue();
428
+ var s2 = this.args[2].evaluate(context).stringValue();
429
+ for (var i = 0; i < s1.length; ++i) {
430
+ s0 = s0.replace(new RegExp(s1.charAt(i), 'g'), s2.charAt(i));
431
+ }
432
+ return new values_1.StringValue(s0);
433
+ }
434
+ function _true() {
435
+ (0, internal_functions_1.assert)(this.args.length === 0);
436
+ return new values_1.BooleanValue(true);
437
+ }
438
+ function xmlToJson(context) {
439
+ (0, internal_functions_1.assert)(this.args.length < 2);
440
+ return new values_1.StringValue(JSON.stringify(!this.args.length ? 'null' : (0, dom_1.xmlValue)(context.nodeList[context.position])));
441
+ }
443
442
  //# sourceMappingURL=standard.js.map