jekyll_picture_tag 1.13.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +4 -0
  3. data/.github/workflows/code-checks.yml +33 -0
  4. data/.gitignore +3 -0
  5. data/.rubocop.yml +29 -76
  6. data/.ruby-version +1 -1
  7. data/docs/.envrc +2 -0
  8. data/docs/devs/contributing/code.md +14 -4
  9. data/docs/devs/contributing/docs.md +24 -6
  10. data/docs/devs/contributing/setup.md +21 -1
  11. data/docs/devs/contributing/testing.md +19 -37
  12. data/docs/devs/releases.md +45 -4
  13. data/docs/index.md +43 -18
  14. data/docs/logo.png +0 -0
  15. data/docs/logo.svg +880 -0
  16. data/docs/users/configuration/disable.md +1 -1
  17. data/docs/users/configuration/ignore_missing.md +1 -1
  18. data/docs/users/configuration/kramdown_fix.md +1 -1
  19. data/docs/users/configuration/suppress_warnings.md +1 -1
  20. data/docs/users/configuration/urls.md +69 -0
  21. data/docs/users/deployment.md +49 -0
  22. data/docs/users/getting_started.md +55 -0
  23. data/docs/users/installation.md +18 -38
  24. data/docs/users/liquid_tag/argument_reference/crop.md +21 -36
  25. data/docs/users/liquid_tag/examples.md +13 -25
  26. data/docs/users/liquid_tag/index.md +1 -1
  27. data/docs/users/notes/{migration.md → migration_1.md} +1 -1
  28. data/docs/users/notes/migration_2.md +99 -0
  29. data/docs/users/presets/cropping.md +21 -22
  30. data/docs/users/presets/default.md +11 -2
  31. data/docs/users/presets/examples.md +77 -45
  32. data/docs/users/presets/fallback_image.md +1 -1
  33. data/docs/users/presets/html_attributes.md +1 -1
  34. data/docs/users/presets/image_formats.md +3 -3
  35. data/docs/users/presets/image_quality.md +71 -56
  36. data/docs/users/presets/index.md +19 -45
  37. data/docs/users/presets/link_source.md +1 -1
  38. data/docs/users/presets/media_queries.md +1 -1
  39. data/docs/users/presets/nomarkdown_override.md +1 -1
  40. data/docs/users/presets/pixel_ratio_srcsets.md +1 -1
  41. data/docs/users/presets/width_height_attributes.md +1 -1
  42. data/docs/users/presets/width_srcsets.md +61 -23
  43. data/docs/users/presets/writing_presets.md +65 -0
  44. data/docs/users/tutorial.md +97 -0
  45. data/jekyll_picture_tag.gemspec +38 -23
  46. data/lib/jekyll_picture_tag.rb +8 -5
  47. data/lib/jekyll_picture_tag/cache.rb +64 -3
  48. data/lib/jekyll_picture_tag/defaults/global.rb +18 -0
  49. data/lib/jekyll_picture_tag/defaults/presets.rb +57 -0
  50. data/lib/jekyll_picture_tag/images.rb +1 -0
  51. data/lib/jekyll_picture_tag/images/generated_image.rb +25 -60
  52. data/lib/jekyll_picture_tag/images/image_file.rb +105 -0
  53. data/lib/jekyll_picture_tag/images/img_uri.rb +3 -10
  54. data/lib/jekyll_picture_tag/images/source_image.rb +44 -9
  55. data/lib/jekyll_picture_tag/instructions.rb +70 -6
  56. data/lib/jekyll_picture_tag/instructions/children/config.rb +128 -0
  57. data/lib/jekyll_picture_tag/instructions/children/context.rb +24 -0
  58. data/lib/jekyll_picture_tag/instructions/children/params.rb +90 -0
  59. data/lib/jekyll_picture_tag/instructions/children/parsers.rb +48 -0
  60. data/lib/jekyll_picture_tag/instructions/children/preset.rb +182 -0
  61. data/lib/jekyll_picture_tag/instructions/parents/conditional_instruction.rb +69 -0
  62. data/lib/jekyll_picture_tag/instructions/parents/env_instruction.rb +29 -0
  63. data/lib/jekyll_picture_tag/output_formats/basic.rb +5 -17
  64. data/lib/jekyll_picture_tag/parsers.rb +6 -0
  65. data/lib/jekyll_picture_tag/{instructions → parsers}/arg_splitter.rb +1 -1
  66. data/lib/jekyll_picture_tag/parsers/configuration.rb +28 -0
  67. data/lib/jekyll_picture_tag/{instructions → parsers}/html_attributes.rb +1 -1
  68. data/lib/jekyll_picture_tag/parsers/image_backend.rb +33 -0
  69. data/lib/jekyll_picture_tag/parsers/preset.rb +43 -0
  70. data/lib/jekyll_picture_tag/{instructions → parsers}/tag_parser.rb +15 -12
  71. data/lib/jekyll_picture_tag/router.rb +35 -93
  72. data/lib/jekyll_picture_tag/srcsets/basic.rb +4 -10
  73. data/lib/jekyll_picture_tag/utils.rb +10 -20
  74. data/lib/jekyll_picture_tag/version.rb +1 -1
  75. data/readme.md +48 -9
  76. metadata +161 -80
  77. data/.travis.yml +0 -8
  78. data/Dockerfile +0 -9
  79. data/docs/users/configuration/cdn.md +0 -35
  80. data/docs/users/configuration/relative_urls.md +0 -15
  81. data/docs/users/notes/input_checking.md +0 -6
  82. data/jekyll-picture-tag.gemspec +0 -52
  83. data/lib/jekyll-picture-tag.rb +0 -25
  84. data/lib/jekyll_picture_tag/cache/base.rb +0 -59
  85. data/lib/jekyll_picture_tag/cache/generated.rb +0 -20
  86. data/lib/jekyll_picture_tag/cache/source.rb +0 -19
  87. data/lib/jekyll_picture_tag/defaults/global.yml +0 -11
  88. data/lib/jekyll_picture_tag/defaults/presets.yml +0 -11
  89. data/lib/jekyll_picture_tag/instructions/configuration.rb +0 -121
  90. data/lib/jekyll_picture_tag/instructions/preset.rb +0 -122
  91. data/lib/jekyll_picture_tag/instructions/set.rb +0 -75
@@ -1,22 +1,18 @@
1
1
  ---
2
- sort: 5
2
+ sort: 7
3
3
  ---
4
4
 
5
5
  # Cropping
6
6
 
7
- **Check the warning in the
8
- [installation guide]({{ site.baseurl }}/users/installation)
9
- before using this feature.**
10
-
11
7
  ## Crop & Media Crop
12
8
 
13
9
  _Format:_
14
10
 
15
11
  ```yaml
16
- crop: (geometery)
12
+ crop: (aspect ratio)
17
13
  media_crop:
18
- (media_preset): (geometry)
19
- (media_preset): (geometry)
14
+ (media_preset): (aspect ratio)
15
+ (media_preset): (aspect ratio)
20
16
  (...)
21
17
  ```
22
18
 
@@ -29,33 +25,36 @@ _Example:_
29
25
  mobile: '1:1'
30
26
  ```
31
27
 
32
- Crop geometry, given either generally or for specific media presets. The
28
+ Crop aspect ratio, given either generally or for specific media presets. The
33
29
  hierarchy is: `tag argument` > `media_crop:` > `crop:`.
34
30
 
35
- This setting accepts the same arguments as the `crop geometry`
31
+ This setting accepts the same arguments as the `crop`
36
32
  [tag parameter]({{ site.baseurl }}/users/liquid_tag/argument_reference/crop).
37
33
 
38
- ## Gravity & Media Gravity
34
+ ## Keep & Media Keep
39
35
 
40
36
  ```yaml
41
- gravity: (gravity)
42
- media_gravity:
43
- (media_preset): (gravity)
44
- (media_preset): (gravity)
37
+ keep: (measure)
38
+ media_keep:
39
+ (media_preset): (measure)
40
+ (media_preset): (measure)
45
41
  (...)
46
42
  ```
47
43
 
48
44
  _Example:_
49
45
 
50
46
  ```yaml
51
- gravity: north
47
+ keep: attention
52
48
  media_gravity:
53
- tablet: east
54
- mobile: southwest
49
+ tablet: entropy
50
+ mobile: center
55
51
  ```
56
52
 
57
- Crop gravity, given either generally or for specific media presets. The hierarchy is:
58
- `tag argument` > `media_gravity:` > `gravity:` > `center` (default).
53
+ Which part of the image to keep when cropping, given either generally or for specific media presets.
54
+ The hierarchy is: `tag argument` > `media_keep:` > `keep:` > `attention` (default).
59
55
 
60
- This setting accepts the same arguments as the `crop gravity`
61
- [tag parameter]({{ site.baseurl }}/users/liquid_tag/argument_reference/crop).
56
+ This setting accepts the same arguments as the `keep` [tag parameter]({{ site.baseurl
57
+ }}/users/liquid_tag/argument_reference/crop):
58
+ * `center` or `centre`
59
+ * `attention`
60
+ * `entropy`
@@ -1,5 +1,5 @@
1
1
  ---
2
- sort: 13
2
+ sort: 14
3
3
  ---
4
4
 
5
5
  # Default preset
@@ -17,7 +17,16 @@ presets:
17
17
  noscript: false
18
18
  link_source: false
19
19
  quality: 75
20
+ format_quality:
21
+ webp: 50
22
+ avif: 30
23
+ jp2: 30
24
+ strip_metadata: true
25
+ image_options:
26
+ avif:
27
+ compression: av1
28
+ speed: 8
20
29
  data_sizes: true
21
- gravity: center
30
+ keep: attention
22
31
  dimension_attributes: false
23
32
  ```
@@ -1,79 +1,111 @@
1
1
  ---
2
- sort: 12
2
+ sort: 2
3
3
  ---
4
- # Example _data/picture.yml
4
+ # Examples
5
5
 
6
- These are example settings- I mostly made them up off the top of my head. You
7
- probably don't want to just copy-paste them.
6
+ The following example media queries & presets (except for `default`) are built-in with a `jpt-`
7
+ prefix. For example, the `desktop` media query below can be used with `jpt-desktop`, and the `webp`
8
+ preset below can be used with `jpt-webp`.
8
9
 
9
10
  ```yaml
10
11
  # _data/picture.yml
11
12
 
13
+ # These are used in several places. You likely want to enter whatever CSS media queries your site
14
+ # uses here.
12
15
  media_queries:
13
- wide_desktop: 'min-width: 1801px'
14
- desktop: 'max-width: 1800px'
15
- wide_tablet: 'max-width: 1200px'
16
- tablet: 'max-width: 900px'
17
- mobile: 'max-width: 600px'
16
+ mobile: 'max-width: 480px'
17
+ tablet: 'max-width: 768'
18
+ laptop: 'max-width: 1024px'
19
+ desktop: 'max-width: 1200'
20
+ wide: 'min-width: 1201'
18
21
 
19
22
  presets:
23
+ # This entry is purely an example. It is not the default JPT preset, nor is it available as a
24
+ # built-in.
20
25
  default:
21
- markup: auto
22
- link_source: true # wrap images in a link to the original source image.
23
- dimension_attributes: true # Page reflow begone!
24
-
25
- formats: [webp, original] # Must be an array, and order matters.
26
+ formats: [webp, original] # Order matters!
27
+ widths: [200, 400, 800, 1200, 1600] # Image widths, in pixels.
26
28
 
27
- widths: [200, 400, 800, 1600] # Must be an array.
28
- media_widths: # Because a cell phone doesn't want 1600 pixels.
29
- mobile: [200, 400, 600]
30
- tablet: [400, 600, 800]
31
-
32
- sizes:
33
- mobile: 100vw
29
+ # The sizes attribute is both important, and impossible to offer good defaults for. You need to
30
+ # learn about it. Short version: Web browsers parse web pages line-by-line. When they run into
31
+ # an external asset they must download, they start that process immediately, without waiting to
32
+ # finish rendering the page. This means that at the point in time when the browser must decide
33
+ # which image to download, it has no clue how large that image will be on the page. The sizes
34
+ # attribute is how we tell it.
35
+ #
36
+ # If you do not provide this, the web browser will assume the image is 100vw (100% the width of
37
+ # the viewport.)
38
+ #
39
+ # This doesn't have to be pixel-perfect, just close enough for the browser to make a good
40
+ # choice. Keys are media queries defined above, values are how large the image will be when
41
+ # that media query is true. You can't use % (percentage width of the parent container) for the
42
+ # same reason we have to do this at all.
43
+ sizes:
44
+ mobile: calc(100vw - 16px)
34
45
  tablet: 80vw
46
+
47
+ # Size is unconditional; provided either after all conditional sizes (above) or alone. If you
48
+ # only have a 'size' (no 'sizes'), and it's a constant (px, em, or rem), you should use a
49
+ # pixel-ratio srcset.
35
50
  size: 800px
36
51
 
37
- fallback_width: 800
38
- fallback_format: original
52
+ link_source: true # wrap images in a link to the original source image.
53
+ dimension_attributes: true # Page reflow begone!
39
54
 
55
+ # You can add any HTML attribute you like, to any HTML element which JPT creates:
40
56
  attributes:
57
+ # parent refers to the outermost tag; <picture> if it's present, otherwise the <img>.
41
58
  parent: 'data-downloadable="true"'
42
59
  picture: 'class="awesome" data-volume="11"'
43
60
  img: 'class="some-other-class"'
44
61
  a: 'class="image-link"'
45
62
 
46
- # This is an example of how you would create a 'multiplier' based srcset;
47
- # useful when an image will always be the same size on all screens (icons,
48
- # graphics, thumbnails, etc), but you'd like to supply higher resolution
49
- # images to devices with higher pixel ratios.
50
- icon:
51
- base_width: 20 # How wide the 1x image should be.
52
- pixel_ratios: [1, 1.5, 2]
53
- fallback_width: 20
63
+ # You can use this as jpt-webp. All following presets follow the same pattern.
64
+ webp:
65
+ formats: [webp, original]
66
+
67
+ # Avif is the new hotness coming down the pipe. Browser support is bad and they are slow to
68
+ # generate, but you get good file sizes even compared to webp of similar quality.
69
+ avif:
70
+ formats: [avif, webp, original]
71
+
72
+ # Your build times will suffer, but everyone is happy.
73
+ loaded:
74
+ formats: [avif, jp2, webp, original]
75
+ dimension_attributes: true
76
+
77
+ # This is an example of how you would create a 'multiplier' based srcset; useful when an image
78
+ # will always be the same size on all screens (icons, graphics, thumbnails, etc), but you'd like
79
+ # to supply higher resolution images to devices with higher pixel ratios.
80
+ thumbnail:
81
+ base_width: 250 # How wide the 1x image should be.
82
+ pixel_ratios: [1, 1.5, 2] # Which multipliers to target.
83
+ fallback_width: 250 # The default is 800, which is probably too big.
84
+ formats: [webp, original]
54
85
  attributes:
55
- img: 'class="icon"'
86
+ picture: 'class="thumbnail"'
56
87
 
57
- # Here's an example of how you'd configure jekyll-picture-tag to work with
58
- # something like lazyload: https://github.com/verlok/lazyload
88
+ # Another pixel-ratio example.
89
+ avatar:
90
+ # Say your layout demands a square:
91
+ crop: 1:1
92
+ base_width: 100
93
+ pixel_ratios: [1, 1.5, 2]
94
+ fallback_width: 100,
95
+
96
+ # Here's an example of how you'd configure JPT to work with something like lazyload:
97
+ # https://github.com/verlok/lazyload
98
+ # Remember to add a sizes attribute, unless it's close to 100vw all the time.
59
99
  lazy:
60
100
  markup: data_auto
61
101
  formats: [webp, original]
62
- widths: [200, 400, 600, 800]
63
102
  noscript: true # add a fallback image inside a <noscript> tag.
64
- attributes:
65
- img: class="lazy"
103
+ attributes:
104
+ parent: class="lazy"
66
105
 
67
- # This is an example of how you'd get generated image and a URL, and nothing
68
- # else.
106
+ # This is an example of how you'd get a single generated image, a URL, and nothing else.
69
107
  direct:
70
108
  markup: direct_url
71
109
  fallback_format: webp
72
110
  fallback_width: 600
73
-
74
- # Here's a naked srcset. Doesn't even give you the surrounding quotes.
75
- srcset:
76
- markup: naked_srcset
77
- formats: [webp] # must be an array, even if it only has one item
78
-
79
111
  ```
@@ -1,5 +1,5 @@
1
1
  ---
2
- sort: 9
2
+ sort: 11
3
3
  ---
4
4
 
5
5
  # Fallback Image
@@ -1,5 +1,5 @@
1
1
  ---
2
- sort: 8
2
+ sort: 10
3
3
  ---
4
4
 
5
5
  # Arbitrary HTML Attributes
@@ -1,12 +1,12 @@
1
1
  ---
2
- sort: 2
2
+ sort: 4
3
3
  ---
4
4
 
5
5
  # Image Formats
6
6
 
7
- _Format:_ `format: [format1, format2, (...)]`
7
+ _Format:_ `formats: [format1, format2, (...)]`
8
8
 
9
- _Example:_ `format: [webp, original]`
9
+ _Example:_ `formats: [webp, original]`
10
10
 
11
11
  _Default_: `original`
12
12
 
@@ -1,46 +1,54 @@
1
1
  ---
2
- sort: 6
2
+ sort: 8
3
3
  ---
4
4
 
5
- # Image Quality
5
+ # Image Quality & Options
6
6
 
7
- Image quality can be as simple as a constant for all images, or can be varied based on image width
8
- and output format.
7
+ Image quality is set per-format, using `format_quality`.
9
8
 
10
- ```note
11
- For lossless webp images, set quality to 100.
12
- ```
9
+ ## Constant Quality
13
10
 
11
+ _Format:_
14
12
 
15
- ## Quality
16
-
17
- ### Constant
18
-
19
- _Format:_ `quality: 0 <= integer <= 100`
13
+ ```yaml
14
+ format_quality:
15
+ (format): 0 <= integer <= 100
16
+ (...)
17
+ ```
20
18
 
21
- _Example:_ `quality: 80`
19
+ _Example:_
22
20
 
23
- _Default:_ `75`
21
+ ```yaml
22
+ format_quality:
23
+ jpg: 75
24
+ png: 65
25
+ webp: 55
26
+ ```
24
27
 
25
- Specify an image compression level for all widths, all image formats.
28
+ _Defaults:_
26
29
 
27
- ### Variable
30
+ - webp - 50
31
+ - avif - 30
32
+ - jp2 - 30
33
+ - all others - 75
28
34
 
29
- _Format:_
35
+ ## Variable Quality
30
36
 
31
- ```yaml
32
- quality:
33
- (image width): (quality setting)
34
- (image width): (quality setting)
35
- ```
37
+ ```yaml
38
+ format_quality:
39
+ (format):
40
+ (image width): (quality setting)
41
+ (image width): (quality setting)
42
+ ```
36
43
 
37
- _Example:_
44
+ _Example:_
38
45
 
39
- ```yaml
40
- quality:
41
- 1000: 65
42
- 300: 100
43
- ```
46
+ ```yaml
47
+ format_quality:
48
+ jpg:
49
+ 1000: 65
50
+ 300: 100
51
+ ```
44
52
 
45
53
  Set a variable image quality, based on image width. Provide exactly 2 image widths and associated
46
54
  quality settings. Quality will be calculated as follows:
@@ -59,47 +67,54 @@ sacrificing image quality for low-density screens. Taking the example settings a
59
67
  * A 200px image will use a quality of 100.
60
68
  * A 500px image will use a quality of 90.
61
69
 
70
+ ## Strip Metadata
62
71
 
63
- ## Format Quality
72
+ _Format:_ `strip_metadata: (true|false)`
73
+
74
+ _Example:_ `strip_metadata: false`
75
+
76
+ _Default:_ `true`
77
+
78
+ Remove EXIF data, which can save a few tens of kilobytes per image. This is set for all formats.
79
+
80
+ ## Image Format Options
64
81
 
65
82
  _Format:_
66
83
 
67
84
  ```yaml
68
- format_quality:
69
- (format): 0 <= integer <= 100
85
+ image_options:
86
+ format:
87
+ setting1: value
88
+ setting2: value
89
+ (...)
70
90
  (...)
71
91
  ```
72
92
 
73
- ```yaml
74
- format_quality:
75
- (format):
76
- (image width): (quality setting)
77
- (image width): (quality setting)
78
- ```
79
-
80
-
81
93
  _Example:_
82
94
 
83
95
  ```yaml
84
- format_quality:
85
- jpg: 75
86
- png: 65
87
- webp: 55
96
+ image_options:
97
+ webp:
98
+ lossless: true
88
99
  ```
89
100
 
101
+ _Default:_
102
+
90
103
  ```yaml
91
- format_quality:
92
- jpg:
93
- 1000: 65
94
- 300: 100
95
- (...)
104
+ image_options:
105
+ avif:
106
+ compression: av1
107
+ speed: 8
96
108
  ```
97
109
 
98
- _Default:_ quality setting
99
-
100
- Specify quality settings for various image formats, allowing you to take advantage of webp's
101
- better compression algorithm without trashing your jpg images (for example). If you don't give a
102
- setting for a particular format it'll fall back to the `quality` setting above, and if you don't
103
- set _that_ it'll default to 75.
104
-
105
- Note that this setting can accept the same variable quality setting format as the basic `quality` setting.
110
+ Control the write options passed to libvips for each image output format. To see a list of options
111
+ available for a given image format, search for the method `vips_(format)save` in
112
+ [this](https://libvips.github.io/libvips/API/current/VipsForeignSave.html) API documentation. For
113
+ example, png options can be found by searching for `vips_pngsave()`, leading
114
+ [here](https://libvips.github.io/libvips/API/current/VipsForeignSave.html#vips-pngsave). See the
115
+ optional arguments. `avif`'s options are under `vips_heifsave()`,
116
+ [here](https://libvips.github.io/libvips/API/current/VipsForeignSave.html#vips-heifsave).
117
+
118
+ For all formats, note that
119
+ - `Q:` (quality) is handled by the settings above.
120
+ - `strip` is handled by the `strip_metadata` setting documented above.