ttrss/vendor/mervick/material-design-icons/Gulpfile.js

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']);