jekyll-responsive-image/lib/jekyll/responsive_image/resize_handler.rb

69 lines
2.1 KiB
Ruby
Raw Normal View History

2014-12-08 00:06:28 +11:00
module Jekyll
module ResponsiveImage
2014-12-08 00:06:28 +11:00
class ResizeHandler
include ResponsiveImage::Utils
2014-12-08 00:06:28 +11:00
def resize_image(img, config)
resized = []
config['sizes'].each do |size|
width = size['width']
ratio = width.to_f / img.columns.to_f
height = (img.rows.to_f * ratio).round
next unless needs_resizing?(img, width)
image_path = img.filename.force_encoding(Encoding::UTF_8)
filepath = format_output_path(config['output_path_format'], config['base_path'], image_path, width, height)
resized.push(image_hash(config['base_path'], filepath, width, height))
2014-12-08 00:06:28 +11:00
site_source_filepath = File.expand_path(filepath, config[:site_source])
site_dest_filepath = File.expand_path(filepath, config[:site_dest])
2014-12-08 00:06:28 +11:00
# Don't resize images more than once
next if File.exist?(site_source_filepath)
2014-12-08 00:06:28 +11:00
2016-09-28 08:50:01 +10:00
ensure_output_dir_exists!(site_source_filepath)
ensure_output_dir_exists!(site_dest_filepath)
2014-12-08 00:06:28 +11:00
2016-09-28 08:50:01 +10:00
Jekyll.logger.info "Generating #{site_source_filepath}"
2014-12-08 00:06:28 +11:00
i = img.scale(ratio)
i.write(site_source_filepath) do |f|
2014-12-08 00:06:28 +11:00
f.quality = size['quality'] || config['default_quality']
end
# Ensure the generated file is copied to the _site directory
2016-09-28 08:50:01 +10:00
Jekyll.logger.info "Copying resized image to #{site_dest_filepath}"
FileUtils.copy_file(site_source_filepath, site_dest_filepath)
2014-12-08 00:06:28 +11:00
i.destroy!
end
img.destroy!
2014-12-08 00:06:28 +11:00
resized
end
2016-09-28 08:50:01 +10:00
def format_output_path(format, base_path, image_path, width, height)
params = symbolize_keys(image_hash(base_path, image_path, width, height))
Pathname.new(format % params).cleanpath.to_s
end
2014-12-08 00:06:28 +11:00
def needs_resizing?(img, width)
img.columns > width
end
2016-09-28 08:50:01 +10:00
def ensure_output_dir_exists!(path)
dir = File.dirname(path)
unless Dir.exist?(dir)
2014-12-08 00:06:28 +11:00
Jekyll.logger.info "Creating output directory #{dir}"
FileUtils.mkdir_p(dir)
end
end
end
end
end