dear god what am i doing
This commit is contained in:
parent
665b60cad9
commit
08557ce751
|
@ -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
|
||||||
|
|
8
Gemfile
8
Gemfile
|
@ -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'
|
||||||
|
|
5
Rakefile
5
Rakefile
|
@ -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"
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
include Test::Unit::Assertions
|
|
||||||
|
|
||||||
When /^I run Jekyll$/ do
|
When /^I run Jekyll$/ do
|
||||||
run_jekyll
|
run_jekyll
|
||||||
end
|
end
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<img src="{{ site.baseurl }}/{{ path }}">
|
<img src="{{ site.baseurl }}/{{ original.path }}">
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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|
|
||||||
|
|
|
@ -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
|
|
@ -1,23 +1,20 @@
|
||||||
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)
|
||||||
|
end
|
||||||
|
|
||||||
def process(absolute_image_path, relative_image_path, config)
|
def process(path, config)
|
||||||
raise SyntaxError.new("Invalid image path specified: #{absolute_image_path}") unless File.file?(absolute_image_path)
|
raise SyntaxError.new("Invalid image path specified: #{path}") unless File.file?(path)
|
||||||
|
|
||||||
resize_handler = ResizeHandler.new
|
image = Magick::Image::read(path).first
|
||||||
img = Magick::Image::read(absolute_image_path).first
|
|
||||||
|
|
||||||
{
|
{
|
||||||
original: image_hash(config['base_path'], relative_image_path, img.columns, img.rows),
|
original: Image.new,
|
||||||
resized: resize_handler.resize_image(img, config),
|
resized: ImageResizer.resize(image, config),
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.process(absolute_image_path, relative_image_path, config)
|
|
||||||
self.new.process(absolute_image_path, relative_image_path, config)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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 = []
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue