fsk-imgoptimize
Version:
87 lines (85 loc) • 2.49 kB
JavaScript
var fs = require('fs');
var path = require('path');
var ArgumentParser = require('fsk-argparse');
var readdir = require('fsk-traversedir');
var PNG = require('pngjs').PNG;
var GIFStream = require('../lib/gifstream.js');
var argsparser = new ArgumentParser();
argsparser.add('-d', {
dest: 'cdp',
desc: '要遍历的目录'
});
argsparser.add('-t', {
dest: 'target',
desc: '目标目录'
});
argsparser.add('-f', {
dest: 'filter',
desc: '要优化的文件格式, 可以有多个-f参数'
});
argsparser.add('-l', {
dest: 'level',
desc: '优化等级'
});
var args = argsparser.parse();
var cdp = args.cdp && args.cdp !== true ? args.cdp : process.cwd();
var target = typeof args.target === 'string' ? args.target : null;
if (target && !fs.statSync(target).isDirectory()) {
throw new Error('no found directory:' + target);
} else {
target = path.join(cdp, '../dest');
}
if (fs.statSync(cdp).isDirectory()) {
mkdirs(target, function() {
readdir(cdp, {
filters: ['gif', 'png'],
callback: function(list) {
var gifList = list.gif || [];
var pngList = list.png || [];
gifList.forEach(function(gif) {
var relaPath = path.relative(cdp, gif);
var targetPath = path.join(target, relaPath);
console.log(targetPath);
mkdirs(path.dirname(targetPath), function() {
var dst = fs.createWriteStream(targetPath);
fs.createReadStream(gif).pipe(new GIFStream()).pipe(dst);
});
});
pngList.forEach(function(png) {
var relaPath = path.relative(cdp, png);
var targetPath = path.join(target, relaPath);
console.log(targetPath);
var newPng = new PNG();
mkdirs(path.dirname(targetPath), function() {
var dst = fs.createWriteStream(targetPath);
newPng.on('parsed', function() {
newPng.pack().pipe(dst);
});
fs.createReadStream(png).pipe(newPng);
});
});
}
});
})
} else {
throw new Error('invalid dir:' + cdp);
}
function mkdirs(dirpath, callback) {
fs.stat(dirpath, function(err, stat) {
if (stat) {
callback();
} else {
var parent = path.dirname(dirpath);
fs.mkdir(dirpath, function(err) {
if (err) {
mkdirs(parent, function(){
mkdirs(dirpath,callback);
});
} else {
callback();
}
});
}
});
}