sass 3.1.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
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