phrase-engine
Version:
Language files on steroids for conversational UIs that aren't boring.
74 lines • 2.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const PhraseError_1 = require("../PhraseError");
const RefableNode_1 = require("../RefableNode");
const peek_1 = require("../peek");
class DataNode extends RefableNode_1.RefableNode {
validateNodeName(name) {
return name === 'data';
}
init(root, packet) {
if (!root.hasAttribute('key')) {
let err = new PhraseError_1.PhraseError(`<data /> tags must include a key attribute.`);
err.node(root);
throw err;
}
const check_arr = root
.getAttribute('key')
.split('|')
.map(key => key.trim());
this.__check_arr = check_arr;
this.__evaulator = (eval_pack) => {
let key = check_arr.find(key => key in eval_pack.data);
if (key === undefined) {
throw new Error(`No data for keys "${check_arr.join(', ')}"`);
}
return eval_pack.data[key];
};
this.setNextNode(peek_1.default(packet.next_stack));
this.registararGenerate(root);
}
eval(packet, branch) {
this.registerRender(packet);
packet.sentence_components.push(this.__evaulator(packet));
return this.next().eval(packet);
}
*gen(packet) {
this.registerRender(packet);
packet.sentence_components.push(this.__evaulator(packet));
yield* this.next().gen(packet);
packet.sentence_components.pop();
this.deregisterRender(packet);
}
vars(packet) {
let check_array_copy = this.__check_arr.slice(0);
if (!this.__vared) {
this.__vared = true;
let popped = check_array_copy.pop();
packet.vars[popped] = packet.vars[popped] || [];
packet.vars[popped].push({
type: 'string',
last: true
});
popped = check_array_copy.pop();
while (popped) {
packet.vars[popped] = packet.vars[popped] || [];
packet.vars[popped].push({
type: 'string',
last: false
});
popped = check_array_copy.pop();
}
this.next().vars(packet);
}
return packet;
}
count(e_packet) {
this.registerRender(e_packet);
const ret = this.next().count(e_packet);
this.registerRender(e_packet);
return ret;
}
}
exports.DataNode = DataNode;
//# sourceMappingURL=DataNode.js.map