Skip to content

Commit 82fe881

Browse files
committed
feat(AssetFieldType): implement dynamic Field-driven image_optim config
1 parent d2bbebc commit 82fe881

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

app/uploaders/asset_uploader.rb

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ class AssetUploader < Shrine
3131
versions = { original: io.download }
3232

3333
if image?(io)
34+
image_optim = image_optim_for(context[:config][:metadata][:image_optim_config])
3435
versions.merge!(context[:config][:metadata][:versions].transform_values do |version|
3536
processed_version = send("#{version[:process][:method]}!", io.download, *version[:process][:config].values)
36-
optimize_image!(processed_version)
37+
optimize_image!(processed_version, image_optim) # TODO: per-version image_optim_config
3738
end)
3839
end
3940

@@ -54,9 +55,26 @@ def image?(io)
5455
MimeMagic.new(io.data['metadata']['mime_type']).mediatype == 'image'
5556
end
5657

57-
def optimize_image!(image)
58-
image_optim = ImageOptim.new(pngout: false, svgo: false, allow_lossy: true) # TODO: implement per-Field/version image_optim configuration
59-
pathname = image_optim.optimize_image!(image)
58+
private
59+
60+
def optimize_image!(image, image_optim)
61+
pathname = image_optim.optimize_image!(image) # TODO: move to ActiveJob
6062
pathname ? pathname.open : image
6163
end
64+
65+
def image_optim_for(image_optim_config)
66+
ImageOptim.new(process_image_optim_config(image_optim_config))
67+
end
68+
69+
def process_image_optim_config(image_optim_config)
70+
processed_image_optim_config = image_optim_config.merge(pngout: false, svgo: false, verbose: true, skip_missing_workers: false)
71+
processed_image_optim_config.extend(Hashie::Extensions::DeepLocate)
72+
quality_range_hashes = processed_image_optim_config.deep_locate -> (key, value, object) { key == :quality_range }
73+
quality_range_hashes.each do |quality_range_hash|
74+
quality_range_hash[:quality] = quality_range_hash[:quality_range][:begin]..quality_range_hash[:quality_range][:end]
75+
quality_range_hash.delete(:quality_range)
76+
end
77+
78+
processed_image_optim_config
79+
end
6280
end

lib/tasks/cortex/core/media.rake

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace :cortex do
3232
naming_data: {
3333
title: fieldTitle.id
3434
},
35-
versions: {
35+
versions: { # Move to YAML
3636
large: { process: { method: 'resize_to_limit', config: { width: '1800', height: '1800' } } },
3737
medium: { process: { method: 'resize_to_limit', config: { width: '800', height: '800' } } },
3838
default: { process: { method: 'resize_to_limit', config: { width: '300', height: '300' } } },
@@ -42,7 +42,7 @@ namespace :cortex do
4242
},
4343
keep_files: [:destroyed, :replaced],
4444
path: 'media/<%= attachment %>/<%= original_name %>-<%= style %>-<%= generated_hex %>.<%= extension %>',
45-
storage: {
45+
storage: { # Move to YAML
4646
type: 's3',
4747
host_alias: ENV['HOST_ALIAS'],
4848
config: {
@@ -55,6 +55,33 @@ namespace :cortex do
5555
cache_control: 'public, max-age=315576000'
5656
}
5757
}
58+
},
59+
image_optim_config: { # Move to YAML
60+
allow_lossy: true,
61+
jpegoptim: {
62+
allow_lossy: true,
63+
strip: 'all',
64+
max_quality: 60
65+
},
66+
pngquant: {
67+
allow_lossy: true,
68+
quality_range: {
69+
begin: 33,
70+
end: 50
71+
},
72+
speed: 3
73+
},
74+
gifsicle: {
75+
interlace: true
76+
},
77+
advpng: false,
78+
jhead: false,
79+
jpegrecompress: false,
80+
jpegtran: false,
81+
optipng: false,
82+
pngcrush: false,
83+
pngout: false,
84+
svgo: false
5885
}
5986
})
6087
media.fields.new(name: 'Description', field_type: 'text_field_type', validations: {presence: true})

0 commit comments

Comments
 (0)