mirror of
https://github.com/go-gitea/gitea
synced 2024-11-01 07:44:25 +00:00
56ab5ec9ea
Currently the svg minifier (`make svg`) rewrites all `id` and `class` attributes in svg files. Every file gets the ids `a, b, ...`. If multiple svgs with ids are used on a page these ids are conflicting and the results are broken images. | minified ids | unique ids | | - | - | | ![grafik](https://user-images.githubusercontent.com/1666336/132579375-59d3996f-c4e5-43b8-8c8d-82280c90d9e3.png) | ![grafik](https://user-images.githubusercontent.com/1666336/132579413-05bf9285-4e3b-4d0d-8f95-90b212405b05.png) | This PR adds a prefix (the filename) to every id/class. Follow up problem: Because we embed svg images there are duplicated ids if one svg image is used multiple times on a page. As those ids refer to the same content it may be no real problem because browser handle that fine.
64 lines
1.8 KiB
JavaScript
Executable File
64 lines
1.8 KiB
JavaScript
Executable File
import fastGlob from 'fast-glob';
|
|
import {optimize, extendDefaultPlugins} from 'svgo';
|
|
import {resolve, parse, dirname} from 'path';
|
|
import fs from 'fs';
|
|
import {fileURLToPath} from 'url';
|
|
|
|
const {readFile, writeFile, mkdir} = fs.promises;
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
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, 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
|
|
}
|
|
|
|
const {data} = optimize(await readFile(file, 'utf8'), {
|
|
plugins: extendDefaultPlugins([
|
|
'removeXMLNS',
|
|
'removeDimensions',
|
|
{name: 'prefixIds', params: {prefix: () => name}},
|
|
{
|
|
name: 'addClassesToSVGElement',
|
|
params: {classNames: ['svg', name]},
|
|
},
|
|
{
|
|
name: 'addAttributesToSVGElement',
|
|
params: {attributes: [{'width': '16'}, {'height': '16'}, {'aria-hidden': 'true'}]},
|
|
},
|
|
]),
|
|
});
|
|
await writeFile(resolve(outputDir, `${name}.svg`), data);
|
|
}
|
|
|
|
function processFiles(pattern, opts) {
|
|
return glob(pattern).map((file) => processFile(file, opts));
|
|
}
|
|
|
|
async function main() {
|
|
try {
|
|
await mkdir(outputDir);
|
|
} catch {}
|
|
|
|
await Promise.all([
|
|
...processFiles('../node_modules/@primer/octicons/build/svg/*-16.svg', {prefix: 'octicon'}),
|
|
...processFiles('../web_src/svg/*.svg'),
|
|
...processFiles('../public/img/gitea.svg', {fullName: 'gitea-gitea'}),
|
|
]);
|
|
}
|
|
|
|
main().then(exit).catch(exit);
|
|
|