lemonade 0.1.0 → 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/README.md +32 -4
- data/Rakefile +3 -0
- data/VERSION +1 -1
- data/lemonade.gemspec +16 -5
- data/lib/lemonade.rb +28 -3
- data/lib/lemonade/lemonade.rb +3 -1
- data/lib/lemonade/sass_extensions/functions/lemonade.rb +16 -7
- data/spec/images/other_images/more-images/sprites/{test-2.png → test.png} +0 -0
- data/spec/images/sprites/10x10.png +0 -0
- data/spec/images/sprites/{test-2.png → 150x10.png} +0 -0
- data/spec/images/sprites/20x20.png +0 -0
- data/spec/images/sprites/30x30.png +0 -0
- data/spec/lemonade_spec.rb +68 -8
- metadata +53 -8
- data/spec/images/sprites/test-1.png +0 -0
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Lemonade—On the fly sprite generator for Sass/Compass
|
2
2
|
=====================================================
|
3
3
|
|
4
|
-
Usage (SCSS or Sass):
|
4
|
+
Usage ([SCSS or Sass](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html)):
|
5
5
|
|
6
6
|
.fanta {
|
7
7
|
background: sprite-image("bottles/fanta.png");
|
@@ -40,10 +40,16 @@ Background
|
|
40
40
|
Installation
|
41
41
|
------------
|
42
42
|
|
43
|
-
gem install haml
|
44
|
-
gem install compass
|
45
|
-
gem install rmagick
|
46
43
|
gem install lemonade
|
44
|
+
|
45
|
+
|
46
|
+
Current State
|
47
|
+
-------------
|
48
|
+
|
49
|
+
* Compass standalone finished
|
50
|
+
* Rails Sass integration finished
|
51
|
+
* Staticmatic integration finished
|
52
|
+
* Haml integration (with “:sass” filter): work in progress
|
47
53
|
|
48
54
|
|
49
55
|
Options
|
@@ -62,6 +68,28 @@ Output (assuming the calculated position would be “0 -50px” as shown above):
|
|
62
68
|
background: url('/images/bottles.png') 12px -47px;
|
63
69
|
}
|
64
70
|
|
71
|
+
If you need empty space around the current image, this will add 20px transparent space above and below.
|
72
|
+
|
73
|
+
.seven-up {
|
74
|
+
background: sprite-image("bottles/seven-up.png", 0, 0, 20px);
|
75
|
+
}
|
76
|
+
|
77
|
+
This one adds 20px above, 30px below:
|
78
|
+
|
79
|
+
.seven-up {
|
80
|
+
background: sprite-image("bottles/seven-up.png", 0, 0, 20px, 30px);
|
81
|
+
}
|
82
|
+
|
83
|
+
Right aligned images are possible:
|
84
|
+
|
85
|
+
.seven-up {
|
86
|
+
background: sprite-image("bottles/seven-up.png", 100%, 4px);
|
87
|
+
}
|
88
|
+
|
89
|
+
The original image will be placed on the right side of the sprite image.
|
90
|
+
Use this, if you have a link with an arrow on the right side (like Apple).
|
91
|
+
|
92
|
+
|
65
93
|
|
66
94
|
Note on Patches/Pull Requests
|
67
95
|
-----------------------------
|
data/Rakefile
CHANGED
@@ -10,6 +10,9 @@ begin
|
|
10
10
|
gem.email = "gems@hagenburger.net"
|
11
11
|
gem.homepage = "http://github.com/hagenburger/lemonade"
|
12
12
|
gem.authors = ["Nico Hagenburger"]
|
13
|
+
gem.add_dependency "haml", ">= 3.0.0"
|
14
|
+
gem.add_dependency "compass", ">= 0.10.0"
|
15
|
+
gem.add_dependency "rmagick"
|
13
16
|
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
17
|
end
|
15
18
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lemonade.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{lemonade}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nico Hagenburger"]
|
12
|
-
s.date = %q{2010-05-
|
12
|
+
s.date = %q{2010-05-21}
|
13
13
|
s.description = %q{Generates sprites on the fly by using `background: sprite-image("sprites/logo.png")`.}
|
14
14
|
s.email = %q{gems@hagenburger.net}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,9 +26,11 @@ Gem::Specification.new do |s|
|
|
26
26
|
"lib/lemonade.rb",
|
27
27
|
"lib/lemonade/lemonade.rb",
|
28
28
|
"lib/lemonade/sass_extensions/functions/lemonade.rb",
|
29
|
-
"spec/images/other_images/more-images/sprites/test
|
30
|
-
"spec/images/sprites/
|
31
|
-
"spec/images/sprites/
|
29
|
+
"spec/images/other_images/more-images/sprites/test.png",
|
30
|
+
"spec/images/sprites/10x10.png",
|
31
|
+
"spec/images/sprites/150x10.png",
|
32
|
+
"spec/images/sprites/20x20.png",
|
33
|
+
"spec/images/sprites/30x30.png",
|
32
34
|
"spec/lemonade_spec.rb",
|
33
35
|
"spec/spec.opts",
|
34
36
|
"spec/spec_helper.rb"
|
@@ -48,11 +50,20 @@ Gem::Specification.new do |s|
|
|
48
50
|
s.specification_version = 3
|
49
51
|
|
50
52
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
53
|
+
s.add_runtime_dependency(%q<haml>, [">= 3.0.0"])
|
54
|
+
s.add_runtime_dependency(%q<compass>, [">= 0.10.0"])
|
55
|
+
s.add_runtime_dependency(%q<rmagick>, [">= 0"])
|
51
56
|
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
52
57
|
else
|
58
|
+
s.add_dependency(%q<haml>, [">= 3.0.0"])
|
59
|
+
s.add_dependency(%q<compass>, [">= 0.10.0"])
|
60
|
+
s.add_dependency(%q<rmagick>, [">= 0"])
|
53
61
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
54
62
|
end
|
55
63
|
else
|
64
|
+
s.add_dependency(%q<haml>, [">= 3.0.0"])
|
65
|
+
s.add_dependency(%q<compass>, [">= 0.10.0"])
|
66
|
+
s.add_dependency(%q<rmagick>, [">= 0"])
|
56
67
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
57
68
|
end
|
58
69
|
end
|
data/lib/lemonade.rb
CHANGED
@@ -7,6 +7,7 @@ end
|
|
7
7
|
|
8
8
|
require 'rubygems'
|
9
9
|
require 'compass'
|
10
|
+
require 'sass/plugin'
|
10
11
|
require 'rmagick'
|
11
12
|
require File.dirname(__FILE__) + '/lemonade/sass_extensions/functions/lemonade'
|
12
13
|
require File.dirname(__FILE__) + '/lemonade/lemonade'
|
@@ -17,10 +18,34 @@ end
|
|
17
18
|
|
18
19
|
module Compass
|
19
20
|
class Compiler
|
20
|
-
alias_method :
|
21
|
+
alias_method :compile_without_lemonade, :compile
|
21
22
|
def compile(sass_filename, css_filename)
|
22
|
-
|
23
|
+
compile_without_lemonade sass_filename, css_filename
|
23
24
|
Lemonade::generate_sprites
|
24
25
|
end
|
25
26
|
end
|
26
|
-
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Sass
|
30
|
+
module Plugin
|
31
|
+
alias_method :update_stylesheets_without_lemonade, :update_stylesheets
|
32
|
+
def update_stylesheets
|
33
|
+
if update_stylesheets_without_lemonade
|
34
|
+
Lemonade::generate_sprites
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module Sass
|
41
|
+
class Engine
|
42
|
+
alias_method :render_without_lemonade, :render
|
43
|
+
def render
|
44
|
+
if result = render_without_lemonade
|
45
|
+
Lemonade::generate_sprites
|
46
|
+
result
|
47
|
+
end
|
48
|
+
end
|
49
|
+
alias_method :to_css, :render
|
50
|
+
end
|
51
|
+
end
|
data/lib/lemonade/lemonade.rb
CHANGED
@@ -9,12 +9,14 @@ module Lemonade
|
|
9
9
|
sprite[:images].each do |image|
|
10
10
|
file = File.join(Compass.configuration.images_path, image[:file])
|
11
11
|
single_image = Magick::Image::read(file).first
|
12
|
-
|
12
|
+
x = (sprite[:width] - image[:width]) * image[:x]
|
13
|
+
sprite_image.composite!(single_image, x, image[:y], Magick::OverCompositeOp)
|
13
14
|
end
|
14
15
|
file = File.join(Compass.configuration.images_path, "#{ sprite_name }.png")
|
15
16
|
sprite_image.write file
|
16
17
|
end
|
17
18
|
$lemonade_sprites = nil
|
19
|
+
$lemonade_space_bottom = 0
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Lemonade::SassExtensions::Functions::Lemonade
|
2
2
|
|
3
|
-
def sprite_image(file, add_x = nil, add_y = nil)
|
3
|
+
def sprite_image(file, add_x = nil, add_y = nil, margin_top_or_both = nil, margin_bottom = nil)
|
4
4
|
assert_type file, :String
|
5
5
|
unless (file.to_s =~ %r(^"(.+/)?(.+?)/(.+?)\.(png|gif|jpg)"$)) == 0
|
6
6
|
raise Sass::SyntaxError, 'Please provide a file in a folder: e.g. sprites/button.png'
|
@@ -8,15 +8,17 @@ module Lemonade::SassExtensions::Functions::Lemonade
|
|
8
8
|
dir, name, filename = $1, $2, $3
|
9
9
|
height = image_height(file).value
|
10
10
|
width = image_width(file).value
|
11
|
+
margin_top = calculate_margin_top(margin_top_or_both, margin_bottom)
|
11
12
|
|
12
13
|
$lemonade_sprites ||= {}
|
13
14
|
sprite = $lemonade_sprites["#{ dir }/#{ name }"] ||= { :height => 0, :width => 0, :images => [] }
|
14
|
-
x
|
15
|
-
sprite[:height]
|
15
|
+
x = (add_x and add_x.numerator_units == %w(%)) ? add_x.value / 100 : 0
|
16
|
+
y = sprite[:height] + margin_top
|
17
|
+
sprite[:height] += height + margin_top
|
16
18
|
sprite[:width] = width if width > sprite[:width]
|
17
|
-
position = background_position(x, y, add_x, add_y)
|
18
19
|
sprite[:images] << { :file => file.to_s.gsub('"', ''), :height => height, :width => width, :x => x, :y => y }
|
19
20
|
|
21
|
+
position = background_position(0, y, add_x, add_y)
|
20
22
|
file = image_url(Sass::Script::String.new("#{ dir }#{ name }.png"))
|
21
23
|
Sass::Script::String.new("#{ file }#{ position }")
|
22
24
|
end
|
@@ -25,11 +27,18 @@ private
|
|
25
27
|
|
26
28
|
def background_position(x, y, add_x, add_y)
|
27
29
|
y = -y
|
28
|
-
x
|
30
|
+
x = add_x ? add_x.to_s : 0
|
29
31
|
y += add_y.value if add_y
|
30
|
-
unless
|
31
|
-
" #{ x }
|
32
|
+
unless (add_x.nil? or add_x.value == 0) and y == 0
|
33
|
+
" #{ x } #{ y }#{ 'px' unless y == 0 }"
|
32
34
|
end
|
33
35
|
end
|
36
|
+
|
37
|
+
def calculate_margin_top(margin_top_or_both, margin_bottom)
|
38
|
+
margin_top_or_both = margin_top_or_both ? margin_top_or_both.value : 0
|
39
|
+
margin_top = ($lemonade_margin_bottom ||= 0) > margin_top_or_both ? $lemonade_margin_bottom : margin_top_or_both
|
40
|
+
$lemonade_margin_bottom = margin_bottom ? margin_bottom.value : margin_top_or_both
|
41
|
+
margin_top
|
42
|
+
end
|
34
43
|
|
35
44
|
end
|
File without changes
|
Binary file
|
File without changes
|
Binary file
|
Binary file
|
data/spec/lemonade_spec.rb
CHANGED
@@ -3,12 +3,18 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe Lemonade::SassExtensions::Functions::Lemonade do
|
4
4
|
before :each do
|
5
5
|
@sass = Sass::Environment.new
|
6
|
+
$lemonade_sprites = nil
|
7
|
+
$lemonade_margin_bottom = nil
|
6
8
|
FileUtils.cp_r File.dirname(__FILE__) + '/images', IMAGES_TMP_PATH
|
7
9
|
end
|
8
10
|
|
9
11
|
after :each do
|
10
12
|
FileUtils.rm_r IMAGES_TMP_PATH
|
11
|
-
|
13
|
+
end
|
14
|
+
|
15
|
+
def image_size(file)
|
16
|
+
Lemonade::generate_sprites
|
17
|
+
IO.read(IMAGES_TMP_PATH + '/' + file)[0x10..0x18].unpack('NN')
|
12
18
|
end
|
13
19
|
|
14
20
|
def evaluate(value)
|
@@ -16,11 +22,11 @@ describe Lemonade::SassExtensions::Functions::Lemonade do
|
|
16
22
|
end
|
17
23
|
|
18
24
|
it "should return the sprite file name" do
|
19
|
-
evaluate('sprite-image("sprites/
|
25
|
+
evaluate('sprite-image("sprites/30x30.png")').should == "url('/sprites.png')"
|
20
26
|
end
|
21
27
|
|
22
28
|
it "should work in folders with dashes and underscores" do
|
23
|
-
evaluate('sprite-image("other_images/more-images/sprites/test
|
29
|
+
evaluate('sprite-image("other_images/more-images/sprites/test.png")').should ==
|
24
30
|
"url('/other_images/more-images/sprites.png')"
|
25
31
|
end
|
26
32
|
|
@@ -29,14 +35,68 @@ describe Lemonade::SassExtensions::Functions::Lemonade do
|
|
29
35
|
end
|
30
36
|
|
31
37
|
it "should set the background position" do
|
32
|
-
evaluate('sprite-image("sprites/
|
33
|
-
evaluate('sprite-image("sprites/
|
34
|
-
|
35
|
-
File.exists?(IMAGES_TMP_PATH + '/sprites.png').should be_true
|
38
|
+
evaluate('sprite-image("sprites/30x30.png")').should == "url('/sprites.png')"
|
39
|
+
evaluate('sprite-image("sprites/150x10.png")').should == "url('/sprites.png') 0 -30px"
|
40
|
+
image_size('sprites.png').should == [150, 40]
|
36
41
|
end
|
37
42
|
|
38
43
|
it "should use the X position" do
|
39
|
-
evaluate('sprite-image("sprites/
|
44
|
+
evaluate('sprite-image("sprites/30x30.png", 5px, 0)').should == "url('/sprites.png') 5px 0"
|
45
|
+
image_size('sprites.png').should == [30, 30]
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should calculate 20px empty space between sprites" do
|
49
|
+
# Resulting sprite should look like (1 line = 10px height, X = placed image):
|
50
|
+
|
51
|
+
# X
|
52
|
+
#
|
53
|
+
#
|
54
|
+
# XX
|
55
|
+
# XX
|
56
|
+
#
|
57
|
+
#
|
58
|
+
# XXX
|
59
|
+
# XXX
|
60
|
+
# XXX
|
61
|
+
|
62
|
+
evaluate('sprite-image("sprites/10x10.png")').should == "url('/sprites.png')"
|
63
|
+
# space before #2: 20px
|
64
|
+
evaluate('sprite-image("sprites/20x20.png", 0, 0, 20px)').should == "url('/sprites.png') 0 -30px"
|
65
|
+
# space after #2: 20px
|
66
|
+
evaluate('sprite-image("sprites/30x30.png")').should == "url('/sprites.png') 0 -70px"
|
67
|
+
image_size('sprites.png').should == [30, 100]
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should calculate empty space between sprites and combine space like CSS margins" do
|
71
|
+
# Resulting sprite should look like (1 line = 10px height, X = placed image):
|
72
|
+
|
73
|
+
# X
|
74
|
+
#
|
75
|
+
#
|
76
|
+
#
|
77
|
+
# XX
|
78
|
+
# XX
|
79
|
+
#
|
80
|
+
# XXX
|
81
|
+
# XXX
|
82
|
+
# XXX
|
83
|
+
|
84
|
+
evaluate('sprite-image("sprites/10x10.png", 0, 0, 0, 30px)').should == "url('/sprites.png')"
|
85
|
+
# space between #1 and #2: 30px (=> 30px > 20px)
|
86
|
+
evaluate('sprite-image("sprites/20x20.png", 0, 0, 20px, 5px)').should == "url('/sprites.png') 0 -40px"
|
87
|
+
# space between #2 and #3: 10px (=> 5px < 10px)
|
88
|
+
evaluate('sprite-image("sprites/30x30.png", 0, 0, 10px)').should == "url('/sprites.png') 0 -70px"
|
89
|
+
image_size('sprites.png').should == [30, 100]
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should allow % for x positions" do
|
93
|
+
# Resulting sprite should look like (1 line = 10px height, X = placed image):
|
94
|
+
|
95
|
+
# XXXXXXXXXXXXXXX
|
96
|
+
# X
|
97
|
+
|
98
|
+
evaluate('sprite-image("sprites/150x10.png")')
|
99
|
+
evaluate('sprite-image("sprites/10x10.png", 100%)').should == "url('/sprites.png') 100% -10px"
|
40
100
|
end
|
41
101
|
|
42
102
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Nico Hagenburger
|
@@ -14,13 +14,56 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-21 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: haml
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 3
|
30
|
+
- 0
|
31
|
+
- 0
|
32
|
+
version: 3.0.0
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: compass
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
- 10
|
46
|
+
- 0
|
47
|
+
version: 0.10.0
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rmagick
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :runtime
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rspec
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
24
67
|
none: false
|
25
68
|
requirements:
|
26
69
|
- - ">="
|
@@ -31,7 +74,7 @@ dependencies:
|
|
31
74
|
- 9
|
32
75
|
version: 1.2.9
|
33
76
|
type: :development
|
34
|
-
version_requirements: *
|
77
|
+
version_requirements: *id004
|
35
78
|
description: "Generates sprites on the fly by using `background: sprite-image(\"sprites/logo.png\")`."
|
36
79
|
email: gems@hagenburger.net
|
37
80
|
executables: []
|
@@ -51,9 +94,11 @@ files:
|
|
51
94
|
- lib/lemonade.rb
|
52
95
|
- lib/lemonade/lemonade.rb
|
53
96
|
- lib/lemonade/sass_extensions/functions/lemonade.rb
|
54
|
-
- spec/images/other_images/more-images/sprites/test
|
55
|
-
- spec/images/sprites/
|
56
|
-
- spec/images/sprites/
|
97
|
+
- spec/images/other_images/more-images/sprites/test.png
|
98
|
+
- spec/images/sprites/10x10.png
|
99
|
+
- spec/images/sprites/150x10.png
|
100
|
+
- spec/images/sprites/20x20.png
|
101
|
+
- spec/images/sprites/30x30.png
|
57
102
|
- spec/lemonade_spec.rb
|
58
103
|
- spec/spec.opts
|
59
104
|
- spec/spec_helper.rb
|
Binary file
|