module Papercrop::ModelExtension::ClassMethods

Public Instance Methods

crop_attached_file(attachment_name, opts = {}) click to toggle source

Initializes attachment cropping in your model

crop_attached_file :avatar

You can also define an initial aspect ratio for the crop and preview box through opts

crop_attached_file :avatar, :aspect => "4:3"

Or unlock it

crop_attached_file :avatar, :aspect => false

@param attachment_name [Symbol] Name of the desired attachment to crop @param opts [Hash] @option opts [Range, String, FlaseClass] :aspect

# File lib/papercrop/model_extension.rb, line 21
def crop_attached_file(attachment_name, opts = {})
  opts = opts.dup

  [:crop_x, :crop_y, :crop_w, :crop_h, :original_w, :original_h, :box_w, :aspect, :cropped_geometries].each do |a|
    attr_accessor :"#{attachment_name}_#{a}"
  end

  aspect = normalize_aspect opts[:aspect]

  send :define_method, :"#{attachment_name}_aspect" do
    aspect.first.to_f / aspect.last.to_f if aspect
  end

  if respond_to? :attachment_definitions
    # for Paperclip <= 3.4
    definitions = attachment_definitions
  else
    # for Paperclip >= 3.5
    definitions = Paperclip::Tasks::Attachments.instance.definitions_for(self)
  end

  processors = definitions[attachment_name][:processors] ||= []
  unless processors.include? :papercrop
    processors << :papercrop
  end

  after_update :"reprocess_to_crop_#{attachment_name}_attachment"
end
normalize_aspect(aspect) click to toggle source

Returns a valid and normalized value for aspect ratio It will return 1.. if aspect is nil or a invalid string @param aspect [Range, String, FalseClass]

@return [Range]

# File lib/papercrop/model_extension.rb, line 56
def normalize_aspect(aspect)
  if aspect.kind_of?(String) && aspect =~ Papercrop::RegExp::ASPECT
    Range.new *aspect.split(':').map(&:to_i)
  elsif aspect.kind_of?(Range)
    return aspect.first.to_i..aspect.last.to_i
  elsif aspect == false
    return aspect
  else
    1..1
  end
end