diff options
Diffstat (limited to 'tools/generate-svg.js')
-rwxr-xr-x | tools/generate-svg.js | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/tools/generate-svg.js b/tools/generate-svg.js new file mode 100755 index 0000000..1c5851e --- /dev/null +++ b/tools/generate-svg.js @@ -0,0 +1,70 @@ +#!/usr/bin/env node +import fastGlob from 'fast-glob'; +import {optimize} from 'svgo'; +import {parse} from 'node:path'; +import {readFile, writeFile, mkdir} from 'node:fs/promises'; +import {fileURLToPath} from 'node:url'; +import {exit} from 'node:process'; + +const glob = (pattern) => fastGlob.sync(pattern, { + cwd: fileURLToPath(new URL('..', import.meta.url)), + absolute: true, +}); + +function doExit(err) { + if (err) console.error(err); + exit(err ? 1 : 0); +} + +async function processFile(file, {prefix, fullName} = {}) { + let name; + if (fullName) { + name = fullName; + } else { + name = parse(file).name; + if (prefix) name = `${prefix}-${name}`; + if (prefix === 'octicon') name = name.replace(/-[0-9]+$/, ''); // chop of '-16' on octicons + } + + // Set the `xmlns` attribute so that the files are displayable in standalone documents + // The svg backend module will strip the attribute during startup for inline display + const {data} = optimize(await readFile(file, 'utf8'), { + plugins: [ + {name: 'preset-default'}, + {name: 'removeDimensions'}, + {name: 'prefixIds', params: {prefix: () => name}}, + {name: 'addClassesToSVGElement', params: {classNames: ['svg', name]}}, + { + name: 'addAttributesToSVGElement', params: { + attributes: [ + {'xmlns': 'http://www.w3.org/2000/svg'}, + {'width': '16'}, {'height': '16'}, {'aria-hidden': 'true'}, + ], + }, + }, + ], + }); + + await writeFile(fileURLToPath(new URL(`../public/assets/img/svg/${name}.svg`, import.meta.url)), data); +} + +function processFiles(pattern, opts) { + return glob(pattern).map((file) => processFile(file, opts)); +} + +async function main() { + try { + await mkdir(fileURLToPath(new URL('../public/assets/img/svg', import.meta.url)), {recursive: true}); + } catch {} + + await Promise.all([ + ...processFiles('node_modules/@primer/octicons/build/svg/*-16.svg', {prefix: 'octicon'}), + ...processFiles('web_src/svg/*.svg'), + ]); +} + +try { + doExit(await main()); +} catch (err) { + doExit(err); +} |