@b-side/parser
Version:
HTML Parser used to parse HTML string and bind data to it.
114 lines (113 loc) • 4.27 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Binder = void 0;
const element_1 = require("./element");
class Binder {
constructor(elements, data) {
this.data = data;
this.build([elements]);
}
build(elements, dataModifier) {
const data = Object.assign({}, dataModifier);
elements.forEach((element) => {
if (element instanceof element_1.bsIteration) {
this.evalFor(element, data);
}
else if (element instanceof element_1.bsCondition) {
this.evalIf(element, data);
}
else if (element instanceof element_1.bsExpression) {
this.elvalExpression(element, data);
}
let parent = element.parent;
while (parent && !parent.dom) {
parent = parent.parent;
}
if (element instanceof element_1.bsNode) {
this.setEvents(element, data);
this.setAttributes(element, data);
}
this.build(element.childs, data);
if (element.dependancies && element.parent) {
element.parent.dependancies.merge(element.dependancies);
}
});
return data;
}
setEvents(element, dataModifier) {
for (const [, expression] of element.eventsMap.dynamic) {
expression.eval(this.data, dataModifier);
element.dependancies.merge(expression.dependancies);
}
}
setAttributes(element, dataModifier) {
for (const [, expression] of element.attributesMap.dynamic) {
expression.eval(this.data, dataModifier);
element.dependancies.merge(expression.dependancies);
}
}
evalIf(element, dataModifier) {
element.expression.eval(this.data, dataModifier);
element.dependancies.merge(element.expression.dependancies);
}
evalFor(element, dataModifier) {
if (!element.expression) {
return dataModifier;
}
const matches = element.expression.raw.matchAll(/^([a-z0-9]*)\s*,?\s*([a-z0-9]+)?\s+(in|of)\s+([\s\S]+)$/gi);
for (const match of matches) {
const [, _variableName, _indexName, type, expression] = match;
if (type !== 'of') {
throw `Iterator type [${type}] not supported in expression [${element.expression.raw}].`;
}
const string = `
let __e = null;
try {
__e = await (${expression})
} catch(e) {
if (e instanceof ReferenceError) {
console.error(e.message, ' in expression "${expression
.trim()
.replace(/'/g, "\\'")}", in component <${this.data.nodeName}>.');
return 0;
}
}
let ___i = __e;
let ___o = null;
if (typeof (__e) === 'number') {
___i = [...new Array(__e).keys()];
___o = x => {return { "${_variableName}": ___i[x]${_indexName ? `, "${_indexName}": x` : ''} }};
} else if (!(Symbol.iterator in Object(__e))) {
if ((__e) instanceof Object) {
___i = Object.getOwnPropertyNames(__e);
___o = ___x => {return { "${_variableName}": __e[___i[___x]]${_indexName ? `, "${_indexName}": ___i[___x]` : ''} }};
} else {
throw \`Object ${expression.replace('`', '`')} is not iterable.\`;
}
} else {
___o = ___x => {return { "${_variableName}": __e[___x]${_indexName ? `, "${_indexName}": ___x` : ''} }};
}
for (let x=0;x<___i.length;x++) {
await ___c(___o(x), x);
}
return ___i.length;
`;
element.expression.setExpressionNoReturn(string);
element.expression.eval(this.data, dataModifier);
element.expression.dependancies.add(_variableName);
if (_indexName) {
element.expression.dependancies.add(_indexName);
dataModifier[_indexName] = null;
}
dataModifier[_variableName] = null;
element.dependancies.merge(element.expression.dependancies);
}
return dataModifier;
}
elvalExpression(element, dataModifier) {
element.expression.eval(this.data, dataModifier);
element.dependancies.merge(element.expression.dependancies);
}
}
exports.Binder = Binder;
//# sourceMappingURL=binder.js.map