@ibyar/elements 0.4.1 → 0.5.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.
- package/README.md +61 -0
- package/ast/dom.d.ts +32 -24
- package/ast/dom.js +41 -30
- package/ast/dom.js.map +1 -1
- package/ast/factory.d.ts +6 -6
- package/ast/factory.js +40 -22
- package/ast/factory.js.map +1 -1
- package/attributes/attributes.d.ts +1 -0
- package/attributes/attributes.js +6 -0
- package/attributes/attributes.js.map +1 -1
- package/directives/register-directive.d.ts +37 -0
- package/directives/register-directive.js +97 -0
- package/directives/register-directive.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/node/html-parser.d.ts +9 -6
- package/node/html-parser.js +122 -33
- package/node/html-parser.js.map +1 -1
- package/package.json +3 -3
- package/template/template-parser.d.ts +4 -4
- package/template/template-parser.js +5 -5
- package/template/template-parser.js.map +1 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface DirectiveNodeOptions {
|
|
2
|
+
inputs?: string[];
|
|
3
|
+
outputs?: string[];
|
|
4
|
+
}
|
|
5
|
+
declare class DirectiveNodeInfo {
|
|
6
|
+
private inputs?;
|
|
7
|
+
private outputs?;
|
|
8
|
+
constructor(inputs?: string[] | undefined, outputs?: string[] | undefined);
|
|
9
|
+
hasAttributes(): boolean;
|
|
10
|
+
hasInputs(): boolean;
|
|
11
|
+
hasOutputs(): boolean;
|
|
12
|
+
getAttributes(): string[] | undefined;
|
|
13
|
+
getInputs(): string[] | undefined;
|
|
14
|
+
getOutputs(): string[] | undefined;
|
|
15
|
+
hasAttribute(attributeName: string): boolean;
|
|
16
|
+
hasInput(inputName: string): boolean;
|
|
17
|
+
hasOutput(outputName: string): boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class DirectiveRegistry {
|
|
20
|
+
private directives;
|
|
21
|
+
register(directiveName: string, options?: DirectiveNodeOptions): void;
|
|
22
|
+
replace(directiveName: string, options: DirectiveNodeOptions): void;
|
|
23
|
+
has(attributeName: string): boolean;
|
|
24
|
+
get(directiveName: string): DirectiveNodeInfo | undefined;
|
|
25
|
+
hasAttributes(directiveName: string): boolean;
|
|
26
|
+
hasInputs(directiveName: string): boolean;
|
|
27
|
+
hasOutputs(directiveName: string): boolean;
|
|
28
|
+
getAttributes(directiveName: string): string[] | undefined;
|
|
29
|
+
getInputs(directiveName: string): string[] | undefined;
|
|
30
|
+
getOutputs(directiveName: string): string[] | undefined;
|
|
31
|
+
hasAttribute(directiveName: string, attributeName: string): boolean;
|
|
32
|
+
hasInput(directiveName: string, inputName: string): boolean;
|
|
33
|
+
hasOutput(directiveName: string, outputName: string): boolean;
|
|
34
|
+
filterDirectives(attributes: string[]): string[];
|
|
35
|
+
}
|
|
36
|
+
export declare const directiveRegistry: DirectiveRegistry;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
class DirectiveNodeInfo {
|
|
2
|
+
constructor(inputs, outputs) {
|
|
3
|
+
this.inputs = inputs;
|
|
4
|
+
this.outputs = outputs;
|
|
5
|
+
}
|
|
6
|
+
hasAttributes() {
|
|
7
|
+
return this.hasInputs() || this.hasOutputs();
|
|
8
|
+
}
|
|
9
|
+
hasInputs() {
|
|
10
|
+
return (this.inputs?.length ?? 0) > 0;
|
|
11
|
+
}
|
|
12
|
+
hasOutputs() {
|
|
13
|
+
return (this.outputs?.length ?? 0) > 0;
|
|
14
|
+
}
|
|
15
|
+
getAttributes() {
|
|
16
|
+
if (this.inputs && this.outputs) {
|
|
17
|
+
return this.inputs.concat(this.outputs);
|
|
18
|
+
}
|
|
19
|
+
else if (this.inputs) {
|
|
20
|
+
return this.inputs;
|
|
21
|
+
}
|
|
22
|
+
else if (this.outputs) {
|
|
23
|
+
return this.outputs;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
getInputs() {
|
|
28
|
+
return this.inputs;
|
|
29
|
+
}
|
|
30
|
+
getOutputs() {
|
|
31
|
+
return this.outputs;
|
|
32
|
+
}
|
|
33
|
+
hasAttribute(attributeName) {
|
|
34
|
+
return this.hasInput(attributeName) || this.hasOutput(attributeName);
|
|
35
|
+
}
|
|
36
|
+
hasInput(inputName) {
|
|
37
|
+
return this.inputs?.includes(inputName) || false;
|
|
38
|
+
}
|
|
39
|
+
hasOutput(outputName) {
|
|
40
|
+
return this.outputs?.includes(outputName) || false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class DirectiveRegistry {
|
|
44
|
+
constructor() {
|
|
45
|
+
this.directives = new Map();
|
|
46
|
+
}
|
|
47
|
+
register(directiveName, options) {
|
|
48
|
+
if (!this.directives.has(directiveName)) {
|
|
49
|
+
const info = new DirectiveNodeInfo(options?.inputs, options?.outputs);
|
|
50
|
+
this.directives.set(directiveName, info);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
replace(directiveName, options) {
|
|
54
|
+
if (this.directives.has(directiveName)) {
|
|
55
|
+
const info = new DirectiveNodeInfo(options?.inputs, options?.outputs);
|
|
56
|
+
this.directives.set(directiveName, info);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
has(attributeName) {
|
|
60
|
+
return this.directives.has(attributeName);
|
|
61
|
+
}
|
|
62
|
+
get(directiveName) {
|
|
63
|
+
return this.directives.get(directiveName);
|
|
64
|
+
}
|
|
65
|
+
hasAttributes(directiveName) {
|
|
66
|
+
return this.hasInputs(directiveName) || this.hasOutputs(directiveName);
|
|
67
|
+
}
|
|
68
|
+
hasInputs(directiveName) {
|
|
69
|
+
return this.directives.get(directiveName)?.hasInputs() || false;
|
|
70
|
+
}
|
|
71
|
+
hasOutputs(directiveName) {
|
|
72
|
+
return this.directives.get(directiveName)?.hasOutputs() || false;
|
|
73
|
+
}
|
|
74
|
+
getAttributes(directiveName) {
|
|
75
|
+
return this.directives.get(directiveName)?.getAttributes();
|
|
76
|
+
}
|
|
77
|
+
getInputs(directiveName) {
|
|
78
|
+
return this.directives.get(directiveName)?.getInputs();
|
|
79
|
+
}
|
|
80
|
+
getOutputs(directiveName) {
|
|
81
|
+
return this.directives.get(directiveName)?.getOutputs();
|
|
82
|
+
}
|
|
83
|
+
hasAttribute(directiveName, attributeName) {
|
|
84
|
+
return this.directives.get(directiveName)?.hasAttribute(attributeName) || false;
|
|
85
|
+
}
|
|
86
|
+
hasInput(directiveName, inputName) {
|
|
87
|
+
return this.directives.get(directiveName)?.hasInput(inputName) || false;
|
|
88
|
+
}
|
|
89
|
+
hasOutput(directiveName, outputName) {
|
|
90
|
+
return this.directives.get(directiveName)?.hasOutput(outputName) || false;
|
|
91
|
+
}
|
|
92
|
+
filterDirectives(attributes) {
|
|
93
|
+
return attributes.filter(name => this.has(name));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export const directiveRegistry = new DirectiveRegistry();
|
|
97
|
+
//# sourceMappingURL=register-directive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-directive.js","sourceRoot":"","sources":["../../../src/elements/directives/register-directive.ts"],"names":[],"mappings":"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","sourcesContent":["\n\nexport interface DirectiveNodeOptions {\n\n\t/**\n\t * list of inputs view name\n\t */\n\tinputs?: string[];\n\n\t/**\n\t * list of outputs view name\n\t */\n\toutputs?: string[];\n}\n\nclass DirectiveNodeInfo {\n\tconstructor(private inputs?: string[], private outputs?: string[]) { }\n\n\thasAttributes(): boolean {\n\t\treturn this.hasInputs() || this.hasOutputs();\n\t}\n\n\thasInputs(): boolean {\n\t\treturn (this.inputs?.length ?? 0) > 0;\n\t}\n\n\thasOutputs(): boolean {\n\t\treturn (this.outputs?.length ?? 0) > 0;\n\t}\n\n\tgetAttributes(): string[] | undefined {\n\t\tif (this.inputs && this.outputs) {\n\t\t\treturn this.inputs.concat(this.outputs);\n\t\t} else if (this.inputs) {\n\t\t\treturn this.inputs;\n\t\t} else if (this.outputs) {\n\t\t\treturn this.outputs;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tgetInputs(): string[] | undefined {\n\t\treturn this.inputs;\n\t}\n\n\tgetOutputs(): string[] | undefined {\n\t\treturn this.outputs;\n\t}\n\n\thasAttribute(attributeName: string): boolean {\n\t\treturn this.hasInput(attributeName) || this.hasOutput(attributeName);\n\t}\n\n\thasInput(inputName: string): boolean {\n\t\treturn this.inputs?.includes(inputName) || false;\n\t}\n\n\thasOutput(outputName: string): boolean {\n\t\treturn this.outputs?.includes(outputName) || false;\n\t}\n\n}\n\nexport class DirectiveRegistry {\n\n\t/**\n\t * store options info about directives\n\t */\n\tprivate directives = new Map<string, DirectiveNodeInfo>();\n\n\t/**\n\t * register a directive with a name,\n\t * \n\t * the directive could be a structural directive or an attribute directive.\n\t * \n\t * if the directive name exists, will not replace the old directive options.\n\t * @param directiveName \n\t * @param options contain the attributes of the registered directive name\n\t * @override\n\t */\n\tregister(directiveName: string, options?: DirectiveNodeOptions): void {\n\t\tif (!this.directives.has(directiveName)) {\n\t\t\tconst info = new DirectiveNodeInfo(options?.inputs, options?.outputs);\n\t\t\tthis.directives.set(directiveName, info);\n\t\t}\n\t}\n\n\t/**\n\t * replace the current options with a new one.\n\t * \n\t * the directive could be a structural directive or an attribute directive.\n\t * \n\t * if the directive name not exists, no set options will be done\n\t * @param directiveName \n\t * @param options to be replaced\n\t */\n\treplace(directiveName: string, options: DirectiveNodeOptions): void {\n\t\tif (this.directives.has(directiveName)) {\n\t\t\tconst info = new DirectiveNodeInfo(options?.inputs, options?.outputs);\n\t\t\tthis.directives.set(directiveName, info);\n\t\t}\n\t}\n\n\t/**\n\t * check if directive name is registered\n\t * @param directiveName \n\t * @returns `boolean`\n\t */\n\thas(attributeName: string): boolean {\n\t\treturn this.directives.has(attributeName);\n\t}\n\n\t/**\n\t * get the DirectiveOptions for a directive name\n\t * @param directiveName \n\t * @returns `DirectiveOptions` if the name has been registered, otherwise `undefined`\n\t */\n\tget(directiveName: string): DirectiveNodeInfo | undefined {\n\t\treturn this.directives.get(directiveName);\n\t}\n\n\t/**\n\t * check if the options registered with a `directiveName` has attributes array\n\t * @param directiveName \n\t * @returns `boolean`\n\t */\n\thasAttributes(directiveName: string): boolean {\n\t\treturn this.hasInputs(directiveName) || this.hasOutputs(directiveName);\n\t}\n\n\thasInputs(directiveName: string): boolean {\n\t\treturn this.directives.get(directiveName)?.hasInputs() || false;\n\t}\n\n\thasOutputs(directiveName: string): boolean {\n\t\treturn this.directives.get(directiveName)?.hasOutputs() || false;\n\t}\n\n\t/**\n\t * get the value of the registered inputs and outputs by directive name\n\t * @param directiveName \n\t * @returns array of strings if found, otherwise `undefined`\n\t */\n\tgetAttributes(directiveName: string): string[] | undefined {\n\t\treturn this.directives.get(directiveName)?.getAttributes();\n\t}\n\n\t/**\n\t * get the value of the registered inputs by directive name\n\t * @param directiveName \n\t * @returns array of strings if found, otherwise `undefined`\n\t */\n\tgetInputs(directiveName: string): string[] | undefined {\n\t\treturn this.directives.get(directiveName)?.getInputs();\n\t}\n\n\t/**\n\t * get the value of the registered outputs by directive name\n\t * @param directiveName \n\t * @returns array of strings if found, otherwise `undefined`\n\t */\n\tgetOutputs(directiveName: string): string[] | undefined {\n\t\treturn this.directives.get(directiveName)?.getOutputs();\n\t}\n\n\t/**\n\t * check if a directive has a attribute\n\t * @param directiveName \n\t * @param attributeName \n\t * @returns \n\t */\n\thasAttribute(directiveName: string, attributeName: string): boolean {\n\t\treturn this.directives.get(directiveName)?.hasAttribute(attributeName) || false;\n\t}\n\n\t/**\n\t * check if has input\n\t * @param directiveName \n\t * @param inputName \n\t * @returns \n\t */\n\thasInput(directiveName: string, inputName: string): boolean {\n\t\treturn this.directives.get(directiveName)?.hasInput(inputName) || false;\n\t}\n\n\t/**\n\t * check if has output\n\t * @param directiveName \n\t * @param outputName \n\t * @returns \n\t */\n\thasOutput(directiveName: string, outputName: string): boolean {\n\t\treturn this.directives.get(directiveName)?.hasOutput(outputName) || false;\n\t}\n\n\tfilterDirectives(attributes: string[]): string[] {\n\t\treturn attributes.filter(name => this.has(name));\n\t}\n\n}\n\nexport const directiveRegistry = new DirectiveRegistry();\n"]}
|
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -5,5 +5,6 @@ export * from './attributes/form.js';
|
|
|
5
5
|
export * from './ast/dom.js';
|
|
6
6
|
export * from './ast/factory.js';
|
|
7
7
|
export * from './node/html-parser.js';
|
|
8
|
+
export * from './directives/register-directive.js';
|
|
8
9
|
export * from './template/template-parser.js';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AAErC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './attributes/tags.js';\nexport * from './attributes/attributes.js';\nexport * from './attributes/shadow.js';\nexport * from './attributes/form.js';\n\nexport * from './ast/dom.js';\nexport * from './ast/factory.js';\n\nexport * from './node/html-parser.js';\n\nexport * from './template/template-parser.js';\n\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AAErC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,oCAAoC,CAAC;AAEnD,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './attributes/tags.js';\nexport * from './attributes/attributes.js';\nexport * from './attributes/shadow.js';\nexport * from './attributes/form.js';\n\nexport * from './ast/dom.js';\nexport * from './ast/factory.js';\n\nexport * from './node/html-parser.js';\n\nexport * from './directives/register-directive.js';\n\nexport * from './template/template-parser.js';\n\n"]}
|
package/node/html-parser.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomElementNode, DomStructuralDirectiveNode, DomNode, DomChild } from '../ast/dom.js';
|
|
2
2
|
export declare class EscapeHTMLCharacter {
|
|
3
3
|
static ESCAPE_MAP: {
|
|
4
4
|
[key: string]: string;
|
|
@@ -23,7 +23,7 @@ export declare class NodeParser {
|
|
|
23
23
|
private propertyValue;
|
|
24
24
|
private propType;
|
|
25
25
|
private escaper;
|
|
26
|
-
parse(html: string):
|
|
26
|
+
parse(html: string): DomChild[];
|
|
27
27
|
private reset;
|
|
28
28
|
private parseText;
|
|
29
29
|
private parseTag;
|
|
@@ -35,12 +35,15 @@ export declare class NodeParser {
|
|
|
35
35
|
private parseInputOutput;
|
|
36
36
|
private parsePropertyValue;
|
|
37
37
|
private popElement;
|
|
38
|
-
checkNode(node:
|
|
38
|
+
checkNode(node: DomElementNode): DomElementNode | DomStructuralDirectiveNode;
|
|
39
|
+
private extractDirectiveAttributesFromNode;
|
|
40
|
+
private extractDirectiveNames;
|
|
41
|
+
private getAttributeDirectives;
|
|
39
42
|
}
|
|
40
43
|
export declare class HTMLParser {
|
|
41
44
|
nodeParser: NodeParser;
|
|
42
|
-
parse(html: string):
|
|
43
|
-
toDomRootNode(html: string):
|
|
44
|
-
stringify(stack
|
|
45
|
+
parse(html: string): DomChild[];
|
|
46
|
+
toDomRootNode(html: string): DomNode;
|
|
47
|
+
stringify(stack?: DomNode[]): string;
|
|
45
48
|
}
|
|
46
49
|
export declare const htmlParser: HTMLParser;
|
package/node/html-parser.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isEmptyElement } from '../attributes/tags.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { DomElementNode, CommentNode, parseTextChild, TextContent, LiveTextContent, DomFragmentNode, DomStructuralDirectiveNode, DomAttributeDirectiveNode } from '../ast/dom.js';
|
|
3
|
+
import { directiveRegistry } from '../directives/register-directive.js';
|
|
4
4
|
export class EscapeHTMLCharacter {
|
|
5
5
|
constructor() {
|
|
6
6
|
const escapeRegexSource = '(?:' + Object.keys(EscapeHTMLCharacter.ESCAPE_MAP).join('|') + ')';
|
|
@@ -129,7 +129,7 @@ export class NodeParser {
|
|
|
129
129
|
}
|
|
130
130
|
parseOpenTag(token) {
|
|
131
131
|
if (token === '>') {
|
|
132
|
-
this.stackTrace.push(new
|
|
132
|
+
this.stackTrace.push(new DomElementNode(this.tempText));
|
|
133
133
|
if (isEmptyElement(this.tempText)) {
|
|
134
134
|
this.popElement();
|
|
135
135
|
}
|
|
@@ -141,7 +141,7 @@ export class NodeParser {
|
|
|
141
141
|
return this.parseOpenTag;
|
|
142
142
|
}
|
|
143
143
|
else if (/\s/.test(token)) {
|
|
144
|
-
this.stackTrace.push(new
|
|
144
|
+
this.stackTrace.push(new DomElementNode(this.tempText));
|
|
145
145
|
this.tempText = '';
|
|
146
146
|
this.propType = 'attr';
|
|
147
147
|
return this.parsePropertyName;
|
|
@@ -282,11 +282,11 @@ export class NodeParser {
|
|
|
282
282
|
const element = this.stackTrace.pop();
|
|
283
283
|
if (element) {
|
|
284
284
|
const parent = this.stackTrace.pop();
|
|
285
|
-
if (parent && parent instanceof
|
|
285
|
+
if (parent && parent instanceof DomElementNode) {
|
|
286
286
|
if (typeof element === 'string') {
|
|
287
287
|
parent.addTextChild(element);
|
|
288
288
|
}
|
|
289
|
-
else if (element instanceof
|
|
289
|
+
else if (element instanceof DomElementNode) {
|
|
290
290
|
parent.addChild(this.checkNode(element));
|
|
291
291
|
}
|
|
292
292
|
else {
|
|
@@ -298,7 +298,7 @@ export class NodeParser {
|
|
|
298
298
|
if (typeof element === 'string') {
|
|
299
299
|
parseTextChild(element).forEach(text => this.childStack.push(text));
|
|
300
300
|
}
|
|
301
|
-
else if (element instanceof
|
|
301
|
+
else if (element instanceof DomElementNode) {
|
|
302
302
|
this.childStack.push(this.checkNode(element));
|
|
303
303
|
}
|
|
304
304
|
else {
|
|
@@ -308,48 +308,137 @@ export class NodeParser {
|
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
310
|
checkNode(node) {
|
|
311
|
-
|
|
312
|
-
|
|
311
|
+
const attributes = node.attributes;
|
|
312
|
+
if (attributes) {
|
|
313
|
+
let temp;
|
|
314
|
+
temp = attributes.find(attr => attr.name === 'is');
|
|
313
315
|
if (temp) {
|
|
314
|
-
|
|
316
|
+
attributes.splice(attributes.indexOf(temp), 1);
|
|
315
317
|
node.is = temp.value;
|
|
316
318
|
}
|
|
317
|
-
temp =
|
|
319
|
+
temp = attributes.filter(attr => {
|
|
318
320
|
return typeof attr.value === 'string' && (/\{\{(.+)\}\}/g).test(attr.value);
|
|
319
321
|
});
|
|
320
|
-
if (temp) {
|
|
322
|
+
if (temp?.length) {
|
|
321
323
|
temp.forEach(templateAttrs => {
|
|
322
|
-
|
|
324
|
+
attributes.splice(attributes.indexOf(templateAttrs), 1);
|
|
323
325
|
node.addTemplateAttr(templateAttrs.name, templateAttrs.value);
|
|
324
326
|
});
|
|
325
327
|
}
|
|
326
|
-
temp =
|
|
327
|
-
if (temp) {
|
|
328
|
+
temp = attributes.filter(attr => attr.name.startsWith('on'));
|
|
329
|
+
if (temp?.length) {
|
|
328
330
|
temp.forEach(templateAttrs => {
|
|
329
|
-
|
|
331
|
+
attributes.splice(attributes.indexOf(templateAttrs), 1);
|
|
330
332
|
node.addOutput(templateAttrs.name.substring(2), templateAttrs.value);
|
|
331
333
|
});
|
|
332
334
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
335
|
+
}
|
|
336
|
+
const directiveNames = this.extractDirectiveNames(node);
|
|
337
|
+
let sdName;
|
|
338
|
+
if (directiveNames.length) {
|
|
339
|
+
const directives = [];
|
|
340
|
+
directiveNames.forEach(attributeName => {
|
|
341
|
+
if (attributeName.startsWith('*')) {
|
|
342
|
+
if (sdName) {
|
|
343
|
+
console.error(`Only one Structural Directive is allowed on an element [${sdName}, ${attributeName}]`);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
sdName = attributeName;
|
|
347
|
+
return;
|
|
343
348
|
}
|
|
344
|
-
const
|
|
345
|
-
|
|
349
|
+
const directive = new DomAttributeDirectiveNode(attributeName);
|
|
350
|
+
if (directiveRegistry.get(attributeName).hasAttributes()) {
|
|
351
|
+
this.extractDirectiveAttributesFromNode(attributeName, directive, node);
|
|
352
|
+
}
|
|
353
|
+
directives.push(directive);
|
|
354
|
+
});
|
|
355
|
+
if (directives.length) {
|
|
356
|
+
node.attributeDirectives = directives;
|
|
346
357
|
}
|
|
347
358
|
}
|
|
348
|
-
|
|
349
|
-
|
|
359
|
+
if (sdName) {
|
|
360
|
+
const temp = node.attributes.filter(attr => attr.name == sdName)[0];
|
|
361
|
+
node.attributes.splice(node.attributes.indexOf(temp), 1);
|
|
362
|
+
const isTemplate = node.tagName === 'template';
|
|
363
|
+
const directiveNode = isTemplate ? new DomFragmentNode(node.children) : node;
|
|
364
|
+
const directive = (typeof temp?.value === 'boolean')
|
|
365
|
+
? new DomStructuralDirectiveNode(temp.name, directiveNode)
|
|
366
|
+
: new DomStructuralDirectiveNode(temp.name, directiveNode, String(temp.value));
|
|
367
|
+
const directiveName = temp.name.substring(1);
|
|
368
|
+
if (isTemplate) {
|
|
369
|
+
directive.inputs = node.inputs;
|
|
370
|
+
directive.outputs = node.outputs;
|
|
371
|
+
directive.attributes = node.attributes;
|
|
372
|
+
directive.templateAttrs = node.templateAttrs;
|
|
373
|
+
directive.attributeDirectives = node.attributeDirectives;
|
|
374
|
+
}
|
|
375
|
+
else if (directiveRegistry.hasAttributes(directiveName)) {
|
|
376
|
+
this.extractDirectiveAttributesFromNode(directiveName, directive, node);
|
|
377
|
+
directive.attributeDirectives = node.attributeDirectives;
|
|
378
|
+
}
|
|
379
|
+
if (isTemplate && node.templateRefName) {
|
|
380
|
+
node.children = [directive];
|
|
381
|
+
return node;
|
|
382
|
+
}
|
|
383
|
+
return directive;
|
|
384
|
+
}
|
|
385
|
+
if (directiveRegistry.has('*' + node.tagName)) {
|
|
386
|
+
const children = new DomFragmentNode(node.children);
|
|
387
|
+
const directive = new DomStructuralDirectiveNode('*' + node.tagName, children);
|
|
388
|
+
directive.inputs = node.inputs;
|
|
389
|
+
directive.outputs = node.outputs;
|
|
390
|
+
directive.attributes = node.attributes;
|
|
391
|
+
directive.templateAttrs = node.templateAttrs;
|
|
392
|
+
directive.attributeDirectives = node.attributeDirectives;
|
|
393
|
+
return directive;
|
|
350
394
|
}
|
|
351
395
|
return node;
|
|
352
396
|
}
|
|
397
|
+
extractDirectiveAttributesFromNode(directiveName, directive, node) {
|
|
398
|
+
const attributes = directiveRegistry.getAttributes(directiveName);
|
|
399
|
+
if (!attributes) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
const filterByAttrName = createFilterByAttrName(attributes);
|
|
403
|
+
directive.attributes = node.attributes?.filter(filterByAttrName);
|
|
404
|
+
directive.inputs = node.inputs?.filter(filterByAttrName);
|
|
405
|
+
directive.outputs = node.outputs?.filter(filterByAttrName);
|
|
406
|
+
directive.twoWayBinding = node.twoWayBinding?.filter(filterByAttrName);
|
|
407
|
+
directive.templateAttrs = node.templateAttrs?.filter(filterByAttrName);
|
|
408
|
+
node.inputs && directive.inputs?.forEach(createArrayCleaner(node.inputs));
|
|
409
|
+
node.outputs && directive.outputs?.forEach(createArrayCleaner(node.outputs));
|
|
410
|
+
node.twoWayBinding && directive.twoWayBinding?.forEach(createArrayCleaner(node.twoWayBinding));
|
|
411
|
+
node.attributes && directive.attributes?.forEach(createArrayCleaner(node.attributes));
|
|
412
|
+
node.templateAttrs && directive.templateAttrs?.forEach(createArrayCleaner(node.templateAttrs));
|
|
413
|
+
}
|
|
414
|
+
extractDirectiveNames(node) {
|
|
415
|
+
const names = [];
|
|
416
|
+
if (node.attributes?.length) {
|
|
417
|
+
names.push(...this.getAttributeDirectives(node.attributes));
|
|
418
|
+
}
|
|
419
|
+
if (node.inputs?.length) {
|
|
420
|
+
names.push(...this.getAttributeDirectives(node.inputs));
|
|
421
|
+
}
|
|
422
|
+
if (node.twoWayBinding?.length) {
|
|
423
|
+
names.push(...this.getAttributeDirectives(node.twoWayBinding));
|
|
424
|
+
}
|
|
425
|
+
if (node.templateAttrs?.length) {
|
|
426
|
+
names.push(...this.getAttributeDirectives(node.templateAttrs));
|
|
427
|
+
}
|
|
428
|
+
if (node.outputs?.length) {
|
|
429
|
+
names.push(...this.getAttributeDirectives(node.outputs));
|
|
430
|
+
}
|
|
431
|
+
return names;
|
|
432
|
+
}
|
|
433
|
+
getAttributeDirectives(attributes) {
|
|
434
|
+
return directiveRegistry.filterDirectives(attributes.map(attr => attr.name));
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
function createFilterByAttrName(attributes) {
|
|
438
|
+
return (attr) => attributes.includes(attr.name);
|
|
439
|
+
}
|
|
440
|
+
function createArrayCleaner(attributes) {
|
|
441
|
+
return (attr) => attributes.splice(attributes.indexOf(attr), 1);
|
|
353
442
|
}
|
|
354
443
|
export class HTMLParser {
|
|
355
444
|
constructor() {
|
|
@@ -361,13 +450,13 @@ export class HTMLParser {
|
|
|
361
450
|
toDomRootNode(html) {
|
|
362
451
|
let stack = this.nodeParser.parse(html);
|
|
363
452
|
if (!stack || stack.length === 0) {
|
|
364
|
-
return new
|
|
453
|
+
return new DomFragmentNode([new TextContent('')]);
|
|
365
454
|
}
|
|
366
455
|
else if (stack?.length === 1) {
|
|
367
456
|
return stack[0];
|
|
368
457
|
}
|
|
369
458
|
else {
|
|
370
|
-
return new
|
|
459
|
+
return new DomFragmentNode(stack);
|
|
371
460
|
}
|
|
372
461
|
}
|
|
373
462
|
stringify(stack) {
|
|
@@ -382,7 +471,7 @@ export class HTMLParser {
|
|
|
382
471
|
else if (node instanceof CommentNode) {
|
|
383
472
|
html += `<!-- ${node.comment} -->`;
|
|
384
473
|
}
|
|
385
|
-
else if (node instanceof
|
|
474
|
+
else if (node instanceof DomElementNode) {
|
|
386
475
|
let attrs = '';
|
|
387
476
|
if (node.attributes) {
|
|
388
477
|
attrs += node.attributes.map(attr => `${attr.name}="${attr.value}"`).join(' ') + ' ';
|
package/node/html-parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-parser.js","sourceRoot":"","sources":["../../../src/elements/node/html-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyElement } from '../attributes/tags.js';\nimport {\n\tDOMElementNode, CommentNode, parseTextChild,\n\tTextContent, LiveTextContent, DOMFragmentNode,\n\tDOMDirectiveNode, DOMNode, DOMChild, ElementAttribute\n} from '../ast/dom.js';\nimport { NodeFactory } from '../ast/factory.js';\n\ntype Token = (token: string) => Token;\n\ntype ChildNode = DOMElementNode | CommentNode | string;\n\nexport class EscapeHTMLCharacter {\n\tstatic ESCAPE_MAP: { [key: string]: string } = {\n\t\t'&': '&',\n\t\t'<': '<',\n\t\t'>': '>',\n\t\t'"': '\"',\n\t\t''': \"'\",\n\t\t'`': '`'\n\t};\n\ttest: RegExp;\n\treplace: RegExp;\n\tconstructor() {\n\t\tconst escapeRegexSource = '(?:' + Object.keys(EscapeHTMLCharacter.ESCAPE_MAP).join('|') + ')';\n\t\tthis.test = new RegExp(escapeRegexSource);\n\t\tthis.replace = new RegExp(escapeRegexSource, 'g');\n\t}\n\n\tescaper(match: string): string {\n\t\treturn EscapeHTMLCharacter.ESCAPE_MAP[match];\n\t}\n\n\tunescape(text: string): string {\n\t\tif (!text) {\n\t\t\treturn text;\n\t\t}\n\t\treturn this.test.test(text) ? text.replace(this.replace, this.escaper) : text;\n\t}\n}\n\nexport class NodeParser {\n\n\tprivate index: number;\n\tprivate stateFn: Token;\n\n\tprivate tagNameRegExp = /[\\-\\.0-9_a-z\\xB7\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u037D\\u037F-\\u1FFF\\u200C\\u200D\\u203F\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]|[\\uD800-\\uDB7F][\\uDC00-\\uDFFF]/;\n\n\tprivate childStack: DOMChild[];\n\tprivate stackTrace: ChildNode[];\n\n\tprivate get currentNode(): DOMElementNode {\n\t\treturn this.stackTrace[this.stackTrace.length - 1] as DOMElementNode;\n\t}\n\n\tprivate commentOpenCount = 0;\n\tprivate commentCloseCount = 0;\n\n\tprivate tempText: string;\n\n\tprivate propertyName: string;\n\tprivate propertyValue: string;\n\tprivate propType: 'attr' | 'ref-name' | 'input' | 'output' | 'two-way';\n\n\tprivate escaper = new EscapeHTMLCharacter();\n\n\tparse(html: string)/*: DomNode*/ {\n\t\tthis.reset();\n\t\tfor (; this.index < html.length; this.index++) {\n\t\t\tthis.stateFn = this.stateFn(html[this.index]);\n\t\t}\n\t\tif (this.tempText && this.stateFn === this.parseText) {\n\t\t\tthis.stateFn('<');\n\t\t}\n\t\tif (this.stackTrace.length > 0) {\n\t\t\tconsole.error(this.stackTrace);\n\t\t\tthrow new Error(`error parsing html, had ${this.stackTrace.length} element, with no closing tag`);\n\t\t}\n\t\tlet stack = this.childStack;\n\t\tthis.reset();\n\t\treturn stack;\n\t}\n\n\tprivate reset() {\n\t\tthis.index = 0;\n\t\tthis.childStack = [];\n\t\tthis.stackTrace = [];\n\t\tthis.propType = 'attr';\n\t\tthis.commentOpenCount = 0;\n\t\tthis.commentCloseCount = 0;\n\t\tthis.stateFn = this.parseText;\n\t\tthis.propertyName = this.propertyValue = this.tempText = '';\n\t}\n\n\tprivate parseText(token: string) {\n\t\tif (token === '<') {\n\t\t\tif (this.tempText) {\n\t\t\t\tthis.tempText = this.escaper.unescape(this.tempText);\n\t\t\t\tthis.stackTrace.push(this.tempText);\n\t\t\t\tthis.popElement();\n\t\t\t\tthis.tempText = '';\n\t\t\t}\n\t\t\treturn this.parseTag;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseText;\n\t}\n\n\tprivate parseTag(token: string) {\n\t\tif (token === '/') {\n\t\t\treturn this.parseCloseTag;\n\t\t}\n\t\tif (token === '!') {\n\t\t\tthis.commentOpenCount = 0;\n\t\t\tthis.commentCloseCount = 0;\n\t\t\treturn this.parseComment;\n\t\t}\n\t\tthis.index--;\n\t\treturn this.parseOpenTag;\n\t}\n\n\tprivate parseComment(token: string) {\n\t\tif (token === '-') {\n\t\t\tif (this.commentOpenCount < 2) {\n\t\t\t\tthis.commentOpenCount++;\n\t\t\t} else {\n\t\t\t\tthis.commentCloseCount++;\n\t\t\t}\n\t\t\treturn this.parseComment;\n\t\t}\n\t\telse if (token === '>' && this.commentCloseCount === 2) {\n\t\t\tthis.tempText = this.escaper.unescape(this.tempText);\n\t\t\tthis.stackTrace.push(new CommentNode(this.tempText.trim()));\n\t\t\tthis.popElement();\n\t\t\tthis.tempText = '';\n\t\t\tthis.commentOpenCount = 0;\n\t\t\tthis.commentCloseCount = 0;\n\t\t\treturn this.parseText;\n\t\t}\n\t\tif (this.commentCloseCount > 0) {\n\t\t\tfor (let i = 0; i < this.commentCloseCount; i++) {\n\t\t\t\tthis.tempText += '-';\n\t\t\t}\n\t\t\tthis.commentCloseCount = 0;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseComment;\n\t}\n\n\tprivate parseCloseTag(token: string) {\n\t\tif (token === '>') {\n\t\t\tif (!isEmptyElement(this.currentNode.tagName)\n\t\t\t\t&& this.currentNode.tagName.trim().toLowerCase() !== this.tempText.trim().toLowerCase()\n\t\t\t) {\n\t\t\t\tthrow 'Wrong closed tag at char ' + this.index;\n\t\t\t}\n\t\t\tthis.popElement();\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parseText;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseCloseTag;\n\t}\n\n\tprivate parseOpenTag(token: string) {\n\t\tif (token === '>') {\n\t\t\tthis.stackTrace.push(new DOMElementNode(this.tempText));\n\t\t\tif (isEmptyElement(this.tempText)) {\n\t\t\t\tthis.popElement();\n\t\t\t}\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parseText;\n\t\t}\n\t\telse if (this.tagNameRegExp.test(token)) {\n\t\t\tthis.tempText += token;\n\t\t\treturn this.parseOpenTag;\n\t\t}\n\t\telse if (/\\s/.test(token)) {\n\t\t\tthis.stackTrace.push(new DOMElementNode(this.tempText));\n\t\t\tthis.tempText = '';\n\t\t\tthis.propType = 'attr';\n\t\t\treturn this.parsePropertyName;\n\t\t}\n\t}\n\n\tprivate parsePropertyName(token: string) {\n\t\tif (token === '>') {\n\t\t\tif (this.tempText.trim()) {\n\t\t\t\tthis.propertyName = this.tempText;\n\t\t\t\tthis.currentNode.addAttribute(this.propertyName, true);\n\t\t\t\tthis.propertyName, this.propertyValue = this.tempText = '';\n\t\t\t}\n\t\t\tif (isEmptyElement(this.currentNode.tagName)) {\n\t\t\t\tthis.popElement();\n\t\t\t}\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parseText;\n\t\t}\n\t\telse if (token === '/') {\n\t\t\treturn this.parsePropertyName;\n\t\t}\n\t\telse if (/\\[/.test(token)) {\n\t\t\tthis.propType = 'input';\n\t\t\treturn this.parseInputOutput;\n\t\t}\n\t\telse if (/\\(|@/.test(token)) {\n\t\t\tthis.propType = 'output';\n\t\t\treturn this.parseInputOutput;\n\t\t}\n\t\telse if (/#/.test(token)) {\n\t\t\tthis.propType = 'ref-name';\n\t\t\treturn this.parseRefName;\n\t\t}\n\t\telse if (/=/.test(token)) {\n\t\t\tthis.propertyName = this.tempText;\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parsePropertyName;\n\t\t} else if (/\"/.test(token)) {\n\t\t\treturn this.parsePropertyValue;\n\t\t} else if (/\\d/.test(token)) {\n\t\t\tthis.tempText += token;\n\t\t\treturn this.parsePropertyValue;\n\t\t}\n\t\telse if (/\\s/.test(token)) {\n\t\t\tif (this.tempText.trim()) {\n\t\t\t\tthis.propertyName = this.tempText;\n\t\t\t\tthis.currentNode.addAttribute(this.propertyName, true);\n\t\t\t\tthis.propertyName, this.propertyValue = this.tempText = '';\n\t\t\t}\n\t\t\treturn this.parsePropertyName;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parsePropertyName;\n\t}\n\n\n\n\tprivate parseRefName(token: string) {\n\t\tif (/=/.test(token)) {\n\t\t\treturn this.parseRefName;\n\t\t}\n\t\telse if (/\"/.test(token)) {\n\t\t\tthis.propertyName = this.tempText;\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parsePropertyValue;\n\t\t} else if (/\\s/.test(token)) {\n\t\t\tthis.currentNode.setTemplateRefName(this.tempText, '');\n\t\t\tthis.propertyName = this.tempText = '';\n\t\t\tthis.propType = 'attr';\n\t\t\treturn this.parsePropertyName;\n\t\t} else if (/>/.test(token)) {\n\t\t\tthis.currentNode.setTemplateRefName(this.tempText, '');\n\t\t\tthis.propertyName = this.tempText = '';\n\t\t\tthis.propType = 'attr';\n\t\t\treturn this.parseText;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseRefName;\n\t}\n\n\tprivate parseInputOutput(token: string) {\n\t\tif (/\\(/.test(token)) {\n\t\t\tthis.propType = 'two-way';\n\t\t\treturn this.parseInputOutput;\n\t\t}\n\t\telse if (/\\)|\\]|=/.test(token)) {\n\t\t\treturn this.parseInputOutput;\n\t\t}\n\t\telse if (/\"/.test(token)) {\n\t\t\tthis.propertyName = this.tempText;\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parsePropertyValue;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseInputOutput;\n\t}\n\n\tprivate parsePropertyValue(token: string) {\n\t\tif (/\"/.test(token)) {\n\t\t\tthis.propertyValue = this.tempText;\n\t\t\tswitch (this.propType) {\n\t\t\t\tcase 'input':\n\t\t\t\t\tthis.currentNode.addInput(this.propertyName, this.propertyValue);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'output':\n\t\t\t\t\tthis.currentNode.addOutput(this.propertyName, this.propertyValue);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'two-way':\n\t\t\t\t\tthis.currentNode.addTwoWayBinding(this.propertyName, this.propertyValue);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ref-name':\n\t\t\t\t\tthis.currentNode.setTemplateRefName(this.propertyName, this.propertyValue);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'attr':\n\t\t\t\tdefault:\n\t\t\t\t\tif (/^([-+]?\\d*\\.?\\d+)(?:[eE]([-+]?\\d+))?$/.test(this.propertyValue.trim())) {\n\t\t\t\t\t\tthis.currentNode.addAttribute(this.propertyName, +this.propertyValue.trim());\n\t\t\t\t\t} else if (/^(true|false)$/.test(this.propertyValue.trim().toLowerCase())) {\n\t\t\t\t\t\tif (this.propertyValue.trim().toLowerCase() === 'true') {\n\t\t\t\t\t\t\tthis.currentNode.addAttribute(this.propertyName, true);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.currentNode.addAttribute(this.propertyName, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.currentNode.addAttribute(this.propertyName, this.propertyValue);\n\t\t\t\t\t}\n\t\t\t}\n\t\t\tthis.propertyName, this.propertyValue = this.tempText = '';\n\t\t\tthis.propType = 'attr';\n\t\t\treturn this.parsePropertyName;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parsePropertyValue;\n\t}\n\n\n\tprivate popElement() {\n\t\tconst element = this.stackTrace.pop();\n\t\tif (element) {\n\t\t\tconst parent = this.stackTrace.pop();\n\t\t\tif (parent && parent instanceof DOMElementNode) {\n\t\t\t\tif (typeof element === 'string') {\n\t\t\t\t\tparent.addTextChild(element);\n\t\t\t\t} else if (element instanceof DOMElementNode) {\n\t\t\t\t\tparent.addChild(this.checkNode(element));\n\t\t\t\t} else {\n\t\t\t\t\tparent.addChild(element);\n\t\t\t\t}\n\t\t\t\tthis.stackTrace.push(parent);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (typeof element === 'string') {\n\t\t\t\t\tparseTextChild(element).forEach(text => this.childStack.push(text));\n\t\t\t\t} else if (element instanceof DOMElementNode) {\n\t\t\t\t\tthis.childStack.push(this.checkNode(element));\n\t\t\t\t} else {\n\t\t\t\t\tthis.childStack.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcheckNode(node: DOMElementNode): DOMElementNode | DOMDirectiveNode {\n\t\tif (node.attributes) {\n\t\t\tlet temp: ElementAttribute<string, any> | ElementAttribute<string, any>[] | undefined = node.attributes.find(attr => attr.name === 'is');\n\t\t\tif (temp) {\n\t\t\t\tnode.attributes.splice(node.attributes.indexOf(temp), 1);\n\t\t\t\tnode.is = temp.value as string;\n\t\t\t}\n\t\t\ttemp = node.attributes.filter(attr => {\n\t\t\t\treturn typeof attr.value === 'string' && (/\\{\\{(.+)\\}\\}/g).test(attr.value);\n\t\t\t});\n\t\t\tif (temp) {\n\t\t\t\ttemp.forEach(templateAttrs => {\n\t\t\t\t\tnode.attributes.splice(node.attributes.indexOf(templateAttrs), 1);\n\t\t\t\t\tnode.addTemplateAttr(templateAttrs.name, templateAttrs.value as string);\n\t\t\t\t});\n\t\t\t}\n\t\t\ttemp = node.attributes.filter(attr => attr.name.startsWith('on'));\n\t\t\tif (temp) {\n\t\t\t\ttemp.forEach(templateAttrs => {\n\t\t\t\t\tnode.attributes.splice(node.attributes.indexOf(templateAttrs), 1);\n\t\t\t\t\tnode.addOutput(templateAttrs.name.substring(2), templateAttrs.value as string);\n\t\t\t\t});\n\t\t\t}\n\t\t\ttemp = node.attributes.find(attr => attr.name?.startsWith('*'));\n\t\t\tif (temp) {\n\t\t\t\tnode.attributes.splice(node.attributes.indexOf(temp), 1);\n\t\t\t\tconst directiveNode = (node.tagName === 'template') ? new DOMFragmentNode(node.children) : node;\n\t\t\t\treturn new DOMDirectiveNode(temp.name, temp.value as string ?? '', directiveNode);\n\t\t\t}\n\t\t\tif (NodeFactory.StructuralDirectives.includes(node.tagName)) {\n\t\t\t\t// try to find expression attribute\n\t\t\t\t// <if expression=\"a === b\">child text <div>...</div></if>\n\t\t\t\ttemp = node.attributes.find(attr => attr.name === 'expression');\n\t\t\t\tif (temp) {\n\t\t\t\t\tnode.attributes.splice(node.attributes.indexOf(temp as ElementAttribute<string, string | number | boolean | object>), 1);\n\t\t\t\t}\n\t\t\t\tconst directiveNode = (node.tagName === 'template') ? new DOMFragmentNode(node.children) : node;\n\t\t\t\treturn new DOMDirectiveNode('*' + node.tagName, temp?.value as string ?? '', directiveNode);\n\t\t\t}\n\t\t} else if (NodeFactory.StructuralDirectives.includes(node.tagName)) {\n\t\t\t// support structural directives without expression property\n\t\t\t// <add-note >text</add-note>\n\t\t\treturn new DOMDirectiveNode('*' + node.tagName, '', new DOMFragmentNode(node.children));\n\t\t}\n\t\treturn node;\n\t}\n\n}\n\nexport class HTMLParser {\n\n\tnodeParser = new NodeParser();\n\n\tparse(html: string): DOMChild[] {\n\t\treturn this.nodeParser.parse(html);\n\t}\n\n\ttoDomRootNode(html: string): DOMNode {\n\t\tlet stack = this.nodeParser.parse(html);\n\t\tif (!stack || stack.length === 0) {\n\t\t\treturn new DOMFragmentNode([new TextContent('')]);\n\t\t} else if (stack?.length === 1) {\n\t\t\treturn stack[0];\n\t\t} else {\n\t\t\treturn new DOMFragmentNode(stack);\n\t\t}\n\t}\n\n\tstringify(stack: DOMNode[]) {\n\t\tlet html = '';\n\t\tstack?.forEach(node => {\n\t\t\tif (node instanceof TextContent) {\n\t\t\t\thtml += node.value;\n\t\t\t} else if (node instanceof LiveTextContent) {\n\t\t\t\thtml += `{{${node.value}}}`;\n\t\t\t} else if (node instanceof CommentNode) {\n\t\t\t\thtml += `<!-- ${node.comment} -->`;\n\t\t\t} else if (node instanceof DOMElementNode) {\n\t\t\t\tlet attrs = '';\n\t\t\t\tif (node.attributes) {\n\t\t\t\t\tattrs += node.attributes.map(attr => `${attr.name}=\"${attr.value}\"`).join(' ') + ' ';\n\t\t\t\t}\n\t\t\t\tif (node.twoWayBinding) {\n\t\t\t\t\tattrs += node.twoWayBinding.map(attr => `[(${attr.name})]=\"${attr.value}\"`).join(' ').concat(' ');\n\t\t\t\t}\n\t\t\t\tif (node.inputs) {\n\t\t\t\t\tattrs += node.inputs.map(attr => `[${attr.name}]=\"${attr.value}\"`).join(' ').concat(' ');\n\t\t\t\t}\n\t\t\t\tif (node.outputs) {\n\t\t\t\t\tattrs += node.outputs.map(attr => `(${attr.name})=\"${attr.value}\"`).join(' ').concat(' ');\n\t\t\t\t}\n\t\t\t\tif (node.templateAttrs) {\n\t\t\t\t\tattrs += node.templateAttrs.map(attr => `${attr.name}=\"${attr.value}\"`).join(' ').concat(' ');\n\t\t\t\t}\n\t\t\t\tif (isEmptyElement(node.tagName)) {\n\t\t\t\t\tif (attrs) {\n\t\t\t\t\t\thtml += `<${node.tagName} ${attrs}/>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thtml += `<${node.tagName} />`;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet children = this.stringify(node.children);\n\t\t\t\t\tif (attrs && children) {\n\t\t\t\t\t\thtml += `<${node.tagName} ${attrs}>${children}</${node.tagName}>`;\n\t\t\t\t\t}\n\t\t\t\t\telse if (attrs) {\n\t\t\t\t\t\thtml += `<${node.tagName} ${attrs}></${node.tagName}>`;\n\t\t\t\t\t} else if (children) {\n\t\t\t\t\t\thtml += `<${node.tagName}>${children}<</${node.tagName}>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thtml += `<${node.tagName}></${node.tagName}>`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn html;\n\t}\n\n}\n\nexport const htmlParser = new HTMLParser();\n\n"]}
|
|
1
|
+
{"version":3,"file":"html-parser.js","sourceRoot":"","sources":["../../../src/elements/node/html-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyElement } from '../attributes/tags.js';\nimport {\n\tDomElementNode, CommentNode, parseTextChild,\n\tTextContent, LiveTextContent, DomFragmentNode,\n\tDomStructuralDirectiveNode, DomNode, DomChild,\n\tElementAttribute, Attribute, DomAttributeDirectiveNode, BaseNode\n} from '../ast/dom.js';\nimport { directiveRegistry } from '../directives/register-directive.js';\n\ntype Token = (token: string) => Token;\n\ntype ChildNode = DomElementNode | CommentNode | string;\n\nexport class EscapeHTMLCharacter {\n\tstatic ESCAPE_MAP: { [key: string]: string } = {\n\t\t'&': '&',\n\t\t'<': '<',\n\t\t'>': '>',\n\t\t'"': '\"',\n\t\t''': \"'\",\n\t\t'`': '`'\n\t};\n\ttest: RegExp;\n\treplace: RegExp;\n\tconstructor() {\n\t\tconst escapeRegexSource = '(?:' + Object.keys(EscapeHTMLCharacter.ESCAPE_MAP).join('|') + ')';\n\t\tthis.test = new RegExp(escapeRegexSource);\n\t\tthis.replace = new RegExp(escapeRegexSource, 'g');\n\t}\n\n\tescaper(match: string): string {\n\t\treturn EscapeHTMLCharacter.ESCAPE_MAP[match];\n\t}\n\n\tunescape(text: string): string {\n\t\tif (!text) {\n\t\t\treturn text;\n\t\t}\n\t\treturn this.test.test(text) ? text.replace(this.replace, this.escaper) : text;\n\t}\n}\n\nexport class NodeParser {\n\n\tprivate index: number;\n\tprivate stateFn: Token;\n\n\tprivate tagNameRegExp = /[\\-\\.0-9_a-z\\xB7\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u037D\\u037F-\\u1FFF\\u200C\\u200D\\u203F\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]|[\\uD800-\\uDB7F][\\uDC00-\\uDFFF]/;\n\n\tprivate childStack: DomChild[];\n\tprivate stackTrace: ChildNode[];\n\n\tprivate get currentNode(): DomElementNode {\n\t\treturn this.stackTrace[this.stackTrace.length - 1] as DomElementNode;\n\t}\n\n\tprivate commentOpenCount = 0;\n\tprivate commentCloseCount = 0;\n\n\tprivate tempText: string;\n\n\tprivate propertyName: string;\n\tprivate propertyValue: string;\n\tprivate propType: 'attr' | 'ref-name' | 'input' | 'output' | 'two-way';\n\n\tprivate escaper = new EscapeHTMLCharacter();\n\n\tparse(html: string)/*: DomNode*/ {\n\t\tthis.reset();\n\t\tfor (; this.index < html.length; this.index++) {\n\t\t\tthis.stateFn = this.stateFn(html[this.index]);\n\t\t}\n\t\tif (this.tempText && this.stateFn === this.parseText) {\n\t\t\tthis.stateFn('<');\n\t\t}\n\t\tif (this.stackTrace.length > 0) {\n\t\t\tconsole.error(this.stackTrace);\n\t\t\tthrow new Error(`error parsing html, had ${this.stackTrace.length} element, with no closing tag`);\n\t\t}\n\t\tlet stack = this.childStack;\n\t\tthis.reset();\n\t\treturn stack;\n\t}\n\n\tprivate reset() {\n\t\tthis.index = 0;\n\t\tthis.childStack = [];\n\t\tthis.stackTrace = [];\n\t\tthis.propType = 'attr';\n\t\tthis.commentOpenCount = 0;\n\t\tthis.commentCloseCount = 0;\n\t\tthis.stateFn = this.parseText;\n\t\tthis.propertyName = this.propertyValue = this.tempText = '';\n\t}\n\n\tprivate parseText(token: string) {\n\t\tif (token === '<') {\n\t\t\tif (this.tempText) {\n\t\t\t\tthis.tempText = this.escaper.unescape(this.tempText);\n\t\t\t\tthis.stackTrace.push(this.tempText);\n\t\t\t\tthis.popElement();\n\t\t\t\tthis.tempText = '';\n\t\t\t}\n\t\t\treturn this.parseTag;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseText;\n\t}\n\n\tprivate parseTag(token: string) {\n\t\tif (token === '/') {\n\t\t\treturn this.parseCloseTag;\n\t\t}\n\t\tif (token === '!') {\n\t\t\tthis.commentOpenCount = 0;\n\t\t\tthis.commentCloseCount = 0;\n\t\t\treturn this.parseComment;\n\t\t}\n\t\tthis.index--;\n\t\treturn this.parseOpenTag;\n\t}\n\n\tprivate parseComment(token: string) {\n\t\tif (token === '-') {\n\t\t\tif (this.commentOpenCount < 2) {\n\t\t\t\tthis.commentOpenCount++;\n\t\t\t} else {\n\t\t\t\tthis.commentCloseCount++;\n\t\t\t}\n\t\t\treturn this.parseComment;\n\t\t}\n\t\telse if (token === '>' && this.commentCloseCount === 2) {\n\t\t\tthis.tempText = this.escaper.unescape(this.tempText);\n\t\t\tthis.stackTrace.push(new CommentNode(this.tempText.trim()));\n\t\t\tthis.popElement();\n\t\t\tthis.tempText = '';\n\t\t\tthis.commentOpenCount = 0;\n\t\t\tthis.commentCloseCount = 0;\n\t\t\treturn this.parseText;\n\t\t}\n\t\tif (this.commentCloseCount > 0) {\n\t\t\tfor (let i = 0; i < this.commentCloseCount; i++) {\n\t\t\t\tthis.tempText += '-';\n\t\t\t}\n\t\t\tthis.commentCloseCount = 0;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseComment;\n\t}\n\n\tprivate parseCloseTag(token: string) {\n\t\tif (token === '>') {\n\t\t\tif (!isEmptyElement(this.currentNode.tagName)\n\t\t\t\t&& this.currentNode.tagName.trim().toLowerCase() !== this.tempText.trim().toLowerCase()\n\t\t\t) {\n\t\t\t\tthrow 'Wrong closed tag at char ' + this.index;\n\t\t\t}\n\t\t\tthis.popElement();\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parseText;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseCloseTag;\n\t}\n\n\tprivate parseOpenTag(token: string) {\n\t\tif (token === '>') {\n\t\t\tthis.stackTrace.push(new DomElementNode(this.tempText));\n\t\t\tif (isEmptyElement(this.tempText)) {\n\t\t\t\tthis.popElement();\n\t\t\t}\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parseText;\n\t\t}\n\t\telse if (this.tagNameRegExp.test(token)) {\n\t\t\tthis.tempText += token;\n\t\t\treturn this.parseOpenTag;\n\t\t}\n\t\telse if (/\\s/.test(token)) {\n\t\t\tthis.stackTrace.push(new DomElementNode(this.tempText));\n\t\t\tthis.tempText = '';\n\t\t\tthis.propType = 'attr';\n\t\t\treturn this.parsePropertyName;\n\t\t}\n\t}\n\n\tprivate parsePropertyName(token: string) {\n\t\tif (token === '>') {\n\t\t\tif (this.tempText.trim()) {\n\t\t\t\tthis.propertyName = this.tempText;\n\t\t\t\tthis.currentNode.addAttribute(this.propertyName, true);\n\t\t\t\tthis.propertyName, this.propertyValue = this.tempText = '';\n\t\t\t}\n\t\t\tif (isEmptyElement(this.currentNode.tagName)) {\n\t\t\t\tthis.popElement();\n\t\t\t}\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parseText;\n\t\t}\n\t\telse if (token === '/') {\n\t\t\treturn this.parsePropertyName;\n\t\t}\n\t\telse if (/\\[/.test(token)) {\n\t\t\tthis.propType = 'input';\n\t\t\treturn this.parseInputOutput;\n\t\t}\n\t\telse if (/\\(|@/.test(token)) {\n\t\t\tthis.propType = 'output';\n\t\t\treturn this.parseInputOutput;\n\t\t}\n\t\telse if (/#/.test(token)) {\n\t\t\tthis.propType = 'ref-name';\n\t\t\treturn this.parseRefName;\n\t\t}\n\t\telse if (/=/.test(token)) {\n\t\t\tthis.propertyName = this.tempText;\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parsePropertyName;\n\t\t} else if (/\"/.test(token)) {\n\t\t\treturn this.parsePropertyValue;\n\t\t} else if (/\\d/.test(token)) {\n\t\t\tthis.tempText += token;\n\t\t\treturn this.parsePropertyValue;\n\t\t}\n\t\telse if (/\\s/.test(token)) {\n\t\t\tif (this.tempText.trim()) {\n\t\t\t\tthis.propertyName = this.tempText;\n\t\t\t\tthis.currentNode.addAttribute(this.propertyName, true);\n\t\t\t\tthis.propertyName, this.propertyValue = this.tempText = '';\n\t\t\t}\n\t\t\treturn this.parsePropertyName;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parsePropertyName;\n\t}\n\n\n\n\tprivate parseRefName(token: string) {\n\t\tif (/=/.test(token)) {\n\t\t\treturn this.parseRefName;\n\t\t}\n\t\telse if (/\"/.test(token)) {\n\t\t\tthis.propertyName = this.tempText;\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parsePropertyValue;\n\t\t} else if (/\\s/.test(token)) {\n\t\t\tthis.currentNode.setTemplateRefName(this.tempText, '');\n\t\t\tthis.propertyName = this.tempText = '';\n\t\t\tthis.propType = 'attr';\n\t\t\treturn this.parsePropertyName;\n\t\t} else if (/>/.test(token)) {\n\t\t\tthis.currentNode.setTemplateRefName(this.tempText, '');\n\t\t\tthis.propertyName = this.tempText = '';\n\t\t\tthis.propType = 'attr';\n\t\t\treturn this.parseText;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseRefName;\n\t}\n\n\tprivate parseInputOutput(token: string) {\n\t\tif (/\\(/.test(token)) {\n\t\t\tthis.propType = 'two-way';\n\t\t\treturn this.parseInputOutput;\n\t\t}\n\t\telse if (/\\)|\\]|=/.test(token)) {\n\t\t\treturn this.parseInputOutput;\n\t\t}\n\t\telse if (/\"/.test(token)) {\n\t\t\tthis.propertyName = this.tempText;\n\t\t\tthis.tempText = '';\n\t\t\treturn this.parsePropertyValue;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parseInputOutput;\n\t}\n\n\tprivate parsePropertyValue(token: string) {\n\t\tif (/\"/.test(token)) {\n\t\t\tthis.propertyValue = this.tempText;\n\t\t\tswitch (this.propType) {\n\t\t\t\tcase 'input':\n\t\t\t\t\tthis.currentNode.addInput(this.propertyName, this.propertyValue);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'output':\n\t\t\t\t\tthis.currentNode.addOutput(this.propertyName, this.propertyValue);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'two-way':\n\t\t\t\t\tthis.currentNode.addTwoWayBinding(this.propertyName, this.propertyValue);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ref-name':\n\t\t\t\t\tthis.currentNode.setTemplateRefName(this.propertyName, this.propertyValue);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'attr':\n\t\t\t\tdefault:\n\t\t\t\t\tif (/^([-+]?\\d*\\.?\\d+)(?:[eE]([-+]?\\d+))?$/.test(this.propertyValue.trim())) {\n\t\t\t\t\t\tthis.currentNode.addAttribute(this.propertyName, +this.propertyValue.trim());\n\t\t\t\t\t} else if (/^(true|false)$/.test(this.propertyValue.trim().toLowerCase())) {\n\t\t\t\t\t\tif (this.propertyValue.trim().toLowerCase() === 'true') {\n\t\t\t\t\t\t\tthis.currentNode.addAttribute(this.propertyName, true);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.currentNode.addAttribute(this.propertyName, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.currentNode.addAttribute(this.propertyName, this.propertyValue);\n\t\t\t\t\t}\n\t\t\t}\n\t\t\tthis.propertyName, this.propertyValue = this.tempText = '';\n\t\t\tthis.propType = 'attr';\n\t\t\treturn this.parsePropertyName;\n\t\t}\n\t\tthis.tempText += token;\n\t\treturn this.parsePropertyValue;\n\t}\n\n\n\tprivate popElement() {\n\t\tconst element = this.stackTrace.pop();\n\t\tif (element) {\n\t\t\tconst parent = this.stackTrace.pop();\n\t\t\tif (parent && parent instanceof DomElementNode) {\n\t\t\t\tif (typeof element === 'string') {\n\t\t\t\t\tparent.addTextChild(element);\n\t\t\t\t} else if (element instanceof DomElementNode) {\n\t\t\t\t\tparent.addChild(this.checkNode(element));\n\t\t\t\t} else {\n\t\t\t\t\tparent.addChild(element);\n\t\t\t\t}\n\t\t\t\tthis.stackTrace.push(parent);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (typeof element === 'string') {\n\t\t\t\t\tparseTextChild(element).forEach(text => this.childStack.push(text));\n\t\t\t\t} else if (element instanceof DomElementNode) {\n\t\t\t\t\tthis.childStack.push(this.checkNode(element));\n\t\t\t\t} else {\n\t\t\t\t\tthis.childStack.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcheckNode(node: DomElementNode): DomElementNode | DomStructuralDirectiveNode {\n\t\tconst attributes = node.attributes;\n\t\tif (attributes) {\n\t\t\tlet temp: ElementAttribute<string, any> | ElementAttribute<string, any>[] | undefined;\n\n\t\t\ttemp = attributes.find(attr => attr.name === 'is');\n\t\t\tif (temp) {\n\t\t\t\tattributes.splice(attributes.indexOf(temp), 1);\n\t\t\t\tnode.is = temp.value as string;\n\t\t\t}\n\t\t\ttemp = attributes.filter(attr => {\n\t\t\t\treturn typeof attr.value === 'string' && (/\\{\\{(.+)\\}\\}/g).test(attr.value);\n\t\t\t});\n\t\t\tif (temp?.length) {\n\t\t\t\ttemp.forEach(templateAttrs => {\n\t\t\t\t\tattributes.splice(attributes.indexOf(templateAttrs), 1);\n\t\t\t\t\tnode.addTemplateAttr(templateAttrs.name, templateAttrs.value as string);\n\t\t\t\t});\n\t\t\t}\n\t\t\ttemp = attributes.filter(attr => attr.name.startsWith('on'));\n\t\t\tif (temp?.length) {\n\t\t\t\ttemp.forEach(templateAttrs => {\n\t\t\t\t\tattributes.splice(attributes.indexOf(templateAttrs), 1);\n\t\t\t\t\tnode.addOutput(templateAttrs.name.substring(2), templateAttrs.value as string);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst directiveNames = this.extractDirectiveNames(node);\n\t\tlet sdName: string | undefined;\n\t\tif (directiveNames.length) {\n\t\t\tconst directives: DomAttributeDirectiveNode[] = [];\n\t\t\tdirectiveNames.forEach(attributeName => {\n\t\t\t\tif (attributeName.startsWith('*')) {\n\t\t\t\t\tif (sdName) {\n\t\t\t\t\t\tconsole.error(`Only one Structural Directive is allowed on an element [${sdName}, ${attributeName}]`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsdName = attributeName;\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst directive = new DomAttributeDirectiveNode(attributeName);\n\t\t\t\tif (directiveRegistry.get(attributeName)!.hasAttributes()) {\n\t\t\t\t\tthis.extractDirectiveAttributesFromNode(attributeName, directive, node);\n\t\t\t\t}\n\t\t\t\tdirectives.push(directive);\n\t\t\t});\n\t\t\tif (directives.length) {\n\t\t\t\tnode.attributeDirectives = directives;\n\t\t\t}\n\t\t}\n\t\tif (sdName) {\n\t\t\t// <div *for [forOf]=\"array\" let-item [trackBy]=\"method\" let-i=\"index\" > {{item}} </div>\n\t\t\t// <div *for=\"let item of array; let i = index; trackBy=method;\" > {{item}} </div>\n\t\t\t// <template #refName *if=\"isActive; else disabled\" > ... </template>\n\t\t\t// <template #disabled > ... </template>\n\n\t\t\tconst temp = node.attributes!.filter(attr => attr.name == sdName)[0];\n\t\t\tnode.attributes!.splice(node.attributes!.indexOf(temp), 1);\n\t\t\tconst isTemplate = node.tagName === 'template';\n\n\t\t\tconst directiveNode = isTemplate ? new DomFragmentNode(node.children) : node;\n\t\t\tconst directive = (typeof temp?.value === 'boolean')\n\t\t\t\t? new DomStructuralDirectiveNode(temp.name, directiveNode)\n\t\t\t\t: new DomStructuralDirectiveNode(temp.name, directiveNode, String(temp.value));\n\t\t\tconst directiveName = temp.name.substring(1);\n\t\t\tif (isTemplate) {\n\t\t\t\tdirective.inputs = node.inputs;\n\t\t\t\tdirective.outputs = node.outputs;\n\t\t\t\tdirective.attributes = node.attributes;\n\t\t\t\tdirective.templateAttrs = node.templateAttrs;\n\t\t\t\tdirective.attributeDirectives = node.attributeDirectives;\n\t\t\t} else if (directiveRegistry.hasAttributes(directiveName)) {\n\t\t\t\tthis.extractDirectiveAttributesFromNode(directiveName, directive, node);\n\t\t\t\tdirective.attributeDirectives = node.attributeDirectives;\n\t\t\t}\n\t\t\tif (isTemplate && node.templateRefName) {\n\t\t\t\tnode.children = [directive];\n\t\t\t\treturn node;\n\t\t\t}\n\t\t\treturn directive;\n\t\t}\n\n\t\t// <for let-user [of]=\"users\"></for>\n\t\tif (directiveRegistry.has('*' + node.tagName)) {\n\t\t\tconst children = new DomFragmentNode(node.children);\n\t\t\tconst directive = new DomStructuralDirectiveNode('*' + node.tagName, children);\n\t\t\tdirective.inputs = node.inputs;\n\t\t\tdirective.outputs = node.outputs;\n\t\t\tdirective.attributes = node.attributes;\n\t\t\tdirective.templateAttrs = node.templateAttrs;\n\t\t\tdirective.attributeDirectives = node.attributeDirectives;\n\t\t\treturn directive;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\n\tprivate extractDirectiveAttributesFromNode(directiveName: string, directive: BaseNode, node: DomElementNode): void {\n\t\tconst attributes = directiveRegistry.getAttributes(directiveName);\n\t\tif (!attributes) {\n\t\t\treturn;\n\t\t}\n\t\tconst filterByAttrName = createFilterByAttrName(attributes);\n\t\tdirective.attributes = node.attributes?.filter(filterByAttrName);\n\t\tdirective.inputs = node.inputs?.filter(filterByAttrName);\n\t\tdirective.outputs = node.outputs?.filter(filterByAttrName);\n\t\tdirective.twoWayBinding = node.twoWayBinding?.filter(filterByAttrName);\n\t\tdirective.templateAttrs = node.templateAttrs?.filter(filterByAttrName);\n\n\t\tnode.inputs && directive.inputs?.forEach(createArrayCleaner(node.inputs));\n\t\tnode.outputs && directive.outputs?.forEach(createArrayCleaner(node.outputs));\n\t\tnode.twoWayBinding && directive.twoWayBinding?.forEach(createArrayCleaner(node.twoWayBinding));\n\t\tnode.attributes && directive.attributes?.forEach(createArrayCleaner(node.attributes));\n\t\tnode.templateAttrs && directive.templateAttrs?.forEach(createArrayCleaner(node.templateAttrs));\n\t}\n\tprivate extractDirectiveNames(node: BaseNode): string[] {\n\t\tconst names: string[] = [];\n\t\tif (node.attributes?.length) {\n\t\t\tnames.push(...this.getAttributeDirectives(node.attributes));\n\t\t}\n\t\tif (node.inputs?.length) {\n\t\t\tnames.push(...this.getAttributeDirectives(node.inputs));\n\t\t}\n\t\tif (node.twoWayBinding?.length) {\n\t\t\tnames.push(...this.getAttributeDirectives(node.twoWayBinding));\n\t\t}\n\t\tif (node.templateAttrs?.length) {\n\t\t\tnames.push(...this.getAttributeDirectives(node.templateAttrs));\n\t\t}\n\t\tif (node.outputs?.length) {\n\t\t\tnames.push(...this.getAttributeDirectives(node.outputs));\n\t\t}\n\t\treturn names;\n\t}\n\tprivate getAttributeDirectives(attributes: Attribute<string, any>[]): string[] {\n\t\treturn directiveRegistry.filterDirectives(attributes.map(attr => attr.name));\n\t}\n}\n\nfunction createFilterByAttrName(attributes: string[]) {\n\treturn (attr: Attribute<string, any>) => attributes.includes(attr.name);\n}\n\nfunction createArrayCleaner(attributes: Attribute<string, any>[]) {\n\treturn (attr: Attribute<string, any>) => attributes.splice(attributes.indexOf(attr), 1);\n}\n\nexport class HTMLParser {\n\n\tnodeParser = new NodeParser();\n\n\tparse(html: string): DomChild[] {\n\t\treturn this.nodeParser.parse(html);\n\t}\n\n\ttoDomRootNode(html: string): DomNode {\n\t\tlet stack = this.nodeParser.parse(html);\n\t\tif (!stack || stack.length === 0) {\n\t\t\treturn new DomFragmentNode([new TextContent('')]);\n\t\t} else if (stack?.length === 1) {\n\t\t\treturn stack[0];\n\t\t} else {\n\t\t\treturn new DomFragmentNode(stack);\n\t\t}\n\t}\n\n\tstringify(stack?: DomNode[]) {\n\t\tlet html = '';\n\t\tstack?.forEach(node => {\n\t\t\tif (node instanceof TextContent) {\n\t\t\t\thtml += node.value;\n\t\t\t} else if (node instanceof LiveTextContent) {\n\t\t\t\thtml += `{{${node.value}}}`;\n\t\t\t} else if (node instanceof CommentNode) {\n\t\t\t\thtml += `<!-- ${node.comment} -->`;\n\t\t\t} else if (node instanceof DomElementNode) {\n\t\t\t\tlet attrs = '';\n\t\t\t\tif (node.attributes) {\n\t\t\t\t\tattrs += node.attributes.map(attr => `${attr.name}=\"${attr.value}\"`).join(' ') + ' ';\n\t\t\t\t}\n\t\t\t\tif (node.twoWayBinding) {\n\t\t\t\t\tattrs += node.twoWayBinding.map(attr => `[(${attr.name})]=\"${attr.value}\"`).join(' ').concat(' ');\n\t\t\t\t}\n\t\t\t\tif (node.inputs) {\n\t\t\t\t\tattrs += node.inputs.map(attr => `[${attr.name}]=\"${attr.value}\"`).join(' ').concat(' ');\n\t\t\t\t}\n\t\t\t\tif (node.outputs) {\n\t\t\t\t\tattrs += node.outputs.map(attr => `(${attr.name})=\"${attr.value}\"`).join(' ').concat(' ');\n\t\t\t\t}\n\t\t\t\tif (node.templateAttrs) {\n\t\t\t\t\tattrs += node.templateAttrs.map(attr => `${attr.name}=\"${attr.value}\"`).join(' ').concat(' ');\n\t\t\t\t}\n\t\t\t\tif (isEmptyElement(node.tagName)) {\n\t\t\t\t\tif (attrs) {\n\t\t\t\t\t\thtml += `<${node.tagName} ${attrs}/>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thtml += `<${node.tagName} />`;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet children = this.stringify(node.children);\n\t\t\t\t\tif (attrs && children) {\n\t\t\t\t\t\thtml += `<${node.tagName} ${attrs}>${children}</${node.tagName}>`;\n\t\t\t\t\t}\n\t\t\t\t\telse if (attrs) {\n\t\t\t\t\t\thtml += `<${node.tagName} ${attrs}></${node.tagName}>`;\n\t\t\t\t\t} else if (children) {\n\t\t\t\t\t\thtml += `<${node.tagName}>${children}<</${node.tagName}>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thtml += `<${node.tagName}></${node.tagName}>`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn html;\n\t}\n\n}\n\nexport const htmlParser = new HTMLParser();\n\n"]}
|