UNPKG

gulp-lazyimagecss

Version:

Be lazy, add images' CSS automatically, like width & height and more.

165 lines (138 loc) 6.34 kB
// // fast-image-size - Simple stand alone module to just extract the image size from image file without using special image libraries. // // Please refer to README.md for this module's documentations. // // NOTE: // - Before changing this code please refer to the 'hacking the code section' on README.md. // // Copyright (c) 2013 Ziv Barber; // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // 'Software'), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // var fs = require('fs'); var path = require('path'); module.exports = exports = function (file_path, callback) { function getJpgSize(buffer_data, retInfo) { // Skip 5 chars, they are for signature buffer_data = buffer_data.slice(4); var i, next; while (buffer_data.length) { // read length of the next block i = buffer_data.readUInt16BE(0); // 0xFFC0 is baseline(SOF) // 0xFFC2 is progressive(SOF2) next = buffer_data[i + 1]; if (next === 0xC0 || next === 0xC2) { return { 'height': buffer_data.readUInt16BE(i + 5), 'width': buffer_data.readUInt16BE(i + 7) }; } // move to the next block buffer_data = buffer_data.slice(i + 2); } } function parseHeaderData(buffer_data, callback_data) { var retInfo = {}; // Detect GIF: if (buffer_data[0] == 0x47 && buffer_data[1] == 0x49 && buffer_data[2] == 0x46) { retInfo.type = 'gif'; retInfo.width = (buffer_data[7] * 256) + buffer_data[6]; retInfo.height = (buffer_data[9] * 256) + buffer_data[8]; // Detect JPEG: } else if (buffer_data[0] == 0xFF && buffer_data[1] == 0xD8 && buffer_data[2] == 0xFF && (buffer_data[3] == 0xE0 || buffer_data[3] == 0xE1)) { retInfo.type = 'jpeg'; var size = getJpgSize(buffer_data, retInfo); retInfo.width = size.width; retInfo.height = size.height; // Detect PNG: } else if (buffer_data[0] == 137 && buffer_data[1] == 80 && buffer_data[2] == 78 && buffer_data[3] == 71 && buffer_data[4] == 13 && buffer_data[5] == 10 && buffer_data[6] == 26 && buffer_data[7] == 10) { retInfo.type = 'png'; if (buffer_data[12] == 0x49 && buffer_data[13] == 0x48 && buffer_data[14] == 0x44 && buffer_data[15] == 0x52) { retInfo.width = (buffer_data[16] * 256 * 256 * 256) + (buffer_data[17] * 256 * 256) + (buffer_data[18] * 256) + buffer_data[19]; retInfo.height = (buffer_data[20] * 256 * 256 * 256) + (buffer_data[21] * 256 * 256) + (buffer_data[22] * 256) + buffer_data[23]; } // Endif. // Detect BMP: } else if (buffer_data[0] == 0x42 && buffer_data[1] == 0x4D) { retInfo.type = 'bmp'; retInfo.width = (buffer_data[21] * 256 * 256 * 256) + (buffer_data[20] * 256 * 256) + (buffer_data[19] * 256) + buffer_data[18]; retInfo.height = (buffer_data[25] * 256 * 256 * 256) + (buffer_data[24] * 256 * 256) + (buffer_data[23] * 256) + buffer_data[22]; } // Endif. retInfo.image = file_path; if (!retInfo.type) { retInfo.type = 'unknown'; } // Endif. if (callback_data) { callback_data(retInfo); } // Endif. return retInfo; }; function getSVGImageSize(data) { var retInfo = {}; retInfo.width = 0; retInfo.height = 0; retInfo.type = 'svg'; try{ retInfo.width = data.match(/<svg(.*?)width=["|'](.*?)(px)?["|']/)[2]; retInfo.height = data.match(/<svg(.*?)height=["|'](.*?)(px)?["|']/)[2]; }catch(e){ } return retInfo; } // Async mode: if (callback) { fs.exists(file_path, function (exists) { if (exists) { fs.open(file_path, "r", function (error, fd) { var bufferSize = fs.fstatSync(fd).size; var buffer = new Buffer(bufferSize); fs.read(fd, buffer, 0, bufferSize, null, function (error, bytesRead, buffer) { fs.close(fd); parseHeaderData(buffer, callback); }); }); } else { throw 'Error: Invalid file name.'; } // Endif. }); // Sync mode: } else { if(!fs.existsSync(file_path)){ console.log(file_path + ' not exist'); return; } if(file_path.indexOf('.svg') > -1){ var fd = fs.openSync(file_path, "r"); var bufferSize = fs.fstatSync(fd).size; var buffer = new Buffer(bufferSize); var bytesRead = fs.readSync(fd, buffer, 0, bufferSize, 0); fs.closeSync(fd); return getSVGImageSize(buffer.toString(),null); }else{ var fd = fs.openSync(file_path, "r"); var bufferSize = fs.fstatSync(fd).size; var buffer = new Buffer(bufferSize); var bytesRead = fs.readSync(fd, buffer, 0, bufferSize, 0); fs.closeSync(fd); return parseHeaderData(buffer, null); } } // Endif. };