class Jekyll::SrcsetTag::Image
Attributes
html_attributes[R]
image_path[R]
output_path[R]
ppi[R]
source_path[R]
sources[R]
web_output_path[R]
Public Class Methods
new(source_path:, output_path:, web_output_path:, image_path:, ppi:, sources:, html_attributes:)
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 12 def initialize(source_path:, output_path:, web_output_path:, image_path:, ppi:, sources:, html_attributes:) @source_path = source_path @output_path = output_path @web_output_path = web_output_path @image_path = image_path @ppi = ppi.respond_to?(:sort_by) ? ppi : ppi.split(',').map(&:to_i) @sources = sources @html_attributes = html_attributes end
Public Instance Methods
digest()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 45 def digest unless @digest file = Digest::SHA1.file(File.join(source_path, image_path)).to_s sizes = Digest::SHA1.hexdigest instances.map { |i| i.width.to_s + '-' + i.height.to_s }.join(' ') @digest = Digest::SHA1.hexdigest file + sizes end @digest end
generate_images!()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 22 def generate_images! needed_instances = uniq_instances.select { |instance| !File.exist?(File.join(output_dir, instance.filename)) } resize_images! needed_instances end
instances()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 27 def instances @instances ||= create_instances end
output_dir()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 54 def output_dir File.join(output_path, image_path + '-' + digest.slice(0, 7)) end
output_image_paths()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 66 def output_image_paths uniq_instances.map { |instance| File.join(output_dir, instance.filename)} end
source_image_path()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 62 def source_image_path File.join(source_path, image_path) end
to_html()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 35 def to_html srcs = image_srcs src = CGI.escape_html(fallback_src) show_srcset = srcs.length > 1 srcset = CGI.escape_html(srcs.map {|path, size| "#{path} #{size}w" }.join(', ')) sizes = CGI::escape_html(source_sizes.join(', ')) srcset_attrs = show_srcset ? " srcset=\"#{srcset}\" sizes=\"#{sizes}\"" : '' "<img src=\"#{src}\"#{srcset_attrs} #{html_attributes}/>\n" end
uniq_instances()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 31 def uniq_instances instances.uniq { |instance| [ instance.output_width, instance.output_height ] } end
web_output_dir()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 58 def web_output_dir File.join(web_output_path, image_path + '-' + digest.slice(0, 7)) end
Protected Instance Methods
create_instances()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 72 def create_instances reverse_ppi = ppi.sort_by { |s| -s } all_sources = sources.map do |source| reverse_ppi.map { |ppi| [source, ppi] } end.flatten(1) original = MiniMagick::Image.open File.join(source_path, image_path) all_sources.map do |(source, ppi)| Instance.new width: (source.width ? (source.width.to_f * ppi).round : nil), height: (source.height ? (source.height.to_f * ppi).round : nil), extension: File.extname(image_path), image: original, fallback: source.fallback end end
fallback_src()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 97 def fallback_src fallbacks = uniq_instances.select { |instance| instance.fallback } fallbacks.empty? ? image_srcs.last[0] : instance_path(fallbacks.last) end
image_srcs()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 87 def image_srcs uniq_instances.map do |instance| [instance_path(instance), instance.output_width.to_s] end end
instance_path(instance)
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 93 def instance_path(instance) File.join(web_output_dir, instance.filename) end
resize_images!(instances)
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 106 def resize_images!(instances) if instances.any? { |i| i.undersized } warn "Warning:".yellow + " #{image_path} is smaller than the requested output file. " + "It will be resized without upscaling." end instances.each do |instance| Resizer::resize(instance.image, output_dir, instance.filename, instance.output_width, instance.output_height) puts "Generated #{File.join(output_dir, instance.filename)}" end end
source_sizes()
click to toggle source
# File lib/jekyll/srcset_tag/image.rb, line 102 def source_sizes sources.map { |source| source.size_string } end