mirror of
https://github.com/twitter/twemoji.git
synced 2024-06-15 03:35:16 +00:00
generate symbols file from svg emojis
This commit is contained in:
parent
55443d4b39
commit
f185bafe6a
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
||||
.DS_Store
|
||||
node_modules/
|
||||
build
|
||||
symbols.svg
|
||||
symbols.html
|
||||
|
99
gen-symbols.js
Normal file
99
gen-symbols.js
Normal file
@ -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('<svg xmlns="http://www.w3.org/2000/svg"/>');
|
||||
var names = [];
|
||||
files.forEach(function (file) {
|
||||
var name = path.basename(file.filename, '.svg');
|
||||
var svg = cheerio(file.content);
|
||||
var symbol = cheerio('<symbol/>');
|
||||
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 += '<svg style="width: 30px; height: 30px;"><use xlink:href="symbols.svg#' + name + '"></svg>';
|
||||
});
|
||||
fs.writeFile('symbols.html', html, callback);
|
||||
}
|
||||
], callback);
|
||||
}
|
||||
|
||||
async.waterfall([
|
||||
findFiles,
|
||||
readFiles,
|
||||
optimizeFiles,
|
||||
createSymbols,
|
||||
writeSymbolsFile
|
||||
], function (err) {
|
||||
if (err) {
|
||||
console.error('fail: ', err);
|
||||
}
|
||||
});
|
@ -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.",
|
||||
|
Loading…
Reference in New Issue
Block a user