Spaces:
No application file
No application file
File size: 993 Bytes
c20f20c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | function attrString(attribs) {
const buff = []
for (const key in attribs) {
buff.push(`${key}="${attribs[key]}"`)
}
if (!buff.length) {
return ''
}
return ` ${buff.join(' ')}`
}
function escapeXmlText(str) {
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
}
function stringify(buff, doc) {
switch (doc.type) {
case 'text':
return buff + escapeXmlText(doc.data)
case 'tag': {
const voidElement =
doc.voidElement || (!doc.children.length && doc.attribs['xml:space'] !== 'preserve')
buff += `<${doc.name}${doc.attribs ? attrString(doc.attribs) : ''}${voidElement ? '/>' : '>'}`
if (voidElement) {
return buff
}
return `${buff + doc.children.reduce(stringify, '')}</${doc.name}>`
}
case 'comment':
buff += `<!--${doc.comment}-->`
return buff
}
}
export function stringifyDoc(doc) {
return doc.reduce((token, rootEl) => token + stringify('', rootEl), '')
}
|