diff --git a/features/image-generation.feature b/features/image-generation.feature index 8e640b2..c9d511f 100644 --- a/features/image-generation.feature +++ b/features/image-generation.feature @@ -44,6 +44,7 @@ Feature: Responsive image generation """ source: my-site-copy/src responsive_image: + base_path: assets template: _includes/responsive-image.html output_path_format: assets/resized/%{dirname}/%{width}/%{basename} sizes: @@ -51,5 +52,5 @@ Feature: Responsive image generation """ And I have a file "my-site-copy/src/index.html" with "{% responsive_image path: assets/subdir/test.png %}" When I run Jekyll - Then the image "my-site-copy/src/assets/resized/subdir/test-100x50.png" should have the dimensions "100x50" - And the file "_site/assets/resized/subdir/test-100x50.png" should exist + Then the image "my-site-copy/src/assets/resized/subdir/100/test.png" should have the dimensions "100x50" + And the file "_site/assets/resized/subdir/100/test.png" should exist diff --git a/features/image-hashes.feature b/features/image-hashes.feature new file mode 100644 index 0000000..fa0a615 --- /dev/null +++ b/features/image-hashes.feature @@ -0,0 +1,75 @@ +Feature: Image hashes inside responsive image templates + As a Jekyll user + I want to have access to image hashes + In order to create custom responsive image templates + + Scenario: Using the {% responsive_image %} tag + Given I have a configuration with: + """ + responsive_image: + template: _includes/hash.html + output_path_format: assets/resized/%{dirname}/%{width}/%{basename} + sizes: + - width: 100 + - width: 120 + """ + And I have a file "index.html" with "{% responsive_image path: assets/subdir/test.png %}" + When I run Jekyll + Then the file "_site/index.html" should contain: + """ + path: assets/subdir/test.png + width: 300 + height: 150 + basename: test.png + dirname: subdir + filename: test + extension: png + + path: assets/resized/subdir/100/test.png + width: 100 + height: 50 + basename: test.png + dirname: resized/subdir/100 + filename: test + extension: png + + path: assets/resized/subdir/120/test.png + width: 120 + height: 60 + basename: test.png + dirname: resized/subdir/120 + filename: test + extension: png + """ + + Scenario: Honouring Jekyll 'source' configuration + Given I have copied my site to "my-site-copy/src" + And I have a configuration with: + """ + source: my-site-copy/src + responsive_image: + template: _includes/hash.html + output_path_format: assets/resized/%{dirname}/%{width}/%{basename} + sizes: + - width: 100 + """ + And I have a file "my-site-copy/src/index.html" with "{% responsive_image path: assets/subdir/test.png %}" + When I run Jekyll + Then the file "_site/index.html" should contain: + """ + path: assets/subdir/test.png + width: 300 + height: 150 + basename: test.png + dirname: subdir + filename: test + extension: png + + path: assets/resized/subdir/100/test.png + width: 100 + height: 50 + basename: test.png + dirname: resized/subdir/100 + filename: test + extension: png + """ diff --git a/features/step_definitions/jekyll_steps.rb b/features/step_definitions/jekyll_steps.rb index 6612ba9..ca86251 100644 --- a/features/step_definitions/jekyll_steps.rb +++ b/features/step_definitions/jekyll_steps.rb @@ -41,6 +41,10 @@ Then /^I should see "(.+)" in "(.*)"$/ do |text, file| assert contents.inspect.include?(text), "Expected to find #{text.inspect} in #{contents.inspect}" end +Then /^the file "(.+)" should contain:$/ do |file, contents| + assert_equal contents.strip, File.open(file).readlines.join.strip +end + Then /^the file "(.+)" should exist$/ do |path| assert File.exist?(path) end diff --git a/features/test-site/_includes/hash.html b/features/test-site/_includes/hash.html new file mode 100644 index 0000000..2fa786e --- /dev/null +++ b/features/test-site/_includes/hash.html @@ -0,0 +1,16 @@ +path: {{ original.path }} +width: {{ original.width }} +height: {{ original.height }} +basename: {{ original.basename }} +dirname: {{ original.dirname }} +filename: {{ original.filename }} +extension: {{ original.extension }} +{% for i in resized %} +path: {{ i.path }} +width: {{ i.width }} +height: {{ i.height }} +basename: {{ i.basename }} +dirname: {{ i.dirname }} +filename: {{ i.filename }} +extension: {{ i.extension }} +{% endfor %} diff --git a/lib/jekyll/responsive_image/config.rb b/lib/jekyll/responsive_image/config.rb index d11a24c..72592a2 100644 --- a/lib/jekyll/responsive_image/config.rb +++ b/lib/jekyll/responsive_image/config.rb @@ -14,12 +14,8 @@ module Jekyll end def to_h - config = DEFAULTS.merge(@site.config['responsive_image']) - .merge(site_source: @site.source, site_dest: @site.dest) - - config['base_path'] = @site.in_source_dir(config['base_path']) - - config + DEFAULTS.merge(@site.config['responsive_image']) + .merge(site_source: @site.source, site_dest: @site.dest) end end end diff --git a/lib/jekyll/responsive_image/extra_image_generator.rb b/lib/jekyll/responsive_image/extra_image_generator.rb index 80ab4e7..5ea6c43 100644 --- a/lib/jekyll/responsive_image/extra_image_generator.rb +++ b/lib/jekyll/responsive_image/extra_image_generator.rb @@ -5,12 +5,14 @@ module Jekyll def generate(site) config = Config.new(site).to_h + site_source = Pathname.new(site.source) config['extra_images'].each do |pathspec| Dir.glob(site.in_source_dir(pathspec)) do |image_path| - relative_image_path = image_path.sub(/^#{Regexp.escape(image_path)}/, '') + path = Pathname.new(image_path) + relative_image_path = path.relative_path_from(site_source) - result = ImageProcessor.process(image_path, relative_image_path, config) + result = ImageProcessor.process(relative_image_path, config) result[:resized].each { |image| keep_resized_image!(site, image) } end end diff --git a/lib/jekyll/responsive_image/image_processor.rb b/lib/jekyll/responsive_image/image_processor.rb index dcaaada..ca102be 100644 --- a/lib/jekyll/responsive_image/image_processor.rb +++ b/lib/jekyll/responsive_image/image_processor.rb @@ -3,20 +3,22 @@ module Jekyll class ImageProcessor include ResponsiveImage::Utils - 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) + def process(image_path, config) + absolute_image_path = File.expand_path(image_path.to_s, config[:site_source]) + + raise SyntaxError.new("Invalid image path specified: #{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), + original: image_hash(config, image_path, img.columns, img.rows), resized: resize_handler.resize_image(img, config), } end - def self.process(absolute_image_path, relative_image_path, config) - self.new.process(absolute_image_path, relative_image_path, config) + def self.process(image_path, config) + self.new.process(image_path, config) end end end diff --git a/lib/jekyll/responsive_image/renderer.rb b/lib/jekyll/responsive_image/renderer.rb index 2c30679..06a3263 100644 --- a/lib/jekyll/responsive_image/renderer.rb +++ b/lib/jekyll/responsive_image/renderer.rb @@ -15,8 +15,7 @@ module Jekyll if result.nil? config = Config.new(@site).to_h - absolute_image_path = @site.in_source_dir(@attributes['path'].to_s) - image = ImageProcessor.process(absolute_image_path, @attributes['path'], config) + image = ImageProcessor.process(@attributes['path'], config) @attributes['original'] = image[:original] @attributes['resized'] = image[:resized] diff --git a/lib/jekyll/responsive_image/resize_handler.rb b/lib/jekyll/responsive_image/resize_handler.rb index cc16f83..1fc411f 100644 --- a/lib/jekyll/responsive_image/resize_handler.rb +++ b/lib/jekyll/responsive_image/resize_handler.rb @@ -14,8 +14,8 @@ module Jekyll 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)) + filepath = format_output_path(config['output_path_format'], config, image_path, width, height) + resized.push(image_hash(config, filepath, width, height)) site_source_filepath = File.expand_path(filepath, config[:site_source]) site_dest_filepath = File.expand_path(filepath, config[:site_dest]) @@ -45,8 +45,8 @@ module Jekyll resized end - def format_output_path(format, base_path, image_path, width, height) - params = symbolize_keys(image_hash(base_path, image_path, width, height)) + def format_output_path(format, config, image_path, width, height) + params = symbolize_keys(image_hash(config, image_path, width, height)) Pathname.new(format % params).cleanpath.to_s end diff --git a/lib/jekyll/responsive_image/utils.rb b/lib/jekyll/responsive_image/utils.rb index 4688e92..d940806 100644 --- a/lib/jekyll/responsive_image/utils.rb +++ b/lib/jekyll/responsive_image/utils.rb @@ -17,10 +17,10 @@ module Jekyll end # Build a hash containing image information - def image_hash(base_path, image_path, width, height) + def image_hash(config, image_path, width, height) { 'path' => image_path, - 'dirname' => relative_dirname(base_path, image_path), + 'dirname' => relative_dirname(config, image_path), 'basename' => File.basename(image_path), 'filename' => File.basename(image_path, '.*'), 'extension' => File.extname(image_path).delete('.'), @@ -29,9 +29,9 @@ module Jekyll } end - def relative_dirname(base_path, image_path) - path = Pathname.new(image_path).expand_path - base = Pathname.new(base_path).expand_path + def relative_dirname(config, image_path) + path = Pathname.new(File.expand_path(image_path, config[:site_source])) + base = Pathname.new(File.expand_path(config['base_path'], config[:site_source])) path.relative_path_from(base).dirname.to_s.delete('.') end