kamifusen 1.7 → 1.10.1
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/Gemfile.lock +10 -8
- data/LICENSE +1 -1
- data/README.md +7 -0
- data/app/views/kamifusen/_view.html.erb +37 -37
- data/lib/kamifusen/version.rb +1 -1
- data/lib/kamifusen.rb +30 -0
- metadata +2 -3
- data/LICENSE.txt +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 623f43a95efe95c7f4966df6584d2e92abfa8b870b94e018e0a97a06221cf110
|
4
|
+
data.tar.gz: e9d1711c003fde435452257b1b43b239f5604606d65c86ba66d1408cae8cfd6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a68d9c2bb398bd911934c2b77b3f08f576045d518b4ab30d01cedac10762c05d2382aa680ee6c3365b7eddeb523329779ffd3e1679d09aa5b10c47462cc51f30
|
7
|
+
data.tar.gz: 1499e4a4e86300c822a8c812c1e52c80c4b61851aa5bbafb8e04965276afe2923d2f689ffeef617770e9bed8dc7934d55220d2adfb48bd3139a4f71e816dfdd1
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
kamifusen (1.
|
4
|
+
kamifusen (1.10.1)
|
5
5
|
image_processing
|
6
6
|
rails
|
7
7
|
|
@@ -76,7 +76,7 @@ GEM
|
|
76
76
|
ffi (1.15.3)
|
77
77
|
globalid (0.5.2)
|
78
78
|
activesupport (>= 5.0)
|
79
|
-
i18n (1.8.
|
79
|
+
i18n (1.8.11)
|
80
80
|
concurrent-ruby (~> 1.0)
|
81
81
|
image_processing (1.12.1)
|
82
82
|
mini_magick (>= 4.9.5, < 5)
|
@@ -89,20 +89,22 @@ GEM
|
|
89
89
|
nokogiri (>= 1.5.9)
|
90
90
|
mail (2.7.1)
|
91
91
|
mini_mime (>= 0.1.1)
|
92
|
-
marcel (1.0.
|
92
|
+
marcel (1.0.2)
|
93
93
|
method_source (1.0.0)
|
94
94
|
mini_magick (4.11.0)
|
95
|
-
mini_mime (1.1.
|
95
|
+
mini_mime (1.1.2)
|
96
96
|
mini_portile2 (2.6.1)
|
97
97
|
minitest (5.14.4)
|
98
98
|
nio4r (2.5.8)
|
99
|
-
nokogiri (1.12.
|
99
|
+
nokogiri (1.12.5)
|
100
100
|
mini_portile2 (~> 2.6.1)
|
101
101
|
racc (~> 1.4)
|
102
|
+
nokogiri (1.12.5-x86_64-darwin)
|
103
|
+
racc (~> 1.4)
|
102
104
|
parallel (1.20.1)
|
103
105
|
parser (3.0.1.1)
|
104
106
|
ast (~> 2.4.1)
|
105
|
-
racc (1.
|
107
|
+
racc (1.6.0)
|
106
108
|
rack (2.2.3)
|
107
109
|
rack-test (1.1.0)
|
108
110
|
rack (>= 1.0, < 3)
|
@@ -168,7 +170,7 @@ GEM
|
|
168
170
|
websocket-driver (0.7.5)
|
169
171
|
websocket-extensions (>= 0.1.0)
|
170
172
|
websocket-extensions (0.1.5)
|
171
|
-
zeitwerk (2.
|
173
|
+
zeitwerk (2.5.1)
|
172
174
|
|
173
175
|
PLATFORMS
|
174
176
|
ruby
|
@@ -183,4 +185,4 @@ DEPENDENCIES
|
|
183
185
|
sqlite3
|
184
186
|
|
185
187
|
BUNDLED WITH
|
186
|
-
2.2.
|
188
|
+
2.2.30
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -32,6 +32,13 @@ If you want to disable webp, in config/initializers/kamifusen.rb:
|
|
32
32
|
Kamifusen.with_webp = false
|
33
33
|
```
|
34
34
|
|
35
|
+
If you render kamifusen tags inside a sanitized text, please make sure you allow these tags and attributes in `config/application.yml`:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
config.action_view.sanitized_allowed_tags = ['picture', 'source', 'img']
|
39
|
+
config.action_view.sanitized_allowed_attributes = ['src', 'type', 'srcset', 'width', 'height', 'alt', 'sizes', 'loading', 'decoding']
|
40
|
+
```
|
41
|
+
|
35
42
|
## Usage
|
36
43
|
|
37
44
|
Simply use `kamifusen_tag` instead of `image_tag` in your rails views.## What's the problem?
|
@@ -1,48 +1,47 @@
|
|
1
1
|
<%
|
2
|
-
# image_tag options
|
3
2
|
options ||= {}
|
4
3
|
alt = options[:alt]
|
5
|
-
async = options.has_key?(:async)
|
6
|
-
|
7
|
-
active_storage_direct_url = options.has_key?(:active_storage_direct_url) ? options[:active_storage_direct_url]
|
8
|
-
: false
|
4
|
+
async = options.has_key?(:async) ? options[:async] : true
|
5
|
+
active_storage_direct_url = options.has_key?(:active_storage_direct_url) ? options[:active_storage_direct_url] : false
|
9
6
|
klass = options[:class]
|
10
7
|
picture_class = options[:picture_class]
|
11
8
|
width = options[:width]
|
12
9
|
height = options[:height]
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
|
11
|
+
variant_sizes = Kamifusen.sizes.dup
|
12
|
+
quality = Kamifusen.quality.dup
|
13
|
+
|
14
|
+
sizes = options[:sizes] || {}
|
15
|
+
|
16
|
+
if source&.analyzed? && source.metadata.has_key?('width') && source.metadata.has_key?('height')
|
17
17
|
image_width = source.metadata['width']
|
18
18
|
image_height = source.metadata['height']
|
19
19
|
image_ratio = 1.0 * image_width / image_height
|
20
20
|
if width.nil? && height.nil?
|
21
|
-
#
|
22
|
-
width = image_width
|
23
|
-
height =
|
21
|
+
# Image real dimensions
|
22
|
+
width = [image_width, variant_sizes.last].min
|
23
|
+
height = width * image_ratio
|
24
24
|
elsif width.nil?
|
25
|
-
#
|
25
|
+
# Calculated width, preserving the aspect ratio
|
26
26
|
width = height * image_ratio
|
27
27
|
elsif height.nil?
|
28
|
-
#
|
28
|
+
# Calculated height, preserving the aspect ratio
|
29
29
|
height = width / image_ratio
|
30
30
|
else
|
31
|
-
#
|
32
|
-
# si le ratio demandé n'est pas celui de l'image,
|
33
|
-
# Redéfinir la height
|
31
|
+
# Explicit dimensions. We redefine the height if aspect ratio is not preserved.
|
34
32
|
width = [image_width, width].min
|
35
33
|
height = width / image_ratio
|
36
34
|
end
|
37
35
|
width = width.round
|
38
36
|
height = height.round
|
39
37
|
end
|
38
|
+
|
40
39
|
parameters = ""
|
41
40
|
parameters += " loading=\"lazy\" decoding=\"async\"" if async
|
42
|
-
parameters += " alt=\"#{
|
43
|
-
parameters += " width=\"#{
|
44
|
-
parameters += " height=\"#{
|
45
|
-
parameters += " class=\"#{
|
41
|
+
parameters += " alt=\"#{alt}\"" if alt
|
42
|
+
parameters += " width=\"#{width}\"" if width
|
43
|
+
parameters += " height=\"#{height}\"" if height
|
44
|
+
parameters += " class=\"#{klass}\"" if klass
|
46
45
|
|
47
46
|
def kamifusen_process(variant, active_storage_direct_url)
|
48
47
|
if active_storage_direct_url
|
@@ -50,48 +49,49 @@ def kamifusen_process(variant, active_storage_direct_url)
|
|
50
49
|
# Pour générer la processed url, il faut savoir où sont stockées les images
|
51
50
|
# https://discuss.rubyonrails.org/t/define-host-so-absolute-urls-work-in-development-and-test/75085
|
52
51
|
# https://stackoverflow.com/questions/60425407/uriinvalidurierror-bad-uriis-not-uri-nil-active-storage-service-url
|
53
|
-
# Not compatible with Disk storage, will return nil
|
54
52
|
url = variant.processed.url
|
55
53
|
rescue
|
54
|
+
# Not compatible with DiskService, which returns a URI::InvalidURIError
|
56
55
|
end
|
57
56
|
end
|
58
|
-
url
|
57
|
+
url ||= url_for(variant)
|
59
58
|
url
|
60
59
|
end
|
61
60
|
%>
|
62
61
|
<% if source.variable? %>
|
63
|
-
<%#= "#{image_width} x #{image_height}, #{image_ratio} ratio => #{width} x #{height}<br>".html_safe %>
|
64
62
|
<%
|
65
|
-
# kamifusen settings
|
66
|
-
sizes = [360, 375, 414, 576, 640, 750, 768, 828, 992, 1152, 1200, 1366, 1400, 1536, 1920, 1984, 2400]
|
67
|
-
quality = 80
|
68
63
|
# Computing
|
69
64
|
if width
|
70
65
|
width_retina = width * 2
|
71
|
-
|
72
|
-
|
73
|
-
|
66
|
+
variant_sizes.reject! { |size| size > width_retina }
|
67
|
+
variant_sizes << width_retina
|
68
|
+
variant_sizes.uniq!
|
74
69
|
end
|
75
|
-
default_width =
|
70
|
+
default_width = variant_sizes.max
|
76
71
|
default_width = width_retina if width_retina && width_retina > default_width
|
77
72
|
if Kamifusen.with_webp
|
78
|
-
srcset_webp =
|
73
|
+
srcset_webp = variant_sizes.map { |size|
|
79
74
|
variant = source.variant(resize: "#{size}>", format: :webp, quality: quality)
|
80
|
-
"#{ kamifusen_process(variant, active_storage_direct_url) } #{
|
75
|
+
"#{ kamifusen_process(variant, active_storage_direct_url) } #{size}w"
|
81
76
|
}.join(', ')
|
82
77
|
end
|
83
|
-
srcset_default =
|
78
|
+
srcset_default = variant_sizes.map { |size|
|
84
79
|
variant = source.variant(resize: "#{size}>", quality: quality)
|
85
|
-
"#{ kamifusen_process(variant, active_storage_direct_url) } #{
|
80
|
+
"#{ kamifusen_process(variant, active_storage_direct_url) } #{size}w"
|
86
81
|
}.join(', ')
|
87
82
|
variant = source.variant(resize: "#{default_width}>", quality: quality)
|
88
83
|
default = kamifusen_process(variant, active_storage_direct_url)
|
89
84
|
%>
|
90
85
|
<picture<%= " class=\"#{picture_class}\"".html_safe unless picture_class.blank? %>>
|
91
86
|
<% if Kamifusen.with_webp %>
|
92
|
-
<source srcset="<%= srcset_webp %>"
|
87
|
+
<source srcset="<%= srcset_webp %>"
|
88
|
+
<%= " sizes=\"#{sizes.map { |key, value| [key, value].join(' ') }.join(', ')}\"".html_safe unless sizes.empty? %>
|
89
|
+
type="image/webp">
|
93
90
|
<% end %>
|
94
|
-
<
|
91
|
+
<source srcset="<%= srcset_default %>"
|
92
|
+
<%= " sizes=\"#{sizes.map { |key, value| [key, value].join(' ') }.join(', ')}\"".html_safe unless sizes.empty? %>
|
93
|
+
type="<%= source.content_type %>">
|
94
|
+
<img src="<%= default %>" <%= raw parameters %>>
|
95
95
|
</picture>
|
96
96
|
<% else %>
|
97
97
|
<picture>
|
data/lib/kamifusen/version.rb
CHANGED
data/lib/kamifusen.rb
CHANGED
@@ -9,6 +9,36 @@ module Kamifusen
|
|
9
9
|
mattr_accessor :with_webp
|
10
10
|
@@with_webp = true
|
11
11
|
|
12
|
+
mattr_accessor :sizes
|
13
|
+
@@sizes = [
|
14
|
+
# 360, # Old android
|
15
|
+
375, # Old iPhone
|
16
|
+
# 414, # ?
|
17
|
+
576, # Tablets desktop
|
18
|
+
640, # iPhone SE, some tablets
|
19
|
+
750, # iPhone 6/7/8, 375@2x
|
20
|
+
768, # Old iPads, Old desktops
|
21
|
+
# 828, # ?
|
22
|
+
# 992, # Breakpoint bootstrap
|
23
|
+
1080, # iPhone 6/7/8 plus, 414@2.608 (sorry)
|
24
|
+
# 1125, # iPhone 10, 375@3x
|
25
|
+
1152,
|
26
|
+
# 1172, # iPhone 12, 390@3x
|
27
|
+
1200, # Desktop
|
28
|
+
1366, # Desktop
|
29
|
+
# 1400, # Breakpoint boostrap
|
30
|
+
1440, # Samsung Galaxy S20, 360@4x
|
31
|
+
1536, # Desktop, some iPads
|
32
|
+
1920, # Desktop 2k
|
33
|
+
2048, # Some iPad
|
34
|
+
2240, # Desktop iMac M1 chipset
|
35
|
+
2880, # Desktop MacBook Pro/Air 13" @2x
|
36
|
+
3072 # Desktop MacBook Pro 16" @2x
|
37
|
+
]
|
38
|
+
|
39
|
+
mattr_accessor :quality
|
40
|
+
@@quality = 80
|
41
|
+
|
12
42
|
class Engine < ::Rails::Engine
|
13
43
|
end
|
14
44
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kamifusen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sébastien Moulène
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-09
|
12
|
+
date: 2021-11-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -82,7 +82,6 @@ files:
|
|
82
82
|
- Gemfile
|
83
83
|
- Gemfile.lock
|
84
84
|
- LICENSE
|
85
|
-
- LICENSE.txt
|
86
85
|
- README.md
|
87
86
|
- Rakefile
|
88
87
|
- app/views/kamifusen/_view.html.erb
|
data/LICENSE.txt
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2021 Arnaud Levy
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in
|
13
|
-
all copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
THE SOFTWARE.
|