diff options
author | silverwind <me@silverwind.io> | 2020-07-12 11:10:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-12 12:10:56 +0300 |
commit | 8188176b588264fe0ff8e3f82a623ea007a1af41 (patch) | |
tree | 0dd469b25f45c5a40ee62916b40162985753972a /build | |
parent | 63591016b3ecd79ab1172cd98e2e830a09d6f515 (diff) | |
download | gitea-8188176b588264fe0ff8e3f82a623ea007a1af41.tar.gz gitea-8188176b588264fe0ff8e3f82a623ea007a1af41.zip |
Direct SVG rendering (#12157)
Introduce 'make svg' which calls a node script that compiles svg files
to `public/img/svg`. These files are vendored to not create a dependency
on Node for the backend build.
On the frontend side, configure webpack using `raw-loader` so SVGs can
be imported as string.
Also moved our existing SVGs to web_src/svg for consistency.
Fixes: https://github.com/go-gitea/gitea/issues/11618
Diffstat (limited to 'build')
-rwxr-xr-x | build/generate-svg.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/build/generate-svg.js b/build/generate-svg.js new file mode 100755 index 0000000000..f2c2d3ed8a --- /dev/null +++ b/build/generate-svg.js @@ -0,0 +1,63 @@ +#!/usr/bin/env node +'use strict'; + +const fastGlob = require('fast-glob'); +const Svgo = require('svgo'); +const {resolve, parse} = require('path'); +const {readFile, writeFile, mkdir} = require('fs').promises; + +const glob = (pattern) => fastGlob.sync(pattern, {cwd: resolve(__dirname), absolute: true}); +const outputDir = resolve(__dirname, '../public/img/svg'); + +function exit(err) { + if (err) console.error(err); + process.exit(err ? 1 : 0); +} + +async function processFile(file, {prefix = ''} = {}) { + const name = `${prefix}${parse(file).name}`; + + const svgo = new Svgo({ + plugins: [ + {removeXMLNS: true}, + {removeDimensions: true}, + { + addClassesToSVGElement: { + classNames: [ + 'svg', + name, + ], + }, + }, + { + addAttributesToSVGElement: { + attributes: [ + {'width': '16'}, + {'height': '16'}, + {'aria-hidden': 'true'}, + ], + }, + }, + ], + }); + + const {data} = await svgo.optimize(await readFile(file, 'utf8')); + await writeFile(resolve(outputDir, `${name}.svg`), data); +} + +async function main() { + try { + await mkdir(outputDir); + } catch {} + + for (const file of glob('../node_modules/@primer/octicons/build/svg/*.svg')) { + await processFile(file, {prefix: 'octicon-'}); + } + + for (const file of glob('../web_src/svg/*.svg')) { + await processFile(file); + } +} + +main().then(exit).catch(exit); + |