Skip to content

Instantly share code, notes, and snippets.

@hsbt
Forked from arirusso/img_convert.rb
Created May 7, 2014 09:36
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hsbt/01ed622e51f183d4f1d2 to your computer and use it in GitHub Desktop.
Save hsbt/01ed622e51f183d4f1d2 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require "nokogiri"
require 'pry'
require 'htmlentities'
# opens every file in the given dir tree and converts any html img tags to rails image_tag calls
#
# example usage:
# ruby convert.rb ~/my_rails_app/app/views
#
# ***be careful and backup before using this***
#
raise "no directory tree given" if ARGV.first.nil?
path = "#{ARGV.first}/**/*"
@count = {
:files_open => 0,
:files_revised => 0,
:tags => 0
}
class RailsImageTag
Params = [
{ :name => :alt },
{ :name => :id },
{ :name => :class },
{ :name => :style },
{ :name => :height, :type => :int },
{ :name => :width, :type => :int }
]
def initialize(img)
@img = img
end
# construct and return the erb containing the new image_tag call
def to_erb
url = @img['src']
"<%= image_tag('#{url}'#{options_to_erb}) %>"
end
# convert the img tag params to image_tag options
# the params to process are defined in the Params constant hash
def options_to_erb
options_erb = {}
Params.each do |opt|
name = opt[:name]
value = @img[name]
value = opt[:type] != :int ? "'#{value}'" : value
if value && !(value == "''")
options_erb[name] = ":#{name} => #{value}"
end
end
options_erb.empty? ? "" : ", " + options_erb.values.join(", ")
end
end
class HtmlDoc
def initialize(filename)
@name = filename
file = File.open(@name)
@doc = Nokogiri::HTML(file, nil, 'UTF-8')
@content = File.open(@name) { |f| f.read }
end
# overwrite the file with new contents
def write_file(log)
log[:files_revised] += 1
File.open(@name, "w") {|f| f.write(@content) }
end
# convert a single file and record stats to <em>log</em>
def convert_img_tags!(log)
log[:files_open] += 1
file_marked = false
@doc.xpath("//img").each do |img|
file_marked = true
log[:tags] += 1
original = HTMLEntities.new.decode(img.to_html.gsub("\">", "\" />").gsub("\" >", "\" />").delete("\\"))
@content.gsub!(original, RailsImageTag.new(img).to_erb)
end
write_file(log) if file_marked
end
end
Dir.glob(path).each { |filename| HtmlDoc.new(filename).convert_img_tags!(@count) if File.file?(filename) }
p "***********************************"
p "#{@count[:files_open]} files opened"
p "#{@count[:files_revised]} files revised"
p "#{@count[:tags]} tags replaced"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment