jekyll_picture_tag 1.11.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) 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 +31 -3
  6. data/.ruby-version +1 -1
  7. data/docs/.envrc +2 -0
  8. data/docs/Gemfile +4 -2
  9. data/docs/Gemfile.lock +14 -12
  10. data/docs/_config.yml +6 -10
  11. data/docs/devs/contributing/code.md +54 -0
  12. data/docs/devs/contributing/docs.md +31 -0
  13. data/docs/devs/contributing/index.md +15 -0
  14. data/docs/devs/contributing/setup.md +33 -0
  15. data/docs/devs/contributing/testing.md +23 -0
  16. data/docs/devs/index.md +7 -0
  17. data/docs/devs/releases.md +118 -0
  18. data/docs/index.md +67 -31
  19. data/docs/logo.png +0 -0
  20. data/docs/logo.svg +880 -0
  21. data/docs/users/configuration/directories.md +34 -0
  22. data/docs/users/configuration/disable.md +24 -0
  23. data/docs/users/configuration/fast_build.md +28 -0
  24. data/docs/users/configuration/ignore_missing.md +23 -0
  25. data/docs/users/configuration/index.md +29 -0
  26. data/docs/users/configuration/kramdown_fix.md +20 -0
  27. data/docs/users/configuration/suppress_warnings.md +16 -0
  28. data/docs/users/configuration/urls.md +69 -0
  29. data/docs/users/getting_started.md +55 -0
  30. data/docs/users/index.md +7 -0
  31. data/docs/users/installation.md +32 -0
  32. data/docs/users/liquid_tag/argument_reference/alternate_images.md +18 -0
  33. data/docs/users/liquid_tag/argument_reference/attributes.md +42 -0
  34. data/docs/users/liquid_tag/argument_reference/base_image.md +12 -0
  35. data/docs/users/liquid_tag/argument_reference/crop.md +33 -0
  36. data/docs/users/liquid_tag/argument_reference/link.md +16 -0
  37. data/docs/users/liquid_tag/argument_reference/preset.md +17 -0
  38. data/docs/users/liquid_tag/argument_reference/readme.md +9 -0
  39. data/docs/users/liquid_tag/examples.md +81 -0
  40. data/docs/users/liquid_tag/index.md +31 -0
  41. data/docs/users/notes/git_lfs.md +7 -0
  42. data/docs/users/notes/github_pages.md +5 -0
  43. data/docs/users/notes/html_attributes.md +5 -0
  44. data/docs/users/notes/index.md +6 -0
  45. data/docs/users/notes/kramdown_bug.md +41 -0
  46. data/docs/users/notes/managing_images.md +21 -0
  47. data/docs/{migration.md → users/notes/migration_1.md} +1 -1
  48. data/docs/users/notes/migration_2.md +99 -0
  49. data/docs/users/presets/cropping.md +60 -0
  50. data/docs/users/presets/default.md +32 -0
  51. data/docs/users/presets/examples.md +111 -0
  52. data/docs/users/presets/fallback_image.md +28 -0
  53. data/docs/users/presets/html_attributes.md +26 -0
  54. data/docs/users/presets/image_formats.md +21 -0
  55. data/docs/users/presets/image_quality.md +120 -0
  56. data/docs/users/presets/index.md +75 -0
  57. data/docs/users/presets/link_source.md +16 -0
  58. data/docs/users/presets/markup_formats/fragments.md +48 -0
  59. data/docs/users/presets/markup_formats/javascript_friendly.md +57 -0
  60. data/docs/users/presets/markup_formats/readme.md +43 -0
  61. data/docs/users/presets/markup_formats/standard_html.md +25 -0
  62. data/docs/users/presets/media_queries.md +36 -0
  63. data/docs/users/presets/nomarkdown_override.md +17 -0
  64. data/docs/users/presets/pixel_ratio_srcsets.md +32 -0
  65. data/docs/users/presets/quality_width_graph.png +0 -0
  66. data/docs/users/presets/width_height_attributes.md +34 -0
  67. data/docs/users/presets/width_srcsets.md +123 -0
  68. data/docs/users/presets/writing_presets.md +65 -0
  69. data/docs/users/tutorial.md +97 -0
  70. data/jekyll_picture_tag.gemspec +38 -23
  71. data/lib/jekyll_picture_tag.rb +11 -10
  72. data/lib/jekyll_picture_tag/cache.rb +64 -3
  73. data/lib/jekyll_picture_tag/defaults/global.rb +18 -0
  74. data/lib/jekyll_picture_tag/defaults/presets.rb +57 -0
  75. data/lib/jekyll_picture_tag/images.rb +4 -0
  76. data/lib/jekyll_picture_tag/images/generated_image.rb +92 -0
  77. data/lib/jekyll_picture_tag/images/image_file.rb +90 -0
  78. data/lib/jekyll_picture_tag/{img_uri.rb → images/img_uri.rb} +3 -10
  79. data/lib/jekyll_picture_tag/{source_image.rb → images/source_image.rb} +44 -9
  80. data/lib/jekyll_picture_tag/instructions.rb +70 -6
  81. data/lib/jekyll_picture_tag/instructions/children/config.rb +128 -0
  82. data/lib/jekyll_picture_tag/instructions/children/context.rb +24 -0
  83. data/lib/jekyll_picture_tag/instructions/children/params.rb +90 -0
  84. data/lib/jekyll_picture_tag/instructions/children/parsers.rb +41 -0
  85. data/lib/jekyll_picture_tag/instructions/children/preset.rb +182 -0
  86. data/lib/jekyll_picture_tag/instructions/parents/conditional_instruction.rb +69 -0
  87. data/lib/jekyll_picture_tag/instructions/parents/env_instruction.rb +29 -0
  88. data/lib/jekyll_picture_tag/output_formats/basic.rb +5 -17
  89. data/lib/jekyll_picture_tag/parsers.rb +5 -0
  90. data/lib/jekyll_picture_tag/{instructions → parsers}/arg_splitter.rb +1 -1
  91. data/lib/jekyll_picture_tag/parsers/configuration.rb +28 -0
  92. data/lib/jekyll_picture_tag/{instructions → parsers}/html_attributes.rb +1 -1
  93. data/lib/jekyll_picture_tag/parsers/preset.rb +43 -0
  94. data/lib/jekyll_picture_tag/{instructions → parsers}/tag_parser.rb +15 -12
  95. data/lib/jekyll_picture_tag/router.rb +35 -93
  96. data/lib/jekyll_picture_tag/srcsets/basic.rb +4 -10
  97. data/lib/jekyll_picture_tag/utils.rb +24 -20
  98. data/lib/jekyll_picture_tag/version.rb +1 -1
  99. data/readme.md +15 -13
  100. metadata +215 -93
  101. data/.travis.yml +0 -8
  102. data/Dockerfile +0 -9
  103. data/docs/_layouts/directory.html +0 -32
  104. data/docs/assets/style.css +0 -31
  105. data/docs/contributing.md +0 -109
  106. data/docs/example_presets.md +0 -116
  107. data/docs/global_configuration.md +0 -173
  108. data/docs/installation.md +0 -45
  109. data/docs/notes.md +0 -91
  110. data/docs/output.md +0 -63
  111. data/docs/presets.md +0 -391
  112. data/docs/releases.md +0 -70
  113. data/docs/usage.md +0 -157
  114. data/jekyll-picture-tag.gemspec +0 -52
  115. data/lib/jekyll-picture-tag.rb +0 -25
  116. data/lib/jekyll_picture_tag/cache/base.rb +0 -59
  117. data/lib/jekyll_picture_tag/cache/generated.rb +0 -20
  118. data/lib/jekyll_picture_tag/cache/source.rb +0 -19
  119. data/lib/jekyll_picture_tag/defaults/global.yml +0 -11
  120. data/lib/jekyll_picture_tag/defaults/presets.yml +0 -11
  121. data/lib/jekyll_picture_tag/generated_image.rb +0 -140
  122. data/lib/jekyll_picture_tag/instructions/configuration.rb +0 -121
  123. data/lib/jekyll_picture_tag/instructions/preset.rb +0 -103
  124. data/lib/jekyll_picture_tag/instructions/set.rb +0 -71
@@ -0,0 +1,34 @@
1
+ ---
2
+ sort: 1
3
+ ---
4
+
5
+ # Directories
6
+
7
+ Define where JPT should look for source images, and where it should place
8
+ generated images.
9
+
10
+ ## Source
11
+
12
+ *Format:* `source: (directory)`
13
+
14
+ *Example:* `source: images/`
15
+
16
+ *Default:* Jekyll site root.
17
+
18
+ Base directory for your source images, relative to the Jekyll site root. For
19
+ example, if set to `images/_fullsize`:
20
+
21
+ this tag: {% raw %} `{% picture enishte/portrait.jpg %}` {% endraw %}
22
+ will use this path: `images/_fullsize/enishte/portrait.jpg`.
23
+
24
+ ## Output
25
+
26
+ *Format:* `output: (directory)`
27
+
28
+ *Example:* `output: resized_images/`
29
+
30
+ *Default*: `generated/`
31
+
32
+ Save resized, reformatted images to this directory in your compiled site. The
33
+ `source` directory structure is maintained. Relative to your compiled site
34
+ directory, which means `_site/` unless you've changed it.
@@ -0,0 +1,24 @@
1
+ ---
2
+ sort: 5
3
+ ---
4
+
5
+ # Disable Jekyll Picture Tag
6
+
7
+ *Format:* `disabled: (true|false|environment|array of environments)`
8
+
9
+ *Examples:*
10
+
11
+ - `disabled: true`
12
+
13
+ - `disabled: development`
14
+
15
+ - `disabled: [development, staging]`
16
+
17
+ *Default:* `false`
18
+
19
+ Disable image and markup generation entirely. Useful for debugging, or to speed
20
+ up site builds when you're working on something else.
21
+
22
+ Hint: If you're going to toggle this frequently, you might use a Jekyll
23
+ Environment. Set this to something like `nopics`, and then start Jekyll with
24
+ `JEKYLL_ENV=nopics bundle exec jekyll serve`.
@@ -0,0 +1,28 @@
1
+ ---
2
+ sort: 4
3
+ ---
4
+
5
+ # Fast Build
6
+
7
+ *Format:* `fast_build: (boolean|environment|environments)`
8
+
9
+ *Examples:*
10
+
11
+ - `fast_build: true`
12
+
13
+ - `fast_build: development`
14
+
15
+ - `fast_build: [development, staging]`
16
+
17
+ *Default:* `false`
18
+
19
+ *Might* make your builds faster (depending on hardware and how many images you
20
+ have) by making a tradeoff: assuming that the filename alone is enough to
21
+ uniquely identify a source image. This doesn't speed up image generation, just
22
+ detection of whether or not it's necessary.
23
+
24
+ Ordinarily, JPT computes an MD5 hash for every source image, every site build.
25
+ This ensures that if you replace one image with another, but keep the filename
26
+ the same, JPT will correctly generate images for the new file. Enable this
27
+ setting to skip MD5 hash checking and just assume that if the filename, format,
28
+ and width match then it's the right one.
@@ -0,0 +1,23 @@
1
+ ---
2
+ sort: 4
3
+ ---
4
+
5
+ # Ignore Missing Source Images
6
+
7
+ *Format:* `ignore_missing_images: (boolean|environment|environments)`
8
+
9
+ *Examples:*
10
+ - `ignore_missing_images: true`
11
+ - `ignore_missing_images: development`
12
+ - `ignore_missing_images: [development, testing]`
13
+
14
+ *Default:* `false`
15
+
16
+ Normally, JPT will raise an error if a source image is missing, causing the
17
+ entire site build to fail. This setting allows you to bypass this behavior and
18
+ continue the build, either for certain build environments or all the time.
19
+
20
+ I highly encourage you to set this to `development`, and set the Jekyll build
21
+ environment to `production` when you build for production so you don't shoot
22
+ yourself in the foot. You can read more about Jekyll environments
23
+ [here](https://jekyllrb.com/docs/configuration/environments/).
@@ -0,0 +1,29 @@
1
+ ---
2
+ sort: 1
3
+ ---
4
+ # Global Configuration
5
+
6
+ **All configuration is optional**. If you are happy with the defaults, you don't
7
+ have to touch a single yml file.
8
+
9
+ Global settings are stored under the `picture:` key in `/_config.yml`.
10
+
11
+ **Example:**
12
+
13
+ ```yml
14
+ # _config.yml
15
+
16
+ (...)
17
+
18
+ picture:
19
+ source: "assets/images/fullsize"
20
+ output: "assets/images/generated"
21
+ suppress_warnings: true
22
+ (...)
23
+
24
+ (...)
25
+ ```
26
+
27
+ ## Reference
28
+
29
+ {% include list.liquid %}
@@ -0,0 +1,20 @@
1
+ ---
2
+ sort: 6
3
+ ---
4
+
5
+ # Kramdown Fix
6
+
7
+ *Format:* `nomarkdown: (true|false)`
8
+
9
+ *Example:* `nomarkdown: false`
10
+
11
+ *Default:* `true`
12
+
13
+ Whether or not to surround j-p-t's output with a
14
+ `{::nomarkdown}..{:/nomarkdown}` block when called from within a markdown file.
15
+ When false, JPT will never add the wrapper. When true, JPT will add it only when
16
+ it believes it's necessary, though it's not 100% accurate at making this
17
+ determination.
18
+
19
+ This setting is overridden by the same setting in a preset. See [this note]({{
20
+ site.baseurl }}/users/notes/kramdown_bug) for more detailed information.
@@ -0,0 +1,16 @@
1
+ ---
2
+ sort: 3
3
+ ---
4
+
5
+ # Suppress Warnings
6
+
7
+ *Format:* `suppress_warnings: (true|false)`
8
+
9
+ *Example:* `suppress_warnings: true`
10
+
11
+ *Default*: `false`
12
+
13
+ Jekyll Picture Tag will warn you in a few different scenarios, such as when your
14
+ base image is smaller than one of the sizes in your preset. (Note that Jekyll
15
+ Picture Tag will never resize an image to be larger than its source). Set this
16
+ value to `true`, and these warnings will not be shown.
@@ -0,0 +1,69 @@
1
+ ---
2
+ sort: 2
3
+ ---
4
+
5
+ # URLs
6
+
7
+ ## Relative or Absolute
8
+
9
+ *Format:* `relative_url: (true|false)`
10
+
11
+ *Example:* `relative_url: false`
12
+
13
+ *Default*: `true`
14
+
15
+ Whether to use relative (`/generated/test(...).jpg`) or absolute
16
+ (`https://example.com/generated/test(...).jpg`) urls in your src and srcset attributes.
17
+
18
+ ## Baseurl Key
19
+
20
+ *Format:* `baseurl_key: (string)`
21
+
22
+ *Example:* `baseurl_key: baseurl_root`
23
+
24
+ *Default*: `baseurl`
25
+
26
+ Some plugins, such as
27
+ [jekyll-multiple-languages-plugin](https://github.com/kurtsson/jekyll-multiple-languages-plugin),
28
+ work by modifying the standard `baseurl` setting, which can break JPT's images. It offers a new
29
+ setting, `baseurl_root`, which serves as the original `baseurl` setting without a language prefix.
30
+ Using `baseurl_key`, you can direct JPT to use that setting instead.
31
+
32
+ ## Ignore Baseurl
33
+
34
+ *Format:* `ignore_baseurl: (true|false)`
35
+
36
+ *Example:* `ignore_baseurl: true`
37
+
38
+ *Default*: `false`
39
+
40
+ Depending on your other plugins and configuration, it may be useful for JPT to ignore the baseurl
41
+ setting entirely.
42
+
43
+ ## CDN URL
44
+
45
+ Use for images that are hosted at a different domain or subdomain than the Jekyll site root.
46
+ Overrides `relative_url`.
47
+
48
+ *Format:* `cdn_url: (url)`
49
+
50
+ *Example:* `cdn_url: https://cdn.example.com`
51
+
52
+ *Default*: none
53
+
54
+ ## CDN Environments
55
+
56
+ It's likely that if you're using a CDN, you may not want to use it in your local development
57
+ environment. This allows you to build a site with local images while in development, and still push
58
+ to a CDN when you build for production by specifying a different
59
+ [environment](https://jekyllrb.com/docs/configuration/environments/).
60
+
61
+ *Format:* `cdn_environments: (array of strings)`
62
+
63
+ *Example:* `cdn_environments: ['production', 'staging']`
64
+
65
+ *Default*: `['production']`
66
+
67
+ **Note that the default jekyll environment is `development`**, meaning that if you only set
68
+ `cdn_url` and run `jekyll serve` or `jekyll build`, nothing will change. Either run
69
+ `JEKYLL_ENV=production bundle exec jekyll build`, or add `development` to this setting.
@@ -0,0 +1,55 @@
1
+ ---
2
+ sort: 2
3
+ ---
4
+
5
+ # Getting started
6
+
7
+ Firstly, let me warn you that responsive images are somewhat complicated, and fall squarely into
8
+ "proper web development" territory. To do this well, you will need to do some learning. The default
9
+ settings are a starting point, meant to get you up and running with something reasonable while
10
+ minimizing unexpected behavior.
11
+
12
+ Here are some good guides:
13
+
14
+ * [MDN Responsive Images guide](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images)
15
+ * [CSS Tricks Guide to Reponsive Images](https://css-tricks.com/a-guide-to-the-responsive-images-syntax-in-html/)
16
+ * [Cloud 4 - Responsive Images 101](https://cloudfour.com/thinks/responsive-images-101-definitions/)
17
+
18
+ ## Step 1: Customize global settings
19
+
20
+ JPT's [global configuration](configuration) happens under the `picture:` key in `_config.yml`. The
21
+ defaults are probably fine, though you may want to configure the input and output
22
+ [directories](configuration/directories).
23
+
24
+ ## Step 2: Test & Learn
25
+
26
+ - If you're not already familiar, there's a short [tutorial](tutorial) to get you started with the basics.
27
+ - Look over the [example presets](presets/examples)
28
+ - Look over the [example liquid tags](liquid_tag/examples) and [instructions](liquid_tag).
29
+
30
+ ## Step 3: Add breakpoints
31
+
32
+ Once you have a feel for how this plugin works, it's time to adapt it to your particular site. The
33
+ built-in `jpt-` media queries probably don't quite fit your layout; Find whatever breakpoints your
34
+ css uses, and tell JPT about them:
35
+
36
+ 1. Create `_data/picture.yml`
37
+ 2. List them under the `media_queries:` key. Give them easy-to-remember names, and wrap them in
38
+ single quotes.
39
+
40
+ ```yaml
41
+ # _data/picture.yml
42
+
43
+ media_queries:
44
+ (name): '(media query)'
45
+ (...)
46
+
47
+ ```
48
+
49
+ If you're using bootstrap or something, you don't need to plug in every single breakpoint they have,
50
+ just a handful that you'll actually use.
51
+
52
+ ## Step 4: Write presets
53
+
54
+ From there, it's time to [write your own presets](presets). Start with the `default`, and then move
55
+ on to cover all the different ways you use images in your site.
@@ -0,0 +1,7 @@
1
+ ---
2
+ sort: 1
3
+ ---
4
+
5
+ # Usage
6
+
7
+ {% include list.liquid %}
@@ -0,0 +1,32 @@
1
+ ---
2
+ sort: 1
3
+ ---
4
+
5
+ # Installation
6
+
7
+ 1. Add `jekyll_picture_tag` to your Gemfile in the `:jekyll_plugins` group.
8
+
9
+ ```note
10
+ It's NOT `jekyll-picture-tag`.
11
+ ```
12
+
13
+ ```ruby
14
+ # Gemfile
15
+
16
+ gem 'jekyll', ~> '4.0'
17
+
18
+ group :jekyll_plugins do
19
+ # (other jekyll plugins)
20
+ gem 'jekyll_picture_tag', ~> '2.0'
21
+ end
22
+ ```
23
+
24
+ 2. Run `$ bundle install`
25
+ 3. Install `libvips`. Most package managers know about it, otherwise it can be found
26
+ [here](https://libvips.github.io/libvips/install.html).
27
+ 4. Install libvips dependencies for all image formats you will use, such as `libpng`, `libwebp`,
28
+ `libjpeg`, and `libheif` (for avif). Note that if you use a deployment or CI service, these
29
+ dependencies will be required there as well.
30
+ 5. Optional: Install `ImageMagick` for additional image formats. If vips runs into an image format
31
+ it can't handle (jp2 on my particular installation), JPT will instruct it to try ImageMagick
32
+ instead.
@@ -0,0 +1,18 @@
1
+ ---
2
+ sort: 4
3
+ ---
4
+
5
+ # Alternate images
6
+
7
+ _Format:_ `(media_query): (filename) [crop] [gravity] (...)`
8
+
9
+ _Example:_ `tablet: img_cropped.jpg mobile: img_cropped_more.jpg`
10
+
11
+ Optionally specify any number of alternate base images for given
12
+ [media_queries]({{ site.baseurl }}/users/presets/media_queries). This is called
13
+ [art direction](http://usecases.responsiveimages.org/#art-direction), and is one
14
+ of JPT's strongest features.
15
+
16
+ Give your images in order of ascending specificity (The first image is the
17
+ most general). They will be provided to the browser in reverse order, and it
18
+ will select the first one with an applicable media query.
@@ -0,0 +1,42 @@
1
+ ---
2
+ sort: 6
3
+ ---
4
+
5
+ # Attributes
6
+
7
+ Optionally specify any number of HTML attributes. These will be combined with
8
+ any which you've set in a preset.
9
+
10
+ All arguments which begin with `--` (including `--link`) must be at the end of
11
+ the liquid tag, but they can be given in any order.
12
+
13
+ - **`--alt`**
14
+
15
+ _Format:_ `--alt (alt text)`
16
+
17
+ _Example:_ `--alt Here is my alt text!`
18
+
19
+ Convenience shortcut for `--img alt="..."`
20
+
21
+ - **`--(element)`**
22
+
23
+ _Format:_ `--(picture|img|source|a|parent) (Standard HTML attributes)`
24
+
25
+ _Example:_ `--img class="awesome-fade-in" id="coolio" --a data-awesomeness="11"`
26
+
27
+ Apply attributes to a given HTML element. Your options are:
28
+
29
+ - `--picture`
30
+ - `--img`
31
+ - `--source`
32
+ - `--a` (anchor tag)
33
+ - `--parent`
34
+
35
+ `--parent` will be applied to the `<picture>` if present, otherwise the
36
+ `<img>`; useful when using an `auto` output format.
37
+
38
+ ```note
39
+ Attributes that are set here for elements which don't occur in the selected
40
+ markup format will be ignored (e.g. adding `--picture class="cool-css"` with a
41
+ preset that does not use a `<picture>` tag).
42
+ ```
@@ -0,0 +1,12 @@
1
+ ---
2
+ sort: 2
3
+ ---
4
+
5
+ # Base Image (Required)
6
+
7
+ Can be any raster image (as long as you have the required ImageMagick delegate).
8
+ Relative to Jekyll's root directory, or the `source` [setting]({{ site.baseurl
9
+ }}/users/configuration/directories) if you've configured it.
10
+
11
+ For filenames with spaces, either use double quotes (`"my image.jpg"`) or a
12
+ backslash (`my\ image.jpg`).
@@ -0,0 +1,33 @@
1
+ ---
2
+ sort: 3
3
+ ---
4
+
5
+ # Crop
6
+
7
+ Crop an image to a given aspect ratio. This argument is given as a `crop` and (optionally) a `keep`
8
+ setting. The values given here will override the preset settings (if present), can be given after
9
+ every image, and apply only to the preceding image.
10
+
11
+ `crop` is given as an aspect ratio in the `width:height` format.
12
+
13
+ `keep` sets which portion of the image to keep; it's the
14
+ ['interestingness'](https://libvips.github.io/libvips/API/current/libvips-conversion.html#VipsInteresting)
15
+ setting passed to the [libvips
16
+ smartcrop](https://libvips.github.io/libvips/API/current/libvips-conversion.html#vips-smartcrop)
17
+ function. Your options are:
18
+
19
+ * `attention` - automagically keep parts likely to draw human attention. **Default**
20
+ * `entropy` - Crop out the parts with the least variation.
21
+ * `center` or `centre` - Keep the middle part.
22
+
23
+ ```note
24
+ Cropping happens before resizing; the preset `widths` setting is a post-crop value.
25
+ ```
26
+
27
+ More fine-grained control is beyond the scope of this plugin. I'm not writing an image editor here!
28
+
29
+ ## Examples
30
+
31
+ - `16:9`
32
+ - `1:1 entropy`
33
+ - `3:2 center`