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