sprite-factory 1.2.0 → 1.3.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/README.md +10 -0
- data/RELEASE_NOTES.md +17 -0
- data/lib/sprite_factory.rb +7 -1
- data/lib/sprite_factory/runner.rb +19 -7
- data/test/images/reference/regular.css +5 -5
- data/test/images/reference/regular.fixed.css +5 -5
- data/test/images/reference/regular.horizontal.css +5 -5
- data/test/images/reference/regular.packed.css +5 -5
- data/test/images/reference/regular.padded.css +5 -5
- data/test/images/reference/regular.sassy.sass +5 -5
- data/test/images/reference/regular.vertical.css +5 -5
- data/test/images/regular/{regular1.png → regular1.PNG} +0 -0
- data/test/images/regular/{regular2.png → regular2.PNG} +0 -0
- data/test/images/regular/{regular3.png → regular3.PNG} +0 -0
- data/test/images/regular/{regular4.png → regular4.PNG} +0 -0
- data/test/images/regular/{regular5.png → regular5.PNG} +0 -0
- data/test/integration_test.rb +21 -0
- data/test/test_case.rb +8 -6
- metadata +9 -8
data/README.md
CHANGED
@@ -10,6 +10,7 @@ The library provides:
|
|
10
10
|
|
11
11
|
* both a ruby API and a command line script
|
12
12
|
* many customizable options
|
13
|
+
* support for multiple layout algorithms - horizontal, vertical or [packed](http://codeincomplete.com/posts/2011/5/7/bin_packing/)
|
13
14
|
* support for any stylesheet syntax, including [CSS](http://www.w3.org/Style/CSS/) and [Sass](http://sass-lang.com/).
|
14
15
|
* support for any image library, including [RMagick](http://rmagick.rubyforge.org/) and [ChunkyPNG](https://github.com/wvanbergen/chunky_png).
|
15
16
|
* support for pngcrush'n the generated image file
|
@@ -64,6 +65,11 @@ When using a framework such as Rails, you would usually DRY this up with a helpe
|
|
64
65
|
image_tag('s.gif', :class => name)
|
65
66
|
end
|
66
67
|
|
68
|
+
>> NOTE: `s.gif` is the traditional name of a 1x1 pixel transparent .gif used as a
|
69
|
+
dummy `src` when the true image comes from a css background attribute. Technically,
|
70
|
+
for css sprites, you could just use a `div` with a class instead of an `img`, but
|
71
|
+
to keep the markup semantic it is common to use an `img` tag with a dummy `src=s.gif`.
|
72
|
+
|
67
73
|
Customization
|
68
74
|
=============
|
69
75
|
|
@@ -79,6 +85,7 @@ Much of the behavior can be customized by overriding the following options:
|
|
79
85
|
- `:width` - fix width of each sprite to a specific size
|
80
86
|
- `:height` - fix height of each sprite to a specific size
|
81
87
|
- `:pngcrush` - pngcrush the generated output image (if pngcrush is available)
|
88
|
+
- `:nocss` - suppress generation of output css file (`run!` returns css content as a string instead)
|
82
89
|
|
83
90
|
Options can be passed as command line arguments to the `sf` script:
|
84
91
|
|
@@ -91,6 +98,9 @@ Options can also be passed as the 2nd argument to the `#run!` method:
|
|
91
98
|
You can see the results of many of these options by viewing the sample page that
|
92
99
|
comes with the gem in `test/images/reference/index.html`.
|
93
100
|
|
101
|
+
>> NOTE: only the common options are available via the command line script (to keep it simple). Specifically,
|
102
|
+
the advanced `width`, `height`, `padding` and `nocss` options are only available via the Ruby interface.
|
103
|
+
|
94
104
|
Layout
|
95
105
|
======
|
96
106
|
|
data/RELEASE_NOTES.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
July 9th 2011 - v1.3.0
|
3
|
+
----------------------
|
4
|
+
|
5
|
+
* source image file extensions now treated in case INsensitive manner (e.g. we detect both .PNG, .png and .Png)
|
6
|
+
* added `:nocss => true` option to suppress generation of output css file (caller should use `run!` return value instead - it contains the generated css content as a string)
|
7
|
+
|
8
|
+
May 8th 2011 - v1.2.0
|
9
|
+
---------------------
|
10
|
+
|
11
|
+
* added new `:layout => :packed` option to use bin-packing algorithm for generating rectangular sprite sheet
|
12
|
+
* added pngcrush support
|
13
|
+
|
14
|
+
April 29th 2011 - v1.0.0
|
15
|
+
------------------------
|
16
|
+
|
17
|
+
* original version
|
data/lib/sprite_factory.rb
CHANGED
@@ -2,7 +2,7 @@ module SpriteFactory
|
|
2
2
|
|
3
3
|
#----------------------------------------------------------------------------
|
4
4
|
|
5
|
-
VERSION = "1.
|
5
|
+
VERSION = "1.3.0"
|
6
6
|
SUMMARY = "Automatic CSS sprite generator"
|
7
7
|
DESCRIPTION = "Combines individual images from a directory into a single sprite image file and creates an appropriate CSS stylesheet"
|
8
8
|
LIB = File.dirname(__FILE__)
|
@@ -69,5 +69,11 @@ module SpriteFactory
|
|
69
69
|
|
70
70
|
#----------------------------------------------------------------------------
|
71
71
|
|
72
|
+
def self.find_files(*args)
|
73
|
+
Dir.glob(args, File::FNM_CASEFOLD).sort # we always do case IN-sensitive file lookups and sort the result
|
74
|
+
end
|
75
|
+
|
76
|
+
#----------------------------------------------------------------------------
|
77
|
+
|
72
78
|
end
|
73
79
|
|
@@ -40,15 +40,23 @@ module SpriteFactory
|
|
40
40
|
max = layout_images(images)
|
41
41
|
header = summary(images, max)
|
42
42
|
|
43
|
+
report(header)
|
44
|
+
|
45
|
+
css = []
|
46
|
+
css << style_comment(header) # header comment
|
47
|
+
css << style(selector, css_path, images, &block) # generated styles
|
48
|
+
css << IO.read(custom_style_file) if File.exists?(custom_style_file) # custom styles
|
49
|
+
css = css.join("\n")
|
50
|
+
|
43
51
|
create_sprite(images, max[:width], max[:height])
|
44
52
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
53
|
+
unless nocss?
|
54
|
+
css_file = File.open(output_style_file, "w+")
|
55
|
+
css_file.puts css
|
56
|
+
css_file.close
|
57
|
+
end
|
50
58
|
|
51
|
-
|
59
|
+
css # return generated CSS to caller in string form
|
52
60
|
|
53
61
|
end
|
54
62
|
|
@@ -100,6 +108,10 @@ module SpriteFactory
|
|
100
108
|
"#{output}.#{style_name}" if output and style_name
|
101
109
|
end
|
102
110
|
|
111
|
+
def nocss?
|
112
|
+
config[:nocss] # set true if you dont want an output css file generated (e.g. you will take the #run! output and store it yourself)
|
113
|
+
end
|
114
|
+
|
103
115
|
def custom_style_file
|
104
116
|
File.join(input, File.basename(input) + ".#{style_name}")
|
105
117
|
end
|
@@ -124,7 +136,7 @@ module SpriteFactory
|
|
124
136
|
return [] if input.nil?
|
125
137
|
valid_extensions = library::VALID_EXTENSIONS
|
126
138
|
expansions = Array(valid_extensions).map{|ext| File.join(input, "**", "*.#{ext}")}
|
127
|
-
|
139
|
+
SpriteFactory.find_files(*expansions)
|
128
140
|
end
|
129
141
|
|
130
142
|
#----------------------------------------------------------------------------
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Creating a sprite from following images:
|
4
4
|
|
5
|
-
test/images/regular/regular1.
|
6
|
-
test/images/regular/regular2.
|
7
|
-
test/images/regular/regular3.
|
8
|
-
test/images/regular/regular4.
|
9
|
-
test/images/regular/regular5.
|
5
|
+
test/images/regular/regular1.PNG (64x64)
|
6
|
+
test/images/regular/regular2.PNG (64x64)
|
7
|
+
test/images/regular/regular3.PNG (64x64)
|
8
|
+
test/images/regular/regular4.PNG (64x64)
|
9
|
+
test/images/regular/regular5.PNG (64x64)
|
10
10
|
|
11
11
|
Output files:
|
12
12
|
test/images/regular.png
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Creating a sprite from following images:
|
4
4
|
|
5
|
-
test/images/regular/regular1.
|
6
|
-
test/images/regular/regular2.
|
7
|
-
test/images/regular/regular3.
|
8
|
-
test/images/regular/regular4.
|
9
|
-
test/images/regular/regular5.
|
5
|
+
test/images/regular/regular1.PNG (64x64)
|
6
|
+
test/images/regular/regular2.PNG (64x64)
|
7
|
+
test/images/regular/regular3.PNG (64x64)
|
8
|
+
test/images/regular/regular4.PNG (64x64)
|
9
|
+
test/images/regular/regular5.PNG (64x64)
|
10
10
|
|
11
11
|
Output files:
|
12
12
|
test/images/regular.fixed.png
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Creating a sprite from following images:
|
4
4
|
|
5
|
-
test/images/regular/regular1.
|
6
|
-
test/images/regular/regular2.
|
7
|
-
test/images/regular/regular3.
|
8
|
-
test/images/regular/regular4.
|
9
|
-
test/images/regular/regular5.
|
5
|
+
test/images/regular/regular1.PNG (64x64)
|
6
|
+
test/images/regular/regular2.PNG (64x64)
|
7
|
+
test/images/regular/regular3.PNG (64x64)
|
8
|
+
test/images/regular/regular4.PNG (64x64)
|
9
|
+
test/images/regular/regular5.PNG (64x64)
|
10
10
|
|
11
11
|
Output files:
|
12
12
|
test/images/regular.horizontal.png
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Creating a sprite from following images:
|
4
4
|
|
5
|
-
test/images/regular/regular1.
|
6
|
-
test/images/regular/regular2.
|
7
|
-
test/images/regular/regular3.
|
8
|
-
test/images/regular/regular4.
|
9
|
-
test/images/regular/regular5.
|
5
|
+
test/images/regular/regular1.PNG (64x64)
|
6
|
+
test/images/regular/regular2.PNG (64x64)
|
7
|
+
test/images/regular/regular3.PNG (64x64)
|
8
|
+
test/images/regular/regular4.PNG (64x64)
|
9
|
+
test/images/regular/regular5.PNG (64x64)
|
10
10
|
|
11
11
|
Output files:
|
12
12
|
test/images/regular.packed.png
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Creating a sprite from following images:
|
4
4
|
|
5
|
-
test/images/regular/regular1.
|
6
|
-
test/images/regular/regular2.
|
7
|
-
test/images/regular/regular3.
|
8
|
-
test/images/regular/regular4.
|
9
|
-
test/images/regular/regular5.
|
5
|
+
test/images/regular/regular1.PNG (64x64)
|
6
|
+
test/images/regular/regular2.PNG (64x64)
|
7
|
+
test/images/regular/regular3.PNG (64x64)
|
8
|
+
test/images/regular/regular4.PNG (64x64)
|
9
|
+
test/images/regular/regular5.PNG (64x64)
|
10
10
|
|
11
11
|
Output files:
|
12
12
|
test/images/regular.padded.png
|
@@ -1,11 +1,11 @@
|
|
1
1
|
/*
|
2
2
|
Creating a sprite from following images:
|
3
3
|
|
4
|
-
test/images/regular/regular1.
|
5
|
-
test/images/regular/regular2.
|
6
|
-
test/images/regular/regular3.
|
7
|
-
test/images/regular/regular4.
|
8
|
-
test/images/regular/regular5.
|
4
|
+
test/images/regular/regular1.PNG (64x64)
|
5
|
+
test/images/regular/regular2.PNG (64x64)
|
6
|
+
test/images/regular/regular3.PNG (64x64)
|
7
|
+
test/images/regular/regular4.PNG (64x64)
|
8
|
+
test/images/regular/regular5.PNG (64x64)
|
9
9
|
|
10
10
|
Output files:
|
11
11
|
test/images/regular.sassy.png
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Creating a sprite from following images:
|
4
4
|
|
5
|
-
test/images/regular/regular1.
|
6
|
-
test/images/regular/regular2.
|
7
|
-
test/images/regular/regular3.
|
8
|
-
test/images/regular/regular4.
|
9
|
-
test/images/regular/regular5.
|
5
|
+
test/images/regular/regular1.PNG (64x64)
|
6
|
+
test/images/regular/regular2.PNG (64x64)
|
7
|
+
test/images/regular/regular3.PNG (64x64)
|
8
|
+
test/images/regular/regular4.PNG (64x64)
|
9
|
+
test/images/regular/regular5.PNG (64x64)
|
10
10
|
|
11
11
|
Output files:
|
12
12
|
test/images/regular.vertical.png
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/test/integration_test.rb
CHANGED
@@ -108,5 +108,26 @@ module SpriteFactory
|
|
108
108
|
|
109
109
|
#----------------------------------------------------------------------------
|
110
110
|
|
111
|
+
def test_generate_sprite_with_nocss
|
112
|
+
input = REGULAR_PATH
|
113
|
+
output = File.basename(REGULAR_PATH)
|
114
|
+
with_clean_output do
|
115
|
+
|
116
|
+
assert_equal(false, File.exists?(output_path(output + ".png")), "preconditions")
|
117
|
+
assert_equal(false, File.exists?(output_path(output + ".css")), "preconditions")
|
118
|
+
|
119
|
+
css = SpriteFactory.run!(REGULAR_PATH, {:nocss => true})
|
120
|
+
|
121
|
+
assert_equal(true, File.exists?(output_path(output + ".png")), "output sprite IMAGE should exist")
|
122
|
+
assert_equal(false, File.exists?(output_path(output + ".css")), "output sprite CSS should NOT exist")
|
123
|
+
assert_equal(IO.read(reference_path(output+".css")), css, "expected return value from #run! to provide generated CSS content")
|
124
|
+
|
125
|
+
assert_reference_image(output + ".png")
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
#----------------------------------------------------------------------------
|
131
|
+
|
111
132
|
end
|
112
133
|
end
|
data/test/test_case.rb
CHANGED
@@ -15,8 +15,8 @@ module SpriteFactory
|
|
15
15
|
FORMATS_PATH = 'test/images/formats'
|
16
16
|
EMPTY_PATH = 'test/images/empty'
|
17
17
|
|
18
|
-
REGULAR =
|
19
|
-
IRREGULAR =
|
18
|
+
REGULAR = SpriteFactory.find_files(File.join(REGULAR_PATH, '*.png'))
|
19
|
+
IRREGULAR = SpriteFactory.find_files(File.join(IRREGULAR_PATH, '*.png'))
|
20
20
|
|
21
21
|
REGULAR_INFO = [
|
22
22
|
{ :filename => REGULAR[0], :width => 64, :height => 64 },
|
@@ -65,10 +65,12 @@ module SpriteFactory
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def clean_output
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
68
|
+
SpriteFactory.find_files(File.join(IMAGES_PATH, "*.png"),
|
69
|
+
File.join(IMAGES_PATH, "*.css"),
|
70
|
+
File.join(IMAGES_PATH, "*.sass"),
|
71
|
+
File.join(IMAGES_PATH, "*.scss")).each do |f|
|
72
|
+
File.delete(f)
|
73
|
+
end
|
72
74
|
end
|
73
75
|
|
74
76
|
#----------------------------------------------------------------------------
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
|
-
version: 1.
|
9
|
+
version: 1.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jake Gordon
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-07-09 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- .gitignore
|
57
57
|
- LICENSE
|
58
58
|
- README.md
|
59
|
+
- RELEASE_NOTES.md
|
59
60
|
- Rakefile
|
60
61
|
- bin/sf
|
61
62
|
- lib/sprite_factory.rb
|
@@ -119,11 +120,11 @@ files:
|
|
119
120
|
- test/images/reference/regular.vertical.css
|
120
121
|
- test/images/reference/regular.vertical.png
|
121
122
|
- test/images/reference/s.gif
|
122
|
-
- test/images/regular/regular1.
|
123
|
-
- test/images/regular/regular2.
|
124
|
-
- test/images/regular/regular3.
|
125
|
-
- test/images/regular/regular4.
|
126
|
-
- test/images/regular/regular5.
|
123
|
+
- test/images/regular/regular1.PNG
|
124
|
+
- test/images/regular/regular2.PNG
|
125
|
+
- test/images/regular/regular3.PNG
|
126
|
+
- test/images/regular/regular4.PNG
|
127
|
+
- test/images/regular/regular5.PNG
|
127
128
|
- test/integration_test.rb
|
128
129
|
- test/layout/horizontal_test.rb
|
129
130
|
- test/layout/packed_test.rb
|