sass 3.1.0 → 3.3.0

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 (260) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING +1 -1
  3. data/MIT-LICENSE +2 -2
  4. data/README.md +29 -17
  5. data/Rakefile +43 -9
  6. data/VERSION +1 -1
  7. data/VERSION_DATE +1 -0
  8. data/VERSION_NAME +1 -1
  9. data/bin/sass +6 -1
  10. data/bin/sass-convert +6 -1
  11. data/bin/scss +6 -1
  12. data/ext/mkrf_conf.rb +27 -0
  13. data/lib/sass/cache_stores/base.rb +7 -3
  14. data/lib/sass/cache_stores/chain.rb +3 -2
  15. data/lib/sass/cache_stores/filesystem.rb +5 -7
  16. data/lib/sass/cache_stores/memory.rb +1 -1
  17. data/lib/sass/cache_stores/null.rb +2 -2
  18. data/lib/sass/callbacks.rb +2 -1
  19. data/lib/sass/css.rb +168 -53
  20. data/lib/sass/engine.rb +502 -174
  21. data/lib/sass/environment.rb +151 -111
  22. data/lib/sass/error.rb +7 -7
  23. data/lib/sass/exec.rb +176 -60
  24. data/lib/sass/features.rb +40 -0
  25. data/lib/sass/importers/base.rb +46 -7
  26. data/lib/sass/importers/deprecated_path.rb +51 -0
  27. data/lib/sass/importers/filesystem.rb +113 -30
  28. data/lib/sass/importers.rb +1 -0
  29. data/lib/sass/logger/base.rb +30 -0
  30. data/lib/sass/logger/log_level.rb +45 -0
  31. data/lib/sass/logger.rb +12 -0
  32. data/lib/sass/media.rb +213 -0
  33. data/lib/sass/plugin/compiler.rb +194 -104
  34. data/lib/sass/plugin/configuration.rb +18 -25
  35. data/lib/sass/plugin/merb.rb +1 -1
  36. data/lib/sass/plugin/staleness_checker.rb +37 -11
  37. data/lib/sass/plugin.rb +10 -13
  38. data/lib/sass/railtie.rb +2 -1
  39. data/lib/sass/repl.rb +5 -6
  40. data/lib/sass/script/css_lexer.rb +8 -4
  41. data/lib/sass/script/css_parser.rb +5 -2
  42. data/lib/sass/script/functions.rb +1547 -618
  43. data/lib/sass/script/lexer.rb +122 -72
  44. data/lib/sass/script/parser.rb +304 -135
  45. data/lib/sass/script/tree/funcall.rb +306 -0
  46. data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +43 -13
  47. data/lib/sass/script/tree/list_literal.rb +77 -0
  48. data/lib/sass/script/tree/literal.rb +45 -0
  49. data/lib/sass/script/tree/map_literal.rb +64 -0
  50. data/lib/sass/script/{node.rb → tree/node.rb} +30 -12
  51. data/lib/sass/script/{operation.rb → tree/operation.rb} +33 -21
  52. data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +14 -4
  53. data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +21 -9
  54. data/lib/sass/script/tree/variable.rb +57 -0
  55. data/lib/sass/script/tree.rb +15 -0
  56. data/lib/sass/script/value/arg_list.rb +36 -0
  57. data/lib/sass/script/value/base.rb +238 -0
  58. data/lib/sass/script/value/bool.rb +40 -0
  59. data/lib/sass/script/{color.rb → value/color.rb} +256 -74
  60. data/lib/sass/script/value/deprecated_false.rb +55 -0
  61. data/lib/sass/script/value/helpers.rb +155 -0
  62. data/lib/sass/script/value/list.rb +128 -0
  63. data/lib/sass/script/value/map.rb +70 -0
  64. data/lib/sass/script/value/null.rb +49 -0
  65. data/lib/sass/script/{number.rb → value/number.rb} +115 -62
  66. data/lib/sass/script/{string.rb → value/string.rb} +9 -11
  67. data/lib/sass/script/value.rb +12 -0
  68. data/lib/sass/script.rb +35 -9
  69. data/lib/sass/scss/css_parser.rb +2 -12
  70. data/lib/sass/scss/parser.rb +657 -230
  71. data/lib/sass/scss/rx.rb +17 -12
  72. data/lib/sass/scss/static_parser.rb +37 -6
  73. data/lib/sass/scss.rb +0 -1
  74. data/lib/sass/selector/abstract_sequence.rb +35 -3
  75. data/lib/sass/selector/comma_sequence.rb +29 -14
  76. data/lib/sass/selector/sequence.rb +371 -74
  77. data/lib/sass/selector/simple.rb +28 -13
  78. data/lib/sass/selector/simple_sequence.rb +163 -36
  79. data/lib/sass/selector.rb +138 -36
  80. data/lib/sass/shared.rb +3 -5
  81. data/lib/sass/source/map.rb +196 -0
  82. data/lib/sass/source/position.rb +39 -0
  83. data/lib/sass/source/range.rb +41 -0
  84. data/lib/sass/stack.rb +126 -0
  85. data/lib/sass/supports.rb +228 -0
  86. data/lib/sass/tree/at_root_node.rb +82 -0
  87. data/lib/sass/tree/comment_node.rb +34 -29
  88. data/lib/sass/tree/content_node.rb +9 -0
  89. data/lib/sass/tree/css_import_node.rb +60 -0
  90. data/lib/sass/tree/debug_node.rb +3 -3
  91. data/lib/sass/tree/directive_node.rb +33 -3
  92. data/lib/sass/tree/each_node.rb +9 -9
  93. data/lib/sass/tree/extend_node.rb +20 -6
  94. data/lib/sass/tree/for_node.rb +6 -6
  95. data/lib/sass/tree/function_node.rb +12 -4
  96. data/lib/sass/tree/if_node.rb +2 -15
  97. data/lib/sass/tree/import_node.rb +11 -5
  98. data/lib/sass/tree/media_node.rb +27 -11
  99. data/lib/sass/tree/mixin_def_node.rb +15 -4
  100. data/lib/sass/tree/mixin_node.rb +27 -7
  101. data/lib/sass/tree/node.rb +69 -35
  102. data/lib/sass/tree/prop_node.rb +47 -31
  103. data/lib/sass/tree/return_node.rb +4 -3
  104. data/lib/sass/tree/root_node.rb +20 -4
  105. data/lib/sass/tree/rule_node.rb +37 -26
  106. data/lib/sass/tree/supports_node.rb +38 -0
  107. data/lib/sass/tree/trace_node.rb +33 -0
  108. data/lib/sass/tree/variable_node.rb +10 -4
  109. data/lib/sass/tree/visitors/base.rb +5 -8
  110. data/lib/sass/tree/visitors/check_nesting.rb +67 -52
  111. data/lib/sass/tree/visitors/convert.rb +134 -53
  112. data/lib/sass/tree/visitors/cssize.rb +245 -51
  113. data/lib/sass/tree/visitors/deep_copy.rb +102 -0
  114. data/lib/sass/tree/visitors/extend.rb +68 -0
  115. data/lib/sass/tree/visitors/perform.rb +331 -105
  116. data/lib/sass/tree/visitors/set_options.rb +125 -0
  117. data/lib/sass/tree/visitors/to_css.rb +259 -95
  118. data/lib/sass/tree/warn_node.rb +3 -3
  119. data/lib/sass/tree/while_node.rb +3 -3
  120. data/lib/sass/util/cross_platform_random.rb +19 -0
  121. data/lib/sass/util/multibyte_string_scanner.rb +157 -0
  122. data/lib/sass/util/normalized_map.rb +130 -0
  123. data/lib/sass/util/ordered_hash.rb +192 -0
  124. data/lib/sass/util/subset_map.rb +11 -2
  125. data/lib/sass/util/test.rb +9 -0
  126. data/lib/sass/util.rb +565 -39
  127. data/lib/sass/version.rb +27 -15
  128. data/lib/sass.rb +39 -4
  129. data/test/sass/cache_test.rb +15 -0
  130. data/test/sass/compiler_test.rb +223 -0
  131. data/test/sass/conversion_test.rb +901 -107
  132. data/test/sass/css2sass_test.rb +94 -0
  133. data/test/sass/engine_test.rb +1059 -164
  134. data/test/sass/exec_test.rb +86 -0
  135. data/test/sass/extend_test.rb +933 -837
  136. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  137. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  138. data/test/sass/functions_test.rb +995 -136
  139. data/test/sass/importer_test.rb +338 -18
  140. data/test/sass/logger_test.rb +58 -0
  141. data/test/sass/more_results/more_import.css +2 -2
  142. data/test/sass/plugin_test.rb +114 -30
  143. data/test/sass/results/cached_import_option.css +3 -0
  144. data/test/sass/results/filename_fn.css +3 -0
  145. data/test/sass/results/import.css +2 -2
  146. data/test/sass/results/import_charset.css +1 -0
  147. data/test/sass/results/import_charset_1_8.css +1 -0
  148. data/test/sass/results/import_charset_ibm866.css +1 -0
  149. data/test/sass/results/import_content.css +1 -0
  150. data/test/sass/results/script.css +1 -1
  151. data/test/sass/results/scss_import.css +2 -2
  152. data/test/sass/results/units.css +2 -2
  153. data/test/sass/script_conversion_test.rb +43 -1
  154. data/test/sass/script_test.rb +380 -36
  155. data/test/sass/scss/css_test.rb +257 -75
  156. data/test/sass/scss/scss_test.rb +2322 -110
  157. data/test/sass/source_map_test.rb +887 -0
  158. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  159. data/test/sass/templates/_double_import_loop2.sass +1 -0
  160. data/test/sass/templates/_filename_fn_import.scss +11 -0
  161. data/test/sass/templates/_imported_content.sass +3 -0
  162. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  163. data/test/sass/templates/bork5.sass +3 -0
  164. data/test/sass/templates/cached_import_option.scss +3 -0
  165. data/test/sass/templates/double_import_loop1.sass +1 -0
  166. data/test/sass/templates/filename_fn.scss +18 -0
  167. data/test/sass/templates/import_charset.sass +2 -0
  168. data/test/sass/templates/import_charset_1_8.sass +2 -0
  169. data/test/sass/templates/import_charset_ibm866.sass +2 -0
  170. data/test/sass/templates/import_content.sass +4 -0
  171. data/test/sass/templates/same_name_different_ext.sass +2 -0
  172. data/test/sass/templates/same_name_different_ext.scss +1 -0
  173. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  174. data/test/sass/templates/single_import_loop.sass +1 -0
  175. data/test/sass/templates/subdir/import_up1.scss +1 -0
  176. data/test/sass/templates/subdir/import_up2.scss +1 -0
  177. data/test/sass/test_helper.rb +1 -1
  178. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  179. data/test/sass/util/normalized_map_test.rb +51 -0
  180. data/test/sass/util_test.rb +183 -0
  181. data/test/sass/value_helpers_test.rb +181 -0
  182. data/test/test_helper.rb +45 -5
  183. data/vendor/listen/CHANGELOG.md +228 -0
  184. data/vendor/listen/CONTRIBUTING.md +38 -0
  185. data/vendor/listen/Gemfile +30 -0
  186. data/vendor/listen/Guardfile +8 -0
  187. data/vendor/{fssm → listen}/LICENSE +1 -1
  188. data/vendor/listen/README.md +315 -0
  189. data/vendor/listen/Rakefile +47 -0
  190. data/vendor/listen/Vagrantfile +96 -0
  191. data/vendor/listen/lib/listen/adapter.rb +214 -0
  192. data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
  193. data/vendor/listen/lib/listen/adapters/darwin.rb +85 -0
  194. data/vendor/listen/lib/listen/adapters/linux.rb +113 -0
  195. data/vendor/listen/lib/listen/adapters/polling.rb +67 -0
  196. data/vendor/listen/lib/listen/adapters/windows.rb +87 -0
  197. data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
  198. data/vendor/listen/lib/listen/directory_record.rb +371 -0
  199. data/vendor/listen/lib/listen/listener.rb +225 -0
  200. data/vendor/listen/lib/listen/multi_listener.rb +143 -0
  201. data/vendor/listen/lib/listen/turnstile.rb +28 -0
  202. data/vendor/listen/lib/listen/version.rb +3 -0
  203. data/vendor/listen/lib/listen.rb +40 -0
  204. data/vendor/listen/listen.gemspec +22 -0
  205. data/vendor/listen/spec/listen/adapter_spec.rb +183 -0
  206. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
  207. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
  208. data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
  209. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  210. data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
  211. data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
  212. data/vendor/listen/spec/listen/directory_record_spec.rb +1225 -0
  213. data/vendor/listen/spec/listen/listener_spec.rb +169 -0
  214. data/vendor/listen/spec/listen/multi_listener_spec.rb +174 -0
  215. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  216. data/vendor/listen/spec/listen_spec.rb +73 -0
  217. data/vendor/listen/spec/spec_helper.rb +21 -0
  218. data/vendor/listen/spec/support/adapter_helper.rb +629 -0
  219. data/vendor/listen/spec/support/directory_record_helper.rb +55 -0
  220. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  221. data/vendor/listen/spec/support/listeners_helper.rb +156 -0
  222. data/vendor/listen/spec/support/platform_helper.rb +15 -0
  223. metadata +344 -271
  224. data/lib/sass/less.rb +0 -382
  225. data/lib/sass/script/bool.rb +0 -18
  226. data/lib/sass/script/funcall.rb +0 -162
  227. data/lib/sass/script/list.rb +0 -76
  228. data/lib/sass/script/literal.rb +0 -245
  229. data/lib/sass/script/variable.rb +0 -54
  230. data/lib/sass/scss/sass_parser.rb +0 -11
  231. data/test/sass/less_conversion_test.rb +0 -653
  232. data/vendor/fssm/README.markdown +0 -55
  233. data/vendor/fssm/Rakefile +0 -59
  234. data/vendor/fssm/VERSION.yml +0 -5
  235. data/vendor/fssm/example.rb +0 -9
  236. data/vendor/fssm/fssm.gemspec +0 -77
  237. data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
  238. data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
  239. data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
  240. data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
  241. data/vendor/fssm/lib/fssm/monitor.rb +0 -26
  242. data/vendor/fssm/lib/fssm/path.rb +0 -91
  243. data/vendor/fssm/lib/fssm/pathname.rb +0 -502
  244. data/vendor/fssm/lib/fssm/state/directory.rb +0 -57
  245. data/vendor/fssm/lib/fssm/state/file.rb +0 -24
  246. data/vendor/fssm/lib/fssm/support.rb +0 -63
  247. data/vendor/fssm/lib/fssm/tree.rb +0 -176
  248. data/vendor/fssm/lib/fssm.rb +0 -33
  249. data/vendor/fssm/profile/prof-cache.rb +0 -40
  250. data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
  251. data/vendor/fssm/profile/prof-pathname.rb +0 -68
  252. data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
  253. data/vendor/fssm/profile/prof.html +0 -2379
  254. data/vendor/fssm/spec/path_spec.rb +0 -75
  255. data/vendor/fssm/spec/root/duck/quack.txt +0 -0
  256. data/vendor/fssm/spec/root/file.css +0 -0
  257. data/vendor/fssm/spec/root/file.rb +0 -0
  258. data/vendor/fssm/spec/root/file.yml +0 -0
  259. data/vendor/fssm/spec/root/moo/cow.txt +0 -0
  260. data/vendor/fssm/spec/spec_helper.rb +0 -14
@@ -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,128 @@
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
+ return @map ||= Sass::Util.to_hash(value.map {|e| e.to_a}) if is_pseudo_map?
69
+ super
70
+ end
71
+
72
+ # Returns whether a warning still needs to be printed for this list being used as a map.
73
+ #
74
+ # @return [Boolean]
75
+ def needs_map_warning?
76
+ !@value.empty? && !@map
77
+ end
78
+
79
+ # Returns whether this is a list of pairs that can be used as a map.
80
+ #
81
+ # @return [Boolean]
82
+ def is_pseudo_map?
83
+ @is_pseudo_map ||= value.all? {|e| e.is_a?(Sass::Script::Value::List) && e.to_a.length == 2}
84
+ end
85
+
86
+ # @see Value#inspect
87
+ def inspect
88
+ "(#{value.map {|e| e.inspect}.join(sep_str(nil))})"
89
+ end
90
+
91
+ # Asserts an index is within the list.
92
+ #
93
+ # @private
94
+ #
95
+ # @param list [Sass::Script::Value::List] The list for which the index should be checked.
96
+ # @param n [Sass::Script::Value::Number] The index being checked.
97
+ def self.assert_valid_index(list, n)
98
+ if !n.int? || n.to_i == 0
99
+ raise ArgumentError.new("List index #{n} must be a non-zero integer")
100
+ elsif list.to_a.size == 0
101
+ raise ArgumentError.new("List index is #{n} but list has no items")
102
+ elsif n.to_i.abs > (size = list.to_a.size)
103
+ raise ArgumentError.new(
104
+ "List index is #{n} but list is only #{size} item#{'s' if size != 1} long")
105
+ end
106
+ end
107
+
108
+ private
109
+
110
+ def element_needs_parens?(element)
111
+ if element.is_a?(List)
112
+ return false if element.value.empty?
113
+ precedence = Sass::Script::Parser.precedence_of(separator)
114
+ return Sass::Script::Parser.precedence_of(element.separator) <= precedence
115
+ end
116
+
117
+ return false unless separator == :space
118
+ return false unless element.is_a?(Sass::Script::Tree::UnaryOperation)
119
+ element.operator == :minus || element.operator == :plus
120
+ end
121
+
122
+ def sep_str(opts = options)
123
+ return ' ' if separator == :space
124
+ return ',' if opts && opts[:style] == :compressed
125
+ ', '
126
+ end
127
+ end
128
+ 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,49 @@
1
+ module Sass::Script::Value
2
+ # A SassScript object representing a null value.
3
+ class Null < Base
4
+ # The null value in SassScript.
5
+ #
6
+ # This is assigned before new is overridden below so that we use the default implementation.
7
+ NULL = new(nil)
8
+
9
+ # We override object creation so that users of the core API
10
+ # will not need to know that null is a specific constant.
11
+ #
12
+ # @private
13
+ # @return [Null] the {NULL} constant.
14
+ def self.new
15
+ NULL
16
+ end
17
+
18
+ # @return [Boolean] `false` (the Ruby boolean value)
19
+ def to_bool
20
+ false
21
+ end
22
+
23
+ # @return [Boolean] `true`
24
+ def null?
25
+ true
26
+ end
27
+
28
+ def neq(other)
29
+ return other.neq(self) if other.is_a?(DeprecatedFalse)
30
+ super
31
+ end
32
+
33
+ # @return [String] '' (An empty string)
34
+ def to_s(opts = {})
35
+ ''
36
+ end
37
+
38
+ def to_sass(opts = {})
39
+ 'null'
40
+ end
41
+
42
+ # Returns a string representing a null value.
43
+ #
44
+ # @return [String]
45
+ def inspect
46
+ 'null'
47
+ end
48
+ end
49
+ end