UNPKG

alexa-ssml

Version:
76 lines (59 loc) 2.22 kB
'use strict'; 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); }