material-icons-subset
Version:
#### Creates a new font with a subset of icons from [Material Design Icons Webfont](https://materialdesignicons.com/)
80 lines (73 loc) • 2.28 kB
JavaScript
const webfont = require('webfont').default
const { writeFileSync, readdirSync } = require('fs')
const { dirname, join, resolve } = require('path')
const { major, minor, patch } = require('@mdi/svg/font-build.json').version
if (process.argv.length === 2) {
console.error('Error: Expected a path for a fontconfig.json file or a list of the name of icons')
process.exit(1)
}
let userConfig = { icons: [] }
if (process.argv[2].endsWith('.json')) {
userConfig = require(resolve(process.argv[2]))
} else {
userConfig.icons = process.argv.slice(2)
}
const MIS = 'material-icons-subset'
if (!userConfig.icons) {
if (userConfig[MIS] && userConfig[MIS].icons) userConfig = userConfig[MIS]
else if (userConfig.extra) {
if (userConfig.extra.icons) userConfig = userConfig.extra
if (userConfig.extra[MIS] && userConfig.extra[MIS].icons) userConfig = userConfig.extra[MIS]
}
if (userConfig.icons.length === 0) {
console.error(
'Error: The config.json must have a "icon" property with an array of the name of icons'
)
process.exit(1)
}
}
const config = {
formats: ['ttf'],
fontName: 'Material Design Icons',
fontFile: 'materialicons-subset',
dest: '.',
...userConfig,
}
const glyphDir = join(dirname(require.resolve('@mdi/svg/package.json')), 'svg')
const dirFiles = new Set(readdirSync(glyphDir))
const glyphMap = {}
const paths = [...new Set(config.icons)].sort().map((icon, i) => {
glyphMap[icon] = 59905 + i
const iconName = `${icon}.svg`
if (!dirFiles.has(iconName)) {
console.warn('Skipping', iconName)
}
return join(glyphDir, iconName).replace(/\\/g, '/')
})
webfont({
files: paths,
fontName: config.fontName,
formats: config.formats,
fontHeight: 512,
descent: 64,
version: `${major}.${minor}.${patch}`,
})
.then((result) => {
config.formats.forEach((format) => {
writeFileSync(
join(process.cwd(), config.dest, `${config.fontFile}-subset.${format}`),
result[format]
)
})
writeFileSync(
join(process.cwd(), config.dest, `${config.fontFile}-subset.json`),
JSON.stringify(glyphMap)
)
console.log(`Generated ${config.formats}`)
return result
})
.catch((error) => {
console.error(error)
throw error
})