diff --git a/package.json b/package.json index 3778bc0..5e4a489 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "vinyl-source-stream": "^0.1.1" }, "dependencies": { - "htmlparser2": "^3.7.1", + "htmlparser2": "3.x", "request": "^2.36.0", "superagent": "3.x" } diff --git a/src/ImageResolver.js b/src/ImageResolver.js index 97e7bc4..91d38d6 100644 --- a/src/ImageResolver.js +++ b/src/ImageResolver.js @@ -11,6 +11,26 @@ var MimeType = require('./plugins/MimeType'); var Opengraph = require('./plugins/Opengraph'); var Webpage = require('./plugins/Webpage'); +function ClbkInvoker (clbk, url) { + this.clbk = clbk; + this.url = url; +} +ClbkInvoker.prototype.invoke = function (image) { + if (!this.clbk) { + return; + } + if ( image ) { + this.clbk( { + 'url': this.url, + 'image': image + } ); + } else { + this.clbk( null ); + } + this.clbk = null; + this.url = null; +}; + function ImageResolver( options ) { this.options = options; @@ -26,23 +46,32 @@ ImageResolver.prototype.register = function(fn) { }; -ImageResolver.prototype.next = function(filters, url, clbk) { +ImageResolver.prototype.onFilterResolve = function (url, clbk, index, data) { + + if (data === null) { + this.next(url, clbk, index+1); + } else { + clbk.invoke(data); + } + url = null; + clbk = null; + index = null; + +}; + +ImageResolver.prototype.next = function(url, clbk, index) { - var self = this; var filter; - if (filters.length) { - filter = filters[0]; - filter.resolve( url, function( data ){ - if (data === null) { - self.next(filters.slice(1), url, clbk); - return; - } else { - clbk(data); - return; - } - }, this.options, this.utils ); + index = index || 0; + if (index >= this.filters.length) { + clbk.invoke(null); + return; + } + filter = this.filters[index]; + if (filter) { + filter.resolve( url, this.onFilterResolve.bind(this, url, clbk, index), this.options, this.utils ); } else { - clbk(null); + clbk.invoke(null); return; } @@ -50,21 +79,7 @@ ImageResolver.prototype.next = function(filters, url, clbk) { ImageResolver.prototype.resolve = function(url, clbk) { - var callback = function( image ) { - if ( image ) { - clbk( { - 'url': url, - 'image': image - } ); - return; - } else { - clbk( null ); - return; - } - } - - var filters = this.filters; - this.next(filters, url, callback); + this.next(url, new ClbkInvoker(clbk, url)); return this; }; @@ -81,4 +96,4 @@ ImageResolver.Flickr = Flickr; ImageResolver.Opengraph = Opengraph; ImageResolver.Webpage = Webpage; -module.exports = ImageResolver; \ No newline at end of file +module.exports = ImageResolver; diff --git a/src/Utils.js b/src/Utils.js index e9b90de..2c0eb39 100644 --- a/src/Utils.js +++ b/src/Utils.js @@ -5,9 +5,34 @@ var Utils = function( options ){ this.cache = {}; }; +Utils.prototype.ender = function(url, success, error, r, err, response){ + if (r) { + r.removeListener('error', error); + } + if ( err ) { + error(err); + url = null; + success = null; + error = null; + r = null; + return; + } + + if (!(this.options && this.options.nocache)) { + this.cache[url] = { + data: response.text, + response: response + } + } + success( response.text, response ); + url = null; + success = null; + error = null; + r = null; +}; + Utils.prototype.fetch = function( url, success, error ) { - var _this = this; var plugin = null; if ( this.options.requestPlugin && typeof this.options.requestPlugin === 'function' ) { @@ -22,21 +47,11 @@ Utils.prototype.fetch = function( url, success, error ) { if ( plugin ) { r = r.use( plugin ); } + if (this.options.timeout && 'object' === typeof this.options.timeout) { + r.timeout(this.options.timeout); + } r.on('error', error); - r.end( function( err, response ) { - - if ( err ) { - error(err); - return; - } - - _this.cache[url] = { - data: response.text, - response: response - } - success( response.text, response ); - - }); + r.end(this.ender.bind(this, url, success, error, r)); } }; diff --git a/src/plugins/MimeType.js b/src/plugins/MimeType.js index 04a54be..3e16535 100644 --- a/src/plugins/MimeType.js +++ b/src/plugins/MimeType.js @@ -1,28 +1,33 @@ function MimeType() { } +MimeType.prototype.onSuccess = function(clbk,url,data,response){ + var contentType = response.type; + + switch (contentType) { + case "image/jpeg": + case "image/png": + case "image/gif": + case "image/svg+xml": + case "image/bmp": + case "image/tiff": + clbk(url); + break; + default: + clbk(null); + } + clbk = null; + url = null; + +}; +MimeType.prototype.onError = function(clbk){ + clbk(null); + clbk = null; +}; MimeType.prototype.resolve = function( url, clbk, options, utils ) { utils.fetch( url, - function onSuccess( data, response ) { - var contentType = response.type; - - switch (contentType) { - case "image/jpeg": - case "image/png": - case "image/gif": - case "image/svg+xml": - case "image/bmp": - case "image/tiff": - clbk(url); - break; - default: - clbk(null); - } - - }, - function onError() { - clbk(null); - } + this.onSuccess.bind(this,clbk,url), + this.onError.bind(this,clbk) ); } diff --git a/src/plugins/Opengraph.js b/src/plugins/Opengraph.js index ffe7b6d..051eb54 100644 --- a/src/plugins/Opengraph.js +++ b/src/plugins/Opengraph.js @@ -38,92 +38,105 @@ var tags = [ function Opengraph() { } +Opengraph.prototype.onSuccess = function(url,clbk,data,response){ + this.parseHTML( data, url, clbk ); + clbk = null; + url = null; +}; +Opengraph.prototype.onError = function(clbk){ + clbk(null); + clbk = null; +}; Opengraph.prototype.resolve = function(url, clbk, options, utils) { - var self = this; utils.fetch( url, - function onSuccess( data, response ) { - self.parseHTML( data, url, clbk, options, utils ); - }, - function onError(){ - clbk(null); - } + this.onSuccess.bind(this,url,clbk), + this.onError.bind(this,clbk) ); }; -Opengraph.prototype.parseHTML = function( html, url, clbk, options, utils ) { - var domutils = htmlparser.DomUtils; - - var handler = new htmlparser.DomHandler( function( error, dom ) { - - if ( error ) { - clbk(null); - return; - } - - var meta = [].concat( - domutils.getElementsByTagName('meta', dom, true), - domutils.getElementsByTagName('link', dom, true) - ); - - var images = []; - var image; - var tag; - - // Find Opengraph tags - for (var i=0,l=meta.length; i 1) { - for (i=0, l=images.length; i 1) { + for (i=0, l=images.length; i MINIMUM_SURFACE ) { @@ -128,16 +132,21 @@ Webpage.prototype.parseHTML = function( html, url, clbk, options, utils ) { } clbk( image ); - return; } else { clbk(null); } } else { clbk(null); - return; } + clbk = null; + url = null; +}; + +Webpage.prototype.parseHTML = function( html, url, clbk) { - } ); + var handler = new htmlparser.DomHandler(this.domHandlerJob.bind(this,url,clbk)); + clbk = null; + url = null; var parser = new htmlparser.Parser( handler ); parser.write( html ); parser.done();