#! /usr/bin/env node `use strict` var fs = require('fs-extra'); var os = require('os'); var path = require('path'); var exec = require('child_process').exec; var program = require('commander'); var readlineSync = require('readline-sync'); var ProgressBar = require('progress'); program .option('-r, --removeOrigin', 'Auto remove origin image when jobs done') .option('-s, --silence', 'Run in background') .option('-q, --quality ', 'Output image quality.Default is 85') .option('-e, --ext ', 'Output file extension.Support jpg,png,auto.Default is auto') .option('-E, --exceptExt ', 'Special extension will not be minified but move(copy) into output.Different ext delimit by ","') .option('-F, --exceptFolder ', 'Images in excepted folder(name) will not be minified') .option('-o, --output ', 'Output folder path.Default is current image path with a subfolder named minified') .option('-w, --worker ', 'Max minify worker at the same time.Default is max CPU Core Number') .usage('-q [Quality] -e [Extension] -o [Output Path] Path...') .arguments('[path...]') .parse(process.argv); var Config = { path : program.args[0], quality : program.quality, output : program.output, ext : program.ext, exceptExt : program.exceptExt, exceptFolder : program.exceptPath, worker : program.worker, isFolder :false, currentDir : '', outputDir : '' } var ImageList = [],failureList = [],exceptExt = {},exceptFolder = {},workerCount = 0; var processBar; if(!Config.path) return program.outputHelp(); exec('gm -version | grep -o -E \'^GraphicsMagick ([0-9]|\.)+\'',function(err,stdout,stderr){ if(err || !stdout) return console.error('GraphicsMagick not installed!!!') checkPath(); }) function checkPath(){ if(Config.exceptExt){ let arr = Config.exceptExt.split(','); for(let ext of arr){ exceptExt[ext] = 1; } } if(Config.exceptFolder){ let arr = Config.exceptFolder.split(','); for(let folder of arr){ exceptFolder[folder] = 1; } } exceptFolder['minified'] = 1; fs.stat(Config.path,function(err,stats){ if(err || !stats) return console.error(`No such file or directory [${Config.path}]`) if(stats.isFile()){ let ext = path.extname(Config.path); if(!ext.match(/^.(jpg|jpeg|png|gif|bmp|raw)$/gi)){ return console.log("ImageMinify only support image with extension name in jpg,jpeg,png,gif,bmp or raw"); } ImageList.push(Config.path); Config.currentDir = path.parse(Config.path).dir; prepareTask(); }else{ Config.isFolder = true; Config.currentDir = path.resolve(Config.path); analysisFolder(Config.currentDir); prepareTask(); } }); } function analysisFolder(readPath){ let currentPath = readPath; let fileList = fs.readdirSync(currentPath); for(let fileName of fileList){ let filePath = path.join(currentPath,fileName); let fileStat = fs.statSync(filePath); if(fileStat.isFile()){ let ext = path.extname(fileName); if(ext.match(/jpg|jpeg|png|gif|bmp|raw/gi)){ ImageList.push(filePath); } }else{ if(exceptFolder[path.parse(filePath).name]) continue; analysisFolder(filePath); } } } function prepareTask(){ fs.removeSync(`${Config.outputDir}/error.log`); if(!Config.output){ if(program.silence){ Config.output = 'minified'; }else{ Config.output = readlineSync.question('Output directory [minified] : '); if(!Config.output) Config.output = 'minified'; } } Config.outputDir = path.resolve(Config.currentDir,Config.output); if(!Config.quality){ if(program.silence){ Config.quality = 85; }else{ Config.quality = Number(readlineSync.question('Output quality [85] : ')); if(!Config.quality) Config.quality = 85; } } if(!Config.ext){ if(program.silence){ Config.ext = 'auto'; }else{ Config.ext = readlineSync.question('Output extension,only support jpg,png,gif or auto [auto] : '); if(!Config.ext || !Config.ext.match(/^(jpg|png|gif)$/i)) Config.ext = 'auto'; } } if(!Config.worker){ Config.worker = os.cpus().length; // if(program.silence){ // }else{ // Config.worker = Number(readlineSync.question('Output quality [85] : ')); // if(!Config.worker) Config.worker = os.cpus().length; // } } startTask(); } function startTask(){ if(!program.silence){ console.log('-----------------------------------------------------------------'); console.log(`[ Path ] ${Config.path}`); console.log(`[Folder] ${Config.isFolder}\t[Quality] ${Config.quality}\t[OutputExtension] ${Config.ext}\t[Amount] ${ImageList.length}\t[Worker] ${Config.worker}`); console.log('-----------------------------------------------------------------'); console.log(`[OutputDirectory] ${Config.outputDir}`); console.log('-----------------------------------------------------------------'); processBar = new ProgressBar('Minifying: [:bar][:current/:total] [:image]', { total: ImageList.length, width: 20, complete: '*' }); } for(let i = 0;i