sass 3.2.7 → 3.3.0.rc.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.
Files changed (184) hide show
  1. data/MIT-LICENSE +2 -2
  2. data/README.md +14 -2
  3. data/Rakefile +25 -1
  4. data/VERSION +1 -1
  5. data/VERSION_DATE +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/lib/sass/cache_stores/base.rb +4 -2
  8. data/lib/sass/cache_stores/chain.rb +2 -1
  9. data/lib/sass/cache_stores/filesystem.rb +2 -6
  10. data/lib/sass/cache_stores/memory.rb +1 -1
  11. data/lib/sass/cache_stores/null.rb +2 -2
  12. data/lib/sass/callbacks.rb +1 -0
  13. data/lib/sass/css.rb +10 -10
  14. data/lib/sass/engine.rb +403 -150
  15. data/lib/sass/environment.rb +136 -57
  16. data/lib/sass/error.rb +7 -7
  17. data/lib/sass/exec.rb +123 -39
  18. data/lib/sass/features.rb +41 -0
  19. data/lib/sass/importers/base.rb +33 -2
  20. data/lib/sass/importers/deprecated_path.rb +45 -0
  21. data/lib/sass/importers/filesystem.rb +25 -14
  22. data/lib/sass/importers.rb +1 -0
  23. data/lib/sass/logger/base.rb +3 -3
  24. data/lib/sass/logger/log_level.rb +4 -6
  25. data/lib/sass/media.rb +19 -19
  26. data/lib/sass/plugin/compiler.rb +141 -101
  27. data/lib/sass/plugin/configuration.rb +18 -22
  28. data/lib/sass/plugin/merb.rb +1 -1
  29. data/lib/sass/plugin/staleness_checker.rb +24 -8
  30. data/lib/sass/plugin.rb +4 -2
  31. data/lib/sass/repl.rb +3 -3
  32. data/lib/sass/script/css_lexer.rb +9 -4
  33. data/lib/sass/script/css_parser.rb +6 -2
  34. data/lib/sass/script/functions.rb +1343 -590
  35. data/lib/sass/script/lexer.rb +84 -52
  36. data/lib/sass/script/parser.rb +217 -97
  37. data/lib/sass/script/tree/funcall.rb +290 -0
  38. data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +34 -13
  39. data/lib/sass/script/tree/list_literal.rb +80 -0
  40. data/lib/sass/script/tree/literal.rb +47 -0
  41. data/lib/sass/script/tree/map_literal.rb +64 -0
  42. data/lib/sass/script/{node.rb → tree/node.rb} +22 -12
  43. data/lib/sass/script/{operation.rb → tree/operation.rb} +17 -25
  44. data/lib/sass/script/tree/selector.rb +30 -0
  45. data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +5 -4
  46. data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +14 -9
  47. data/lib/sass/script/tree/variable.rb +57 -0
  48. data/lib/sass/script/tree.rb +16 -0
  49. data/lib/sass/script/{arg_list.rb → value/arg_list.rb} +4 -24
  50. data/lib/sass/script/value/base.rb +248 -0
  51. data/lib/sass/script/value/bool.rb +36 -0
  52. data/lib/sass/script/{color.rb → value/color.rb} +239 -195
  53. data/lib/sass/script/value/helpers.rb +155 -0
  54. data/lib/sass/script/value/list.rb +119 -0
  55. data/lib/sass/script/value/map.rb +70 -0
  56. data/lib/sass/script/value/null.rb +45 -0
  57. data/lib/sass/script/{number.rb → value/number.rb} +91 -65
  58. data/lib/sass/script/{string.rb → value/string.rb} +9 -11
  59. data/lib/sass/script/value.rb +11 -0
  60. data/lib/sass/script.rb +35 -8
  61. data/lib/sass/scss/css_parser.rb +2 -1
  62. data/lib/sass/scss/parser.rb +338 -170
  63. data/lib/sass/scss/rx.rb +5 -6
  64. data/lib/sass/scss/script_lexer.rb +1 -0
  65. data/lib/sass/scss/script_parser.rb +1 -0
  66. data/lib/sass/scss/static_parser.rb +23 -6
  67. data/lib/sass/selector/abstract_sequence.rb +2 -2
  68. data/lib/sass/selector/comma_sequence.rb +21 -16
  69. data/lib/sass/selector/sequence.rb +60 -34
  70. data/lib/sass/selector/simple.rb +11 -12
  71. data/lib/sass/selector/simple_sequence.rb +55 -33
  72. data/lib/sass/selector.rb +52 -48
  73. data/lib/sass/source/map.rb +211 -0
  74. data/lib/sass/source/position.rb +39 -0
  75. data/lib/sass/source/range.rb +41 -0
  76. data/lib/sass/stack.rb +120 -0
  77. data/lib/sass/supports.rb +12 -13
  78. data/lib/sass/tree/at_root_node.rb +82 -0
  79. data/lib/sass/tree/comment_node.rb +3 -3
  80. data/lib/sass/tree/css_import_node.rb +11 -11
  81. data/lib/sass/tree/debug_node.rb +2 -2
  82. data/lib/sass/tree/directive_node.rb +13 -2
  83. data/lib/sass/tree/each_node.rb +8 -8
  84. data/lib/sass/tree/extend_node.rb +13 -6
  85. data/lib/sass/tree/for_node.rb +4 -4
  86. data/lib/sass/tree/function_node.rb +5 -4
  87. data/lib/sass/tree/if_node.rb +1 -1
  88. data/lib/sass/tree/import_node.rb +4 -5
  89. data/lib/sass/tree/media_node.rb +4 -14
  90. data/lib/sass/tree/mixin_def_node.rb +4 -4
  91. data/lib/sass/tree/mixin_node.rb +21 -8
  92. data/lib/sass/tree/node.rb +29 -12
  93. data/lib/sass/tree/prop_node.rb +38 -18
  94. data/lib/sass/tree/return_node.rb +3 -2
  95. data/lib/sass/tree/root_node.rb +19 -3
  96. data/lib/sass/tree/rule_node.rb +25 -17
  97. data/lib/sass/tree/supports_node.rb +0 -13
  98. data/lib/sass/tree/trace_node.rb +2 -1
  99. data/lib/sass/tree/variable_node.rb +9 -3
  100. data/lib/sass/tree/visitors/base.rb +6 -6
  101. data/lib/sass/tree/visitors/check_nesting.rb +12 -9
  102. data/lib/sass/tree/visitors/convert.rb +63 -38
  103. data/lib/sass/tree/visitors/cssize.rb +63 -23
  104. data/lib/sass/tree/visitors/deep_copy.rb +6 -5
  105. data/lib/sass/tree/visitors/extend.rb +7 -7
  106. data/lib/sass/tree/visitors/perform.rb +256 -151
  107. data/lib/sass/tree/visitors/set_options.rb +6 -6
  108. data/lib/sass/tree/visitors/to_css.rb +231 -81
  109. data/lib/sass/tree/warn_node.rb +2 -2
  110. data/lib/sass/tree/while_node.rb +2 -2
  111. data/lib/sass/util/multibyte_string_scanner.rb +2 -0
  112. data/lib/sass/util/normalized_map.rb +65 -0
  113. data/lib/sass/util/ordered_hash.rb +188 -0
  114. data/lib/sass/util/subset_map.rb +3 -2
  115. data/lib/sass/util/test.rb +9 -0
  116. data/lib/sass/util.rb +220 -34
  117. data/lib/sass/version.rb +9 -9
  118. data/lib/sass.rb +14 -7
  119. data/test/sass/compiler_test.rb +213 -0
  120. data/test/sass/conversion_test.rb +235 -9
  121. data/test/sass/engine_test.rb +230 -60
  122. data/test/sass/exec_test.rb +86 -0
  123. data/test/sass/extend_test.rb +215 -147
  124. data/test/sass/functions_test.rb +584 -99
  125. data/test/sass/importer_test.rb +165 -17
  126. data/test/sass/plugin_test.rb +19 -13
  127. data/test/sass/script_conversion_test.rb +40 -0
  128. data/test/sass/script_test.rb +231 -21
  129. data/test/sass/scss/css_test.rb +14 -5
  130. data/test/sass/scss/scss_test.rb +1266 -66
  131. data/test/sass/source_map_test.rb +879 -0
  132. data/test/sass/templates/bork5.sass +3 -0
  133. data/test/sass/util/normalized_map_test.rb +30 -0
  134. data/test/sass/util_test.rb +90 -0
  135. data/test/sass/value_helpers_test.rb +181 -0
  136. data/test/test_helper.rb +7 -2
  137. metadata +316 -291
  138. data/lib/sass/script/bool.rb +0 -18
  139. data/lib/sass/script/funcall.rb +0 -231
  140. data/lib/sass/script/list.rb +0 -84
  141. data/lib/sass/script/literal.rb +0 -239
  142. data/lib/sass/script/null.rb +0 -34
  143. data/lib/sass/script/variable.rb +0 -58
  144. data/test/Gemfile +0 -3
  145. data/vendor/listen/CHANGELOG.md +0 -221
  146. data/vendor/listen/CONTRIBUTING.md +0 -38
  147. data/vendor/listen/Gemfile +0 -30
  148. data/vendor/listen/Guardfile +0 -8
  149. data/vendor/listen/LICENSE +0 -20
  150. data/vendor/listen/README.md +0 -315
  151. data/vendor/listen/Rakefile +0 -47
  152. data/vendor/listen/Vagrantfile +0 -96
  153. data/vendor/listen/lib/listen/adapter.rb +0 -214
  154. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
  155. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -85
  156. data/vendor/listen/lib/listen/adapters/linux.rb +0 -113
  157. data/vendor/listen/lib/listen/adapters/polling.rb +0 -67
  158. data/vendor/listen/lib/listen/adapters/windows.rb +0 -87
  159. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  160. data/vendor/listen/lib/listen/directory_record.rb +0 -371
  161. data/vendor/listen/lib/listen/listener.rb +0 -225
  162. data/vendor/listen/lib/listen/multi_listener.rb +0 -143
  163. data/vendor/listen/lib/listen/turnstile.rb +0 -28
  164. data/vendor/listen/lib/listen/version.rb +0 -3
  165. data/vendor/listen/lib/listen.rb +0 -40
  166. data/vendor/listen/listen.gemspec +0 -22
  167. data/vendor/listen/spec/listen/adapter_spec.rb +0 -183
  168. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  169. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  170. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  171. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  172. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  173. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
  174. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1225
  175. data/vendor/listen/spec/listen/listener_spec.rb +0 -169
  176. data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
  177. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  178. data/vendor/listen/spec/listen_spec.rb +0 -73
  179. data/vendor/listen/spec/spec_helper.rb +0 -21
  180. data/vendor/listen/spec/support/adapter_helper.rb +0 -629
  181. data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
  182. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  183. data/vendor/listen/spec/support/listeners_helper.rb +0 -156
  184. data/vendor/listen/spec/support/platform_helper.rb +0 -15
@@ -0,0 +1,155 @@
1
+ module Sass::Script::Value
2
+ # Provides helper functions for creating sass values from within ruby methods.
3
+ # @since `3.3.0`
4
+ module Helpers
5
+ # Construct a Sass Boolean.
6
+ #
7
+ # @param value [Object] A ruby object that will be tested for truthiness.
8
+ # @return [Sass::Script::Value::Bool] whether the ruby value is truthy.
9
+ def bool(value)
10
+ Bool.new(value)
11
+ end
12
+
13
+ # Construct a Sass Color from a hex color string.
14
+ #
15
+ # @param value [::String] A string representing a hex color.
16
+ # The leading hash ("#") is optional.
17
+ # @param alpha [::Number] The alpha channel. A number between 0 and 1.
18
+ # @return [Sass::Script::Value::Color] the color object
19
+ def hex_color(value, alpha = nil)
20
+ Color.from_hex(value, alpha)
21
+ end
22
+
23
+ # Construct a Sass Color from hsl values.
24
+ #
25
+ # @param hue [::Number] The hue of the color in degrees.
26
+ # A non-negative number, usually less than 360.
27
+ # @param saturation [::Number] The saturation of the color.
28
+ # Must be between 0 and 100 inclusive.
29
+ # @param lightness [::Number] The lightness of the color.
30
+ # Must be between 0 and 100 inclusive.
31
+ # @param alpha [::Number] The alpha channel. A number between 0 and 1.
32
+ #
33
+ # @return [Sass::Script::Value::Color] the color object
34
+ def hsl_color(hue, saturation, lightness, alpha = nil)
35
+ attrs = {:hue => hue, :saturation => saturation, :lightness => lightness}
36
+ attrs[:alpha] = alpha if alpha
37
+ Color.new(attrs)
38
+ end
39
+
40
+ # Construct a Sass Color from rgb values.
41
+ #
42
+ # @param red [::Number] The red component. Must be between 0 and 255 inclusive.
43
+ # @param green [::Number] The green component. Must be between 0 and 255 inclusive.
44
+ # @param blue [::Number] The blue component. Must be between 0 and 255 inclusive.
45
+ # @param alpha [::Number] The alpha channel. A number between 0 and 1.
46
+ #
47
+ # @return [Sass::Script::Value::Color] the color object
48
+ def rgb_color(red, green, blue, alpha = nil)
49
+ attrs = {:red => red, :green => green, :blue => blue}
50
+ attrs[:alpha] = alpha if alpha
51
+ Color.new(attrs)
52
+ end
53
+
54
+ # Construct a Sass Number from a ruby number.
55
+ #
56
+ # @param number [::Number] A numeric value.
57
+ # @param unit_string [::String] A unit string of the form
58
+ # `numeral_unit1 * numeral_unit2 ... / denominator_unit1 * denominator_unit2 ...`
59
+ # this is the same format that is returned by
60
+ # {Sass::Script::Value::Number#unit_str the `unit_str` method}
61
+ #
62
+ # @see Sass::Script::Value::Number#unit_str
63
+ #
64
+ # @return [Sass::Script::Value::Number] The sass number representing the given ruby number.
65
+ def number(number, unit_string = nil)
66
+ Number.new(number, *parse_unit_string(unit_string))
67
+ end
68
+
69
+ # @overload list(*elements, separator)
70
+ # Create a space-separated list from the arguments given.
71
+ # @param elements [Array<Sass::Script::Value::Base>] Each argument will be a list element.
72
+ # @param separator [Symbol] Either :space or :comma.
73
+ # @return [Sass::Script::Value::List] The space separated list.
74
+ #
75
+ # @overload list(array, separator)
76
+ # Create a space-separated list from the array given.
77
+ # @param array [Array<Sass::Script::Value::Base>] A ruby array of Sass values
78
+ # to make into a list.
79
+ # @return [Sass::Script::Value::List] The space separated list.
80
+ def list(*elements)
81
+ unless elements.last.is_a?(Symbol)
82
+ raise ArgumentError.new("A list type of :space or :comma must be specified.")
83
+ end
84
+ separator = elements.pop
85
+ if elements.size == 1 && elements.first.is_a?(Array)
86
+ elements = elements.first
87
+ end
88
+ Sass::Script::Value::List.new(elements, separator)
89
+ end
90
+
91
+ # Construct a Sass map.
92
+ #
93
+ # @param hash [Hash<Sass::Script::Value::Base,
94
+ # Sass::Script::Value::Base>] A Ruby map to convert to a Sass map.
95
+ # @return [Sass::Script::Value::Map] The map.
96
+ def map(hash)
97
+ Map.new(hash)
98
+ end
99
+
100
+ # Create a sass null value.
101
+ #
102
+ # @return [Sass::Script::Value::Null]
103
+ def null
104
+ Sass::Script::Value::Null.new
105
+ end
106
+
107
+ # Create a quoted string.
108
+ #
109
+ # @param str [::String] A ruby string.
110
+ # @return [Sass::Script::Value::String] A quoted string.
111
+ def quoted_string(str)
112
+ Sass::Script::String.new(str, :string)
113
+ end
114
+
115
+ # Create an unquoted string.
116
+ #
117
+ # @param str [::String] A ruby string.
118
+ # @return [Sass::Script::Value::String] An unquoted string.
119
+ def unquoted_string(str)
120
+ Sass::Script::String.new(str, :identifier)
121
+ end
122
+ alias_method :identifier, :unquoted_string
123
+
124
+ private
125
+
126
+ # @private
127
+ VALID_UNIT = /#{Sass::SCSS::RX::NMSTART}#{Sass::SCSS::RX::NMCHAR}|%*/
128
+
129
+ # @example
130
+ # parse_unit_string("em*px/in*%") # => [["em", "px], ["in", "%"]]
131
+ #
132
+ # @param unit_string [String] A string adhering to the output of a number with complex
133
+ # units. E.g. "em*px/in*%"
134
+ # @return [Array<Array<String>>] A list of numerator units and a list of denominator units.
135
+ def parse_unit_string(unit_string)
136
+ denominator_units = numerator_units = Sass::Script::Value::Number::NO_UNITS
137
+ return numerator_units, denominator_units unless unit_string && unit_string.length > 0
138
+ num_over_denominator = unit_string.split(/ *\/ */)
139
+ unless (1..2).include?(num_over_denominator.size)
140
+ raise ArgumentError.new("Malformed unit string: #{unit_string}")
141
+ end
142
+ numerator_units = num_over_denominator[0].split(/ *\* */)
143
+ denominator_units = (num_over_denominator[1] || "").split(/ *\* */)
144
+ [[numerator_units, "numerator"], [denominator_units, "denominator"]].each do |units, name|
145
+ if unit_string =~ /\// && units.size == 0
146
+ raise ArgumentError.new("Malformed unit string: #{unit_string}")
147
+ end
148
+ if units.any? {|unit| unit !~ VALID_UNIT}
149
+ raise ArgumentError.new("Malformed #{name} in unit string: #{unit_string}")
150
+ end
151
+ end
152
+ [numerator_units, denominator_units]
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,119 @@
1
+ module Sass::Script::Value
2
+ # A SassScript object representing a CSS list.
3
+ # This includes both comma-separated lists and space-separated lists.
4
+ class List < Base
5
+ # The Ruby array containing the contents of the list.
6
+ #
7
+ # @return [Array<Value>]
8
+ attr_reader :value
9
+ alias_method :to_a, :value
10
+
11
+ # The operator separating the values of the list.
12
+ # Either `:comma` or `:space`.
13
+ #
14
+ # @return [Symbol]
15
+ attr_reader :separator
16
+
17
+ # Creates a new list.
18
+ #
19
+ # @param value [Array<Value>] See \{#value}
20
+ # @param separator [Symbol] See \{#separator}
21
+ def initialize(value, separator)
22
+ super(value)
23
+ @separator = separator
24
+ end
25
+
26
+ # @see Value#options=
27
+ def options=(options)
28
+ super
29
+ value.each {|v| v.options = options}
30
+ end
31
+
32
+ # @see Value#eq
33
+ def eq(other)
34
+ Sass::Script::Value::Bool.new(
35
+ other.is_a?(List) && value == other.value &&
36
+ separator == other.separator)
37
+ end
38
+
39
+ def hash
40
+ @hash ||= [value, separator].hash
41
+ end
42
+
43
+ # @see Value#to_s
44
+ def to_s(opts = {})
45
+ raise Sass::SyntaxError.new("() isn't a valid CSS value.") if value.empty?
46
+ value.
47
+ reject {|e| e.is_a?(Null) || e.is_a?(List) && e.value.empty?}.
48
+ map {|e| e.to_s(opts)}.join(sep_str)
49
+ end
50
+
51
+ # @see Value#to_sass
52
+ def to_sass(opts = {})
53
+ return "()" if value.empty?
54
+ precedence = Sass::Script::Parser.precedence_of(separator)
55
+ members = value.reject {|e| e.is_a?(Null)}.map do |v|
56
+ if v.is_a?(List) && Sass::Script::Parser.precedence_of(v.separator) <= precedence ||
57
+ separator == :space && v.is_a?(Sass::Script::Tree::UnaryOperation) &&
58
+ (v.operator == :minus || v.operator == :plus)
59
+ "(#{v.to_sass(opts)})"
60
+ else
61
+ v.to_sass(opts)
62
+ end
63
+ end
64
+ return "(#{members.first},)" if members.length == 1 && separator == :comma
65
+ members.join(sep_str(nil))
66
+ end
67
+
68
+ # @see Value#to_h
69
+ def to_h
70
+ return Sass::Util.ordered_hash if value.empty?
71
+ return @map ||= Sass::Util.to_hash(value.map {|e| e.to_a}) if is_pseudo_map?
72
+ super
73
+ end
74
+
75
+ # Returns whether a warning still needs to be printed for this list being used as a map.
76
+ #
77
+ # @return [Boolean]
78
+ def needs_map_warning?
79
+ !@value.empty? && !@map
80
+ end
81
+
82
+ # Returns whether this is a list of pairs that can be used as a map.
83
+ #
84
+ # @return [Boolean]
85
+ def is_pseudo_map?
86
+ @is_pseudo_map ||= value.all? {|e| e.is_a?(Sass::Script::Value::List) && e.to_a.length == 2}
87
+ end
88
+
89
+ # @see Value#inspect
90
+ def inspect
91
+ "(#{value.map {|e| e.inspect}.join(sep_str(nil))})"
92
+ end
93
+
94
+ # Asserts an index is within the list.
95
+ #
96
+ # @private
97
+ #
98
+ # @param list [Sass::Script::Value::List] The list for which the index should be checked.
99
+ # @param n [Sass::Script::Value::Number] The index being checked.
100
+ def self.assert_valid_index(list, n)
101
+ if !n.int? || n.to_i == 0
102
+ raise ArgumentError.new("List index #{n} must be a non-zero integer")
103
+ elsif list.to_a.size == 0
104
+ raise ArgumentError.new("List index is #{n} but list has no items")
105
+ elsif n.to_i.abs > (size = list.to_a.size)
106
+ raise ArgumentError.new(
107
+ "List index is #{n} but list is only #{size} item#{'s' if size != 1} long")
108
+ end
109
+ end
110
+
111
+ private
112
+
113
+ def sep_str(opts = options)
114
+ return ' ' if separator == :space
115
+ return ',' if opts && opts[:style] == :compressed
116
+ ', '
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,70 @@
1
+ module Sass::Script::Value
2
+ # A SassScript object representing a map from keys to values. Both keys and
3
+ # values can be any SassScript object.
4
+ class Map < Base
5
+ # The Ruby hash containing the contents of this map.
6
+ #
7
+ # @return [Hash<Node, Node>]
8
+ attr_reader :value
9
+ alias_method :to_h, :value
10
+
11
+ # Creates a new map.
12
+ #
13
+ # @param hash [Hash<Node, Node>]
14
+ def initialize(hash)
15
+ super(Sass::Util.ordered_hash(hash))
16
+ end
17
+
18
+ # @see Value#options=
19
+ def options=(options)
20
+ super
21
+ value.each do |k, v|
22
+ k.options = options
23
+ v.options = options
24
+ end
25
+ end
26
+
27
+ # @see Value#separator
28
+ def separator
29
+ :comma unless value.empty?
30
+ end
31
+
32
+ # @see Value#to_a
33
+ def to_a
34
+ value.map do |k, v|
35
+ list = List.new([k, v], :space)
36
+ list.options = options
37
+ list
38
+ end
39
+ end
40
+
41
+ # @see Value#eq
42
+ def eq(other)
43
+ Bool.new(other.is_a?(Map) && value == other.value)
44
+ end
45
+
46
+ def hash
47
+ @hash ||= value.hash
48
+ end
49
+
50
+ # @see Value#to_s
51
+ def to_s(opts = {})
52
+ raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.")
53
+ end
54
+
55
+ def to_sass(opts = {})
56
+ return "()" if value.empty?
57
+
58
+ to_sass = lambda do |value|
59
+ if value.is_a?(Map) || (value.is_a?(List) && value.separator == :comma)
60
+ "(#{value.to_sass(opts)})"
61
+ else
62
+ value.to_sass(opts)
63
+ end
64
+ end
65
+
66
+ "(#{value.map {|(k, v)| "#{to_sass[k]}: #{to_sass[v]}"}.join(', ')})"
67
+ end
68
+ alias_method :inspect, :to_sass
69
+ end
70
+ end
@@ -0,0 +1,45 @@
1
+ module Sass::Script::Value
2
+ # A SassScript object representing a null value.
3
+ class Null < Base
4
+
5
+ # The null value in SassScript.
6
+ #
7
+ # This is assigned before new is overridden below so that we use the default implementation.
8
+ NULL = new(nil)
9
+
10
+ # We override object creation so that users of the core API
11
+ # will not need to know that null is a specific constant.
12
+ #
13
+ # @private
14
+ # @return [Null] the {NULL} constant.
15
+ def self.new
16
+ NULL
17
+ end
18
+
19
+ # @return [Boolean] `false` (the Ruby boolean value)
20
+ def to_bool
21
+ false
22
+ end
23
+
24
+ # @return [Boolean] `true`
25
+ def null?
26
+ true
27
+ end
28
+
29
+ # @return [String] '' (An empty string)
30
+ def to_s(opts = {})
31
+ ''
32
+ end
33
+
34
+ def to_sass(opts = {})
35
+ 'null'
36
+ end
37
+
38
+ # Returns a string representing a null value.
39
+ #
40
+ # @return [String]
41
+ def inspect
42
+ 'null'
43
+ end
44
+ end
45
+ end