summaryrefslogtreecommitdiffstats
path: root/tools/generate-svg.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xtools/generate-svg.js70
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);
+}