css_sprite 1.5.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.rvmrc CHANGED
@@ -1,2 +1,2 @@
1
1
  rvm_gemset_create_on_use_flag=1
2
- rvm gemset use ruby-1.9.2-p290@css_sprite
2
+ rvm gemset use css_sprite
data/README.textile CHANGED
@@ -7,8 +7,8 @@ automatically css sprite.
7
7
  h2. Best Practices
8
8
 
9
9
  I have written posts "css sprite best practices" to introduce the idea that the css_sprite gem follows.
10
- "english version":http://www.huangzhimin.com/entries/190-css-sprite-best-practices
11
- "chinese version":http://www.huangzhimin.com/entries/189-css-sprite-best-practices
10
+ "english version":http://huangzhimin.com/2010/04/03/css-sprite-best-practices-english-version
11
+ "chinese version":http://huangzhimin.com/2010/04/02/css-sprite-best-practices-chinese-version
12
12
 
13
13
  otaviofcs wrote a brazilian version to introduce the css_sprite gem, check it here: "http://blog.riopro.com.br/2010/04/22/acabaram-as-desculpas-para-nao-usar-css-sprite-na-sua-aplicacao/":http://blog.riopro.com.br/2010/04/22/acabaram-as-desculpas-para-nao-usar-css-sprite-na-sua-aplicacao/
14
14
  and he also build a demo, "http://github.com/riopro/css_sprite_demo":http://github.com/riopro/css_sprite_demo
@@ -93,6 +93,7 @@ image_path: app/assets/images
93
93
  stylesheet_path: app/assets/stylesheets
94
94
  css_images_path: assets
95
95
  disable_optimization: true
96
+ use_asset_url: true
96
97
  </code></pre>
97
98
 
98
99
  h3. ImageType
@@ -103,6 +104,8 @@ css_sprite uses RMagick to compose the images by default. It uses PaletteMatteTy
103
104
 
104
105
  Check the detailed information of image_type here: http://www.imagemagick.org/RMagick/doc/constants.html#ImageType
105
106
 
107
+ for gif transparency, you must use <code>image_type: TrueColorMatteType</code>.
108
+
106
109
  h3. Destination Image Format
107
110
 
108
111
  css_sprite saves the css sprite image as a png file by default. You can change it to gif or any other format like
data/css_sprite.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = CssSprite::VERSION
17
17
 
18
- gem.add_dependency("rmagick")
18
+ gem.add_dependency("mini_magick")
19
19
  gem.add_runtime_dependency("rspec")
20
20
  gem.add_runtime_dependency("mocha")
21
21
  end
@@ -1,5 +1,5 @@
1
1
  require 'find'
2
- require 'RMagick'
2
+ require 'mini_magick'
3
3
  require 'yaml'
4
4
  require 'enumerator'
5
5
 
@@ -85,22 +85,30 @@ class Sprite
85
85
  results = []
86
86
  sources = all_images(directory)
87
87
  dest_image_path = dest_image_path(directory)
88
- span = 5
89
- unless sources.empty?
90
- dest_image = get_image(sources.shift)
91
- results << image_properties(dest_image, directory).merge(:x => 0, :y => 0)
92
- sources.each do |source|
93
- source_image = get_image(source)
94
- gravity = Magick::SouthGravity
95
- x = 0
96
- y = dest_image.rows + span
97
- results << image_properties(source_image, directory).merge(:x => x, :y => y)
98
- dest_image = composite_images(dest_image, source_image, x, y)
99
- end
100
- dest_image.image_type = @config['image_type'] ? Magick.const_get(@config['image_type']) : Magick::PaletteMatteType
101
- dest_image.format = @config['format'] || "PNG"
102
- dest_image.write(dest_image_path)
88
+ return results if sources.empty?
89
+ last_y = 0
90
+ sources.each do |source|
91
+ source_image = get_image(source)
92
+ property =
93
+ x = 0
94
+ y = last_y
95
+ results << image_properties(source, directory).merge(:x => x, :y => y)
96
+ last_y = y + source_image[:height]
97
+ end
98
+
99
+ command = MiniMagick::CommandBuilder.new('montage')
100
+ sources.each do |source|
101
+ command.push command.escape_string source
103
102
  end
103
+ command.push('-tile 1x')
104
+ command.push("-geometry +0+0")
105
+ command.push('-background None')
106
+ command.push('-gravity West')
107
+ command.push('-format')
108
+ format = @config['format'] || "PNG"
109
+ command.push(command.escape_string(format))
110
+ command.push(command.escape_string(dest_image_path))
111
+ MiniMagick::Image.new(nil).run(command)
104
112
  results
105
113
  end
106
114
 
@@ -167,7 +175,11 @@ class Sprite
167
175
  end
168
176
 
169
177
  f.print class_names(results).join(",\n")
170
- f.print " \n background: url('/#{@css_images_path}/#{dest_image_name}?#{dest_image_time.to_i}') no-repeat\n"
178
+ if @config['use_asset_url']
179
+ f.print " \n background: asset-url('#{dest_image_name}', image) no-repeat\n"
180
+ else
181
+ f.print " \n background: url('/#{@css_images_path}/#{dest_image_name}?#{dest_image_time.to_i}') no-repeat\n"
182
+ end
171
183
 
172
184
  results.each do |result|
173
185
  f.print "#{class_name(result[:name])}\n"
@@ -199,7 +211,11 @@ class Sprite
199
211
  end
200
212
 
201
213
  f.print class_names(results).join(",\n")
202
- f.print " \{\n background: url('/#{@css_images_path}/#{dest_image_name}?#{dest_image_time.to_i}') no-repeat;\n\}\n"
214
+ if @config['use_asset_url']
215
+ f.print " \{\n background: asset-url('#{dest_image_name}', image) no-repeat;\n\}\n"
216
+ else
217
+ f.print " \{\n background: url('/#{@css_images_path}/#{dest_image_name}?#{dest_image_time.to_i}') no-repeat;\n\}\n"
218
+ end
203
219
 
204
220
  results.each do |result|
205
221
  f.print "#{class_name(result[:name])} \{\n"
@@ -254,47 +270,38 @@ class Sprite
254
270
  File.join(@stylesheet_path, File.basename(directory) + "." + @engine)
255
271
  end
256
272
 
257
- # append src_image to the dest_image with position (x, y)
258
- def composite_images(dest_image, src_image, x, y)
259
- width = [src_image.columns + x, dest_image.columns].max
260
- height = [src_image.rows + y, dest_image.rows].max
261
- image = Magick::Image.new(width, height) {self.background_color = 'none'}
262
- image.composite!(dest_image, 0, 0, Magick::CopyCompositeOp)
263
- image.composite!(src_image, x, y, Magick::CopyCompositeOp)
264
- image
265
- end
266
-
267
273
  # get the Magick::Image
268
274
  def get_image(image_filename)
269
- Magick::Image::read(image_filename).first
275
+ MiniMagick::Image.open(image_filename)
270
276
  end
271
277
 
272
278
  # get image properties, including name, width and height
273
- def image_properties(image, directory)
274
- name = get_image_name(image, directory)
275
- need_wh?(image, directory) ? {:name => name, :width => image.columns, :height => image.rows} : {:name => name}
279
+ def image_properties(image_path, directory)
280
+ name = get_image_name(image_path, directory)
281
+ image = get_image(image_path)
282
+ need_wh?(image_path, directory) ? {:name => name, :width => image[:width], :height => image[:height]} : {:name => name}
276
283
  end
277
284
 
278
285
  # check if the hover class needs width and height
279
286
  # if the hover class has the same width and height property with not hover class,
280
287
  # then the hover class does not need width and height
281
- def need_wh?(image, directory)
282
- name = get_image_name(image, directory)
288
+ def need_wh?(image_path, directory)
289
+ name = get_image_name(image_path, directory)
283
290
  if hover?(name) or active?(name)
284
- not_file = image.filename.sub(/[_-](hover|active)\./, '.').sub(/[_-](hover|active)\//, '/')
291
+ not_file = image_path.sub(/[_-](hover|active)\./, '.').sub(/[_-](hover|active)\//, '/')
285
292
  if File.exist?(not_file)
293
+ image = get_image(image_path)
286
294
  not_image = get_image(not_file)
287
- return false if image.columns == not_image.columns and image.rows == not_image.rows
295
+ return false if image[:width] == not_image[:width] and image[:height] == not_image[:height]
288
296
  end
289
297
  end
290
298
  return true
291
299
  end
292
300
 
293
301
  # get the image name substracting base directory and extname
294
- def get_image_name(image, directory)
295
- directory_length = directory.length + 1
296
- extname_length = File.extname(image.filename).length
297
- image.filename.slice(directory_length...-extname_length)
302
+ def get_image_name(image_path, directory)
303
+ extname_length = File.extname(image_path).length
304
+ image_path.slice(directory.length+1...-extname_length)
298
305
  end
299
306
 
300
307
  # test if the filename contains a hover or active.
@@ -1,3 +1,3 @@
1
1
  module CssSprite
2
- VERSION = "1.5.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -151,35 +151,19 @@ describe Sprite do
151
151
 
152
152
  describe "get_image" do
153
153
  it "should get a image" do
154
- @sprite.get_image(File.join(IMAGE_PATH, 'css_sprite/gmail_logo.png')).class.should == Magick::Image
154
+ @sprite.get_image(File.join(IMAGE_PATH, 'css_sprite/gmail_logo.png')).class.should == MiniMagick::Image
155
155
  end
156
156
  end
157
157
 
158
158
  describe "image_properties" do
159
159
  it "should get image properties" do
160
- image = @sprite.get_image(File.join(@directory_path, 'gmail_logo.png'))
161
- @sprite.image_properties(image, @directory_path).should == {:name => 'gmail_logo', :width => 103, :height => 36}
160
+ image_path = File.join(@directory_path, 'gmail_logo.png')
161
+ @sprite.image_properties(image_path, @directory_path).should == {:name => 'gmail_logo', :width => 103, :height => 36}
162
162
  end
163
163
 
164
164
  it "should get a image with parent" do
165
- image = @sprite.get_image(File.join(@directory_path, 'icons/twitter_icon.png'))
166
- @sprite.image_properties(image, @directory_path).should == {:name => 'icons/twitter_icon', :width => 14, :height => 14}
167
- end
168
- end
169
-
170
- describe "composite_images" do
171
- it "should composite two images into one horizontally" do
172
- image1 = @sprite.get_image(File.join(@directory_path, 'gmail_logo.png'))
173
- image2 = @sprite.get_image(File.join(@directory_path, 'hotmail_logo.png'))
174
- image = @sprite.composite_images(image1, image2, image1.columns, 0)
175
- @sprite.image_properties(image, @directory_path).should == {:name => nil, :width => 206, :height => 36}
176
- end
177
-
178
- it "should composite two images into one verically" do
179
- image1 = @sprite.get_image(File.join(@directory_path, 'gmail_logo.png'))
180
- image2 = @sprite.get_image(File.join(@directory_path, 'hotmail_logo.png'))
181
- image = @sprite.composite_images(image1, image2, 0, image1.rows)
182
- @sprite.image_properties(image, @directory_path).should == {:name => nil, :width => 103, :height => 72}
165
+ image_path = File.join(@directory_path, 'icons/twitter_icon.png')
166
+ @sprite.image_properties(image_path, @directory_path).should == {:name => 'icons/twitter_icon', :width => 14, :height => 14}
183
167
  end
184
168
  end
185
169
  end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'rspec/autorun'
3
3
  require 'date'
4
- require 'mocha'
4
+ require 'mocha/api'
5
5
 
6
6
  class Rails
7
7
  def self.root
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: css_sprite
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-04 00:00:00.000000000Z
12
+ date: 2013-01-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rmagick
16
- requirement: &70303733426760 !ruby/object:Gem::Requirement
15
+ name: mini_magick
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70303733426760
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rspec
27
- requirement: &70303733426300 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70303733426300
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: mocha
38
- requirement: &70303733425880 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,7 +53,12 @@ dependencies:
43
53
  version: '0'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70303733425880
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  description: css_sprite is a rails plugin/gem to generate css sprite image automatically.
48
63
  email:
49
64
  - flyerhzm@gmail.com
@@ -103,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
118
  version: '0'
104
119
  requirements: []
105
120
  rubyforge_project:
106
- rubygems_version: 1.8.10
121
+ rubygems_version: 1.8.24
107
122
  signing_key:
108
123
  specification_version: 3
109
124
  summary: css_sprite is a rails plugin/gem to generate css sprite image automatically.