diff --git a/.gitignore b/.gitignore index 56997d77..c2ba0d4d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .DS_Store node_modules/ build +symbols.svg +symbols.html diff --git a/gen-symbols.js b/gen-symbols.js new file mode 100644 index 00000000..33755c50 --- /dev/null +++ b/gen-symbols.js @@ -0,0 +1,99 @@ +var fs = require('fs'); +var path = require('path'); + +var async = require('async'); +var SVGO = require('svgo'); +var cheerio = require('cheerio'); + +function findFiles(callback) { + fs.readdir('svg', function (err, files) { + if (err) { + callback(err); + } else { + callback(null, files.filter(function (filename) { + return /\.svg$/.test(filename); + }).map(function (filename) { + return path.resolve('svg', filename); + })); + } + }); +} + +function readFile(filename, callback) { + fs.readFile(filename, 'utf-8', function (err, content) { + if (err) { + callback(err); + } else { + callback(null, { + filename: filename, + content: content + }); + } + }); +} + +function readFiles(files, callback) { + async.mapLimit(files, 10, readFile, callback); +} + +function optimizeFile(data, callback) { + var svgo = new SVGO(); + svgo.optimize(data.content, function (result) { + setImmediate(function() { + callback(null, { + filename: data.filename, + content: result.data + }); + }); + }); +} + +function optimizeFiles(files, callback) { + async.mapSeries(files, optimizeFile, callback); +} + +function createSymbols(files, callback) { + var doc = cheerio(''); + var names = []; + files.forEach(function (file) { + var name = path.basename(file.filename, '.svg'); + var svg = cheerio(file.content); + var symbol = cheerio(''); + symbol.attr('viewBox', svg.attr('viewbox')); + symbol.attr('id', name); + symbol.append(svg.children()); + doc.append(symbol); + names.push(name); + }); + callback(null, { + svg: doc.toString(), + names: names + }); +} + +function writeSymbolsFile(data, callback) { + async.parallel([ + function (callback) { + fs.writeFile('symbols.svg', data.svg, callback); + }, + function (callback) { + var html = ''; + data.names.forEach(function (name) { + html += ''; + }); + fs.writeFile('symbols.html', html, callback); + } + ], callback); +} + +async.waterfall([ + findFiles, + readFiles, + optimizeFiles, + createSymbols, + writeSymbolsFile +], function (err) { + if (err) { + console.error('fail: ', err); + } +}); diff --git a/package.json b/package.json index 9b143b7e..c240d5f8 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,10 @@ "unicode" ], "devDependencies": { - "uglify-js": "2.6.2", - "phantomjs-prebuilt": "2.1.4" + "async": "^2.4.1", + "phantomjs-prebuilt": "2.1.4", + "svgo": "^0.7.2", + "uglify-js": "2.6.2" }, "author": { "name": "Twitter, Inc.",