lib/link_thumbnailer.rb in link_thumbnailer-1.1.1 vs lib/link_thumbnailer.rb in link_thumbnailer-1.1.2

- old
+ new

@@ -1,119 +1,119 @@ -require 'link_thumbnailer/configuration' -require 'link_thumbnailer/object' -require 'link_thumbnailer/fetcher' -require 'link_thumbnailer/doc_parser' -require 'link_thumbnailer/doc' -require 'link_thumbnailer/img_url_filter' -require 'link_thumbnailer/img_parser' -require 'link_thumbnailer/img_comparator' -require 'link_thumbnailer/web_image' -require 'link_thumbnailer/opengraph' -require 'link_thumbnailer/version' - -module LinkThumbnailer - - module Rails - autoload :Routes, 'link_thumbnailer/rails/routes' - end - - class << self - - attr_accessor :configuration, :object, :fetcher, :doc_parser, - :img_url_filters, :img_parser, :logger - - def logger - @logger ||= ::Rails.logger - end - - def config - self.configuration ||= Configuration.new( - mandatory_attributes: %w(url title images), - strict: true, - redirect_limit: 3, - blacklist_urls: [ - %r{^http://ad\.doubleclick\.net/}, - %r{^http://b\.scorecardresearch\.com/}, - %r{^http://pixel\.quantserve\.com/}, - %r{^http://s7\.addthis\.com/} - ], - image_attributes: %w(source_url size type), - limit: 10, - top: 5, - user_agent: 'linkthumbnailer', - verify_ssl: true, - http_timeout: 5 - ) - end - - def configure - yield config - end - - def generate(url, options = {}) - set_options(options) - instantiate_classes - - doc = doc_parser.parse(fetcher.fetch(url), url) - - self.object[:url] = fetcher.url.to_s - opengraph(doc) || custom(doc) - end - - private - - def set_options(options) - config - options.each {|k, v| config[k] = v } - end - - def instantiate_classes - self.object = LinkThumbnailer::Object.new - self.fetcher = LinkThumbnailer::Fetcher.new - self.doc_parser = LinkThumbnailer::DocParser.new - self.img_url_filters = [LinkThumbnailer::ImgUrlFilter.new] - self.img_parser = LinkThumbnailer::ImgParser.new(fetcher, img_url_filters) - end - - def opengraph(doc) - return unless opengraph?(doc) - self.object = LinkThumbnailer::Opengraph.parse(object, doc) - return object if object.valid? - nil - end - - def custom(doc) - self.object[:title] = doc.title - self.object[:description] = doc.description - self.object[:images] = img_parser.parse(doc.img_abs_urls.dup) - self.object[:url] = doc.canonical_url || object[:url] - return object if object.valid? - nil - end - - def opengraph?(doc) - !doc.xpath('//meta[starts-with(@property, "og:") and @content]').empty? - end - - end - -end - -begin - require 'rails' -rescue LoadError -end - -$stderr.puts <<-EOC if !defined?(Rails) -warning: no framework detected. - -Your Gemfile might not be configured properly. ----- e.g. ---- -Rails: - gem 'link_thumbnailer' - -EOC - -if defined?(Rails) - require 'link_thumbnailer/engine' - require 'link_thumbnailer/railtie' -end +require 'link_thumbnailer/configuration' +require 'link_thumbnailer/object' +require 'link_thumbnailer/fetcher' +require 'link_thumbnailer/doc_parser' +require 'link_thumbnailer/doc' +require 'link_thumbnailer/img_url_filter' +require 'link_thumbnailer/img_parser' +require 'link_thumbnailer/img_comparator' +require 'link_thumbnailer/web_image' +require 'link_thumbnailer/opengraph' +require 'link_thumbnailer/version' + +module LinkThumbnailer + + module Rails + autoload :Routes, 'link_thumbnailer/rails/routes' + end + + class << self + + attr_accessor :configuration, :object, :fetcher, :doc_parser, + :img_url_filters, :img_parser, :logger + + def logger + @logger ||= ::Rails.logger + end + + def config + self.configuration ||= Configuration.new( + mandatory_attributes: %w(url title images), + strict: true, + redirect_limit: 3, + blacklist_urls: [ + %r{^http://ad\.doubleclick\.net/}, + %r{^http://b\.scorecardresearch\.com/}, + %r{^http://pixel\.quantserve\.com/}, + %r{^http://s7\.addthis\.com/} + ], + image_attributes: %w(source_url size type), + limit: 10, + top: 5, + user_agent: 'linkthumbnailer', + verify_ssl: true, + http_timeout: 5 + ) + end + + def configure + yield config + end + + def generate(url, options = {}) + set_options(options) + instantiate_classes + + doc = doc_parser.parse(fetcher.fetch(url), url) + + self.object[:url] = fetcher.url.to_s + opengraph(doc) || custom(doc) + end + + private + + def set_options(options) + config + options.each {|k, v| config[k] = v } + end + + def instantiate_classes + self.object = LinkThumbnailer::Object.new + self.fetcher = LinkThumbnailer::Fetcher.new + self.doc_parser = LinkThumbnailer::DocParser.new + self.img_url_filters = [LinkThumbnailer::ImgUrlFilter.new] + self.img_parser = LinkThumbnailer::ImgParser.new(fetcher, img_url_filters) + end + + def opengraph(doc) + return unless opengraph?(doc) + self.object = LinkThumbnailer::Opengraph.parse(object, doc) + return object if object.valid? + nil + end + + def custom(doc) + self.object[:title] = doc.title + self.object[:description] = doc.description + self.object[:images] = img_parser.parse(doc.img_abs_urls.dup) + self.object[:url] = doc.canonical_url || object[:url] + return object if object.valid? + nil + end + + def opengraph?(doc) + !doc.xpath('//meta[starts-with(@property, "og:") and @content]').empty? + end + + end + +end + +begin + require 'rails' +rescue LoadError +end + +$stderr.puts <<-EOC if !defined?(Rails) +warning: no framework detected. + +Your Gemfile might not be configured properly. +---- e.g. ---- +Rails: + gem 'link_thumbnailer' + +EOC + +if defined?(Rails) + require 'link_thumbnailer/engine' + require 'link_thumbnailer/railtie' +end