UNPKG

phrase-engine

Version:

Language files on steroids for conversational UIs that aren't boring.

127 lines 4.51 kB
"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