jekyll_picture_tag 1.9.0 → 1.12.0
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/.travis.yml +4 -7
- data/Dockerfile +9 -0
- data/docs/Gemfile +4 -2
- data/docs/Gemfile.lock +186 -89
- data/docs/_config.yml +6 -10
- data/docs/devs/contributing/code.md +44 -0
- data/docs/devs/contributing/docs.md +13 -0
- data/docs/devs/contributing/index.md +15 -0
- data/docs/devs/contributing/setup.md +13 -0
- data/docs/devs/contributing/testing.md +41 -0
- data/docs/devs/index.md +7 -0
- data/docs/{releases.md → devs/releases.md} +35 -13
- data/docs/index.md +58 -36
- data/docs/users/configuration/cdn.md +35 -0
- data/docs/users/configuration/directories.md +34 -0
- data/docs/users/configuration/disable.md +24 -0
- data/docs/users/configuration/fast_build.md +28 -0
- data/docs/users/configuration/ignore_missing.md +23 -0
- data/docs/users/configuration/index.md +29 -0
- data/docs/users/configuration/kramdown_fix.md +20 -0
- data/docs/users/configuration/relative_urls.md +15 -0
- data/docs/users/configuration/suppress_warnings.md +16 -0
- data/docs/users/index.md +7 -0
- data/docs/users/installation.md +52 -0
- data/docs/users/liquid_tag/argument_reference/alternate_images.md +18 -0
- data/docs/users/liquid_tag/argument_reference/attributes.md +42 -0
- data/docs/users/liquid_tag/argument_reference/base_image.md +12 -0
- data/docs/users/liquid_tag/argument_reference/crop.md +48 -0
- data/docs/users/liquid_tag/argument_reference/link.md +16 -0
- data/docs/users/liquid_tag/argument_reference/preset.md +17 -0
- data/docs/users/liquid_tag/argument_reference/readme.md +9 -0
- data/docs/users/liquid_tag/examples.md +81 -0
- data/docs/users/liquid_tag/index.md +31 -0
- data/docs/users/notes/git_lfs.md +7 -0
- data/docs/users/notes/github_pages.md +5 -0
- data/docs/users/notes/html_attributes.md +5 -0
- data/docs/users/notes/index.md +6 -0
- data/docs/users/notes/input_checking.md +6 -0
- data/docs/users/notes/kramdown_bug.md +41 -0
- data/docs/users/notes/managing_images.md +21 -0
- data/docs/{migration.md → users/notes/migration.md} +0 -0
- data/docs/users/presets/cropping.md +61 -0
- data/docs/users/presets/default.md +23 -0
- data/docs/users/presets/examples.md +79 -0
- data/docs/users/presets/fallback_image.md +28 -0
- data/docs/users/presets/html_attributes.md +26 -0
- data/docs/users/presets/image_formats.md +21 -0
- data/docs/users/presets/image_quality.md +43 -0
- data/docs/users/presets/index.md +101 -0
- data/docs/users/presets/link_source.md +16 -0
- data/docs/users/presets/markup_formats/fragments.md +48 -0
- data/docs/users/presets/markup_formats/javascript_friendly.md +57 -0
- data/docs/users/presets/markup_formats/readme.md +43 -0
- data/docs/users/presets/markup_formats/standard_html.md +25 -0
- data/docs/users/presets/media_queries.md +36 -0
- data/docs/users/presets/nomarkdown_override.md +17 -0
- data/docs/users/presets/pixel_ratio_srcsets.md +32 -0
- data/docs/users/presets/width_height_attributes.md +34 -0
- data/docs/users/presets/width_srcsets.md +85 -0
- data/jekyll_picture_tag.gemspec +1 -1
- data/lib/jekyll_picture_tag.rb +1 -0
- data/lib/jekyll_picture_tag/cache.rb +3 -0
- data/lib/jekyll_picture_tag/cache/base.rb +59 -0
- data/lib/jekyll_picture_tag/cache/generated.rb +20 -0
- data/lib/jekyll_picture_tag/cache/source.rb +19 -0
- data/lib/jekyll_picture_tag/defaults/presets.yml +2 -0
- data/lib/jekyll_picture_tag/generated_image.rb +52 -41
- data/lib/jekyll_picture_tag/img_uri.rb +1 -0
- data/lib/jekyll_picture_tag/instructions.rb +1 -0
- data/lib/jekyll_picture_tag/instructions/arg_splitter.rb +69 -0
- data/lib/jekyll_picture_tag/instructions/configuration.rb +1 -1
- data/lib/jekyll_picture_tag/instructions/preset.rb +40 -15
- data/lib/jekyll_picture_tag/instructions/set.rb +23 -9
- data/lib/jekyll_picture_tag/instructions/tag_parser.rb +59 -69
- data/lib/jekyll_picture_tag/output_formats/basic.rb +34 -15
- data/lib/jekyll_picture_tag/output_formats/img.rb +11 -0
- data/lib/jekyll_picture_tag/output_formats/picture.rb +22 -0
- data/lib/jekyll_picture_tag/router.rb +9 -0
- data/lib/jekyll_picture_tag/source_image.rb +60 -44
- data/lib/jekyll_picture_tag/srcsets/basic.rb +29 -7
- data/lib/jekyll_picture_tag/utils.rb +18 -0
- data/lib/jekyll_picture_tag/version.rb +1 -1
- data/readme.md +40 -16
- metadata +67 -20
- data/docs/_layouts/directory.html +0 -32
- data/docs/assets/style.css +0 -31
- data/docs/contributing.md +0 -75
- data/docs/example_presets.md +0 -116
- data/docs/global_configuration.md +0 -173
- data/docs/installation.md +0 -30
- data/docs/notes.md +0 -91
- data/docs/output.md +0 -63
- data/docs/presets.md +0 -309
- data/docs/usage.md +0 -113
@@ -6,6 +6,10 @@ module PictureTag
|
|
6
6
|
class Basic
|
7
7
|
include ObjectiveElements
|
8
8
|
|
9
|
+
def to_s
|
10
|
+
wrap(base_markup).to_s
|
11
|
+
end
|
12
|
+
|
9
13
|
# Used for both the fallback image, and for the complete markup.
|
10
14
|
def build_base_img
|
11
15
|
img = SingleTag.new 'img'
|
@@ -23,10 +27,6 @@ module PictureTag
|
|
23
27
|
img
|
24
28
|
end
|
25
29
|
|
26
|
-
def to_s
|
27
|
-
wrap(base_markup).to_s
|
28
|
-
end
|
29
|
-
|
30
30
|
private
|
31
31
|
|
32
32
|
# Handles various wrappers around basic markup
|
@@ -71,22 +71,30 @@ module PictureTag
|
|
71
71
|
|
72
72
|
# GeneratedImage class, not HTML
|
73
73
|
def build_fallback_image
|
74
|
-
|
74
|
+
return fallback_candidate if fallback_candidate.exists?
|
75
|
+
|
76
|
+
image = GeneratedImage.new(
|
75
77
|
source_file: PictureTag.source_images.first,
|
76
78
|
format: PictureTag.fallback_format,
|
77
|
-
width:
|
79
|
+
width: checked_fallback_width,
|
80
|
+
crop: PictureTag.crop,
|
81
|
+
gravity: PictureTag.gravity
|
78
82
|
)
|
79
83
|
|
80
|
-
|
84
|
+
image.generate
|
81
85
|
|
82
|
-
|
86
|
+
image
|
83
87
|
end
|
84
88
|
|
85
|
-
|
86
|
-
|
89
|
+
# It's only a candidate, because we don't know if the fallback width
|
90
|
+
# setting is larger than the source file.
|
91
|
+
def fallback_candidate
|
92
|
+
@fallback_candidate ||= GeneratedImage.new(
|
87
93
|
source_file: PictureTag.source_images.first,
|
88
94
|
format: PictureTag.fallback_format,
|
89
|
-
width:
|
95
|
+
width: PictureTag.fallback_width,
|
96
|
+
crop: PictureTag.crop,
|
97
|
+
gravity: PictureTag.gravity
|
90
98
|
)
|
91
99
|
end
|
92
100
|
|
@@ -107,15 +115,26 @@ module PictureTag
|
|
107
115
|
content.add_parent anchor
|
108
116
|
end
|
109
117
|
|
118
|
+
def source
|
119
|
+
PictureTag.source_images.first
|
120
|
+
end
|
121
|
+
|
122
|
+
def source_width
|
123
|
+
if PictureTag.crop
|
124
|
+
fallback_candidate.source_width
|
125
|
+
else
|
126
|
+
source.width
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
110
130
|
def checked_fallback_width
|
111
|
-
source = PictureTag.source_images.first
|
112
131
|
target = PictureTag.fallback_width
|
113
132
|
|
114
|
-
if target >
|
133
|
+
if target > source_width
|
115
134
|
Utils.warning "#{source.shortname} is smaller than the " \
|
116
|
-
"requested fallback width of #{target}px. Using #{
|
135
|
+
"requested fallback width of #{target}px. Using #{source_width}" \
|
117
136
|
' px instead.'
|
118
|
-
|
137
|
+
source_width
|
119
138
|
else
|
120
139
|
target
|
121
140
|
end
|
@@ -3,6 +3,8 @@ module PictureTag
|
|
3
3
|
# Represents a bare <img> tag with a srcset attribute.
|
4
4
|
# Used when <picture> is unnecessary.
|
5
5
|
class Img < Basic
|
6
|
+
private
|
7
|
+
|
6
8
|
def srcset
|
7
9
|
@srcset ||= build_srcset(
|
8
10
|
PictureTag.source_images.first, PictureTag.formats.first
|
@@ -17,8 +19,17 @@ module PictureTag
|
|
17
19
|
|
18
20
|
img.attributes << PictureTag.html_attributes['parent']
|
19
21
|
|
22
|
+
add_dimensions(img, srcset)
|
23
|
+
|
20
24
|
img
|
21
25
|
end
|
26
|
+
|
27
|
+
def add_dimensions(img, srcset)
|
28
|
+
return unless PictureTag.preset['dimension_attributes']
|
29
|
+
|
30
|
+
img.width = srcset.width_attribute
|
31
|
+
img.height = srcset.height_attribute
|
32
|
+
end
|
22
33
|
end
|
23
34
|
end
|
24
35
|
end
|
@@ -3,7 +3,13 @@ module PictureTag
|
|
3
3
|
# Represents a <picture> tag, enclosing at least 2 <source> tags and an
|
4
4
|
# <img> tag.
|
5
5
|
class Picture < Basic
|
6
|
+
private
|
7
|
+
|
6
8
|
def srcsets
|
9
|
+
@srcsets ||= build_srcsets
|
10
|
+
end
|
11
|
+
|
12
|
+
def build_srcsets
|
7
13
|
formats = PictureTag.formats
|
8
14
|
# Source images are provided in reverse order and must be flipped:
|
9
15
|
images = PictureTag.source_images.reverse
|
@@ -37,6 +43,22 @@ module PictureTag
|
|
37
43
|
source
|
38
44
|
end
|
39
45
|
|
46
|
+
def build_base_img
|
47
|
+
img = super
|
48
|
+
|
49
|
+
# Only add source dimensions if there is a single source image.
|
50
|
+
# Currently you can't use both art direction and intrinsic image sizes.
|
51
|
+
if PictureTag.preset['dimension_attributes'] &&
|
52
|
+
PictureTag.source_images.length == 1
|
53
|
+
img.attributes << {
|
54
|
+
width: srcsets.first.width_attribute,
|
55
|
+
height: srcsets.first.height_attribute
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
img
|
60
|
+
end
|
61
|
+
|
40
62
|
def base_markup
|
41
63
|
picture = DoubleTag.new(
|
42
64
|
'picture',
|
@@ -9,6 +9,7 @@ module PictureTag
|
|
9
9
|
# gets big, I'll refactor.
|
10
10
|
module Router
|
11
11
|
attr_accessor :instructions, :context
|
12
|
+
|
12
13
|
# Context forwarding
|
13
14
|
|
14
15
|
# Global site data
|
@@ -47,6 +48,14 @@ module PictureTag
|
|
47
48
|
@instructions.source_images
|
48
49
|
end
|
49
50
|
|
51
|
+
def crop(media = nil)
|
52
|
+
@instructions.crop(media)
|
53
|
+
end
|
54
|
+
|
55
|
+
def gravity(media = nil)
|
56
|
+
@instructions.gravity(media)
|
57
|
+
end
|
58
|
+
|
50
59
|
# Config Forwarding
|
51
60
|
|
52
61
|
def source_dir
|
@@ -3,84 +3,100 @@ module PictureTag
|
|
3
3
|
# advantage by storing expensive file reads and writes in instance variables,
|
4
4
|
# to be reused by many different generated images.
|
5
5
|
class SourceImage
|
6
|
-
attr_reader :
|
7
|
-
|
6
|
+
attr_reader :shortname, :missing, :media_preset
|
7
|
+
|
8
8
|
include MiniMagick
|
9
9
|
|
10
10
|
def initialize(relative_filename, media_preset = nil)
|
11
|
+
# /home/dave/my_blog/assets/images/somefolder/myimage.jpg
|
12
|
+
# ^^^^^^^^^^^^^^^^^^^^^^
|
11
13
|
@shortname = relative_filename
|
12
|
-
@name = grab_file relative_filename
|
13
14
|
@media_preset = media_preset
|
15
|
+
|
16
|
+
@missing = missing?
|
17
|
+
check_cache
|
18
|
+
end
|
19
|
+
|
20
|
+
def digest
|
21
|
+
@digest ||= cache[:digest] || ''
|
14
22
|
end
|
15
23
|
|
16
24
|
def width
|
17
|
-
@width ||=
|
18
|
-
999_999
|
19
|
-
else
|
20
|
-
image.width
|
21
|
-
end
|
25
|
+
@width ||= cache[:width] || 999_999
|
22
26
|
end
|
23
27
|
|
24
|
-
def
|
25
|
-
@
|
26
|
-
'x' * 6
|
27
|
-
elsif PictureTag.fast_build? && @digest_guess
|
28
|
-
# Digest guess will be handed off to this class by the first
|
29
|
-
# generated image which needs it (via attr_accessor).
|
30
|
-
@digest_guess
|
31
|
-
else
|
32
|
-
Digest::MD5.hexdigest(File.read(@name))[0..5]
|
33
|
-
end
|
28
|
+
def height
|
29
|
+
@height ||= cache[:height] || 999_999
|
34
30
|
end
|
35
31
|
|
36
|
-
#
|
32
|
+
# /home/dave/my_blog/assets/images/somefolder/myimage.jpg
|
33
|
+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
34
|
+
def name
|
35
|
+
@name ||= File.join(PictureTag.source_dir, @shortname)
|
36
|
+
end
|
37
|
+
|
38
|
+
# /home/dave/my_blog/assets/images/somefolder/myimage.jpg
|
39
|
+
# ^^^^^^^^^^^^^^^^^^
|
37
40
|
def base_name
|
38
41
|
@shortname.delete_suffix File.extname(@shortname)
|
39
42
|
end
|
40
43
|
|
41
|
-
#
|
44
|
+
# /home/dave/my_blog/assets/images/somefolder/myimage.jpg
|
45
|
+
# ^^^
|
42
46
|
def ext
|
43
|
-
|
44
|
-
@ext ||= File.extname(@name)[1..-1].downcase
|
47
|
+
@ext ||= File.extname(name)[1..-1].downcase
|
45
48
|
end
|
46
49
|
|
47
50
|
private
|
48
51
|
|
49
|
-
def
|
50
|
-
@
|
52
|
+
def cache
|
53
|
+
@cache ||= Cache::Source.new(@shortname)
|
51
54
|
end
|
52
55
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
if File.exist? source_name
|
58
|
-
@missing = false
|
56
|
+
def missing?
|
57
|
+
if File.exist? name
|
58
|
+
false
|
59
59
|
|
60
60
|
elsif PictureTag.continue_on_missing?
|
61
|
-
|
62
|
-
|
61
|
+
Utils.warning(missing_image_warning)
|
62
|
+
true
|
63
63
|
|
64
64
|
else
|
65
|
-
raise ArgumentError, missing_image_error
|
65
|
+
raise ArgumentError, missing_image_error
|
66
66
|
end
|
67
|
+
end
|
67
68
|
|
68
|
-
|
69
|
+
def check_cache
|
70
|
+
return if @missing
|
71
|
+
return if cache[:digest] && PictureTag.fast_build?
|
72
|
+
|
73
|
+
update_cache if source_digest != cache[:digest]
|
69
74
|
end
|
70
75
|
|
71
|
-
def
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
+
def update_cache
|
77
|
+
cache[:digest] = source_digest
|
78
|
+
cache[:width] = image.width
|
79
|
+
cache[:height] = image.height
|
80
|
+
|
81
|
+
cache.write
|
82
|
+
end
|
83
|
+
|
84
|
+
def image
|
85
|
+
@image ||= Image.open(name)
|
86
|
+
end
|
87
|
+
|
88
|
+
def source_digest
|
89
|
+
@source_digest ||= Digest::MD5.hexdigest(File.read(name))
|
90
|
+
end
|
91
|
+
|
92
|
+
def missing_image_warning
|
93
|
+
"JPT Could not find #{name}. Your site will have broken images. Continuing."
|
76
94
|
end
|
77
95
|
|
78
|
-
def missing_image_error
|
96
|
+
def missing_image_error
|
79
97
|
<<~HEREDOC
|
80
|
-
|
81
|
-
|
82
|
-
true" in "_config.yml". This setting can also accept a jekyll build
|
83
|
-
environment, or an array of environments.
|
98
|
+
Could not find #{name}. You can force the build to continue anyway by
|
99
|
+
setting "picture: ignore_missing_images: true" in "_config.yml".
|
84
100
|
HEREDOC
|
85
101
|
end
|
86
102
|
end
|
@@ -23,6 +23,7 @@ module PictureTag
|
|
23
23
|
@format ||= files.first.format
|
24
24
|
end
|
25
25
|
|
26
|
+
# GeneratedImage class
|
26
27
|
def files
|
27
28
|
@files ||= build_files
|
28
29
|
end
|
@@ -51,6 +52,14 @@ module PictureTag
|
|
51
52
|
"(#{PictureTag.media_presets[@media]})"
|
52
53
|
end
|
53
54
|
|
55
|
+
def width_attribute
|
56
|
+
files.first.source_width.to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
def height_attribute
|
60
|
+
files.first.source_height.to_s
|
61
|
+
end
|
62
|
+
|
54
63
|
private
|
55
64
|
|
56
65
|
def build_files
|
@@ -65,26 +74,37 @@ module PictureTag
|
|
65
74
|
end
|
66
75
|
|
67
76
|
def checked_targets
|
68
|
-
if target_files.any? { |f| f.width >
|
77
|
+
if target_files.any? { |f| f.width > source_width }
|
69
78
|
|
70
79
|
small_source_warn
|
71
80
|
|
72
|
-
files = target_files.reject { |f| f.width >=
|
73
|
-
files.push(generate_file(
|
81
|
+
files = target_files.reject { |f| f.width >= source_width }
|
82
|
+
files.push(generate_file(source_width))
|
74
83
|
end
|
75
84
|
|
76
85
|
files || target_files
|
77
86
|
end
|
78
87
|
|
88
|
+
def source_width
|
89
|
+
@source_width ||= if PictureTag.crop(@media)
|
90
|
+
target_files.first.source_width
|
91
|
+
else
|
92
|
+
@source_image.width
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
79
96
|
def target_files
|
80
97
|
@target_files ||= widths.collect { |w| generate_file(w) }
|
81
98
|
end
|
82
99
|
|
83
100
|
def small_source_warn
|
84
101
|
Utils.warning(
|
85
|
-
|
86
|
-
|
87
|
-
|
102
|
+
<<~HEREDOC
|
103
|
+
#{@source_image.shortname}
|
104
|
+
is #{source_width}px wide (after cropping, if applicable),
|
105
|
+
smaller than at least one size in the set #{widths}.
|
106
|
+
Will not enlarge.
|
107
|
+
HEREDOC
|
88
108
|
)
|
89
109
|
end
|
90
110
|
|
@@ -92,7 +112,9 @@ module PictureTag
|
|
92
112
|
GeneratedImage.new(
|
93
113
|
source_file: @source_image,
|
94
114
|
width: width,
|
95
|
-
format: @input_format
|
115
|
+
format: @input_format,
|
116
|
+
crop: PictureTag.crop(@media),
|
117
|
+
gravity: PictureTag.gravity(@media)
|
96
118
|
)
|
97
119
|
end
|
98
120
|
end
|
@@ -2,6 +2,24 @@ module PictureTag
|
|
2
2
|
# This is a little module to hold logic that doesn't fit other places. If it
|
3
3
|
# starts getting big, refactor.
|
4
4
|
module Utils
|
5
|
+
# These are valid ImageMagick gravity arguments (relevant to our use
|
6
|
+
# case):
|
7
|
+
GRAVITIES =
|
8
|
+
%w[center
|
9
|
+
north
|
10
|
+
northeast
|
11
|
+
east
|
12
|
+
southeast
|
13
|
+
south
|
14
|
+
southwest
|
15
|
+
west
|
16
|
+
northwest].freeze
|
17
|
+
|
18
|
+
# This is an attempt to recognize valid imagemagick geometry arguments
|
19
|
+
# with regex. It only tries to match values which don't preserve aspect
|
20
|
+
# ratio, as they're the ones people might actually need here.
|
21
|
+
GEOMETRY_REGEX = /\A\d*%?[x:]?\d*[%!]?([+-]\d+){,2}\Z/i.freeze
|
22
|
+
|
5
23
|
class << self
|
6
24
|
# Configure Jekyll to keep our generated files
|
7
25
|
def keep_files
|
data/readme.md
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
# Jekyll Picture Tag
|
2
2
|
|
3
|
-
**
|
3
|
+
**Responsive Images done correctly.**
|
4
4
|
|
5
|
-
It's
|
6
|
-
|
7
|
-
automated.
|
5
|
+
It's simple to throw a photo on a page and call it a day, but doing justice to users on all
|
6
|
+
different browsers and devices is tedious and tricky. Tedious, tricky things should be automated.
|
8
7
|
|
9
|
-
Jekyll Picture Tag
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
Jekyll Picture Tag automatically builds cropped, resized, and reformatted images, builds several
|
9
|
+
kinds of markup, offers extensive configuration while requiring none, and solves both the art
|
10
|
+
direction and resolution switching problems with a little YAML configuration and a simple template
|
11
|
+
tag.
|
13
12
|
|
14
13
|
## Why use Responsive Images?
|
15
14
|
|
16
|
-
**Performance:** The fastest sites are static sites, but
|
17
|
-
the top of a blog post you
|
18
|
-
|
15
|
+
**Performance:** The fastest sites are static sites, but if you plonk a 2mb picture of your dog at
|
16
|
+
the top of a blog post you throw it all away. Responsive images allow you to keep your site fast,
|
17
|
+
without compromising image quality.
|
19
18
|
|
20
19
|
**Design:** Your desktop image may not work well on mobile, regardless of its resolution. We often
|
21
20
|
want to do more than just resize images for different screen sizes, we want to crop them or use a
|
@@ -24,15 +23,40 @@ different image entirely.
|
|
24
23
|
## Why use Jekyll Picture Tag?
|
25
24
|
|
26
25
|
**Developer Sanity:** If you want to serve multiple images in multiple formats and resolutions, you
|
27
|
-
have a litany of markup to write and a big pile of images to generate. Jekyll Picture
|
28
|
-
responsive images minion - give it simple instructions and it'll handle the rest.
|
26
|
+
have a litany of markup to write and a big pile of images to generate and organize. Jekyll Picture
|
27
|
+
Tag is your responsive images minion - give it simple instructions and it'll handle the rest.
|
29
28
|
|
30
29
|
## Features
|
31
30
|
|
32
|
-
*
|
33
|
-
*
|
34
|
-
*
|
31
|
+
* Generate piles of cropped, resized, and converted image files.
|
32
|
+
* Generate corresponding markup in several different formats.
|
33
|
+
* Configure it easily, or not at all.
|
34
|
+
* Make Lighthouse happy.
|
35
35
|
|
36
36
|
## Documentation:
|
37
37
|
|
38
38
|
https://rbuchberger.github.io/jekyll_picture_tag/
|
39
|
+
|
40
|
+
## Changelog:
|
41
|
+
|
42
|
+
https://rbuchberger.github.io/jekyll_picture_tag/releases
|
43
|
+
|
44
|
+
Latest versions:
|
45
|
+
|
46
|
+
* 1.10.1 July 2, 2020
|
47
|
+
* Bugfix for erroneously regenerated images
|
48
|
+
* 1.10.2 July 6, 2020
|
49
|
+
* Bugfix for fallback image files not actually getting generated
|
50
|
+
* 1.11.0 July 27, 2020
|
51
|
+
* **Width and height attribute support!** Begone, page reflow.
|
52
|
+
* Cache image information between builds
|
53
|
+
* Change image naming format. This update will trigger all images to be regenerated, so you may
|
54
|
+
want to delete your generated images folder beforehand.
|
55
|
+
|
56
|
+
## Help Wanted
|
57
|
+
|
58
|
+
Writing code is only part of the job; often the harder part is knowing what needs to be changed. Any
|
59
|
+
and all feedback is greatly appreciated, especially in regards to documentation. What are your pain
|
60
|
+
points? See the [contributing
|
61
|
+
guidelines](https://rbuchberger.github.io/jekyll_picture_tag/contributing), or the
|
62
|
+
[issues](https://github.com/rbuchberger/jekyll_picture_tag/issues) page for more.
|