dear god what am i doing

This commit is contained in:
Joseph Wynn 2016-09-27 22:04:09 +01:00
parent 665b60cad9
commit 08557ce751
17 changed files with 138 additions and 59 deletions

View File

@ -2,7 +2,7 @@ sudo: false
language: ruby language: ruby
bundler_args: --without debug bundler_args: --without debug
before_script: bundle exec jekyll --version before_script: bundle exec jekyll --version
script: bundle exec rake features_with_coveralls script: bundle exec rake rubocop features_with_coveralls
rvm: rvm:
- 2.2 - 2.2
- 2.1 - 2.1

View File

@ -3,10 +3,10 @@ gemspec
group :development do group :development do
gem 'rake' gem 'rake'
gem 'cucumber', '~> 2.1' gem 'cucumber', '~> 2.4'
gem 'test-unit', '~> 3.1' gem 'test-unit', '~> 3.1', require: false
gem 'rubocop', '~> 0.43', require: false
gem 'coveralls', :require => false gem 'coveralls', require: false
platform :ruby_18, :ruby_19 do platform :ruby_18, :ruby_19 do
gem 'simplecov', '>= 0.10', '< 0.12' gem 'simplecov', '>= 0.10', '< 0.12'

View File

@ -1,4 +1,5 @@
require 'bundler' require 'bundler'
require 'rubocop/rake_task'
begin begin
Bundler.setup(:default, :development) Bundler.setup(:default, :development)
@ -13,12 +14,14 @@ require 'jekyll/responsive_image/version'
require 'cucumber/rake/task' require 'cucumber/rake/task'
require 'coveralls/rake/task' require 'coveralls/rake/task'
RuboCop::RakeTask.new
Cucumber::Rake::Task.new(:features) Cucumber::Rake::Task.new(:features)
Coveralls::RakeTask.new Coveralls::RakeTask.new
task :features_with_coveralls => [:features, 'coveralls:push'] task :features_with_coveralls => [:features, 'coveralls:push']
task :default => [:features] task :default => [:rubocop, :features]
task :release do |t| task :release do |t|
system "gem build jekyll-responsive_image.gemspec" system "gem build jekyll-responsive_image.gemspec"

View File

@ -1,5 +1,3 @@
include Test::Unit::Assertions
When /^I run Jekyll$/ do When /^I run Jekyll$/ do
run_jekyll run_jekyll
end end

View File

@ -3,7 +3,7 @@ if ENV['CI']
Coveralls.wear! Coveralls.wear!
end end
require 'test/unit' require 'test/unit/assertions'
require 'jekyll/responsive_image' require 'jekyll/responsive_image'
TEST_DIR = File.join('/', 'tmp', 'jekyll') TEST_DIR = File.join('/', 'tmp', 'jekyll')
@ -14,3 +14,5 @@ def run_jekyll(options = {})
site = Jekyll::Site.new(options) site = Jekyll::Site.new(options)
site.process site.process
end end
World(Test::Unit::Assertions)

View File

@ -1 +1 @@
<img src="{{ site.baseurl }}/{{ path }}"> <img src="{{ site.baseurl }}/{{ original.path }}">

View File

@ -1 +1 @@
<img alt="{{ alt }}" src="/{{ path }}" title="{{ title }}" srcset="{% for i in resized %}/{{ i.path }} {{ i.width }}w,{% endfor %}/{{ original.path }} {{ original.width }}w"> <img alt="{{ alt }}" src="/{{ original.path }}" title="{{ title }}" srcset="{% for i in resized %}/{{ i.path }} {{ i.width }}w,{% endfor %}/{{ original.path }} {{ original.width }}w">

View File

@ -5,11 +5,11 @@ require 'jekyll'
require 'rmagick' require 'rmagick'
require 'jekyll/responsive_image/version' require 'jekyll/responsive_image/version'
require 'jekyll/responsive_image/defaults' require 'jekyll/responsive_image/config'
require 'jekyll/responsive_image/utils'
require 'jekyll/responsive_image/render_cache' require 'jekyll/responsive_image/render_cache'
require 'jekyll/responsive_image/image'
require 'jekyll/responsive_image/image_processor' require 'jekyll/responsive_image/image_processor'
require 'jekyll/responsive_image/resize_handler' require 'jekyll/responsive_image/image_resizer'
require 'jekyll/responsive_image/renderer' require 'jekyll/responsive_image/renderer'
require 'jekyll/responsive_image/tag' require 'jekyll/responsive_image/tag'
require 'jekyll/responsive_image/block' require 'jekyll/responsive_image/block'

View File

@ -1,11 +1,9 @@
module Jekyll module Jekyll
module ResponsiveImage module ResponsiveImage
class Block < Liquid::Block class Block < Liquid::Block
include Jekyll::ResponsiveImage::Utils
def render(context) def render(context)
attributes = YAML.load(super) attributes = YAML.load(super)
Renderer.new(context.registers[:site], attributes).render_responsive_image Renderer.new(context.registers[:site], attributes).render
end end
end end
end end

View File

@ -0,0 +1,22 @@
module Jekyll
module ResponsiveImage
class Config
DEFAULTS = {
'default_quality' => 85,
'base_path' => 'assets',
'output_path_format' => 'assets/resized/%{filename}-%{width}x%{height}.%{extension}',
'sizes' => [],
'extra_images' => []
}
def initialize(site)
@site = site
end
def to_h
DEFAULTS.merge(@site.config['responsive_image'])
.merge(site_source: @site.source, site_dest: @site.dest)
end
end
end
end

View File

@ -1,11 +1,9 @@
module Jekyll module Jekyll
module ResponsiveImage module ResponsiveImage
class ExtraImageGenerator < Jekyll::Generator class ExtraImageGenerator < Jekyll::Generator
include Jekyll::ResponsiveImage::Utils
def generate(site) def generate(site)
renderer = Renderer.new(site, {}) renderer = Renderer.new(site, {})
config = renderer.make_config config = Config.new(site).to_h
config['extra_images'].each do |pathspec| config['extra_images'].each do |pathspec|
Dir.glob(site.in_source_dir(pathspec)) do |image_path| Dir.glob(site.in_source_dir(pathspec)) do |image_path|

View File

@ -0,0 +1,27 @@
module Jekyll
module ResponsiveImage
class Image
def initialize(width, height, config)
@width = width
@height = height
@config = config
end
def to_h
{
'path' => '',
'width' => @width,
'height' => @height,
'basename' => '',
'dirname' => '',
'filename' => '',
'extension' => ''
}
end
def to_liquid
to_h
end
end
end
end

View File

@ -1,22 +1,19 @@
module Jekyll module Jekyll
module ResponsiveImage module ResponsiveImage
class ImageProcessor class ImageProcessor
include ResponsiveImage::Utils def self.process(path, config)
self.new.process(path, config)
def process(absolute_image_path, relative_image_path, config)
raise SyntaxError.new("Invalid image path specified: #{absolute_image_path}") unless File.file?(absolute_image_path)
resize_handler = ResizeHandler.new
img = Magick::Image::read(absolute_image_path).first
{
original: image_hash(config['base_path'], relative_image_path, img.columns, img.rows),
resized: resize_handler.resize_image(img, config),
}
end end
def self.process(absolute_image_path, relative_image_path, config) def process(path, config)
self.new.process(absolute_image_path, relative_image_path, config) raise SyntaxError.new("Invalid image path specified: #{path}") unless File.file?(path)
image = Magick::Image::read(path).first
{
original: Image.new,
resized: ImageResizer.resize(image, config),
}
end end
end end
end end

View File

@ -0,0 +1,47 @@
module Jekyll
module ResponsiveImage
class ImageResizer
def self.resize(image, config)
self.new.resize(image, config)
end
def resize(image, config)
resized = []
config['sizes'].each do |size|
width = size['width']
ratio = width.to_f / image.columns.to_f
height = (image.rows.to_f * ratio).round
next unless needs_resizing?(image, width)
image_path = image.filename.force_encoding(Encoding::UTF_8)
output_path = image_path
resized.push(Image.new(width, height, config))
# Don't resize images more than once
next if File.exist?(output_path)
resized = image.scale(ratio)
resized.write(output_path) do |i|
i.quality = size['quality'] || config['default_quality']
end
end
resized
end
def needs_resizing?(image, width)
image.columns > width
end
def ensure_output_dir_exists!(dir)
unless Dir.exist?(dir)
Jekyll.logger.info "Creating output directory #{dir}"
FileUtils.mkdir_p(dir)
end
end
end
end
end

View File

@ -1,38 +1,27 @@
module Jekyll module Jekyll
module ResponsiveImage module ResponsiveImage
class Renderer class Renderer
include Jekyll::ResponsiveImage::Utils attr_reader :site, :attributes
def initialize(site, attributes) def initialize(site, attributes)
@site = site @site = site
@attributes = attributes @attributes = attributes
end end
def make_config def render
ResponsiveImage.defaults.dup cache_key = attributes.to_s
.merge(@site.config['responsive_image']) result = attributes['cache'] ? RenderCache.get(cache_key) : nil
.merge(:site_source => @site.source, :site_dest => @site.dest)
end
def render_responsive_image
cache_key = @attributes.to_s
result = @attributes['cache'] ? RenderCache.get(cache_key) : nil
if result.nil? if result.nil?
config = make_config config = Config.new(site).to_h
absolute_image_path = @site.in_source_dir(@attributes['path'].to_s) image = ImageProcessor.process(attributes['path'], config)
image = ImageProcessor.process(absolute_image_path, @attributes['path'], config) template_vars = attributes.merge(site.site_payload)
@attributes['original'] = image[:original] .merge('original' => image[:original], 'resized' => image[:resized])
@attributes['resized'] = image[:resized]
@attributes['resized'].each { |resized| keep_resized_image!(@site, resized) } image_template = site.in_source_dir(attributes['template'] || config['template'])
template = Liquid::Template.parse(File.read(image_template))
image_template = @site.in_source_dir(@attributes['template'] || config['template']) result = template.render(template_vars)
partial = File.read(image_template)
template = Liquid::Template.parse(partial)
result = template.render!(@attributes.merge(@site.site_payload))
RenderCache.set(cache_key, result) RenderCache.set(cache_key, result)
end end

View File

@ -1,8 +1,6 @@
module Jekyll module Jekyll
module ResponsiveImage module ResponsiveImage
class ResizeHandler class ResizeHandler
include ResponsiveImage::Utils
def resize_image(img, config) def resize_image(img, config)
resized = [] resized = []

View File

@ -13,7 +13,7 @@ module Jekyll
end end
def render(context) def render(context)
Renderer.new(context.registers[:site], @attributes).render_responsive_image Renderer.new(context.registers[:site], @attributes).render
end end
end end
end end