{"version":3,"sources":["../../../../src/lib/AreTokenizer/AreTokenizer.component.ts"],"names":[],"mappings":"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","file":"AreTokenizer.component.mjs","sourcesContent":["import { A_Caller, A_Component, A_Context, A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\nimport { AreNode } from \"@adaas/are/node/AreNode.entity\";\nimport { AreSyntaxTokenMatch, AreSyntaxTokenRules } from \"@adaas/are/syntax/AreSyntax.types\";\nimport { AreSyntax } from \"@adaas/are/syntax/AreSyntax.context\";\nimport { AreContext } from \"@adaas/are/component/Are.context\";\n// import { AreEngine } from \"@adaas/are/engine/AreEngine.component\";\nimport { AreEngineFeatures } from \"@adaas/are/engine/AreEngine.constants\";\nimport { AreTokenizerError } from \"./AreTokenizer.error\";\nimport { AreNodeFeatures } from \"@adaas/are/node/AreNode.constants\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\n\n\n@A_Frame.Define({\n    namespace: 'A-ARE',\n    description: 'AreTokenizer is responsible for scanning and tokenizing template source strings using the syntax rules defined in AreSyntax. It converts raw template strings into AreNode instances that represent the structured AST of the template, enabling downstream compilation and rendering within the ARE framework.'\n})\nexport class AreTokenizer extends A_Component {\n\n    /**\n     * Get the AreSyntax from the current scope. The AreSyntax defines the syntax rules and structures for tokenizing templates. It provides mechanisms for parsing and interpreting templates, attributes, directives, interpolations, and event listeners, enabling dynamic and interactive UI rendering within the ARE framework. If no AreSyntax is found in the scope, an error is thrown indicating that AreTokenizer requires an AreSyntax to function properly.\n     */\n    protected get config(): AreSyntax {\n        const syntax = A_Context.scope(this).resolve(AreSyntax);\n\n        if (!syntax) throw new AreTokenizerError({\n            title: 'Syntax Context Not Found',\n            description: 'AreTokenizer requires an AreSyntax to be present in the same scope. Ensure that an AreSyntax fragment is included in the concept and is accessible from the scope where AreTokenizer is used.'\n        });\n\n        return syntax\n    }\n\n    /**\n     * Instantiate AreNodes based on the token matches obtained from scanning the source template. This method takes the raw source string from the context, scans it for tokens using the defined syntax rules, and creates corresponding AreNode instances for each matched token. The resulting array of AreNodes represents the structured representation of the template, which can then be used for further processing, such as rendering or applying scene instructions.\n     * \n     * \n     * @param context \n     * @returns \n     */\n    @A_Feature.Extend({\n        name: AreEngineFeatures.Load,\n        // scope: [AreEngine]\n    })\n    instantiate<T extends AreNode>(\n        @A_Inject(AreContext) context: AreContext,\n    ): void {\n        context.startPerformance('Tokenizer Instantiate');\n\n        const source = context.source;\n\n        const nodes = this\n            .scan(source, 0, source.length, context)\n            .map(match => {\n                const rule = this.findRuleForMatch(match)\n                if (!rule) throw new Error(`No rule found for match at position ${match.position}`)\n                return new (rule.component as typeof AreNode)(match)\n            })\n\n        for (const node of nodes) {\n            context.addRoot(node)\n        }\n\n        context.endPerformance('Tokenizer Instantiate');\n    }\n\n\n    @A_Feature.Extend({\n        name: AreNodeFeatures.onTokenize,\n        scope: [AreNode]\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    ) {\n        context.startPerformance(`Tokenize method`);\n\n        const source = node.content\n        const content = this\n            .scan(source, 0, source.length, context)\n            .map(match => {\n                const rule = this.findRuleForMatch(match)\n                if (!rule) throw new Error(`No rule found for match at position ${match.position}`)\n                return new (rule.component as typeof AreNode)(match)\n            })\n\n        logger?.debug('red', `Tokenized node <${node.aseid.toString()}> with content:`, content.length);\n\n        context.endPerformance(`Tokenize method`);\n\n        context.startPerformance(`Tokenize node Create Children`);\n        for (const child of content) {\n            node.addChild(child);\n\n            context.startPerformance('AreTokenizer.tokenize child init');\n            child.init();\n            // child.call(AreNodeFeatures.onInit, child.scope);\n\n            context.endPerformance('AreTokenizer.tokenize child init');\n        }\n\n        context.endPerformance(`Tokenize node Create Children`);\n\n\n    }\n\n    protected scan(source: string, from: number, to: number, context: AreContext): AreSyntaxTokenMatch[] {\n        context.startPerformance('Tokenizer Scan');\n\n        const tokens: AreSyntaxTokenMatch[] = []\n        let index = from\n        let hasMatchBefore = false\n\n        while (index < to) {\n            const match = this.findNextMatch(source, index, to)\n            if (!match) {\n                const rest = source.slice(index, to)\n                /**\n                 * Trailing text (after the last match). When trimWhitespace is on,\n                 * discard it if it is whitespace-only — it is edge indentation/newlines.\n                 */\n                const t = this.tryPlainText(rest, index)\n                if (t && !(this.config.trimWhitespace && !rest.trim())) tokens.push(t)\n                break\n            }\n            if (match.position > index) {\n                const plain = source.slice(index, match.position)\n                const t = this.tryPlainText(plain, index)\n                if (t) {\n                    /**\n                     * When trimWhitespace is on and the text is whitespace-only:\n                     * - Discard if it is leading text (before the first match)\n                     * - Preserve (collapse to single space) if it is between two matches\n                     */\n                    if (this.config.trimWhitespace && !plain.trim()) {\n                        if (hasMatchBefore) {\n                            t.content = ' '\n                            tokens.push(t)\n                        }\n                        // else: leading whitespace — skip\n                    } else {\n                        tokens.push(t)\n                    }\n                }\n            }\n            tokens.push(match)\n            hasMatchBefore = true\n            index = match.position + match.raw.length\n        }\n\n        context.endPerformance('Tokenizer Scan');\n\n\n        return tokens\n    }\n\n    protected findNextMatch(source: string, from: number, to: number): AreSyntaxTokenMatch | null {\n        let earliest: AreSyntaxTokenMatch | null = null\n        for (const rule of this.config.rules) {\n            if (!rule.opening && !rule.closing && !rule.pattern && !rule.matcher) continue\n            const match = this.matchRule(source, rule, from, to)\n            if (!match) continue\n            if (!earliest || match.position < earliest.position) earliest = match\n        }\n        return earliest\n    }\n\n    protected matchRule(source: string, rule: AreSyntaxTokenRules, from: number, to: number): AreSyntaxTokenMatch | null {\n        if (rule.matcher) {\n            return rule.matcher(source, from, to, (raw, content, position, closing) =>\n                this.buildMatch(rule, raw, content, position, closing)\n            )\n        }\n        if (rule.pattern) {\n            const slice = source.slice(from, to)\n            rule.pattern.lastIndex = 0\n            const m = rule.pattern.exec(slice)\n            if (!m) return null\n            return this.buildMatch(rule, m[0], m[0], from + m.index, '')\n        }\n        if (!rule.opening || !rule.closing) return null\n        if (rule.prefix) return this.matchPrefixedRule(source, rule, from, to)\n        return this.matchStandardRule(source, rule, from, to)\n    }\n\n    protected matchStandardRule(source: string, rule: AreSyntaxTokenRules, from: number, to: number): AreSyntaxTokenMatch | null {\n        const opening = rule.opening!\n        const closing = rule.closing!\n        const openPos = source.indexOf(opening, from)\n        if (openPos === -1 || openPos >= to) return null\n        const contentStart = openPos + opening.length\n\n        if (rule.selfClosing) {\n            const selfClosePos = source.indexOf(rule.selfClosing, contentStart)\n            const normalClosePos = source.indexOf(closing, contentStart)\n            if (selfClosePos !== -1 && (normalClosePos === -1 || selfClosePos < normalClosePos)) {\n                const closeEnd = selfClosePos + rule.selfClosing.length\n                return this.buildMatch(rule, source.slice(openPos, closeEnd), source.slice(contentStart, selfClosePos), openPos, rule.selfClosing)\n            }\n        }\n\n        const closePos = rule.nested !== false\n            ? this.findMatchingClose(source, opening, closing, contentStart, to)\n            : source.indexOf(closing, contentStart)\n\n        if (closePos === -1) {\n            if (this.config.strictMode) throw new Error(`Unclosed token '${opening}' at position ${openPos}`)\n            return null\n        }\n\n        return this.buildMatch(rule, source.slice(openPos, closePos + closing.length), source.slice(contentStart, closePos), openPos, closing)\n    }\n\n    protected matchPrefixedRule(source: string, rule: AreSyntaxTokenRules, from: number, to: number): AreSyntaxTokenMatch | null {\n        const opening = rule.opening!\n        const closing = rule.closing!\n        let searchFrom = from\n\n        while (searchFrom < to) {\n            const openPos = source.indexOf(opening, searchFrom)\n            if (openPos === -1 || openPos >= to) return null\n\n            const before = source.slice(from, openPos)\n            const prefixRe = new RegExp(rule.prefix!.source + '$')\n            const prefixM = prefixRe.exec(before)\n\n            if (prefixM) {\n                const actualStart = openPos - prefixM[0].length\n                const contentStart = openPos + opening.length\n                const closePos = rule.nested !== false\n                    ? this.findMatchingClose(source, opening, closing, contentStart, to)\n                    : source.indexOf(closing, contentStart)\n\n                if (closePos === -1) {\n                    if (this.config.strictMode) throw new Error(`Unclosed token '${opening}' at position ${openPos}`)\n                    return null\n                }\n\n                return this.buildMatch(rule, source.slice(actualStart, closePos + closing.length), source.slice(contentStart, closePos), actualStart, closing)\n            }\n            searchFrom = openPos + 1\n        }\n        return null\n    }\n\n    protected findMatchingClose(source: string, opening: string, closing: string, from: number, to: number): number {\n        let level = 1\n        let index = from\n        while (index < to) {\n            const nextOpen = source.indexOf(opening, index)\n            const nextClose = source.indexOf(closing, index)\n            if (nextClose === -1) return -1\n            if (nextOpen !== -1 && nextOpen < nextClose) {\n                level++\n                index = nextOpen + opening.length\n                continue\n            }\n            level--\n            if (level === 0) return nextClose\n            index = nextClose + closing.length\n        }\n        return -1\n    }\n\n    protected buildMatch(rule: AreSyntaxTokenRules, raw: string, content: string, position: number, closingUsed: string): AreSyntaxTokenMatch {\n        const trimmed = this.config.trimWhitespace ? content.trim() : content\n        const match: AreSyntaxTokenMatch = { raw, content: trimmed, opening: rule.opening ?? '', closing: closingUsed, position, payload: {}, _rule: rule }\n        if (rule.extract) match.payload = rule.extract(raw, match)\n        return match\n    }\n\n    protected tryPlainText(raw: string, position: number): AreSyntaxTokenMatch | null {\n        if (!raw) return null\n        const rule = this.config.rules.find(r => !r.opening && !r.closing && !r.pattern && !r.matcher)\n        if (!rule) return null\n        const match = this.buildMatch(rule, raw, raw, position, '')\n        match._rule = rule\n        return match\n    }\n\n    protected findRuleForMatch(match: AreSyntaxTokenMatch): AreSyntaxTokenRules | undefined {\n        // Fast path: the rule that produced this match is already stored\n        if (match._rule) return match._rule\n        // Fallback: match by opening/closing (for externally constructed AreSyntaxTokenMatch objects)\n        return this.config.rules.find(r => (r.opening ?? '') === match.opening && (r.closing ?? '') === match.closing)\n    }\n}"]}