class Ficon::Site
Attributes
site[R]
Public Class Methods
new(uri)
click to toggle source
# File lib/ficon.rb, line 16 def initialize(uri) @uri = Addressable::URI.heuristic_parse(uri) @site = OpenStruct.new process end
normalise(base, candidate)
click to toggle source
# File lib/ficon.rb, line 113 def self.normalise(base, candidate) parsed_candidate = URI(candidate); base = URI(base) unless base.is_a? URI parsed_candidate.host = base.host if parsed_candidate.host.nil? # Set relative URLs to absolute parsed_candidate.scheme = base.scheme if parsed_candidate.scheme.nil? # Set the schema if missing parsed_candidate.to_s end
page_images(uri, doc, site=nil)
click to toggle source
# File lib/ficon.rb, line 107 def self.page_images(uri, doc, site=nil) doc.xpath("//meta[@property='og:image']"). collect {|e| e.values.select {|v| v =~ /\.png$|\.jpg$|\.gif$|\.ico$|\.svg$|\.ico\?\d*$/ }}.flatten. collect {|v| v[/^http/] || v[/^\//] ? v : '/' + v }.collect {|result| normalise(uri, result)}.uniq.collect {|i| Image.new(i)}.sort {|a, b| a.area <=> b.area }.reverse end
site_images(uri, doc, site=nil)
click to toggle source
# File lib/ficon.rb, line 98 def self.site_images(uri, doc, site=nil) results = [] paths = "//meta[@name='msapplication-TileImage']|//link[@type='image/ico' or @type='image/vnd.microsoft.icon']|//link[@rel='icon' or @rel='shortcut icon' or @rel='apple-touch-icon-precomposed' or @rel='apple-touch-icon']" results += doc.xpath(paths).collect {|e| e.values.select {|v| v =~ /\.png$|\.jpg$|\.gif$|\.ico$|\.svg$|\.ico\?\d*$/ }}.flatten.collect {|v| v[/^http/] || v[/^\//] ? v : '/' + v } results = results.collect {|result| normalise(uri, result)}.uniq.collect {|i| Image.new(i) }.sort {|a,b| a.area <=> b.area }.reverse end
Public Instance Methods
description()
click to toggle source
# File lib/ficon.rb, line 83 def description @site.description end
doc()
click to toggle source
# File lib/ficon.rb, line 22 def doc cache = Cache.new(@uri) @data ||= cache.data if @data.nil? @data = open(@uri) cache.data = @data.read.force_encoding('UTF-8') cache.etag = @data.meta['etag'] if @data.respond_to?(:meta) cache.not_before = @data.meta['last-modified'] if @data.respond_to?(:meta) @data.rewind end @doc ||= Nokogiri::HTML(@data) return @doc rescue OpenURI::HTTPError, SocketError => e puts "OpenURI: #{e.inspect}" return nil rescue TypeError => e if uri.to_s =~ /^http/ puts "#{e.inspect}" puts "#{e.backtrace.join('\n')}" else puts "Please prepend http:// or https:// to the URL" end return nil rescue RuntimeError => e puts "#{e.message}" return nil end
other_page_data()
click to toggle source
# File lib/ficon.rb, line 87 def other_page_data @site.title = doc.at_xpath("//meta[@property='og:title']/@content")&.value || @doc.at_xpath("//title")&.text&.strip @site.description = doc.at_xpath("//meta[@property='og:description']/@content")&.value canonical = doc.at_xpath("//link[@rel='canonical']/@href")&.value @site.canonical = canonical unless canonical == @url end
page_images()
click to toggle source
# File lib/ficon.rb, line 75 def page_images @site.page_images end
process()
click to toggle source
# File lib/ficon.rb, line 54 def process @site.images = Site.site_images(@uri, doc)||[] @site.page_images = Site.page_images(@uri, doc)||[] other_page_data return end
report()
click to toggle source
# File lib/ficon.rb, line 61 def report r = "Site icon: #{@site.images.first.to_s}\n" r += "Page icon: #{@site.page_images.first.to_s}\n" r += "Page title: #{@site.title}\n" r += "Page description: #{@site.description}\n" r += "Canonical URL: #{@site.canonical}\n" return r end
site_icons()
click to toggle source
# File lib/ficon.rb, line 71 def site_icons @site.images end
title()
click to toggle source
# File lib/ficon.rb, line 79 def title @site.title end
to_s()
click to toggle source
# File lib/ficon.rb, line 94 def to_s @url end