Build scenario files
This commit is contained in:
@@ -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))
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user