oreorenasass 3.4.4 → 3.4.5

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 (176) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +50 -70
  4. data/Rakefile +5 -26
  5. data/VERSION +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/bin/sass +1 -1
  8. data/bin/scss +1 -1
  9. data/lib/sass.rb +12 -19
  10. data/lib/sass/cache_stores/base.rb +2 -2
  11. data/lib/sass/cache_stores/chain.rb +1 -2
  12. data/lib/sass/cache_stores/filesystem.rb +5 -1
  13. data/lib/sass/cache_stores/memory.rb +1 -1
  14. data/lib/sass/cache_stores/null.rb +2 -2
  15. data/lib/sass/callbacks.rb +0 -1
  16. data/lib/sass/css.rb +13 -11
  17. data/lib/sass/engine.rb +173 -424
  18. data/lib/sass/environment.rb +58 -148
  19. data/lib/sass/error.rb +14 -11
  20. data/lib/sass/exec.rb +703 -5
  21. data/lib/sass/importers/base.rb +6 -49
  22. data/lib/sass/importers/filesystem.rb +19 -44
  23. data/lib/sass/logger.rb +4 -1
  24. data/lib/sass/logger/base.rb +4 -2
  25. data/lib/sass/logger/log_level.rb +7 -3
  26. data/lib/sass/media.rb +23 -20
  27. data/lib/sass/plugin.rb +7 -7
  28. data/lib/sass/plugin/compiler.rb +145 -304
  29. data/lib/sass/plugin/configuration.rb +23 -18
  30. data/lib/sass/plugin/merb.rb +1 -1
  31. data/lib/sass/plugin/staleness_checker.rb +3 -3
  32. data/lib/sass/repl.rb +3 -3
  33. data/lib/sass/script.rb +8 -35
  34. data/lib/sass/script/{value/arg_list.rb → arg_list.rb} +25 -9
  35. data/lib/sass/script/bool.rb +18 -0
  36. data/lib/sass/script/color.rb +606 -0
  37. data/lib/sass/script/css_lexer.rb +4 -8
  38. data/lib/sass/script/css_parser.rb +2 -5
  39. data/lib/sass/script/funcall.rb +245 -0
  40. data/lib/sass/script/functions.rb +408 -1491
  41. data/lib/sass/script/interpolation.rb +79 -0
  42. data/lib/sass/script/lexer.rb +68 -172
  43. data/lib/sass/script/list.rb +85 -0
  44. data/lib/sass/script/literal.rb +221 -0
  45. data/lib/sass/script/{tree/node.rb → node.rb} +12 -22
  46. data/lib/sass/script/{value/null.rb → null.rb} +7 -14
  47. data/lib/sass/script/{value/number.rb → number.rb} +75 -152
  48. data/lib/sass/script/{tree/operation.rb → operation.rb} +24 -17
  49. data/lib/sass/script/parser.rb +110 -245
  50. data/lib/sass/script/string.rb +51 -0
  51. data/lib/sass/script/{tree/string_interpolation.rb → string_interpolation.rb} +4 -5
  52. data/lib/sass/script/{tree/unary_operation.rb → unary_operation.rb} +6 -6
  53. data/lib/sass/script/variable.rb +58 -0
  54. data/lib/sass/scss/css_parser.rb +3 -9
  55. data/lib/sass/scss/parser.rb +421 -450
  56. data/lib/sass/scss/rx.rb +11 -19
  57. data/lib/sass/scss/static_parser.rb +7 -321
  58. data/lib/sass/selector.rb +194 -68
  59. data/lib/sass/selector/abstract_sequence.rb +14 -29
  60. data/lib/sass/selector/comma_sequence.rb +25 -108
  61. data/lib/sass/selector/sequence.rb +66 -159
  62. data/lib/sass/selector/simple.rb +25 -23
  63. data/lib/sass/selector/simple_sequence.rb +63 -173
  64. data/lib/sass/shared.rb +1 -1
  65. data/lib/sass/supports.rb +15 -13
  66. data/lib/sass/tree/charset_node.rb +1 -1
  67. data/lib/sass/tree/comment_node.rb +3 -3
  68. data/lib/sass/tree/css_import_node.rb +11 -11
  69. data/lib/sass/tree/debug_node.rb +2 -2
  70. data/lib/sass/tree/directive_node.rb +4 -21
  71. data/lib/sass/tree/each_node.rb +8 -8
  72. data/lib/sass/tree/extend_node.rb +7 -14
  73. data/lib/sass/tree/for_node.rb +4 -4
  74. data/lib/sass/tree/function_node.rb +4 -9
  75. data/lib/sass/tree/if_node.rb +1 -1
  76. data/lib/sass/tree/import_node.rb +5 -4
  77. data/lib/sass/tree/media_node.rb +14 -4
  78. data/lib/sass/tree/mixin_def_node.rb +4 -4
  79. data/lib/sass/tree/mixin_node.rb +8 -21
  80. data/lib/sass/tree/node.rb +12 -54
  81. data/lib/sass/tree/prop_node.rb +20 -39
  82. data/lib/sass/tree/return_node.rb +2 -3
  83. data/lib/sass/tree/root_node.rb +3 -19
  84. data/lib/sass/tree/rule_node.rb +22 -35
  85. data/lib/sass/tree/supports_node.rb +13 -0
  86. data/lib/sass/tree/trace_node.rb +1 -2
  87. data/lib/sass/tree/variable_node.rb +3 -9
  88. data/lib/sass/tree/visitors/base.rb +8 -5
  89. data/lib/sass/tree/visitors/check_nesting.rb +19 -49
  90. data/lib/sass/tree/visitors/convert.rb +56 -74
  91. data/lib/sass/tree/visitors/cssize.rb +74 -202
  92. data/lib/sass/tree/visitors/deep_copy.rb +5 -10
  93. data/lib/sass/tree/visitors/extend.rb +7 -7
  94. data/lib/sass/tree/visitors/perform.rb +185 -278
  95. data/lib/sass/tree/visitors/set_options.rb +6 -20
  96. data/lib/sass/tree/visitors/to_css.rb +81 -234
  97. data/lib/sass/tree/warn_node.rb +2 -2
  98. data/lib/sass/tree/while_node.rb +2 -2
  99. data/lib/sass/util.rb +152 -522
  100. data/lib/sass/util/multibyte_string_scanner.rb +0 -2
  101. data/lib/sass/util/subset_map.rb +3 -4
  102. data/lib/sass/util/test.rb +1 -0
  103. data/lib/sass/version.rb +22 -20
  104. data/test/Gemfile +3 -0
  105. data/test/Gemfile.lock +10 -0
  106. data/test/sass/cache_test.rb +20 -62
  107. data/test/sass/callbacks_test.rb +1 -1
  108. data/test/sass/conversion_test.rb +2 -296
  109. data/test/sass/css2sass_test.rb +4 -23
  110. data/test/sass/engine_test.rb +354 -411
  111. data/test/sass/exec_test.rb +2 -2
  112. data/test/sass/extend_test.rb +145 -324
  113. data/test/sass/functions_test.rb +86 -873
  114. data/test/sass/importer_test.rb +21 -241
  115. data/test/sass/logger_test.rb +1 -1
  116. data/test/sass/more_results/more_import.css +1 -1
  117. data/test/sass/plugin_test.rb +26 -16
  118. data/test/sass/results/compact.css +1 -1
  119. data/test/sass/results/complex.css +4 -4
  120. data/test/sass/results/expanded.css +1 -1
  121. data/test/sass/results/import.css +1 -1
  122. data/test/sass/results/import_charset_ibm866.css +2 -2
  123. data/test/sass/results/mixins.css +17 -17
  124. data/test/sass/results/nested.css +1 -1
  125. data/test/sass/results/parent_ref.css +2 -2
  126. data/test/sass/results/script.css +3 -3
  127. data/test/sass/results/scss_import.css +1 -1
  128. data/test/sass/script_conversion_test.rb +7 -36
  129. data/test/sass/script_test.rb +53 -485
  130. data/test/sass/scss/css_test.rb +28 -143
  131. data/test/sass/scss/rx_test.rb +4 -4
  132. data/test/sass/scss/scss_test.rb +325 -2119
  133. data/test/sass/templates/scss_import.scss +1 -2
  134. data/test/sass/test_helper.rb +1 -1
  135. data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
  136. data/test/sass/util/subset_map_test.rb +2 -2
  137. data/test/sass/util_test.rb +1 -86
  138. data/test/test_helper.rb +8 -37
  139. metadata +19 -66
  140. data/lib/sass/exec/base.rb +0 -187
  141. data/lib/sass/exec/sass_convert.rb +0 -264
  142. data/lib/sass/exec/sass_scss.rb +0 -424
  143. data/lib/sass/features.rb +0 -47
  144. data/lib/sass/script/tree.rb +0 -16
  145. data/lib/sass/script/tree/funcall.rb +0 -306
  146. data/lib/sass/script/tree/interpolation.rb +0 -118
  147. data/lib/sass/script/tree/list_literal.rb +0 -77
  148. data/lib/sass/script/tree/literal.rb +0 -45
  149. data/lib/sass/script/tree/map_literal.rb +0 -64
  150. data/lib/sass/script/tree/selector.rb +0 -26
  151. data/lib/sass/script/tree/variable.rb +0 -57
  152. data/lib/sass/script/value.rb +0 -11
  153. data/lib/sass/script/value/base.rb +0 -240
  154. data/lib/sass/script/value/bool.rb +0 -35
  155. data/lib/sass/script/value/color.rb +0 -680
  156. data/lib/sass/script/value/helpers.rb +0 -262
  157. data/lib/sass/script/value/list.rb +0 -113
  158. data/lib/sass/script/value/map.rb +0 -70
  159. data/lib/sass/script/value/string.rb +0 -97
  160. data/lib/sass/selector/pseudo.rb +0 -256
  161. data/lib/sass/source/map.rb +0 -210
  162. data/lib/sass/source/position.rb +0 -39
  163. data/lib/sass/source/range.rb +0 -41
  164. data/lib/sass/stack.rb +0 -120
  165. data/lib/sass/tree/at_root_node.rb +0 -83
  166. data/lib/sass/tree/error_node.rb +0 -18
  167. data/lib/sass/tree/keyframe_rule_node.rb +0 -15
  168. data/lib/sass/util/cross_platform_random.rb +0 -19
  169. data/lib/sass/util/normalized_map.rb +0 -130
  170. data/lib/sass/util/ordered_hash.rb +0 -192
  171. data/test/sass/compiler_test.rb +0 -232
  172. data/test/sass/encoding_test.rb +0 -219
  173. data/test/sass/source_map_test.rb +0 -977
  174. data/test/sass/superselector_test.rb +0 -191
  175. data/test/sass/util/normalized_map_test.rb +0 -51
  176. data/test/sass/value_helpers_test.rb +0 -179
@@ -1,262 +0,0 @@
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
- # Parses a user-provided selector.
125
- #
126
- # @param value [Sass::Script::Value::String, Sass::Script::Value::List]
127
- # The selector to parse. This can be either a string, a list of
128
- # strings, or a list of lists of strings as returned by `&`.
129
- # @param name [Symbol, nil]
130
- # If provided, the name of the selector argument. This is used
131
- # for error reporting.
132
- # @param allow_parent_ref [Boolean]
133
- # Whether the parsed selector should allow parent references.
134
- # @return [Sass::Selector::CommaSequence] The parsed selector.
135
- # @throw [ArgumentError] if the parse failed for any reason.
136
- def parse_selector(value, name = nil, allow_parent_ref = false)
137
- str = normalize_selector(value, name)
138
- begin
139
- Sass::SCSS::StaticParser.new(str, nil, nil, 1, 1, allow_parent_ref).parse_selector
140
- rescue Sass::SyntaxError => e
141
- err = "#{value.inspect} is not a valid selector: #{e}"
142
- err = "$#{name.to_s.gsub('_', '-')}: #{err}" if name
143
- raise ArgumentError.new(err)
144
- end
145
- end
146
-
147
- # Parses a user-provided complex selector.
148
- #
149
- # A complex selector can contain combinators but cannot contain commas.
150
- #
151
- # @param value [Sass::Script::Value::String, Sass::Script::Value::List]
152
- # The selector to parse. This can be either a string or a list of
153
- # strings.
154
- # @param name [Symbol, nil]
155
- # If provided, the name of the selector argument. This is used
156
- # for error reporting.
157
- # @param allow_parent_ref [Boolean]
158
- # Whether the parsed selector should allow parent references.
159
- # @return [Sass::Selector::Sequence] The parsed selector.
160
- # @throw [ArgumentError] if the parse failed for any reason.
161
- def parse_complex_selector(value, name = nil, allow_parent_ref = false)
162
- selector = parse_selector(value, name, allow_parent_ref)
163
- return seq if selector.members.length == 1
164
-
165
- err = "#{value.inspect} is not a complex selector"
166
- err = "$#{name.to_s.gsub('_', '-')}: #{err}" if name
167
- raise ArgumentError.new(err)
168
- end
169
-
170
- # Parses a user-provided compound selector.
171
- #
172
- # A compound selector cannot contain combinators or commas.
173
- #
174
- # @param value [Sass::Script::Value::String] The selector to parse.
175
- # @param name [Symbol, nil]
176
- # If provided, the name of the selector argument. This is used
177
- # for error reporting.
178
- # @param allow_parent_ref [Boolean]
179
- # Whether the parsed selector should allow parent references.
180
- # @return [Sass::Selector::SimpleSequence] The parsed selector.
181
- # @throw [ArgumentError] if the parse failed for any reason.
182
- def parse_compound_selector(value, name = nil, allow_parent_ref = false)
183
- assert_type value, :String, name
184
- selector = parse_selector(value, name, allow_parent_ref)
185
- seq = selector.members.first
186
- sseq = seq.members.first
187
- if selector.members.length == 1 && seq.members.length == 1 &&
188
- sseq.is_a?(Sass::Selector::SimpleSequence)
189
- return sseq
190
- end
191
-
192
- err = "#{value.inspect} is not a compound selector"
193
- err = "$#{name.to_s.gsub('_', '-')}: #{err}" if name
194
- raise ArgumentError.new(err)
195
- end
196
-
197
- private
198
-
199
- # Converts a user-provided selector into string form or throws an
200
- # ArgumentError if it's in an invalid format.
201
- def normalize_selector(value, name)
202
- if (str = selector_to_str(value))
203
- return str
204
- end
205
-
206
- err = "#{value.inspect} is not a valid selector: it must be a string,\n" +
207
- "a list of strings, or a list of lists of strings"
208
- err = "$#{name.to_s.gsub('_', '-')}: #{err}" if name
209
- raise ArgumentError.new(err)
210
- end
211
-
212
- # Converts a user-provided selector into string form or returns
213
- # `nil` if it's in an invalid format.
214
- def selector_to_str(value)
215
- return value.value if value.is_a?(Sass::Script::String)
216
- return unless value.is_a?(Sass::Script::List)
217
-
218
- if value.separator == :comma
219
- return value.to_a.map do |complex|
220
- next complex.value if complex.is_a?(Sass::Script::String)
221
- return unless complex.is_a?(Sass::Script::List) && complex.separator == :space
222
- return unless (str = selector_to_str(complex))
223
- str
224
- end.join(', ')
225
- end
226
-
227
- value.to_a.map do |compound|
228
- return unless compound.is_a?(Sass::Script::String)
229
- compound.value
230
- end.join(' ')
231
- end
232
-
233
- # @private
234
- VALID_UNIT = /#{Sass::SCSS::RX::NMSTART}#{Sass::SCSS::RX::NMCHAR}|%*/
235
-
236
- # @example
237
- # parse_unit_string("em*px/in*%") # => [["em", "px], ["in", "%"]]
238
- #
239
- # @param unit_string [String] A string adhering to the output of a number with complex
240
- # units. E.g. "em*px/in*%"
241
- # @return [Array<Array<String>>] A list of numerator units and a list of denominator units.
242
- def parse_unit_string(unit_string)
243
- denominator_units = numerator_units = Sass::Script::Value::Number::NO_UNITS
244
- return numerator_units, denominator_units unless unit_string && unit_string.length > 0
245
- num_over_denominator = unit_string.split(/ *\/ */)
246
- unless (1..2).include?(num_over_denominator.size)
247
- raise ArgumentError.new("Malformed unit string: #{unit_string}")
248
- end
249
- numerator_units = num_over_denominator[0].split(/ *\* */)
250
- denominator_units = (num_over_denominator[1] || "").split(/ *\* */)
251
- [[numerator_units, "numerator"], [denominator_units, "denominator"]].each do |units, name|
252
- if unit_string =~ /\// && units.size == 0
253
- raise ArgumentError.new("Malformed unit string: #{unit_string}")
254
- end
255
- if units.any? {|unit| unit !~ VALID_UNIT}
256
- raise ArgumentError.new("Malformed #{name} in unit string: #{unit_string}")
257
- end
258
- end
259
- [numerator_units, denominator_units]
260
- end
261
- end
262
- end
@@ -1,113 +0,0 @@
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
- members = value.map do |v|
55
- if element_needs_parens?(v)
56
- "(#{v.to_sass(opts)})"
57
- else
58
- v.to_sass(opts)
59
- end
60
- end
61
- return "(#{members.first},)" if members.length == 1 && separator == :comma
62
- members.join(sep_str(nil))
63
- end
64
-
65
- # @see Value#to_h
66
- def to_h
67
- return Sass::Util.ordered_hash if value.empty?
68
- super
69
- end
70
-
71
- # @see Value#inspect
72
- def inspect
73
- "(#{value.map {|e| e.inspect}.join(sep_str(nil))})"
74
- end
75
-
76
- # Asserts an index is within the list.
77
- #
78
- # @private
79
- #
80
- # @param list [Sass::Script::Value::List] The list for which the index should be checked.
81
- # @param n [Sass::Script::Value::Number] The index being checked.
82
- def self.assert_valid_index(list, n)
83
- if !n.int? || n.to_i == 0
84
- raise ArgumentError.new("List index #{n} must be a non-zero integer")
85
- elsif list.to_a.size == 0
86
- raise ArgumentError.new("List index is #{n} but list has no items")
87
- elsif n.to_i.abs > (size = list.to_a.size)
88
- raise ArgumentError.new(
89
- "List index is #{n} but list is only #{size} item#{'s' if size != 1} long")
90
- end
91
- end
92
-
93
- private
94
-
95
- def element_needs_parens?(element)
96
- if element.is_a?(List)
97
- return false if element.value.empty?
98
- precedence = Sass::Script::Parser.precedence_of(separator)
99
- return Sass::Script::Parser.precedence_of(element.separator) <= precedence
100
- end
101
-
102
- return false unless separator == :space
103
- return false unless element.is_a?(Sass::Script::Tree::UnaryOperation)
104
- element.operator == :minus || element.operator == :plus
105
- end
106
-
107
- def sep_str(opts = options)
108
- return ' ' if separator == :space
109
- return ',' if opts && opts[:style] == :compressed
110
- ', '
111
- end
112
- end
113
- end
@@ -1,70 +0,0 @@
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
@@ -1,97 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module Sass::Script::Value
3
- # A SassScript object representing a CSS string *or* a CSS identifier.
4
- class String < Base
5
- # The Ruby value of the string.
6
- #
7
- # @return [String]
8
- attr_reader :value
9
-
10
- # Whether this is a CSS string or a CSS identifier.
11
- # The difference is that strings are written with double-quotes,
12
- # while identifiers aren't.
13
- #
14
- # @return [Symbol] `:string` or `:identifier`
15
- attr_reader :type
16
-
17
- def self.value(contents)
18
- contents.gsub("\\\n", "").gsub(/\\(?:([0-9a-fA-F]{1,6})\s?|(.))/) do
19
- next $2 if $2
20
- # Handle unicode escapes as per CSS Syntax Level 3 section 4.3.8.
21
- code_point = $1.to_i(16)
22
- if code_point == 0 || code_point > 0x10FFFF ||
23
- (code_point >= 0xD800 && code_point <= 0xDFFF)
24
- '�'
25
- else
26
- [code_point].pack("U")
27
- end
28
- end
29
- end
30
-
31
- def self.quote(contents, quote = nil)
32
- # Short-circuit if there are no characters that need quoting.
33
- unless contents =~ /[\n\\"']/
34
- quote ||= '"'
35
- return "#{quote}#{contents}#{quote}"
36
- end
37
-
38
- if quote.nil?
39
- if contents.include?('"')
40
- if contents.include?("'")
41
- quote = '"'
42
- else
43
- quote = "'"
44
- end
45
- else
46
- quote = '"'
47
- end
48
- end
49
-
50
- # Replace single backslashes with multiples.
51
- contents = contents.gsub("\\", "\\\\\\\\")
52
-
53
- if quote == '"'
54
- contents = contents.gsub('"', "\\\"")
55
- else
56
- contents = contents.gsub("'", "\\'")
57
- end
58
-
59
- contents = contents.gsub(/\n(?![a-fA-F0-9\s])/, "\\a").gsub("\n", "\\a ")
60
- "#{quote}#{contents}#{quote}"
61
- end
62
-
63
- # Creates a new string.
64
- #
65
- # @param value [String] See \{#value}
66
- # @param type [Symbol] See \{#type}
67
- def initialize(value, type = :identifier)
68
- super(value)
69
- @type = type
70
- end
71
-
72
- # @see Value#plus
73
- def plus(other)
74
- other_value = if other.is_a?(Sass::Script::Value::String)
75
- other.value
76
- else
77
- other.to_s(:quote => :none)
78
- end
79
- Sass::Script::Value::String.new(value + other_value, type)
80
- end
81
-
82
- # @see Value#to_s
83
- def to_s(opts = {})
84
- return @value.gsub(/\n\s*/, ' ') if opts[:quote] == :none || @type == :identifier
85
- Sass::Script::Value::String.quote(value, opts[:quote])
86
- end
87
-
88
- # @see Value#to_sass
89
- def to_sass(opts = {})
90
- to_s
91
- end
92
-
93
- def inspect
94
- String.quote(value)
95
- end
96
- end
97
- end