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 | |