compass 0.11.2 → 0.11.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/VERSION.yml +1 -1
  2. data/features/command_line.feature +22 -1
  3. data/features/step_definitions/command_line_steps.rb +21 -1
  4. data/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss +1 -0
  5. data/frameworks/compass/stylesheets/compass/css3/_box.scss +9 -9
  6. data/frameworks/compass/stylesheets/compass/css3/_font-face.scss +4 -14
  7. data/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss +14 -1
  8. data/lib/compass.rbc +87 -11
  9. data/lib/compass/actions.rb +21 -9
  10. data/lib/compass/actions.rbc +453 -210
  11. data/lib/compass/commands.rb +1 -1
  12. data/lib/compass/commands/clean_project.rb +79 -0
  13. data/lib/compass/commands/registry.rb +3 -1
  14. data/lib/compass/commands/sprite.rb +1 -1
  15. data/lib/compass/commands/update_project.rb +5 -6
  16. data/lib/compass/commands/watch_project.rb +1 -1
  17. data/lib/compass/compiler.rb +12 -9
  18. data/lib/compass/compiler.rbc +386 -294
  19. data/lib/compass/configuration/adapters.rb +2 -2
  20. data/lib/compass/configuration/adapters.rbc +4 -4
  21. data/lib/compass/configuration/data.rb +4 -2
  22. data/lib/compass/exec/sub_command_ui.rb +1 -1
  23. data/lib/compass/sass_extensions.rbc +117 -19
  24. data/lib/compass/sass_extensions/functions/gradient_support.rbc +489 -453
  25. data/lib/compass/sass_extensions/functions/sprites.rb +4 -4
  26. data/lib/compass/sass_extensions/functions/sprites.rbc +588 -309
  27. data/lib/compass/sass_extensions/functions/urls.rb +18 -3
  28. data/lib/compass/sass_extensions/sprites.rb +9 -7
  29. data/lib/compass/sass_extensions/sprites.rbc +48 -64
  30. data/lib/compass/sass_extensions/sprites/engines.rb +24 -0
  31. data/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb +13 -7
  32. data/lib/compass/sass_extensions/sprites/image_methods.rb +32 -0
  33. data/lib/compass/sass_extensions/sprites/sprite_map.rb +54 -142
  34. data/lib/compass/sass_extensions/sprites/sprite_map.rbc +3839 -1536
  35. data/lib/compass/sass_extensions/sprites/{base.rb → sprite_methods.rb} +21 -101
  36. data/lib/compass/sprite_importer.rb +202 -0
  37. data/lib/compass/sprite_importer.rbc +3943 -0
  38. data/lib/compass/validator.rb +11 -4
  39. data/lib/compass/version.rbc +67 -109
  40. data/test/fixtures/sprites/public/images/bad_extensions/ten-by-ten.gif +0 -0
  41. data/test/fixtures/sprites/public/images/bad_extensions/twenty-by-twenty.jpg +0 -0
  42. data/test/fixtures/stylesheets/busted_image_urls/config.rb +29 -0
  43. data/test/fixtures/stylesheets/busted_image_urls/css/screen.css +9 -0
  44. data/test/fixtures/stylesheets/busted_image_urls/images/feed.png +0 -0
  45. data/test/fixtures/stylesheets/busted_image_urls/images/flags/dk.png +0 -0
  46. data/test/fixtures/stylesheets/busted_image_urls/images/grid.png +0 -0
  47. data/test/fixtures/stylesheets/busted_image_urls/sass/screen.sass +14 -0
  48. data/test/fixtures/stylesheets/busted_image_urls/tmp/screen.css +9 -0
  49. data/test/fixtures/stylesheets/compass/css/box.css +19 -0
  50. data/test/fixtures/stylesheets/compass/css/legacy_clearfix.css +9 -0
  51. data/test/fixtures/stylesheets/compass/css/sprites.css +1 -1
  52. data/test/fixtures/stylesheets/compass/css/utilities.css +7 -0
  53. data/test/fixtures/stylesheets/compass/images/{flag-03c3b29b35.png → flag-s03c3b29b35.png} +0 -0
  54. data/test/fixtures/stylesheets/compass/sass/legacy_clearfix.scss +3 -0
  55. data/test/fixtures/stylesheets/compass/sass/utilities.scss +4 -1
  56. data/test/fixtures/stylesheets/error/config.rb +10 -0
  57. data/test/fixtures/stylesheets/error/sass/screen.sass +2 -0
  58. data/test/integrations/compass_test.rb +22 -9
  59. data/test/integrations/sprites_test.rb +45 -45
  60. data/test/units/actions_test.rb +24 -0
  61. data/test/units/sprites/engine_test.rb +43 -0
  62. data/test/units/sprites/image_test.rb +2 -2
  63. data/test/units/sprites/importer_test.rb +66 -0
  64. data/test/units/sprites/sprite_command_test.rb +60 -0
  65. data/test/units/sprites/{base_test.rb → sprite_map_test.rb} +5 -5
  66. metadata +43 -34
  67. data/lib/compass/sass_extensions/sprites/sprites.rb +0 -62
@@ -91,9 +91,7 @@ module Compass::SassExtensions::Functions::Urls
91
91
  if cache_buster.is_a?(Sass::Script::String)
92
92
  path += "?#{cache_buster.value}"
93
93
  else
94
- if buster = compute_cache_buster(path, real_path)
95
- path += "?#{buster}"
96
- end
94
+ path = cache_busted_path(path, real_path)
97
95
  end
98
96
  end
99
97
 
@@ -137,6 +135,23 @@ module Compass::SassExtensions::Functions::Urls
137
135
  end
138
136
  end
139
137
 
138
+ def cache_busted_path(path, real_path)
139
+ cache_buster = compute_cache_buster(path, real_path)
140
+ if cache_buster.nil?
141
+ return path
142
+ elsif cache_buster.is_a?(String)
143
+ cache_buster = {:query => cache_buster}
144
+ else
145
+ path = cache_buster[:path] if cache_buster[:path]
146
+ end
147
+
148
+ if cache_buster[:query]
149
+ "%s?%s" % [path, cache_buster[:query]]
150
+ else
151
+ path
152
+ end
153
+ end
154
+
140
155
  def compute_cache_buster(path, real_path)
141
156
  if Compass.configuration.asset_cache_buster
142
157
  args = [path]
@@ -1,14 +1,16 @@
1
1
  require 'digest/md5'
2
- require 'compass/sass_extensions/sprites/sprites'
3
- require 'compass/sass_extensions/sprites/sprite_map'
4
- require 'compass/sass_extensions/sprites/image'
5
- require 'compass/sass_extensions/sprites/base'
6
- require 'compass/sass_extensions/sprites/engines'
2
+ require 'compass/sprite_importer'
7
3
 
8
4
  module Compass
9
5
  module SassExtensions
10
6
  module Sprites
11
-
12
7
  end
13
8
  end
14
- end
9
+ end
10
+
11
+ require 'compass/sass_extensions/sprites/image'
12
+ require 'compass/sass_extensions/sprites/sprite_methods'
13
+ require 'compass/sass_extensions/sprites/image_methods'
14
+ require 'compass/sass_extensions/sprites/sprite_map'
15
+ require 'compass/sass_extensions/sprites/engines'
16
+
@@ -9,7 +9,7 @@ x
9
9
  10
10
10
  __script__
11
11
  i
12
- 82
12
+ 73
13
13
  5
14
14
  7
15
15
  0
@@ -28,27 +28,35 @@ i
28
28
  1
29
29
  1
30
30
  15
31
- 5
31
+ 99
32
32
  7
33
33
  3
34
- 64
35
- 47
34
+ 65
36
35
  49
37
- 1
38
- 1
39
- 15
36
+ 4
37
+ 2
38
+ 13
39
+ 99
40
+ 12
41
+ 7
40
42
  5
43
+ 12
44
+ 7
45
+ 6
46
+ 12
47
+ 65
48
+ 12
49
+ 49
41
50
  7
42
51
  4
43
- 64
44
- 47
52
+ 15
45
53
  49
46
- 1
47
- 1
54
+ 5
55
+ 0
48
56
  15
49
57
  5
50
58
  7
51
- 5
59
+ 8
52
60
  64
53
61
  47
54
62
  49
@@ -57,38 +65,21 @@ i
57
65
  15
58
66
  5
59
67
  7
60
- 6
68
+ 9
61
69
  64
62
70
  47
63
71
  49
64
72
  1
65
73
  1
66
74
  15
67
- 99
68
- 7
69
- 7
70
- 65
71
- 49
72
- 8
73
- 2
74
- 13
75
- 99
76
- 12
77
- 7
78
- 9
79
- 12
75
+ 5
80
76
  7
81
77
  10
82
- 12
83
- 65
84
- 12
85
- 49
86
- 11
87
- 4
88
- 15
78
+ 64
79
+ 47
89
80
  49
90
- 9
91
- 0
81
+ 1
82
+ 1
92
83
  15
93
84
  2
94
85
  11
@@ -102,7 +93,7 @@ I
102
93
  0
103
94
  n
104
95
  p
105
- 12
96
+ 11
106
97
  s
107
98
  10
108
99
  digest/md5
@@ -110,20 +101,8 @@ x
110
101
  7
111
102
  require
112
103
  s
113
- 39
114
- compass/sass_extensions/sprites/sprites
115
- s
116
- 42
117
- compass/sass_extensions/sprites/sprite_map
118
- s
119
- 37
120
- compass/sass_extensions/sprites/image
121
- s
122
- 36
123
- compass/sass_extensions/sprites/base
124
- s
125
- 39
126
- compass/sass_extensions/sprites/engines
104
+ 23
105
+ compass/sprite_importer
127
106
  x
128
107
  7
129
108
  Compass
@@ -233,7 +212,7 @@ p
233
212
  I
234
213
  2
235
214
  I
236
- a
215
+ 6
237
216
  I
238
217
  c
239
218
  x
@@ -249,7 +228,7 @@ p
249
228
  I
250
229
  2
251
230
  I
252
- 9
231
+ 5
253
232
  I
254
233
  1c
255
234
  x
@@ -260,8 +239,17 @@ p
260
239
  x
261
240
  13
262
241
  attach_method
242
+ s
243
+ 37
244
+ compass/sass_extensions/sprites/image
245
+ s
246
+ 42
247
+ compass/sass_extensions/sprites/sprite_map
248
+ s
249
+ 39
250
+ compass/sass_extensions/sprites/engines
263
251
  p
264
- 15
252
+ 13
265
253
  I
266
254
  0
267
255
  I
@@ -273,25 +261,21 @@ I
273
261
  I
274
262
  12
275
263
  I
276
- 3
277
- I
278
- 1b
279
- I
280
264
  4
281
265
  I
282
- 24
266
+ 2c
283
267
  I
284
- 5
268
+ b
285
269
  I
286
- 2d
270
+ 35
287
271
  I
288
- 6
272
+ c
289
273
  I
290
- 36
274
+ 3e
291
275
  I
292
- 8
276
+ d
293
277
  I
294
- 52
278
+ 49
295
279
  x
296
280
  68
297
281
  /Users/chris/Projects/compass/lib/compass/sass_extensions/sprites.rb
@@ -1 +1,25 @@
1
+ module Compass
2
+ module SassExtensions
3
+ module Sprites
4
+ class Engine
5
+ attr_accessor :width, :height, :images, :canvas
6
+ def initialize(width, height, images)
7
+ @width, @height, @images = width, height, images
8
+ @canvas = nil
9
+ end
10
+
11
+ def construct_sprite
12
+ raise ::Compass::Error, "You must impliment construct_sprite"
13
+ end
14
+
15
+ def save(filename)
16
+ raise ::Compass::Error, "You must impliment save(filename)"
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+
1
25
  require 'compass/sass_extensions/sprites/engines/chunky_png_engine'
@@ -7,20 +7,19 @@ end
7
7
  module Compass
8
8
  module SassExtensions
9
9
  module Sprites
10
- module ChunkyPngEngine
11
-
12
- # Returns a PNG object
10
+ class ChunkyPngEngine < Compass::SassExtensions::Sprites::Engine
11
+
13
12
  def construct_sprite
14
- output_png = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
13
+ @canvas = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
15
14
  images.each do |image|
16
15
  input_png = ChunkyPNG::Image.from_file(image.file)
17
16
  if image.repeat == "no-repeat"
18
- output_png.replace! input_png, image.left, image.top
17
+ canvas.replace! input_png, image.left, image.top
19
18
  else
20
19
  x = image.left - (image.left / image.width).ceil * image.width
21
20
  while x < width do
22
21
  begin
23
- output_png.replace! input_png, x, image.top
22
+ canvas.replace! input_png, x, image.top
24
23
  x += image.width
25
24
  rescue ChunkyPNG::OutOfBounds
26
25
  break;
@@ -28,8 +27,15 @@ module Compass
28
27
  end
29
28
  end
30
29
  end
31
- output_png
30
+ end
31
+
32
+ def save(filename)
33
+ if canvas.nil?
34
+ construct_sprite
35
+ end
36
+ canvas.save(filename, :best_compression)
32
37
  end
38
+
33
39
  end
34
40
  end
35
41
  end
@@ -0,0 +1,32 @@
1
+ module Compass
2
+ module SassExtensions
3
+ module Sprites
4
+ module ImageMethods
5
+ # Fetches the Sprite::Image object for the supplied name
6
+ def image_for(name)
7
+ @images.detect { |img| img.name == name}
8
+ end
9
+
10
+ # Returns true if the image name has a hover selector image
11
+ def has_hover?(name)
12
+ !image_for("#{name}_hover").nil?
13
+ end
14
+
15
+ # Returns true if the image name has a target selector image
16
+ def has_target?(name)
17
+ !image_for("#{name}_target").nil?
18
+ end
19
+
20
+ # Returns true if the image name has an active selector image
21
+ def has_active?(name)
22
+ !image_for("#{name}_active").nil?
23
+ end
24
+
25
+ # Return and array of image names that make up this sprite
26
+ def sprite_names
27
+ image_names.map { |f| File.basename(f, '.png') }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,154 +1,66 @@
1
1
  module Compass
2
- class SpriteMap
3
- attr_reader :uri, :options
4
- VAILD_FILE_NAME = /\A#{Sass::SCSS::RX::IDENT}\Z/
5
-
6
- def find_relative(*args)
7
- nil
8
- end
9
-
10
- def initialize(uri, options)
11
- @uri, @options = uri, options
12
- end
13
-
14
- # Name of this spite
15
- def name
16
- ensure_path_and_name!
17
- @name
18
- end
19
-
20
- # The on-disk location of this sprite
21
- def path
22
- ensure_path_and_name!
23
- @path
24
- end
25
-
26
- # Returns the Glob of image files for this sprite
27
- def files
28
- @files ||= Dir[File.join(Compass.configuration.images_path, uri)].sort
29
- end
30
-
31
- # Returns an Array of image names without the file extension
32
- def sprite_names
33
- @sprite_names ||= files.collect do |file|
34
- filename = File.basename(file, '.png')
35
- unless VAILD_FILE_NAME =~ filename
36
- raise Compass::Error, "Sprite file names must be legal css identifiers. Please rename #{File.basename(file)}"
2
+ module SassExtensions
3
+ module Sprites
4
+ class SpriteMap < Sass::Script::Literal
5
+ attr_accessor :image_names, :path, :name, :map, :kwargs
6
+ attr_accessor :images, :width, :height, :engine
7
+
8
+ include SpriteMethods
9
+ include ImageMethods
10
+
11
+
12
+ # Initialize a new sprite object from a relative file path
13
+ # the path is relative to the <tt>images_path</tt> confguration option
14
+ def self.from_uri(uri, context, kwargs)
15
+ importer = ::Compass::SpriteImporter.new(:uri => uri.value, :options => {})
16
+ sprites = importer.files.map do |sprite|
17
+ sprite.gsub(Compass.configuration.images_path+"/", "")
18
+ end
19
+ new(sprites, importer.path, importer.name, context, kwargs)
37
20
  end
38
- filename
39
- end
40
- end
41
-
42
- # Returns the sass options for this sprite
43
- def sass_options
44
- @sass_options ||= options.merge(:filename => name, :syntax => :scss, :importer => self)
45
- end
46
-
47
- # Returns a Sass::Engine for this sprite object
48
- def sass_engine
49
- Sass::Engine.new(content_for_images, sass_options)
50
- end
51
-
52
- def ensure_path_and_name!
53
- @path ||= get_path
54
- @name ||= get_name
55
- end
56
-
57
- def get_name
58
- _, name = Compass::Sprites.path_and_name(uri)
59
- name
60
- end
61
-
62
- def get_path
63
- path, _ = Compass::Sprites.path_and_name(uri)
64
- path
65
- end
66
-
67
- def key(uri, options)
68
- Compass::Sprites.key(uri)
69
- end
70
-
71
- def mtime(uri, options)
72
- Compass::Sprites.mtime(uri, options)
73
- end
74
21
 
75
- # Generates the Sass for this sprite file
76
- def content_for_images(skip_overrides = false)
77
- <<-SCSS
78
- @import "compass/utilities/sprites/base";
79
-
80
- // General Sprite Defaults
81
- // You can override them before you import this file.
82
- $#{name}-sprite-base-class: ".#{name}-sprite" !default;
83
- $#{name}-sprite-dimensions: false !default;
84
- $#{name}-position: 0% !default;
85
- $#{name}-spacing: 0 !default;
86
- $#{name}-repeat: no-repeat !default;
87
- $#{name}-prefix: '' !default;
88
- $#{name}-clean-up: true !default;
89
-
90
- #{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $cleanup: $#{name}-clean-up);" : generate_overrides }
22
+ def initialize(sprites, path, name, context, kwargs)
23
+ @image_names = sprites
24
+ @path = path
25
+ @name = name
26
+ @kwargs = kwargs
27
+ @kwargs['cleanup'] ||= Sass::Script::Bool.new(true)
28
+ @images = nil
29
+ @width = nil
30
+ @height = nil
31
+ @engine = nil
32
+ @evaluation_context = context
33
+ validate!
34
+ compute_image_metadata!
35
+ end
91
36
 
92
- // All sprites should extend this class
93
- // The #{name}-sprite mixin will do so for you.
94
- \#{$#{name}-sprite-base-class} {
95
- background: $#{name}-sprites no-repeat;
96
- }
37
+ def inspect
38
+ to_s
39
+ end
97
40
 
98
- // Use this to set the dimensions of an element
99
- // based on the size of the original image.
100
- @mixin #{name}-sprite-dimensions($name) {
101
- @include sprite-dimensions($#{name}-sprites, $name)
102
- }
41
+ def to_s(kwargs = self.kwargs)
42
+ sprite_url(self).value
43
+ end
103
44
 
104
- // Move the background position to display the sprite.
105
- @mixin #{name}-sprite-position($name, $offset-x: 0, $offset-y: 0) {
106
- @include sprite-background-position($#{name}-sprites, $name, $offset-x, $offset-y)
107
- }
45
+ def respond_to?(meth)
46
+ super || @evaluation_context.respond_to?(meth)
47
+ end
108
48
 
109
- // Extends the sprite base class and set the background position for the desired sprite.
110
- // It will also apply the image dimensions if $dimensions is true.
111
- @mixin #{name}-sprite($name, $dimensions: $#{name}-sprite-dimensions, $offset-x: 0, $offset-y: 0) {
112
- @extend \#{$#{name}-sprite-base-class};
113
- @include sprite($#{name}-sprites, $name, $dimensions, $offset-x, $offset-y)
114
- }
49
+ def method_missing(meth, *args, &block)
50
+ if @evaluation_context.respond_to?(meth)
51
+ @evaluation_context.send(meth, *args, &block)
52
+ else
53
+ super
54
+ end
55
+ end
115
56
 
116
- @mixin #{name}-sprites($sprite-names, $dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites)) {
117
- @include sprites($#{name}-sprites, $sprite-names, $#{name}-sprite-base-class, $dimensions, $prefix)
118
- }
57
+ private
119
58
 
120
- // Generates a class for each sprited image.
121
- @mixin all-#{name}-sprites($dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites)) {
122
- @include #{name}-sprites(#{sprite_names.join(" ")}, $dimensions, $prefix);
123
- }
124
- SCSS
125
- end
126
-
127
- # Generates the override defaults for this Sprite
128
- # <tt>$#{name}-#{sprite_name}-position </tt>
129
- # <tt> $#{name}-#{sprite_name}-spacing </tt>
130
- # <tt> #{name}-#{sprite_name}-repeat: </tt>
131
- def generate_overrides
132
- content = <<-TXT
133
- // These variables control the generated sprite output
134
- // You can override them selectively before you import this file.
135
- TXT
136
- sprite_names.map do |sprite_name|
137
- content += <<-SCSS
138
- $#{name}-#{sprite_name}-position: $#{name}-position !default;
139
- $#{name}-#{sprite_name}-spacing: $#{name}-spacing !default;
140
- $#{name}-#{sprite_name}-repeat: $#{name}-repeat !default;
141
- SCSS
142
- end.join
59
+ def modulize
60
+ @modulize ||= Compass::configuration.sprite_engine.to_s.scan(/([^_.]+)/).flatten.map {|chunk| "#{chunk[0].chr.upcase}#{chunk[1..-1]}" }.join
61
+ end
143
62
 
144
- content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$cleanup: $#{name}-clean-up,\n"
145
- content += sprite_names.map do |sprite_name|
146
- %Q{ $#{sprite_name}-position: $#{name}-#{sprite_name}-position,
147
- $#{sprite_name}-spacing: $#{name}-#{sprite_name}-spacing,
148
- $#{sprite_name}-repeat: $#{name}-#{sprite_name}-repeat}
149
- end.join(",\n")
150
- content += ");"
63
+ end
151
64
  end
152
65
  end
153
- end
154
-
66
+ end