haml-edge 2.3.93 → 2.3.94

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/EDGE_GEM_VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.93
1
+ 2.3.94
data/README.md CHANGED
@@ -60,7 +60,7 @@ Then any Sass files in `public/stylesheets/sass`
60
60
  will be compiled CSS files in `public/stylesheets` on every request.
61
61
 
62
62
  To use Haml and Sass programatically,
63
- check out the [YARD documentation](http://haml-lang.com/docs/yardoc).
63
+ check out the [YARD documentation](http://haml-lang.com/docs/yardoc/).
64
64
 
65
65
  ## Formatting
66
66
 
data/Rakefile CHANGED
@@ -203,6 +203,7 @@ task :release_edge do
203
203
 
204
204
  sh %{rubyforge login}
205
205
  sh %{rubyforge add_release haml haml-edge "Bleeding Edge (v#{edge_version})" pkg/haml-edge-#{edge_version}.gem}
206
+ sh %{gem push pkg/haml-edge-#{edge_version}.gem}
206
207
  end
207
208
  end
208
209
 
@@ -222,6 +223,17 @@ end
222
223
  begin
223
224
  require 'yard'
224
225
 
226
+ namespace :yard do
227
+ task :sass do
228
+ require File.dirname(__FILE__) + '/lib/sass'
229
+ Dir[File.dirname(__FILE__) + "/yard/default/**/*.sass"].each do |sass|
230
+ File.open(sass.gsub(/sass$/, 'css'), 'w') do |f|
231
+ f.write(Sass::Engine.new(File.read(sass)).render)
232
+ end
233
+ end
234
+ end
235
+ end
236
+
225
237
  YARD::Rake::YardocTask.new do |t|
226
238
  t.files = FileList.new('lib/**/*.rb') do |list|
227
239
  list.exclude('lib/haml/template/*.rb')
@@ -231,12 +243,14 @@ begin
231
243
  t.options += FileList.new('yard/*.rb').to_a.map {|f| ['-e', f]}.flatten
232
244
  files = FileList.new('doc-src/*').to_a.sort_by {|s| s.size} + %w[MIT-LICENSE VERSION]
233
245
  t.options << '--files' << files.join(',')
246
+ t.options << '--template-path' << File.dirname(__FILE__) + '/yard'
234
247
  end
235
- Rake::Task['yardoc'].instance_variable_set('@comment', nil)
248
+ Rake::Task['yard'].prerequisites.insert(0, 'yard:sass')
249
+ Rake::Task['yard'].instance_variable_set('@comment', nil)
236
250
 
237
251
  desc "Generate Documentation"
238
- task :doc => :yardoc
239
- task :redoc => :yardoc
252
+ task :doc => :yard
253
+ task :redoc => :yard
240
254
  rescue LoadError
241
255
  desc "Generate Documentation"
242
256
  task :doc => :rdoc
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.93
1
+ 2.3.94
data/lib/haml/helpers.rb CHANGED
@@ -339,7 +339,7 @@ MESSAGE
339
339
  end
340
340
 
341
341
  # @deprecated This will be removed in version 2.4.
342
- # @see \{#haml\_concat}
342
+ # @see #haml_concat
343
343
  def puts(*args)
344
344
  warn <<END
345
345
  DEPRECATION WARNING:
data/lib/haml/html/erb.rb CHANGED
@@ -23,7 +23,7 @@ module Haml
23
23
  #
24
24
  # @param template [String] The ERB template
25
25
  # @return [String] The output document
26
- # @see {Haml::HTML::ERB}
26
+ # @see Haml::HTML::ERB
27
27
  def self.compile(template)
28
28
  new(template).src
29
29
  end
@@ -10,10 +10,10 @@ module Haml
10
10
  # Designates an XHTML/XML element.
11
11
  ELEMENT = ?%
12
12
 
13
- # Designates a <tt><div></tt> element with the given class.
13
+ # Designates a `<div>` element with the given class.
14
14
  DIV_CLASS = ?.
15
15
 
16
- # Designates a <tt><div></tt> element with the given id.
16
+ # Designates a `<div>` element with the given id.
17
17
  DIV_ID = ?#
18
18
 
19
19
  # Designates an XHTML/XML comment.
@@ -77,7 +77,7 @@ module Haml
77
77
  # - else
78
78
  # %p no!
79
79
  #
80
- # The block is ended after <tt>%p no!</tt>, because <tt>else</tt>
80
+ # The block is ended after `%p no!`, because `else`
81
81
  # is a member of this array.
82
82
  MID_BLOCK_KEYWORD_REGEX = /^-\s*(#{%w[else elsif rescue ensure when end].join('|')})\b/
83
83
 
@@ -201,7 +201,7 @@ END
201
201
  # Processes a single line of Haml.
202
202
  #
203
203
  # This method doesn't return anything; it simply processes the line and
204
- # adds the appropriate code to <tt>@precompiled</tt>.
204
+ # adds the appropriate code to `@precompiled`.
205
205
  def process_line(text, index)
206
206
  @index = index + 1
207
207
 
@@ -246,7 +246,13 @@ END
246
246
  # It's important to preserve tabulation modification for keywords
247
247
  # that involve choosing between posible blocks of code.
248
248
  if %w[else elsif when].include?(keyword)
249
- @dont_indent_next_line, @dont_tab_up_next_text = @to_close_stack.last[1..2]
249
+ # @to_close_stack may not have a :script on top
250
+ # when the preceding "- if" has nothing nested
251
+ if @to_close_stack.last && @to_close_stack.last.first == :script
252
+ @dont_indent_next_line, @dont_tab_up_next_text = @to_close_stack.last[1..2]
253
+ else
254
+ push_and_tabulate([:script, @dont_indent_next_line, @dont_tab_up_next_text])
255
+ end
250
256
 
251
257
  # when is unusual in that either it will be indented twice,
252
258
  # or the case won't have created its own indentation
@@ -278,7 +284,7 @@ END
278
284
  text[MID_BLOCK_KEYWORD_REGEX, 1]
279
285
  end
280
286
 
281
- # Evaluates <tt>text</tt> in the context of the scope object, but
287
+ # Evaluates `text` in the context of the scope object, but
282
288
  # does not output the result.
283
289
  def push_silent(text, can_suppress = false)
284
290
  flush_merged_text
@@ -286,7 +292,7 @@ END
286
292
  @precompiled << "#{text};"
287
293
  end
288
294
 
289
- # Adds <tt>text</tt> to <tt>@buffer</tt> with appropriate tabulation
295
+ # Adds `text` to `@buffer` with appropriate tabulation
290
296
  # without parsing it.
291
297
  def push_merged_text(text, tab_change = 0, indent = true)
292
298
  text = !indent || @dont_indent_next_line || @options[:ugly] ? text : "#{' ' * @output_tabs}#{text}"
@@ -294,7 +300,7 @@ END
294
300
  @dont_indent_next_line = false
295
301
  end
296
302
 
297
- # Concatenate <tt>text</tt> to <tt>@buffer</tt> without tabulation.
303
+ # Concatenate `text` to `@buffer` without tabulation.
298
304
  def concat_merged_text(text)
299
305
  @to_merge << [:text, text, 0]
300
306
  end
@@ -356,18 +362,18 @@ END
356
362
  end
357
363
  end
358
364
 
359
- # Adds +text+ to <tt>@buffer</tt> while flattening text.
365
+ # Adds +text+ to `@buffer` while flattening text.
360
366
  def push_flat(line)
361
367
  text = line.full.dup
362
368
  text = "" unless text.gsub!(/^#{@flat_spaces}/, '')
363
369
  @filter_buffer << "#{text}\n"
364
370
  end
365
371
 
366
- # Causes <tt>text</tt> to be evaluated in the context of
367
- # the scope object and the result to be added to <tt>@buffer</tt>.
372
+ # Causes `text` to be evaluated in the context of
373
+ # the scope object and the result to be added to `@buffer`.
368
374
  #
369
- # If <tt>opts[:preserve_script]</tt> is true, Haml::Helpers#find_and_flatten is run on
370
- # the result before it is added to <tt>@buffer</tt>
375
+ # If `opts[:preserve_script]` is true, Haml::Helpers#find_and_flatten is run on
376
+ # the result before it is added to `@buffer`
371
377
  def push_script(text, opts = {})
372
378
  raise SyntaxError.new("There's no Ruby code for = to evaluate.") if text.empty?
373
379
  return if options[:suppress_eval]
@@ -400,7 +406,7 @@ END
400
406
  !(opts[:in_tag] || opts[:nuke_inner_whitespace] || @options[:ugly])])
401
407
  end
402
408
 
403
- # Causes <tt>text</tt> to be evaluated, and Haml::Helpers#find_and_flatten
409
+ # Causes `text` to be evaluated, and Haml::Helpers#find_and_flatten
404
410
  # to be run on it afterwards.
405
411
  def push_flat_script(text, options = {})
406
412
  flush_merged_text
@@ -416,13 +422,13 @@ END
416
422
  push_and_tabulate([:haml_comment])
417
423
  end
418
424
 
419
- # Closes the most recent item in <tt>@to_close_stack</tt>.
425
+ # Closes the most recent item in `@to_close_stack`.
420
426
  def close
421
427
  tag, *rest = @to_close_stack.pop
422
428
  send("close_#{tag}", *rest)
423
429
  end
424
430
 
425
- # Puts a line in <tt>@precompiled</tt> that will add the closing tag of
431
+ # Puts a line in `@precompiled` that will add the closing tag of
426
432
  # the most recently opened tag.
427
433
  def close_element(value)
428
434
  tag, nuke_outer_whitespace, nuke_inner_whitespace = value
@@ -474,8 +480,8 @@ END
474
480
  @template_tabs -= 1
475
481
  end
476
482
 
477
- # Iterates through the classes and ids supplied through <tt>.</tt>
478
- # and <tt>#</tt> syntax, and returns a hash with them as attributes,
483
+ # Iterates through the classes and ids supplied through `.`
484
+ # and `#` syntax, and returns a hash with them as attributes,
479
485
  # that can then be merged with another attributes hash.
480
486
  def parse_class_and_id(list)
481
487
  attributes = {}
@@ -672,7 +678,7 @@ END
672
678
  end
673
679
 
674
680
  # Parses a line that will render as an XHTML tag, and adds the code that will
675
- # render that tag to <tt>@precompiled</tt>.
681
+ # render that tag to `@precompiled`.
676
682
  def render_tag(line)
677
683
  tag_name, attributes, attributes_hashes, object_ref, nuke_outer_whitespace,
678
684
  nuke_inner_whitespace, action, value, last_line = parse_tag(line)
@@ -803,7 +809,7 @@ END
803
809
  end
804
810
 
805
811
  # Renders a line that creates an XHTML tag and has an implicit div because of
806
- # <tt>.</tt> or <tt>#</tt>.
812
+ # `.` or `#`.
807
813
  def render_div(line)
808
814
  render_tag('%div' + line)
809
815
  end
@@ -991,8 +997,8 @@ END
991
997
  !flat? && @next_line.tabs > @line.tabs
992
998
  end
993
999
 
994
- # Pushes value onto <tt>@to_close_stack</tt> and increases
995
- # <tt>@template_tabs</tt>.
1000
+ # Pushes value onto `@to_close_stack` and increases
1001
+ # `@template_tabs`.
996
1002
  def push_and_tabulate(value)
997
1003
  @to_close_stack.push(value)
998
1004
  @template_tabs += 1
data/lib/haml/util.rb CHANGED
@@ -103,6 +103,17 @@ module Haml
103
103
  end
104
104
  end
105
105
 
106
+ # Restricts a number to falling within a given range.
107
+ # Returns the number if it falls within the range,
108
+ # or the closest value in the range if it doesn't.
109
+ #
110
+ # @param value [Numeric]
111
+ # @param range [Range<Numeric>]
112
+ # @return [Numeric]
113
+ def restrict(value, range)
114
+ [[value, range.first].max, range.last].min
115
+ end
116
+
106
117
  # Concatenates all strings that are adjacent in an array,
107
118
  # while leaving other elements as they are.
108
119
  # For example:
@@ -186,6 +197,14 @@ module Haml
186
197
  Haml::Util::RUBY_VERSION[0] == 1 && Haml::Util::RUBY_VERSION[1] < 9
187
198
  end
188
199
 
200
+ # Checks that the encoding of a string is valid in Ruby 1.9.
201
+ # If it's not, yields an error string describing the invalid character
202
+ # and the line on which it occurrs.
203
+ #
204
+ # @param str [String] The string of which to check the encoding
205
+ # @yield [msg] A block in which an encoding error can be raised.
206
+ # Only yields if there is an encoding error
207
+ # @yieldparam msg [String] The error message to be raised
189
208
  def check_encoding(str)
190
209
  return if ruby1_8?
191
210
  return if str.valid_encoding?
data/lib/sass/engine.rb CHANGED
@@ -107,15 +107,15 @@ module Sass
107
107
  # Includes named mixin declared using MIXIN_DEFINITION_CHAR
108
108
  MIXIN_INCLUDE_CHAR = ?+
109
109
 
110
- # The regex that matches properties of the form <tt>name: prop</tt>.
110
+ # The regex that matches properties of the form `name: prop`.
111
111
  PROPERTY_NEW_MATCHER = /^[^\s:"\[]+\s*[=:](\s|$)/
112
112
 
113
113
  # The regex that matches and extracts data from
114
- # properties of the form <tt>name: prop</tt>.
114
+ # properties of the form `name: prop`.
115
115
  PROPERTY_NEW = /^([^\s=:"]+)(\s*=|:)(?:\s+|$)(.*)/
116
116
 
117
117
  # The regex that matches and extracts data from
118
- # properties of the form <tt>:name prop</tt>.
118
+ # properties of the form `:name prop`.
119
119
  PROPERTY_OLD = /^:([^\s=:"]+)\s*(=?)(?:\s+|$)(.*)/
120
120
 
121
121
  # The default options for Sass::Engine.
data/lib/sass/error.rb CHANGED
@@ -31,6 +31,10 @@ module Sass
31
31
  # : The name of the file in which the exception was raised,
32
32
  # or `nil` if no filename is available.
33
33
  #
34
+ # `:mixin`
35
+ # : The name of the mixin in which the exception was raised,
36
+ # or `nil` if it wasn't raised in a mixin.
37
+ #
34
38
  # `:line`
35
39
  # : The line of the file on which the error occurred. Never nil.
36
40
  #
@@ -57,11 +61,19 @@ module Sass
57
61
  # The name of the file in which the exception was raised.
58
62
  # This could be `nil` if no filename is available.
59
63
  #
60
- # @return [String]
64
+ # @return [String, nil]
61
65
  def sass_filename
62
66
  sass_backtrace.first[:filename]
63
67
  end
64
68
 
69
+ # The name of the mixin in which the error occurred.
70
+ # This could be `nil` if the error occurred outside a mixin.
71
+ #
72
+ # @return [Fixnum]
73
+ def sass_mixin
74
+ sass_backtrace.first[:mixin]
75
+ end
76
+
65
77
  # The line of the Sass template on which the error occurred.
66
78
  #
67
79
  # @return [Fixnum]
@@ -77,15 +89,29 @@ module Sass
77
89
  sass_backtrace << attrs.reject {|k, v| v.nil?}
78
90
  end
79
91
 
80
- # Modify the top Sass backtrace entry (that is, the last one)
92
+ # Modify the top Sass backtrace entries
93
+ # (that is, the most deeply nested ones)
81
94
  # to have the given attributes.
82
- # If that entry already has one of the given attributes set,
83
- # that takes precendence.
95
+ #
96
+ # Specifically, this goes through the backtrace entries
97
+ # from most deeply nested to least,
98
+ # setting the given attributes for each entry.
99
+ # If an entry already has one of the given attributes set,
100
+ # the pre-existing attribute takes precedence
101
+ # and is not used for less deeply-nested entries
102
+ # (even if they don't have that attribute set).
84
103
  #
85
104
  # @param attrs [Hash<Symbol, Object>] The information to add to the backtrace entry.
86
105
  # See \{#sass\_backtrace}
87
106
  def modify_backtrace(attrs)
88
- sass_backtrace[-1] = attrs.reject {|k, v| v.nil?}.merge(sass_backtrace.last)
107
+ attrs = attrs.reject {|k, v| v.nil?}
108
+ # Move backwards through the backtrace
109
+ (0...sass_backtrace.size).to_a.reverse.each do |i|
110
+ entry = sass_backtrace[i]
111
+ sass_backtrace[i] = attrs.merge(entry)
112
+ attrs.reject! {|k, v| entry.include?(k)}
113
+ break if attrs.empty?
114
+ end
89
115
  end
90
116
 
91
117
  # @return [String] The error message
@@ -99,7 +125,10 @@ module Sass
99
125
  # @return [Array<String>]
100
126
  def backtrace
101
127
  return nil if super.nil?
102
- sass_backtrace.map {|h| "#{h[:filename] || "(sass)"}:#{h[:line]}"} + super
128
+ sass_backtrace.map do |h|
129
+ "#{h[:filename] || "(sass)"}:#{h[:line]}" +
130
+ (h[:mixin] ? ":in `#{h[:mixin]}'" : "")
131
+ end + super
103
132
  end
104
133
 
105
134
  # Returns a string representation of the Sass backtrace.
@@ -111,7 +140,8 @@ module Sass
111
140
  "Syntax error: #{message}" +
112
141
  Haml::Util.enum_with_index(sass_backtrace).map do |entry, i|
113
142
  "\n #{i == 0 ? "on" : "from"} line #{entry[:line]}" +
114
- " of #{entry[:filename] || default_filename}"
143
+ " of #{entry[:filename] || default_filename}" +
144
+ (entry[:mixin] ? ", in `#{entry[:mixin]}'" : "")
115
145
  end.join
116
146
  end
117
147
 
data/lib/sass/files.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'digest/sha1'
2
2
  require 'pathname'
3
+ require 'fileutils'
3
4
 
4
5
  module Sass
5
6
  # This module contains various bits of functionality
@@ -5,7 +5,7 @@ module Sass::Script
5
5
  class Color < Literal
6
6
  class << self; include Haml::Util; end
7
7
 
8
- # A hash from color names to [red, green, blue] value arrays.
8
+ # A hash from color names to `[red, green, blue]` value arrays.
9
9
  HTML4_COLORS = map_vals({
10
10
  'black' => 0x000000,
11
11
  'silver' => 0xc0c0c0,
@@ -24,7 +24,7 @@ module Sass::Script
24
24
  'teal' => 0x008080,
25
25
  'aqua' => 0x00ffff
26
26
  }) {|color| (0..2).map {|n| color >> (n << 3) & 0xff}.reverse}
27
- # A hash from [red, green, blue] value arrays to color names.
27
+ # A hash from `[red, green, blue]` value arrays to color names.
28
28
  HTML4_COLORS_REVERSE = map_hash(HTML4_COLORS) {|k, v| [v, k]}
29
29
 
30
30
  # Constructs an RGB or RGBA color object.
@@ -70,7 +70,7 @@ module Sass::Script
70
70
  # This is 1 unless otherwise defined.
71
71
  #
72
72
  # @return [Fixnum]
73
- attr_accessor :alpha
73
+ attr_reader :alpha
74
74
 
75
75
  # Returns whether this color object is translucent;
76
76
  # that is, whether the alpha channel is non-1.
@@ -115,7 +115,7 @@ END
115
115
  #
116
116
  # For example:
117
117
  #
118
- # Color.new([10, 20, 30].with(:blue => 40)
118
+ # Color.new([10, 20, 30]).with(:blue => 40)
119
119
  # #=> rgb(10, 40, 30)
120
120
  # Color.new([126, 126, 126]).with(:red => 0, :green => 255)
121
121
  # #=> rgb(0, 255, 126)
@@ -189,10 +189,7 @@ END
189
189
  # {Color}
190
190
  # : Multiplies each of the RGB color channels together.
191
191
  #
192
- # {Literal}
193
- # : See {Literal#times}.
194
- #
195
- # @param other [Literal] The right-hand side of the operator
192
+ # @param other [Number, Color] The right-hand side of the operator
196
193
  # @return [Color] The resulting color
197
194
  # @raise [Sass::SyntaxError] if `other` is a number with units
198
195
  def times(other)
@@ -235,10 +232,7 @@ END
235
232
  # {Color}
236
233
  # : Takes each of this color's RGB color channels modulo the other color's.
237
234
  #
238
- # {Literal}
239
- # : See {Literal#mod}.
240
- #
241
- # @param other [Literal] The right-hand side of the operator
235
+ # @param other [Number, Color] The right-hand side of the operator
242
236
  # @return [Color] The resulting color
243
237
  # @raise [Sass::SyntaxError] if `other` is a number with units
244
238
  def mod(other)
@@ -275,52 +275,50 @@ module Sass::Script
275
275
  alias_method :opacity, :alpha
276
276
 
277
277
  # Makes a color more opaque.
278
- # Takes a color and an amount between `0%` and `100%`
279
- # and returns a color that's that much closer to opaque.
278
+ # Takes a color and an amount between 0 and 1,
279
+ # and returns a color with the opacity increased by that value.
280
280
  #
281
- # For example, `50%` will make the color twice as opaque:
281
+ # For example:
282
282
  #
283
- # opacify(rgba(0, 0, 0, 0.5), 50%) => rgba(0, 0, 0, 0.75)
284
- # opacify(rgba(0, 0, 0, 0.8), 50%) => rgba(0, 0, 0, 0.9)
285
- # opacify(rgba(0, 0, 0, 0.2), 50%) => rgba(0, 0, 0, 0.8)
283
+ # opacify(rgba(0, 0, 0, 0.5), 0.1) => rgba(0, 0, 0, 0.6)
284
+ # opacify(rgba(0, 0, 17, 0.8), 0.2) => #001
286
285
  #
287
- # Specifically, `opacify(color, n%)` will make the color
288
- # `n%` closer to fully opaque.
286
+ # @param color [Color]
287
+ # @param amount [Number]
288
+ # @raise [ArgumentError] If `color` isn't a color,
289
+ # or `number` isn't a number between 0 and 1
289
290
  def opacify(color, amount)
290
291
  assert_type color, :Color
291
292
  assert_type amount, :Number
292
- unless (0..100).include?(amount.value)
293
- raise ArgumentError.new("Amount #{amount} must be between 0% and 100%")
293
+ unless (0..1).include?(amount.value)
294
+ raise ArgumentError.new("Amount #{amount} must be between 0 and 1")
294
295
  end
295
296
 
296
- color = color.dup
297
- color.alpha += (1 - color.alpha) * (amount.value / 100.0)
298
- color
297
+ color.with(:alpha => Haml::Util.restrict(color.alpha + amount.value, 0..1))
299
298
  end
300
299
  alias_method :fade_in, :opacify
301
300
 
302
301
  # Makes a color more transparent.
303
- # Takes a color and an amount between `0%` and `100%`
304
- # and returns a color that's that much closer to transparent.
302
+ # Takes a color and an amount between 0 and 1,
303
+ # and returns a color with the opacity decreased by that value.
305
304
  #
306
- # For example, `50%` will make the color twice as transparent:
305
+ # For example:
307
306
  #
308
- # opacify(rgba(0, 0, 0, 0.5), 50%) => rgba(0, 0, 0, 0.25)
309
- # opacify(rgba(0, 0, 0, 0.8), 50%) => rgba(0, 0, 0, 0.4)
310
- # opacify(rgba(0, 0, 0, 0.2), 50%) => rgba(0, 0, 0, 0.1)
307
+ # transparentize(rgba(0, 0, 0, 0.5), 0.1) => rgba(0, 0, 0, 0.4)
308
+ # transparentize(rgba(0, 0, 0, 0.8), 0.2) => rgba(0, 0, 0, 0.6)
311
309
  #
312
- # Specifically, `transparentize(color, n%)` will make the color
313
- # `n%` closer to fully transparent.
310
+ # @param color [Color]
311
+ # @param amount [Number]
312
+ # @raise [ArgumentError] If `color` isn't a color,
313
+ # or `number` isn't a number between 0 and 1
314
314
  def transparentize(color, amount)
315
315
  assert_type color, :Color
316
316
  assert_type amount, :Number
317
- unless (0..100).include?(amount.value)
318
- raise ArgumentError.new("Amount #{amount} must be between 0% and 100%")
317
+ unless (0..1).include?(amount.value)
318
+ raise ArgumentError.new("Amount #{amount} must be between 0 and 1")
319
319
  end
320
320
 
321
- color = color.dup
322
- color.alpha *= 1 - (amount.value / 100.0)
323
- color
321
+ color.with(:alpha => Haml::Util.restrict(color.alpha - amount.value, 0..1))
324
322
  end
325
323
  alias_method :fade_out, :transparentize
326
324