Improve resize syntax, pass additional options and ad specs.

Chris Dyer committed Sep 02, 2016
commit a6916f0b98d7ca2e43d0e7ec0d0775001c0d7b3d
Showing 4 changed files with 80 additions and 7 deletions
locomotive/steam/liquid/filters/resize.rb b/lib/locomotive/steam/liquid/filters/resize.rb +33 -2
@@ @@ -4,8 +4,39 @@ module Locomotive
module Filters
module Resize
- def resize(input, resize_string)
- @context.registers[:services].image_resizer.resize(input, resize_string)
+ # Optional args include:
+ # quality: <number> compress image
+ # auto_orient: <true|false> fix EXIF orientation issues
+ # strip: <true|false> remove extra possibly unnecessary metadata
+ # progressive: <true|false> make JPEG progressive
+ # optimize: <number> shortcut to quality: and also applies strip and progressive
+ # filters: <string> access to any ImageMagick arguments
+ def resize(input, resize_string, *args)
+ args ||= {}
+ options = []
+
+ args.flatten.each do |arg|
+ arg.each do |k, v|
+ options << case k.to_sym
+ when :quality
+ "-quality #{v}"
+ when :optimize # Shortcut helper to set quality, progressive and strip
+ "-quality #{v} -strip -interlace Plane"
+ when :auto_orient
+ "-auto-orient" if v
+ when :strip
+ "-strip" if v
+ when :progressive
+ "-interlace Plane" if v
+ when :filters
+ v
+ else
+ next
+ end
+ end
+ end
+
+ @context.registers[:services].image_resizer.resize(input, resize_string, options.join(' '))
end
end
locomotive/steam/services/image_resizer_service.rb b/lib/locomotive/steam/services/image_resizer_service.rb +3 -5
@@ @@ -5,14 +5,12 @@ module Locomotive
attr_accessor_initialize :resizer, :asset_path
- def resize(source, geometry)
+ def resize(source, geometry, convert = "")
return get_url_or_path(source) if disabled? || geometry.blank?
if file = fetch_file(source)
- /(?<size>[^q]*)(?:q(?<quality>\d+))?/ =~ geometry
-
- transformed_file = file.thumb(size)
- transformed_file = transformed_file.convert("-auto-orient -quality #{quality}") if quality.present?
+ transformed_file = file.thumb(geometry)
+ transformed_file = transformed_file.convert(convert) if !convert.blank?
transformed_file.url
else
Locomotive::Common::Logger.error "Unable to resize on the fly: #{source.inspect}"
spec/unit/liquid/filters/resize_spec.rb +35 -0
@@ @@ -48,6 +48,41 @@ describe Locomotive::Steam::Liquid::Filters::Resize do
end
+ describe 'additional filters' do
+ let(:geometry) { '30x40#' }
+ subject {}
+
+ before do
+ @context.registers[:services].image_resizer = instance_spy('ImageResizerService')
+ @image_resizer = @context.registers[:services].image_resizer
+ end
+
+ it 'handles quality' do
+ resize(input, geometry, { "quality" => 70 })
+ expect(@image_resizer).to have_received(:resize).with(input, geometry, "-quality 70")
+ end
+
+ it 'handles auto_orient' do
+ resize(input, geometry, { "auto_orient" => true })
+ expect(@image_resizer).to have_received(:resize).with(input, geometry, "-auto-orient")
+ end
+
+ it "doesn't auto_orient if false" do
+ resize(input, geometry, { "auto_orient" => false })
+ expect(@image_resizer).to have_received(:resize).with(input, geometry, "")
+ end
+
+ it 'handles optimize' do
+ resize(input, geometry, { "optimize" => 75 })
+ expect(@image_resizer).to have_received(:resize).with(input, geometry, "-quality 75 -strip -interlace Plane")
+ end
+
+ it 'handles multiple and custom filters' do
+ resize(input, geometry, { "quality" => 60, "filters" => "-sepia-tone 80%" })
+ expect(@image_resizer).to have_received(:resize).with(input, geometry, "-quality 60 -sepia-tone 80%")
+ end
+ end
+
end
end
spec/unit/services/image_resizer_service_spec.rb +9 -0
@@ @@ -68,6 +68,15 @@ describe Locomotive::Steam::ImageResizerService do
end
+ describe 'additional filters' do
+ let(:input) { '/sites/42/theme/images/banner.png' }
+ let (:filters) { [{"quality" => 70, "auto_orient" => true, "filters" => "-swirl 180"}] }
+
+ subject { service.resize(input, geometry, filters) }
+
+ it { is_expected.to match /\/steam\/dynamic\/.*\/banner.png/ }
+ end
+
end
end