jekyll_picture_tag 1.7.0 → 1.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.solargraph.yml +15 -0
  4. data/.travis.yml +4 -7
  5. data/Dockerfile +9 -0
  6. data/docs/Gemfile +4 -0
  7. data/docs/Gemfile.lock +249 -0
  8. data/docs/_config.yml +13 -0
  9. data/docs/_layouts/directory.html +32 -0
  10. data/docs/assets/style.css +31 -0
  11. data/{contributing.md → docs/contributing.md} +57 -15
  12. data/docs/{examples/_data/picture.yml → example_presets.md} +36 -25
  13. data/docs/global_configuration.md +61 -3
  14. data/docs/index.md +114 -0
  15. data/docs/installation.md +36 -21
  16. data/docs/migration.md +4 -0
  17. data/docs/notes.md +64 -58
  18. data/docs/output.md +63 -0
  19. data/docs/presets.md +175 -221
  20. data/docs/releases.md +64 -0
  21. data/docs/usage.md +91 -79
  22. data/jekyll_picture_tag.gemspec +3 -1
  23. data/lib/jekyll_picture_tag.rb +27 -10
  24. data/lib/jekyll_picture_tag/defaults/global.yml +2 -0
  25. data/lib/jekyll_picture_tag/defaults/presets.yml +2 -0
  26. data/lib/jekyll_picture_tag/generated_image.rb +105 -19
  27. data/lib/jekyll_picture_tag/instructions.rb +1 -0
  28. data/lib/jekyll_picture_tag/instructions/arg_splitter.rb +68 -0
  29. data/lib/jekyll_picture_tag/instructions/configuration.rb +47 -11
  30. data/lib/jekyll_picture_tag/instructions/html_attributes.rb +14 -8
  31. data/lib/jekyll_picture_tag/instructions/preset.rb +34 -14
  32. data/lib/jekyll_picture_tag/instructions/set.rb +18 -8
  33. data/lib/jekyll_picture_tag/instructions/tag_parser.rb +59 -69
  34. data/lib/jekyll_picture_tag/output_formats/basic.rb +35 -6
  35. data/lib/jekyll_picture_tag/output_formats/data_attributes.rb +4 -1
  36. data/lib/jekyll_picture_tag/router.rb +16 -0
  37. data/lib/jekyll_picture_tag/source_image.rb +6 -1
  38. data/lib/jekyll_picture_tag/srcsets/basic.rb +45 -19
  39. data/lib/jekyll_picture_tag/srcsets/pixel_ratio.rb +1 -3
  40. data/lib/jekyll_picture_tag/srcsets/width.rb +1 -1
  41. data/lib/jekyll_picture_tag/utils.rb +18 -0
  42. data/lib/jekyll_picture_tag/version.rb +1 -1
  43. data/readme.md +43 -200
  44. metadata +49 -13
  45. data/docs/examples/_config.yml +0 -10
  46. data/docs/examples/post.md +0 -46
  47. data/docs/readme.md +0 -23
@@ -0,0 +1,64 @@
1
+ ---
2
+ ---
3
+ # Release History
4
+
5
+ * 1.10.1 July 2, 2020
6
+ * Bugfix for erroneously regenerated images
7
+ * 1.10.0 May 11, 2020
8
+ * **Image Cropping support!** access the power of ImageMagick's `crop` function.
9
+ * Don't issue a warning when `default` preset is not found.
10
+ * Documentation improvements
11
+ * 1.9.0 Feb 2, 2020
12
+ * Add `fast_build` global setting
13
+ * Add `disabled` global setting
14
+ * Reduce unnecessary disk IO; sites with many source images should see build times improve when
15
+ no new images need to be generated.
16
+ * Add support for empty attributes; specifically so best-practice for decorative images (`alt=""`)
17
+ is possible.
18
+ * 1.8.0 Nov 25, 2019
19
+ * Add `data_sizes` setting for the `data_` family of output formats.
20
+ * 1.7.1 Nov 14, 2019
21
+ * Fix some HTML attribute related bugs
22
+ * Add a few items to the FAQ
23
+ * 1.7.0 Aug 12, 2019
24
+ * Add support for setting generated image quality, either generally or specific to given
25
+ formats.
26
+ * Add support for spaces and other url-encoded characters in filenames
27
+ * Documentation restructure - Moved it out of the wiki, into the `docs` folder.
28
+ * Bugfix: Fallback image width will now be checked against source image width.
29
+ * Bugfix: Minor fix to nomarkdown wrapper output
30
+ * link_source will now target the base source image, rather than finding the biggest one.
31
+ * Remove fastimage dependency, add addressable dependency.
32
+ * Moderately significant refactoring and code cleanup
33
+ * Decent set of tests added
34
+ * 1.6.0 Jul 2, 2019:
35
+ * Missing Preset warning respects `data_dir` setting
36
+ * Add `continue_on_missing` option
37
+ * 1.5.0 Jun 26, 2019:
38
+ * better `{::nomarkdown}` necessity detection
39
+ * allow user to override `{::nomarkdown}` autodetection
40
+ * 1.4.0 Jun 26, 2019:
41
+ * Rename gem from `jekyll-picture-tag` to `jekyll_picture_tag`, allowing us to use rubygems again.
42
+ * Add new output format: `naked_srcset`.
43
+ * 1.3.1 Jun 21, 2019: Bugfix
44
+ * 1.3.0 Jun 7, 2019:
45
+ * Initial compatibility with Jekyll 4.0
46
+ * bugfixes
47
+ * change to generated image naming-- The first build after this update will be longer, and you
48
+ might want to clear out your generated images.
49
+ * 1.2.0 Feb 9, 2019:
50
+ * Add nomarkdown fix
51
+ * noscript option
52
+ * relative url option
53
+ * anchor tag wrappers
54
+ * 1.1.0 Jan 22, 2019:
55
+ * Add direct_url markup format,
56
+ * auto-orient images before stripping metadata
57
+ * 1.0.2 Jan 18, 2019: Fix ruby version specification
58
+ * 1.0.1 Jan 13, 2019: Added ruby version checking
59
+ * **1.0.0** Nov 27, 2018: Rewrite from the ground up. See the [migration guide]({{ site.baseurl }}/migration).
60
+ * 0.2.2 Aug 2, 2013: Bugfixes
61
+ * 0.2.1 Jul 17, 2013: Refactor again, add Liquid parsing.
62
+ * 0.2.0 Jul 14, 2013: Rewrite code base, bring in line with Jekyll Image Tag.
63
+ * 0.1.1 Jul 5, 2013: Quick round of code improvements.
64
+ * 0.1.0 Jul 5, 2013: Initial release.
@@ -1,131 +1,143 @@
1
- # Liquid Tag Usage
1
+ ---
2
+ ---
2
3
 
3
- The tag takes a mix of user input and pointers to configuration settings. The only required argument
4
- is the base image:
4
+ # How to use the Liquid Tag:
5
5
 
6
- `{% picture [preset] (source image) [alternate images] [attributes] %}`
6
+ ## Format:
7
7
 
8
- For filenames with spaces, you can either surround it with quotes (`"my image.jpg"`) or escape the
9
- space with a backslash (`"my\ image.jpg"`).
8
+ {% raw %}
9
+ `{% picture [preset] (image) [crop] [alternate images & crops] [attributes] %}`
10
+ {% endraw %}
11
+
12
+ The only required argument is the base image. Line breaks and extra spaces are fine, and you can
13
+ use liquid variables anywhere.
10
14
 
11
15
  ## Examples:
12
16
 
17
+ {% raw %}
13
18
  `{% picture example.jpg %}`
14
19
 
15
- `{% picture thumbnail example.jpg %}`
20
+ `{% picture thumbnail example.jpg 1:1 --alt Example Image %}`
21
+
22
+ `{% picture example.jpg 16:9 north --picture class="attribute-demo" %}`
16
23
 
17
24
  `{% picture blog_index {{ post.image }} --link {{ post.url }} %}`
18
25
 
19
26
  `{% picture "some example.jpg" mobile: other\ example.jpg %}`
20
27
 
21
- ```
22
- {% picture
23
- hero
24
- example.jpg
25
- mobile: example_cropped.jpg
26
- --alt Happy Puppy
27
- --picture class="hero"
28
+ ```md
29
+ {% picture
30
+ hero
31
+ example.jpg 16:9 east
32
+ tablet: example_cropped.jpg 3:2 east
33
+ mobile: example_cropped_more.jpg 1:1-50+0 east
34
+ --alt Happy Puppy
35
+ --picture class="hero"
28
36
  --link /
29
37
  %}
30
38
  ```
31
39
 
40
+ {% endraw %}
41
+
32
42
  ## Argument reference
33
43
 
34
- * **Preset**
44
+ Given in order:
35
45
 
36
- *Format:* `(name of a markup preset described in _data/picture.yml)`
46
+ - **Preset**
37
47
 
38
- *Default:* `default`
48
+ Select a [markup preset]({{ site.baseurl }}/presets#markup-presets), or omit to use the `default` preset. Presets
49
+ are collections of settings that determine nearly everything about JPT's output, from the image
50
+ formats used to the exact format your markup will take.
39
51
 
40
- Optionally specify a markup
41
- [preset](https://github.com/rbuchberger/jekyll_picture_tag/wiki/Writing-Presets) to use, or leave
42
- blank for the `default` preset.
52
+ - **Base Image** (Required)
43
53
 
44
- * **Source Image** (Required)
54
+ Can be any raster image (as long as you have the required ImageMagick delegate). Relative to
55
+ jekyll's root directory, or the `source` [setting]({{ site.baseurl }}/global_configuration) if you've configured it.
45
56
 
46
- *Format:* `(Image filename, relative to source setting in _config.yml)`
57
+ For filenames with spaces, either use double quotes (`"my image.jpg"`) or a backslash (`my\ image.jpg`).
47
58
 
48
- The base image that will be resized for your picture sources. Can be pretty much any raster image
49
- (as long as imagemagick understands it).
59
+ - **Crop**
50
60
 
51
- * **Alternate images**
61
+ **Check the [ installation guide ](installation) before using this feature.**
52
62
 
53
- *Format:* `(media query preset): (image filename, relative to source directory)`
63
+ Crop an image to a given aspect ratio or size. This argument is given as a `geometry` and
64
+ (optionally) a `gravity`, which can appear in either order and are thin wrappers around
65
+ ImageMagick's [geometry](http://www.imagemagick.org/script/command-line-processing.php#geometry)
66
+ and [gravity](http://www.imagemagick.org/script/command-line-options.php#gravity) settings. The
67
+ values given here will override the preset settings (if present), can be given after every image,
68
+ and apply only to the preceding image.
54
69
 
55
- *Example:* `tablet: img_cropped.jpg mobile: img_cropped_more.jpg`
70
+ Geometry can take many forms, but most likely you'll want to set an aspect ratio-- given in the
71
+ standard `width:height` ratio such as `3:2`. Gravity sets which portion of the image to keep, and
72
+ is given in compass directions (`north`, `southeast`, etc) or `center` (default). Cropping happens
73
+ before resizing; the preset `widths` setting is a post-crop value.
56
74
 
57
- Optionally specify any number of alternate base images for given [media queries](#media-presets)
58
- (specified in `_data/picture.yml`). This is one of of picture's strongest features, often referred
59
- to as the [art direction use case](http://usecases.responsiveimages.org/#art-direction).
75
+ If you'd like more fine-grained control, this can be offset by appending `+|-x` and (optionally)
76
+ `y` pixel values to the _geometry_ (not the gravity!). Example: `1:1+400 west` means "Crop to a
77
+ 1:1 aspect ratio, starting 400 pixels from the left side.", and `north 3:2+0+100` means "Crop to
78
+ 3:2, starting 100 pixels from the top." These can get a bit persnickety; there's nothing to stop
79
+ you from running off the side of the image. Pay attention.
60
80
 
61
- Give your images in order of ascending specificity (The first image is the most general). They will
62
- be provided to the browser in reverse order, and it will select the first one with a media query
63
- that evaluates true.
81
+ For detailed documentation, see ImageMagick's
82
+ [crop](http://www.imagemagick.org/script/command-line-options.php#crop) tool.
64
83
 
65
- * **Attributes**
84
+ _Note:_ If you do a lot of trial and error with these, it's a good idea to manually delete your
85
+ generated images folder more often as each change will build a new set of images without removing
86
+ the old ones.
66
87
 
67
- Optionally specify any number of HTML attributes. These will be added to any attributes you've
68
- set in a preset. They can take a few different formats:
88
+ - **Alternate images**
69
89
 
70
- ##### `--link`
90
+ _Format:_ `(media query preset): (filename) (...)`
71
91
 
72
- *Format:* `--link (some url)`
92
+ _Example:_ `tablet: img_cropped.jpg mobile: img_cropped_more.jpg`
73
93
 
74
- *Examples*: `--link https://example.com`, `--link /blog/some_post/`
94
+ Optionally specify any number of alternate base images for given [screen
95
+ sizes]({{ site.baseurl }}/presets/#media-presets) (specified in `_data/picture.yml`). This is called [art
96
+ direction](http://usecases.responsiveimages.org/#art-direction), and is one of JPT's strongest
97
+ features.
75
98
 
76
- Wrap the image in an anchor tag, with the `href` attribute set to whatever value you give it.
77
- This will override automatic source image linking, if you have enabled it.
99
+ Give your images in order of ascending specificity (The first image is the most general). They will
100
+ be provided to the browser in reverse order, and it will select the first one with an applicable
101
+ media query.
78
102
 
79
- **Note**: Don't disable the `nomarkdown` global setting if you would like do this within markdown
80
- files and you are using Kramdown (Jekyll's default markdown parser.)
81
- ##### `--alt`
82
-
83
- *Format:* `--alt (alt text)`
103
+ - **Attributes**
84
104
 
85
- *Example:* `--alt Here is my alt text!`
105
+ Optionally specify any number of HTML attributes, or an href target. These will be added to any
106
+ attributes you've set in a preset.
86
107
 
87
- Shortcut for `--img alt="..."`
88
-
89
- ##### `--(element)`
108
+ - **`--link`**
90
109
 
91
- *Format:* `--(picture|img|source|a|parent) (Standard HTML attributes)`
110
+ _Format:_ `--link (some url)`
92
111
 
93
- *Example:* `--img class="awesome-fade-in" id="coolio" --a data-awesomeness="11"`
112
+ _Examples_: `--link https://example.com`, `--link /blog/some_post/`
94
113
 
95
- Apply attributes to a given HTML element. Your options are:
114
+ Wrap the image in an anchor tag, with the `href` attribute set to whatever value you give it.
115
+ This will override automatic source image linking, if you have enabled it.
96
116
 
97
- * `picture`
98
- * `img`
99
- * `source`
100
- * `a` (anchor tag)
101
- * `parent`
117
+ **Note**: If you get either mangled HTML or extra {::nomarkdown} tags when using this, read
118
+ [here]({{ site.baseurl }}/notes).
102
119
 
103
- `--parent` will be applied to the `<picture>` if present, otherwise the `<img>`; useful when using
104
- the `auto` output format.
120
+ - **`--alt`**
105
121
 
106
- ##### Old syntax
122
+ _Format:_ `--alt (alt text)`
107
123
 
108
- The old syntax is to just dump all attributes at the end:
124
+ _Example:_ `--alt Here is my alt text!`
109
125
 
110
- `{% picture example.jpg alt="alt text" class="super-duper" %}`
126
+ Convenience shortcut for `--img alt="..."`
111
127
 
112
- This will continue to work. For backwards compatibility, behavior of previous versions is
113
- maintained: all attributes specified this way are applied to the img tag.
128
+ - **`--(element)`**
114
129
 
115
- #### Line breaks
116
- Line breaks and spaces are interchangeable, the following is perfectly acceptable:
130
+ _Format:_ `--(picture|img|source|a|parent) (Standard HTML attributes)`
117
131
 
118
- ```
119
- {%
120
- picture my-preset
121
- img.jpg
122
- mobile: alt.jpg
123
- --alt Alt Text
124
- --picture class="stumpy"
125
- %}
126
- ```
127
- #### Liquid variables
132
+ _Example:_ `--img class="awesome-fade-in" id="coolio" --a data-awesomeness="11"`
133
+
134
+ Apply attributes to a given HTML element. Your options are:
128
135
 
129
- You can use liquid variables in a picture tag:
136
+ - `picture`
137
+ - `img`
138
+ - `source`
139
+ - `a` (anchor tag)
140
+ - `parent`
130
141
 
131
- `{% picture {{ post.featured_image }} --alt Our Project %}`
142
+ `--parent` will be applied to the `<picture>` if present, otherwise the `<img>`; useful when
143
+ using an `auto` output format.
@@ -35,11 +35,13 @@ Gem::Specification.new do |spec|
35
35
  spec.add_development_dependency 'rake', '~> 12.3'
36
36
  spec.add_development_dependency 'rubocop'
37
37
  spec.add_development_dependency 'simplecov'
38
+ spec.add_development_dependency 'solargraph'
38
39
 
39
40
  spec.add_dependency 'addressable', '~> 2.6'
41
+ spec.add_dependency 'base32', '~> 0.3'
40
42
  spec.add_dependency 'mime-types', '~> 3'
41
43
  spec.add_dependency 'mini_magick', '~> 4'
42
- spec.add_dependency 'objective_elements', '~> 1.1'
44
+ spec.add_dependency 'objective_elements', '~> 1.1.2'
43
45
 
44
46
  spec.add_runtime_dependency 'jekyll', '< 5'
45
47
  end
@@ -18,9 +18,9 @@ require_relative 'jekyll_picture_tag/router'
18
18
  #
19
19
  # Description: Easy responsive images for Jekyll.
20
20
  #
21
- # Download: https://github.com/rbuchberger/jekyll_picture_tag
22
- # Documentation: https://github.com/rbuchberger/jekyll_picture_tag/readme.md
23
- # Issues: https://github.com/rbuchberger/jekyll_picture_tag/issues
21
+ # Download: https://rubygems.org/gems/jekyll_picture_tag
22
+ # Documentation: https://rbuchberger.github.io/jekyll_picture_tag/
23
+ # Issues: https://github.com/rbuchberger/jekyll_picture_tag/
24
24
  #
25
25
  # Syntax:
26
26
  # {% picture [preset] img.jpg [media_query: alt-img.jpg] [attributes] %}
@@ -39,30 +39,47 @@ require_relative 'jekyll_picture_tag/router'
39
39
  #
40
40
  # See the documentation for full configuration and usage instructions.
41
41
  module PictureTag
42
+ # The router module is important. If you're looking for the actual code which
43
+ # handles a `PictureTag.(some method)`, start there.
42
44
  extend Router
45
+
43
46
  ROOT_PATH = __dir__
44
47
 
45
48
  # This is the actual liquid tag, which provides the interface with Jekyll.
46
49
  class Picture < Liquid::Tag
50
+ # First jekyll initializes our class with a few arguments, of which we only
51
+ # care about the params (arguments passed to the liquid tag). Jekyll makes
52
+ # no attempt to parse them; they're given as a string.
47
53
  def initialize(tag_name, raw_params, tokens)
48
54
  @raw_params = raw_params
49
55
  super
50
56
  end
51
57
 
58
+ # Then jekyll calls the 'render' method and passes it a mostly undocumented
59
+ # context object, which appears to hold the entire site including its
60
+ # configuration and the parsed _data dir.
52
61
  def render(context)
53
- # Jekyll passes in a mostly undocumented context object, which appears to
54
- # hold the entire site, including configuration and the _data dir.
62
+ setup(context)
63
+
64
+ if PictureTag.disabled?
65
+ ''
66
+ else
67
+ PictureTag.output_class.new.to_s
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def setup(context)
55
74
  PictureTag.context = context
56
75
 
57
- # The instruction set depends on both the context and the tag parameters:
76
+ # Now that we have both the tag parameters and the context object, we can
77
+ # build our instruction set.
58
78
  PictureTag.instructions = Instructions::Set.new(@raw_params)
59
79
 
60
80
  # We need to explicitly prevent jekyll from overwriting our generated
61
- # files:
81
+ # image files:
62
82
  Utils.keep_files
63
-
64
- # Return a string:
65
- PictureTag.output_class.new.to_s
66
83
  end
67
84
  end
68
85
  end
@@ -7,3 +7,5 @@ picture:
7
7
  cdn_environments: ['production']
8
8
  nomarkdown: true
9
9
  ignore_missing_images: false
10
+ disabled: false
11
+ fast_build: false
@@ -6,3 +6,5 @@ fallback_format: original
6
6
  noscript: false
7
7
  link_source: false
8
8
  quality: 75
9
+ data_sizes: true
10
+ gravity: center
@@ -1,42 +1,135 @@
1
1
  require 'mini_magick'
2
+ require 'base32'
2
3
 
3
4
  module PictureTag
4
- # Generated Image
5
- # Represents a generated source file.
5
+ # Represents a generated image file.
6
6
  class GeneratedImage
7
7
  attr_reader :width, :format
8
8
  include MiniMagick
9
9
 
10
- def initialize(source_file:, width:, format:)
10
+ def initialize(source_file:, width:, format:, crop: nil, gravity: '')
11
11
  @source = source_file
12
12
  @width = width
13
13
  @format = process_format format
14
+ @crop = crop
15
+ @gravity = gravity
16
+ end
14
17
 
15
- generate_image unless File.exist?(absolute_filename) || @source.missing
18
+ def exists?
19
+ File.exist?(absolute_filename)
16
20
  end
17
21
 
18
- def name
19
- "#{@source.base_name}-#{@width}-#{@source.digest}.#{@format}"
22
+ def generate
23
+ generate_image unless @source.missing || exists?
20
24
  end
21
25
 
26
+ # /home/dave/my_blog/_site/generated/somefolder/myimage-100-123abc.jpg
27
+ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
22
28
  def absolute_filename
23
29
  @absolute_filename ||= File.join(PictureTag.dest_dir, name)
24
30
  end
25
31
 
32
+ # /home/dave/my_blog/_site/generated/somefolder/myimage-100-123abc.jpg
33
+ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
34
+ def name
35
+ name_left + digest + name_right
36
+ end
37
+
38
+ # https://example.com/assets/images/myimage-100-123abc.jpg
39
+ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
26
40
  def uri
27
41
  ImgURI.new(name).to_s
28
42
  end
29
43
 
44
+ def cropped_source_width
45
+ image.width
46
+ end
47
+
30
48
  private
31
49
 
50
+ # /home/dave/my_blog/_site/generated/somefolder/myimage-100-123abc.jpg
51
+ # ^^^^^^^^^^^^^^^^^^^^^^^
52
+ def name_left
53
+ "#{@source.base_name}-#{@width}-"
54
+ end
55
+
56
+ # /home/dave/my_blog/_site/generated/somefolder/myimage-100-123abc.jpg
57
+ # ^^^^^^
58
+ def digest
59
+ guess_digest if !@source.digest_guess && PictureTag.fast_build?
60
+
61
+ @source.digest
62
+ end
63
+
64
+ # /home/dave/my_blog/_site/generated/somefolder/myimage-100-123abc.jpg
65
+ # ^^^^
66
+ def name_right
67
+ crop_code + '.' + @format
68
+ end
69
+
70
+ # Hash the crop settings, so we can detect when they change. We use a
71
+ # base32 encoding scheme to pack more information into fewer characters,
72
+ # without dealing with various filesystem naming limitations that would crop
73
+ # up using base64 (such as NTFS being case insensitive).
74
+ def crop_code
75
+ return '' unless @crop
76
+
77
+ Base32.encode(
78
+ Digest::MD5.hexdigest(@crop + @gravity)
79
+ )[0..2]
80
+ end
81
+
82
+ # Used for the fast build option: look for a file which matches everything
83
+ # we know about the destination file without calculating a digest on the
84
+ # source file, and if it exists we assume it's the right one.
85
+ def guess_digest
86
+ matches = dest_glob
87
+ return unless matches.length == 1
88
+
89
+ # Start and finish of the destination image's hash value
90
+ finish = -name_right.length
91
+ start = finish - 6
92
+
93
+ # The source image keeps track of this guess, so we hand it off:
94
+ @source.digest_guess = matches.first[start...finish]
95
+ end
96
+
97
+ # Returns a list of images which are probably correct.
98
+ def dest_glob
99
+ query = File.join(
100
+ PictureTag.dest_dir,
101
+ name_left + '?' * 6 + name_right
102
+ )
103
+
104
+ Dir.glob query
105
+ end
106
+
107
+ def generate_image
108
+ puts 'Generating new image file: ' + name
109
+ process_image
110
+ write_image
111
+ end
112
+
32
113
  def image
33
- @image ||= Image.open(@source.name)
114
+ @image ||= open_image
115
+ end
116
+
117
+ def open_image
118
+ image_base = Image.open(@source.name)
119
+ image_base.combine_options do |i|
120
+ i.auto_orient
121
+ if @crop
122
+ i.gravity @gravity
123
+ i.crop @crop
124
+ end
125
+ end
126
+
127
+ image_base
34
128
  end
35
129
 
36
130
  def process_image
37
131
  image.combine_options do |i|
38
132
  i.resize "#{@width}x"
39
- i.auto_orient
40
133
  i.strip
41
134
  end
42
135
 
@@ -44,24 +137,17 @@ module PictureTag
44
137
  image.quality PictureTag.quality(@format)
45
138
  end
46
139
 
47
- def generate_image
48
- puts 'Generating new image file: ' + name
49
- process_image
50
- write_image
51
- end
52
-
53
140
  def write_image
54
- check_dest_dir
141
+ # Make sure destination directory exists:
142
+ FileUtils.mkdir_p(dest_dir) unless Dir.exist?(dest_dir)
55
143
 
56
144
  image.write absolute_filename
57
145
 
58
146
  FileUtils.chmod(0o644, absolute_filename)
59
147
  end
60
148
 
61
- # Make sure destination directory exists
62
- def check_dest_dir
63
- dir = File.dirname absolute_filename
64
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
149
+ def dest_dir
150
+ File.dirname absolute_filename
65
151
  end
66
152
 
67
153
  def process_format(format)