lemonade 1.0.0.beta.1 → 1.0.1.deprecated.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.
@@ -1,13 +1,10 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
- TODO
5
- ----
4
+ 1.0.1.deprecated.1
5
+ ------------------
6
6
 
7
- * Rebuild sprite image only if images have been modified (including integration specs)
8
- * Horizontal sprites
9
- * Add more validations and error messages
10
- * Rebuild Sass files when images but not Sass sources have been updated
7
+ * Deprecated everything
11
8
 
12
9
 
13
10
  1.0.0.beta.1
@@ -71,4 +68,4 @@ TODO
71
68
  0.1.0
72
69
  -----
73
70
 
74
- * Initial release
71
+ * Initial release
data/README.md CHANGED
@@ -1,141 +1,28 @@
1
- Lemonade—On the fly sprite generator for Sass/Compass
2
- =====================================================
1
+ Lemonade is deprecated
2
+ ======================
3
3
 
4
- Please read my [blog post on CSS sprites for Sass/Compass](http://www.hagenburger.net/BLOG/Lemonade-CSS-Sprites-for-Sass-Compass.html) or have a look at the presentation [3 steps to make better and faster frontends](http://www.hagenburger.net/BLOG/3-Steps-to-Make-Better-And-Faster-Frontends.html) (slides 23—37).
4
+ Lemonade was a [cool way to create sprites](http://www.hagenburger.net/BLOG/Lemonade-CSS-Sprites-for-Sass-Compass.html).
5
+ Now I [merged Lemonade into Compass](http://chriseppstein.github.com/blog/2010/09/11/compass-merging-with-lemonade/) in [v0.11](https://github.com/chriseppstein/compass/tree/v0.11.0) and redefined the API with [Chris Eppstein](https://twitter.com/chriseppstein). Even better, [Scott Davis](https://twitter.com/jetviper21) made some enhancements.
5
6
 
7
+ So thanks for all the buzz for Lemonade and take a look at our Compass
8
+ Sprites implementation:
6
9
 
7
- **Usage ([SCSS or Sass](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html)):**
10
+ <http://compass-style.org/help/tutorials/spriting/>
8
11
 
9
- .fanta {
10
- background: sprite-image("bottles/fanta.png");
11
- }
12
- .seven-up {
13
- background: sprite-image("bottles/seven-up.png");
14
- }
15
- .coke {
16
- background: sprite-image("cans/coke.png") no-repeat;
17
- }
12
+ Follow @[hagenburger](http://twitter.com/hagenburger) for updates.
18
13
 
19
- **Output (CSS):**
14
+ Cheers,
20
15
 
21
- .fanta {
22
- background: url('/images/bottles.png');
23
- }
24
- .seven-up {
25
- background: url('/images/bottles.png') 0 -50px;
26
- }
27
- .coke {
28
- background: url('/images/cans.png') no-repeat;
29
- }
16
+ Nico)
30
17
 
31
18
 
32
- Background
33
- ----------
19
+ Still need to use Lemonade?
20
+ ---------------------------
34
21
 
35
- * Generates a sprite image for each folder (e. g. “bottles” and “cans”)
36
- * Sets the background position (unless “0 0”)
37
- * It uses the `images_dir` defined by Compass (just like `image-url()`)
38
- * No Rake task needed
39
- * No additional classes
40
- * No configuration
41
- * No RMagick required (but full support for PNG)
22
+ Try to use an older implementation of ChunkyPNG if you get empty PNGs:
42
23
 
24
+ # Gemfile
25
+ gem 'lemonade'
26
+ gem 'chunky_png', '0.11.1'
43
27
 
44
- Installation
45
- ------------
46
-
47
- (1)
48
-
49
- gem install lemonade
50
-
51
- (2)
52
- Now open your `config.rb` ([Compass cofiguration file](http://compass-style.org/docs/tutorials/configuration-reference/)) and add one line after this comment:
53
-
54
- # Require any additional compass plugins here.
55
- require "lemonade"
56
-
57
-
58
- Current State
59
- -------------
60
-
61
- * Compass standalone finished
62
- * Rails Sass integration finished
63
- * Staticmatic integration finished
64
- * Haml integration (with “:sass” filter): work in progress
65
-
66
-
67
- Options
68
- -------
69
-
70
- You can pass an additional background position.
71
- It will be added to the calculated position:
72
-
73
- .seven-up {
74
- background: sprite-image("bottles/seven-up.png", 12px, 3px);
75
- }
76
-
77
- Output (assuming the calculated position would be “0 -50px” as shown above):
78
-
79
- .seven-up {
80
- background: url('/images/bottles.png') 12px -47px;
81
- }
82
-
83
- If you need empty space around the current image, this will add 20px transparent space above and below.
84
-
85
- .seven-up {
86
- background: sprite-image("bottles/seven-up.png", 0, 0, 20px);
87
- }
88
-
89
- This one adds 20px above, 30px below:
90
-
91
- .seven-up {
92
- background: sprite-image("bottles/seven-up.png", 0, 0, 20px, 30px);
93
- }
94
-
95
- Right aligned images are possible:
96
-
97
- .seven-up {
98
- background: sprite-image("bottles/seven-up.png", 100%, 4px);
99
- }
100
-
101
- The original image will be placed on the right side of the sprite image.
102
- Use this, if you have a link with an arrow on the right side (like Apple).
103
-
104
-
105
- Note on Patches/Pull Requests
106
- -----------------------------
107
-
108
- * Fork the project.
109
- * Make your feature addition or bug fix.
110
- * Add tests for it. This is important so I don't break it in a
111
- future version unintentionally.
112
- * Commit, do not mess with rakefile, version, or history.
113
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
114
- * Send me a pull request. Bonus points for topic branches.
115
-
116
-
117
- Rails 3 Troubleshooting
118
- -----------------------
119
-
120
- If you want to use Lemonade with Rails 3 Please use this compass and haml versions in your Gemfile
121
-
122
- gem 'compass', '~> 0.10.2'
123
- gem 'haml-edge', '~> 3.1.49', :require => 'haml'
124
-
125
-
126
- Contributors
127
- ------------
128
-
129
- * [Chris Hoffman](http://github.com/cehoffman)
130
- * [Jason Weathered](http://github.com/jasoncodes) ([twitter](http://twitter.com/jasoncodes))
131
- * [Tobias Kraze](http://github.com/kratob)
132
- * [Sebastian Deutsch](http://github.com/sebastiandeutsch) ([twitter](http://twitter.com/sippndipp))
133
- * [Nico Hagenburger](http://github.com/hagenburger) ([twitter](http://twitter.com/hagenburger))
134
-
135
-
136
- Copyright
137
- ---------
138
-
139
- Copyright (c) 2010 [Nico Hagenburger](http://www.hagenburger.net).
140
- See MIT-LICENSE for details.
141
- [Follow me](http://twitter.com/hagenburger) on twitter.
28
+ You can find the old Lemonade code in the [master branch](https://github.com/hagenburger/lemonade/tree/master)
@@ -1,137 +1,9 @@
1
- require 'chunky_png'
2
- require 'lemonade/sprite_info.rb'
1
+ require 'fileutils'
3
2
 
4
- module Lemonade
5
- @@sprites = {}
6
- @@sprites_path = nil
7
- @@images_path = nil
3
+ raise <<-INFO
8
4
 
9
- class << self
10
-
11
- def sprites
12
- @@sprites
13
- end
14
-
15
- def sprites_path
16
- @@sprites_path || images_path
17
- end
18
-
19
- def sprites_path=(path)
20
- @@sprites_path = path
21
- end
22
-
23
- def images_path
24
- @@images_path || defined?(Compass) ? Compass.configuration.images_path : 'public/images'
25
- end
26
-
27
- def images_path=(path)
28
- @@images_path = path
29
- end
30
-
31
- def reset
32
- @@sprites = {}
33
- end
34
-
35
- def generate_sprites
36
- sprites.each do |sprite_name, sprite|
37
- calculate_sprite sprite
38
- if sprite_changed?(sprite_name, sprite)
39
- generate_sprite_image sprite
40
- remember_sprite_info! sprite_name, sprite
41
- end
42
- end
43
- end
44
-
45
- def extend_sass!
46
- require 'sass'
47
- require 'sass/plugin'
48
- require File.expand_path('../lemonade/sass_functions', __FILE__)
49
- require File.expand_path('../lemonade/sass_extension', __FILE__)
50
- end
51
-
52
- def extend_compass!
53
- base_directory = File.join(File.dirname(__FILE__), '..')
54
- Compass::Frameworks.register('lemonade', :path => base_directory)
55
- end
56
-
57
- def sprite_changed?(sprite_name, sprite)
58
- existing_sprite_info = YAML.load(File.read(sprite_info_file(sprite_name)))
59
- existing_sprite_info[:sprite] != sprite or existing_sprite_info[:timestamps] != timestamps(sprite)
60
- rescue
61
- true
62
- end
63
-
64
- def remember_sprite_info!(sprite_name, sprite)
65
- File.open(sprite_info_file(sprite_name), 'w') do |file|
66
- file << {
67
- :sprite => sprite,
68
- :timestamps => timestamps(sprite),
69
- }.to_yaml
70
- end
71
- end
72
-
73
- private
74
-
75
- def sprite_info_file(sprite_name)
76
- File.join(Compass.configuration.images_path, "#{sprite_name}.sprite_info.yml")
77
- end
78
-
79
- def timestamps(sprite)
80
- result = {}
81
- sprite[:images].each do |image|
82
- file_name = image[:file]
83
- result[file_name] = File.ctime(file_name)
84
- end
85
- result
86
- end
87
-
88
- def calculate_sprite(sprite)
89
- width, margin_bottom, y = 0, 0, 0
90
- sprite[:images].each do |sprite_item|
91
- if sprite_item[:index] == 0
92
- margin_top = 0
93
- elsif sprite_item[:margin_top] > margin_bottom
94
- margin_top = sprite_item[:margin_top]
95
- else
96
- margin_top = margin_bottom
97
- end
98
- y += margin_top
99
- sprite_item[:y] = Sass::Script::Number.new(y, ['px'])
100
- y += sprite_item[:height]
101
- width = sprite_item[:width] if sprite_item[:width] > width
102
- margin_bottom = sprite_item[:margin_bottom]
103
- end
104
- sprite[:height] = y
105
- sprite[:width] = width
106
- end
107
-
108
- def generate_sprite_image(sprite)
109
- sprite_image = ChunkyPNG::Image.new(sprite[:width], sprite[:height], ChunkyPNG::Color::TRANSPARENT)
110
- sprite[:images].each do |sprite_item|
111
- sprite_item_image = ChunkyPNG::Image.from_file(sprite_item[:file])
112
- x = (sprite[:width] - sprite_item[:width]) * (sprite_item[:x].value / 100)
113
- y = sprite_item[:y].value
114
- sprite_image.replace sprite_item_image, x, y
115
- end
116
- sprite_image.save File.join(Lemonade.images_path, sprite[:file])
117
- end
118
-
119
- end
120
-
121
- end
122
-
123
-
124
- if defined?(Compass)
125
- Lemonade.extend_compass!
126
- end
127
-
128
-
129
- if defined?(ActiveSupport) and Haml::Util.has?(:public_method, ActiveSupport, :on_load)
130
- # Rails 3.0
131
- ActiveSupport.on_load :before_initialize do
132
- Lemonade.extend_sass!
133
- end
134
- else
135
- Lemonade.extend_sass!
136
- end
5
+ Lemonade is deprecated now. You may want to use Compass Sprites from now on. More information:
6
+ https://github.com/hagenburger/lemonade
7
+ #{File.dirname(__FILE__)}/README.md
137
8
 
9
+ INFO
@@ -1,3 +1,3 @@
1
1
  module Lemonade
2
- Version = "1.0.0.beta.1"
2
+ Version = "1.0.1.deprecated.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lemonade
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: true
4
+ hash: 1260324941
5
+ prerelease: 6
5
6
  segments:
6
7
  - 1
7
8
  - 0
8
- - 0
9
- - beta
10
9
  - 1
11
- version: 1.0.0.beta.1
10
+ - deprecated
11
+ - 1
12
+ version: 1.0.1.deprecated.1
12
13
  platform: ruby
13
14
  authors:
14
15
  - Nico Hagenburger
@@ -16,84 +17,10 @@ autorequire:
16
17
  bindir: bin
17
18
  cert_chain: []
18
19
 
19
- date: 2010-08-29 00:00:00 +02:00
20
+ date: 2011-05-29 00:00:00 +02:00
20
21
  default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
23
- name: haml
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
26
- none: false
27
- requirements:
28
- - - ~>
29
- - !ruby/object:Gem::Version
30
- segments:
31
- - 3
32
- - 0
33
- - 0
34
- version: 3.0.0
35
- type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: chunky_png
39
- prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- segments:
46
- - 0
47
- - 9
48
- - 0
49
- version: 0.9.0
50
- type: :runtime
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: rake
54
- prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
56
- none: false
57
- requirements:
58
- - - ~>
59
- - !ruby/object:Gem::Version
60
- segments:
61
- - 0
62
- - 8
63
- - 7
64
- version: 0.8.7
65
- type: :development
66
- version_requirements: *id003
67
- - !ruby/object:Gem::Dependency
68
- name: compass
69
- prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- segments:
76
- - 0
77
- - 10
78
- - 0
79
- version: 0.10.0
80
- type: :development
81
- version_requirements: *id004
82
- - !ruby/object:Gem::Dependency
83
- name: rspec
84
- prerelease: false
85
- requirement: &id005 !ruby/object:Gem::Requirement
86
- none: false
87
- requirements:
88
- - - ~>
89
- - !ruby/object:Gem::Version
90
- segments:
91
- - 1
92
- - 3
93
- - 0
94
- version: 1.3.0
95
- type: :development
96
- version_requirements: *id005
22
+ dependencies: []
23
+
97
24
  description: "Generates sprites on the fly by using `background: sprite-image(\"sprites/logo.png\")`. No Photoshop, no RMagick, no Rake task, save your time and have a lemonade."
98
25
  email: gems@hagenburger.net
99
26
  executables: []
@@ -103,27 +30,11 @@ extensions: []
103
30
  extra_rdoc_files:
104
31
  - README.md
105
32
  files:
106
- - lib/lemonade/sass_extension.rb
107
- - lib/lemonade/sass_functions.rb
108
- - lib/lemonade/sprite_info.rb
109
33
  - lib/lemonade/version.rb
110
34
  - lib/lemonade.rb
111
- - stylesheets/lemonade.scss
112
35
  - CHANGELOG.md
113
36
  - MIT-LICENSE
114
- - Rakefile
115
37
  - README.md
116
- - spec/images/other_images/more-images/sprites/test.png
117
- - spec/images/other_images/test.png
118
- - spec/images/sprites/10x10.png
119
- - spec/images/sprites/150x10.png
120
- - spec/images/sprites/20x20.png
121
- - spec/images/sprites/30x30.png
122
- - spec/lemonade_spec.rb
123
- - spec/sass_functions_spec.rb
124
- - spec/spec.opts
125
- - spec/spec_helper.rb
126
- - spec/sprite_info_spec.rb
127
38
  has_rdoc: true
128
39
  homepage: http://github.com/hagenburger/lemonade
129
40
  licenses: []
@@ -138,35 +49,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
49
  requirements:
139
50
  - - ">="
140
51
  - !ruby/object:Gem::Version
52
+ hash: 3
141
53
  segments:
142
54
  - 0
143
55
  version: "0"
144
56
  required_rubygems_version: !ruby/object:Gem::Requirement
145
57
  none: false
146
58
  requirements:
147
- - - ~>
59
+ - - ">"
148
60
  - !ruby/object:Gem::Version
61
+ hash: 25
149
62
  segments:
150
63
  - 1
151
64
  - 3
152
- - 6
153
- version: 1.3.6
65
+ - 1
66
+ version: 1.3.1
154
67
  requirements: []
155
68
 
156
69
  rubyforge_project:
157
- rubygems_version: 1.3.7
70
+ rubygems_version: 1.6.1
158
71
  signing_key:
159
72
  specification_version: 3
160
73
  summary: On the fly sprite generator for Sass/Compass
161
- test_files:
162
- - spec/images/other_images/more-images/sprites/test.png
163
- - spec/images/other_images/test.png
164
- - spec/images/sprites/10x10.png
165
- - spec/images/sprites/150x10.png
166
- - spec/images/sprites/20x20.png
167
- - spec/images/sprites/30x30.png
168
- - spec/lemonade_spec.rb
169
- - spec/sass_functions_spec.rb
170
- - spec/spec.opts
171
- - spec/spec_helper.rb
172
- - spec/sprite_info_spec.rb
74
+ test_files: []
75
+
data/Rakefile DELETED
@@ -1,31 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- Bundler.setup
4
-
5
- begin
6
- require 'spec/rake/spectask'
7
- Spec::Rake::SpecTask.new(:spec) do |spec|
8
- spec.libs << 'lib' << 'spec'
9
- spec.spec_files = FileList['spec/**/*_spec.rb']
10
- end
11
-
12
- Spec::Rake::SpecTask.new(:rcov) do |spec|
13
- spec.libs << 'lib' << 'spec'
14
- spec.pattern = 'spec/**/*_spec.rb'
15
- spec.rcov = true
16
- end
17
-
18
- task :default => :spec
19
- rescue LoadError
20
- puts "Rspec (or a dependency) is not available. Try running bundler install"
21
- end
22
-
23
- require 'rake/rdoctask'
24
- Rake::RDocTask.new do |rdoc|
25
- require File.expand_path('../lib/lemonade/version', __FILE__)
26
-
27
- rdoc.rdoc_dir = 'rdoc'
28
- rdoc.title = "lemonade #{Lemonade::Version}"
29
- rdoc.rdoc_files.include('README*')
30
- rdoc.rdoc_files.include('lib/**/*.rb')
31
- end
@@ -1,21 +0,0 @@
1
- module Sass
2
-
3
- module Tree
4
-
5
- class RootNode < Node
6
-
7
- alias_method :render_without_lemonade, :render
8
- def render
9
- if result = render_without_lemonade
10
- Lemonade.generate_sprites
11
- result = ERB.new(result).result(binding)
12
- Lemonade.reset
13
- return result
14
- end
15
- end
16
-
17
- end
18
-
19
- end
20
-
21
- end
@@ -1,119 +0,0 @@
1
- module Sass::Script::Functions
2
-
3
- def sprite_url(file)
4
- dir, name, basename = extract_names(file)
5
- sprite = sprite_for("#{dir}#{name}")
6
- Sass::Script::SpriteInfo.new(:url, sprite)
7
- end
8
-
9
- def sprite_position(file, position_x = nil, position_y_shift = nil, margin_top_or_both = nil, margin_bottom = nil)
10
- sprite, sprite_item = sprite_url_and_position(file, position_x, position_y_shift, margin_top_or_both, margin_bottom)
11
- Sass::Script::SpriteInfo.new(:position, sprite, sprite_item, position_x, position_y_shift)
12
- end
13
-
14
- def sprite_image(file, position_x = nil, position_y_shift = nil, margin_top_or_both = nil, margin_bottom = nil)
15
- sprite, sprite_item = sprite_url_and_position(file, position_x, position_y_shift, margin_top_or_both, margin_bottom)
16
- Sass::Script::SpriteInfo.new(:both, sprite, sprite_item, position_x, position_y_shift)
17
- end
18
- alias_method :sprite_img, :sprite_image
19
-
20
- def sprite_files_in_folder(folder)
21
- assert_type folder, :String
22
- count = sprite_file_list_from_folder(folder).length
23
- Sass::Script::Number.new(count)
24
- end
25
-
26
- def sprite_file_from_folder(folder, n)
27
- assert_type folder, :String
28
- assert_type n, :Number
29
- file = sprite_file_list_from_folder(folder)[n.to_i]
30
- file = File.basename(file)
31
- Sass::Script::String.new(File.join(folder.value, file))
32
- end
33
-
34
- def sprite_name(file)
35
- dir, name, basename = extract_names(file)
36
- Sass::Script::String.new(name)
37
- end
38
-
39
- def image_basename(file)
40
- dir, name, basename = extract_names(file, :check_file => true)
41
- Sass::Script::String.new(basename)
42
- end
43
-
44
- private
45
-
46
- def sprite_file_list_from_folder(folder)
47
- dir = File.join(Lemonade.sprites_path, folder.value)
48
- Dir.glob(File.join(dir, '*.png')).sort
49
- end
50
-
51
- def sprite_url_and_position(file, position_x = nil, position_y_shift = nil, margin_top_or_both = nil, margin_bottom = nil)
52
- dir, name, basename = extract_names(file, :check_file => true)
53
- filestr = File.join(Lemonade.sprites_path, file.value)
54
-
55
- sprite_file = "#{dir}#{name}.png"
56
- sprite = sprite_for(sprite_file)
57
- sprite_item = image_for(sprite, filestr, position_x, position_y_shift, margin_top_or_both, margin_bottom)
58
-
59
- # Create a temporary destination file so compass doesn't complain about a missing image
60
- FileUtils.touch File.join(Lemonade.images_path, sprite_file)
61
-
62
- [sprite, sprite_item]
63
- end
64
-
65
- def extract_names(file, options = {})
66
- assert_type file, :String
67
- unless (file.value =~ %r(^(.+/)?([^\.]+?)(/(.+?)\.(png))?$)) == 0
68
- raise Sass::SyntaxError, 'Please provide a file in a folder: e.g. sprites/button.png'
69
- end
70
- dir, name, basename = $1, $2, $4
71
- if options[:check_file] and basename.nil?
72
- raise Sass::SyntaxError, 'Please provide a file in a folder: e.g. sprites/button.png'
73
- end
74
- [dir, name, basename]
75
- end
76
-
77
- def sprite_for(file)
78
- file = "#{file}.png" unless file =~ /\.png$/
79
- Lemonade.sprites[file] ||= {
80
- :file => "#{file}",
81
- :height => 0,
82
- :width => 0,
83
- :images => [],
84
- :margin_bottom => 0
85
- }
86
- end
87
-
88
- def image_for(sprite, file, position_x, position_y_shift, margin_top_or_both, margin_bottom)
89
- image = sprite[:images].detect{ |image| image[:file] == file }
90
- margin_top_or_both ||= Sass::Script::Number.new(0)
91
- margin_top = margin_top_or_both.value #calculate_margin_top(sprite, margin_top_or_both, margin_bottom)
92
- margin_bottom = (margin_bottom || margin_top_or_both).value
93
- if image
94
- image[:margin_top] = margin_top if margin_top > image[:margin_top]
95
- image[:margin_bottom] = margin_bottom if margin_bottom > image[:margin_bottom]
96
- else
97
- width, height = ChunkyPNG::Image.from_file(file).size
98
- x = (position_x and position_x.numerator_units == %w(%)) ? position_x : Sass::Script::Number.new(0)
99
- y = sprite[:height] + margin_top
100
- y = Sass::Script::Number.new(y, y == 0 ? [] : ['px'])
101
- image = {
102
- :file => file,
103
- :height => height,
104
- :width => width,
105
- :x => x,
106
- :margin_top => margin_top,
107
- :margin_bottom => margin_bottom,
108
- :index => sprite[:images].length
109
- }
110
- sprite[:images] << image
111
- end
112
- image
113
- rescue Errno::ENOENT
114
- raise Sass::SyntaxError, "#{file} does not exist in sprites_dir #{Lemonade.sprites_path}"
115
- rescue ChunkyPNG::SignatureMismatch
116
- raise Sass::SyntaxError, "#{file} is not a recognized png file, can't use for sprite creation"
117
- end
118
-
119
- end
@@ -1,63 +0,0 @@
1
- require 'sass/script/literal'
2
-
3
- module Sass::Script
4
-
5
- class SpriteInfo < Literal
6
- attr_reader :sprite
7
- attr_reader :sprite_item
8
- attr_reader :type
9
-
10
- def initialize(type, sprite, sprite_item = nil, position_x = nil, position_y_shift = nil)
11
- super(nil)
12
- @type = type
13
- @sprite = sprite
14
- @sprite_item = sprite_item
15
- @position_x = position_x
16
- @position_y_shift = position_y_shift
17
- end
18
-
19
- def to_s(opts = {})
20
- case @type
21
- when :position
22
- position
23
- when :url
24
- url
25
- when :both
26
- pos = position
27
- if pos == '0 0'
28
- url
29
- else
30
- "#{url} #{pos}"
31
- end
32
- end
33
- end
34
-
35
- def to_sass
36
- to_s
37
- end
38
-
39
- private
40
-
41
- def position
42
- x = @position_x || 0
43
- if @sprite_item[:index] == 0 and (@position_y_shift.nil? or @position_y_shift.value == 0)
44
- "#{x.inspect} 0"
45
- else
46
- expression = "Lemonade.sprites['#{@sprite[:file]}'][:images][#{@sprite_item[:index]}][:y].unary_minus"
47
- expression << ".plus(Sass::Script::Number.new(#{@position_y_shift.value}, ['px']))" if @position_y_shift
48
- "#{x.inspect} <%= #{expression} %>"
49
- end
50
- end
51
-
52
- def url
53
- if defined?(Compass)
54
- compass = Class.new.extend(Compass::SassExtensions::Functions::Urls)
55
- compass.image_url(Sass::Script::String.new(@sprite[:file])).to_s
56
- else
57
- "url('/#{@sprite[:file]}')"
58
- end
59
- end
60
-
61
- end
62
-
63
- end
@@ -1,66 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe Lemonade do
4
-
5
- before :each do
6
- @sprite = {
7
- :info => 'info',
8
- :images => [
9
- { :file => 'file1' },
10
- { :file => 'file2' },
11
- ]
12
- }
13
-
14
- @file = ""
15
- File.stub!(:read => @file)
16
- Compass.stub_chain(:configuration, :images_path).and_return('image_path')
17
- File.stub!(:ctime => Time.parse('2010-01-01 12:00'))
18
- end
19
-
20
- ###
21
-
22
- describe '#remember_sprite_info' do
23
- subject { Lemonade }
24
-
25
- it 'should save sprite info into a file' do
26
- File.should_receive(:open).with(File.join('image_path', 'the_sprite.sprite_info.yml'), 'w').and_yield(@file)
27
- @file.should_receive(:<<)
28
- subject.remember_sprite_info!('the_sprite', @sprite)
29
- end
30
- end
31
-
32
- ###
33
-
34
- describe '#sprite_changed?' do
35
- subject { Lemonade }
36
-
37
- it 'should be false if nothing changed' do
38
- File.should_receive(:open).and_yield(@file)
39
- subject.remember_sprite_info!('the sprite', @sprite)
40
- subject.sprite_changed?('the sprite', @sprite).should be_false
41
- end
42
-
43
- it 'should be true if the sprite info has changed' do
44
- File.should_receive(:open).and_yield(@file)
45
- subject.remember_sprite_info!('the sprite', @sprite)
46
- @sprite[:info] = 'changed info'
47
- subject.sprite_changed?('the sprite', @sprite).should be_true
48
- end
49
-
50
- it 'should be true if the images changed' do
51
- File.should_receive(:open).and_yield(@file)
52
- subject.remember_sprite_info!('the sprite', @sprite)
53
- @sprite[:images] = []
54
- subject.sprite_changed?('the sprite', @sprite).should be_true
55
- end
56
-
57
- it 'should be true if a images timestamp changed' do
58
- File.should_receive(:open).and_yield(@file)
59
- subject.remember_sprite_info!('the sprite', @sprite)
60
- File.stub!(:ctime => Time.now)
61
- subject.sprite_changed?('the sprite', @sprite).should be_true
62
- end
63
-
64
- end
65
-
66
- end
@@ -1,217 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe Sass::Script::Functions do
4
-
5
- before :each do
6
- Lemonade.reset
7
- FileUtils.cp_r File.dirname(__FILE__) + '/images', IMAGES_TMP_PATH
8
- Compass.configuration.http_images_path = ''
9
- end
10
-
11
- after :each do
12
- FileUtils.rm_r IMAGES_TMP_PATH
13
- end
14
-
15
- def image_size(file)
16
- IO.read(IMAGES_TMP_PATH + '/' + file)[0x10..0x18].unpack('NN')
17
- end
18
-
19
- def evaluate(*values)
20
- sass = 'div' + values.map{ |value| "\n background: #{value}" }.join
21
- css = Sass::Engine.new(sass, :syntax => :sass).render
22
- # find rendered CSS values
23
- # strip selectors, porperty names, semicolons and whitespace
24
- css = css.gsub(/div {\s*background: (.+?);\s*}\s*/m, '\\1').split(/;\s*background: /)
25
- css = css.first if css.length == 1
26
- return css
27
- end
28
-
29
- ###
30
-
31
- it "should return the sprite file name" do
32
- evaluate('sprite-image("sprites/30x30.png")').should == "url('/sprites.png')"
33
- end
34
-
35
- it "should also work with `sprite-img`" do
36
- evaluate('sprite-img("sprites/30x30.png")').should == "url('/sprites.png')"
37
- end
38
-
39
- it "should work in folders with dashes and underscores" do
40
- evaluate('sprite-image("other_images/more-images/sprites/test.png")').should ==
41
- "url('/other_images/more-images/sprites.png')"
42
- end
43
-
44
- it "should not work without any folder" do
45
- lambda { evaluate('sprite-image("test.png")') }.should raise_exception(Sass::SyntaxError)
46
- end
47
-
48
- it "should set the background position" do
49
- evaluate('sprite-image("sprites/30x30.png") sprite-image("sprites/150x10.png")').should ==
50
- "url('/sprites.png') url('/sprites.png') 0 -30px"
51
- image_size('sprites.png').should == [150, 40]
52
- end
53
-
54
- it "should use the X position" do
55
- evaluate('sprite-image("sprites/30x30.png", 5px, 0)').should == "url('/sprites.png') 5px 0"
56
- image_size('sprites.png').should == [30, 30]
57
- end
58
-
59
- it "should include the Y position" do
60
- evaluate('sprite-image("sprites/30x30.png", 0, 3px) sprite-image("sprites/150x10.png", 0, -6px)').should ==
61
- "url('/sprites.png') 0 3px url('/sprites.png') 0 -36px"
62
- end
63
-
64
- it "should calculate 20px empty space between sprites" do
65
- # Resulting sprite should look like (1 line = 10px height, X = placed image):
66
-
67
- # X
68
- #
69
- #
70
- # XX
71
- # XX
72
- #
73
- #
74
- # XXX
75
- # XXX
76
- # XXX
77
-
78
- evaluate(
79
- 'sprite-image("sprites/10x10.png")',
80
- 'sprite-image("sprites/20x20.png", 0, 0, 20px)',
81
- 'sprite-image("sprites/30x30.png", 0, 0, 20px)'
82
- ).should == [
83
- "url('/sprites.png')",
84
- "url('/sprites.png') 0 -30px",
85
- "url('/sprites.png') 0 -70px"
86
- ]
87
- image_size('sprites.png').should == [30, 100]
88
- end
89
-
90
- it "should calculate empty space between sprites and combine space like CSS margins" do
91
- # Resulting sprite should look like (1 line = 10px height, X = placed image):
92
-
93
- # X
94
- #
95
- #
96
- #
97
- # XX
98
- # XX
99
- #
100
- # XXX
101
- # XXX
102
- # XXX
103
-
104
- evaluate(
105
- 'sprite-image("sprites/10x10.png", 0, 0, 0, 30px)',
106
- 'sprite-image("sprites/20x20.png", 0, 0, 20px, 5px)',
107
- 'sprite-image("sprites/30x30.png", 0, 0, 10px)'
108
- ).should == [
109
- "url('/sprites.png')",
110
- "url('/sprites.png') 0 -40px",
111
- "url('/sprites.png') 0 -70px"
112
- ]
113
- image_size('sprites.png').should == [30, 100]
114
- end
115
-
116
- it "should calculate empty space correctly when 2 output images are uses" do
117
- evaluate(
118
- 'sprite-image("sprites/10x10.png", 0, 0, 0, 30px)',
119
- 'sprite-image("other_images/test.png")',
120
- 'sprite-image("sprites/20x20.png", 0, 0, 20px, 5px)'
121
- ).should == [
122
- "url('/sprites.png')",
123
- "url('/other_images.png')",
124
- "url('/sprites.png') 0 -40px"
125
- ]
126
- end
127
-
128
- it "should allow % for x positions" do
129
- # Resulting sprite should look like (1 line = 10px height, X = placed image):
130
-
131
- # XXXXXXXXXXXXXXX
132
- # X
133
-
134
- evaluate(
135
- 'sprite-image("sprites/150x10.png")',
136
- 'sprite-image("sprites/10x10.png", 100%)'
137
- ).should == [
138
- "url('/sprites.png')",
139
- "url('/sprites.png') 100% -10px"
140
- ]
141
- end
142
-
143
- it "should not compose the same image twice" do
144
- evaluate(
145
- 'sprite-image("sprites/10x10.png")',
146
- 'sprite-image("sprites/20x20.png")',
147
- 'sprite-image("sprites/20x20.png")' # reuse image from line above
148
- ).should == [
149
- "url('/sprites.png')",
150
- "url('/sprites.png') 0 -10px",
151
- "url('/sprites.png') 0 -10px"
152
- ]
153
- image_size('sprites.png').should == [20, 30]
154
- end
155
-
156
- it "should calculate the maximum spacing between images" do
157
- evaluate(
158
- 'sprite-image("sprites/10x10.png")',
159
- 'sprite-image("sprites/20x20.png", 0, 0, 10px)',
160
- 'sprite-image("sprites/20x20.png", 0, 0, 99px)' # 99px > 10px
161
- ).should == [
162
- "url('/sprites.png')",
163
- "url('/sprites.png') 0 -109px", # use 99px spacing
164
- "url('/sprites.png') 0 -109px"
165
- ]
166
- image_size('sprites.png').should == [20, 129]
167
- end
168
-
169
- it "should calculate the maximum spacing between images for margin bottom" do
170
- evaluate(
171
- 'sprite-image("sprites/10x10.png", 0, 0, 0, 10px)',
172
- 'sprite-image("sprites/10x10.png", 0, 0, 0, 99px)', # 99px > 10px
173
- 'sprite-image("sprites/20x20.png")',
174
- ).should == [
175
- "url('/sprites.png')",
176
- "url('/sprites.png')",
177
- "url('/sprites.png') 0 -109px" # use 99px spacing
178
- ]
179
- image_size('sprites.png').should == [20, 129]
180
- end
181
-
182
- it "should output the background-position" do
183
- evaluate(
184
- 'sprite-position("sprites/10x10.png")',
185
- 'sprite-position("sprites/20x20.png")'
186
- ).should == [
187
- "0 0",
188
- "0 -10px"
189
- ]
190
- end
191
-
192
- it "should output the background-image URL" do
193
- evaluate('sprite-url("sprites")').should == "url('/sprites.png')"
194
- evaluate('sprite-url("sprites/10x10.png")').should == "url('/sprites.png')"
195
- evaluate('sprite-url("sprites/20x20.png")').should == "url('/sprites.png')"
196
- evaluate('sprite-url("other_images/test.png")').should == "url('/other_images.png')"
197
- end
198
-
199
- it "should count the PNG files in a folder" do
200
- evaluate('sprite-files-in-folder("sprites")').to_i.should == 4
201
- end
202
-
203
- it "should output the n-th file in a folder" do
204
- evaluate('sprite-file-from-folder("sprites", 0)').should == "sprites/10x10.png"
205
- evaluate('sprite-file-from-folder("sprites", 1)').should == "sprites/150x10.png"
206
- end
207
-
208
- it "should output the filename without extention for the sprite" do
209
- evaluate('sprite-name("sprites")').should == "sprites"
210
- evaluate('sprite-name("sprites/10x10.png")').should == "sprites"
211
- end
212
-
213
- it "should output the filename without extention for the sprite item" do
214
- evaluate('image-basename("sprites/10x10.png")').should == "10x10"
215
- end
216
-
217
- end
@@ -1,4 +0,0 @@
1
- --colour
2
- --format s
3
- --loadby mtime
4
- --reverse
@@ -1,15 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
-
4
- require 'rubygems'
5
- require 'compass'
6
- require 'lemonade'
7
- require 'spec'
8
- require 'spec/autorun'
9
-
10
- IMAGES_TMP_PATH = File.dirname(__FILE__) + '/images-tmp'
11
- Compass.configuration.images_path = IMAGES_TMP_PATH
12
-
13
- Spec::Runner.configure do |config|
14
-
15
- end
@@ -1,60 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe Sass::Script::SpriteInfo do
4
-
5
- before :each do
6
- Compass.configuration.http_images_path = ''
7
- end
8
-
9
- def sprite_info(*args)
10
- Sass::Script::SpriteInfo.new(*args).to_s
11
- end
12
-
13
- ##
14
-
15
- it "should output the position for the first sprite" do
16
- sprite = { :file => "sprites.png" }
17
- sprite_item = { :y => Sass::Script::Number.new(20, ['px']), :index => 0 }
18
- x = Sass::Script::Number.new(10, ['px'])
19
- sprite_info(:position, sprite, sprite_item, x).should == "10px 0"
20
- end
21
-
22
- it "should output the position for the second+ sprite" do
23
- sprite = { :file => "sprites.png" }
24
- sprite_item = { :y => Sass::Script::Number.new(20, ['px']), :index => 1 }
25
- x = Sass::Script::Number.new(10, ['px'])
26
- sprite_info(:position, sprite, sprite_item, x).should ==
27
- "10px <%= Lemonade.sprites['sprites.png'][:images][1][:y].unary_minus %>"
28
- end
29
-
30
- it "should output the position with y shift" do
31
- sprite = { :file => "sprites.png" }
32
- sprite_item = { :y => Sass::Script::Number.new(20, ['px']), :index => 1 }
33
- x = Sass::Script::Number.new(10, ['px'])
34
- y_shift = Sass::Script::Number.new(3, ['px'])
35
- sprite_info(:position, sprite, sprite_item, x, y_shift).should ==
36
- "10px <%= Lemonade.sprites['sprites.png'][:images][1][:y].unary_minus.plus(Sass::Script::Number.new(3, ['px'])) %>"
37
- end
38
-
39
- it "should output the position with percentage" do
40
- sprite = { :file => "sprites.png" }
41
- sprite_item = { :y => Sass::Script::Number.new(20, ['px']), :index => 2 }
42
- x = Sass::Script::Number.new(100, ['%'])
43
- sprite_info(:position, sprite, sprite_item, x).should ==
44
- "100% <%= Lemonade.sprites['sprites.png'][:images][2][:y].unary_minus %>"
45
- end
46
-
47
- it "should output the url" do
48
- sprite = { :file => "sprites.png" }
49
- sprite_item = { }
50
- sprite_info(:url, sprite, sprite_item).should == "url('/sprites.png')"
51
- end
52
-
53
- it "should output the url with compass path" do
54
- sprite = { :file => "sprites.png" }
55
- sprite_item = { }
56
- Compass.configuration.http_images_path = '/louvre'
57
- sprite_info(:url, sprite, sprite_item).should == "url('/louvre/sprites.png')"
58
- end
59
-
60
- end
@@ -1,38 +0,0 @@
1
- @mixin image-dimensions($file) {
2
- height: image-height($file);
3
- width: image-width($file);
4
- }
5
-
6
- @mixin sprite-image($file) {
7
- background: sprite-image($file) $repeat;
8
- }
9
-
10
- @mixin sized-sprite-image($file) {
11
- background: sprite-image($file);
12
- @include image-dimensions($file);
13
- }
14
-
15
- @mixin sprite-folder($folder, $image-dimensions: false) {
16
- .#{$folder} {
17
- @if $image-dimensions {
18
- background: sprite-url($folder);
19
- }
20
- @else {
21
- background: sprite-url($folder) no-repeat;
22
- }
23
- }
24
- @for $i from 0 to sprite-files-in-folder($folder) {
25
- $file: sprite-file-from-folder($folder, $i);
26
- .#{$folder}-#{image-basename($file)} {
27
- @extend .#{$folder};
28
- background-position: sprite-position(sprite-file-from-folder($folder, $i));
29
- @if $image-dimensions {
30
- @include image-dimensions($file);
31
- }
32
- }
33
- }
34
- }
35
-
36
- @mixin sized-sprite-folder($folder) {
37
- @include sprite-folder($folder, true);
38
- }