cli/lib/compass/sass_extensions/sprites/layout/horizontal.rb
module Compass
module SassExtensions
module Sprites
module Layout
class Horizontal < SpriteLayout
def layout!
calculate_height!
calculate_width!
calculate_positions!
tile_images_that_repeat!
end
private # ===========================================================================================>
def calculate_height!
@height = @images.map {|image| image.height + image.offset}.max
if repeating_images?
calculate_repeat_extra_height!
end
@height
end
def calculate_width!
@width = @images.inject(0) { |sum, image| sum += (image.width + image.spacing) }
end
def repeating_images?
@repeating_images ||= @images.any?(&:repeat_y?)
end
def calculate_repeat_extra_height!
m = @images.inject(1) {|m,img| img.repeat_y? ? m.lcm(img.height) : m }
remainder = @height % m
@height += (m - remainder) unless remainder.zero?
end
def calculate_positions!
@images.each_with_index do |image, index|
image.top = image.position.unit_str == '%' ? (@height - image.height) * (image.position.value / 100.0) : image.position.value
next if index == 0
last_image = @images[index-1]
image.left = last_image.left + last_image.width + [image.spacing, last_image.spacing].max
end
end
def tile_images_that_repeat!
return unless repeating_images?
@images.map {|img| img if img.repeat_y?}.compact.each do |image|
y = (image.top + image.height)
while y < @height do
begin
img = image.dup
img.top = y.to_i
@images << img
y += image.height
end
end #while
end
end
end
end
end
end
end