compass 0.13.alpha.4 → 0.13.alpha.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +7 -0
  2. data/README.markdown +2 -3
  3. data/Rakefile +91 -5
  4. data/VERSION.yml +1 -1
  5. data/examples/compass/images/emblem-a043c4f148.png +0 -0
  6. data/examples/compass/images/flag-03c3b29b35.png +0 -0
  7. data/examples/compass/images/flag-21cfbfbfc8.png +0 -0
  8. data/examples/css3/extensions/fancy-fonts/templates/project/Prociono.otf +0 -0
  9. data/features/command_line.feature +2 -6
  10. data/features/step_definitions/command_line_steps.rb +1 -0
  11. data/frameworks/compass/stylesheets/compass/_css3.scss +0 -1
  12. data/frameworks/compass/stylesheets/compass/_support.scss +353 -35
  13. data/frameworks/compass/stylesheets/compass/css3/_animation.scss +49 -48
  14. data/frameworks/compass/stylesheets/compass/css3/_appearance.scss +4 -8
  15. data/frameworks/compass/stylesheets/compass/css3/_background-clip.scss +15 -19
  16. data/frameworks/compass/stylesheets/compass/css3/_background-origin.scss +17 -19
  17. data/frameworks/compass/stylesheets/compass/css3/_background-size.scss +4 -8
  18. data/frameworks/compass/stylesheets/compass/css3/_border-radius.scss +37 -39
  19. data/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss +45 -20
  20. data/frameworks/compass/stylesheets/compass/css3/_box-sizing.scss +6 -8
  21. data/frameworks/compass/stylesheets/compass/css3/_box.scss +12 -13
  22. data/frameworks/compass/stylesheets/compass/css3/_columns.scss +46 -26
  23. data/frameworks/compass/stylesheets/compass/css3/_deprecated-support.scss +272 -0
  24. data/frameworks/compass/stylesheets/compass/css3/_filter.scss +17 -10
  25. data/frameworks/compass/stylesheets/compass/css3/_flexbox.scss +134 -281
  26. data/frameworks/compass/stylesheets/compass/css3/_font-face.scss +5 -5
  27. data/frameworks/compass/stylesheets/compass/css3/_hyphenation.scss +14 -11
  28. data/frameworks/compass/stylesheets/compass/css3/_images.scss +77 -67
  29. data/frameworks/compass/stylesheets/compass/css3/_inline-block.scss +15 -6
  30. data/frameworks/compass/stylesheets/compass/css3/_opacity.scss +6 -2
  31. data/frameworks/compass/stylesheets/compass/css3/_pie.scss +1 -73
  32. data/frameworks/compass/stylesheets/compass/css3/_regions.scss +7 -6
  33. data/frameworks/compass/stylesheets/compass/css3/_selection.scss +45 -17
  34. data/frameworks/compass/stylesheets/compass/css3/_shared.scss +4 -261
  35. data/frameworks/compass/stylesheets/compass/css3/_text-shadow.scss +1 -1
  36. data/frameworks/compass/stylesheets/compass/css3/_transform.scss +24 -32
  37. data/frameworks/compass/stylesheets/compass/css3/_transition.scss +102 -152
  38. data/frameworks/compass/stylesheets/compass/css3/_user-interface.scss +42 -27
  39. data/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss +2 -1
  40. data/frameworks/compass/stylesheets/compass/typography/links/_hover-link.scss +1 -1
  41. data/frameworks/compass/stylesheets/compass/typography/lists/_horizontal-list.scss +2 -2
  42. data/frameworks/compass/stylesheets/compass/typography/lists/_inline-list.scss +1 -1
  43. data/frameworks/compass/stylesheets/compass/typography/text/_ellipsis.scss +1 -1
  44. data/frameworks/compass/stylesheets/compass/utilities/_sass.scss +2 -0
  45. data/frameworks/compass/stylesheets/compass/utilities/color/_brightness.scss +12 -0
  46. data/frameworks/compass/stylesheets/compass/utilities/color/_contrast.scss +36 -12
  47. data/frameworks/compass/stylesheets/compass/utilities/general/_float.scss +6 -2
  48. data/frameworks/compass/stylesheets/compass/utilities/general/_hacks.scss +23 -4
  49. data/frameworks/compass/stylesheets/compass/utilities/general/_min.scss +1 -1
  50. data/frameworks/compass/stylesheets/compass/utilities/sass/_lists.scss +16 -0
  51. data/frameworks/compass/stylesheets/compass/utilities/sass/_maps.scss +19 -0
  52. data/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss +25 -18
  53. data/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss +3 -1
  54. data/frameworks/compass/stylesheets/compass/utilities/tables/_borders.scss +3 -3
  55. data/lib/compass.rb +1 -1
  56. data/lib/compass/browser_support.rb +1 -1
  57. data/lib/compass/caniuse.rb +247 -0
  58. data/lib/compass/configuration/adapters.rb +7 -1
  59. data/lib/compass/sass_extensions/functions.rb +5 -0
  60. data/lib/compass/sass_extensions/functions/constants.rb +2 -2
  61. data/lib/compass/sass_extensions/functions/cross_browser_support.rb +176 -1
  62. data/lib/compass/sass_extensions/functions/display.rb +24 -19
  63. data/lib/compass/sass_extensions/functions/env.rb +37 -8
  64. data/lib/compass/sass_extensions/functions/gradient_support.rb +10 -13
  65. data/lib/compass/sass_extensions/functions/math.rb +31 -13
  66. data/lib/compass/sass_extensions/functions/sprites.rb +48 -25
  67. data/lib/compass/sass_extensions/monkey_patches/browser_support.rb +42 -13
  68. data/lib/compass/sass_extensions/sprites/image.rb +14 -4
  69. data/lib/compass/sass_extensions/sprites/image_methods.rb +19 -3
  70. data/lib/compass/sprite_importer/content.erb +8 -7
  71. data/lib/compass/watcher/project_watcher.rb +75 -42
  72. data/lib/compass/watcher/watch.rb +35 -17
  73. data/test/fixtures/sprites/public/images/focus/ten-by-ten.png +0 -0
  74. data/test/fixtures/sprites/public/images/focus/ten-by-ten_active.png +0 -0
  75. data/test/fixtures/sprites/public/images/focus/ten-by-ten_focus.png +0 -0
  76. data/test/fixtures/sprites/public/images/focus/ten-by-ten_hover.png +0 -0
  77. data/test/fixtures/sprites/public/images/focus/ten-by-ten_target.png +0 -0
  78. data/test/fixtures/stylesheets/compass/config.rb +1 -0
  79. data/test/fixtures/stylesheets/compass/css/animation-with-legacy-ie.css +1 -9
  80. data/test/fixtures/stylesheets/compass/css/animation.css +1 -9
  81. data/test/fixtures/stylesheets/compass/css/appearance.css +3 -0
  82. data/test/fixtures/stylesheets/compass/css/background-clip.css +4 -8
  83. data/test/fixtures/stylesheets/compass/css/background-origin.css +4 -8
  84. data/test/fixtures/stylesheets/compass/css/background-size.css +3 -10
  85. data/test/fixtures/stylesheets/compass/css/border_radius.css +3 -3
  86. data/test/fixtures/stylesheets/compass/css/{box-sizeing.css → box-sizing.css} +2 -2
  87. data/test/fixtures/stylesheets/compass/css/box_shadow.css +15 -5
  88. data/test/fixtures/stylesheets/compass/css/brightness.css +14 -0
  89. data/test/fixtures/stylesheets/compass/css/browser-support.css +306 -0
  90. data/test/fixtures/stylesheets/compass/css/color.css +18 -0
  91. data/test/fixtures/stylesheets/compass/css/columns.css +27 -18
  92. data/test/fixtures/stylesheets/compass/css/filters.css +6 -6
  93. data/test/fixtures/stylesheets/compass/css/flexbox.css +84 -111
  94. data/test/fixtures/stylesheets/compass/css/fonts.css +1 -1
  95. data/test/fixtures/stylesheets/compass/css/gradients.css +53 -53
  96. data/test/fixtures/stylesheets/compass/css/grid_background.css +11 -11
  97. data/test/fixtures/stylesheets/compass/css/hyphenation.css +2 -4
  98. data/test/fixtures/stylesheets/compass/css/lists.css +6 -12
  99. data/test/fixtures/stylesheets/compass/css/regions.css +2 -2
  100. data/test/fixtures/stylesheets/compass/css/selection.css +41 -4
  101. data/test/fixtures/stylesheets/compass/css/sprites_with_explicit_separator.css +16 -0
  102. data/test/fixtures/stylesheets/compass/css/support.css +62 -0
  103. data/test/fixtures/stylesheets/compass/css/transform.css +64 -136
  104. data/test/fixtures/stylesheets/compass/css/transition.css +27 -45
  105. data/test/fixtures/stylesheets/compass/css/typography/links/hover-link.css +4 -0
  106. data/test/fixtures/stylesheets/compass/css/user-interface.css +34 -7
  107. data/test/fixtures/stylesheets/compass/css/utilities.css +7 -7
  108. data/test/fixtures/stylesheets/compass/css/vertical_rhythm.css +6 -9
  109. data/test/fixtures/stylesheets/compass/images/flag_states-sc42d7bf926.png +0 -0
  110. data/test/fixtures/stylesheets/compass/images/flag_states/foo.png +0 -0
  111. data/test/fixtures/stylesheets/compass/images/flag_states/foo_active.png +0 -0
  112. data/test/fixtures/stylesheets/compass/images/flag_states/foo_focus.png +0 -0
  113. data/test/fixtures/stylesheets/compass/images/flag_states/foo_hover.png +0 -0
  114. data/test/fixtures/stylesheets/compass/images/flag_states/foo_target.png +0 -0
  115. data/test/fixtures/stylesheets/compass/sass/animation-with-legacy-ie.scss +1 -3
  116. data/test/fixtures/stylesheets/compass/sass/appearance.scss +5 -0
  117. data/test/fixtures/stylesheets/compass/sass/background-clip.scss +0 -5
  118. data/test/fixtures/stylesheets/compass/sass/background-origin.scss +0 -5
  119. data/test/fixtures/stylesheets/compass/sass/background-size.scss +0 -5
  120. data/test/fixtures/stylesheets/compass/sass/{box-sizeing.scss → box-sizing.scss} +1 -1
  121. data/test/fixtures/stylesheets/compass/sass/box_shadow.scss +2 -0
  122. data/test/fixtures/stylesheets/compass/sass/brightness.scss +12 -0
  123. data/test/fixtures/stylesheets/compass/sass/browser-support.scss +30 -0
  124. data/test/fixtures/stylesheets/compass/sass/color.scss +22 -0
  125. data/test/fixtures/stylesheets/compass/sass/filters.scss +1 -0
  126. data/test/fixtures/stylesheets/compass/sass/flexbox.scss +84 -40
  127. data/test/fixtures/stylesheets/compass/sass/gradients.sass +3 -2
  128. data/test/fixtures/stylesheets/compass/sass/selection.scss +29 -4
  129. data/test/fixtures/stylesheets/compass/sass/sprites_with_explicit_separator.scss +7 -0
  130. data/test/fixtures/stylesheets/compass/sass/support.scss +137 -0
  131. data/test/fixtures/stylesheets/compass/sass/transition.scss +0 -3
  132. data/test/fixtures/stylesheets/compass/sass/typography/links/hover-link.scss +3 -0
  133. data/test/fixtures/stylesheets/compass/sass/user-interface.scss +16 -5
  134. data/test/fixtures/stylesheets/compass/sass/utilities.scss +4 -4
  135. data/test/fixtures/stylesheets/envtest/css/env.css +4 -4
  136. data/test/fixtures/stylesheets/envtest/tmp/env.css +4 -4
  137. data/test/integrations/sprites_test.rb +30 -1
  138. data/test/test_helper.rb +2 -2
  139. data/test/units/caniuse_test.rb +115 -0
  140. data/test/units/command_line_test.rb +1 -0
  141. data/test/units/sass_extensions_test.rb +5 -0
  142. data/test/units/sprites/image_test.rb +12 -0
  143. data/test/units/sprites/sprite_map_test.rb +11 -0
  144. data/test/units/watcher/project_watcher_test.rb +26 -18
  145. metadata +96 -42
  146. data/examples/compass/src/pie.scss +0 -110
  147. data/frameworks/compass/stylesheets/compass/css3/_transform-legacy.scss +0 -87
  148. data/frameworks/compass/templates/pie/LICENSE +0 -12
  149. data/frameworks/compass/templates/pie/LICENSE-APACHE2.txt +0 -13
  150. data/frameworks/compass/templates/pie/LICENSE-GPL2.txt +0 -278
  151. data/frameworks/compass/templates/pie/PIE.htc +0 -96
  152. data/frameworks/compass/templates/pie/manifest.rb +0 -39
  153. data/frameworks/compass/templates/pie/pie.scss +0 -74
  154. data/lib/compass/sass_extensions/functions/utility.rb +0 -10
  155. data/test/fixtures/stylesheets/compass/css/pie.css +0 -23
  156. data/test/fixtures/stylesheets/compass/sass/pie.scss +0 -47
@@ -1,27 +1,32 @@
1
1
  module Compass::SassExtensions::Functions::Display
2
2
  DEFAULT_DISPLAY = {
3
- :block => %w{address article aside blockquote center dir div dd details dl dt fieldset
4
- figcaption figure form footer frameset h1 h2 h3 h4 h5 h6 hr header hgroup
5
- isindex menu nav noframes noscript ol p pre section summary ul},
6
- :inline => %w{a abbr acronym audio b basefont bdo big br canvas cite code command
7
- datalist dfn em embed font i img input keygen kbd label mark meter output
8
- progress q rp rt ruby s samp select small span strike strong sub
9
- sup textarea time tt u var video wbr},
10
- :"inline-block" => %w{img},
11
- :table => %w{table},
12
- :"list-item" => %w{li},
13
- :"table-row-group" => %w{tbody},
14
- :"table-header-group" => %w{thead},
15
- :"table-footer-group" => %w{tfoot},
16
- :"table-row" => %w{tr},
17
- :"table-cell" => %w{th td},
18
- :"html5-block" => %w{article aside details figcaption figure footer header hgroup menu nav section summary},
19
- :"html5-inline" => %w{audio canvas command datalist embed keygen mark meter output progress rp rt ruby time video wbr},
3
+ "block" => %w{address article aside blockquote center dir div dd details dl dt fieldset
4
+ figcaption figure form footer frameset h1 h2 h3 h4 h5 h6 hr header hgroup
5
+ isindex menu nav noframes noscript ol p pre section summary ul},
6
+ "inline" => %w{a abbr acronym audio b basefont bdo big br canvas cite code command
7
+ datalist dfn em embed font i img input keygen kbd label mark meter output
8
+ progress q rp rt ruby s samp select small span strike strong sub
9
+ sup textarea time tt u var video wbr},
10
+ "inline-block" => %w{img},
11
+ "table" => %w{table},
12
+ "list-item" => %w{li},
13
+ "table-row-group" => %w{tbody},
14
+ "table-header-group" => %w{thead},
15
+ "table-footer-group" => %w{tfoot},
16
+ "table-row" => %w{tr},
17
+ "table-cell" => %w{th td},
18
+ "html5-block" => %w{article aside details figcaption figure footer header hgroup menu nav
19
+ section summary},
20
+ "html5-inline" => %w{audio canvas command datalist embed keygen mark meter output progress rp
21
+ rt ruby time video wbr},
22
+ "text-input" => %w{input textarea}
20
23
  }
21
- DEFAULT_DISPLAY[:html5] = (DEFAULT_DISPLAY[:"html5-block"] + DEFAULT_DISPLAY[:"html5-inline"]).sort
24
+
25
+ DEFAULT_DISPLAY["html5"] = (DEFAULT_DISPLAY["html5-block"] + DEFAULT_DISPLAY["html5-inline"]).sort.uniq
26
+
22
27
  # returns a comma delimited string for all the
23
28
  # elements according to their default css3 display value.
24
29
  def elements_of_type(display)
25
- Sass::Script::String.new(DEFAULT_DISPLAY.fetch(display.value.to_sym).join(", "))
30
+ Sass::Script::String.new(DEFAULT_DISPLAY.fetch(display.value.to_s).join(", "))
26
31
  end
27
32
  end
@@ -1,23 +1,52 @@
1
1
  module Compass::SassExtensions::Functions::Env
2
+ extend Compass::SassExtensions::Functions::SassDeclarationHelper
2
3
 
3
4
  def compass_env
4
5
  Sass::Script::String.new((options[:compass][:environment] || "development").to_s)
5
6
  end
7
+ register_sass_function :compass_env, []
6
8
 
7
- def current_time(format)
8
- time = Time.now.strftime(format.to_s)
9
-
10
- Sass::Script::String.new(time.to_s)
9
+ DEFAULT_TIME = Sass::Script::String.new("%T%:z")
10
+ def current_time(format = DEFAULT_TIME)
11
+ assert_type format, :String
12
+ Sass::Script::String.new(Time.now.strftime(format.value))
11
13
  end
14
+ register_sass_function :current_time, []
15
+ register_sass_function :current_time, [:format]
12
16
 
13
- alias :current_date :current_time
17
+ DEFAULT_DATE = Sass::Script::String.new("%F")
18
+ def current_date(format = DEFAULT_DATE)
19
+ current_time(format)
20
+ end
21
+ register_sass_function :current_date, []
22
+ register_sass_function :current_date, [:format]
14
23
 
15
- def current_source_file
16
- Sass::Script::String.new(options[:filename].to_s)
24
+ NOT_ABSOLUTE = Sass::Script::Bool.new(false)
25
+ def current_source_file(absolute = NOT_ABSOLUTE)
26
+ if absolute.to_bool
27
+ Sass::Script::String.new(options[:original_filename].to_s)
28
+ else
29
+ filename = Pathname.new(options[:original_filename].to_s)
30
+ sass_path = Pathname.new(Compass.configuration.sass_path)
31
+ relative_filename = filename.relative_path_from(sass_path).to_s rescue path
32
+ Sass::Script::String.new(relative_filename)
33
+ end
17
34
  end
35
+ register_sass_function :current_source_file, []
36
+ register_sass_function :current_source_file, [:absolute]
18
37
 
19
- def current_output_file
38
+ def current_output_file(absolute = NOT_ABSOLUTE)
20
39
  Sass::Script::String.new(options[:css_filename].to_s)
40
+ if absolute.to_bool
41
+ Sass::Script::String.new(options[:css_filename].to_s)
42
+ else
43
+ filename = Pathname.new(options[:css_filename].to_s)
44
+ css_path = Pathname.new(Compass.configuration.css_path)
45
+ relative_filename = filename.relative_path_from(css_path).to_s rescue path
46
+ Sass::Script::String.new(relative_filename)
47
+ end
21
48
  end
49
+ register_sass_function :current_output_file, []
50
+ register_sass_function :current_output_file, [:absolute]
22
51
 
23
52
  end
@@ -1,6 +1,6 @@
1
1
  module Compass::SassExtensions::Functions::GradientSupport
2
2
 
3
- GRADIENT_ASPECTS = %w(webkit moz svg pie css2 o owg).freeze
3
+ GRADIENT_ASPECTS = %w(webkit moz svg css2 o owg).freeze
4
4
 
5
5
  class ColorStop < Sass::Script::Literal
6
6
  attr_accessor :color, :stop
@@ -67,6 +67,10 @@ module Compass::SassExtensions::Functions::GradientSupport
67
67
  end
68
68
  s
69
69
  end
70
+
71
+ def to_sass(options = nil)
72
+ Sass::Script::String.new("color-stop(#{color.to_sass rescue nil}, #{stop.to_sass rescue nil})")
73
+ end
70
74
  end
71
75
 
72
76
  module Gradient
@@ -97,6 +101,10 @@ module Compass::SassExtensions::Functions::GradientSupport
97
101
  true
98
102
  end
99
103
 
104
+ def is_position(pos)
105
+ pos.value =~ Compass::SassExtensions::Functions::Constants::POSITIONS
106
+ end
107
+
100
108
  def angle?(value)
101
109
  value.is_a?(Sass::Script::Number) &&
102
110
  value.numerator_units.size == 1 &&
@@ -148,11 +156,6 @@ module Compass::SassExtensions::Functions::GradientSupport
148
156
  radial_svg_gradient(color_stops, position || _center_position)
149
157
  end
150
158
 
151
- def to_pie(options = self.options)
152
- Compass::Logger.new.record(:warning, "PIE does not support radial-gradient.")
153
- Sass::Script::String.new("-pie-radial-gradient(unsupported)")
154
- end
155
-
156
159
  def to_css2(options = self.options)
157
160
  Sass::Script::String.new("")
158
161
  end
@@ -224,12 +227,6 @@ module Compass::SassExtensions::Functions::GradientSupport
224
227
  linear_svg_gradient(color_stops, position_or_angle || Sass::Script::String.new("top"))
225
228
  end
226
229
 
227
- def to_pie(options = self.options)
228
- # PIE just uses the standard rep, but the property is prefixed so
229
- # the presence of this attribute helps flag when to render a special rule.
230
- Sass::Script::String.new to_s(options)
231
- end
232
-
233
230
  def to_css2(options = self.options)
234
231
  Sass::Script::String.new("")
235
232
  end
@@ -269,7 +266,7 @@ module Compass::SassExtensions::Functions::GradientSupport
269
266
  Sass::Script::List.new(position.value.dup, position.separator)
270
267
  end
271
268
  # Handle unknown arguments by passing them along untouched.
272
- unless position.value.all?{|p| is_position(p).to_bool }
269
+ unless position.value.all?{|p| is_position(p) }
273
270
  return original_value
274
271
  end
275
272
  if (position.value.first.value =~ /top|bottom/) or (position.value.last.value =~ /left|right/)
@@ -1,9 +1,12 @@
1
1
  module Compass::SassExtensions::Functions::Math
2
2
 
3
+ extend Compass::SassExtensions::Functions::SassDeclarationHelper
4
+
5
+ PI = Sass::Script::Number.new(Math::PI)
3
6
  def pi()
4
- Sass::Script::Number.new(Math::PI)
7
+ PI
5
8
  end
6
- Sass::Script::Functions.declare :pi, []
9
+ register_sass_function :pi, []
7
10
 
8
11
  def random(*args)
9
12
  value = if args.length == 1
@@ -14,28 +17,43 @@ module Compass::SassExtensions::Functions::Math
14
17
  end
15
18
  Sass::Script::Number.new(value)
16
19
  end
17
- Sass::Script::Functions.declare :random, [:limit]
18
- Sass::Script::Functions.declare :random, [:start, :limit]
20
+ register_sass_function :random, [:limit]
21
+ register_sass_function :random, [:start, :limit]
19
22
 
20
23
  def sin(number)
21
24
  trig(:sin, number)
22
25
  end
23
- Sass::Script::Functions.declare :sin, [:number]
26
+ register_sass_function :sin, [:number]
27
+
28
+ def asin(number)
29
+ trig(:asin, number)
30
+ end
31
+ register_sass_function :asin, [:number]
24
32
 
25
33
  def cos(number)
26
34
  trig(:cos, number)
27
35
  end
28
- Sass::Script::Functions.declare :cos, [:number]
36
+ register_sass_function :cos, [:number]
37
+
38
+ def acos(number)
39
+ trig(:acos, number)
40
+ end
41
+ register_sass_function :acos, [:number]
29
42
 
30
43
  def tan(number)
31
44
  trig(:tan, number)
32
45
  end
33
- Sass::Script::Functions.declare :tan, [:number]
46
+ register_sass_function :tan, [:number]
47
+
48
+ def atan(number)
49
+ trig(:atan, number)
50
+ end
51
+ register_sass_function :atan, [:number]
34
52
 
35
53
  def e
36
54
  Sass::Script::Number.new(Math::E)
37
55
  end
38
- Sass::Script::Functions.declare :e, []
56
+ register_sass_function :e, []
39
57
 
40
58
  def logarithm(number, base = e )
41
59
  assert_type number, :Number
@@ -45,16 +63,16 @@ module Compass::SassExtensions::Functions::Math
45
63
  result = Math.log(number.value, base.value) rescue Math.log(number.value) / Math.log(base.value)
46
64
  Sass::Script::Number.new(result, number.numerator_units, number.denominator_units)
47
65
  end
48
- Sass::Script::Functions.declare :logarithm, [:number]
49
- Sass::Script::Functions.declare :logarithm, [:number, :base]
66
+ register_sass_function :logarithm, [:number]
67
+ register_sass_function :logarithm, [:number, :base]
50
68
 
51
69
  def sqrt(number)
52
70
  numeric_transformation(number) { |n| Math.sqrt(n) }
53
71
  end
54
- Sass::Script::Functions.declare :sqrt, [:number]
72
+ register_sass_function :sqrt, [:number]
55
73
 
56
74
  alias square_root sqrt
57
- Sass::Script::Functions.declare :square_root, [:number]
75
+ register_sass_function :square_root, [:number]
58
76
 
59
77
  def pow(number, exponent)
60
78
  assert_type number, :Number
@@ -62,7 +80,7 @@ module Compass::SassExtensions::Functions::Math
62
80
  raise Sass::SyntaxError, "exponent to pow must be unitless." unless exponent.unitless?
63
81
  Sass::Script::Number.new(number.value**exponent.value, number.numerator_units, number.denominator_units)
64
82
  end
65
- Sass::Script::Functions.declare :pow, [:number, :exponent]
83
+ register_sass_function :pow, [:number, :exponent]
66
84
 
67
85
  private
68
86
  def trig(operation, number)
@@ -1,7 +1,10 @@
1
1
  module Compass::SassExtensions::Functions::Sprites
2
+
3
+ extend Compass::SassExtensions::Functions::SassDeclarationHelper
4
+
2
5
  ZERO = Sass::Script::Number::new(0)
3
6
  BOOL_FALSE = Sass::Script::Bool::new(false)
4
- VALID_SELECTORS = %w(hover active target)
7
+ VALID_SELECTORS = %w(hover active target focus)
5
8
  # Provides a consistent interface for getting a variable in ruby
6
9
  # from a keyword argument hash that accounts for underscores/dash equivalence
7
10
  # and allows the caller to pass a symbol instead of a string.
@@ -18,8 +21,8 @@ module Compass::SassExtensions::Functions::Sprites
18
21
  width, _ = image_dimensions(file)
19
22
  Sass::Script::Number.new(width, ["px"])
20
23
  end
21
- Sass::Script::Functions.declare :sprite_width, [:map]
22
- Sass::Script::Functions.declare :sprite_width, [:map, :sprite]
24
+ register_sass_function :sprite_width, [:map]
25
+ register_sass_function :sprite_width, [:map, :sprite]
23
26
 
24
27
  # Returns the height of the generated sprite map
25
28
  def sprite_height(map, sprite=nil)
@@ -28,22 +31,22 @@ module Compass::SassExtensions::Functions::Sprites
28
31
  _, height = image_dimensions(file)
29
32
  Sass::Script::Number.new(height, ["px"])
30
33
  end
31
- Sass::Script::Functions.declare :sprite_height, [:map]
32
- Sass::Script::Functions.declare :sprite_height, [:map, :sprite]
34
+ register_sass_function :sprite_height, [:map]
35
+ register_sass_function :sprite_height, [:map, :sprite]
33
36
 
34
37
  # Returns a list of all sprite names
35
38
  def sprite_names(map)
36
39
  verify_map(map, 'sprite-names')
37
40
  Sass::Script::List.new(map.sprite_names.map { |f| Sass::Script::String.new(f) }, ' ')
38
41
  end
39
- Sass::Script::Functions.declare :sprite_names, [:map]
42
+ register_sass_function :sprite_names, [:map]
40
43
 
41
44
  # Returns the system path of the sprite file
42
45
  def sprite_path(map)
43
46
  verify_map(map, 'sprite-path')
44
47
  Sass::Script::String.new(map.filename)
45
48
  end
46
- Sass::Script::Functions.declare :sprite_path, [:map]
49
+ register_sass_function :sprite_path, [:map]
47
50
 
48
51
  # Returns the sprite file as an inline image
49
52
  # @include "icon/*.png";
@@ -56,7 +59,7 @@ module Compass::SassExtensions::Functions::Sprites
56
59
  path = map.filename
57
60
  inline_image_string(data(path), compute_mime_type(path))
58
61
  end
59
- Sass::Script::Functions.declare :inline_sprite, [:map]
62
+ register_sass_function :inline_sprite, [:map]
60
63
 
61
64
  # Creates a Compass::SassExtensions::Sprites::SpriteMap object. A sprite map, when used in a property is the same
62
65
  # as calling sprite-url. So the following background properties are equivalent:
@@ -71,7 +74,7 @@ module Compass::SassExtensions::Functions::Sprites
71
74
  kwargs.extend VariableReader
72
75
  Compass::SassExtensions::Sprites::SpriteMap.from_uri(glob, self, kwargs)
73
76
  end
74
- Sass::Script::Functions.declare :sprite_map, [:glob], :var_kwargs => true
77
+ register_sass_function :sprite_map, [:glob], :var_kwargs => true
75
78
 
76
79
  # Returns the image and background position for use in a single shorthand property:
77
80
  #
@@ -95,10 +98,10 @@ module Compass::SassExtensions::Functions::Sprites
95
98
  position = sprite_position(map, sprite, offset_x, offset_y, use_percentages)
96
99
  Sass::Script::List.new([url] + position.value, :space)
97
100
  end
98
- Sass::Script::Functions.declare :sprite, [:map, :sprite]
99
- Sass::Script::Functions.declare :sprite, [:map, :sprite, :offset_x]
100
- Sass::Script::Functions.declare :sprite, [:map, :sprite, :offset_x, :offset_y]
101
- Sass::Script::Functions.declare :sprite, [:map, :sprite, :offset_x, :offset_y, :use_percentages]
101
+ register_sass_function :sprite, [:map, :sprite]
102
+ register_sass_function :sprite, [:map, :sprite, :offset_x]
103
+ register_sass_function :sprite, [:map, :sprite, :offset_x, :offset_y]
104
+ register_sass_function :sprite, [:map, :sprite, :offset_x, :offset_y, :use_percentages]
102
105
 
103
106
  # Returns the name of a sprite map
104
107
  # The name is derived from the folder than contains the sprites.
@@ -106,7 +109,7 @@ module Compass::SassExtensions::Functions::Sprites
106
109
  verify_map(map, "sprite-map-name")
107
110
  Sass::Script::String.new(map.name)
108
111
  end
109
- Sass::Script::Functions.declare :sprite_name, [:sprite]
112
+ register_sass_function :sprite_name, [:sprite]
110
113
 
111
114
  # Returns the path to the original image file for the sprite with the given name
112
115
  def sprite_file(map, sprite)
@@ -119,7 +122,7 @@ module Compass::SassExtensions::Functions::Sprites
119
122
  missing_image!(map, sprite)
120
123
  end
121
124
  end
122
- Sass::Script::Functions.declare :sprite_file, [:map, :sprite]
125
+ register_sass_function :sprite_file, [:map, :sprite]
123
126
 
124
127
  # Returns boolean if sprite has a parent
125
128
  def sprite_does_not_have_parent(map, sprite)
@@ -129,7 +132,20 @@ module Compass::SassExtensions::Functions::Sprites
129
132
  Sass::Script::Bool.new map.image_for(sprite.value).parent.nil?
130
133
  end
131
134
 
132
- Sass::Script::Functions.declare :sprite_does_not_have_parent, [:map, :sprite]
135
+ register_sass_function :sprite_does_not_have_parent, [:map, :sprite]
136
+
137
+ #return the name of the selector file
138
+ def sprite_selector_file(map, sprite, selector)
139
+ sprite = convert_sprite_name(sprite)
140
+ image = map.image_for(sprite)
141
+ if map.send(:"has_#{selector.value}?", sprite.value)
142
+ return Sass::Script::String.new(image.send(selector.value).name)
143
+ end
144
+
145
+ raise Sass::SyntaxError, "Sprite: #{sprite.value} does not have a #{selector} state"
146
+ end
147
+
148
+ register_sass_function :sprite_selector_file, [:map, :sprite, :selector]
133
149
 
134
150
  # Returns boolean if sprite has the selector
135
151
  def sprite_has_selector(map, sprite, selector)
@@ -142,11 +158,12 @@ module Compass::SassExtensions::Functions::Sprites
142
158
  Sass::Script::Bool.new map.send(:"has_#{selector.value}?", sprite.value)
143
159
  end
144
160
 
145
- Sass::Script::Functions.declare :sprite_has_selector, [:map, :sprite, :selector]
161
+ register_sass_function :sprite_has_selector, [:map, :sprite, :selector]
146
162
 
147
163
  # Determines if the CSS selector is valid
164
+ IDENTIFIER_RX = /\A#{Sass::SCSS::RX::IDENT}\Z/
148
165
  def sprite_has_valid_selector(selector)
149
- unless selector.value =~ /\A#{Sass::SCSS::RX::IDENT}\Z/
166
+ unless selector.value =~ IDENTIFIER_RX
150
167
  raise Sass::SyntaxError, "#{selector} must be a legal css identifier"
151
168
  end
152
169
  Sass::Script::Bool.new true
@@ -158,7 +175,7 @@ module Compass::SassExtensions::Functions::Sprites
158
175
  map.generate
159
176
  generated_image_url(Sass::Script::String.new("#{map.path}-s#{map.uniqueness_hash}.png"))
160
177
  end
161
- Sass::Script::Functions.declare :sprite_url, [:map]
178
+ register_sass_function :sprite_url, [:map]
162
179
 
163
180
  # Returns the position for the original image in the sprite.
164
181
  # This is suitable for use as a value to background-position:
@@ -220,11 +237,11 @@ module Compass::SassExtensions::Functions::Sprites
220
237
  end
221
238
  Sass::Script::List.new([x, y],:space)
222
239
  end
223
- Sass::Script::Functions.declare :sprite_position, [:map]
224
- Sass::Script::Functions.declare :sprite_position, [:map, :sprite]
225
- Sass::Script::Functions.declare :sprite_position, [:map, :sprite, :offset_x]
226
- Sass::Script::Functions.declare :sprite_position, [:map, :sprite, :offset_x, :offset_y]
227
- Sass::Script::Functions.declare :sprite_position, [:map, :sprite, :offset_x, :offset_y, :use_percentages]
240
+ register_sass_function :sprite_position, [:map]
241
+ register_sass_function :sprite_position, [:map, :sprite]
242
+ register_sass_function :sprite_position, [:map, :sprite, :offset_x]
243
+ register_sass_function :sprite_position, [:map, :sprite, :offset_x, :offset_y]
244
+ register_sass_function :sprite_position, [:map, :sprite, :offset_x, :offset_y, :use_percentages]
228
245
 
229
246
  protected
230
247
 
@@ -247,7 +264,13 @@ protected
247
264
  def convert_sprite_name(sprite)
248
265
  case sprite
249
266
  when Sass::Script::Color
250
- Sass::Script::String.new(reversed_color_names[sprite.rgb])
267
+ rgb = if reversed_color_names.keys.first.size == 3
268
+ sprite.rgb
269
+ else
270
+ # Sass 3.3 includes the alpha channel
271
+ sprite.rgba
272
+ end
273
+ Sass::Script::String.new(reversed_color_names[rgb])
251
274
  when Sass::Script::Bool
252
275
  Sass::Script::String.new(sprite.to_s)
253
276
  else
@@ -1,8 +1,43 @@
1
- require 'sass/script/node'
2
- require 'sass/script/literal'
3
- require 'sass/script/funcall'
1
+ require 'sass/script'
4
2
 
5
3
  module Sass::Script
4
+ module Value
5
+ class Base
6
+ NO_CHILDREN = []
7
+ def children
8
+ NO_CHILDREN
9
+ end
10
+
11
+ def options=(opts)
12
+ @options = opts
13
+ children.each {|c| c.options = opts}
14
+ opts
15
+ end
16
+
17
+ def opts(value)
18
+ value.options = options
19
+ value
20
+ end
21
+ end
22
+
23
+ class List < Base
24
+ def children
25
+ value
26
+ end
27
+ end
28
+
29
+ class ArgList < List
30
+ def children
31
+ super + @keywords.values
32
+ end
33
+ end
34
+
35
+ class Map < Base
36
+ def children
37
+ to_a
38
+ end
39
+ end
40
+ end
6
41
  module HasSimpleCrossBrowserFunctionSupport
7
42
  def supports?(aspect)
8
43
  return true if Compass::BrowserSupport.supports?(name, aspect)
@@ -39,7 +74,7 @@ module Sass::Script
39
74
  s = "#{name}(#{args.join(", ")})"
40
75
  end
41
76
 
42
- %w(webkit moz o ms svg pie css2).each do |prefix|
77
+ %w(webkit moz o ms svg css2).each do |prefix|
43
78
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
44
79
  def to_#{prefix}(options = self.options)
45
80
  prefixed_args = args.map do |arg|
@@ -65,19 +100,13 @@ module Sass::Script
65
100
  class Funcall < Node
66
101
  include HasSimpleCrossBrowserFunctionSupport
67
102
 
68
- if method_defined? :to_literal
69
- alias sass_to_literal to_literal
70
- else
71
- def sass_to_literal
72
- Script::String.new("#{name}(#{args.join(', ')})")
73
- end
74
- end
103
+ alias sass_to_value to_value
75
104
 
76
- def to_literal(args)
105
+ def to_value(args)
77
106
  if has_aspect?(args)
78
107
  CrossBrowserFunctionCall.new(name, args)
79
108
  else
80
- sass_to_literal(args)
109
+ sass_to_value(args)
81
110
  end
82
111
  end
83
112
  end