Class: Spriter

Inherits:
Object
  • Object
show all
Defined in:
lib/spriter.rb

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(assets_path, sprite_image_path, sprite_image_url) ⇒ Spriter

Returns a new instance of Spriter.



23
24
25
26
27
28
# File 'lib/spriter.rb', line 23

def initialize(assets_path, sprite_image_path, sprite_image_url)
  @assets_path, @sprite_image_path, @sprite_image_url = assets_path, sprite_image_path, sprite_image_url
  @images = []
  @y_offsets = {}
  @current_offset, @max_width = 0, 0
end

Class Attribute Details

.assets_pathObject

Returns the value of attribute assets_path.



5
6
7
# File 'lib/spriter.rb', line 5

def assets_path
  @assets_path
end

.sprite_image_pathObject

Returns the value of attribute sprite_image_path.



6
7
8
# File 'lib/spriter.rb', line 6

def sprite_image_path
  @sprite_image_path
end

.sprite_image_urlObject

Returns the value of attribute sprite_image_url.



7
8
9
# File 'lib/spriter.rb', line 7

def sprite_image_url
  @sprite_image_url
end

Class Method Details

.image_dimensions(path) ⇒ Object



17
18
19
20
# File 'lib/spriter.rb', line 17

def image_dimensions(path)
  magick_image = MiniMagick::Image.from_file(path)
  return magick_image[:width], magick_image[:height]
end

.transform(*args) ⇒ Object



9
10
11
# File 'lib/spriter.rb', line 9

def transform(*args)
  new(assets_path, sprite_image_path, sprite_image_url).transform(*args)
end

.transform_files(*args) ⇒ Object



13
14
15
# File 'lib/spriter.rb', line 13

def transform_files(*args)
  new(assets_path, sprite_image_path, sprite_image_url).transform_files(*args)
end

Instance Method Details

#add_image(image) ⇒ Object



61
62
63
64
65
66
67
68
69
70
# File 'lib/spriter.rb', line 61

def add_image(image)
  return if @images.include? image

  width, height = self.class.image_dimensions(File.join(@assets_path, image))

  @images << image
  @y_offsets[image] = @current_offset
  @current_offset += height
  @max_width = [@max_width, width].max
end

#generate_sprite_imageObject



76
77
78
79
80
# File 'lib/spriter.rb', line 76

def generate_sprite_image
  return unless @images.any?
  source_paths = @images.map{ |file| File.join(@assets_path, file) }
  system(*['convert', source_paths, '-gravity', 'West', '-background', '#FFFFFF00', '-append', @sprite_image_path].flatten) or raise "Failed to generate sprite"
end

#transform(*inputs) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/spriter.rb', line 30

def transform(*inputs)
  image_matcher = /([^a-z])-spriter-background:\s*([^;\}]+)([;\}])/
  new_css = inputs.inject([]) do |new_css, css|
    css = css.read if css.respond_to? :read
    new_css << css.gsub(image_matcher) do |matched|
      indent = $1
      terminator = $3
      image = $2.strip.gsub(/(?:^['"]|['"]$)/, '')
      add_image(image)
      "#{indent}background: url(#{@sprite_image_url}) no-repeat 0 #{-y_offset(image)}#{y_offset(image) == 0 ? '' : 'px'}#{terminator} /* #{image} */"
    end
  end

  generate_sprite_image

  if new_css.length == 1
    new_css.first
  else
    new_css
  end
end

#transform_files(*paths) ⇒ Object



52
53
54
55
56
57
58
59
# File 'lib/spriter.rb', line 52

def transform_files(*paths)
  files = paths.map{ |p| File.open(p, 'r') }
  generated_css = transform(*files)
  generated_css = [generated_css] unless generated_css.is_a? Array
  paths.map{ |p| p.sub(/\.spriter$/, '.css') }.each_with_index do |output_path, i|
    File.open(output_path, 'w'){ |f| f << generated_css[i] }
  end
end

#y_offset(image) ⇒ Object



72
73
74
# File 'lib/spriter.rb', line 72

def y_offset(image)
  @y_offsets[image] or raise ArgumentError, 'Unknown image'
end