var escapeHtml = s => (s + '').replace(/[&<>"']/g, m => ({ '&': '&', '<': '<', '>': '>', '"': '"', '\'': ''' })[m]); function makeHtml(fragment) { return `${fragment.html || escapeHtml(fragment.text)}`; } function pt2hl(pt) { return (function recurse(pt) { var ret = ''; for (var i = 0; i < pt.length; i++) { switch(pt[i].type) { case 'text': ret += makeHtml({ type: 'tx', text: pt[i].text }); break; case 'element': var tmp = makeHtml({ type: 'lbm', text: pt[i].lbm }) + makeHtml({ type: 'tn', text: pt[i].name }) + (p => { switch (p._type) { case 'parenthesis': return makeHtml({ type: 'lpm', text: p.left }) + p.content.map(q => { switch (q._type) { case 'attribute': return makeHtml({ type: 'pk', text: q.attribute[0] }) + makeHtml({ type: 'eq', text: q.attribute[1] }) + makeHtml({ type: 'lqm', text: q.attribute[2] }) + makeHtml({ type: 'pv', text: q.attribute[3] }) + makeHtml({ type: 'rqm', text: q.attribute[4] }); case 'whitespace': return makeHtml({ type: 'tx', text: q.whitespace }); case 'error': return makeHtml({ type: 'err', text: q.error }) default: throw Error('Unknown type'); } }).join('') + makeHtml({ type: 'rpm', text: p.right }); case 'separator': return makeHtml({ type: 'sp', text: p.separator }); default: throw Error('Unknown type'); } })(pt[i].attributes) + recurse(pt[i].children) + makeHtml({ type: 'rbm', text: pt[i].rbm }); ret += makeHtml({ type: 'elem', html: tmp }); break; case 'verbatim': var tmp2 = makeHtml({ type: 'lvm', text: pt[i].lvm + pt[i].separator }) + makeHtml({ type: 'tx', text: pt[i].child.text }) + makeHtml({ type: 'rvm', text: pt[i].rvm }); ret += makeHtml({ type: 'verb', html: tmp2 }); break; default: throw new TypeError(`Unknown type: ${pt[i].type}`); } } return ret; })(pt.root.children); } export default { pt2hl };