kamifusen 1.6 → 1.10

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: 42e4345e5d359096961d48f2c5477fbcdf6fafec4b84f2ca32dc6e410a2502fa
4
- data.tar.gz: d2b920f457438f5652c14cffd7d14032637549e10a753f1244cb95da3706e475
3
+ metadata.gz: fc161cf43bce3f420864d28ab413979ed4c224c163ca872e78453bbd0d950c7f
4
+ data.tar.gz: 30796fb41b0280a5be83a29016cda1651514e80386014b402a0c6da627174b6d
5
5
  SHA512:
6
- metadata.gz: e3c68441c27a9e4533d74975f2a57ebb0bffa59bfe66cc32f9ce2846c897d090b24d3ebf338fbc5de180d2368f4b56a84e81258b9866552f691e5f8740b934d2
7
- data.tar.gz: 3334ffd8b926960203b4586f779130d00ad6d2c0010d02e7f2b419bfd2d2389d11be128f8901970fbff5f8f2705e9dbbb5ace3dda2bd7ec01f4f5dfc1719d20c
6
+ metadata.gz: 6f72675f224e8e87f64f4ada42f9c0cb4e86ed7c7002ad5316b2831048d52e8b1b9691ed8381a6484d12b9717f99cf49b36d05b1313198b2356e0cf307d6960d
7
+ data.tar.gz: 0fb2c26afde61d40cbb96f84c26416d0809cccec2a0fe37188925727a011f965fdcdfc045808293c7209198a597dc2a4641ec142d1bd19cc308db10c20404f7a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kamifusen (1.6)
4
+ kamifusen (1.10)
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
@@ -1,77 +1,98 @@
1
1
  <%
2
- # image_tag options
3
2
  options ||= {}
4
3
  alt = options[:alt]
5
- async = options.has_key?(:async) ? options[:async]
6
- : true
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
7
6
  klass = options[:class]
8
7
  picture_class = options[:picture_class]
9
8
  width = options[:width]
10
9
  height = options[:height]
11
- if source&.metadata &&
12
- source.metadata['analyzed'] &&
13
- source.metadata.has_key?('width') &&
14
- 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')
15
17
  image_width = source.metadata['width']
16
18
  image_height = source.metadata['height']
17
19
  image_ratio = 1.0 * image_width / image_height
18
20
  if width.nil? && height.nil?
19
- # Prendre width et height réelles de l'image
20
- width = image_width
21
- height = image_height
21
+ # Image real dimensions
22
+ width = [image_width, variant_sizes.last].min
23
+ height = width * image_ratio
22
24
  elsif width.nil?
23
- # Calculer la height sur ratio
25
+ # Calculated width, preserving the aspect ratio
24
26
  width = height * image_ratio
25
27
  elsif height.nil?
26
- # Calcule la width sur ratio
28
+ # Calculated height, preserving the aspect ratio
27
29
  height = width / image_ratio
28
30
  else
29
- # Width et height sont explicites,
30
- # si le ratio demandé n'est pas celui de l'image,
31
- # Redéfinir la height
31
+ # Explicit dimensions. We redefine the height if aspect ratio is not preserved.
32
32
  width = [image_width, width].min
33
33
  height = width / image_ratio
34
34
  end
35
35
  width = width.round
36
36
  height = height.round
37
37
  end
38
+
38
39
  parameters = ""
39
40
  parameters += " loading=\"lazy\" decoding=\"async\"" if async
40
- parameters += " alt=\"#{ alt }\"" if alt
41
- parameters += " width=\"#{ width }\"" if width
42
- parameters += " height=\"#{ height }\"" if height
43
- 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
45
+
46
+ def kamifusen_process(variant, active_storage_direct_url)
47
+ if active_storage_direct_url
48
+ begin
49
+ # Pour générer la processed url, il faut savoir où sont stockées les images
50
+ # https://discuss.rubyonrails.org/t/define-host-so-absolute-urls-work-in-development-and-test/75085
51
+ # https://stackoverflow.com/questions/60425407/uriinvalidurierror-bad-uriis-not-uri-nil-active-storage-service-url
52
+ url = variant.processed.url
53
+ rescue
54
+ # Not compatible with DiskService, which returns a URI::InvalidURIError
55
+ end
56
+ end
57
+ url ||= url_for(variant)
58
+ url
59
+ end
44
60
  %>
45
61
  <% if source.variable? %>
46
- <%#= "#{image_width} x #{image_height}, #{image_ratio} ratio => #{width} x #{height}<br>".html_safe %>
47
62
  <%
48
- # kamifusen settings
49
- sizes = [320, 576, 640, 768, 992, 1152, 1200, 1400, 1536, 1984, 2400]
50
- quality = 80
51
63
  # Computing
52
64
  if width
53
65
  width_retina = width * 2
54
- sizes.reject! { |size| size > width_retina }
55
- sizes << width_retina
56
- sizes.uniq!
66
+ variant_sizes.reject! { |size| size > width_retina }
67
+ variant_sizes << width_retina
68
+ variant_sizes.uniq!
57
69
  end
58
- default_width = sizes.max
70
+ default_width = variant_sizes.max
59
71
  default_width = width_retina if width_retina && width_retina > default_width
60
72
  if Kamifusen.with_webp
61
- srcset_webp = sizes.map { |size|
62
- "#{ url_for source.variant(resize: "#{size}>", format: :webp, quality: quality) } #{ size }w"
73
+ srcset_webp = variant_sizes.map { |size|
74
+ variant = source.variant(resize: "#{size}>", format: :webp, quality: quality)
75
+ "#{ kamifusen_process(variant, active_storage_direct_url) } #{size}w"
63
76
  }.join(', ')
64
77
  end
65
- srcset_default = sizes.map { |size|
66
- "#{ url_for source.variant(resize: "#{size}>", quality: quality) } #{ size }w"
78
+ srcset_default = variant_sizes.map { |size|
79
+ variant = source.variant(resize: "#{size}>", quality: quality)
80
+ "#{ kamifusen_process(variant, active_storage_direct_url) } #{size}w"
67
81
  }.join(', ')
68
- default = url_for source.variant(resize: "#{default_width}>", quality: quality)
82
+ variant = source.variant(resize: "#{default_width}>", quality: quality)
83
+ default = kamifusen_process(variant, active_storage_direct_url)
69
84
  %>
70
85
  <picture<%= " class=\"#{picture_class}\"".html_safe unless picture_class.blank? %>>
71
86
  <% if Kamifusen.with_webp %>
72
- <source srcset="<%= srcset_webp %>" type="image/webp">
87
+ <source srcset="<%= srcset_webp %>"
88
+ type="image/webp"
89
+ <%= " sizes=\"#{sizes.map { |key, value| [key, value].join(' ') }.join(', ')}\"".html_safe unless sizes.empty? %>>
73
90
  <% end %>
74
- <img src="<%= default %>" srcset="<%= srcset_default %>" type="<%= source.content_type %>"<%= raw parameters %>>
91
+ <img src="<%= default %>"
92
+ srcset="<%= srcset_default %>"
93
+ type="<%= source.content_type %>"
94
+ <%= " sizes=\"#{sizes.map { |key, value| [key, value].join(' ') }.join(', ')}\"".html_safe unless sizes.empty? %>
95
+ <%= raw parameters %>>
75
96
  </picture>
76
97
  <% else %>
77
98
  <picture>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kamifusen
4
- VERSION = "1.6"
4
+ VERSION = "1.10"
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.6'
4
+ version: '1.10'
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-16 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.