Build scenario files

This commit is contained in:
2025-06-16 22:41:31 -07:00
parent 7f5829a534
commit bdb9286e78
5 changed files with 206 additions and 275 deletions

View File

@@ -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 document = (await JSDOM.fromFile(args.path)).window.document;
const externalResourceUseEls = Array.from(document.querySelectorAll('use[href*=".svg"'));
const readFiles = {};
// const fromFile = JSDOM.fromFile(args.path).then(dom => {
// console.log('fromFile', dom.serialize());
// });
const files = [...new Set([...externalResourceUseEls.map(el =>
el.getAttributeNS(null, 'href').match(/.+\.svg/).at(0)
)])];
const dom = new JSDOM(documentText);
const document = dom.window.document;
const doc = (new JSDOM(mapsheetsText)).window.document;
const refs = [];
await Promise.all(files.map((filename) =>
JSDOM
.fromFile(path.join(path.dirname(args.path), filename))
.then(dom => readFiles[filename] = dom.window.document)
));
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 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))
}
});
}