lib/attributer.rb
require "attributer/version"
class String
def image_attributes(args={})
Attributer::Attributer.new(self, args).parsed_string
end
end
module Attributer
class Attributer
require "fastimage"
require "nokogiri"
attributes = %w{lpost images old_htmls new_htmls uri new_post}
attributes.each {|attribute| attr_accessor attribute.to_sym }
def initialize(string, args = nil)
args[:domain] ? @uri = args[:domain] : @uri = args[:path]
raise ArgumentError, "No domain or local path specified! Attributer can't find image!\nPlease use either :domain or :path options in your\n'image_attributes' method!" if @uri.nil?
@lpost = Nokogiri::HTML::DocumentFragment.parse( string.force_encoding "UTF-8" )
@new_post = string.force_encoding "UTF-8"
parse_image_tags
add_attributes
replace_images
end
def parsed_string
@new_post
end
private
def parse_image_tags
@old_htmls = []; @new_htmls = []
@images = @lpost.css("img")
@images.each {|i| @old_htmls << i.to_html}
process_trailing_slashes
end
def add_attributes
for image in @old_htmls
imagetag = Nokogiri::HTML::DocumentFragment.parse( image )
img = imagetag.at_css "img"
size = FastImage.size(@uri + img['src'], :timeout => 5)
img['width'] = size.first.to_s
img['height'] = size.last.to_s
@new_htmls << imagetag.to_html
end
end
def replace_images
@old_htmls.each do |old|
@new_post.sub!(old, @new_htmls.shift)
end
end
def process_trailing_slashes
@old_htmls.each do |image|
image.sub!(">", " />") unless @new_post.include? image
image.sub!(" />", "/>") unless @new_post.include? image
end
end
end
end