alexa-ssml
Version:
JSX for Alexa Skills Kit SSML
76 lines (59 loc) • 2.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = renderToString;
var _xmlbuilder = require('xmlbuilder');
var _xmlbuilder2 = _interopRequireDefault(_xmlbuilder);
var _kebabCase = require('lodash/kebabCase');
var _kebabCase2 = _interopRequireDefault(_kebabCase);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
// custom stringify options for xml builder
// just kebab-cases all attributes and tag names
var customStringifyOptions = {
eleName: function eleName() {
var val = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
return this.assertLegalChar((0, _kebabCase2.default)(val));
},
attName: function attName() {
var val = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
return (0, _kebabCase2.default)(val);
}
};
/**
* Recursively turns jsx children into xml nodes
* @param {Array} children
* @param {XMLNode} node
*/
function renderNode(node) {
var children = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1];
[].concat(_toConsumableArray(children)).forEach(function (child) {
if (child && child.tag) {
node.ele(child.tag, child.props);
renderNode(node, child.children);
node.end();
} else {
node.text(child);
}
});
}
/**
* Nested JSON to pretty string
* @param {Object} data
* @return {String}
*/
function renderToString(_ref) {
var tag = _ref.tag;
var children = _ref.children;
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
if (tag !== 'speak') {
throw new Error('SSML must start with a \'speak\' tag, currently \'' + tag + '\'');
}
var xml = _xmlbuilder2.default.create(tag, {
stringify: customStringifyOptions,
headless: true
});
renderNode(xml, children);
return xml.end(options);
}