From 64f86bd6da54da00cf2f569c292d43ab71168926 Mon Sep 17 00:00:00 2001 From: Joseph Wynn Date: Sat, 26 Dec 2015 18:11:05 +0000 Subject: [PATCH 1/2] Add `dirname` to image hashes. Closes #5. --- README.md | 2 ++ features/fixtures/assets/subdir/test.png | Bin 0 -> 18540 bytes features/image-generation.feature | 35 ++++++++++++++++++++++ features/step_definitions/jekyll_steps.rb | 6 ++++ lib/jekyll/responsive_image/utils.rb | 1 + 5 files changed, 44 insertions(+) create mode 100644 features/fixtures/assets/subdir/test.png create mode 100644 features/image-generation.feature diff --git a/README.md b/README.md index 472b952..e502755 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ responsive_image: # relative path. # # Parameters available are: + # %{dirname} Directory path of the file (assets/foo/some-file.jpg => assets/foo) # %{basename} Basename of the file (assets/some-file.jpg => some-file.jpg) # %{filename} Basename without the extension (assets/some-file.jpg => some-file) # %{extension} Extension of the file (assets/some-file.jpg => jpg) @@ -168,5 +169,6 @@ Image objects (like `original` and each object in `resized`) contain the followi | `width` | Integer | The width of the image. | | `height` | Integer | The height of the image. | | `basename` | String | Basename of the file (`assets/some-file.jpg` => `some-file.jpg`). | +| `dirname` | String | Directory name of the file (`assets/some/file.jpg` => `assets/some`). | | `filename` | String | Basename without the extension (`assets/some-file.jpg` => `some-file`). | | `extension` | String | Extension of the file (`assets/some-file.jpg` => `jpg`). | diff --git a/features/fixtures/assets/subdir/test.png b/features/fixtures/assets/subdir/test.png new file mode 100644 index 0000000000000000000000000000000000000000..e53ebca0eea6ef165d506e32d2fe9e0e93b2706d GIT binary patch literal 18540 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 s4$jw$I6;@6-M{ev^DkeT{xK+YF> path, + 'dirname' => File.dirname(path), 'basename' => File.basename(path), 'filename' => File.basename(path, '.*'), 'extension' => File.extname(path).delete('.'), From c523b100cc60def03d40aaa8a1672e8d3f090c8f Mon Sep 17 00:00:00 2001 From: Joseph Wynn Date: Sun, 27 Dec 2015 22:41:04 +0000 Subject: [PATCH 2/2] Modify `dirname` to be relative to `base_path` --- README.md | 25 ++++++++++------- features/image-generation.feature | 4 +-- features/responsive-image-tag.feature | 2 +- lib/jekyll/responsive_image/common.rb | 4 ++- lib/jekyll/responsive_image/defaults.rb | 1 + .../responsive_image/image_processor.rb | 2 +- lib/jekyll/responsive_image/resize_handler.rb | 4 +-- lib/jekyll/responsive_image/utils.rb | 28 +++++++++++++------ 8 files changed, 44 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index e502755..a216624 100644 --- a/README.md +++ b/README.md @@ -45,12 +45,17 @@ responsive_image: - width: 1400 quality: 90 + # [Optional, Default: assets] + # The base directory where assets are stored. This is used to determine the + # `dirname` value in `output_path_format` below. + base_path: assets + # [Optional, Default: assets/resized/%{filename}-%{width}x%{height}.%{extension}] # The template used when generating filenames for resized images. Must be a # relative path. # # Parameters available are: - # %{dirname} Directory path of the file (assets/foo/some-file.jpg => assets/foo) + # %{dirname} Directory of the file relative to `base_path` (assets/sub/dir/some-file.jpg => sub/dir) # %{basename} Basename of the file (assets/some-file.jpg => some-file.jpg) # %{filename} Basename without the extension (assets/some-file.jpg => some-file) # %{extension} Extension of the file (assets/some-file.jpg => jpg) @@ -163,12 +168,12 @@ The following variables are available in the template: Image objects (like `original` and each object in `resized`) contain the following properties: -| Variable | Type | Description | -|-------------|---------|-------------------------------------------------------------------------| -| `path` | String | The path to the image. | -| `width` | Integer | The width of the image. | -| `height` | Integer | The height of the image. | -| `basename` | String | Basename of the file (`assets/some-file.jpg` => `some-file.jpg`). | -| `dirname` | String | Directory name of the file (`assets/some/file.jpg` => `assets/some`). | -| `filename` | String | Basename without the extension (`assets/some-file.jpg` => `some-file`). | -| `extension` | String | Extension of the file (`assets/some-file.jpg` => `jpg`). | +| Variable | Type | Description | +|-------------|---------|----------------------------------------------------------------------------------------------| +| `path` | String | The path to the image. | +| `width` | Integer | The width of the image. | +| `height` | Integer | The height of the image. | +| `basename` | String | Basename of the file (`assets/some-file.jpg` => `some-file.jpg`). | +| `dirname` | String | Directory of the file relative to `base_path` (`assets/sub/dir/some-file.jpg` => `sub/dir`). | +| `filename` | String | Basename without the extension (`assets/some-file.jpg` => `some-file`). | +| `extension` | String | Extension of the file (`assets/some-file.jpg` => `jpg`). | diff --git a/features/image-generation.feature b/features/image-generation.feature index 0193bd7..b7a8e50 100644 --- a/features/image-generation.feature +++ b/features/image-generation.feature @@ -19,7 +19,7 @@ Feature: Responsive image generation Given I have a responsive_image configuration with: """ template: _includes/responsive-image.html - output_path_format: "%{dirname}/resized/%{filename}-%{width}.%{extension}" + output_path_format: assets/resized/%{dirname}/%{filename}-%{width}.%{extension} sizes: - width: 100 """ @@ -32,4 +32,4 @@ Feature: Responsive image generation When I run Jekyll Then the file "assets/resized/test-100.png" should exist - And the file "assets/subdir/resized/test-100.png" should exist + And the file "assets/resized/subdir/test-100.png" should exist diff --git a/features/responsive-image-tag.feature b/features/responsive-image-tag.feature index 2fbb4eb..5546e94 100644 --- a/features/responsive-image-tag.feature +++ b/features/responsive-image-tag.feature @@ -69,7 +69,7 @@ Feature: Jekyll responsive_image tag Given I have a responsive_image configuration with: """ template: _includes/responsive-image.html - output_path_format: assets/%{basename}-resized/%{width}/%{filename}-%{height}.%{extension} + output_path_format: assets/%{dirname}/%{basename}-resized/%{width}/%{filename}-%{height}.%{extension} sizes: - width: 100 """ diff --git a/lib/jekyll/responsive_image/common.rb b/lib/jekyll/responsive_image/common.rb index d018fa9..40676e5 100644 --- a/lib/jekyll/responsive_image/common.rb +++ b/lib/jekyll/responsive_image/common.rb @@ -7,7 +7,9 @@ module Jekyll config = ResponsiveImage.defaults.dup.merge(site.config['responsive_image']).merge(:site_dest => site.dest) # Not very nice, but this is needed to create a clean path to add to keep_files - output_dir = format_output_path(config['output_path_format'], '*', '*', '*') + output_dir = format_output_path(config['output_path_format'], config['base_path'], '*', '*', '*') + output_dir = "#{File.dirname(output_dir)}/*" + site.config['keep_files'] << output_dir unless site.config['keep_files'].include?(output_dir) config diff --git a/lib/jekyll/responsive_image/defaults.rb b/lib/jekyll/responsive_image/defaults.rb index f47d4a9..6bd6532 100644 --- a/lib/jekyll/responsive_image/defaults.rb +++ b/lib/jekyll/responsive_image/defaults.rb @@ -2,6 +2,7 @@ module Jekyll class ResponsiveImage @defaults = { 'default_quality' => 85, + 'base_path' => 'assets', 'output_path_format' => 'assets/resized/%{filename}-%{width}x%{height}.%{extension}', 'sizes' => [], }.freeze diff --git a/lib/jekyll/responsive_image/image_processor.rb b/lib/jekyll/responsive_image/image_processor.rb index 51a02b0..7e7632f 100644 --- a/lib/jekyll/responsive_image/image_processor.rb +++ b/lib/jekyll/responsive_image/image_processor.rb @@ -10,7 +10,7 @@ module Jekyll img = Magick::Image::read(image_path).first { - original: image_hash(image_path, img.columns, img.rows), + original: image_hash(config['base_path'], image_path, img.columns, img.rows), resized: resize_handler.resize_image(img, config), } end diff --git a/lib/jekyll/responsive_image/resize_handler.rb b/lib/jekyll/responsive_image/resize_handler.rb index 68f5de3..614ca12 100644 --- a/lib/jekyll/responsive_image/resize_handler.rb +++ b/lib/jekyll/responsive_image/resize_handler.rb @@ -13,8 +13,8 @@ module Jekyll next unless needs_resizing?(img, width) - filepath = format_output_path(config['output_path_format'], img.filename, width, height) - resized.push(image_hash(filepath, width, height)) + filepath = format_output_path(config['output_path_format'], config['base_path'], img.filename, width, height) + resized.push(image_hash(config['base_path'], filepath, width, height)) # Don't resize images more than once next if File.exists?(filepath) diff --git a/lib/jekyll/responsive_image/utils.rb b/lib/jekyll/responsive_image/utils.rb index 35d569a..fbe612e 100644 --- a/lib/jekyll/responsive_image/utils.rb +++ b/lib/jekyll/responsive_image/utils.rb @@ -1,3 +1,5 @@ +require 'pathname' + module Jekyll class ResponsiveImage module Utils @@ -9,23 +11,31 @@ module Jekyll result end - def format_output_path(format, path, width, height) - params = symbolize_keys(image_hash(path, width, height)) - format % params + def format_output_path(format, base_path, image_path, width, height) + params = symbolize_keys(image_hash(base_path, image_path, width, height)) + + Pathname.new(format % params).cleanpath.to_s end # Build a hash containing image information - def image_hash(path, width, height) + def image_hash(base_path, image_path, width, height) { - 'path' => path, - 'dirname' => File.dirname(path), - 'basename' => File.basename(path), - 'filename' => File.basename(path, '.*'), - 'extension' => File.extname(path).delete('.'), + 'path' => image_path, + 'dirname' => relative_dirname(base_path, image_path), + 'basename' => File.basename(image_path), + 'filename' => File.basename(image_path, '.*'), + 'extension' => File.extname(image_path).delete('.'), 'width' => width, 'height' => height, } end + + def relative_dirname(base_path, image_path) + path = Pathname.new(image_path).expand_path + base = Pathname.new(base_path).expand_path + + path.relative_path_from(base).dirname.to_s.delete('.') + end end end end