@adaas/are-html 0.0.6 → 0.0.9
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/dist/browser/index.d.mts +14 -1
- package/dist/browser/index.mjs +56 -7
- package/dist/browser/index.mjs.map +1 -1
- package/dist/node/directives/AreDirectiveFor.directive.js +7 -0
- package/dist/node/directives/AreDirectiveFor.directive.js.map +1 -1
- package/dist/node/directives/AreDirectiveFor.directive.mjs +7 -0
- package/dist/node/directives/AreDirectiveFor.directive.mjs.map +1 -1
- package/dist/node/engine/AreHTML.constants.d.mts +8 -1
- package/dist/node/engine/AreHTML.constants.d.ts +8 -1
- package/dist/node/engine/AreHTML.constants.js +8 -0
- package/dist/node/engine/AreHTML.constants.js.map +1 -1
- package/dist/node/engine/AreHTML.constants.mjs +7 -1
- package/dist/node/engine/AreHTML.constants.mjs.map +1 -1
- package/dist/node/engine/AreHTML.interpreter.d.mts +6 -0
- package/dist/node/engine/AreHTML.interpreter.d.ts +6 -0
- package/dist/node/engine/AreHTML.interpreter.js +40 -5
- package/dist/node/engine/AreHTML.interpreter.js.map +1 -1
- package/dist/node/engine/AreHTML.interpreter.mjs +41 -6
- package/dist/node/engine/AreHTML.interpreter.mjs.map +1 -1
- package/dist/node/engine/AreHTML.lifecycle.js +1 -0
- package/dist/node/engine/AreHTML.lifecycle.js.map +1 -1
- package/dist/node/engine/AreHTML.lifecycle.mjs +1 -0
- package/dist/node/engine/AreHTML.lifecycle.mjs.map +1 -1
- package/dist/node/engine/AreHTML.tokenizer.js +1 -1
- package/dist/node/engine/AreHTML.tokenizer.js.map +1 -1
- package/dist/node/engine/AreHTML.tokenizer.mjs +1 -1
- package/dist/node/engine/AreHTML.tokenizer.mjs.map +1 -1
- package/dist/node/index.d.mts +1 -1
- package/dist/node/index.d.ts +1 -1
- package/package.json +7 -7
- package/src/directives/AreDirectiveFor.directive.ts +8 -0
- package/src/engine/AreHTML.constants.ts +21 -0
- package/src/engine/AreHTML.interpreter.ts +52 -6
- package/src/engine/AreHTML.lifecycle.ts +6 -0
- package/src/engine/AreHTML.tokenizer.ts +1 -1
|
@@ -27,6 +27,7 @@ let AreHTMLLifecycle = class extends AreLifecycle {
|
|
|
27
27
|
}
|
|
28
28
|
mount(node, scene, logger, ...args) {
|
|
29
29
|
logger?.debug(`[Mount] Component Trigger for <${node.aseid.entity}> with aseid :{${node.aseid.toString()}}`);
|
|
30
|
+
if (scene.isInactive) return;
|
|
30
31
|
node.interpret();
|
|
31
32
|
for (let i = 0; i < node.children.length; i++) {
|
|
32
33
|
const child = node.children[i];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/engine/AreHTML.lifecycle.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAkBO,IAAM,gBAAA,GAAN,cAA+B,YAAA,CAAa;AAAA,EAI/C,cACwB,IAAA,EACD,KAAA,EACa,OAAA,EACH,cAAA,EACT,WACjB,IAAA,EACC;AACJ,IAAA,cAAA,EAAgB,UAAU,IAAI,CAAA;AAC9B,IAAA,KAAA,CAAM,KAAK,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,GAAG,IAAI,CAAA;AAAA,EACpD;AAAA,EAgBA,QAAA,CACwB,IAAA,EACD,KAAA,EACa,OAAA,EACZ,WACjB,IAAA,EACC;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAErC,IAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,EACxB;AAAA,EAIA,iBAAA,CACwB,IAAA,EACD,KAAA,EACa,OAAA,EACZ,WACjB,IAAA,EACC;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAErC,IAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,EACxB;AAAA,EAMA,KAAA,CAIwB,IAAA,EAIA,KAAA,EAEA,MAAA,EAAA,GACjB,IAAA,EACL;AAEE,IAAA,MAAA,EAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAA,CAAK,KAAA,CAAM,MAAM,mBAAmB,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,CAAA,CAAA,CAAG,CAAA;
|
|
1
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.lifecycle.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAkBO,IAAM,gBAAA,GAAN,cAA+B,YAAA,CAAa;AAAA,EAI/C,cACwB,IAAA,EACD,KAAA,EACa,OAAA,EACH,cAAA,EACT,WACjB,IAAA,EACC;AACJ,IAAA,cAAA,EAAgB,UAAU,IAAI,CAAA;AAC9B,IAAA,KAAA,CAAM,KAAK,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,GAAG,IAAI,CAAA;AAAA,EACpD;AAAA,EAgBA,QAAA,CACwB,IAAA,EACD,KAAA,EACa,OAAA,EACZ,WACjB,IAAA,EACC;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAErC,IAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,EACxB;AAAA,EAIA,iBAAA,CACwB,IAAA,EACD,KAAA,EACa,OAAA,EACZ,WACjB,IAAA,EACC;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAErC,IAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,EACxB;AAAA,EAMA,KAAA,CAIwB,IAAA,EAIA,KAAA,EAEA,MAAA,EAAA,GACjB,IAAA,EACL;AAEE,IAAA,MAAA,EAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAA,CAAK,KAAA,CAAM,MAAM,mBAAmB,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,CAAA,CAAA,CAAG,CAAA;AAM5G,IAAA,IAAI,MAAM,UAAA,EAAY;AAKtB,IAAA,IAAA,CAAK,SAAA,EAAU;AAIf,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IAChB;AAAA,EACJ;AAAA,EAMA,wBAAA,CACwB,SAAA,EACD,KAAA,EACE,OAAA,EACD,WACjB,IAAA,EACL;AAOE,IAAA,IAAI,UAAU,SAAA,EAAW;AACrB,MAAA,OAAA,CAAQ,MAAM,SAAA,CAAU,SAAA,EAAW,qBAAqB,MAAA,EAAQ,SAAA,CAAU,MAAM,KAAK,CAAA;AAAA,IACzF,CAAA,MAAO;AACH,MAAA,MAAA,EAAQ,OAAA,CAAQ,CAAA,qDAAA,EAAwD,SAAA,CAAU,IAAI,CAAA,qDAAA,EAAwD,kBAAkB,YAAA,CAAa,SAAA,CAAU,IAAI,CAAC,CAAA,2BAAA,CAA6B,CAAA;AAAA,IAC7N;AAAA,EACJ;AAEJ;AAnHI,eAAA,CAAA;AAAA,EAFC,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAAA,EAClC,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,EAEzB,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,OAAO,CAAA,CAAA;AAAA,EAChB,4BAAS,oBAAoB,CAAA,CAAA;AAAA,EAC7B,4BAAS,iBAAiB,CAAA,CAAA;AAAA,EAC1B,4BAAS,QAAQ,CAAA;AAAA,CAAA,EATb,gBAAA,CAIT,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AA0BA,eAAA,CAAA;AAAA,EADC,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,EAErB,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,OAAO,CAAA,CAAA;AAAA,EAChB,4BAAS,oBAAoB,CAAA,CAAA;AAAA,EAC7B,4BAAS,QAAQ,CAAA;AAAA,CAAA,EAlCb,gBAAA,CA8BT,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAcA,eAAA,CAAA;AAAA,EADC,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAAA,EAE9B,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,OAAO,CAAA,CAAA;AAAA,EAChB,4BAAS,oBAAoB,CAAA,CAAA;AAAA,EAC7B,4BAAS,QAAQ,CAAA;AAAA,CAAA,EAhDb,gBAAA,CA4CT,SAAA,EAAA,mBAAA,EAAA,CAAA,CAAA;AAgBA,eAAA,CAAA;AAAA,EAJC,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,eAAA,CAAgB,OAAA;AAAA,IACtB,KAAA,EAAO,CAAC,WAAW;AAAA,GACtB,CAAA;AAAA,EAKI,4BAAS,QAAQ,CAAA,CAAA;AAAA,EAIjB,4BAAS,QAAQ,CAAA,CAAA;AAAA,EAEjB,4BAAS,QAAQ,CAAA;AAAA,CAAA,EAtEb,gBAAA,CA4DT,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AAuCA,eAAA,CAAA;AAAA,EAJC,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,oBAAA,CAAqB,MAAA;AAAA,IAC3B,KAAA,EAAO,CAAC,qBAAqB;AAAA,GAChC,CAAA;AAAA,EAEI,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,OAAO,CAAA,CAAA;AAAA,EAChB,4BAAS,SAAS,CAAA,CAAA;AAAA,EAClB,4BAAS,QAAQ,CAAA;AAAA,CAAA,EAvGb,gBAAA,CAmGT,SAAA,EAAA,0BAAA,EAAA,CAAA,CAAA;AAnGS,gBAAA,GAAN,eAAA,CAAA;AAAA,EAJN,QAAQ,MAAA,CAAO;AAAA,IACZ,SAAA,EAAW,YAAA;AAAA,IACX,WAAA,EAAa;AAAA,GAChB;AAAA,CAAA,EACY,gBAAA,CAAA","file":"AreHTML.lifecycle.mjs","sourcesContent":["import { A_Caller, A_Feature, A_FormatterHelper, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { AreLifecycle, AreScene, AreAttributeFeatures, AreSignalsContext, AreNodeFeatures, AreFeatures } from \"@adaas/are\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreDirectiveFeatures } from \"@adaas/are-html/directive/AreDirective.constants\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreHTMLNode } from \"../lib/AreHTMLNode/AreHTMLNode\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific lifecycle handler extending AreLifecycle. Wires DOM-aware init hooks for component nodes, root nodes, interpolations, text nodes, and directive attributes to the ARE rendering pipeline, connecting each entity to its HTML engine context and priming the scene for subsequent compilation and interpretation.'\n})\nexport class AreHTMLLifecycle extends AreLifecycle {\n\n @AreLifecycle.Init(AreComponentNode)\n @AreLifecycle.Init(AreRootNode)\n initComponent(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(AreSignalsContext) signalsContext?: AreSignalsContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n signalsContext?.subscribe(node);\n super.init(node, scope, context, logger, ...args);\n }\n\n\n // initRoot(\n // @A_Inject(A_Caller) node: AreHTMLNode,\n // @A_Inject(A_Scope) scope: A_Scope,\n // @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n // @A_Inject(AreSignalsContext) signalsContext?: AreSignalsContext,\n // @A_Inject(A_Logger) logger?: A_Logger,\n // ...args: any[]\n // ): void {\n // super.init(node, scope, context, logger, ...args);\n // }\n\n\n @AreLifecycle.Init(AreText)\n initText(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n const scene = new AreScene(node.aseid);\n\n scope.register(scene);\n }\n\n\n @AreLifecycle.Init(AreInterpolation)\n initInterpolation(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n const scene = new AreScene(node.aseid);\n\n scope.register(scene);\n }\n\n @A_Feature.Extend({\n name: AreNodeFeatures.onMount,\n scope: [AreHTMLNode]\n })\n mount(\n /**\n * Node to be mounted\n */\n @A_Inject(A_Caller) node: AreHTMLNode,\n /**\n * Node Content\n */\n @A_Inject(AreScene) scene: AreScene,\n\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n\n logger?.debug(`[Mount] Component Trigger for <${node.aseid.entity}> with aseid :{${node.aseid.toString()}}`);\n\n /**\n * Skip mounting nodes whose scene has been deactivated (e.g. $if template nodes\n * when the condition is false). Mirrors the guard in AreLifecycle.mount.\n */\n if (scene.isInactive) return;\n\n /**\n * 1. We should simply run and render node itself.\n */\n node.interpret();\n /**\n * 2. Then go through all children of the node and mount the.\n */\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n child.mount();\n }\n }\n\n @A_Feature.Extend({\n name: AreAttributeFeatures.Update,\n scope: [AreDirectiveAttribute],\n })\n updateDirectiveAttribute(\n @A_Inject(A_Caller) directive: AreDirectiveAttribute,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Feature) feature: A_Feature,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n /**\n * 3. If the attribute is a directive, then we should find a component that is responsible for\n * the directive compiling logic, and call it. \n * In case component is not found we just want to log a warning, \n * since the directive may be handled by some parent component or simply is a mistake in the template.\n */\n if (directive.component) {\n feature.chain(directive.component, AreDirectiveFeatures.Update, directive.owner.scope);\n } else {\n logger?.warning(`Directive handler component not found for directive: ${directive.name}. Make sure to create a component named \"AreDirective${A_FormatterHelper.toPascalCase(directive.name)}\" to handle this directive.`);\n }\n }\n\n}"]}
|
|
@@ -25,7 +25,7 @@ var __decorateParam = (index, decorator) => (target, key) => decorator(target, k
|
|
|
25
25
|
exports.AreHTMLTokenizer = class AreHTMLTokenizer extends are.AreTokenizer {
|
|
26
26
|
constructor() {
|
|
27
27
|
super(...arguments);
|
|
28
|
-
this.ATTR_PATTERN = /([$:@]?[\w.-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>/"'=]+)))?/g;
|
|
28
|
+
this.ATTR_PATTERN = /([$:@]?[\w.-]+(?::[\w.-]+)?)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>/"'=]+)))?/g;
|
|
29
29
|
}
|
|
30
30
|
tokenize(node, context, logger) {
|
|
31
31
|
super.tokenize(node, context, logger);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/engine/AreHTML.tokenizer.ts"],"names":["AreHTMLTokenizer","AreTokenizer","AreBindingAttribute","AreEventAttribute","AreDirectiveAttribute","AreStaticAttribute","A_Feature","AreNodeFeatures","AreComponentNode","AreRootNode","A_Caller","AreContext","A_Logger","A_Frame"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAiBaA,wBAAA,GAAN,+BAA+BC,gBAAA,CAAa;AAAA,EAA5C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEH,IAAA,IAAA,CAAA,YAAA,GAAe,
|
|
1
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.tokenizer.ts"],"names":["AreHTMLTokenizer","AreTokenizer","AreBindingAttribute","AreEventAttribute","AreDirectiveAttribute","AreStaticAttribute","A_Feature","AreNodeFeatures","AreComponentNode","AreRootNode","A_Caller","AreContext","A_Logger","A_Frame"],"mappings":"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","file":"AreHTML.tokenizer.js","sourcesContent":["import { A_Caller, A_Feature, A_Inject } from \"@adaas/a-concept\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { AreNodeFeatures, AreNode, AreTokenizer, AreAttribute_Init, AreContext } from \"@adaas/are\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreEventAttribute } from \"@adaas/are-html/attributes/AreEvent.attribute\";\nimport { AreBindingAttribute } from \"@adaas/are-html/attributes/AreBinding.attribute\";\nimport { AreStaticAttribute } from \"@adaas/are-html/attributes/AreStatic.attribute\";\nimport { AreHTMLAttribute } from \"../lib/AreHTMLAttribute/AreHTML.attribute\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific tokenizer extending AreTokenizer. Parses raw HTML template strings into AreHTMLNode trees by scanning element tags and resolving directive ($), event (@), binding (:), and static attributes to their typed attribute classes, constructing AreComponentNode and AreRootNode instances where required.'\n})\nexport class AreHTMLTokenizer extends AreTokenizer {\n\n ATTR_PATTERN = /([$:@]?[\\w.-]+(?::[\\w.-]+)?)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>/\"'=]+)))?/g\n\n\n @A_Feature.Extend({\n name: AreNodeFeatures.onTokenize,\n scope: [AreComponentNode, AreRootNode]\n })\n tokenize(\n @A_Inject(A_Caller) node: AreNode,\n @A_Inject(AreContext) context: AreContext,\n @A_Inject(A_Logger) logger?: A_Logger\n ): void {\n\n super.tokenize(node, context, logger);\n\n context.startPerformance('attributeExtraction');\n\n const attributes = this.extractAttributes(node.markup);\n\n for (const attr of attributes) {\n node.scope.register(attr);\n }\n\n context.endPerformance('attributeExtraction');\n }\n\n\n\n extractAttributes(markup: string): AreHTMLAttribute[] {\n // Strip the tag name, then remove the closing > that is NOT inside quotes\n const withoutTag = markup.replace(/^<[a-zA-Z][a-zA-Z0-9-]*\\s*/, '')\n\n // Walk the string to find the closing > that isn't inside a quoted value\n let inSingle = false\n let inDouble = false\n let endIdx = withoutTag.length\n\n for (let i = 0; i < withoutTag.length; i++) {\n const ch = withoutTag[i]\n if (ch === '\"' && !inSingle) inDouble = !inDouble\n else if (ch === \"'\" && !inDouble) inSingle = !inSingle\n else if (ch === '>' && !inSingle && !inDouble) {\n endIdx = i\n break\n }\n }\n\n const attrString = withoutTag.slice(0, endIdx).replace(/\\s*\\/?\\s*$/, '').trim()\n\n const results: AreHTMLAttribute[] = []\n\n for (const match of attrString.matchAll(this.ATTR_PATTERN)) {\n const raw = match[0]\n const full = match[1] // e.g. ':class', '@click', '$for', 'id'\n\n // skip zero-length or name-less regex matches\n if (!full) continue\n\n const value = match[2] ?? match[3] ?? match[4] ?? 'true'\n\n const prefix = full[0]\n const isSpecial = prefix === ':' || prefix === '@' || prefix === '$'\n const name = isSpecial ? full.slice(1) : full\n\n const meta: AreAttribute_Init = { name, content: value, raw, prefix: isSpecial ? prefix : '' }\n\n if (prefix === ':') results.push(new AreBindingAttribute(meta))\n else if (prefix === '@') results.push(new AreEventAttribute(meta))\n else if (prefix === '$') results.push(new AreDirectiveAttribute(meta))\n else results.push(new AreStaticAttribute(meta))\n }\n\n return results\n }\n\n}"]}
|
|
@@ -13,7 +13,7 @@ import { A_Frame } from '@adaas/a-frame/core';
|
|
|
13
13
|
let AreHTMLTokenizer = class extends AreTokenizer {
|
|
14
14
|
constructor() {
|
|
15
15
|
super(...arguments);
|
|
16
|
-
this.ATTR_PATTERN = /([$:@]?[\w.-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>/"'=]+)))?/g;
|
|
16
|
+
this.ATTR_PATTERN = /([$:@]?[\w.-]+(?::[\w.-]+)?)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>/"'=]+)))?/g;
|
|
17
17
|
}
|
|
18
18
|
tokenize(node, context, logger) {
|
|
19
19
|
super.tokenize(node, context, logger);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/engine/AreHTML.tokenizer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAiBO,IAAM,gBAAA,GAAN,cAA+B,YAAA,CAAa;AAAA,EAA5C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEH,IAAA,IAAA,CAAA,YAAA,GAAe,
|
|
1
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.tokenizer.ts"],"names":[],"mappings":"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","file":"AreHTML.tokenizer.mjs","sourcesContent":["import { A_Caller, A_Feature, A_Inject } from \"@adaas/a-concept\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { AreNodeFeatures, AreNode, AreTokenizer, AreAttribute_Init, AreContext } from \"@adaas/are\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreEventAttribute } from \"@adaas/are-html/attributes/AreEvent.attribute\";\nimport { AreBindingAttribute } from \"@adaas/are-html/attributes/AreBinding.attribute\";\nimport { AreStaticAttribute } from \"@adaas/are-html/attributes/AreStatic.attribute\";\nimport { AreHTMLAttribute } from \"../lib/AreHTMLAttribute/AreHTML.attribute\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific tokenizer extending AreTokenizer. Parses raw HTML template strings into AreHTMLNode trees by scanning element tags and resolving directive ($), event (@), binding (:), and static attributes to their typed attribute classes, constructing AreComponentNode and AreRootNode instances where required.'\n})\nexport class AreHTMLTokenizer extends AreTokenizer {\n\n ATTR_PATTERN = /([$:@]?[\\w.-]+(?::[\\w.-]+)?)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>/\"'=]+)))?/g\n\n\n @A_Feature.Extend({\n name: AreNodeFeatures.onTokenize,\n scope: [AreComponentNode, AreRootNode]\n })\n tokenize(\n @A_Inject(A_Caller) node: AreNode,\n @A_Inject(AreContext) context: AreContext,\n @A_Inject(A_Logger) logger?: A_Logger\n ): void {\n\n super.tokenize(node, context, logger);\n\n context.startPerformance('attributeExtraction');\n\n const attributes = this.extractAttributes(node.markup);\n\n for (const attr of attributes) {\n node.scope.register(attr);\n }\n\n context.endPerformance('attributeExtraction');\n }\n\n\n\n extractAttributes(markup: string): AreHTMLAttribute[] {\n // Strip the tag name, then remove the closing > that is NOT inside quotes\n const withoutTag = markup.replace(/^<[a-zA-Z][a-zA-Z0-9-]*\\s*/, '')\n\n // Walk the string to find the closing > that isn't inside a quoted value\n let inSingle = false\n let inDouble = false\n let endIdx = withoutTag.length\n\n for (let i = 0; i < withoutTag.length; i++) {\n const ch = withoutTag[i]\n if (ch === '\"' && !inSingle) inDouble = !inDouble\n else if (ch === \"'\" && !inDouble) inSingle = !inSingle\n else if (ch === '>' && !inSingle && !inDouble) {\n endIdx = i\n break\n }\n }\n\n const attrString = withoutTag.slice(0, endIdx).replace(/\\s*\\/?\\s*$/, '').trim()\n\n const results: AreHTMLAttribute[] = []\n\n for (const match of attrString.matchAll(this.ATTR_PATTERN)) {\n const raw = match[0]\n const full = match[1] // e.g. ':class', '@click', '$for', 'id'\n\n // skip zero-length or name-less regex matches\n if (!full) continue\n\n const value = match[2] ?? match[3] ?? match[4] ?? 'true'\n\n const prefix = full[0]\n const isSpecial = prefix === ':' || prefix === '@' || prefix === '$'\n const name = isSpecial ? full.slice(1) : full\n\n const meta: AreAttribute_Init = { name, content: value, raw, prefix: isSpecial ? prefix : '' }\n\n if (prefix === ':') results.push(new AreBindingAttribute(meta))\n else if (prefix === '@') results.push(new AreEventAttribute(meta))\n else if (prefix === '$') results.push(new AreDirectiveAttribute(meta))\n else results.push(new AreStaticAttribute(meta))\n }\n\n return results\n }\n\n}"]}
|
package/dist/node/index.d.mts
CHANGED
|
@@ -15,7 +15,7 @@ export { AreInterpolation } from './nodes/AreInterpolation.mjs';
|
|
|
15
15
|
export { AreRootNode } from './nodes/AreRoot.mjs';
|
|
16
16
|
export { AreText } from './nodes/AreText.mjs';
|
|
17
17
|
export { AreRoute } from './signals/AreRoute.signal.mjs';
|
|
18
|
-
export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, ParsedEventName, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString } from './engine/AreHTML.constants.mjs';
|
|
18
|
+
export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, ParsedEventName, SVG_ATTRIBUTE_NS, SVG_NAMESPACE, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString } from './engine/AreHTML.constants.mjs';
|
|
19
19
|
export { AreHTMLEngineContext } from './engine/AreHTML.context.mjs';
|
|
20
20
|
export { AreHTMLContextConstructor } from './engine/AreHTML.types.mjs';
|
|
21
21
|
export { AreHTMLCompiler } from './engine/AreHTML.compiler.mjs';
|
package/dist/node/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export { AreInterpolation } from './nodes/AreInterpolation.js';
|
|
|
15
15
|
export { AreRootNode } from './nodes/AreRoot.js';
|
|
16
16
|
export { AreText } from './nodes/AreText.js';
|
|
17
17
|
export { AreRoute } from './signals/AreRoute.signal.js';
|
|
18
|
-
export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, ParsedEventName, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString } from './engine/AreHTML.constants.js';
|
|
18
|
+
export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, ParsedEventName, SVG_ATTRIBUTE_NS, SVG_NAMESPACE, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString } from './engine/AreHTML.constants.js';
|
|
19
19
|
export { AreHTMLEngineContext } from './engine/AreHTML.context.js';
|
|
20
20
|
export { AreHTMLContextConstructor } from './engine/AreHTML.types.js';
|
|
21
21
|
export { AreHTMLCompiler } from './engine/AreHTML.compiler.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaas/are-html",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "A-Concept Rendering Engine (ARE) is a powerful rendering engine designed to work seamlessly with the A-Concept framework. This library provides an HTML engine implementation of ARE, enabling developers to create dynamic and interactive user interfaces for web applications using standard HTML syntax.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"a-concept",
|
|
@@ -80,16 +80,16 @@
|
|
|
80
80
|
"build": "tsup --config tsup.config.ts"
|
|
81
81
|
},
|
|
82
82
|
"peerDependencies": {
|
|
83
|
-
"@adaas/a-concept": "^0.3.
|
|
83
|
+
"@adaas/a-concept": "^0.3.17",
|
|
84
84
|
"@adaas/a-frame": "^0.1.2",
|
|
85
|
-
"@adaas/a-utils": "^0.3.
|
|
86
|
-
"@adaas/are": "^0.0.
|
|
85
|
+
"@adaas/a-utils": "^0.3.23",
|
|
86
|
+
"@adaas/are": "^0.0.13"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
|
-
"@adaas/a-concept": "^0.3.
|
|
89
|
+
"@adaas/a-concept": "^0.3.17",
|
|
90
90
|
"@adaas/a-frame": "^0.1.2",
|
|
91
|
-
"@adaas/a-utils": "^0.3.
|
|
92
|
-
"@adaas/are": "^0.0.
|
|
91
|
+
"@adaas/a-utils": "^0.3.23",
|
|
92
|
+
"@adaas/are": "^0.0.13",
|
|
93
93
|
"@types/chai": "^4.3.14",
|
|
94
94
|
"@types/jest": "^29.5.12",
|
|
95
95
|
"@types/mocha": "^10.0.6",
|
|
@@ -292,6 +292,14 @@ export class AreDirectiveFor extends AreDirective {
|
|
|
292
292
|
});
|
|
293
293
|
|
|
294
294
|
result = (fn as Function)(...resolvedArgs);
|
|
295
|
+
} else if (arrayExpr.includes('.')) {
|
|
296
|
+
// dotted-path lookup: e.g. "list.items" → store.get('list').items
|
|
297
|
+
const parts = arrayExpr.split('.');
|
|
298
|
+
result = store.get(parts[0] as any);
|
|
299
|
+
for (let i = 1; i < parts.length; i++) {
|
|
300
|
+
if (result == null) break;
|
|
301
|
+
result = result[parts[i]];
|
|
302
|
+
}
|
|
295
303
|
} else {
|
|
296
304
|
result = store.get(arrayExpr as any);
|
|
297
305
|
}
|
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// ── SVG ──────────────────────────────────────────────────────────────────────
|
|
3
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
|
|
5
|
+
/** XML namespace URI for SVG elements. */
|
|
6
|
+
export const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Maps namespace prefixes used in SVG/XML attributes to their canonical URIs.
|
|
10
|
+
* Used by the interpreter when calling setAttributeNS / removeAttributeNS.
|
|
11
|
+
*/
|
|
12
|
+
export const SVG_ATTRIBUTE_NS: Record<string, string> = {
|
|
13
|
+
xlink: 'http://www.w3.org/1999/xlink',
|
|
14
|
+
xml: 'http://www.w3.org/XML/1998/namespace',
|
|
15
|
+
xmlns: 'http://www.w3.org/2000/xmlns/',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
19
|
+
// ── HTML void elements ────────────────────────────────────────────────────────
|
|
20
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
1
22
|
/**
|
|
2
23
|
* Void HTML elements that cannot have children and must not have a closing tag.
|
|
3
24
|
* Per the HTML5 spec these are treated as self-closing even when written as
|
|
@@ -24,6 +24,8 @@ import {
|
|
|
24
24
|
normalizeStyleValue,
|
|
25
25
|
parseEventName,
|
|
26
26
|
toDOMString,
|
|
27
|
+
SVG_NAMESPACE,
|
|
28
|
+
SVG_ATTRIBUTE_NS,
|
|
27
29
|
} from "./AreHTML.constants";
|
|
28
30
|
|
|
29
31
|
|
|
@@ -63,6 +65,8 @@ export class AreHTMLInterpreter extends AreInterpreter {
|
|
|
63
65
|
// Determine the element tag — components render as a wrapper div
|
|
64
66
|
const tag = node.tag;
|
|
65
67
|
|
|
68
|
+
const isSVG = tag === 'svg' || this.isInSVGContext(node);
|
|
69
|
+
|
|
66
70
|
if (parent) {
|
|
67
71
|
|
|
68
72
|
const mountPoint = context.getNodeElement(parent)
|
|
@@ -74,8 +78,9 @@ export class AreHTMLInterpreter extends AreInterpreter {
|
|
|
74
78
|
});
|
|
75
79
|
}
|
|
76
80
|
|
|
77
|
-
const element =
|
|
78
|
-
|
|
81
|
+
const element = isSVG
|
|
82
|
+
? context.container.createElementNS(SVG_NAMESPACE, tag)
|
|
83
|
+
: context.container.createElement(tag);
|
|
79
84
|
|
|
80
85
|
if (mountPoint.nodeType === Node.ELEMENT_NODE) {
|
|
81
86
|
// parent is a real element — just append
|
|
@@ -97,9 +102,9 @@ export class AreHTMLInterpreter extends AreInterpreter {
|
|
|
97
102
|
});
|
|
98
103
|
}
|
|
99
104
|
|
|
100
|
-
const element =
|
|
101
|
-
|
|
102
|
-
|
|
105
|
+
const element = isSVG
|
|
106
|
+
? context.container.createElementNS(SVG_NAMESPACE, tag)
|
|
107
|
+
: context.container.createElement(tag);
|
|
103
108
|
|
|
104
109
|
mountPoint.parentNode?.replaceChild(element, mountPoint);
|
|
105
110
|
|
|
@@ -171,6 +176,17 @@ export class AreHTMLInterpreter extends AreInterpreter {
|
|
|
171
176
|
const el = element as HTMLElement;
|
|
172
177
|
const lowerName = name.toLowerCase();
|
|
173
178
|
|
|
179
|
+
// ── 0. Namespace-prefixed attributes (xlink:href, xml:space, xmlns:*) ──
|
|
180
|
+
const colonIdx = name.indexOf(':');
|
|
181
|
+
if (colonIdx > 0) {
|
|
182
|
+
const ns = SVG_ATTRIBUTE_NS[name.slice(0, colonIdx)];
|
|
183
|
+
if (ns) {
|
|
184
|
+
(el as Element).setAttributeNS(ns, name, toDOMString(rawValue));
|
|
185
|
+
mutation.cache = toDOMString(rawValue);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
174
190
|
// ── 1. Boolean attributes ────────────────────────────────────────────
|
|
175
191
|
if (isBooleanAttribute(lowerName)) {
|
|
176
192
|
if (rawValue) {
|
|
@@ -266,7 +282,17 @@ export class AreHTMLInterpreter extends AreInterpreter {
|
|
|
266
282
|
const { name } = mutation.payload;
|
|
267
283
|
|
|
268
284
|
if (name && element.nodeType === Node.ELEMENT_NODE) {
|
|
269
|
-
|
|
285
|
+
const colonIdx = name.indexOf(':');
|
|
286
|
+
if (colonIdx > 0) {
|
|
287
|
+
const ns = SVG_ATTRIBUTE_NS[name.slice(0, colonIdx)];
|
|
288
|
+
if (ns) {
|
|
289
|
+
(element as Element).removeAttributeNS(ns, name.slice(colonIdx + 1));
|
|
290
|
+
} else {
|
|
291
|
+
(element as HTMLElement).removeAttribute(name);
|
|
292
|
+
}
|
|
293
|
+
} else {
|
|
294
|
+
(element as HTMLElement).removeAttribute(name);
|
|
295
|
+
}
|
|
270
296
|
}
|
|
271
297
|
} catch (error) {
|
|
272
298
|
console.log('Error removing attribute:', error);
|
|
@@ -593,4 +619,24 @@ export class AreHTMLInterpreter extends AreInterpreter {
|
|
|
593
619
|
element.parentNode?.removeChild(element);
|
|
594
620
|
context.removeInstructionElement(declaration);
|
|
595
621
|
}
|
|
622
|
+
|
|
623
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
624
|
+
// ── SVG helpers ───────────────────────────────────────────────────────────────
|
|
625
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* Returns true when any ancestor of the given node has the tag `svg`,
|
|
629
|
+
* meaning the node lives inside an SVG subtree and its DOM element must be
|
|
630
|
+
* created via createElementNS(SVG_NAMESPACE, tag).
|
|
631
|
+
*/
|
|
632
|
+
private isInSVGContext(node: AreHTMLNode): boolean {
|
|
633
|
+
let current: AreHTMLNode | undefined = node.parent as AreHTMLNode | undefined;
|
|
634
|
+
while (current) {
|
|
635
|
+
if (current.tag === 'svg') return true;
|
|
636
|
+
// <foreignObject> resets the namespace back to HTML
|
|
637
|
+
if (current.tag === 'foreignobject') return false;
|
|
638
|
+
current = current.parent as AreHTMLNode | undefined;
|
|
639
|
+
}
|
|
640
|
+
return false;
|
|
641
|
+
}
|
|
596
642
|
}
|
|
@@ -92,6 +92,12 @@ export class AreHTMLLifecycle extends AreLifecycle {
|
|
|
92
92
|
|
|
93
93
|
logger?.debug(`[Mount] Component Trigger for <${node.aseid.entity}> with aseid :{${node.aseid.toString()}}`);
|
|
94
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Skip mounting nodes whose scene has been deactivated (e.g. $if template nodes
|
|
97
|
+
* when the condition is false). Mirrors the guard in AreLifecycle.mount.
|
|
98
|
+
*/
|
|
99
|
+
if (scene.isInactive) return;
|
|
100
|
+
|
|
95
101
|
/**
|
|
96
102
|
* 1. We should simply run and render node itself.
|
|
97
103
|
*/
|
|
@@ -17,7 +17,7 @@ import { A_Frame } from "@adaas/a-frame/core";
|
|
|
17
17
|
})
|
|
18
18
|
export class AreHTMLTokenizer extends AreTokenizer {
|
|
19
19
|
|
|
20
|
-
ATTR_PATTERN = /([$:@]?[\w.-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>/"'=]+)))?/g
|
|
20
|
+
ATTR_PATTERN = /([$:@]?[\w.-]+(?::[\w.-]+)?)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>/"'=]+)))?/g
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
@A_Feature.Extend({
|