@reidelsaltres/pureper 0.2.3 → 0.2.10
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/out/foundation/api/Observer.d.ts +3 -6
- package/out/foundation/api/Observer.d.ts.map +1 -1
- package/out/foundation/api/Observer.js +1 -4
- package/out/foundation/api/Observer.js.map +1 -1
- package/out/foundation/engine/TemplateEngine.d.ts +2 -2
- package/out/foundation/engine/TemplateEngine.d.ts.map +1 -1
- package/out/foundation/engine/TemplateEngine.js +5 -0
- package/out/foundation/engine/TemplateEngine.js.map +1 -1
- package/out/foundation/worker/serviceworker.js +1 -0
- package/package.json +1 -1
- package/src/foundation/api/Observer.ts +4 -7
- package/src/foundation/engine/TemplateEngine.ts +8 -5
- package/out/components/ContainItSelfTest.d.ts +0 -4
- package/out/components/ContainItSelfTest.d.ts.map +0 -1
- package/out/components/ContainItSelfTest.js +0 -18
- package/out/components/ContainItSelfTest.js.map +0 -1
- package/out/components/DynamicBlock.d.ts +0 -10
- package/out/components/DynamicBlock.d.ts.map +0 -1
- package/out/components/DynamicBlock.js +0 -32
- package/out/components/DynamicBlock.js.map +0 -1
- package/out/foundation/HMLELoader.d.ts +0 -9
- package/out/foundation/HMLELoader.d.ts.map +0 -1
- package/out/foundation/HMLELoader.js +0 -14
- package/out/foundation/HMLELoader.js.map +0 -1
- package/out/foundation/HMLEParser.d.ts +0 -87
- package/out/foundation/HMLEParser.d.ts.map +0 -1
- package/out/foundation/HMLEParser.js +0 -523
- package/out/foundation/HMLEParser.js.map +0 -1
- package/out/foundation/HMLEParserReborn.d.ts +0 -49
- package/out/foundation/HMLEParserReborn.d.ts.map +0 -1
- package/out/foundation/HMLEParserReborn.js +0 -932
- package/out/foundation/HMLEParserReborn.js.map +0 -1
- package/out/foundation/PHTMLParser.d.ts +0 -12
- package/out/foundation/PHTMLParser.d.ts.map +0 -1
- package/out/foundation/PHTMLParser.js +0 -222
- package/out/foundation/PHTMLParser.js.map +0 -1
- package/out/foundation/dynamic/Rule.d.ts +0 -16
- package/out/foundation/dynamic/Rule.d.ts.map +0 -1
- package/out/foundation/dynamic/Rule.js +0 -20
- package/out/foundation/dynamic/Rule.js.map +0 -1
- package/out/foundation/engine/BalancedParser.d.ts +0 -58
- package/out/foundation/engine/BalancedParser.d.ts.map +0 -1
- package/out/foundation/engine/BalancedParser.js +0 -301
- package/out/foundation/engine/BalancedParser.js.map +0 -1
- package/out/foundation/engine/EscapeHandler.d.ts +0 -27
- package/out/foundation/engine/EscapeHandler.d.ts.map +0 -1
- package/out/foundation/engine/EscapeHandler.js +0 -47
- package/out/foundation/engine/EscapeHandler.js.map +0 -1
- package/out/foundation/engine/Rule.d.ts +0 -85
- package/out/foundation/engine/Rule.d.ts.map +0 -1
- package/out/foundation/engine/Rule.js +0 -69
- package/out/foundation/engine/Rule.js.map +0 -1
- package/out/foundation/engine/TemplateEngine.old.d.ts +0 -96
- package/out/foundation/engine/TemplateEngine.old.d.ts.map +0 -1
- package/out/foundation/engine/TemplateEngine.old.js +0 -235
- package/out/foundation/engine/TemplateEngine.old.js.map +0 -1
- package/out/foundation/engine/TemplateInstance.d.ts +0 -241
- package/out/foundation/engine/TemplateInstance.d.ts.map +0 -1
- package/out/foundation/engine/TemplateInstance.js +0 -637
- package/out/foundation/engine/TemplateInstance.js.map +0 -1
- package/out/foundation/engine/TemplateInstance.old.d.ts +0 -219
- package/out/foundation/engine/TemplateInstance.old.d.ts.map +0 -1
- package/out/foundation/engine/TemplateInstance.old.js +0 -487
- package/out/foundation/engine/TemplateInstance.old.js.map +0 -1
- package/out/foundation/engine/exceptions/TemplateExceptions.d.ts +0 -21
- package/out/foundation/engine/exceptions/TemplateExceptions.d.ts.map +0 -1
- package/out/foundation/engine/exceptions/TemplateExceptions.js +0 -26
- package/out/foundation/engine/exceptions/TemplateExceptions.js.map +0 -1
- package/out/foundation/engine/index.d.ts +0 -18
- package/out/foundation/engine/index.d.ts.map +0 -1
- package/out/foundation/engine/index.js +0 -19
- package/out/foundation/engine/index.js.map +0 -1
- package/out/foundation/engine/rules/attribute/EventRule.d.ts +0 -22
- package/out/foundation/engine/rules/attribute/EventRule.d.ts.map +0 -1
- package/out/foundation/engine/rules/attribute/EventRule.js +0 -129
- package/out/foundation/engine/rules/attribute/EventRule.js.map +0 -1
- package/out/foundation/engine/rules/attribute/InjectionRule.d.ts +0 -20
- package/out/foundation/engine/rules/attribute/InjectionRule.d.ts.map +0 -1
- package/out/foundation/engine/rules/attribute/InjectionRule.js +0 -108
- package/out/foundation/engine/rules/attribute/InjectionRule.js.map +0 -1
- package/out/foundation/engine/rules/attribute/RefRule.d.ts +0 -23
- package/out/foundation/engine/rules/attribute/RefRule.d.ts.map +0 -1
- package/out/foundation/engine/rules/attribute/RefRule.js +0 -104
- package/out/foundation/engine/rules/attribute/RefRule.js.map +0 -1
- package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts +0 -19
- package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts.map +0 -1
- package/out/foundation/engine/rules/syntax/ExpressionRule.js +0 -82
- package/out/foundation/engine/rules/syntax/ExpressionRule.js.map +0 -1
- package/out/foundation/engine/rules/syntax/ForRule.d.ts +0 -19
- package/out/foundation/engine/rules/syntax/ForRule.d.ts.map +0 -1
- package/out/foundation/engine/rules/syntax/ForRule.js +0 -226
- package/out/foundation/engine/rules/syntax/ForRule.js.map +0 -1
- package/out/foundation/engine/rules/syntax/IfRule.d.ts +0 -17
- package/out/foundation/engine/rules/syntax/IfRule.d.ts.map +0 -1
- package/out/foundation/engine/rules/syntax/IfRule.js +0 -220
- package/out/foundation/engine/rules/syntax/IfRule.js.map +0 -1
- package/out/foundation/hmle/Context.d.ts +0 -29
- package/out/foundation/hmle/Context.d.ts.map +0 -1
- package/out/foundation/hmle/Context.js +0 -91
- package/out/foundation/hmle/Context.js.map +0 -1
- package/out/foundation/hmle/Expression.d.ts +0 -1
- package/out/foundation/hmle/Expression.d.ts.map +0 -1
- package/out/foundation/hmle/Expression.js +0 -1
- package/out/foundation/hmle/Expression.js.map +0 -1
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BalancedParser - утилита для парсинга сбалансированных скобок (), {}.
|
|
3
|
-
* Корректно обрабатывает строки и комментарии.
|
|
4
|
-
*/
|
|
5
|
-
export default class BalancedParser {
|
|
6
|
-
/**
|
|
7
|
-
* Найти все сбалансированные выражения с заданным opener.
|
|
8
|
-
* @param input - входная строка
|
|
9
|
-
* @param opener - открывающая последовательность, например '@(' или '@for('
|
|
10
|
-
* @returns массив объектов с content и позициями
|
|
11
|
-
*/
|
|
12
|
-
static parseBalanced(input, opener, closerChar = ')') {
|
|
13
|
-
const results = [];
|
|
14
|
-
const openerChar = closerChar === ')' ? '(' : '{';
|
|
15
|
-
let i = 0;
|
|
16
|
-
while (i < input.length) {
|
|
17
|
-
const idx = input.indexOf(opener, i);
|
|
18
|
-
if (idx === -1)
|
|
19
|
-
break;
|
|
20
|
-
const contentStart = idx + opener.length;
|
|
21
|
-
let pos = contentStart;
|
|
22
|
-
let depth = 1;
|
|
23
|
-
while (pos < input.length && depth > 0) {
|
|
24
|
-
const ch = input[pos];
|
|
25
|
-
// Skip string literals
|
|
26
|
-
if (ch === '"' || ch === "'" || ch === '`') {
|
|
27
|
-
pos = this.skipString(input, pos, ch);
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
// Skip single-line comments
|
|
31
|
-
if (ch === '/' && input[pos + 1] === '/') {
|
|
32
|
-
pos = this.skipLineComment(input, pos);
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
// Skip multi-line comments
|
|
36
|
-
if (ch === '/' && input[pos + 1] === '*') {
|
|
37
|
-
pos = this.skipBlockComment(input, pos);
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
if (ch === openerChar)
|
|
41
|
-
depth++;
|
|
42
|
-
else if (ch === closerChar)
|
|
43
|
-
depth--;
|
|
44
|
-
pos++;
|
|
45
|
-
}
|
|
46
|
-
if (depth === 0) {
|
|
47
|
-
results.push({
|
|
48
|
-
content: input.slice(contentStart, pos - 1),
|
|
49
|
-
start: idx,
|
|
50
|
-
end: pos
|
|
51
|
-
});
|
|
52
|
-
i = pos;
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
// Unbalanced, skip this opener and continue
|
|
56
|
-
i = idx + 1;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return results;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Парсить блочные Rule типа @for(...) { ... }
|
|
63
|
-
* @returns объект с condition (содержимое скобок) и block (содержимое фигурных скобок)
|
|
64
|
-
*/
|
|
65
|
-
static parseBlockRule(input, opener // например '@for', '@if'
|
|
66
|
-
) {
|
|
67
|
-
const results = [];
|
|
68
|
-
const openerLower = opener.toLowerCase();
|
|
69
|
-
let i = 0;
|
|
70
|
-
while (i < input.length) {
|
|
71
|
-
// Case-insensitive search
|
|
72
|
-
const lowerInput = input.toLowerCase();
|
|
73
|
-
let idx = lowerInput.indexOf(openerLower, i);
|
|
74
|
-
if (idx === -1)
|
|
75
|
-
break;
|
|
76
|
-
// Check for @@ escape
|
|
77
|
-
if (idx > 0 && input[idx - 1] === '@') {
|
|
78
|
-
i = idx + 1;
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
// Find opening parenthesis
|
|
82
|
-
let parenStart = idx + opener.length;
|
|
83
|
-
while (parenStart < input.length && /\s/.test(input[parenStart])) {
|
|
84
|
-
parenStart++;
|
|
85
|
-
}
|
|
86
|
-
if (input[parenStart] !== '(') {
|
|
87
|
-
i = idx + 1;
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
// Parse balanced parentheses for condition
|
|
91
|
-
let pos = parenStart + 1;
|
|
92
|
-
let depth = 1;
|
|
93
|
-
while (pos < input.length && depth > 0) {
|
|
94
|
-
const ch = input[pos];
|
|
95
|
-
if (ch === '"' || ch === "'" || ch === '`') {
|
|
96
|
-
pos = this.skipString(input, pos, ch);
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
if (ch === '/' && input[pos + 1] === '/') {
|
|
100
|
-
pos = this.skipLineComment(input, pos);
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
if (ch === '/' && input[pos + 1] === '*') {
|
|
104
|
-
pos = this.skipBlockComment(input, pos);
|
|
105
|
-
continue;
|
|
106
|
-
}
|
|
107
|
-
if (ch === '(')
|
|
108
|
-
depth++;
|
|
109
|
-
else if (ch === ')')
|
|
110
|
-
depth--;
|
|
111
|
-
pos++;
|
|
112
|
-
}
|
|
113
|
-
if (depth !== 0) {
|
|
114
|
-
i = idx + 1;
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
const condition = input.slice(parenStart + 1, pos - 1);
|
|
118
|
-
const conditionEnd = pos;
|
|
119
|
-
// Find opening brace for block
|
|
120
|
-
let braceStart = conditionEnd;
|
|
121
|
-
while (braceStart < input.length && /\s/.test(input[braceStart])) {
|
|
122
|
-
braceStart++;
|
|
123
|
-
}
|
|
124
|
-
if (input[braceStart] !== '{') {
|
|
125
|
-
i = idx + 1;
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
// Parse balanced braces for block
|
|
129
|
-
pos = braceStart + 1;
|
|
130
|
-
depth = 1;
|
|
131
|
-
while (pos < input.length && depth > 0) {
|
|
132
|
-
const ch = input[pos];
|
|
133
|
-
if (ch === '"' || ch === "'" || ch === '`') {
|
|
134
|
-
pos = this.skipString(input, pos, ch);
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
if (ch === '/' && input[pos + 1] === '/') {
|
|
138
|
-
pos = this.skipLineComment(input, pos);
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
if (ch === '/' && input[pos + 1] === '*') {
|
|
142
|
-
pos = this.skipBlockComment(input, pos);
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
if (ch === '{')
|
|
146
|
-
depth++;
|
|
147
|
-
else if (ch === '}')
|
|
148
|
-
depth--;
|
|
149
|
-
pos++;
|
|
150
|
-
}
|
|
151
|
-
if (depth !== 0) {
|
|
152
|
-
i = idx + 1;
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
const block = input.slice(braceStart + 1, pos - 1);
|
|
156
|
-
results.push({
|
|
157
|
-
condition,
|
|
158
|
-
block,
|
|
159
|
-
start: idx,
|
|
160
|
-
end: pos
|
|
161
|
-
});
|
|
162
|
-
i = pos;
|
|
163
|
-
}
|
|
164
|
-
return results;
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Парсить @if/@elseif/@else цепочки
|
|
168
|
-
*/
|
|
169
|
-
static parseIfChain(input) {
|
|
170
|
-
const results = [];
|
|
171
|
-
// Find @if first
|
|
172
|
-
const ifMatches = this.parseBlockRule(input, '@if');
|
|
173
|
-
for (const ifMatch of ifMatches) {
|
|
174
|
-
results.push({
|
|
175
|
-
type: 'if',
|
|
176
|
-
condition: ifMatch.condition,
|
|
177
|
-
block: ifMatch.block,
|
|
178
|
-
start: ifMatch.start,
|
|
179
|
-
end: ifMatch.end
|
|
180
|
-
});
|
|
181
|
-
// Look for @elseif/@else after this @if
|
|
182
|
-
let searchPos = ifMatch.end;
|
|
183
|
-
while (searchPos < input.length) {
|
|
184
|
-
// Skip whitespace
|
|
185
|
-
while (searchPos < input.length && /\s/.test(input[searchPos])) {
|
|
186
|
-
searchPos++;
|
|
187
|
-
}
|
|
188
|
-
const remaining = input.slice(searchPos).toLowerCase();
|
|
189
|
-
if (remaining.startsWith('@elseif')) {
|
|
190
|
-
const elseifMatches = this.parseBlockRule(input.slice(searchPos), '@elseif');
|
|
191
|
-
if (elseifMatches.length > 0) {
|
|
192
|
-
const m = elseifMatches[0];
|
|
193
|
-
results.push({
|
|
194
|
-
type: 'elseif',
|
|
195
|
-
condition: m.condition,
|
|
196
|
-
block: m.block,
|
|
197
|
-
start: searchPos + m.start,
|
|
198
|
-
end: searchPos + m.end
|
|
199
|
-
});
|
|
200
|
-
searchPos = searchPos + m.end;
|
|
201
|
-
continue;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
else if (remaining.startsWith('@else')) {
|
|
205
|
-
// @else without condition
|
|
206
|
-
let pos = searchPos + 5; // length of '@else'
|
|
207
|
-
while (pos < input.length && /\s/.test(input[pos])) {
|
|
208
|
-
pos++;
|
|
209
|
-
}
|
|
210
|
-
if (input[pos] === '{') {
|
|
211
|
-
let bracePos = pos + 1;
|
|
212
|
-
let depth = 1;
|
|
213
|
-
while (bracePos < input.length && depth > 0) {
|
|
214
|
-
const ch = input[bracePos];
|
|
215
|
-
if (ch === '"' || ch === "'" || ch === '`') {
|
|
216
|
-
bracePos = this.skipString(input, bracePos, ch);
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
if (ch === '{')
|
|
220
|
-
depth++;
|
|
221
|
-
else if (ch === '}')
|
|
222
|
-
depth--;
|
|
223
|
-
bracePos++;
|
|
224
|
-
}
|
|
225
|
-
if (depth === 0) {
|
|
226
|
-
results.push({
|
|
227
|
-
type: 'else',
|
|
228
|
-
block: input.slice(pos + 1, bracePos - 1),
|
|
229
|
-
start: searchPos,
|
|
230
|
-
end: bracePos
|
|
231
|
-
});
|
|
232
|
-
searchPos = bracePos;
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
break; // No more @elseif/@else found
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
return results;
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Skip over a string literal (handles escape sequences)
|
|
244
|
-
*/
|
|
245
|
-
static skipString(input, pos, quote) {
|
|
246
|
-
pos++; // skip opening quote
|
|
247
|
-
while (pos < input.length) {
|
|
248
|
-
if (input[pos] === '\\') {
|
|
249
|
-
pos += 2; // skip escape sequence
|
|
250
|
-
continue;
|
|
251
|
-
}
|
|
252
|
-
if (input[pos] === quote) {
|
|
253
|
-
return pos + 1;
|
|
254
|
-
}
|
|
255
|
-
// Handle template literal ${...}
|
|
256
|
-
if (quote === '`' && input[pos] === '$' && input[pos + 1] === '{') {
|
|
257
|
-
pos += 2;
|
|
258
|
-
let depth = 1;
|
|
259
|
-
while (pos < input.length && depth > 0) {
|
|
260
|
-
if (input[pos] === '{')
|
|
261
|
-
depth++;
|
|
262
|
-
else if (input[pos] === '}')
|
|
263
|
-
depth--;
|
|
264
|
-
pos++;
|
|
265
|
-
}
|
|
266
|
-
continue;
|
|
267
|
-
}
|
|
268
|
-
pos++;
|
|
269
|
-
}
|
|
270
|
-
return pos;
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Skip single-line comment
|
|
274
|
-
*/
|
|
275
|
-
static skipLineComment(input, pos) {
|
|
276
|
-
while (pos < input.length && input[pos] !== '\n') {
|
|
277
|
-
pos++;
|
|
278
|
-
}
|
|
279
|
-
return pos + 1;
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Skip block comment
|
|
283
|
-
*/
|
|
284
|
-
static skipBlockComment(input, pos) {
|
|
285
|
-
pos += 2; // skip /*
|
|
286
|
-
while (pos < input.length - 1) {
|
|
287
|
-
if (input[pos] === '*' && input[pos + 1] === '/') {
|
|
288
|
-
return pos + 2;
|
|
289
|
-
}
|
|
290
|
-
pos++;
|
|
291
|
-
}
|
|
292
|
-
return pos;
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Извлечь простые @(expression) без блоков
|
|
296
|
-
*/
|
|
297
|
-
static parseExpressions(input) {
|
|
298
|
-
return this.parseBalanced(input, '@(', ')');
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
//# sourceMappingURL=BalancedParser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BalancedParser.js","sourceRoot":"","sources":["../../../src/foundation/engine/BalancedParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EscapeHandler - обработка escape-последовательностей.
|
|
3
|
-
* @@ -> @
|
|
4
|
-
* @@@@ -> @@
|
|
5
|
-
*/
|
|
6
|
-
export default class EscapeHandler {
|
|
7
|
-
/**
|
|
8
|
-
* Заменить @@ на специальный placeholder перед парсингом
|
|
9
|
-
*/
|
|
10
|
-
static escapeDoubleAt(input: string): {
|
|
11
|
-
result: string;
|
|
12
|
-
placeholder: string;
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Восстановить @ из placeholder после парсинга
|
|
16
|
-
*/
|
|
17
|
-
static restoreEscapes(input: string, placeholder: string): string;
|
|
18
|
-
/**
|
|
19
|
-
* Полный цикл: escape -> process -> restore
|
|
20
|
-
*/
|
|
21
|
-
static process(input: string, processor: (escaped: string) => string): string;
|
|
22
|
-
/**
|
|
23
|
-
* Проверить, является ли позиция escaped (предшествует @@)
|
|
24
|
-
*/
|
|
25
|
-
static isEscaped(input: string, position: number): boolean;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=EscapeHandler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EscapeHandler.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/EscapeHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAOpF;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAIxE;;OAEG;WACW,OAAO,CACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACvC,MAAM;IAMT;;OAEG;WACW,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;CAcpE"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EscapeHandler - обработка escape-последовательностей.
|
|
3
|
-
* @@ -> @
|
|
4
|
-
* @@@@ -> @@
|
|
5
|
-
*/
|
|
6
|
-
export default class EscapeHandler {
|
|
7
|
-
/**
|
|
8
|
-
* Заменить @@ на специальный placeholder перед парсингом
|
|
9
|
-
*/
|
|
10
|
-
static escapeDoubleAt(input) {
|
|
11
|
-
// Use a unique placeholder that won't appear in normal code
|
|
12
|
-
const placeholder = '\x00AT_ESCAPE\x00';
|
|
13
|
-
const result = input.replace(/@@/g, placeholder);
|
|
14
|
-
return { result, placeholder };
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Восстановить @ из placeholder после парсинга
|
|
18
|
-
*/
|
|
19
|
-
static restoreEscapes(input, placeholder) {
|
|
20
|
-
return input.replace(new RegExp(placeholder.replace(/\x00/g, '\\x00'), 'g'), '@');
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Полный цикл: escape -> process -> restore
|
|
24
|
-
*/
|
|
25
|
-
static process(input, processor) {
|
|
26
|
-
const { result: escaped, placeholder } = this.escapeDoubleAt(input);
|
|
27
|
-
const processed = processor(escaped);
|
|
28
|
-
return this.restoreEscapes(processed, placeholder);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Проверить, является ли позиция escaped (предшествует @@)
|
|
32
|
-
*/
|
|
33
|
-
static isEscaped(input, position) {
|
|
34
|
-
if (position === 0)
|
|
35
|
-
return false;
|
|
36
|
-
// Count consecutive @ before this position
|
|
37
|
-
let count = 0;
|
|
38
|
-
let i = position - 1;
|
|
39
|
-
while (i >= 0 && input[i] === '@') {
|
|
40
|
-
count++;
|
|
41
|
-
i--;
|
|
42
|
-
}
|
|
43
|
-
// If odd number of @ before, this @ is escaped
|
|
44
|
-
return count % 2 === 1;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=EscapeHandler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EscapeHandler.js","sourceRoot":"","sources":["../../../src/foundation/engine/EscapeHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,KAAa;QACtC,4DAA4D;QAC5D,MAAM,WAAW,GAAG,mBAAmB,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,KAAa,EAAE,WAAmB;QAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,OAAO,CACjB,KAAa,EACb,SAAsC;QAEtC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,QAAgB;QACnD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjC,2CAA2C;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAChC,KAAK,EAAE,CAAC;YACR,CAAC,EAAE,CAAC;QACR,CAAC;QAED,+CAA+C;QAC/C,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACJ"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import Scope from './Scope.js';
|
|
2
|
-
/**
|
|
3
|
-
* RuleMatch - результат поиска Rule в шаблоне
|
|
4
|
-
*/
|
|
5
|
-
export interface RuleMatch {
|
|
6
|
-
/** Полное совпадение включая синтаксис Rule */
|
|
7
|
-
fullMatch: string;
|
|
8
|
-
/** Начальная позиция в исходной строке */
|
|
9
|
-
start: number;
|
|
10
|
-
/** Конечная позиция в исходной строке */
|
|
11
|
-
end: number;
|
|
12
|
-
/** Дополнительные данные специфичные для Rule */
|
|
13
|
-
data?: Record<string, any>;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* RuleResult - результат выполнения Rule
|
|
17
|
-
*/
|
|
18
|
-
export interface RuleResult {
|
|
19
|
-
/** HTML-результат для замены */
|
|
20
|
-
output: string;
|
|
21
|
-
/** Использованные Observable для отслеживания */
|
|
22
|
-
observables?: any[];
|
|
23
|
-
/** Дочерние Rule (для вложенных структур) */
|
|
24
|
-
children?: Rule[];
|
|
25
|
-
/** Дополнительные данные (например, refName для RefRule) */
|
|
26
|
-
data?: Record<string, any>;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* RuleType - тип Rule
|
|
30
|
-
*/
|
|
31
|
-
export type RuleType = 'syntax' | 'attribute';
|
|
32
|
-
/**
|
|
33
|
-
* Rule - базовый абстрактный класс для всех правил шаблонизатора.
|
|
34
|
-
*/
|
|
35
|
-
export default abstract class Rule {
|
|
36
|
-
/** Уникальное имя правила */
|
|
37
|
-
abstract readonly name: string;
|
|
38
|
-
/** Тип правила: syntax или attribute */
|
|
39
|
-
abstract readonly type: RuleType;
|
|
40
|
-
/** Приоритет выполнения (меньше = раньше) */
|
|
41
|
-
readonly priority: number;
|
|
42
|
-
/**
|
|
43
|
-
* Найти все вхождения этого Rule в шаблоне.
|
|
44
|
-
* @param template - исходный шаблон
|
|
45
|
-
* @returns массив найденных совпадений
|
|
46
|
-
*/
|
|
47
|
-
abstract find(template: string): RuleMatch[];
|
|
48
|
-
/**
|
|
49
|
-
* Выполнить Rule и вернуть результат.
|
|
50
|
-
* @param match - найденное совпадение
|
|
51
|
-
* @param scope - текущий Scope
|
|
52
|
-
* @param engine - ссылка на TemplateEngine (для рекурсивной обработки)
|
|
53
|
-
*/
|
|
54
|
-
abstract execute(match: RuleMatch, scope: Scope, engine?: any): RuleResult | Promise<RuleResult>;
|
|
55
|
-
/**
|
|
56
|
-
* Проверить, поддерживает ли Rule Observable значения
|
|
57
|
-
*/
|
|
58
|
-
supportsObservable(): boolean;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* SyntaxRule - базовый класс для синтаксических правил.
|
|
62
|
-
* Синтаксические правила могут быть в любом месте шаблона (кроме атрибутов).
|
|
63
|
-
*/
|
|
64
|
-
export declare abstract class SyntaxRule extends Rule {
|
|
65
|
-
readonly type: RuleType;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* AttributeRule - базовый класс для атрибутивных правил.
|
|
69
|
-
* Атрибутивные правила работают только внутри HTML-тегов.
|
|
70
|
-
*/
|
|
71
|
-
export declare abstract class AttributeRule extends Rule {
|
|
72
|
-
readonly type: RuleType;
|
|
73
|
-
/**
|
|
74
|
-
* Получить элемент, к которому применяется атрибут.
|
|
75
|
-
* @param template - шаблон
|
|
76
|
-
* @param attributePosition - позиция атрибута
|
|
77
|
-
* @returns информация об элементе
|
|
78
|
-
*/
|
|
79
|
-
protected findParentElement(template: string, attributePosition: number): {
|
|
80
|
-
tagName: string;
|
|
81
|
-
tagStart: number;
|
|
82
|
-
tagEnd: number;
|
|
83
|
-
} | null;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=Rule.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Rule.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/Rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAG/B;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAClB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,IAAI;IAC9B,6BAA6B;IAC7B,kBAAyB,IAAI,EAAE,MAAM,CAAC;IAEtC,wCAAwC;IACxC,kBAAyB,IAAI,EAAE,QAAQ,CAAC;IAExC,6CAA6C;IAC7C,SAAgB,QAAQ,EAAE,MAAM,CAAO;IAEvC;;;;OAIG;aACa,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAEnD;;;;;OAKG;aACa,OAAO,CACnB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,GAAG,GACb,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAEnC;;OAEG;IACI,kBAAkB,IAAI,OAAO;CAGvC;AAED;;;GAGG;AACH,8BAAsB,UAAW,SAAQ,IAAI;IACzC,SAAgB,IAAI,EAAE,QAAQ,CAAY;CAC7C;AAED;;;GAGG;AACH,8BAAsB,aAAc,SAAQ,IAAI;IAC5C,SAAgB,IAAI,EAAE,QAAQ,CAAe;IAE7C;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,CACvB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,GAC1B;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAqClE"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule - базовый абстрактный класс для всех правил шаблонизатора.
|
|
3
|
-
*/
|
|
4
|
-
export default class Rule {
|
|
5
|
-
/** Приоритет выполнения (меньше = раньше) */
|
|
6
|
-
priority = 100;
|
|
7
|
-
/**
|
|
8
|
-
* Проверить, поддерживает ли Rule Observable значения
|
|
9
|
-
*/
|
|
10
|
-
supportsObservable() {
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* SyntaxRule - базовый класс для синтаксических правил.
|
|
16
|
-
* Синтаксические правила могут быть в любом месте шаблона (кроме атрибутов).
|
|
17
|
-
*/
|
|
18
|
-
export class SyntaxRule extends Rule {
|
|
19
|
-
type = 'syntax';
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* AttributeRule - базовый класс для атрибутивных правил.
|
|
23
|
-
* Атрибутивные правила работают только внутри HTML-тегов.
|
|
24
|
-
*/
|
|
25
|
-
export class AttributeRule extends Rule {
|
|
26
|
-
type = 'attribute';
|
|
27
|
-
/**
|
|
28
|
-
* Получить элемент, к которому применяется атрибут.
|
|
29
|
-
* @param template - шаблон
|
|
30
|
-
* @param attributePosition - позиция атрибута
|
|
31
|
-
* @returns информация об элементе
|
|
32
|
-
*/
|
|
33
|
-
findParentElement(template, attributePosition) {
|
|
34
|
-
// Find opening < before attribute
|
|
35
|
-
let tagStart = attributePosition;
|
|
36
|
-
while (tagStart > 0 && template[tagStart] !== '<') {
|
|
37
|
-
tagStart--;
|
|
38
|
-
}
|
|
39
|
-
if (template[tagStart] !== '<') {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
// Extract tag name
|
|
43
|
-
let nameEnd = tagStart + 1;
|
|
44
|
-
while (nameEnd < template.length && /[a-zA-Z0-9_-]/.test(template[nameEnd])) {
|
|
45
|
-
nameEnd++;
|
|
46
|
-
}
|
|
47
|
-
const tagName = template.slice(tagStart + 1, nameEnd);
|
|
48
|
-
// Find closing >
|
|
49
|
-
let tagEnd = attributePosition;
|
|
50
|
-
let inString = false;
|
|
51
|
-
let stringChar = '';
|
|
52
|
-
while (tagEnd < template.length) {
|
|
53
|
-
const ch = template[tagEnd];
|
|
54
|
-
if (!inString && (ch === '"' || ch === "'")) {
|
|
55
|
-
inString = true;
|
|
56
|
-
stringChar = ch;
|
|
57
|
-
}
|
|
58
|
-
else if (inString && ch === stringChar) {
|
|
59
|
-
inString = false;
|
|
60
|
-
}
|
|
61
|
-
else if (!inString && ch === '>') {
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
tagEnd++;
|
|
65
|
-
}
|
|
66
|
-
return { tagName, tagStart, tagEnd: tagEnd + 1 };
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=Rule.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Rule.js","sourceRoot":"","sources":["../../../src/foundation/engine/Rule.ts"],"names":[],"mappings":"AAoCA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAgB,IAAI;IAO9B,6CAA6C;IAC7B,QAAQ,GAAW,GAAG,CAAC;IAqBvC;;OAEG;IACI,kBAAkB;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAgB,UAAW,SAAQ,IAAI;IACzB,IAAI,GAAa,QAAQ,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,OAAgB,aAAc,SAAQ,IAAI;IAC5B,IAAI,GAAa,WAAW,CAAC;IAE7C;;;;;OAKG;IACO,iBAAiB,CACvB,QAAgB,EAChB,iBAAyB;QAEzB,kCAAkC;QAClC,IAAI,QAAQ,GAAG,iBAAiB,CAAC;QACjC,OAAO,QAAQ,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YAChD,QAAQ,EAAE,CAAC;QACf,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC3B,OAAO,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC1E,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAEtD,iBAAiB;QACjB,IAAI,MAAM,GAAG,iBAAiB,CAAC;QAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,OAAO,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC1C,QAAQ,GAAG,IAAI,CAAC;gBAChB,UAAU,GAAG,EAAE,CAAC;YACpB,CAAC;iBAAM,IAAI,QAAQ,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;gBACvC,QAAQ,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,IAAI,CAAC,QAAQ,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACjC,MAAM;YACV,CAAC;YACD,MAAM,EAAE,CAAC;QACb,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IACrD,CAAC;CACJ"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import Scope from './Scope.js';
|
|
2
|
-
import Expression from './Expression.js';
|
|
3
|
-
import TemplateInstance, { TemplateSection } from './TemplateInstance.js';
|
|
4
|
-
import Rule, { SyntaxRule, AttributeRule } from './Rule.js';
|
|
5
|
-
import Observable from '../api/Observer.js';
|
|
6
|
-
import ExpressionRule from './rules/syntax/ExpressionRule.js';
|
|
7
|
-
import IfRule from './rules/syntax/IfRule.js';
|
|
8
|
-
import ForRule from './rules/syntax/ForRule.js';
|
|
9
|
-
import RefRule from './rules/attribute/RefRule.js';
|
|
10
|
-
import EventRule from './rules/attribute/EventRule.js';
|
|
11
|
-
import InjectionRule from './rules/attribute/InjectionRule.js';
|
|
12
|
-
/**
|
|
13
|
-
* TemplateEngineOptions - настройки TemplateEngine
|
|
14
|
-
*/
|
|
15
|
-
export interface TemplateEngineOptions {
|
|
16
|
-
/** Оставлять синтаксис атрибутивных Rule в финальном HTML */
|
|
17
|
-
showAttributeRule?: boolean;
|
|
18
|
-
/** Включить предупреждения отладки */
|
|
19
|
-
debugWarnings?: boolean;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* ProcessResult - результат обработки шаблона
|
|
23
|
-
*/
|
|
24
|
-
export interface ProcessResult {
|
|
25
|
-
output: string;
|
|
26
|
-
observables: Observable<any>[];
|
|
27
|
-
sections: TemplateSection[];
|
|
28
|
-
/** ID созданного фрагмента (если был создан) */
|
|
29
|
-
fragmentId?: string;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* TemplateEngine - главный класс шаблонизатора.
|
|
33
|
-
* Обрабатывает HTML-шаблон с Rule и создаёт TemplateInstance.
|
|
34
|
-
*/
|
|
35
|
-
export default class TemplateEngine {
|
|
36
|
-
private readonly scope;
|
|
37
|
-
private readonly options;
|
|
38
|
-
private readonly syntaxRules;
|
|
39
|
-
private readonly attributeRules;
|
|
40
|
-
constructor(scope: Scope | object, options?: TemplateEngineOptions);
|
|
41
|
-
/**
|
|
42
|
-
* Зарегистрировать стандартные правила
|
|
43
|
-
*/
|
|
44
|
-
private registerDefaultRules;
|
|
45
|
-
/**
|
|
46
|
-
* Добавить пользовательское правило
|
|
47
|
-
*/
|
|
48
|
-
addRule(rule: Rule): void;
|
|
49
|
-
/**
|
|
50
|
-
* Получить Scope
|
|
51
|
-
*/
|
|
52
|
-
getScope(): Scope;
|
|
53
|
-
/**
|
|
54
|
-
* Обработать шаблон и вернуть TemplateInstance
|
|
55
|
-
*/
|
|
56
|
-
parse(template: string): TemplateInstance;
|
|
57
|
-
/**
|
|
58
|
-
* Обработать шаблон с созданием фрагментов
|
|
59
|
-
*/
|
|
60
|
-
private processTemplateWithFragments;
|
|
61
|
-
/**
|
|
62
|
-
* Обработать шаблон (внутренний метод, используется Rule для рекурсии)
|
|
63
|
-
*/
|
|
64
|
-
processTemplate(template: string, scope: Scope): ProcessResult;
|
|
65
|
-
/**
|
|
66
|
-
* Обработать одно правило
|
|
67
|
-
*/
|
|
68
|
-
private processRule;
|
|
69
|
-
/**
|
|
70
|
-
* Удалить синтаксис атрибутивных Rule из финального HTML
|
|
71
|
-
*/
|
|
72
|
-
private removeAttributeSyntax;
|
|
73
|
-
/**
|
|
74
|
-
* Добавить новый шаблон в существующий TemplateInstance.
|
|
75
|
-
* Обрабатывает шаблон и добавляет результат как новый фрагмент.
|
|
76
|
-
* Если instance привязан к контейнерам, DOM обновится автоматически.
|
|
77
|
-
*
|
|
78
|
-
* @param instance - существующий TemplateInstance
|
|
79
|
-
* @param template - новый шаблон для добавления
|
|
80
|
-
* @param customScope - опциональный scope для нового шаблона
|
|
81
|
-
* @returns ID созданного фрагмента
|
|
82
|
-
*/
|
|
83
|
-
appendTemplate(instance: TemplateInstance, template: string, customScope?: Scope | object): string;
|
|
84
|
-
/**
|
|
85
|
-
* Статический метод для быстрой обработки
|
|
86
|
-
*/
|
|
87
|
-
static process(template: string, scope: object, options?: TemplateEngineOptions): string;
|
|
88
|
-
/**
|
|
89
|
-
* Создать TemplateInstance из шаблона
|
|
90
|
-
*/
|
|
91
|
-
static create(template: string, scope: object, options?: TemplateEngineOptions): TemplateInstance;
|
|
92
|
-
}
|
|
93
|
-
export { Scope, Expression, TemplateInstance, Rule, SyntaxRule, AttributeRule };
|
|
94
|
-
export { ExpressionRule, IfRule, ForRule, RefRule, EventRule, InjectionRule };
|
|
95
|
-
export * from './exceptions/TemplateExceptions.js';
|
|
96
|
-
//# sourceMappingURL=TemplateEngine.old.d.ts.map
|