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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc7dc54c21db20fd2cfd6a7aec2c5b50aa7ee13f725648293246a5972f973240
4
- data.tar.gz: 0f6d32fbe3006abc1d018916b66a71dbd20bd9e9edacf11ea5c4e841e446e5ca
3
+ metadata.gz: 623f43a95efe95c7f4966df6584d2e92abfa8b870b94e018e0a97a06221cf110
4
+ data.tar.gz: e9d1711c003fde435452257b1b43b239f5604606d65c86ba66d1408cae8cfd6d
5
5
  SHA512:
6
- metadata.gz: ae20b1464beb842cc4a17275b2d154a3bf572405b8c7a97be7acd57e91245571460fbac7fdefff62e380cd0a6a21e6fb863df950d6f4d2552cde7a3faa80acd8
7
- data.tar.gz: d120ad3e78b7094c352874b7fbafd611a6017eeef5cb2e621879e0863f310ef5a512b7ac58126c51d344647d40cc069837f7aa94a34c05af8733a1c40c5e1fac
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.7)
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.10)
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.1)
92
+ marcel (1.0.2)
93
93
  method_source (1.0.0)
94
94
  mini_magick (4.11.0)
95
- mini_mime (1.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.4)
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.5.2)
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.4.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.7
188
+ 2.2.30
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 Sébastien Moulène
3
+ Copyright (c) 2021 noesya
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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) ? options[:async]
6
- : true
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
- if source&.metadata &&
14
- source.metadata['analyzed'] &&
15
- source.metadata.has_key?('width') &&
16
- source.metadata.has_key?('height')
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
- # Prendre width et height réelles de l'image
22
- width = image_width
23
- height = image_height
21
+ # Image real dimensions
22
+ width = [image_width, variant_sizes.last].min
23
+ height = width * image_ratio
24
24
  elsif width.nil?
25
- # Calculer la height sur ratio
25
+ # Calculated width, preserving the aspect ratio
26
26
  width = height * image_ratio
27
27
  elsif height.nil?
28
- # Calcule la width sur ratio
28
+ # Calculated height, preserving the aspect ratio
29
29
  height = width / image_ratio
30
30
  else
31
- # Width et height sont explicites,
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=\"#{ alt }\"" if alt
43
- parameters += " width=\"#{ width }\"" if width
44
- parameters += " height=\"#{ height }\"" if height
45
- parameters += " class=\"#{ klass }\"" if klass
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 = url_for(variant) if url.nil?
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
- sizes.reject! { |size| size > width_retina }
72
- sizes << width_retina
73
- sizes.uniq!
66
+ variant_sizes.reject! { |size| size > width_retina }
67
+ variant_sizes << width_retina
68
+ variant_sizes.uniq!
74
69
  end
75
- default_width = sizes.max
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 = sizes.map { |size|
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) } #{ size }w"
75
+ "#{ kamifusen_process(variant, active_storage_direct_url) } #{size}w"
81
76
  }.join(', ')
82
77
  end
83
- srcset_default = sizes.map { |size|
78
+ srcset_default = variant_sizes.map { |size|
84
79
  variant = source.variant(resize: "#{size}>", quality: quality)
85
- "#{ kamifusen_process(variant, active_storage_direct_url) } #{ size }w"
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 %>" type="image/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
- <img src="<%= default %>" srcset="<%= srcset_default %>" type="<%= source.content_type %>"<%= raw parameters %>>
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>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kamifusen
4
- VERSION = "1.7"
4
+ VERSION = "1.10.1"
5
5
  end
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: '1.7'
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-17 00:00:00.000000000 Z
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.