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.",