-
Notifications
You must be signed in to change notification settings - Fork 1
/
create-icons-sprite.js
51 lines (45 loc) · 1.29 KB
/
create-icons-sprite.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import { assert } from "console"
import fs from "fs/promises"
import path from "path"
import xml2js from "xml2js"
const ICONS_DIR = "src/lib/assets/img/icons/sprite"
const VIEW_BOX = "0 0 128 128"
const iconPaths = await fs.readdir(ICONS_DIR)
const symbols = await Promise.all(iconPaths.map(async iconPath => {
const icon = await fs.readFile(path.join(ICONS_DIR, iconPath), "utf-8")
const iconName = iconPath.replace(".svg", "")
const { svg } = await xml2js.parseStringPromise(icon)
assert(svg, `Icon ${iconName} has no svg element`)
assert(svg.$, `Icon ${iconName} has attributes`)
assert(svg.$.viewBox === VIEW_BOX, `Icon ${iconName} viewBox is not ${VIEW_BOX} (was: '${svg.$.viewBox}')`)
const paths = Object.entries(svg).filter(([key]) => {
if (key === "$") return false
assert(['g', 'path'].includes(key), `Icon ${iconName}: unexpected child element '${key}`)
return true
})
return {
$: {
'id': iconName,
'viewBox': VIEW_BOX
},
...Object.fromEntries(paths)
}
}))
const svg = {
'svg': {
$: {
'width': '0',
'height': '0',
'style': 'display: none;'
},
'symbol': symbols
}
}
var builder = new xml2js.Builder({
renderOpts: {
pretty: false,
},
headless: true,
});
var xml = builder.buildObject(svg);
console.log(xml)