50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
const fs = require('fs');
|
|
const async = require('async');
|
|
const svgSprite = require('svg2sprite');
|
|
const sprite = svgSprite.collection();
|
|
|
|
const isSVG = (filename) => filename.split('.').pop() === 'svg';
|
|
const iconName = (filename) => filename.split('.')[0];
|
|
|
|
function saveSpritesheet(path, spritesheet) {
|
|
if(path.indexOf('.svg') === -1) throw 'Error: Please specify a filename ending with .svg';
|
|
|
|
fs.writeFile(path, spritesheet, (error) => { if (error) throw error });
|
|
}
|
|
|
|
function readSprite(filename, file) {
|
|
sprite.add(iconName(filename), `<svg>${file}</svg>`);
|
|
}
|
|
|
|
function allSpritesRead(pathBuild) {
|
|
let spritesheet = sprite.compile();
|
|
|
|
if (pathBuild) {
|
|
saveSpritesheet(pathBuild, spritesheet);
|
|
}
|
|
|
|
return spritesheet;
|
|
}
|
|
|
|
function generate(pathSrc, pathBuild) {
|
|
return new Promise((resolve, reject) => {
|
|
fs.readdir(pathSrc, (error, filenames) => {
|
|
if (error) reject(error);
|
|
|
|
async.eachSeries(filenames.filter(isSVG), (filename, cb) => {
|
|
fs.readFile(pathSrc + filename, (error, fileData) => {
|
|
if (error) reject(error);
|
|
|
|
readSprite(filename, fileData);
|
|
cb(fileData);
|
|
});
|
|
}, (error) => {
|
|
if (error) reject(error);
|
|
|
|
resolve(allSpritesRead(pathBuild));
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
module.exports = generate;
|