UNPKG

fsk-imgoptimize

Version:
87 lines (85 loc) 2.49 kB
#!/usr/bin/env node 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(); } }); } }); }