UNPKG

@ogs-gmbh/ngx-template-engine

Version:

A library providing a flexible and efficient template engine for dynamic content rendering. It enables easy integration of customizable templates within Angular applications.

59 lines 10.3 kB
import { CharKind } from "./chars"; import { createAstTemplateIndexNode, createAstTemplatePropertyNode, createAstTextNode } from "./ast"; import { getCharDescriptor } from "./utils"; function parseAst(value) { const splittedValue = value.split(""); if (splittedValue.length === 0) throw new Error("Error processing a zero length data sequence"); const astNodes = []; let sequence = null; let lastCharKind = null; let detectedAstMode = null; splittedValue.forEach((char, index) => { const charDescriptor = getCharDescriptor(char); if (charDescriptor === null) { sequence === null ? sequence = char : sequence += char; if (index === splittedValue.length - 1) { astNodes.push(createAstTextNode(sequence)); sequence = null; } return; } switch (charDescriptor.kind) { case CharKind.START: { if (lastCharKind !== null && lastCharKind !== CharKind.END) throw new Error(`Expected an end char kind, but got a start char kind at index ${index} instead`); if (sequence !== null) { astNodes.push(createAstTextNode(sequence)); sequence = null; } break; } case CharKind.END: { if (sequence === null) throw new Error(`Unexpected end at index ${index}. Expected a index or keyword property`); if (lastCharKind !== CharKind.START) throw new Error(`Expected start char kind to be ${CharKind.START}, but got ${lastCharKind} instead`); const indexSequence = Number(sequence); const nodeAstMode = Number.isNaN(indexSequence) ? "property" : "index"; if (detectedAstMode !== null && detectedAstMode !== nodeAstMode) throw new Error(`Expected to have only ${detectedAstMode}-based template variables, but got a ${nodeAstMode}-based instead`); detectedAstMode ??= nodeAstMode; astNodes.push(detectedAstMode === "index" ? createAstTemplateIndexNode(indexSequence) : createAstTemplatePropertyNode(sequence)); sequence = null; break; } } lastCharKind = charDescriptor.kind; }); if (detectedAstMode === null) throw new Error(`Expected template to have at least 1 index- or property-based variable`); return { mode: detectedAstMode, nodes: astNodes }; } export { parseAst }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuRCxPQUFPLEVBQTBCLDBCQUEwQixFQUFFLDZCQUE2QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzdILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU1QyxTQUFTLFFBQVEsQ0FBRSxLQUFhO0lBRTlCLE1BQU0sYUFBYSxHQUFhLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFaEQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBRWxFLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUU5QixJQUFJLFFBQVEsR0FBa0IsSUFBSSxDQUFDO0lBQ25DLElBQUksWUFBWSxHQUFvQixJQUFJLENBQUM7SUFDekMsSUFBSSxlQUFlLEdBQW1CLElBQUksQ0FBQztJQUUzQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBUSxFQUFFO1FBQzFELE1BQU0sY0FBYyxHQUEwQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUd0RSxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM1QixRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO1lBRXZELElBQUksS0FBSyxLQUFLLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQ1gsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQzVCLENBQUM7Z0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNsQixDQUFDO1lBR0QsT0FBTztRQUNULENBQUM7UUFHRCxRQUFRLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QixLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUVwQixJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLFFBQVEsQ0FBQyxHQUFHO29CQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFrRSxLQUFNLFVBQVUsQ0FBQyxDQUFDO2dCQUV0RyxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDdEIsUUFBUSxDQUFDLElBQUksQ0FDWCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FDNUIsQ0FBQztvQkFDRixRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixDQUFDO2dCQUVELE1BQU07WUFDUixDQUFDO1lBRUQsS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFbEIsSUFBSSxRQUFRLEtBQUssSUFBSTtvQkFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBNEIsS0FBTSx3Q0FBd0MsQ0FBQyxDQUFDO2dCQUc5RixJQUFJLFlBQVksS0FBSyxRQUFRLENBQUMsS0FBSztvQkFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBbUMsUUFBUSxDQUFDLEtBQU0sYUFBYyxZQUFhLFVBQVUsQ0FBQyxDQUFDO2dCQUUzRyxNQUFNLGFBQWEsR0FBVyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sV0FBVyxHQUFZLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUdoRixJQUFJLGVBQWUsS0FBSyxJQUFJLElBQUksZUFBZSxLQUFLLFdBQVc7b0JBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQTBCLGVBQWdCLHdDQUF5QyxXQUFZLGdCQUFnQixDQUFDLENBQUM7Z0JBRW5JLGVBQWUsS0FBSyxXQUFXLENBQUM7Z0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQ1gsZUFBZSxLQUFLLE9BQU87b0JBQ3pCLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUM7b0JBQzNDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FDNUMsQ0FBQztnQkFDRixRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUVoQixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxZQUFZLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztJQUNyQyxDQUFDLENBQUMsQ0FBQztJQUlILElBQUksZUFBZSxLQUFLLElBQUk7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBRTVGLE9BQU87UUFDTCxJQUFJLEVBQUUsZUFBZTtRQUNyQixLQUFLLEVBQUUsUUFBUTtLQUNoQixDQUFDO0FBQ0osQ0FBQztBQUVELE9BQU8sRUFDTCxRQUFRLEVBQ1QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYXJEZXNjcmlwdG9yLCBDaGFyS2luZCB9IGZyb20gXCIuL2NoYXJzXCI7XG5pbXBvcnQgeyBBc3QsIEFzdE1vZGUsIEFzdE5vZGVzLCBjcmVhdGVBc3RUZW1wbGF0ZUluZGV4Tm9kZSwgY3JlYXRlQXN0VGVtcGxhdGVQcm9wZXJ0eU5vZGUsIGNyZWF0ZUFzdFRleHROb2RlIH0gZnJvbSBcIi4vYXN0XCI7XG5pbXBvcnQgeyBnZXRDaGFyRGVzY3JpcHRvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmZ1bmN0aW9uIHBhcnNlQXN0ICh2YWx1ZTogc3RyaW5nKTogQXN0IHtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB1bmljb3JuL3ByZWZlci1zcHJlYWQgKi9cbiAgY29uc3Qgc3BsaXR0ZWRWYWx1ZTogc3RyaW5nW10gPSB2YWx1ZS5zcGxpdChcIlwiKTtcblxuICBpZiAoc3BsaXR0ZWRWYWx1ZS5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgcHJvY2Vzc2luZyBhIHplcm8gbGVuZ3RoIGRhdGEgc2VxdWVuY2VcIik7XG5cbiAgY29uc3QgYXN0Tm9kZXM6IEFzdE5vZGVzID0gW107XG5cbiAgbGV0IHNlcXVlbmNlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RDaGFyS2luZDogQ2hhcktpbmQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGRldGVjdGVkQXN0TW9kZTogQXN0TW9kZSB8IG51bGwgPSBudWxsO1xuXG4gIHNwbGl0dGVkVmFsdWUuZm9yRWFjaCgoY2hhcjogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgY29uc3QgY2hhckRlc2NyaXB0b3I6IENoYXJEZXNjcmlwdG9yIHwgbnVsbCA9IGdldENoYXJEZXNjcmlwdG9yKGNoYXIpO1xuXG4gICAgLy8gR290IGEgY2hhciBzbyBqdXN0IGFwcGVuZCBpdFxuICAgIGlmIChjaGFyRGVzY3JpcHRvciA9PT0gbnVsbCkge1xuICAgICAgc2VxdWVuY2UgPT09IG51bGwgPyBzZXF1ZW5jZSA9IGNoYXIgOiBzZXF1ZW5jZSArPSBjaGFyO1xuXG4gICAgICBpZiAoaW5kZXggPT09IHNwbGl0dGVkVmFsdWUubGVuZ3RoIC0gMSkge1xuICAgICAgICBhc3ROb2Rlcy5wdXNoKFxuICAgICAgICAgIGNyZWF0ZUFzdFRleHROb2RlKHNlcXVlbmNlKVxuICAgICAgICApO1xuICAgICAgICBzZXF1ZW5jZSA9IG51bGw7XG4gICAgICB9XG5cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdvdCBhIGNoYXIgZGVzY3JpcHRvciwgc28gaGFuZGxlIGl0XG4gICAgc3dpdGNoIChjaGFyRGVzY3JpcHRvci5raW5kKSB7XG4gICAgICBjYXNlIENoYXJLaW5kLlNUQVJUOiB7XG4gICAgICAgIC8vIFdoZW4gbm8gY2hhciBraW5kIGVuZGVkIGJlZm9yZSBzdGFydCBjaGFyIGtpbmQgdGhlbiBpdHMgYSBzeW50YXggZXJyb3JcbiAgICAgICAgaWYgKGxhc3RDaGFyS2luZCAhPT0gbnVsbCAmJiBsYXN0Q2hhcktpbmQgIT09IENoYXJLaW5kLkVORClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGFuIGVuZCBjaGFyIGtpbmQsIGJ1dCBnb3QgYSBzdGFydCBjaGFyIGtpbmQgYXQgaW5kZXggJHsgaW5kZXggfSBpbnN0ZWFkYCk7XG5cbiAgICAgICAgaWYgKHNlcXVlbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgYXN0Tm9kZXMucHVzaChcbiAgICAgICAgICAgIGNyZWF0ZUFzdFRleHROb2RlKHNlcXVlbmNlKVxuICAgICAgICAgICk7XG4gICAgICAgICAgc2VxdWVuY2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ2hhcktpbmQuRU5EOiB7XG4gICAgICAgIC8vIFdoZW4gbm8gcHJvcGVydHkgaW5zaWRlIHRleHQgaXMgZm91bmQsIGNoYXIga2luZHMgam9iIGlzIG5vdCBmdWxsZmlsbGVkXG4gICAgICAgIGlmIChzZXF1ZW5jZSA9PT0gbnVsbClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZW5kIGF0IGluZGV4ICR7IGluZGV4IH0uIEV4cGVjdGVkIGEgaW5kZXggb3Iga2V5d29yZCBwcm9wZXJ0eWApO1xuXG4gICAgICAgIC8vIEVuZCBjaGFyIGtpbmQgaXMgb25seSBwb3NzaWJsZSB3aGVuIHN0YXJ0IGNoYXIga2luZCB3YXMgdGhlIHByZXZpb3VzIGNoYXIga2luZFxuICAgICAgICBpZiAobGFzdENoYXJLaW5kICE9PSBDaGFyS2luZC5TVEFSVClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN0YXJ0IGNoYXIga2luZCB0byBiZSAkeyBDaGFyS2luZC5TVEFSVCB9LCBidXQgZ290ICR7IGxhc3RDaGFyS2luZCB9IGluc3RlYWRgKTtcblxuICAgICAgICBjb25zdCBpbmRleFNlcXVlbmNlOiBudW1iZXIgPSBOdW1iZXIoc2VxdWVuY2UpO1xuICAgICAgICBjb25zdCBub2RlQXN0TW9kZTogQXN0TW9kZSA9IE51bWJlci5pc05hTihpbmRleFNlcXVlbmNlKSA/IFwicHJvcGVydHlcIiA6IFwiaW5kZXhcIjtcblxuICAgICAgICAvLyBJZiBjdXJyZW50IHRlbXBsYXRlIHZhcmlhYmxlIGlzIGJhc2VkIGRpZmZlcmVudGx5IHRoYW4gZGV0ZWN0ZWQgYXN0IG1vZGUgaXRzIGEgc3ludGF4IGVycm9yXG4gICAgICAgIGlmIChkZXRlY3RlZEFzdE1vZGUgIT09IG51bGwgJiYgZGV0ZWN0ZWRBc3RNb2RlICE9PSBub2RlQXN0TW9kZSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIGhhdmUgb25seSAkeyBkZXRlY3RlZEFzdE1vZGUgfS1iYXNlZCB0ZW1wbGF0ZSB2YXJpYWJsZXMsIGJ1dCBnb3QgYSAkeyBub2RlQXN0TW9kZSB9LWJhc2VkIGluc3RlYWRgKTtcblxuICAgICAgICBkZXRlY3RlZEFzdE1vZGUgPz89IG5vZGVBc3RNb2RlO1xuICAgICAgICBhc3ROb2Rlcy5wdXNoKFxuICAgICAgICAgIGRldGVjdGVkQXN0TW9kZSA9PT0gXCJpbmRleFwiXG4gICAgICAgICAgICA/IGNyZWF0ZUFzdFRlbXBsYXRlSW5kZXhOb2RlKGluZGV4U2VxdWVuY2UpXG4gICAgICAgICAgICA6IGNyZWF0ZUFzdFRlbXBsYXRlUHJvcGVydHlOb2RlKHNlcXVlbmNlKVxuICAgICAgICApO1xuICAgICAgICBzZXF1ZW5jZSA9IG51bGw7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGFzdENoYXJLaW5kID0gY2hhckRlc2NyaXB0b3Iua2luZDtcbiAgfSk7XG5cbiAgLy8gV2hlbiBhc3QgbW9kZSBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQsIHRoZW4gd2h5IGlzIHNvbWVvbmUgdXNpbmcgdGhpcyBvbiBhIHZhbHVlIG9ubHkgY2hhciBzZXF1ZW5jZT9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0c2VzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gKi9cbiAgaWYgKGRldGVjdGVkQXN0TW9kZSA9PT0gbnVsbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRlbXBsYXRlIHRvIGhhdmUgYXQgbGVhc3QgMSBpbmRleC0gb3IgcHJvcGVydHktYmFzZWQgdmFyaWFibGVgKTtcblxuICByZXR1cm4ge1xuICAgIG1vZGU6IGRldGVjdGVkQXN0TW9kZSxcbiAgICBub2RlczogYXN0Tm9kZXNcbiAgfTtcbn1cblxuZXhwb3J0IHtcbiAgcGFyc2VBc3Rcbn07XG4iXX0=