{"version":3,"sources":["../../../../src/lib/AreHTML/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 { AreNodeFeatures, AreNode, AreTokenizer, AreAttribute_Init, AreContext } from \"@adaas/are\";\nimport { AreComponentNode } from \"../../nodes/AreComponent\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { AreRootNode } from \"../../nodes/AreRoot\";\nimport { AreHTMLAttribute } from \"../AreHTMLAttribute/AreHTML.attribute\";\nimport { AreDirectiveAttribute } from \"../../attributes/AreDirective.attribute\";\nimport { AreEventAttribute } from \"../../attributes/AreEvent.attribute\";\nimport { AreBindingAttribute } from \"../../attributes/AreBinding.attribute\";\nimport { AreStaticAttribute } from \"../../attributes/AreStatic.attribute\";\n\n\nexport class AreHTMLTokenizer extends AreTokenizer {\n\n    ATTR_PATTERN = /([$:@]?[\\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            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}"]}