diff --git a/packages/bbob-html/lib/index.js b/packages/bbob-html/lib/index.js index 712298a..b8af469 100644 --- a/packages/bbob-html/lib/index.js +++ b/packages/bbob-html/lib/index.js @@ -3,16 +3,16 @@ function escapeQuote(value) { } function attrValue(name, value) { - if (typeof value === 'boolean' && value) { - return `${name}`; - } else if (typeof value === 'number') { - return `${name}="${value}"`; - } else if (typeof value === 'string') { - return `${name}="${escapeQuote(value)}"`; - } else if (typeof value === 'object') { - return `${name}="${escapeQuote(JSON.stringify(value))}"`; - } - return ''; + const type = typeof value; + + const types = { + boolean: () => (value ? `${name}` : ''), + number: () => `${name}="${value}"`, + string: () => `${name}="${escapeQuote(value)}"`, + object: () => `${name}="${escapeQuote(JSON.stringify(value))}"`, + }; + + return types[type] ? types[type]() : ''; } /** @@ -24,14 +24,24 @@ const attrs = values => .reduce((arr, key) => [...arr, attrValue(key, values[key])], ['']) .join(' '); -const renderNode = (node) => { +const renderNode = (node, { stripTags = false }) => { if (!node) return ''; + const type = typeof node; - if (typeof node === 'string' || typeof node === 'number') { + if (type === 'string' || type === 'number') { return node; } - if (typeof node === 'object') { + if (type === 'object') { + if (stripTags === true) { + // eslint-disable-next-line no-use-before-define + return renderNodes(node.content); + } + + if (node.content === null) { + return `<${node.tag}${attrs(node.attrs)} />`; + } + // eslint-disable-next-line no-use-before-define return `<${node.tag}${attrs(node.attrs)}>${renderNodes(node.content)}`; } @@ -44,6 +54,8 @@ const renderNode = (node) => { return ''; }; -const renderNodes = nodes => [].concat(nodes).reduce((r, node) => r + renderNode(node), ''); +const renderNodes = (nodes, { stripTags = false } = {}) => [] + .concat(nodes) + .reduce((r, node) => r + renderNode(node, { stripTags }), ''); module.exports = renderNodes;