UNPKG

gulp-imageisux

Version:
222 lines (199 loc) 10.4 kB
var through = require('through2'); var request = require('request'); var gutil = require('gulp-util'); var needle = require('needle'); var path = require('path'); var fs = require('fs'); // global var _abspath; var enableWebp; var file_dirname; // if err, write the origin file instead function write_originfile(file_name){ if(file_dirname!==undefined){ // read file fs.readFile(file_dirname+'/'+file_name,'',function(err,body){ if(err){ gutil.log('[error]', file_name +' cannot read...'); } else{ var DEST_DIR; if(_abspath!==""){ DEST_DIR = file_dirname + _abspath; }else{ DEST_DIR = file_dirname + "/dest/"; } fs.exists(DEST_DIR,function(exists){ if(!exists){ fs.mkdirSync(DEST_DIR); } }); var fd = DEST_DIR + file_name; // read file fs.writeFile(fd, body, function(err, data){ if (err) { // gutil.log('[error]', '[fun write_originfile]'+ file_name +' cannot write, will be write again...'); // if err, write to file twice fs.writeFile(fd, body, function(err, data){ if (err) { gutil.log('[error]', file_name +' cannot write! Error info:'+err); } }); } }); } }); } else{ gutil.log('[error]', 'file_dirname is not exist!'); } } function imageisux (abspath,enableWebp) { var stream = through.obj(function(file,encoding,callback){ _abspath = abspath || ""; enableWebp = enableWebp || false; var _that = this; if (file.isNull()) { this.push(file); return callback(); } if (file.isStream()) { throw PluginError(PLUGIN_NAME, "Stream is not supported"); return callback(); } if (file.isBuffer()) { var file_path = file.path; file_dirname = path.dirname(file.path); var file_name = path.basename(file.path); var file_type = path.extname(file.path); file_type = file_type.slice(1,file_type.length); // surport jpg,png,gif if(file_type=='png'||file_type=='jpg'||file_type=='jpeg'||file_type=='gif'){ var data = { fileSelect: {file: file_path, content_type: 'image/'+file_type }, webp:enableWebp }; needle.post('http://zhitu.isux.us/index.php/preview/upload_file', data, {multipart:true}, function(err, resp ,body) { if(err){ gutil.log('[error]', file_name+' cannot post to the server.'); write_originfile(file_name); } else{ // server will return a json if(body.indexOf('{')>-1){ try{ // format the json var str = '({'+body.split('{')[1]+')'; var json_str = eval(str); /* * output: origin type of compressed images * output_webp: webp type of compressed images * output_code: the status code * size: images size */ var output = json_str.output; var output_webp = json_str.output_webp; var output_code = json_str.code; var size = json_str.size; /* * all the images return * type=1:origin * type=2:webp */ var output_ary = new Array(); // abspath is exist and need not use webp if(_abspath!=="" && enableWebp===false){ if(output!==undefined){ output_ary.push({'type':1,'url':output}); } else{ gutil.log('[error]','The return image '+file_name+' does not exist!'); } } // abspath is not exist, so init /dest/ and /webp/ and give the origin and webp-types. // if abspath is exist, so output the images to /abspath/ and give the webp-types to /webp/. else{ if(output!==undefined){ output_ary.push({'type':1,'url':output}); } else{ gutil.log('[error]',file_name+' cannot turn to origin-type!'); } if(output_webp!==undefined){ output_ary.push({'type':2,'url':output_webp}); } else{ gutil.log('[error]',file_name+' cannot turn to webp-type!'); } } var FILE_CONTENT = file_name.split('.'+file_type); var FILENAME = FILE_CONTENT[0]; var FILETYPE = file_type; for(var i = 0; i < output_ary.length; i++){ (function(){ var PREFIX = ""; var APPENDFIX = "."+FILETYPE; var OUTPUT_TYPE = output_ary[i].type; switch(OUTPUT_TYPE){ case 1: PREFIX = "";APPENDFIX = '.'+FILETYPE;break; case 2: PREFIX = "";APPENDFIX = ".webp";break; default:PREFIX="";break; } // download the image from server needle.get(output_ary[i].url, function(err, resp, body) { if(body) { if(_abspath!==""&&OUTPUT_TYPE==1){ var DEST_DIR = file_dirname + "/" + _abspath + "/"; } else if(OUTPUT_TYPE==1){ var DEST_DIR = file_dirname + "/dest/"; } else if(OUTPUT_TYPE==2){ var DEST_DIR = file_dirname + "/webp/"; } var fd = DEST_DIR + PREFIX + FILENAME + APPENDFIX; // make dir fs.exists(DEST_DIR,function(exists){ if(!exists){ fs.mkdirSync(DEST_DIR); } }); fs.writeFile(fd, body, function(err, data){ if (err) { // gutil.log('[error]', PREFIX + FILENAME + APPENDFIX +' cannot write, will be write again...'); // if err, write to file twice fs.writeFile(fd, body, function(err, data){ if (err) { gutil.log('[error]', PREFIX + FILENAME + APPENDFIX +' cannot write! Error info:'+err); write_originfile(file_name); } }); } }); } else { gutil.log('[error]','The data of '+file_name+' returned is not exist!'); write_originfile(file_name); } }); })(i); } } catch(err){ gutil.log('[error]','Format json data err, the filename is:'+ file_name); write_originfile(file_name); } } else{ gutil.log('[error]','The data returned has error! The file name is:'+file_name); write_originfile(file_name); } } }); } } _that.push(file); callback(); }); return stream; } module.exports = imageisux;