114 lines
2.8 KiB
JavaScript
114 lines
2.8 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const svn = require('node-svn-ultimate');
|
|
const rimraf = require('rimraf');
|
|
|
|
const FA_SVG_FOLDER_URL = 'https://github.com/FortAwesome/Font-Awesome.git/trunk/svgs';
|
|
|
|
const buildDir = path.join(__dirname, 'build');
|
|
|
|
/**
|
|
* Get all files path inside a given folder path
|
|
* @param dir
|
|
* @param cb
|
|
*/
|
|
const getFileTree = (dir, cb) => {
|
|
let list = [];
|
|
let remaining = 0;
|
|
fs.readdir(dir, {withFileTypes: true}, (err, items) => {
|
|
if (err)
|
|
return cb(err);
|
|
items.forEach((item) => {
|
|
if (item.isDirectory()) {
|
|
remaining++;
|
|
getFileTree(path.join(dir, item.name), (err, out) => {
|
|
if (err)
|
|
return cb(err);
|
|
list.push(...out);
|
|
remaining--;
|
|
if (remaining === 0)
|
|
cb(null, list);
|
|
});
|
|
} else {
|
|
list.push(path.join(dir, item.name));
|
|
}
|
|
});
|
|
if (remaining === 0)
|
|
cb(null, list);
|
|
});
|
|
};
|
|
|
|
console.log('Building fa-diagrams svg list');
|
|
|
|
if (fs.existsSync(buildDir)) {
|
|
console.log('\tCleaning build directory...');
|
|
rimraf.sync(buildDir);
|
|
} else {
|
|
console.log('\tCreating build directory...');
|
|
}
|
|
|
|
fs.mkdirSync(buildDir);
|
|
|
|
console.log('\tFetching Font-Awesome SVGs from repository...');
|
|
|
|
const svgDir = path.join(buildDir, 'svgs');
|
|
|
|
svn.commands.checkout(FA_SVG_FOLDER_URL, svgDir, (err) => {
|
|
if (err)
|
|
throw err;
|
|
|
|
rimraf.sync(path.join(svgDir, '.svn'));
|
|
|
|
console.log('\tReading SVGs...');
|
|
|
|
getFileTree(svgDir, (err, files) => {
|
|
if (err)
|
|
throw err;
|
|
|
|
const list = {};
|
|
|
|
let count = 0;
|
|
|
|
files.filter(x => /\.svg$/.test(x)).forEach(svgFile => {
|
|
const data = fs.readFileSync(svgFile, {encoding: 'utf8'});
|
|
const match1 = data.match(/viewBox="0 0 (\d+) 512"/);
|
|
if (!match1)
|
|
return console.warn(`\t\tInvalid viewBox match for "${svgFile}"`);
|
|
const match2 = data.match(/path d="([^"]+)"/);
|
|
if (!match2)
|
|
return console.warn(`\t\tInvalid path for "${svgFile}"`);
|
|
|
|
const type = path.basename(path.dirname(svgFile));
|
|
const name = path.basename(svgFile, '.svg');
|
|
|
|
if (!list[type])
|
|
list[type] = {};
|
|
|
|
list[type][name] = {
|
|
path: match2[1],
|
|
width: parseInt(match1[1])
|
|
};
|
|
|
|
count++;
|
|
});
|
|
|
|
console.log(`\t${count} SVGs loaded`);
|
|
Object.keys(list).forEach(type => {
|
|
console.log(`\t\t${type}: ${Object.keys(list[type]).length} SVGs`);
|
|
});
|
|
|
|
const out = {
|
|
name: 'font-awesome',
|
|
height: 512,
|
|
index: ['solid', 'regular', 'brands'],
|
|
icons: list
|
|
};
|
|
|
|
const outputFile = path.join(__dirname, 'resources.json');
|
|
|
|
fs.writeFileSync(outputFile, JSON.stringify(out, null, 4), {encoding: 'utf8'});
|
|
console.log(`\tSVG resources saved at "${outputFile}"`);
|
|
|
|
});
|
|
});
|