spittle 0.9.0 → 0.9.1
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 +36 -2
- data/VERSION +1 -1
- data/bin/spittle +30 -9
- data/examples/sprites/apple/fragment.css +17 -17
- data/init.rb +1 -0
- data/lib/spittle/directory_spriter.rb +27 -11
- data/lib/spittle/image.rb +4 -0
- data/lib/spittle/processor.rb +2 -1
- data/spec/integration_spec.rb +22 -4
- data/spittle.gemspec +118 -0
- data/tasks/spittle_tasks.rake +9 -0
- metadata +5 -2
data/README
CHANGED
@@ -12,8 +12,42 @@ It takes your PNG's, chews them up and spits out sprites!
|
|
12
12
|
|
13
13
|
point bin/spittle at a directory, and watch it sprite away!
|
14
14
|
|
15
|
+
INSTALLATION
|
15
16
|
|
17
|
+
We're hosted at gemcutter. I believe 'sudo gem install gemcutter' then 'gem tumble'.
|
18
|
+
Then you can run:
|
16
19
|
|
17
|
-
|
20
|
+
> sudo gem install spittle
|
18
21
|
|
19
|
-
|
22
|
+
USAGE
|
23
|
+
|
24
|
+
> spittle <directory>
|
25
|
+
|
26
|
+
For a full list of options:
|
27
|
+
|
28
|
+
> spittle -h
|
29
|
+
|
30
|
+
LIMITATIONS
|
31
|
+
|
32
|
+
- only supports images of the same height and color type.
|
33
|
+
- only supports RGB and RGBA color types
|
34
|
+
- does not support color profiles (can cause a slight change in color from the source image)
|
35
|
+
|
36
|
+
FEATURES
|
37
|
+
|
38
|
+
- automatically generates PNG sprites from a set of PNG images
|
39
|
+
- automatically generates css classes to access images within the sprite
|
40
|
+
- customize the css template for each sprite
|
41
|
+
|
42
|
+
ROADMAP - by priority
|
43
|
+
|
44
|
+
- Rails plugin & rake tasks
|
45
|
+
- Support varying height in source images
|
46
|
+
- Use mtime tracking to prevent regeneration of sprites that have not changed
|
47
|
+
- Support color profiles
|
48
|
+
- Support global css template override
|
49
|
+
|
50
|
+
AUTHORS
|
51
|
+
|
52
|
+
aberant - Colin Harris
|
53
|
+
tjennings - Tyler Jennings
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.1
|
data/bin/spittle
CHANGED
@@ -1,15 +1,36 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
require 'optparse'
|
3
4
|
require File.dirname(__FILE__) + "/../lib/spittle.rb"
|
4
5
|
|
6
|
+
|
7
|
+
options = {}
|
8
|
+
opts = OptionParser.new do |opts|
|
9
|
+
opts.banner = "Usage: spittle [options] directory"
|
10
|
+
|
11
|
+
opts.on("-o", "--out FILE", "Write css output to an alternate location") do |file|
|
12
|
+
options[:css_file] = file
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on("-p", "--path-prefix PREFIX", "prepend sprite paths with the given string") do |prefix|
|
16
|
+
options[:path_prefix] = prefix
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on_tail("-h", "--help", "Prints this message") do
|
20
|
+
puts opts
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.parse!(ARGV)
|
25
|
+
end
|
26
|
+
|
5
27
|
dir = ARGV[0]
|
6
28
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
29
|
+
unless dir
|
30
|
+
puts opts.help
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
|
34
|
+
options[:source] = dir
|
35
|
+
Spittle::Processor.new(options).write
|
36
|
+
|
@@ -1,61 +1,61 @@
|
|
1
|
+
.apple_iphone {
|
2
|
+
background: transparent url(/tacos/apple/sprite.png) -234px 0px no-repeat;
|
3
|
+
width:116;
|
4
|
+
height:38;
|
5
|
+
text-indent:-5000px;
|
6
|
+
}
|
7
|
+
|
1
8
|
.apple_itunes {
|
2
|
-
background: transparent url(/apple/sprite.png) -350px 0px no-repeat;
|
9
|
+
background: transparent url(/tacos/apple/sprite.png) -350px 0px no-repeat;
|
3
10
|
width:116;
|
4
11
|
height:38;
|
5
12
|
text-indent:-5000px;
|
6
13
|
}
|
7
14
|
|
8
15
|
.apple_mac {
|
9
|
-
background: transparent url(/apple/sprite.png) -466px 0px no-repeat;
|
16
|
+
background: transparent url(/tacos/apple/sprite.png) -466px 0px no-repeat;
|
10
17
|
width:116;
|
11
18
|
height:38;
|
12
19
|
text-indent:-5000px;
|
13
20
|
}
|
14
21
|
|
15
22
|
.apple_apple {
|
16
|
-
background: transparent url(/apple/sprite.png) 0px 0px no-repeat;
|
23
|
+
background: transparent url(/tacos/apple/sprite.png) 0px 0px no-repeat;
|
17
24
|
width:117;
|
18
25
|
height:38;
|
19
26
|
text-indent:-5000px;
|
20
27
|
}
|
21
28
|
|
22
|
-
.
|
23
|
-
background: transparent url(/apple/sprite.png) -
|
29
|
+
.apple_support {
|
30
|
+
background: transparent url(/tacos/apple/sprite.png) -860px 0px no-repeat;
|
24
31
|
width:116;
|
25
32
|
height:38;
|
26
33
|
text-indent:-5000px;
|
27
34
|
}
|
28
35
|
|
29
36
|
.apple_search {
|
30
|
-
background: transparent url(/apple/sprite.png) -582px 0px no-repeat;
|
37
|
+
background: transparent url(/tacos/apple/sprite.png) -582px 0px no-repeat;
|
31
38
|
width:162;
|
32
39
|
height:38;
|
33
40
|
text-indent:-5000px;
|
34
41
|
}
|
35
42
|
|
36
43
|
.apple_divider {
|
37
|
-
background: transparent url(/apple/sprite.png) -117px 0px no-repeat;
|
44
|
+
background: transparent url(/tacos/apple/sprite.png) -117px 0px no-repeat;
|
38
45
|
width:1;
|
39
46
|
height:38;
|
40
47
|
text-indent:-5000px;
|
41
48
|
}
|
42
49
|
|
43
|
-
.
|
44
|
-
background: transparent url(/apple/sprite.png) -
|
50
|
+
.apple_store {
|
51
|
+
background: transparent url(/tacos/apple/sprite.png) -744px 0px no-repeat;
|
45
52
|
width:116;
|
46
53
|
height:38;
|
47
54
|
text-indent:-5000px;
|
48
55
|
}
|
49
56
|
|
50
57
|
.apple_downloads {
|
51
|
-
background: transparent url(/apple/sprite.png) -118px 0px no-repeat;
|
52
|
-
width:116;
|
53
|
-
height:38;
|
54
|
-
text-indent:-5000px;
|
55
|
-
}
|
56
|
-
|
57
|
-
.apple_iphone {
|
58
|
-
background: transparent url(/apple/sprite.png) -234px 0px no-repeat;
|
58
|
+
background: transparent url(/tacos/apple/sprite.png) -118px 0px no-repeat;
|
59
59
|
width:116;
|
60
60
|
height:38;
|
61
61
|
text-indent:-5000px;
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Include hook code here
|
@@ -1,9 +1,22 @@
|
|
1
1
|
class DirectoryProcessor
|
2
|
-
|
2
|
+
|
3
|
+
DEFAULT_TEMPLATE = <<-EOF
|
4
|
+
.<name>_<image_name> {
|
5
|
+
background: transparent url(<image_loc>) <offset>px 0px no-repeat;
|
6
|
+
width:<width>;
|
7
|
+
height:<height>;
|
8
|
+
text-indent:-5000px;
|
9
|
+
}
|
10
|
+
|
11
|
+
EOF
|
12
|
+
|
13
|
+
def initialize(dir, options = {})
|
14
|
+
@options = options
|
3
15
|
@dir = dir
|
4
16
|
files = images
|
5
17
|
@sprite = PNG::Sprite.new
|
6
18
|
files.each {|f| @sprite.append(PNG::Image.open(f))}
|
19
|
+
#puts "#{@dir} #{files.size} files"
|
7
20
|
end
|
8
21
|
|
9
22
|
def images
|
@@ -36,23 +49,26 @@ class DirectoryProcessor
|
|
36
49
|
|
37
50
|
def image_loc
|
38
51
|
#TODO: Lame!
|
39
|
-
("/" + @dir + "/sprite.png").gsub("/./", "/")
|
52
|
+
base = ("/" + @dir + "/sprite.png").gsub("/./", "/").gsub("//", "/")
|
53
|
+
base = @options[:path_prefix] + base if @options[:path_prefix]
|
54
|
+
base
|
40
55
|
end
|
41
56
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
width:<width>;
|
46
|
-
height:<height>;
|
47
|
-
text-indent:-5000px;
|
48
|
-
}
|
57
|
+
def template_file
|
58
|
+
@dir + "/template.css"
|
59
|
+
end
|
49
60
|
|
50
|
-
|
61
|
+
def template
|
62
|
+
if File.exists?(template_file)
|
63
|
+
return File.read(template_file)
|
64
|
+
end
|
65
|
+
return DEFAULT_TEMPLATE
|
66
|
+
end
|
51
67
|
|
52
68
|
def css
|
53
69
|
@sprite.locations.inject("") do |out, image|
|
54
70
|
image_name, properties = image
|
55
|
-
out <<
|
71
|
+
out << template.gsub("<name>", dir_name).
|
56
72
|
gsub("<image_name>", image_name.to_s).
|
57
73
|
gsub("<width>", properties[:width].to_s).
|
58
74
|
gsub("<height>", properties[:height].to_s).
|
data/lib/spittle/image.rb
CHANGED
data/lib/spittle/processor.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Spittle
|
2
2
|
class Processor
|
3
3
|
def initialize(opts)
|
4
|
+
#puts "Processing Directory #{opts[:source]}"
|
4
5
|
@options = opts
|
5
6
|
@processors = dir_processors
|
6
7
|
@css_builder = StylesheetBuilder.new(@options[:source])
|
@@ -17,7 +18,7 @@ module Spittle
|
|
17
18
|
end
|
18
19
|
|
19
20
|
def dir_processors
|
20
|
-
directories.map{|d| DirectoryProcessor.new(d)}
|
21
|
+
directories.map{|d| DirectoryProcessor.new(d, @options)}
|
21
22
|
end
|
22
23
|
|
23
24
|
def cleanup
|
data/spec/integration_spec.rb
CHANGED
@@ -22,9 +22,6 @@ describe 'PNG' do
|
|
22
22
|
read("#{@expected_dir}/merge_right_test.png").should == read("#{@tmp_dir}/merge_right_test.png")
|
23
23
|
end
|
24
24
|
|
25
|
-
def read(file_name)
|
26
|
-
File.read(file_name)
|
27
|
-
end
|
28
25
|
end
|
29
26
|
|
30
27
|
describe "Dir sprite" do
|
@@ -58,9 +55,14 @@ describe "Dir sprite" do
|
|
58
55
|
|
59
56
|
describe "CSS fragments" do
|
60
57
|
before :all do
|
58
|
+
@template = @dir + "/template.css"
|
61
59
|
@css = @spriter.css
|
62
60
|
end
|
63
61
|
|
62
|
+
after do
|
63
|
+
File.delete(@template) rescue {}
|
64
|
+
end
|
65
|
+
|
64
66
|
it "should compose class names" do
|
65
67
|
@css.should include( ".words_latitude")
|
66
68
|
@css.should include( ".words_of" )
|
@@ -73,6 +75,12 @@ describe "Dir sprite" do
|
|
73
75
|
it "should write css fragments for a sprite" do
|
74
76
|
File.exists?(@css_file).should be_true
|
75
77
|
end
|
78
|
+
|
79
|
+
it "can be overidden by including a template.css in the sprite directory" do
|
80
|
+
File.open(@template, 'w'){|f| f.write("override")}
|
81
|
+
@spriter.write
|
82
|
+
@spriter.css.should include("override")
|
83
|
+
end
|
76
84
|
end
|
77
85
|
end
|
78
86
|
|
@@ -107,7 +115,7 @@ describe "Complete spriting process" do
|
|
107
115
|
before :all do
|
108
116
|
@dir = File.dirname(__FILE__) + "/sprite_dirs"
|
109
117
|
@css_file = @dir + "/sprite.css"
|
110
|
-
@spittle = Spittle::Processor.new(:source => @dir, :css_file => @css_file)
|
118
|
+
@spittle = Spittle::Processor.new(:path_prefix => "/images", :source => @dir, :css_file => @css_file)
|
111
119
|
@spittle.write
|
112
120
|
end
|
113
121
|
|
@@ -118,6 +126,11 @@ describe "Complete spriting process" do
|
|
118
126
|
File.exists?(@dir + "/words/sprite.png").should be_false
|
119
127
|
end
|
120
128
|
|
129
|
+
it "prepends a path prefix to all sprites in the css file" do
|
130
|
+
file = read(@css_file)
|
131
|
+
file.should include("/images/spec/sprite_dirs/words")
|
132
|
+
end
|
133
|
+
|
121
134
|
it "can find all the sprite directories" do
|
122
135
|
dirs = @spittle.directories.map{|d| d.split('/').last}
|
123
136
|
dirs.should include( "words" )
|
@@ -132,3 +145,8 @@ describe "Complete spriting process" do
|
|
132
145
|
File.exists?(@dir + "/words/fragment.css").should be_true
|
133
146
|
end
|
134
147
|
end
|
148
|
+
|
149
|
+
def read(file_name)
|
150
|
+
File.read(file_name)
|
151
|
+
end
|
152
|
+
|
data/spittle.gemspec
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{spittle}
|
8
|
+
s.version = "0.9.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["aberant", "tjennings"]
|
12
|
+
s.date = %q{2009-11-16}
|
13
|
+
s.default_executable = %q{spittle}
|
14
|
+
s.description = %q{pure ruby PNG}
|
15
|
+
s.email = ["qzzzq1@gmail.com", "tyler.jennings@gmail.com"]
|
16
|
+
s.executables = ["spittle"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"README"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".gitignore",
|
22
|
+
"README",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"bin/spittle",
|
26
|
+
"examples/sprites/README",
|
27
|
+
"examples/sprites/apple/apple.png",
|
28
|
+
"examples/sprites/apple/divider.png",
|
29
|
+
"examples/sprites/apple/downloads.png",
|
30
|
+
"examples/sprites/apple/fragment.css",
|
31
|
+
"examples/sprites/apple/iphone.png",
|
32
|
+
"examples/sprites/apple/itunes.png",
|
33
|
+
"examples/sprites/apple/mac.png",
|
34
|
+
"examples/sprites/apple/search.png",
|
35
|
+
"examples/sprites/apple/sprite.png",
|
36
|
+
"examples/sprites/apple/store.png",
|
37
|
+
"examples/sprites/apple/support.png",
|
38
|
+
"examples/sprites/fragment.css",
|
39
|
+
"examples/sprites/index.html",
|
40
|
+
"examples/sprites/server.rb",
|
41
|
+
"examples/sprites/sprite.css",
|
42
|
+
"examples/sprites/words/fragment.css",
|
43
|
+
"examples/sprites/words/latitude.png",
|
44
|
+
"examples/sprites/words/of.png",
|
45
|
+
"examples/sprites/words/set.png",
|
46
|
+
"examples/sprites/words/specified.png",
|
47
|
+
"examples/sprites/words/sprite.css",
|
48
|
+
"examples/sprites/words/sprite.png",
|
49
|
+
"init.rb",
|
50
|
+
"lib/spittle.rb",
|
51
|
+
"lib/spittle/chunk.rb",
|
52
|
+
"lib/spittle/directory_spriter.rb",
|
53
|
+
"lib/spittle/file_header.rb",
|
54
|
+
"lib/spittle/filters.rb",
|
55
|
+
"lib/spittle/idat.rb",
|
56
|
+
"lib/spittle/iend.rb",
|
57
|
+
"lib/spittle/ihdr.rb",
|
58
|
+
"lib/spittle/image.rb",
|
59
|
+
"lib/spittle/parser.rb",
|
60
|
+
"lib/spittle/processor.rb",
|
61
|
+
"lib/spittle/sprite.rb",
|
62
|
+
"lib/spittle/stylesheet_builder.rb",
|
63
|
+
"spec/builders/image_builder.rb",
|
64
|
+
"spec/css_fragments/deep/style/fragment.css",
|
65
|
+
"spec/css_fragments/some/fragment.css",
|
66
|
+
"spec/expected_output/merge_right_test.png",
|
67
|
+
"spec/expected_output/write_test.png",
|
68
|
+
"spec/images/lightening.png",
|
69
|
+
"spec/integration_spec.rb",
|
70
|
+
"spec/lib/file_header_spec.rb",
|
71
|
+
"spec/lib/idat_spec.rb",
|
72
|
+
"spec/lib/ihdr_spec.rb",
|
73
|
+
"spec/lib/image_spec.rb",
|
74
|
+
"spec/lib/parser_spec.rb",
|
75
|
+
"spec/lib/sprite_spec.rb",
|
76
|
+
"spec/spec.opts",
|
77
|
+
"spec/spec_helper.rb",
|
78
|
+
"spec/sprite_dirs/words/latitude.png",
|
79
|
+
"spec/sprite_dirs/words/of.png",
|
80
|
+
"spec/sprite_dirs/words/set.png",
|
81
|
+
"spec/sprite_dirs/words/specified.png",
|
82
|
+
"spec/tmp/merge_right_test.png",
|
83
|
+
"spec/tmp/write_test.png",
|
84
|
+
"spittle.gemspec",
|
85
|
+
"tasks/spittle_tasks.rake"
|
86
|
+
]
|
87
|
+
s.homepage = %q{http://github.com/aberant/spittle}
|
88
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
89
|
+
s.require_paths = ["lib"]
|
90
|
+
s.rubygems_version = %q{1.3.5}
|
91
|
+
s.summary = %q{pure ruby PNG}
|
92
|
+
s.test_files = [
|
93
|
+
"spec/builders/image_builder.rb",
|
94
|
+
"spec/integration_spec.rb",
|
95
|
+
"spec/lib/file_header_spec.rb",
|
96
|
+
"spec/lib/idat_spec.rb",
|
97
|
+
"spec/lib/ihdr_spec.rb",
|
98
|
+
"spec/lib/image_spec.rb",
|
99
|
+
"spec/lib/parser_spec.rb",
|
100
|
+
"spec/lib/sprite_spec.rb",
|
101
|
+
"spec/spec_helper.rb",
|
102
|
+
"examples/sprites/server.rb"
|
103
|
+
]
|
104
|
+
|
105
|
+
if s.respond_to? :specification_version then
|
106
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
107
|
+
s.specification_version = 3
|
108
|
+
|
109
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
110
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
111
|
+
else
|
112
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
113
|
+
end
|
114
|
+
else
|
115
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spittle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- aberant
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-11-
|
13
|
+
date: 2009-11-16 00:00:00 -06:00
|
14
14
|
default_executable: spittle
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -62,6 +62,7 @@ files:
|
|
62
62
|
- examples/sprites/words/specified.png
|
63
63
|
- examples/sprites/words/sprite.css
|
64
64
|
- examples/sprites/words/sprite.png
|
65
|
+
- init.rb
|
65
66
|
- lib/spittle.rb
|
66
67
|
- lib/spittle/chunk.rb
|
67
68
|
- lib/spittle/directory_spriter.rb
|
@@ -96,6 +97,8 @@ files:
|
|
96
97
|
- spec/sprite_dirs/words/specified.png
|
97
98
|
- spec/tmp/merge_right_test.png
|
98
99
|
- spec/tmp/write_test.png
|
100
|
+
- spittle.gemspec
|
101
|
+
- tasks/spittle_tasks.rake
|
99
102
|
has_rdoc: true
|
100
103
|
homepage: http://github.com/aberant/spittle
|
101
104
|
licenses: []
|