142 lines
4.8 KiB
JavaScript
142 lines
4.8 KiB
JavaScript
|
/* jshint node: true */
|
||
|
"use strict";
|
||
|
|
||
|
var _ = require('lodash'),
|
||
|
fs = require('fs'),
|
||
|
gulp = require('gulp'),
|
||
|
gutil = require('gulp-util'),
|
||
|
changed = require('gulp-changed'),
|
||
|
File = require('vinyl'),
|
||
|
path = require('path'),
|
||
|
through2 = require('through2');
|
||
|
|
||
|
|
||
|
var sassClassPrefix = 'md-css-prefix',
|
||
|
modulePath = './node_modules/material-design-icons',
|
||
|
srcCodepoints = modulePath + '/iconfont/codepoints',
|
||
|
fontsPath = './fonts',
|
||
|
dstCodepoints = fontsPath + '/codepoints',
|
||
|
sassFile = 'scss/_icons.scss',
|
||
|
sassHeader = '@import "variables";\n\n',
|
||
|
demoDataFile = 'demo/js/data.js'
|
||
|
|
||
|
|
||
|
function generateSassCodepoints(filepath) {
|
||
|
return through2.obj(function(codepointsFile, encoding, callback) {
|
||
|
function codepointsToSass(codepoints) {
|
||
|
return _(codepoints)
|
||
|
.split('\n')
|
||
|
.reject(_.isEmpty)
|
||
|
.reduce(function(file, line) {
|
||
|
let codepoint = line.split(' ');
|
||
|
file += '.#{$' + sassClassPrefix + '}-' + codepoint[0].replace(/_/g, '-') +
|
||
|
':before { content: "\\' + codepoint[1] + '"; }\n';
|
||
|
return file;
|
||
|
}, sassHeader);
|
||
|
}
|
||
|
callback(null, new File({
|
||
|
path: filepath,
|
||
|
contents: new Buffer(codepointsToSass(codepointsFile.contents), 'utf8')
|
||
|
}));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
gulp.task('update-sass', function() {
|
||
|
gulp.src(srcCodepoints)
|
||
|
.pipe(changed(fontsPath, {hasChanged: changed.compareSha1Digest}))
|
||
|
.pipe(generateSassCodepoints(sassFile))
|
||
|
.pipe(gulp.dest('.'));
|
||
|
});
|
||
|
|
||
|
function generateDataCodepoints(filepath) {
|
||
|
return through2.obj(function(codepointsFile, encoding, callback) {
|
||
|
var countIcons = 0,
|
||
|
newIcons = 0;
|
||
|
|
||
|
function codepoints2obj(codepoints) {
|
||
|
return _(codepoints)
|
||
|
.split('\n')
|
||
|
.reject(_.isEmpty)
|
||
|
.reduce(function(obj, line) {
|
||
|
let codepoint = line.split(' ');
|
||
|
obj[codepoint[0]] = codepoint[1];
|
||
|
return obj;
|
||
|
}, {});
|
||
|
}
|
||
|
|
||
|
function scanCategories(dir, codes) {
|
||
|
var categories = {};
|
||
|
fs.readdirSync(dir)
|
||
|
.filter(function (file) {
|
||
|
return fs.statSync(path.join(dir, file)).isDirectory()
|
||
|
&& fs.existsSync(path.join(dir, file, "svg/production"));
|
||
|
})
|
||
|
.forEach(function (category) {
|
||
|
categories[category] = {};
|
||
|
let catPath = path.join(dir, category, "svg/production");
|
||
|
fs.readdirSync(catPath)
|
||
|
.filter(function(file) {
|
||
|
return file.match(/^ic_(.+?)_\d+px\.svg$/);
|
||
|
})
|
||
|
.forEach(function(file) {
|
||
|
let matches;
|
||
|
if (matches = /^ic_(.+?)_\d+px\.svg$/.exec(file)) {
|
||
|
let icon = matches[1];
|
||
|
if (codes[icon]) {
|
||
|
if (!categories[category][icon]) {
|
||
|
categories[category][icon] = codes[icon];
|
||
|
countIcons ++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
return categories;
|
||
|
}
|
||
|
|
||
|
function calculateNewIcons(categories, codes, old) {
|
||
|
var cats = categories;
|
||
|
Object.keys(categories).forEach(function(name) {
|
||
|
let category = categories[name];
|
||
|
Object.keys(category).forEach(function(icon) {
|
||
|
let code = category[icon];
|
||
|
cats[name][icon] = [code, !old[icon]];
|
||
|
if (!old[icon]) {
|
||
|
newIcons ++;
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
return cats;
|
||
|
}
|
||
|
|
||
|
var codes = codepoints2obj(codepointsFile.contents);
|
||
|
var categories = scanCategories(modulePath, codes);
|
||
|
categories = calculateNewIcons(categories, codes,
|
||
|
codepoints2obj(fs.readFileSync(dstCodepoints).toString()));
|
||
|
|
||
|
gutil.log('Was found', gutil.colors.red(newIcons), 'new icons');
|
||
|
gutil.log('Total found', gutil.colors.red(countIcons), 'icons.');
|
||
|
|
||
|
callback(null, new File({
|
||
|
path: filepath,
|
||
|
contents: new Buffer(
|
||
|
'window.data = ' + JSON.stringify(categories) + ';', 'utf8')
|
||
|
}));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
gulp.task('update-demo-data', function() {
|
||
|
gulp.src(srcCodepoints)
|
||
|
.pipe(changed(fontsPath, {hasChanged: changed.compareSha1Digest}))
|
||
|
.pipe(generateDataCodepoints(demoDataFile))
|
||
|
.pipe(gulp.dest('.'));
|
||
|
});
|
||
|
|
||
|
gulp.task('update-codepoints', function() {
|
||
|
gulp.src(srcCodepoints)
|
||
|
.pipe(gulp.dest(fontsPath));
|
||
|
})
|
||
|
|
||
|
gulp.task('default', ['update-sass', 'update-demo-data']);
|