gulp-lazyimagecss
Version:
Be lazy, add images' CSS automatically, like width & height and more.
165 lines (138 loc) • 6.34 kB
JavaScript
//
// 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.
};