sprite 0.1.7 → 0.2.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/Gemfile +9 -0
- data/Gemfile.lock +50 -0
- data/README.md +27 -23
- data/Rakefile +37 -20
- data/lib/sprite.rb +5 -0
- data/lib/sprite/builder.rb +90 -101
- data/lib/sprite/config.rb +48 -0
- data/lib/sprite/image_combiner.rb +17 -10
- data/lib/sprite/image_config.rb +40 -0
- data/lib/sprite/image_reader.rb +14 -0
- data/lib/sprite/image_resizer.rb +19 -0
- data/lib/sprite/image_writer.rb +29 -0
- data/lib/sprite/runner.rb +6 -4
- data/lib/sprite/sass_extensions.rb +93 -48
- data/lib/sprite/styles.rb +3 -1
- data/lib/sprite/styles/css_generator.rb +19 -15
- data/lib/sprite/styles/sass_generator.rb +5 -4
- data/lib/sprite/styles/sass_mixin_generator.rb +7 -7
- data/lib/sprite/styles/sass_yml_generator.rb +15 -16
- data/lib/sprite/styles/templated_css_generator.rb +41 -0
- data/spec/output/android_horizontal/images/sprites/android-icons.png +0 -0
- data/spec/output/android_horizontal/stylesheets/android-icons.css +1 -0
- data/spec/output/android_vertical/images/sprites/android-icons.png +0 -0
- data/spec/output/android_vertical/stylesheets/android-icons.css +1 -0
- data/spec/resources/android_css.erb +5 -0
- data/spec/resources/configs/android-icons.yml +19 -0
- data/spec/resources/configs/config-test.yml +26 -0
- data/spec/resources/images/android-icons/LICENSE +1 -0
- data/spec/resources/images/android-icons/barcode.png +0 -0
- data/spec/resources/images/android-icons/cards.png +0 -0
- data/spec/resources/images/android-icons/chart.png +0 -0
- data/spec/resources/images/android-icons/clock.png +0 -0
- data/spec/resources/images/android-icons/cloud.png +0 -0
- data/spec/resources/images/android-icons/colour-picker.png +0 -0
- data/spec/resources/images/android-icons/dialog.png +0 -0
- data/spec/resources/images/android-icons/dice.png +0 -0
- data/spec/resources/images/android-icons/disc.png +0 -0
- data/spec/resources/images/android-icons/equalizer.png +0 -0
- data/spec/resources/images/android-icons/filter.png +0 -0
- data/spec/resources/images/android-icons/flag.png +0 -0
- data/spec/resources/images/android-icons/flash.png +0 -0
- data/spec/resources/images/android-icons/globe.png +0 -0
- data/spec/resources/images/android-icons/happy.png +0 -0
- data/spec/resources/images/android-icons/large-tiles.png +0 -0
- data/spec/resources/images/android-icons/light.png +0 -0
- data/spec/resources/images/android-icons/love.png +0 -0
- data/spec/resources/images/android-icons/magnet.png +0 -0
- data/spec/resources/images/android-icons/monitor.png +0 -0
- data/spec/resources/images/android-icons/music.png +0 -0
- data/spec/resources/images/android-icons/pie-chart.png +0 -0
- data/spec/resources/images/android-icons/ruler.png +0 -0
- data/spec/resources/images/android-icons/sad.png +0 -0
- data/spec/resources/images/android-icons/seal.png +0 -0
- data/spec/resources/images/android-icons/shopping.png +0 -0
- data/spec/resources/images/android-icons/small-tiles.png +0 -0
- data/spec/resources/images/android-icons/sun.png +0 -0
- data/spec/resources/images/android-icons/tag.png +0 -0
- data/spec/resources/images/android-icons/umbrella.png +0 -0
- data/spec/resources/images/topics/good-topic.gif +0 -0
- data/spec/resources/images/topics/mid-topic.gif +0 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/sprite/builder_spec.rb +76 -0
- data/spec/sprite/config_spec.rb +64 -0
- data/spec/sprite/image_combiner_spec.rb +40 -0
- data/spec/sprite/image_reader_spec.rb +16 -0
- data/spec/sprite/styles/css_spec.rb +0 -0
- data/spec/sprite/styles/sass_mixin_spec.rb +0 -0
- data/spec/sprite/styles/sass_spec.rb +0 -0
- data/sprite.gemspec +30 -49
- metadata +142 -21
- data/VERSION +0 -1
@@ -15,12 +15,13 @@ module Sprite
|
|
15
15
|
f.puts ".#{@builder.config['sprites_class']}"
|
16
16
|
@level += 1
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
sprite_files.each do |sprite_file, sprites|
|
20
|
+
background_url = @builder.background_url(sprite_file)
|
20
21
|
sprites.each do |sprite|
|
21
22
|
f.puts sass_line("&.#{sprite[:group]}#{@builder.config['class_separator']}#{sprite[:name]}")
|
22
23
|
@level += 1
|
23
|
-
f.puts sass_line("background:
|
24
|
+
f.puts sass_line("background: #{background_url} no-repeat #{sprite[:x]}px #{sprite[:y]}px")
|
24
25
|
f.puts sass_line("width: #{sprite[:width]}px")
|
25
26
|
f.puts sass_line("height: #{sprite[:height]}px")
|
26
27
|
f.puts sass_line("")
|
@@ -29,12 +30,12 @@ module Sprite
|
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
32
|
-
|
33
|
+
|
33
34
|
# write sass output with correct tab spaces prepended
|
34
35
|
def sass_line(sass)
|
35
36
|
"#{' '*@level}#{sass}"
|
36
37
|
end
|
37
|
-
|
38
|
+
|
38
39
|
def extension
|
39
40
|
"sass"
|
40
41
|
end
|
@@ -5,31 +5,31 @@ module Sprite
|
|
5
5
|
def initialize(builder)
|
6
6
|
@builder = builder
|
7
7
|
end
|
8
|
-
|
9
|
-
def write(path, sprite_files)
|
8
|
+
|
9
|
+
def write(path, sprite_files)
|
10
10
|
# write the sass mixins to disk
|
11
11
|
File.open(File.join(Sprite.root, path), 'w') do |f|
|
12
12
|
add_else = false
|
13
13
|
|
14
14
|
f.puts "= sprite(!group_name, !image_name, !offset=0)"
|
15
15
|
sprite_files.each do |sprite_file, sprites|
|
16
|
+
background_url = @builder.background_url(sprite_file)
|
16
17
|
sprites.each do |sprite|
|
17
|
-
|
18
18
|
f << " @"
|
19
19
|
if add_else
|
20
20
|
f << "else "
|
21
21
|
end
|
22
22
|
add_else = true
|
23
23
|
#{sprite[:x]}px #{sprite[:y]}px
|
24
|
-
|
24
|
+
|
25
25
|
if sprite[:align] == 'horizontal'
|
26
26
|
background_offset = "\#{#{sprite[:x]}+!offset}px #{sprite[:y]}px"
|
27
27
|
else
|
28
28
|
background_offset = "#{sprite[:x]}px \#{#{sprite[:y]}+!offset}px"
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
f.puts %{if !group_name == "#{sprite[:group]}" and !image_name == "#{sprite[:name]}"}
|
32
|
-
f.puts " background:
|
32
|
+
f.puts " background: #{background_url} repeat #{background_offset}"
|
33
33
|
f.puts " width: #{sprite[:width]}px"
|
34
34
|
f.puts " height: #{sprite[:height]}px"
|
35
35
|
end
|
@@ -40,7 +40,7 @@ module Sprite
|
|
40
40
|
def extension
|
41
41
|
"sass"
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -6,14 +6,17 @@ module Sprite
|
|
6
6
|
def initialize(builder)
|
7
7
|
@builder = builder
|
8
8
|
end
|
9
|
-
|
10
|
-
def write(path, sprite_files)
|
9
|
+
|
10
|
+
def write(path, sprite_files)
|
11
11
|
# build the yml file
|
12
|
-
|
13
|
-
|
12
|
+
write_config(path, sprite_files)
|
13
|
+
|
14
|
+
# Where to put the sass mixin file
|
15
|
+
sass_path = path.gsub(".yml", ".sass")
|
16
|
+
|
14
17
|
# write the sass mixins to disk
|
15
|
-
File.open(File.join(Sprite.root,
|
16
|
-
f.puts "!sprite_data = '#{
|
18
|
+
File.open(File.join(Sprite.root, sass_path), 'w') do |f|
|
19
|
+
f.puts "!sprite_data = '#{path}'"
|
17
20
|
f.puts ""
|
18
21
|
f.puts "= sprite(!group_name, !image_name)"
|
19
22
|
f.puts " background= sprite_background(!group_name, !image_name)"
|
@@ -22,7 +25,7 @@ module Sprite
|
|
22
25
|
f.puts ""
|
23
26
|
end
|
24
27
|
end
|
25
|
-
|
28
|
+
|
26
29
|
# write the sprite configuration file (used by the yml extension)
|
27
30
|
def write_config(path, sprite_files)
|
28
31
|
# build a grouped hash with all the sprites in it
|
@@ -35,20 +38,16 @@ module Sprite
|
|
35
38
|
end
|
36
39
|
end
|
37
40
|
end
|
38
|
-
|
41
|
+
|
39
42
|
# write the config yml to disk
|
40
|
-
|
41
|
-
File.open(File.join(Sprite.root, config_path), 'w') do |f|
|
43
|
+
File.open(File.join(Sprite.root, path), 'w') do |f|
|
42
44
|
YAML.dump(result, f)
|
43
45
|
end
|
44
|
-
|
45
|
-
config_path
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def extension
|
49
|
-
"
|
49
|
+
"yml"
|
50
50
|
end
|
51
|
-
|
52
51
|
end
|
53
52
|
end
|
54
|
-
end
|
53
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Sprite
|
4
|
+
module Styles
|
5
|
+
# renders css rules from template
|
6
|
+
class TemplatedCssGenerator
|
7
|
+
def initialize(builder)
|
8
|
+
@builder = builder
|
9
|
+
end
|
10
|
+
|
11
|
+
def write(path, sprite_files)
|
12
|
+
# write styles to disk
|
13
|
+
File.open(File.join(Sprite.root, path), 'w') do |f|
|
14
|
+
f.puts "/* Generated by the sprite gem */"
|
15
|
+
sprite_files.each do |sprite_file|
|
16
|
+
@builder.images.each do |image|
|
17
|
+
if "#{image['name']}.#{image['format']}" == sprite_file[0]
|
18
|
+
erb_path = @builder.send :style_template_source_path, image
|
19
|
+
erb_template = ERB.new(File.read(erb_path))
|
20
|
+
sprites = sprite_file[1]
|
21
|
+
sprites.each do |sprite|
|
22
|
+
name = sprite[:name]
|
23
|
+
width = sprite[:width]
|
24
|
+
height = sprite[:height]
|
25
|
+
left = sprite[:x]
|
26
|
+
top = sprite[:y]
|
27
|
+
image_path = ImageWriter.new(@builder.config).image_output_path(image['name'], image['format'])
|
28
|
+
f.puts erb_template.result(binding)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def extension
|
37
|
+
"css"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
/* Generated by the sprite gem */
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
/* Generated by the sprite gem */
|
@@ -0,0 +1,19 @@
|
|
1
|
+
config:
|
2
|
+
style: templated_css
|
3
|
+
style_output_path: output/stylesheets/android-icons
|
4
|
+
image_output_path: output/images/sprites/
|
5
|
+
image_source_path: resources/images/
|
6
|
+
public_path: ''
|
7
|
+
class_separator: '-'
|
8
|
+
default_format: png
|
9
|
+
|
10
|
+
# defines what sprite collections get created
|
11
|
+
images:
|
12
|
+
- name: android-icons
|
13
|
+
format: png
|
14
|
+
style_output_template: resources/android_css.erb
|
15
|
+
align: vertical
|
16
|
+
spaced_by: 50
|
17
|
+
resize_to: 48x48
|
18
|
+
sources:
|
19
|
+
- android-icons/*.png
|
@@ -0,0 +1,26 @@
|
|
1
|
+
config:
|
2
|
+
style: css
|
3
|
+
style_output_path: output/stylesheets/sprites
|
4
|
+
image_output_path: output/images/sprites/
|
5
|
+
image_source_path: resources/images/
|
6
|
+
css_image_path: ../images/sprites
|
7
|
+
public_path: ""
|
8
|
+
class_separator: '-'
|
9
|
+
default_format: png
|
10
|
+
|
11
|
+
# defines what sprite collections get created
|
12
|
+
images:
|
13
|
+
- name: android-icons
|
14
|
+
format: png
|
15
|
+
align: vertical
|
16
|
+
spaced_by: 50
|
17
|
+
sources:
|
18
|
+
- android-icons/*.png
|
19
|
+
|
20
|
+
- name: topics
|
21
|
+
format: gif
|
22
|
+
align: vertical
|
23
|
+
spaced_by: 50
|
24
|
+
sources:
|
25
|
+
- topics/good-topic.gif
|
26
|
+
- topics/mid-topic.gif
|
@@ -0,0 +1 @@
|
|
1
|
+
This work is licensed under the Creative Commons Attribution 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "/../lib"))
|
2
|
+
require 'sprite'
|
3
|
+
require 'bundler/setup'
|
4
|
+
|
5
|
+
require 'date'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
# set Sprite.root to be this spec/ folder
|
9
|
+
Sprite.module_eval{ @root = File.dirname(__FILE__) }
|
10
|
+
|
11
|
+
FileUtils.rm_rf("#{Sprite.root}/output")
|
12
|
+
|
13
|
+
RSpec.configure do |c|
|
14
|
+
|
15
|
+
module SpriteSpecHelpers
|
16
|
+
def clear_output
|
17
|
+
FileUtils.rm_rf("#{Sprite.root}/output")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
c.include(SpriteSpecHelpers)
|
22
|
+
|
23
|
+
# setup fixtures path
|
24
|
+
c.before(:all) do
|
25
|
+
end
|
26
|
+
|
27
|
+
# returns the file path of a fixture setting file
|
28
|
+
def config_path(filename)
|
29
|
+
@fixture_path.join(filename)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
describe Sprite::Builder do
|
4
|
+
|
5
|
+
context "should generate vertical android icon sprites" do
|
6
|
+
before(:all) do
|
7
|
+
@sprite = Sprite::Builder.from_config("resources/configs/android-icons.yml")
|
8
|
+
@sprite.config["style_output_path"] = "output/android_vertical/stylesheets/android-icons"
|
9
|
+
@sprite.config["image_output_path"] = "output/android_vertical/images/sprites/"
|
10
|
+
@sprite.images.first["align"] = "vertical"
|
11
|
+
@sprite.build
|
12
|
+
|
13
|
+
@output_path = "#{Sprite.root}/output/android_vertical"
|
14
|
+
end
|
15
|
+
|
16
|
+
context "and the sprite result image" do
|
17
|
+
before(:all) do
|
18
|
+
combiner = Sprite::ImageCombiner.new(mock())
|
19
|
+
@result_image = Sprite::ImageReader.read("#{@output_path}/images/sprites/android-icons.png")
|
20
|
+
@result_properties = combiner.image_properties(@result_image)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be 48x2890" do
|
24
|
+
"#{@result_properties[:width]}x#{@result_properties[:height]}".should == "48x2890"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "and the sprite result styles" do
|
29
|
+
before(:all) do
|
30
|
+
@styles = File.read("#{@output_path}/stylesheets/android-icons.css")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should have some styles in it" do
|
34
|
+
@styles.should_not be_nil
|
35
|
+
@styles.strip.should_not == ""
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "should generate horizontal android icon sprites" do
|
41
|
+
before(:all) do
|
42
|
+
@sprite = Sprite::Builder.from_config("resources/configs/android-icons.yml")
|
43
|
+
@sprite.config["style_output_path"] = "output/android_horizontal/stylesheets/android-icons"
|
44
|
+
@sprite.config["image_output_path"] = "output/android_horizontal/images/sprites/"
|
45
|
+
@sprite.images.first["align"] = "horizontal"
|
46
|
+
@sprite.build
|
47
|
+
|
48
|
+
@output_path = "#{Sprite.root}/output/android_horizontal"
|
49
|
+
end
|
50
|
+
|
51
|
+
context "and the sprite result image" do
|
52
|
+
before(:all) do
|
53
|
+
combiner = Sprite::ImageCombiner.new(@sprite.config)
|
54
|
+
@result_image = Sprite::ImageReader.read("#{@output_path}/images/sprites/android-icons.png")
|
55
|
+
@result_properties = combiner.image_properties(@result_image)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should be 2890x48" do
|
59
|
+
"#{@result_properties[:width]}x#{@result_properties[:height]}".should == "2890x48"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "and sprite result styles" do
|
64
|
+
before(:all) do
|
65
|
+
@styles = File.read("#{@output_path}/stylesheets/android-icons.css")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should have some styles in it" do
|
69
|
+
@styles.should_not be_nil
|
70
|
+
@styles.strip.should_not == ""
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
describe Sprite::Builder do
|
4
|
+
|
5
|
+
context "configuration parsing" do
|
6
|
+
before(:all) do
|
7
|
+
@sprite = Sprite::Builder.from_config("resources/configs/config-test.yml")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "loads the image keys from file" do
|
11
|
+
@sprite.images.size.should == 2
|
12
|
+
end
|
13
|
+
|
14
|
+
it "expands any globs within the source paths" do
|
15
|
+
@sprite.images.first["sources"].size.should == 30
|
16
|
+
end
|
17
|
+
|
18
|
+
it "allows override of css_image_path value" do
|
19
|
+
@sprite.config['css_image_path'].should == '../images/sprites'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "default settings" do
|
24
|
+
before(:all) do
|
25
|
+
@sprite = Sprite::Builder.new
|
26
|
+
end
|
27
|
+
|
28
|
+
it "'style:' setting defaults to 'css'" do
|
29
|
+
@sprite.config['style'].should == "css"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "'style_output_path:' setting defaults to 'stylesheets/sprites'" do
|
33
|
+
@sprite.config['style_output_path'].should == "stylesheets/sprites"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "'image_output_path:' setting defaults to 'images/sprites/'" do
|
37
|
+
@sprite.config['image_output_path'].should == "images/sprites/"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "'css_image_path:' setting defaults to '/images/sprites/'" do
|
41
|
+
@sprite.config['css_image_path'].should == "/images/sprites/"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "'image_source_path:' setting defaults to 'images/'" do
|
45
|
+
@sprite.config['image_source_path'].should == "images/"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "'public_path:' setting defaults to 'public/'" do
|
49
|
+
@sprite.config['public_path'].should == "public/"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "'default_format:' setting defaults to 'png'" do
|
53
|
+
@sprite.config['default_format'].should == "png"
|
54
|
+
end
|
55
|
+
|
56
|
+
it "'sprites_class:' setting defaults to 'sprites'" do
|
57
|
+
@sprite.config['sprites_class'].should == "sprites"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "'class_separator:' setting defaults to '-'" do
|
61
|
+
@sprite.config['class_separator'].should == "-"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|