import { DOMParser, XMLSerializer } from 'xmldom' /** * Expands the loop nodes in the XML document. * Returns the original document with the loops expanded. */ export const loopExpander = (xml: string): string => { const parser = new DOMParser() const dom = parser.parseFromString(xml, 'text/xml') const textNodes = Array.from(dom.getElementsByTagName('Text')) .filter((node) => node.getAttribute('repeat')) .map((node) => { const repeat = parseInt(node.getAttribute('repeat')!) const parent = node.parentNode! const nodes = Array.from({ length: repeat }, () => { const clone = node.cloneNode(true); (clone as Element).removeAttribute('repeat') return clone }) return { parent, node, nodes } }) textNodes.forEach(({ parent, node, nodes }) => { nodes.forEach((n) => parent.insertBefore(n, node)) parent.removeChild(node) }) return new XMLSerializer().serializeToString(dom) }