@reidelsaltres/pureper 0.1.156 → 0.1.160
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 +30 -0
- package/out/foundation/api/Observer.d.ts.map +1 -1
- package/out/foundation/api/Observer.js +48 -0
- package/out/foundation/api/Observer.js.map +1 -1
- package/out/foundation/component_api/Attribute.d.ts.map +1 -1
- package/out/foundation/component_api/Attribute.js +1 -0
- package/out/foundation/component_api/Attribute.js.map +1 -1
- package/out/foundation/engine/BalancedParser.d.ts +58 -0
- package/out/foundation/engine/BalancedParser.d.ts.map +1 -0
- package/out/foundation/engine/BalancedParser.js +301 -0
- package/out/foundation/engine/BalancedParser.js.map +1 -0
- package/out/foundation/engine/EscapeHandler.d.ts +27 -0
- package/out/foundation/engine/EscapeHandler.d.ts.map +1 -0
- package/out/foundation/engine/EscapeHandler.js +47 -0
- package/out/foundation/engine/EscapeHandler.js.map +1 -0
- package/out/foundation/engine/Expression.d.ts +83 -0
- package/out/foundation/engine/Expression.d.ts.map +1 -0
- package/out/foundation/engine/Expression.js +256 -0
- package/out/foundation/engine/Expression.js.map +1 -0
- package/out/foundation/engine/Rule.d.ts +83 -0
- package/out/foundation/engine/Rule.d.ts.map +1 -0
- package/out/foundation/engine/Rule.js +69 -0
- package/out/foundation/engine/Rule.js.map +1 -0
- package/out/foundation/engine/Scope.d.ts +57 -0
- package/out/foundation/engine/Scope.d.ts.map +1 -0
- package/out/foundation/engine/Scope.js +147 -0
- package/out/foundation/engine/Scope.js.map +1 -0
- package/out/foundation/engine/TemplateEngine.d.ts +79 -0
- package/out/foundation/engine/TemplateEngine.d.ts.map +1 -0
- package/out/foundation/engine/TemplateEngine.js +187 -0
- package/out/foundation/engine/TemplateEngine.js.map +1 -0
- package/out/foundation/engine/TemplateInstance.d.ts +121 -0
- package/out/foundation/engine/TemplateInstance.d.ts.map +1 -0
- package/out/foundation/engine/TemplateInstance.js +255 -0
- package/out/foundation/engine/TemplateInstance.js.map +1 -0
- package/out/foundation/engine/exceptions/TemplateExceptions.d.ts +21 -0
- package/out/foundation/engine/exceptions/TemplateExceptions.d.ts.map +1 -0
- package/out/foundation/engine/exceptions/TemplateExceptions.js +26 -0
- package/out/foundation/engine/exceptions/TemplateExceptions.js.map +1 -0
- package/out/foundation/engine/index.d.ts +18 -0
- package/out/foundation/engine/index.d.ts.map +1 -0
- package/out/foundation/engine/index.js +19 -0
- package/out/foundation/engine/index.js.map +1 -0
- package/out/foundation/engine/rules/attribute/EventRule.d.ts +22 -0
- package/out/foundation/engine/rules/attribute/EventRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/attribute/EventRule.js +129 -0
- package/out/foundation/engine/rules/attribute/EventRule.js.map +1 -0
- package/out/foundation/engine/rules/attribute/InjectionRule.d.ts +20 -0
- package/out/foundation/engine/rules/attribute/InjectionRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/attribute/InjectionRule.js +108 -0
- package/out/foundation/engine/rules/attribute/InjectionRule.js.map +1 -0
- package/out/foundation/engine/rules/attribute/RefRule.d.ts +23 -0
- package/out/foundation/engine/rules/attribute/RefRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/attribute/RefRule.js +98 -0
- package/out/foundation/engine/rules/attribute/RefRule.js.map +1 -0
- package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts +19 -0
- package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/syntax/ExpressionRule.js +82 -0
- package/out/foundation/engine/rules/syntax/ExpressionRule.js.map +1 -0
- package/out/foundation/engine/rules/syntax/ForRule.d.ts +19 -0
- package/out/foundation/engine/rules/syntax/ForRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/syntax/ForRule.js +226 -0
- package/out/foundation/engine/rules/syntax/ForRule.js.map +1 -0
- package/out/foundation/engine/rules/syntax/IfRule.d.ts +17 -0
- package/out/foundation/engine/rules/syntax/IfRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/syntax/IfRule.js +220 -0
- package/out/foundation/engine/rules/syntax/IfRule.js.map +1 -0
- package/out/foundation/worker/Router.d.ts.map +1 -1
- package/out/foundation/worker/Router.js.map +1 -1
- package/out/index.d.ts +3 -0
- package/out/index.d.ts.map +1 -1
- package/out/index.js +3 -0
- package/out/index.js.map +1 -1
- package/package.json +1 -1
- package/src/foundation/api/Observer.ts +60 -0
- package/src/foundation/component_api/Attribute.ts +1 -0
- package/src/foundation/engine/BalancedParser.ts +353 -0
- package/src/foundation/engine/EscapeHandler.ts +54 -0
- package/src/foundation/engine/Expression.ts +285 -0
- package/src/foundation/engine/Rule.ts +136 -0
- package/src/foundation/engine/Scope.ts +166 -0
- package/src/foundation/engine/TemplateEngine.ts +243 -0
- package/src/foundation/engine/TemplateInstance.ts +355 -0
- package/src/foundation/engine/exceptions/TemplateExceptions.ts +27 -0
- package/src/foundation/engine/rules/attribute/EventRule.ts +171 -0
- package/src/foundation/engine/rules/attribute/InjectionRule.ts +140 -0
- package/src/foundation/engine/rules/attribute/RefRule.ts +119 -0
- package/src/foundation/engine/rules/syntax/ExpressionRule.ts +102 -0
- package/src/foundation/engine/rules/syntax/ForRule.ts +267 -0
- package/src/foundation/engine/rules/syntax/IfRule.ts +261 -0
- package/src/foundation/worker/Router.ts +1 -1
- package/src/index.ts +9 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scope - класс для работы с контекстом переменных и функций.
|
|
3
|
+
* Поддерживает объединение нескольких Scope, извлечение полей из объектов и классов.
|
|
4
|
+
*/
|
|
5
|
+
export default class Scope {
|
|
6
|
+
variables = {};
|
|
7
|
+
debugWarnings;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.debugWarnings = options?.debugWarnings ?? true;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Получить все переменные Scope как Record
|
|
13
|
+
*/
|
|
14
|
+
getVariables() {
|
|
15
|
+
return { ...this.variables };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Установить переменную в Scope
|
|
19
|
+
*/
|
|
20
|
+
set(key, value) {
|
|
21
|
+
if (this.debugWarnings && key in this.variables) {
|
|
22
|
+
console.warn(`[Scope] Warning: Variable "${key}" is being overwritten`);
|
|
23
|
+
}
|
|
24
|
+
this.variables[key] = value;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Получить переменную из Scope
|
|
28
|
+
*/
|
|
29
|
+
get(key) {
|
|
30
|
+
return this.variables[key];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Проверить наличие переменной
|
|
34
|
+
*/
|
|
35
|
+
has(key) {
|
|
36
|
+
return key in this.variables;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Удалить переменную из Scope
|
|
40
|
+
*/
|
|
41
|
+
delete(key) {
|
|
42
|
+
if (key in this.variables) {
|
|
43
|
+
delete this.variables[key];
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Объединить другой Scope или объект в текущий Scope.
|
|
50
|
+
* При конфликте имён выводится предупреждение, последнее значение имеет приоритет.
|
|
51
|
+
*/
|
|
52
|
+
merge(source) {
|
|
53
|
+
const sourceVars = source instanceof Scope
|
|
54
|
+
? source.getVariables()
|
|
55
|
+
: this.extractFromObject(source);
|
|
56
|
+
for (const [key, value] of Object.entries(sourceVars)) {
|
|
57
|
+
if (this.debugWarnings && key in this.variables) {
|
|
58
|
+
console.warn(`[Scope] Warning: Variable "${key}" conflict during merge, using new value`);
|
|
59
|
+
}
|
|
60
|
+
this.variables[key] = value;
|
|
61
|
+
}
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Создать дочерний (локальный) Scope на основе текущего.
|
|
66
|
+
* Изменения в дочернем Scope не влияют на родительский.
|
|
67
|
+
*/
|
|
68
|
+
createChild(localVariables) {
|
|
69
|
+
const child = new Scope({ debugWarnings: this.debugWarnings });
|
|
70
|
+
child.variables = { ...this.variables };
|
|
71
|
+
if (localVariables) {
|
|
72
|
+
for (const [key, value] of Object.entries(localVariables)) {
|
|
73
|
+
child.variables[key] = value;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return child;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Извлечь поля и методы из объекта или экземпляра класса.
|
|
80
|
+
* Пропускает нативные DOM/браузерные прототипы.
|
|
81
|
+
*/
|
|
82
|
+
extractFromObject(obj) {
|
|
83
|
+
const ctx = {};
|
|
84
|
+
if (!obj || typeof obj !== 'object') {
|
|
85
|
+
return ctx;
|
|
86
|
+
}
|
|
87
|
+
// Copy own properties
|
|
88
|
+
for (const key of Object.keys(obj)) {
|
|
89
|
+
ctx[key] = obj[key];
|
|
90
|
+
}
|
|
91
|
+
// Copy prototype methods (for class instances)
|
|
92
|
+
let proto = Object.getPrototypeOf(obj);
|
|
93
|
+
while (proto && proto !== Object.prototype) {
|
|
94
|
+
// Avoid copying host (DOM/native) prototype methods which may throw
|
|
95
|
+
const ctorName = proto?.constructor
|
|
96
|
+
? String(proto.constructor.name ?? '')
|
|
97
|
+
: '';
|
|
98
|
+
if (/HTMLElement|Element|Node|EventTarget|Window|GlobalThis/i.test(ctorName)) {
|
|
99
|
+
proto = Object.getPrototypeOf(proto);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
for (const key of Object.getOwnPropertyNames(proto)) {
|
|
103
|
+
if (key === 'constructor' || key in ctx)
|
|
104
|
+
continue;
|
|
105
|
+
let desc;
|
|
106
|
+
try {
|
|
107
|
+
desc = Object.getOwnPropertyDescriptor(proto, key);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (!desc)
|
|
113
|
+
continue;
|
|
114
|
+
// Only bind plain function values — don't copy getters/setters
|
|
115
|
+
if (typeof desc.value === 'function') {
|
|
116
|
+
try {
|
|
117
|
+
ctx[key] = desc.value.bind(obj);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
proto = Object.getPrototypeOf(proto);
|
|
125
|
+
}
|
|
126
|
+
return ctx;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Статический метод для создания Scope из объекта
|
|
130
|
+
*/
|
|
131
|
+
static from(source, options) {
|
|
132
|
+
const scope = new Scope(options);
|
|
133
|
+
scope.merge(source);
|
|
134
|
+
return scope;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Статический метод для объединения нескольких Scope/объектов
|
|
138
|
+
*/
|
|
139
|
+
static combine(...sources) {
|
|
140
|
+
const scope = new Scope();
|
|
141
|
+
for (const source of sources) {
|
|
142
|
+
scope.merge(source);
|
|
143
|
+
}
|
|
144
|
+
return scope;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=Scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scope.js","sourceRoot":"","sources":["../../../src/foundation/engine/Scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* TemplateEngine - главный класс шаблонизатора.
|
|
31
|
+
* Обрабатывает HTML-шаблон с Rule и создаёт TemplateInstance.
|
|
32
|
+
*/
|
|
33
|
+
export default class TemplateEngine {
|
|
34
|
+
private readonly scope;
|
|
35
|
+
private readonly options;
|
|
36
|
+
private readonly syntaxRules;
|
|
37
|
+
private readonly attributeRules;
|
|
38
|
+
constructor(scope: Scope | object, options?: TemplateEngineOptions);
|
|
39
|
+
/**
|
|
40
|
+
* Зарегистрировать стандартные правила
|
|
41
|
+
*/
|
|
42
|
+
private registerDefaultRules;
|
|
43
|
+
/**
|
|
44
|
+
* Добавить пользовательское правило
|
|
45
|
+
*/
|
|
46
|
+
addRule(rule: Rule): void;
|
|
47
|
+
/**
|
|
48
|
+
* Получить Scope
|
|
49
|
+
*/
|
|
50
|
+
getScope(): Scope;
|
|
51
|
+
/**
|
|
52
|
+
* Обработать шаблон и вернуть TemplateInstance
|
|
53
|
+
*/
|
|
54
|
+
parse(template: string): TemplateInstance;
|
|
55
|
+
/**
|
|
56
|
+
* Обработать шаблон (внутренний метод, используется Rule для рекурсии)
|
|
57
|
+
*/
|
|
58
|
+
processTemplate(template: string, scope: Scope): ProcessResult;
|
|
59
|
+
/**
|
|
60
|
+
* Обработать одно правило
|
|
61
|
+
*/
|
|
62
|
+
private processRule;
|
|
63
|
+
/**
|
|
64
|
+
* Удалить синтаксис атрибутивных Rule из финального HTML
|
|
65
|
+
*/
|
|
66
|
+
private removeAttributeSyntax;
|
|
67
|
+
/**
|
|
68
|
+
* Статический метод для быстрой обработки
|
|
69
|
+
*/
|
|
70
|
+
static process(template: string, scope: object, options?: TemplateEngineOptions): string;
|
|
71
|
+
/**
|
|
72
|
+
* Создать TemplateInstance из шаблона
|
|
73
|
+
*/
|
|
74
|
+
static create(template: string, scope: object, options?: TemplateEngineOptions): TemplateInstance;
|
|
75
|
+
}
|
|
76
|
+
export { Scope, Expression, TemplateInstance, Rule, SyntaxRule, AttributeRule };
|
|
77
|
+
export { ExpressionRule, IfRule, ForRule, RefRule, EventRule, InjectionRule };
|
|
78
|
+
export * from './exceptions/TemplateExceptions.js';
|
|
79
|
+
//# sourceMappingURL=TemplateEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateEngine.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,OAAO,gBAAgB,EAAE,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,IAAI,EAAE,EAAyB,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAG5C,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAC9C,OAAO,OAAO,MAAM,2BAA2B,CAAC;AAChD,OAAO,OAAO,MAAM,8BAA8B,CAAC;AACnD,OAAO,SAAS,MAAM,gCAAgC,CAAC;AACvD,OAAO,aAAa,MAAM,oCAAoC,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;gBAE1C,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAYlE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACI,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAUhC;;OAEG;IACI,QAAQ,IAAI,KAAK;IAIxB;;OAEG;IACI,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAmBhD;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa;IAyCrE;;OAEG;IACH,OAAO,CAAC,WAAW;IA8CnB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;WACW,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAM/F;;OAEG;WACW,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,gBAAgB;CAI3G;AAGD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAC9E,cAAc,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import Scope from './Scope.js';
|
|
2
|
+
import Expression from './Expression.js';
|
|
3
|
+
import EscapeHandler from './EscapeHandler.js';
|
|
4
|
+
import TemplateInstance from './TemplateInstance.js';
|
|
5
|
+
import Rule, { SyntaxRule, AttributeRule } from './Rule.js';
|
|
6
|
+
// Import rules
|
|
7
|
+
import ExpressionRule from './rules/syntax/ExpressionRule.js';
|
|
8
|
+
import IfRule from './rules/syntax/IfRule.js';
|
|
9
|
+
import ForRule from './rules/syntax/ForRule.js';
|
|
10
|
+
import RefRule from './rules/attribute/RefRule.js';
|
|
11
|
+
import EventRule from './rules/attribute/EventRule.js';
|
|
12
|
+
import InjectionRule from './rules/attribute/InjectionRule.js';
|
|
13
|
+
/**
|
|
14
|
+
* TemplateEngine - главный класс шаблонизатора.
|
|
15
|
+
* Обрабатывает HTML-шаблон с Rule и создаёт TemplateInstance.
|
|
16
|
+
*/
|
|
17
|
+
export default class TemplateEngine {
|
|
18
|
+
scope;
|
|
19
|
+
options;
|
|
20
|
+
syntaxRules = [];
|
|
21
|
+
attributeRules = [];
|
|
22
|
+
constructor(scope, options) {
|
|
23
|
+
this.scope = scope instanceof Scope ? scope : Scope.from(scope);
|
|
24
|
+
this.options = {
|
|
25
|
+
showAttributeRule: false,
|
|
26
|
+
debugWarnings: true,
|
|
27
|
+
...options
|
|
28
|
+
};
|
|
29
|
+
// Register default rules (sorted by priority)
|
|
30
|
+
this.registerDefaultRules();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Зарегистрировать стандартные правила
|
|
34
|
+
*/
|
|
35
|
+
registerDefaultRules() {
|
|
36
|
+
// Syntax rules
|
|
37
|
+
this.syntaxRules.push(new ForRule());
|
|
38
|
+
this.syntaxRules.push(new IfRule());
|
|
39
|
+
this.syntaxRules.push(new ExpressionRule());
|
|
40
|
+
// Attribute rules
|
|
41
|
+
this.attributeRules.push(new RefRule());
|
|
42
|
+
this.attributeRules.push(new EventRule());
|
|
43
|
+
this.attributeRules.push(new InjectionRule());
|
|
44
|
+
// Sort by priority
|
|
45
|
+
this.syntaxRules.sort((a, b) => a.priority - b.priority);
|
|
46
|
+
this.attributeRules.sort((a, b) => a.priority - b.priority);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Добавить пользовательское правило
|
|
50
|
+
*/
|
|
51
|
+
addRule(rule) {
|
|
52
|
+
if (rule.type === 'syntax') {
|
|
53
|
+
this.syntaxRules.push(rule);
|
|
54
|
+
this.syntaxRules.sort((a, b) => a.priority - b.priority);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.attributeRules.push(rule);
|
|
58
|
+
this.attributeRules.sort((a, b) => a.priority - b.priority);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Получить Scope
|
|
63
|
+
*/
|
|
64
|
+
getScope() {
|
|
65
|
+
return this.scope;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Обработать шаблон и вернуть TemplateInstance
|
|
69
|
+
*/
|
|
70
|
+
parse(template) {
|
|
71
|
+
const result = this.processTemplate(template, this.scope);
|
|
72
|
+
const templateInstance = new TemplateInstance(result.output, this.scope);
|
|
73
|
+
// Add sections
|
|
74
|
+
for (const section of result.sections) {
|
|
75
|
+
templateInstance.addSection(section);
|
|
76
|
+
// Track observables
|
|
77
|
+
for (const observable of section.result.observables || []) {
|
|
78
|
+
templateInstance.trackObservable(observable, section, (s) => {
|
|
79
|
+
return this.processTemplate(s.sourceTemplate, this.scope);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return templateInstance;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Обработать шаблон (внутренний метод, используется Rule для рекурсии)
|
|
87
|
+
*/
|
|
88
|
+
processTemplate(template, scope) {
|
|
89
|
+
const allObservables = [];
|
|
90
|
+
const allSections = [];
|
|
91
|
+
// Step 1: Handle @@ escape sequences
|
|
92
|
+
let processed = EscapeHandler.process(template, (escaped) => {
|
|
93
|
+
let result = escaped;
|
|
94
|
+
// Step 2: Process syntax rules (in priority order)
|
|
95
|
+
for (const rule of this.syntaxRules) {
|
|
96
|
+
result = this.processRule(rule, result, scope, allObservables, allSections);
|
|
97
|
+
}
|
|
98
|
+
// Step 3: Process attribute rules
|
|
99
|
+
for (const rule of this.attributeRules) {
|
|
100
|
+
// Skip injection - processed last
|
|
101
|
+
if (rule.name === 'injection')
|
|
102
|
+
continue;
|
|
103
|
+
result = this.processRule(rule, result, scope, allObservables, allSections);
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
});
|
|
107
|
+
// Step 4: Process injection rules last
|
|
108
|
+
const injectionRule = this.attributeRules.find(r => r.name === 'injection');
|
|
109
|
+
if (injectionRule) {
|
|
110
|
+
processed = this.processRule(injectionRule, processed, scope, allObservables, allSections);
|
|
111
|
+
}
|
|
112
|
+
// Step 5: Handle showAttributeRule option
|
|
113
|
+
if (!this.options.showAttributeRule) {
|
|
114
|
+
processed = this.removeAttributeSyntax(processed);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
output: processed,
|
|
118
|
+
observables: allObservables,
|
|
119
|
+
sections: allSections
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Обработать одно правило
|
|
124
|
+
*/
|
|
125
|
+
processRule(rule, template, scope, observables, sections) {
|
|
126
|
+
const matches = rule.find(template);
|
|
127
|
+
// Sort matches by position (reverse to process from end)
|
|
128
|
+
matches.sort((a, b) => b.start - a.start);
|
|
129
|
+
let result = template;
|
|
130
|
+
for (const match of matches) {
|
|
131
|
+
try {
|
|
132
|
+
const ruleResult = rule.execute(match, scope, this);
|
|
133
|
+
// Track observables
|
|
134
|
+
if (ruleResult.observables) {
|
|
135
|
+
observables.push(...ruleResult.observables);
|
|
136
|
+
}
|
|
137
|
+
// Create section
|
|
138
|
+
const section = {
|
|
139
|
+
rule,
|
|
140
|
+
match,
|
|
141
|
+
result: ruleResult,
|
|
142
|
+
sourceTemplate: match.fullMatch,
|
|
143
|
+
children: [],
|
|
144
|
+
subscriptions: []
|
|
145
|
+
};
|
|
146
|
+
sections.push(section);
|
|
147
|
+
// Replace in template
|
|
148
|
+
result = result.slice(0, match.start) + ruleResult.output + result.slice(match.end);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error(`[TemplateEngine] Error processing rule "${rule.name}":`, error);
|
|
152
|
+
// Continue processing other rules
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Удалить синтаксис атрибутивных Rule из финального HTML
|
|
159
|
+
*/
|
|
160
|
+
removeAttributeSyntax(template) {
|
|
161
|
+
// Remove @[ref], @on[...], @injection[...] patterns that weren't processed
|
|
162
|
+
return template
|
|
163
|
+
.replace(/@\[ref\]\s*=\s*["'][^"']*["']/gi, '')
|
|
164
|
+
.replace(/@on\[[a-zA-Z]+\]\s*=\s*["'][^"']*["']/gi, '')
|
|
165
|
+
.replace(/@injection\[(head|tail)\]\s*=\s*["'][^"']*["']/gi, '');
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Статический метод для быстрой обработки
|
|
169
|
+
*/
|
|
170
|
+
static process(template, scope, options) {
|
|
171
|
+
const engine = new TemplateEngine(scope, options);
|
|
172
|
+
const TemplateInstance = engine.parse(template);
|
|
173
|
+
return TemplateInstance.getTemplate();
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Создать TemplateInstance из шаблона
|
|
177
|
+
*/
|
|
178
|
+
static create(template, scope, options) {
|
|
179
|
+
const engine = new TemplateEngine(scope, options);
|
|
180
|
+
return engine.parse(template);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Re-export useful types
|
|
184
|
+
export { Scope, Expression, TemplateInstance, Rule, SyntaxRule, AttributeRule };
|
|
185
|
+
export { ExpressionRule, IfRule, ForRule, RefRule, EventRule, InjectionRule };
|
|
186
|
+
export * from './exceptions/TemplateExceptions.js';
|
|
187
|
+
//# sourceMappingURL=TemplateEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateEngine.js","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import Scope from './Scope.js';
|
|
2
|
+
import Observable from '../api/Observer.js';
|
|
3
|
+
import Rule, { RuleMatch, RuleResult } from './Rule.js';
|
|
4
|
+
/**
|
|
5
|
+
* TemplateChangeEvent - событие изменения шаблона
|
|
6
|
+
*/
|
|
7
|
+
export interface TemplateChangeEvent {
|
|
8
|
+
oldValue: any;
|
|
9
|
+
newValue: any;
|
|
10
|
+
oldTemplate: string;
|
|
11
|
+
newTemplate: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* TemplateSection - секция шаблона, связанная с Rule
|
|
15
|
+
*/
|
|
16
|
+
export interface TemplateSection {
|
|
17
|
+
/** Rule который создал эту секцию */
|
|
18
|
+
rule: Rule;
|
|
19
|
+
/** Оригинальный match */
|
|
20
|
+
match: RuleMatch;
|
|
21
|
+
/** Текущий результат */
|
|
22
|
+
result: RuleResult;
|
|
23
|
+
/** Исходный шаблон секции (для пересоздания) */
|
|
24
|
+
sourceTemplate: string;
|
|
25
|
+
/** Дочерние секции */
|
|
26
|
+
children: TemplateSection[];
|
|
27
|
+
/** Observable подписки для отслеживания */
|
|
28
|
+
subscriptions: Array<{
|
|
29
|
+
observable: Observable<any>;
|
|
30
|
+
unsubscribe: () => void;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* PageTemplate - динамический шаблон страницы.
|
|
35
|
+
* Хранит обработанные Rule и поддерживает реактивное обновление.
|
|
36
|
+
*
|
|
37
|
+
* При изменении Observable все зависимые секции обновляются
|
|
38
|
+
* одновременно в одном событии onTemplateChange.
|
|
39
|
+
*/
|
|
40
|
+
export default class TemplateInstance {
|
|
41
|
+
private template;
|
|
42
|
+
private scope;
|
|
43
|
+
private sections;
|
|
44
|
+
private fragment;
|
|
45
|
+
/** Observers for template changes */
|
|
46
|
+
private changeObserver;
|
|
47
|
+
/** Группировка секций по Observable */
|
|
48
|
+
private observableTrackings;
|
|
49
|
+
constructor(template: string, scope: Scope);
|
|
50
|
+
/**
|
|
51
|
+
* Получить текущий шаблон
|
|
52
|
+
*/
|
|
53
|
+
getTemplate(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Установить новый шаблон (вызывает событие изменения)
|
|
56
|
+
*/
|
|
57
|
+
setTemplate(newTemplate: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Получить Scope
|
|
60
|
+
*/
|
|
61
|
+
getScope(): Scope;
|
|
62
|
+
/**
|
|
63
|
+
* Подписаться на изменения шаблона
|
|
64
|
+
*/
|
|
65
|
+
onTemplateChange(listener: (oldValue: any, newValue: any, oldTemplate: string, newTemplate: string) => void): () => void;
|
|
66
|
+
/**
|
|
67
|
+
* Добавить секцию шаблона
|
|
68
|
+
*/
|
|
69
|
+
addSection(section: TemplateSection): void;
|
|
70
|
+
/**
|
|
71
|
+
* Получить все секции
|
|
72
|
+
*/
|
|
73
|
+
getSections(): TemplateSection[];
|
|
74
|
+
/**
|
|
75
|
+
* Подписаться на Observable и автоматически пересоздавать секцию.
|
|
76
|
+
* Все секции, зависящие от одного Observable, обновляются разом.
|
|
77
|
+
*/
|
|
78
|
+
trackObservable(observable: Observable<any>, section: TemplateSection, rebuild: (section: TemplateSection) => RuleResult): () => void;
|
|
79
|
+
/**
|
|
80
|
+
* Перестроить все секции, зависящие от Observable, за один раз
|
|
81
|
+
*/
|
|
82
|
+
private rebuildAllSectionsForObservable;
|
|
83
|
+
/**
|
|
84
|
+
* Отписаться от вложенных Observable в секции (но не от главного)
|
|
85
|
+
*/
|
|
86
|
+
private unsubscribeSectionNested;
|
|
87
|
+
/**
|
|
88
|
+
* Отписаться от всех Observable в секции
|
|
89
|
+
*/
|
|
90
|
+
private unsubscribeSection;
|
|
91
|
+
/**
|
|
92
|
+
* Создать DocumentFragment из текущего шаблона
|
|
93
|
+
*/
|
|
94
|
+
createFragment(): DocumentFragment;
|
|
95
|
+
/**
|
|
96
|
+
* Получить кэшированный DocumentFragment
|
|
97
|
+
*/
|
|
98
|
+
getFragment(): DocumentFragment | null;
|
|
99
|
+
/**
|
|
100
|
+
* Пересоздать fragment
|
|
101
|
+
*/
|
|
102
|
+
rebuildFragment(): DocumentFragment;
|
|
103
|
+
/**
|
|
104
|
+
* Очистить все подписки
|
|
105
|
+
*/
|
|
106
|
+
dispose(): void;
|
|
107
|
+
/**
|
|
108
|
+
* Привязать refs после вставки в DOM
|
|
109
|
+
*/
|
|
110
|
+
bindRefs(root: Element | DocumentFragment): void;
|
|
111
|
+
/**
|
|
112
|
+
* Обработать инжекции (@injection[head/tail])
|
|
113
|
+
* Должен вызываться после bindRefs
|
|
114
|
+
*/
|
|
115
|
+
processInjections(root: Element | DocumentFragment): void;
|
|
116
|
+
/**
|
|
117
|
+
* Отвязать refs (установить null)
|
|
118
|
+
*/
|
|
119
|
+
unbindRefs(): void;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=TemplateInstance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateInstance.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateInstance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,UAAgC,MAAM,oBAAoB,CAAC;AAClE,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,qCAAqC;IACrC,IAAI,EAAE,IAAI,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,wBAAwB;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,aAAa,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;CAClF;AAcD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAiC;IAEjD,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAA+C;IAErE,uCAAuC;IACvC,OAAO,CAAC,mBAAmB,CAAkD;gBAEjE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAK1C;;OAEG;IACI,WAAW,IAAI,MAAM;IAI5B;;OAEG;IACI,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAU7C;;OAEG;IACI,QAAQ,IAAI,KAAK;IAIxB;;OAEG;IACI,gBAAgB,CACnB,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GAC3F,MAAM,IAAI;IAQb;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIjD;;OAEG;IACI,WAAW,IAAI,eAAe,EAAE;IAIvC;;;OAGG;IACI,eAAe,CAClB,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,EAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,UAAU,GAClD,MAAM,IAAI;IAsCb;;OAEG;IACH,OAAO,CAAC,+BAA+B;IA0CvC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAahC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACI,cAAc,IAAI,gBAAgB;IAYzC;;OAEG;IACI,WAAW,IAAI,gBAAgB,GAAG,IAAI;IAI7C;;OAEG;IACI,eAAe,IAAI,gBAAgB;IAK1C;;OAEG;IACI,OAAO,IAAI,IAAI;IAetB;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;IAWvD;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;IA+BhE;;OAEG;IACI,UAAU,IAAI,IAAI;CAU5B"}
|