phrase-engine
Version:
Language files on steroids for conversational UIs that aren't boring.
127 lines • 4.51 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const RefableNode_1 = require("../RefableNode");
const peek_1 = require("../peek");
const mapFilter_1 = require("../mapFilter");
const factories_1 = require("../factories");
const PhraseError_1 = require("../PhraseError");
class SelectNode extends RefableNode_1.RefableNode {
validateNodeName(name) {
return name === 'select';
}
init(root, packet) {
if (!root.hasAttribute('key')) {
let err = new PhraseError_1.PhraseError(`<select/> must have a "key" attribute.`);
err.node(root);
throw err;
}
this.__key = root.getAttribute('key');
if (this.__key.trim().length === 0) {
let err = new PhraseError_1.PhraseError(`Select must have non empty key`);
err.node(root);
throw err;
}
let map = {};
const support = mapFilter_1.default(factories_1.default, ['for']);
const length = root.childNodes.length;
for (let i = 0; i < length; i++) {
let node = root.childNodes.item(i);
let name = node.nodeName;
if (name !== 'for') {
if (name === 'default') {
if (this.__default) {
let err = new PhraseError_1.PhraseError(`Multiple <default/> in <select/>`);
err.node(node);
throw err;
}
this.__default = support['for'](node, packet);
continue;
}
else if (name === '#text') {
continue;
}
let err = new PhraseError_1.PhraseError(`Unrecognized tag <${name}>...</${name}> under <select>...</select>`);
err.node(node);
throw err;
}
if (!node.hasAttribute('value')) {
let err = new PhraseError_1.PhraseError(`<for>...</for> must have "value" attribute`);
err.node(node);
throw err;
}
let value = node.getAttribute('value');
if (value in map) {
let err = new PhraseError_1.PhraseError(`Duplicate value "${value}" in <select/>.`);
err.node(node);
throw err;
}
map[value] = support['for'](node, packet);
}
if (!this.__default) {
this.__default = peek_1.default(packet.next_stack);
}
if (Object.keys(map).length === 0) {
let err = new PhraseError_1.PhraseError(`Select must have atleast one for.`);
err.node(root);
throw err;
}
this.__map = map;
this.registararGenerate(root);
}
eval(packet, branch) {
this.registerRender(packet);
if (!(this.__key in packet.data)) {
throw new Error(`key "${this.__key}" not found in data.`);
}
const val = packet.data[this.__key];
if (val in this.__map) {
return this.__map[val].eval(packet);
}
else {
return this.__default.eval(packet);
}
}
*gen(packet) {
this.registerRender(packet);
if (!(this.__key in packet.data)) {
throw new Error(`key "${this.__key}" not found in data.`);
}
const val = packet.data[this.__key];
if (val in this.__map) {
yield* this.__map[val].gen(packet);
}
else {
yield* this.__default.gen(packet);
}
this.deregisterRender(packet);
}
vars(packet) {
if (!this.__vared) {
packet.vars[this.__key] = packet.vars[this.__key] || [];
packet.vars[this.__key].push({
type: 'enum',
values: Object.keys(this.__map)
});
this.__vared = true;
}
return packet;
}
count(packet) {
let ret;
this.registerRender(packet);
if (!(this.__key in packet.data)) {
throw new Error(`key "${this.__key}" not found in data.`);
}
const val = packet.data[this.__key];
if (val in this.__map) {
ret = this.__map[val].count(packet);
}
else {
ret = this.__default.count(packet);
}
this.registerRender(packet);
return ret;
}
}
exports.SelectNode = SelectNode;
//# sourceMappingURL=SelectNode.js.map