2022-06-06 06:27:25 +03:00
#!/usr/bin/env node
2021-04-08 13:41:57 +03:00
import fastGlob from 'fast-glob' ;
2021-08-17 08:32:48 +03:00
import { optimize } from 'svgo' ;
2022-12-21 01:15:47 +03:00
import { parse } from 'node:path' ;
import { readFile , writeFile , mkdir } from 'node:fs/promises' ;
import { fileURLToPath } from 'node:url' ;
2020-07-12 12:10:56 +03:00
2022-06-06 06:27:25 +03:00
const glob = ( pattern ) => fastGlob . sync ( pattern , {
cwd : fileURLToPath ( new URL ( '..' , import . meta . url ) ) ,
absolute : true ,
} ) ;
2020-07-12 12:10:56 +03:00
function exit ( err ) {
if ( err ) console . error ( err ) ;
process . exit ( err ? 1 : 0 ) ;
}
2020-12-05 13:09:09 +03:00
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
}
2020-07-12 12:10:56 +03:00
2023-03-21 08:39:27 +03:00
// 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
2021-03-22 07:04:19 +03:00
const { data } = optimize ( await readFile ( file , 'utf8' ) , {
2021-08-17 08:32:48 +03:00
plugins : [
{ name : 'preset-default' } ,
{ name : 'removeDimensions' } ,
2021-09-09 10:06:54 +03:00
{ name : 'prefixIds' , params : { prefix : ( ) => name } } ,
2021-08-17 08:32:48 +03:00
{ name : 'addClassesToSVGElement' , params : { classNames : [ 'svg' , name ] } } ,
2023-03-21 08:39:27 +03:00
{
name : 'addAttributesToSVGElement' , params : {
attributes : [
{ 'xmlns' : 'http://www.w3.org/2000/svg' } ,
{ 'width' : '16' } , { 'height' : '16' } , { 'aria-hidden' : 'true' } ,
]
}
} ,
2021-08-17 08:32:48 +03:00
] ,
2020-07-12 12:10:56 +03:00
} ) ;
2022-06-06 06:27:25 +03:00
await writeFile ( fileURLToPath ( new URL ( ` ../public/img/svg/ ${ name } .svg ` , import . meta . url ) ) , data ) ;
2020-07-12 12:10:56 +03:00
}
2020-12-05 13:09:09 +03:00
function processFiles ( pattern , opts ) {
return glob ( pattern ) . map ( ( file ) => processFile ( file , opts ) ) ;
}
2020-07-12 12:10:56 +03:00
async function main ( ) {
try {
2022-06-06 06:27:25 +03:00
await mkdir ( fileURLToPath ( new URL ( '../public/img/svg' , import . meta . url ) ) , { recursive : true } ) ;
2020-07-12 12:10:56 +03:00
} catch { }
2020-12-05 13:09:09 +03:00
await Promise . all ( [
2022-06-06 06:27:25 +03:00
... processFiles ( 'node_modules/@primer/octicons/build/svg/*-16.svg' , { prefix : 'octicon' } ) ,
... processFiles ( 'web_src/svg/*.svg' ) ,
... processFiles ( 'public/img/gitea.svg' , { fullName : 'gitea-gitea' } ) ,
2020-12-05 13:09:09 +03:00
] ) ;
2020-07-12 12:10:56 +03:00
}
2021-12-04 09:43:14 +03:00
main ( ) . then ( exit ) . catch ( exit ) ;