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
@@ -1,6 +1,4 @@
1
- require 'sass/script/literal'
2
-
3
- module Sass::Script
1
+ module Sass::Script::Value
4
2
  # A SassScript object representing a CSS color.
5
3
  #
6
4
  # A color may be represented internally as RGBA, HSLA, or both.
@@ -15,34 +13,183 @@ module Sass::Script
15
13
  # It's always stored, as 1 if nothing else is specified.
16
14
  # If only the alpha channel is modified using \{#with},
17
15
  # the cached RGB and HSL values are retained.
18
- class Color < Literal
19
- class << self; include Sass::Util; end
16
+ class Color < Base
17
+ # @private
18
+ #
19
+ # Convert a ruby integer to a rgba components
20
+ # @param color [Fixnum]
21
+ # @return [Array<Fixnum>] Array of 4 numbers representing r,g,b and alpha
22
+ def self.int_to_rgba(color)
23
+ rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse
24
+ rgba[-1] = rgba[-1] / 255.0
25
+ rgba
26
+ end
27
+
28
+ ALTERNATE_COLOR_NAMES = Sass::Util.map_vals({
29
+ 'aqua' => 0x00FFFFFF,
30
+ 'darkgrey' => 0xA9A9A9FF,
31
+ 'darkslategrey' => 0x2F4F4FFF,
32
+ 'dimgrey' => 0x696969FF,
33
+ 'fuchsia' => 0xFF00FFFF,
34
+ 'grey' => 0x808080FF,
35
+ 'lightgrey' => 0xD3D3D3FF,
36
+ 'lightslategrey' => 0x778899FF,
37
+ 'slategrey' => 0x708090FF,
38
+ }, &method(:int_to_rgba))
20
39
 
21
40
  # A hash from color names to `[red, green, blue]` value arrays.
22
- HTML4_COLORS = map_vals({
23
- 'black' => 0x000000,
24
- 'silver' => 0xc0c0c0,
25
- 'gray' => 0x808080,
26
- 'white' => 0xffffff,
27
- 'maroon' => 0x800000,
28
- 'red' => 0xff0000,
29
- 'purple' => 0x800080,
30
- 'fuchsia' => 0xff00ff,
31
- 'green' => 0x008000,
32
- 'lime' => 0x00ff00,
33
- 'olive' => 0x808000,
34
- 'yellow' => 0xffff00,
35
- 'navy' => 0x000080,
36
- 'blue' => 0x0000ff,
37
- 'teal' => 0x008080,
38
- 'aqua' => 0x00ffff
39
- }) {|color| (0..2).map {|n| color >> (n << 3) & 0xff}.reverse}
40
- # A hash from `[red, green, blue]` value arrays to color names.
41
- HTML4_COLORS_REVERSE = map_hash(HTML4_COLORS) {|k, v| [v, k]}
41
+ COLOR_NAMES = Sass::Util.map_vals({
42
+ 'aliceblue' => 0xF0F8FFFF,
43
+ 'antiquewhite' => 0xFAEBD7FF,
44
+ 'aquamarine' => 0x7FFFD4FF,
45
+ 'azure' => 0xF0FFFFFF,
46
+ 'beige' => 0xF5F5DCFF,
47
+ 'bisque' => 0xFFE4C4FF,
48
+ 'black' => 0x000000FF,
49
+ 'blanchedalmond' => 0xFFEBCDFF,
50
+ 'blue' => 0x0000FFFF,
51
+ 'blueviolet' => 0x8A2BE2FF,
52
+ 'brown' => 0xA52A2AFF,
53
+ 'burlywood' => 0xDEB887FF,
54
+ 'cadetblue' => 0x5F9EA0FF,
55
+ 'chartreuse' => 0x7FFF00FF,
56
+ 'chocolate' => 0xD2691EFF,
57
+ 'coral' => 0xFF7F50FF,
58
+ 'cornflowerblue' => 0x6495EDFF,
59
+ 'cornsilk' => 0xFFF8DCFF,
60
+ 'crimson' => 0xDC143CFF,
61
+ 'cyan' => 0x00FFFFFF,
62
+ 'darkblue' => 0x00008BFF,
63
+ 'darkcyan' => 0x008B8BFF,
64
+ 'darkgoldenrod' => 0xB8860BFF,
65
+ 'darkgray' => 0xA9A9A9FF,
66
+ 'darkgreen' => 0x006400FF,
67
+ 'darkkhaki' => 0xBDB76BFF,
68
+ 'darkmagenta' => 0x8B008BFF,
69
+ 'darkolivegreen' => 0x556B2FFF,
70
+ 'darkorange' => 0xFF8C00FF,
71
+ 'darkorchid' => 0x9932CCFF,
72
+ 'darkred' => 0x8B0000FF,
73
+ 'darksalmon' => 0xE9967AFF,
74
+ 'darkseagreen' => 0x8FBC8FFF,
75
+ 'darkslateblue' => 0x483D8BFF,
76
+ 'darkslategray' => 0x2F4F4FFF,
77
+ 'darkturquoise' => 0x00CED1FF,
78
+ 'darkviolet' => 0x9400D3FF,
79
+ 'deeppink' => 0xFF1493FF,
80
+ 'deepskyblue' => 0x00BFFFFF,
81
+ 'dimgray' => 0x696969FF,
82
+ 'dodgerblue' => 0x1E90FFFF,
83
+ 'firebrick' => 0xB22222FF,
84
+ 'floralwhite' => 0xFFFAF0FF,
85
+ 'forestgreen' => 0x228B22FF,
86
+ 'gainsboro' => 0xDCDCDCFF,
87
+ 'ghostwhite' => 0xF8F8FFFF,
88
+ 'gold' => 0xFFD700FF,
89
+ 'goldenrod' => 0xDAA520FF,
90
+ 'gray' => 0x808080FF,
91
+ 'green' => 0x008000FF,
92
+ 'greenyellow' => 0xADFF2FFF,
93
+ 'honeydew' => 0xF0FFF0FF,
94
+ 'hotpink' => 0xFF69B4FF,
95
+ 'indianred' => 0xCD5C5CFF,
96
+ 'indigo' => 0x4B0082FF,
97
+ 'ivory' => 0xFFFFF0FF,
98
+ 'khaki' => 0xF0E68CFF,
99
+ 'lavender' => 0xE6E6FAFF,
100
+ 'lavenderblush' => 0xFFF0F5FF,
101
+ 'lawngreen' => 0x7CFC00FF,
102
+ 'lemonchiffon' => 0xFFFACDFF,
103
+ 'lightblue' => 0xADD8E6FF,
104
+ 'lightcoral' => 0xF08080FF,
105
+ 'lightcyan' => 0xE0FFFFFF,
106
+ 'lightgoldenrodyellow' => 0xFAFAD2FF,
107
+ 'lightgreen' => 0x90EE90FF,
108
+ 'lightgray' => 0xD3D3D3FF,
109
+ 'lightpink' => 0xFFB6C1FF,
110
+ 'lightsalmon' => 0xFFA07AFF,
111
+ 'lightseagreen' => 0x20B2AAFF,
112
+ 'lightskyblue' => 0x87CEFAFF,
113
+ 'lightslategray' => 0x778899FF,
114
+ 'lightsteelblue' => 0xB0C4DEFF,
115
+ 'lightyellow' => 0xFFFFE0FF,
116
+ 'lime' => 0x00FF00FF,
117
+ 'limegreen' => 0x32CD32FF,
118
+ 'linen' => 0xFAF0E6FF,
119
+ 'magenta' => 0xFF00FFFF,
120
+ 'maroon' => 0x800000FF,
121
+ 'mediumaquamarine' => 0x66CDAAFF,
122
+ 'mediumblue' => 0x0000CDFF,
123
+ 'mediumorchid' => 0xBA55D3FF,
124
+ 'mediumpurple' => 0x9370DBFF,
125
+ 'mediumseagreen' => 0x3CB371FF,
126
+ 'mediumslateblue' => 0x7B68EEFF,
127
+ 'mediumspringgreen' => 0x00FA9AFF,
128
+ 'mediumturquoise' => 0x48D1CCFF,
129
+ 'mediumvioletred' => 0xC71585FF,
130
+ 'midnightblue' => 0x191970FF,
131
+ 'mintcream' => 0xF5FFFAFF,
132
+ 'mistyrose' => 0xFFE4E1FF,
133
+ 'moccasin' => 0xFFE4B5FF,
134
+ 'navajowhite' => 0xFFDEADFF,
135
+ 'navy' => 0x000080FF,
136
+ 'oldlace' => 0xFDF5E6FF,
137
+ 'olive' => 0x808000FF,
138
+ 'olivedrab' => 0x6B8E23FF,
139
+ 'orange' => 0xFFA500FF,
140
+ 'orangered' => 0xFF4500FF,
141
+ 'orchid' => 0xDA70D6FF,
142
+ 'palegoldenrod' => 0xEEE8AAFF,
143
+ 'palegreen' => 0x98FB98FF,
144
+ 'paleturquoise' => 0xAFEEEEFF,
145
+ 'palevioletred' => 0xDB7093FF,
146
+ 'papayawhip' => 0xFFEFD5FF,
147
+ 'peachpuff' => 0xFFDAB9FF,
148
+ 'peru' => 0xCD853FFF,
149
+ 'pink' => 0xFFC0CBFF,
150
+ 'plum' => 0xDDA0DDFF,
151
+ 'powderblue' => 0xB0E0E6FF,
152
+ 'purple' => 0x800080FF,
153
+ 'red' => 0xFF0000FF,
154
+ 'rosybrown' => 0xBC8F8FFF,
155
+ 'royalblue' => 0x4169E1FF,
156
+ 'saddlebrown' => 0x8B4513FF,
157
+ 'salmon' => 0xFA8072FF,
158
+ 'sandybrown' => 0xF4A460FF,
159
+ 'seagreen' => 0x2E8B57FF,
160
+ 'seashell' => 0xFFF5EEFF,
161
+ 'sienna' => 0xA0522DFF,
162
+ 'silver' => 0xC0C0C0FF,
163
+ 'skyblue' => 0x87CEEBFF,
164
+ 'slateblue' => 0x6A5ACDFF,
165
+ 'slategray' => 0x708090FF,
166
+ 'snow' => 0xFFFAFAFF,
167
+ 'springgreen' => 0x00FF7FFF,
168
+ 'steelblue' => 0x4682B4FF,
169
+ 'tan' => 0xD2B48CFF,
170
+ 'teal' => 0x008080FF,
171
+ 'thistle' => 0xD8BFD8FF,
172
+ 'tomato' => 0xFF6347FF,
173
+ 'transparent' => 0x00000000,
174
+ 'turquoise' => 0x40E0D0FF,
175
+ 'violet' => 0xEE82EEFF,
176
+ 'wheat' => 0xF5DEB3FF,
177
+ 'white' => 0xFFFFFFFF,
178
+ 'whitesmoke' => 0xF5F5F5FF,
179
+ 'yellow' => 0xFFFF00FF,
180
+ 'yellowgreen' => 0x9ACD32FF
181
+ }, &method(:int_to_rgba))
182
+
183
+ # A hash from `[red, green, blue, alpha]` value arrays to color names.
184
+ COLOR_NAMES_REVERSE = COLOR_NAMES.invert.freeze
185
+
186
+ # We add the alternate color names after inverting because
187
+ # different ruby implementations and versions vary on the ordering of the result of invert.
188
+ COLOR_NAMES.update(ALTERNATE_COLOR_NAMES).freeze
42
189
 
43
190
  # Constructs an RGB or HSL color object,
44
191
  # optionally with an alpha channel.
45
- #
192
+ #
46
193
  # The RGB values must be between 0 and 255.
47
194
  # The saturation and lightness values must be between 0 and 100.
48
195
  # The alpha value must be between 0 and 1.
@@ -101,21 +248,34 @@ module Sass::Script
101
248
  [:red, :green, :blue].each do |k|
102
249
  next if @attrs[k].nil?
103
250
  @attrs[k] = @attrs[k].to_i
104
- next if (0..255).include?(@attrs[k])
105
- raise ArgumentError.new("#{k.to_s.capitalize} value must be between 0 and 255")
251
+ Sass::Util.check_range("#{k.to_s.capitalize} value", 0..255, @attrs[k])
106
252
  end
107
253
 
108
254
  [:saturation, :lightness].each do |k|
109
255
  next if @attrs[k].nil?
110
- @attrs[k] = 0 if @attrs[k] < 0.00001 && @attrs[k] > -0.00001
111
- @attrs[k] = 100 if @attrs[k] - 100 < 0.00001 && @attrs[k] - 100 > -0.00001
112
- next if (0..100).include?(@attrs[k])
113
- raise ArgumentError.new("#{k.to_s.capitalize} must be between 0 and 100")
256
+ value = Number.new(@attrs[k], ['%']) # Get correct unit for error messages
257
+ @attrs[k] = Sass::Util.check_range("#{k.to_s.capitalize}", 0..100, value, '%')
114
258
  end
115
259
 
116
- unless (0..1).include?(@attrs[:alpha])
117
- raise ArgumentError.new("Alpha channel must be between 0 and 1")
260
+ @attrs[:alpha] = Sass::Util.check_range("Alpha channel", 0..1, @attrs[:alpha])
261
+ end
262
+
263
+ # Create a new color from a valid CSS hex string.
264
+ #
265
+ # The leading hash is optional.
266
+ #
267
+ # @return [Color]
268
+ def self.from_hex(hex_string, alpha = nil)
269
+ unless hex_string =~ /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i ||
270
+ hex_string =~ /^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i
271
+ raise ArgumentError.new("#{hex_string.inspect} is not a valid hex color.")
118
272
  end
273
+ red = $1.ljust(2, $1).to_i(16)
274
+ green = $2.ljust(2, $2).to_i(16)
275
+ blue = $3.ljust(2, $3).to_i(16)
276
+ attrs = {:red => red, :green => green, :blue => blue}
277
+ attrs[:alpha] = alpha if alpha
278
+ new(attrs)
119
279
  end
120
280
 
121
281
  # The red component of the color.
@@ -171,7 +331,7 @@ module Sass::Script
171
331
  #
172
332
  # @return [Fixnum]
173
333
  def alpha
174
- @attrs[:alpha]
334
+ @attrs[:alpha].to_f
175
335
  end
176
336
 
177
337
  # Returns whether this color object is translucent;
@@ -190,6 +350,14 @@ module Sass::Script
190
350
  [red, green, blue].freeze
191
351
  end
192
352
 
353
+ # Returns the red, green, blue, and alpha components of the color.
354
+ #
355
+ # @return [Array<Fixnum>] A frozen four-element array of the red, green,
356
+ # blue, and alpha values (respectively) of the color
357
+ def rgba
358
+ [red, green, blue, alpha].freeze
359
+ end
360
+
193
361
  # Returns the hue, saturation, and lightness components of the color.
194
362
  #
195
363
  # @return [Array<Fixnum>] A frozen three-element array of the
@@ -198,18 +366,30 @@ module Sass::Script
198
366
  [hue, saturation, lightness].freeze
199
367
  end
200
368
 
369
+ # Returns the hue, saturation, lightness, and alpha components of the color.
370
+ #
371
+ # @return [Array<Fixnum>] A frozen four-element array of the hue,
372
+ # saturation, lightness, and alpha values (respectively) of the color
373
+ def hsla
374
+ [hue, saturation, lightness].freeze
375
+ end
376
+
201
377
  # The SassScript `==` operation.
202
- # **Note that this returns a {Sass::Script::Bool} object,
378
+ # **Note that this returns a {Sass::Script::Value::Bool} object,
203
379
  # not a Ruby boolean**.
204
380
  #
205
- # @param other [Literal] The right-hand side of the operator
206
- # @return [Bool] True if this literal is the same as the other,
381
+ # @param other [Value] The right-hand side of the operator
382
+ # @return [Bool] True if this value is the same as the other,
207
383
  # false otherwise
208
384
  def eq(other)
209
- Sass::Script::Bool.new(
385
+ Sass::Script::Value::Bool.new(
210
386
  other.is_a?(Color) && rgb == other.rgb && alpha == other.alpha)
211
387
  end
212
388
 
389
+ def hash
390
+ [rgb, alpha].hash
391
+ end
392
+
213
393
  # Returns a copy of this color with one or more channels changed.
214
394
  # RGB or HSL colors may be changed, but not both at once.
215
395
  #
@@ -260,14 +440,14 @@ module Sass::Script
260
440
  # {Color}
261
441
  # : Adds each of the RGB color channels together.
262
442
  #
263
- # {Literal}
264
- # : See {Literal#plus}.
443
+ # {Value}
444
+ # : See {Value::Base#plus}.
265
445
  #
266
- # @param other [Literal] The right-hand side of the operator
446
+ # @param other [Value] The right-hand side of the operator
267
447
  # @return [Color] The resulting color
268
448
  # @raise [Sass::SyntaxError] if `other` is a number with units
269
449
  def plus(other)
270
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
450
+ if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
271
451
  piecewise(other, :+)
272
452
  else
273
453
  super
@@ -283,14 +463,14 @@ module Sass::Script
283
463
  # {Color}
284
464
  # : Subtracts each of the other color's RGB color channels from this color's.
285
465
  #
286
- # {Literal}
287
- # : See {Literal#minus}.
466
+ # {Value}
467
+ # : See {Value::Base#minus}.
288
468
  #
289
- # @param other [Literal] The right-hand side of the operator
469
+ # @param other [Value] The right-hand side of the operator
290
470
  # @return [Color] The resulting color
291
471
  # @raise [Sass::SyntaxError] if `other` is a number with units
292
472
  def minus(other)
293
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
473
+ if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
294
474
  piecewise(other, :-)
295
475
  else
296
476
  super
@@ -310,7 +490,7 @@ module Sass::Script
310
490
  # @return [Color] The resulting color
311
491
  # @raise [Sass::SyntaxError] if `other` is a number with units
312
492
  def times(other)
313
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
493
+ if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
314
494
  piecewise(other, :*)
315
495
  else
316
496
  raise NoMethodError.new(nil, :times)
@@ -326,14 +506,15 @@ module Sass::Script
326
506
  # {Color}
327
507
  # : Divides each of this color's RGB color channels by the other color's.
328
508
  #
329
- # {Literal}
330
- # : See {Literal#div}.
509
+ # {Value}
510
+ # : See {Value::Base#div}.
331
511
  #
332
- # @param other [Literal] The right-hand side of the operator
512
+ # @param other [Value] The right-hand side of the operator
333
513
  # @return [Color] The resulting color
334
514
  # @raise [Sass::SyntaxError] if `other` is a number with units
335
515
  def div(other)
336
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
516
+ if other.is_a?(Sass::Script::Value::Number) ||
517
+ other.is_a?(Sass::Script::Value::Color)
337
518
  piecewise(other, :/)
338
519
  else
339
520
  super
@@ -353,7 +534,8 @@ module Sass::Script
353
534
  # @return [Color] The resulting color
354
535
  # @raise [Sass::SyntaxError] if `other` is a number with units
355
536
  def mod(other)
356
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
537
+ if other.is_a?(Sass::Script::Value::Number) ||
538
+ other.is_a?(Sass::Script::Value::Color)
357
539
  piecewise(other, :%)
358
540
  else
359
541
  raise NoMethodError.new(nil, :mod)
@@ -366,10 +548,9 @@ module Sass::Script
366
548
  #
367
549
  # @return [String] The string representation
368
550
  def to_s(opts = {})
369
- return rgba_str if alpha?
370
551
  return smallest if options[:style] == :compressed
371
- return HTML4_COLORS_REVERSE[rgb] if HTML4_COLORS_REVERSE[rgb]
372
- hex_str
552
+ return COLOR_NAMES_REVERSE[rgba] if COLOR_NAMES_REVERSE[rgba]
553
+ alpha? ? rgba_str : hex_str
373
554
  end
374
555
  alias_method :to_sass, :to_s
375
556
 
@@ -383,10 +564,10 @@ module Sass::Script
383
564
  private
384
565
 
385
566
  def smallest
386
- small_hex_str = hex_str.gsub(/^#(.)\1(.)\2(.)\3$/, '#\1\2\3')
387
- return small_hex_str unless (color = HTML4_COLORS_REVERSE[rgb]) &&
388
- color.size <= small_hex_str.size
389
- return color
567
+ small_explicit_str = alpha? ? rgba_str : hex_str.gsub(/^#(.)\1(.)\2(.)\3$/, '#\1\2\3')
568
+ return small_explicit_str unless (color = COLOR_NAMES_REVERSE[rgba]) &&
569
+ color.size <= small_explicit_str.size
570
+ color
390
571
  end
391
572
 
392
573
  def rgba_str
@@ -395,20 +576,21 @@ module Sass::Script
395
576
  end
396
577
 
397
578
  def hex_str
398
- red, green, blue = rgb.map { |num| num.to_s(16).rjust(2, '0') }
579
+ red, green, blue = rgb.map {|num| num.to_s(16).rjust(2, '0')}
399
580
  "##{red}#{green}#{blue}"
400
581
  end
401
582
 
402
583
  def piecewise(other, operation)
403
584
  other_num = other.is_a? Number
404
585
  if other_num && !other.unitless?
405
- raise Sass::SyntaxError.new("Cannot add a number with units (#{other}) to a color (#{self}).")
586
+ raise Sass::SyntaxError.new(
587
+ "Cannot add a number with units (#{other}) to a color (#{self}).")
406
588
  end
407
589
 
408
590
  result = []
409
- for i in (0...3)
591
+ (0...3).each do |i|
410
592
  res = rgb[i].send(operation, other_num ? other.value : other.rgb[i])
411
- result[i] = [ [res, 255].min, 0 ].max
593
+ result[i] = [[res, 255].min, 0].max
412
594
  end
413
595
 
414
596
  if !other_num && other.alpha != alpha
@@ -429,9 +611,9 @@ module Sass::Script
429
611
  m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s
430
612
  m1 = l * 2 - m2
431
613
  @attrs[:red], @attrs[:green], @attrs[:blue] = [
432
- hue_to_rgb(m1, m2, h + 1.0/3),
614
+ hue_to_rgb(m1, m2, h + 1.0 / 3),
433
615
  hue_to_rgb(m1, m2, h),
434
- hue_to_rgb(m1, m2, h - 1.0/3)
616
+ hue_to_rgb(m1, m2, h - 1.0 / 3)
435
617
  ].map {|c| (c * 0xff).round}
436
618
  end
437
619
 
@@ -440,8 +622,8 @@ module Sass::Script
440
622
  h -= 1 if h > 1
441
623
  return m1 + (m2 - m1) * h * 6 if h * 6 < 1
442
624
  return m2 if h * 2 < 1
443
- return m1 + (m2 - m1) * (2.0/3 - h) * 6 if h * 3 < 2
444
- return m1
625
+ return m1 + (m2 - m1) * (2.0 / 3 - h) * 6 if h * 3 < 2
626
+ m1
445
627
  end
446
628
 
447
629
  def rgb_to_hsl!
@@ -456,20 +638,20 @@ module Sass::Script
456
638
  h =
457
639
  case max
458
640
  when min; 0
459
- when r; 60 * (g-b)/d
460
- when g; 60 * (b-r)/d + 120
461
- when b; 60 * (r-g)/d + 240
641
+ when r; 60 * (g - b) / d
642
+ when g; 60 * (b - r) / d + 120
643
+ when b; 60 * (r - g) / d + 240
462
644
  end
463
645
 
464
- l = (max + min)/2.0
646
+ l = (max + min) / 2.0
465
647
 
466
648
  s =
467
649
  if max == min
468
650
  0
469
651
  elsif l < 0.5
470
- d/(2*l)
652
+ d / (2 * l)
471
653
  else
472
- d/(2 - 2*l)
654
+ d / (2 - 2 * l)
473
655
  end
474
656
 
475
657
  @attrs[:hue] = h % 360
@@ -0,0 +1,55 @@
1
+ module Sass::Script::Value
2
+ # A SassScript object representing a `false` value that came from a call to
3
+ # `index()`. It will print deprecation warnings if it's used with `==`.
4
+ class DeprecatedFalse < Bool
5
+ def self.new(environment)
6
+ obj = allocate
7
+ obj.send(:initialize, environment)
8
+ obj
9
+ end
10
+
11
+ def initialize(environment)
12
+ @value = false
13
+ @global_env = environment.global_env
14
+ if (frame = environment.stack.frames.last)
15
+ @filename = frame.filename
16
+ @line = frame.line
17
+ end
18
+ end
19
+
20
+ def eq(other)
21
+ if other.value == false && !warned?
22
+ self.warned = true
23
+ Sass::Util.sass_warn <<WARNING + @global_env.stack.to_s.gsub(/^/, ' ')
24
+ DEPRECATION WARNING: The return value of index() will change from "false" to
25
+ "null" in future versions of Sass. For compatibility, avoid using "== false" on
26
+ the return value. For example, instead of "@if index(...) == false", just write
27
+ "@if index(...)".
28
+ WARNING
29
+ end
30
+ Bool.new(other.value == false)
31
+ end
32
+
33
+ def neq(other)
34
+ if other.value.nil? && !warned?
35
+ self.warned = true
36
+ Sass::Util.sass_warn <<WARNING + @global_env.stack.to_s.gsub(/^/, ' ')
37
+ DEPRECATION WARNING: The return value of index() will change from "false" to
38
+ "null" in future versions of Sass. For compatibility, avoid using "!= null" on
39
+ the return value.
40
+ WARNING
41
+ end
42
+ Bool.new(other.value != false)
43
+ end
44
+
45
+ private
46
+
47
+ def warned?
48
+ @global_env.deprecated_false_warning_given.include?([@filename, @line])
49
+ end
50
+
51
+ def warned=(value)
52
+ @global_env.deprecated_false_warning_given << [@filename, @line]
53
+ end
54
+ end
55
+ end