index : btroops | |
Virtual board game-aid for BattleTroops, an infantry combat simulator wargame published by FASA in 1989. |
aboutsummaryrefslogtreecommitdiff |
path: root/esbuild-server.mjs
diff options
Diffstat (limited to 'esbuild-server.mjs')
-rw-r--r-- | esbuild-server.mjs | 63 |
1 files changed, 38 insertions, 25 deletions
diff --git a/esbuild-server.mjs b/esbuild-server.mjs index c43bd68..13cca8b 100644 --- a/esbuild-server.mjs +++ b/esbuild-server.mjs @@ -124,36 +124,49 @@ const resolveImportedSvg = { }); build.onLoad({ filter: /\.svg$/ }, async (args) => { - const documentText = await fs.promises.readFile(args.path, 'utf8'); - const mapsheetsText = await fs.promises.readFile('/usr/src/app/public/assets/images/mapsheets.svg', 'utf8'); - - // const fromFile = JSDOM.fromFile(args.path).then(dom => { - // console.log('fromFile', dom.serialize()); - // }); - - const dom = new JSDOM(documentText); - const document = dom.window.document; - const doc = (new JSDOM(mapsheetsText)).window.document; - const refs = []; - - document.querySelectorAll('use[href*=".svg"').forEach(el => { - const fragId = el.getAttributeNS(null, 'href').split('.svg').pop(); - const frag = doc.querySelector(fragId); - frag.querySelectorAll('use').forEach(el => refs.push(el.getAttributeNS(null, 'href'))); - if (el.style.transform) frag.style.transform = el.style.transform; - el.replaceWith(frag); + const document = (await JSDOM.fromFile(args.path)).window.document; + const externalResourceUseEls = Array.from(document.querySelectorAll('use[href*=".svg"')); + const readFiles = {}; + + const files = [...new Set([...externalResourceUseEls.map(el => + el.getAttributeNS(null, 'href').match(/.+\.svg/).at(0) + )])]; + + await Promise.all(files.map((filename) => + JSDOM + .fromFile(path.join(path.dirname(args.path), filename)) + .then(dom => readFiles[filename] = dom.window.document) + )); + + const refs = {}; + + externalResourceUseEls.forEach(el => { + const href = el.getAttributeNS(null, 'href'); + const [filename] = href.match(/.+\.svg/); + const fragId = href.split('.svg').pop(); + const frag = readFiles[filename].querySelector(fragId); + + if (frag) { + frag.querySelectorAll('use').forEach(el => + (refs[filename] ??= []).push(el.getAttributeNS(null, 'href')) + ); + + (refs[filename] ??= []).push(fragId); + el.setAttributeNS(null, 'href', fragId); + } }); - const refsQuery = [...new Set([...refs])].join(', '); - const refNodes = doc.querySelectorAll(refsQuery); - const defs = document.querySelector('defs'); - - refNodes.forEach(n => defs.appendChild(n)); + Object.keys(refs).forEach(filename => { + const refsQuery = [...new Set([...refs[filename]])].join(', '); + const refNodes = readFiles[filename].querySelectorAll(refsQuery); + const defs = document.querySelector('defs'); + refNodes.forEach(n => defs.appendChild(n)); + }); return { - contents: '<?xml version="1.0" standalone="no"?>' + document.querySelector('svg').outerHTML, + contents: `<?xml version="1.0" standalone="no"?>\n${document.querySelector('svg').outerHTML}`, loader: 'file', - watchFiles: ['/usr/src/app/public/assets/images/mapsheets.svg'] + watchFiles: Object.keys(readFiles).map(filename => path.join(path.dirname(args.path), filename)) } }); } |