sass 3.2.7 → 3.3.0.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. data/MIT-LICENSE +2 -2
  2. data/README.md +14 -2
  3. data/Rakefile +25 -1
  4. data/VERSION +1 -1
  5. data/VERSION_DATE +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/lib/sass/cache_stores/base.rb +4 -2
  8. data/lib/sass/cache_stores/chain.rb +2 -1
  9. data/lib/sass/cache_stores/filesystem.rb +2 -6
  10. data/lib/sass/cache_stores/memory.rb +1 -1
  11. data/lib/sass/cache_stores/null.rb +2 -2
  12. data/lib/sass/callbacks.rb +1 -0
  13. data/lib/sass/css.rb +10 -10
  14. data/lib/sass/engine.rb +403 -150
  15. data/lib/sass/environment.rb +136 -57
  16. data/lib/sass/error.rb +7 -7
  17. data/lib/sass/exec.rb +123 -39
  18. data/lib/sass/features.rb +41 -0
  19. data/lib/sass/importers/base.rb +33 -2
  20. data/lib/sass/importers/deprecated_path.rb +45 -0
  21. data/lib/sass/importers/filesystem.rb +25 -14
  22. data/lib/sass/importers.rb +1 -0
  23. data/lib/sass/logger/base.rb +3 -3
  24. data/lib/sass/logger/log_level.rb +4 -6
  25. data/lib/sass/media.rb +19 -19
  26. data/lib/sass/plugin/compiler.rb +141 -101
  27. data/lib/sass/plugin/configuration.rb +18 -22
  28. data/lib/sass/plugin/merb.rb +1 -1
  29. data/lib/sass/plugin/staleness_checker.rb +24 -8
  30. data/lib/sass/plugin.rb +4 -2
  31. data/lib/sass/repl.rb +3 -3
  32. data/lib/sass/script/css_lexer.rb +9 -4
  33. data/lib/sass/script/css_parser.rb +6 -2
  34. data/lib/sass/script/functions.rb +1343 -590
  35. data/lib/sass/script/lexer.rb +84 -52
  36. data/lib/sass/script/parser.rb +217 -97
  37. data/lib/sass/script/tree/funcall.rb +290 -0
  38. data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +34 -13
  39. data/lib/sass/script/tree/list_literal.rb +80 -0
  40. data/lib/sass/script/tree/literal.rb +47 -0
  41. data/lib/sass/script/tree/map_literal.rb +64 -0
  42. data/lib/sass/script/{node.rb → tree/node.rb} +22 -12
  43. data/lib/sass/script/{operation.rb → tree/operation.rb} +17 -25
  44. data/lib/sass/script/tree/selector.rb +30 -0
  45. data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +5 -4
  46. data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +14 -9
  47. data/lib/sass/script/tree/variable.rb +57 -0
  48. data/lib/sass/script/tree.rb +16 -0
  49. data/lib/sass/script/{arg_list.rb → value/arg_list.rb} +4 -24
  50. data/lib/sass/script/value/base.rb +248 -0
  51. data/lib/sass/script/value/bool.rb +36 -0
  52. data/lib/sass/script/{color.rb → value/color.rb} +239 -195
  53. data/lib/sass/script/value/helpers.rb +155 -0
  54. data/lib/sass/script/value/list.rb +119 -0
  55. data/lib/sass/script/value/map.rb +70 -0
  56. data/lib/sass/script/value/null.rb +45 -0
  57. data/lib/sass/script/{number.rb → value/number.rb} +91 -65
  58. data/lib/sass/script/{string.rb → value/string.rb} +9 -11
  59. data/lib/sass/script/value.rb +11 -0
  60. data/lib/sass/script.rb +35 -8
  61. data/lib/sass/scss/css_parser.rb +2 -1
  62. data/lib/sass/scss/parser.rb +338 -170
  63. data/lib/sass/scss/rx.rb +5 -6
  64. data/lib/sass/scss/script_lexer.rb +1 -0
  65. data/lib/sass/scss/script_parser.rb +1 -0
  66. data/lib/sass/scss/static_parser.rb +23 -6
  67. data/lib/sass/selector/abstract_sequence.rb +2 -2
  68. data/lib/sass/selector/comma_sequence.rb +21 -16
  69. data/lib/sass/selector/sequence.rb +60 -34
  70. data/lib/sass/selector/simple.rb +11 -12
  71. data/lib/sass/selector/simple_sequence.rb +55 -33
  72. data/lib/sass/selector.rb +52 -48
  73. data/lib/sass/source/map.rb +211 -0
  74. data/lib/sass/source/position.rb +39 -0
  75. data/lib/sass/source/range.rb +41 -0
  76. data/lib/sass/stack.rb +120 -0
  77. data/lib/sass/supports.rb +12 -13
  78. data/lib/sass/tree/at_root_node.rb +82 -0
  79. data/lib/sass/tree/comment_node.rb +3 -3
  80. data/lib/sass/tree/css_import_node.rb +11 -11
  81. data/lib/sass/tree/debug_node.rb +2 -2
  82. data/lib/sass/tree/directive_node.rb +13 -2
  83. data/lib/sass/tree/each_node.rb +8 -8
  84. data/lib/sass/tree/extend_node.rb +13 -6
  85. data/lib/sass/tree/for_node.rb +4 -4
  86. data/lib/sass/tree/function_node.rb +5 -4
  87. data/lib/sass/tree/if_node.rb +1 -1
  88. data/lib/sass/tree/import_node.rb +4 -5
  89. data/lib/sass/tree/media_node.rb +4 -14
  90. data/lib/sass/tree/mixin_def_node.rb +4 -4
  91. data/lib/sass/tree/mixin_node.rb +21 -8
  92. data/lib/sass/tree/node.rb +29 -12
  93. data/lib/sass/tree/prop_node.rb +38 -18
  94. data/lib/sass/tree/return_node.rb +3 -2
  95. data/lib/sass/tree/root_node.rb +19 -3
  96. data/lib/sass/tree/rule_node.rb +25 -17
  97. data/lib/sass/tree/supports_node.rb +0 -13
  98. data/lib/sass/tree/trace_node.rb +2 -1
  99. data/lib/sass/tree/variable_node.rb +9 -3
  100. data/lib/sass/tree/visitors/base.rb +6 -6
  101. data/lib/sass/tree/visitors/check_nesting.rb +12 -9
  102. data/lib/sass/tree/visitors/convert.rb +63 -38
  103. data/lib/sass/tree/visitors/cssize.rb +63 -23
  104. data/lib/sass/tree/visitors/deep_copy.rb +6 -5
  105. data/lib/sass/tree/visitors/extend.rb +7 -7
  106. data/lib/sass/tree/visitors/perform.rb +256 -151
  107. data/lib/sass/tree/visitors/set_options.rb +6 -6
  108. data/lib/sass/tree/visitors/to_css.rb +231 -81
  109. data/lib/sass/tree/warn_node.rb +2 -2
  110. data/lib/sass/tree/while_node.rb +2 -2
  111. data/lib/sass/util/multibyte_string_scanner.rb +2 -0
  112. data/lib/sass/util/normalized_map.rb +65 -0
  113. data/lib/sass/util/ordered_hash.rb +188 -0
  114. data/lib/sass/util/subset_map.rb +3 -2
  115. data/lib/sass/util/test.rb +9 -0
  116. data/lib/sass/util.rb +220 -34
  117. data/lib/sass/version.rb +9 -9
  118. data/lib/sass.rb +14 -7
  119. data/test/sass/compiler_test.rb +213 -0
  120. data/test/sass/conversion_test.rb +235 -9
  121. data/test/sass/engine_test.rb +230 -60
  122. data/test/sass/exec_test.rb +86 -0
  123. data/test/sass/extend_test.rb +215 -147
  124. data/test/sass/functions_test.rb +584 -99
  125. data/test/sass/importer_test.rb +165 -17
  126. data/test/sass/plugin_test.rb +19 -13
  127. data/test/sass/script_conversion_test.rb +40 -0
  128. data/test/sass/script_test.rb +231 -21
  129. data/test/sass/scss/css_test.rb +14 -5
  130. data/test/sass/scss/scss_test.rb +1266 -66
  131. data/test/sass/source_map_test.rb +879 -0
  132. data/test/sass/templates/bork5.sass +3 -0
  133. data/test/sass/util/normalized_map_test.rb +30 -0
  134. data/test/sass/util_test.rb +90 -0
  135. data/test/sass/value_helpers_test.rb +181 -0
  136. data/test/test_helper.rb +7 -2
  137. metadata +316 -291
  138. data/lib/sass/script/bool.rb +0 -18
  139. data/lib/sass/script/funcall.rb +0 -231
  140. data/lib/sass/script/list.rb +0 -84
  141. data/lib/sass/script/literal.rb +0 -239
  142. data/lib/sass/script/null.rb +0 -34
  143. data/lib/sass/script/variable.rb +0 -58
  144. data/test/Gemfile +0 -3
  145. data/vendor/listen/CHANGELOG.md +0 -221
  146. data/vendor/listen/CONTRIBUTING.md +0 -38
  147. data/vendor/listen/Gemfile +0 -30
  148. data/vendor/listen/Guardfile +0 -8
  149. data/vendor/listen/LICENSE +0 -20
  150. data/vendor/listen/README.md +0 -315
  151. data/vendor/listen/Rakefile +0 -47
  152. data/vendor/listen/Vagrantfile +0 -96
  153. data/vendor/listen/lib/listen/adapter.rb +0 -214
  154. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
  155. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -85
  156. data/vendor/listen/lib/listen/adapters/linux.rb +0 -113
  157. data/vendor/listen/lib/listen/adapters/polling.rb +0 -67
  158. data/vendor/listen/lib/listen/adapters/windows.rb +0 -87
  159. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  160. data/vendor/listen/lib/listen/directory_record.rb +0 -371
  161. data/vendor/listen/lib/listen/listener.rb +0 -225
  162. data/vendor/listen/lib/listen/multi_listener.rb +0 -143
  163. data/vendor/listen/lib/listen/turnstile.rb +0 -28
  164. data/vendor/listen/lib/listen/version.rb +0 -3
  165. data/vendor/listen/lib/listen.rb +0 -40
  166. data/vendor/listen/listen.gemspec +0 -22
  167. data/vendor/listen/spec/listen/adapter_spec.rb +0 -183
  168. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  169. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  170. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  171. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  172. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  173. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
  174. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1225
  175. data/vendor/listen/spec/listen/listener_spec.rb +0 -169
  176. data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
  177. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  178. data/vendor/listen/spec/listen_spec.rb +0 -73
  179. data/vendor/listen/spec/spec_helper.rb +0 -21
  180. data/vendor/listen/spec/support/adapter_helper.rb +0 -629
  181. data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
  182. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  183. data/vendor/listen/spec/support/listeners_helper.rb +0 -156
  184. data/vendor/listen/spec/support/platform_helper.rb +0 -15
@@ -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,165 +13,171 @@ 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
16
+ class Color < Base
19
17
  class << self; include Sass::Util; end
20
18
 
21
19
  # A hash from color names to `[red, green, blue]` value arrays.
22
- COLOR_NAMES = map_vals({
23
- 'aliceblue' => 0xf0f8ff,
24
- 'antiquewhite' => 0xfaebd7,
25
- 'aqua' => 0x00ffff,
26
- 'aquamarine' => 0x7fffd4,
27
- 'azure' => 0xf0ffff,
28
- 'beige' => 0xf5f5dc,
29
- 'bisque' => 0xffe4c4,
30
- 'black' => 0x000000,
31
- 'blanchedalmond' => 0xffebcd,
32
- 'blue' => 0x0000ff,
33
- 'blueviolet' => 0x8a2be2,
34
- 'brown' => 0xa52a2a,
35
- 'burlywood' => 0xdeb887,
36
- 'cadetblue' => 0x5f9ea0,
37
- 'chartreuse' => 0x7fff00,
38
- 'chocolate' => 0xd2691e,
39
- 'coral' => 0xff7f50,
40
- 'cornflowerblue' => 0x6495ed,
41
- 'cornsilk' => 0xfff8dc,
42
- 'crimson' => 0xdc143c,
43
- 'cyan' => 0x00ffff,
44
- 'darkblue' => 0x00008b,
45
- 'darkcyan' => 0x008b8b,
46
- 'darkgoldenrod' => 0xb8860b,
47
- 'darkgray' => 0xa9a9a9,
48
- 'darkgrey' => 0xa9a9a9,
49
- 'darkgreen' => 0x006400,
50
- 'darkkhaki' => 0xbdb76b,
51
- 'darkmagenta' => 0x8b008b,
52
- 'darkolivegreen' => 0x556b2f,
53
- 'darkorange' => 0xff8c00,
54
- 'darkorchid' => 0x9932cc,
55
- 'darkred' => 0x8b0000,
56
- 'darksalmon' => 0xe9967a,
57
- 'darkseagreen' => 0x8fbc8f,
58
- 'darkslateblue' => 0x483d8b,
59
- 'darkslategray' => 0x2f4f4f,
60
- 'darkslategrey' => 0x2f4f4f,
61
- 'darkturquoise' => 0x00ced1,
62
- 'darkviolet' => 0x9400d3,
63
- 'deeppink' => 0xff1493,
64
- 'deepskyblue' => 0x00bfff,
65
- 'dimgray' => 0x696969,
66
- 'dimgrey' => 0x696969,
67
- 'dodgerblue' => 0x1e90ff,
68
- 'firebrick' => 0xb22222,
69
- 'floralwhite' => 0xfffaf0,
70
- 'forestgreen' => 0x228b22,
71
- 'fuchsia' => 0xff00ff,
72
- 'gainsboro' => 0xdcdcdc,
73
- 'ghostwhite' => 0xf8f8ff,
74
- 'gold' => 0xffd700,
75
- 'goldenrod' => 0xdaa520,
76
- 'gray' => 0x808080,
77
- 'green' => 0x008000,
78
- 'greenyellow' => 0xadff2f,
79
- 'honeydew' => 0xf0fff0,
80
- 'hotpink' => 0xff69b4,
81
- 'indianred' => 0xcd5c5c,
82
- 'indigo' => 0x4b0082,
83
- 'ivory' => 0xfffff0,
84
- 'khaki' => 0xf0e68c,
85
- 'lavender' => 0xe6e6fa,
86
- 'lavenderblush' => 0xfff0f5,
87
- 'lawngreen' => 0x7cfc00,
88
- 'lemonchiffon' => 0xfffacd,
89
- 'lightblue' => 0xadd8e6,
90
- 'lightcoral' => 0xf08080,
91
- 'lightcyan' => 0xe0ffff,
92
- 'lightgoldenrodyellow' => 0xfafad2,
93
- 'lightgreen' => 0x90ee90,
94
- 'lightgray' => 0xd3d3d3,
95
- 'lightgrey' => 0xd3d3d3,
96
- 'lightpink' => 0xffb6c1,
97
- 'lightsalmon' => 0xffa07a,
98
- 'lightseagreen' => 0x20b2aa,
99
- 'lightskyblue' => 0x87cefa,
100
- 'lightslategray' => 0x778899,
101
- 'lightslategrey' => 0x778899,
102
- 'lightsteelblue' => 0xb0c4de,
103
- 'lightyellow' => 0xffffe0,
104
- 'lime' => 0x00ff00,
105
- 'limegreen' => 0x32cd32,
106
- 'linen' => 0xfaf0e6,
107
- 'magenta' => 0xff00ff,
108
- 'maroon' => 0x800000,
109
- 'mediumaquamarine' => 0x66cdaa,
110
- 'mediumblue' => 0x0000cd,
111
- 'mediumorchid' => 0xba55d3,
112
- 'mediumpurple' => 0x9370db,
113
- 'mediumseagreen' => 0x3cb371,
114
- 'mediumslateblue' => 0x7b68ee,
115
- 'mediumspringgreen' => 0x00fa9a,
116
- 'mediumturquoise' => 0x48d1cc,
117
- 'mediumvioletred' => 0xc71585,
118
- 'midnightblue' => 0x191970,
119
- 'mintcream' => 0xf5fffa,
120
- 'mistyrose' => 0xffe4e1,
121
- 'moccasin' => 0xffe4b5,
122
- 'navajowhite' => 0xffdead,
123
- 'navy' => 0x000080,
124
- 'oldlace' => 0xfdf5e6,
125
- 'olive' => 0x808000,
126
- 'olivedrab' => 0x6b8e23,
127
- 'orange' => 0xffa500,
128
- 'orangered' => 0xff4500,
129
- 'orchid' => 0xda70d6,
130
- 'palegoldenrod' => 0xeee8aa,
131
- 'palegreen' => 0x98fb98,
132
- 'paleturquoise' => 0xafeeee,
133
- 'palevioletred' => 0xdb7093,
134
- 'papayawhip' => 0xffefd5,
135
- 'peachpuff' => 0xffdab9,
136
- 'peru' => 0xcd853f,
137
- 'pink' => 0xffc0cb,
138
- 'plum' => 0xdda0dd,
139
- 'powderblue' => 0xb0e0e6,
140
- 'purple' => 0x800080,
141
- 'red' => 0xff0000,
142
- 'rosybrown' => 0xbc8f8f,
143
- 'royalblue' => 0x4169e1,
144
- 'saddlebrown' => 0x8b4513,
145
- 'salmon' => 0xfa8072,
146
- 'sandybrown' => 0xf4a460,
147
- 'seagreen' => 0x2e8b57,
148
- 'seashell' => 0xfff5ee,
149
- 'sienna' => 0xa0522d,
150
- 'silver' => 0xc0c0c0,
151
- 'skyblue' => 0x87ceeb,
152
- 'slateblue' => 0x6a5acd,
153
- 'slategray' => 0x708090,
154
- 'slategrey' => 0x708090,
155
- 'snow' => 0xfffafa,
156
- 'springgreen' => 0x00ff7f,
157
- 'steelblue' => 0x4682b4,
158
- 'tan' => 0xd2b48c,
159
- 'teal' => 0x008080,
160
- 'thistle' => 0xd8bfd8,
161
- 'tomato' => 0xff6347,
162
- 'turquoise' => 0x40e0d0,
163
- 'violet' => 0xee82ee,
164
- 'wheat' => 0xf5deb3,
165
- 'white' => 0xffffff,
166
- 'whitesmoke' => 0xf5f5f5,
167
- 'yellow' => 0xffff00,
168
- 'yellowgreen' => 0x9acd32
169
- }) {|color| (0..2).map {|n| color >> (n << 3) & 0xff}.reverse}
170
-
171
- # A hash from `[red, green, blue]` value arrays to color names.
20
+ COLOR_NAMES = map_vals(
21
+ 'aliceblue' => 0xF0F8FFFF,
22
+ 'antiquewhite' => 0xFAEBD7FF,
23
+ 'aqua' => 0x00FFFFFF,
24
+ 'aquamarine' => 0x7FFFD4FF,
25
+ 'azure' => 0xF0FFFFFF,
26
+ 'beige' => 0xF5F5DCFF,
27
+ 'bisque' => 0xFFE4C4FF,
28
+ 'black' => 0x000000FF,
29
+ 'blanchedalmond' => 0xFFEBCDFF,
30
+ 'blue' => 0x0000FFFF,
31
+ 'blueviolet' => 0x8A2BE2FF,
32
+ 'brown' => 0xA52A2AFF,
33
+ 'burlywood' => 0xDEB887FF,
34
+ 'cadetblue' => 0x5F9EA0FF,
35
+ 'chartreuse' => 0x7FFF00FF,
36
+ 'chocolate' => 0xD2691EFF,
37
+ 'coral' => 0xFF7F50FF,
38
+ 'cornflowerblue' => 0x6495EDFF,
39
+ 'cornsilk' => 0xFFF8DCFF,
40
+ 'crimson' => 0xDC143CFF,
41
+ 'cyan' => 0x00FFFFFF,
42
+ 'darkblue' => 0x00008BFF,
43
+ 'darkcyan' => 0x008B8BFF,
44
+ 'darkgoldenrod' => 0xB8860BFF,
45
+ 'darkgray' => 0xA9A9A9FF,
46
+ 'darkgrey' => 0xA9A9A9FF,
47
+ 'darkgreen' => 0x006400FF,
48
+ 'darkkhaki' => 0xBDB76BFF,
49
+ 'darkmagenta' => 0x8B008BFF,
50
+ 'darkolivegreen' => 0x556B2FFF,
51
+ 'darkorange' => 0xFF8C00FF,
52
+ 'darkorchid' => 0x9932CCFF,
53
+ 'darkred' => 0x8B0000FF,
54
+ 'darksalmon' => 0xE9967AFF,
55
+ 'darkseagreen' => 0x8FBC8FFF,
56
+ 'darkslateblue' => 0x483D8BFF,
57
+ 'darkslategray' => 0x2F4F4FFF,
58
+ 'darkslategrey' => 0x2F4F4FFF,
59
+ 'darkturquoise' => 0x00CED1FF,
60
+ 'darkviolet' => 0x9400D3FF,
61
+ 'deeppink' => 0xFF1493FF,
62
+ 'deepskyblue' => 0x00BFFFFF,
63
+ 'dimgray' => 0x696969FF,
64
+ 'dimgrey' => 0x696969FF,
65
+ 'dodgerblue' => 0x1E90FFFF,
66
+ 'firebrick' => 0xB22222FF,
67
+ 'floralwhite' => 0xFFFAF0FF,
68
+ 'forestgreen' => 0x228B22FF,
69
+ 'fuchsia' => 0xFF00FFFF,
70
+ 'gainsboro' => 0xDCDCDCFF,
71
+ 'ghostwhite' => 0xF8F8FFFF,
72
+ 'gold' => 0xFFD700FF,
73
+ 'goldenrod' => 0xDAA520FF,
74
+ 'gray' => 0x808080FF,
75
+ 'grey' => 0x808080FF,
76
+ 'green' => 0x008000FF,
77
+ 'greenyellow' => 0xADFF2FFF,
78
+ 'honeydew' => 0xF0FFF0FF,
79
+ 'hotpink' => 0xFF69B4FF,
80
+ 'indianred' => 0xCD5C5CFF,
81
+ 'indigo' => 0x4B0082FF,
82
+ 'ivory' => 0xFFFFF0FF,
83
+ 'khaki' => 0xF0E68CFF,
84
+ 'lavender' => 0xE6E6FAFF,
85
+ 'lavenderblush' => 0xFFF0F5FF,
86
+ 'lawngreen' => 0x7CFC00FF,
87
+ 'lemonchiffon' => 0xFFFACDFF,
88
+ 'lightblue' => 0xADD8E6FF,
89
+ 'lightcoral' => 0xF08080FF,
90
+ 'lightcyan' => 0xE0FFFFFF,
91
+ 'lightgoldenrodyellow' => 0xFAFAD2FF,
92
+ 'lightgreen' => 0x90EE90FF,
93
+ 'lightgray' => 0xD3D3D3FF,
94
+ 'lightgrey' => 0xD3D3D3FF,
95
+ 'lightpink' => 0xFFB6C1FF,
96
+ 'lightsalmon' => 0xFFA07AFF,
97
+ 'lightseagreen' => 0x20B2AAFF,
98
+ 'lightskyblue' => 0x87CEFAFF,
99
+ 'lightslategray' => 0x778899FF,
100
+ 'lightslategrey' => 0x778899FF,
101
+ 'lightsteelblue' => 0xB0C4DEFF,
102
+ 'lightyellow' => 0xFFFFE0FF,
103
+ 'lime' => 0x00FF00FF,
104
+ 'limegreen' => 0x32CD32FF,
105
+ 'linen' => 0xFAF0E6FF,
106
+ 'magenta' => 0xFF00FFFF,
107
+ 'maroon' => 0x800000FF,
108
+ 'mediumaquamarine' => 0x66CDAAFF,
109
+ 'mediumblue' => 0x0000CDFF,
110
+ 'mediumorchid' => 0xBA55D3FF,
111
+ 'mediumpurple' => 0x9370DBFF,
112
+ 'mediumseagreen' => 0x3CB371FF,
113
+ 'mediumslateblue' => 0x7B68EEFF,
114
+ 'mediumspringgreen' => 0x00FA9AFF,
115
+ 'mediumturquoise' => 0x48D1CCFF,
116
+ 'mediumvioletred' => 0xC71585FF,
117
+ 'midnightblue' => 0x191970FF,
118
+ 'mintcream' => 0xF5FFFAFF,
119
+ 'mistyrose' => 0xFFE4E1FF,
120
+ 'moccasin' => 0xFFE4B5FF,
121
+ 'navajowhite' => 0xFFDEADFF,
122
+ 'navy' => 0x000080FF,
123
+ 'oldlace' => 0xFDF5E6FF,
124
+ 'olive' => 0x808000FF,
125
+ 'olivedrab' => 0x6B8E23FF,
126
+ 'orange' => 0xFFA500FF,
127
+ 'orangered' => 0xFF4500FF,
128
+ 'orchid' => 0xDA70D6FF,
129
+ 'palegoldenrod' => 0xEEE8AAFF,
130
+ 'palegreen' => 0x98FB98FF,
131
+ 'paleturquoise' => 0xAFEEEEFF,
132
+ 'palevioletred' => 0xDB7093FF,
133
+ 'papayawhip' => 0xFFEFD5FF,
134
+ 'peachpuff' => 0xFFDAB9FF,
135
+ 'peru' => 0xCD853FFF,
136
+ 'pink' => 0xFFC0CBFF,
137
+ 'plum' => 0xDDA0DDFF,
138
+ 'powderblue' => 0xB0E0E6FF,
139
+ 'purple' => 0x800080FF,
140
+ 'red' => 0xFF0000FF,
141
+ 'rosybrown' => 0xBC8F8FFF,
142
+ 'royalblue' => 0x4169E1FF,
143
+ 'saddlebrown' => 0x8B4513FF,
144
+ 'salmon' => 0xFA8072FF,
145
+ 'sandybrown' => 0xF4A460FF,
146
+ 'seagreen' => 0x2E8B57FF,
147
+ 'seashell' => 0xFFF5EEFF,
148
+ 'sienna' => 0xA0522DFF,
149
+ 'silver' => 0xC0C0C0FF,
150
+ 'skyblue' => 0x87CEEBFF,
151
+ 'slateblue' => 0x6A5ACDFF,
152
+ 'slategray' => 0x708090FF,
153
+ 'slategrey' => 0x708090FF,
154
+ 'snow' => 0xFFFAFAFF,
155
+ 'springgreen' => 0x00FF7FFF,
156
+ 'steelblue' => 0x4682B4FF,
157
+ 'tan' => 0xD2B48CFF,
158
+ 'teal' => 0x008080FF,
159
+ 'thistle' => 0xD8BFD8FF,
160
+ 'tomato' => 0xFF6347FF,
161
+ 'transparent' => 0x00000000,
162
+ 'turquoise' => 0x40E0D0FF,
163
+ 'violet' => 0xEE82EEFF,
164
+ 'wheat' => 0xF5DEB3FF,
165
+ 'white' => 0xFFFFFFFF,
166
+ 'whitesmoke' => 0xF5F5F5FF,
167
+ 'yellow' => 0xFFFF00FF,
168
+ 'yellowgreen' => 0x9ACD32FF
169
+ ) do |color|
170
+ rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse
171
+ rgba[-1] = rgba[-1] / 255.0
172
+ rgba
173
+ end
174
+
175
+ # A hash from `[red, green, blue, alpha]` value arrays to color names.
172
176
  COLOR_NAMES_REVERSE = map_hash(hash_to_a(COLOR_NAMES)) {|k, v| [v, k]}
173
177
 
174
178
  # Constructs an RGB or HSL color object,
175
179
  # optionally with an alpha channel.
176
- #
180
+ #
177
181
  # The RGB values must be between 0 and 255.
178
182
  # The saturation and lightness values must be between 0 and 100.
179
183
  # The alpha value must be between 0 and 1.
@@ -244,6 +248,24 @@ module Sass::Script
244
248
  @attrs[:alpha] = Sass::Util.check_range("Alpha channel", 0..1, @attrs[:alpha])
245
249
  end
246
250
 
251
+ # Create a new color from a valid CSS hex string.
252
+ #
253
+ # The leading hash is optional.
254
+ #
255
+ # @return [Color]
256
+ def self.from_hex(hex_string, alpha = nil)
257
+ unless hex_string =~ /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i ||
258
+ hex_string =~ /^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i
259
+ raise ArgumentError.new("#{hex_string.inspect} is not a valid hex color.")
260
+ end
261
+ red = $1.ljust(2, $1).to_i(16)
262
+ green = $2.ljust(2, $2).to_i(16)
263
+ blue = $3.ljust(2, $3).to_i(16)
264
+ attrs = {:red => red, :green => green, :blue => blue}
265
+ attrs[:alpha] = alpha if alpha
266
+ new(attrs)
267
+ end
268
+
247
269
  # The red component of the color.
248
270
  #
249
271
  # @return [Fixnum]
@@ -297,7 +319,7 @@ module Sass::Script
297
319
  #
298
320
  # @return [Fixnum]
299
321
  def alpha
300
- @attrs[:alpha]
322
+ @attrs[:alpha].to_f
301
323
  end
302
324
 
303
325
  # Returns whether this color object is translucent;
@@ -316,6 +338,14 @@ module Sass::Script
316
338
  [red, green, blue].freeze
317
339
  end
318
340
 
341
+ # Returns the red, green, blue, and alpha components of the color.
342
+ #
343
+ # @return [Array<Fixnum>] A frozen four-element array of the red, green,
344
+ # blue, and alpha values (respectively) of the color
345
+ def rgba
346
+ [red, green, blue, alpha].freeze
347
+ end
348
+
319
349
  # Returns the hue, saturation, and lightness components of the color.
320
350
  #
321
351
  # @return [Array<Fixnum>] A frozen three-element array of the
@@ -324,18 +354,30 @@ module Sass::Script
324
354
  [hue, saturation, lightness].freeze
325
355
  end
326
356
 
357
+ # Returns the hue, saturation, lightness, and alpha components of the color.
358
+ #
359
+ # @return [Array<Fixnum>] A frozen four-element array of the hue,
360
+ # saturation, lightness, and alpha values (respectively) of the color
361
+ def hsla
362
+ [hue, saturation, lightness].freeze
363
+ end
364
+
327
365
  # The SassScript `==` operation.
328
- # **Note that this returns a {Sass::Script::Bool} object,
366
+ # **Note that this returns a {Sass::Script::Value::Bool} object,
329
367
  # not a Ruby boolean**.
330
368
  #
331
- # @param other [Literal] The right-hand side of the operator
332
- # @return [Bool] True if this literal is the same as the other,
369
+ # @param other [Value] The right-hand side of the operator
370
+ # @return [Bool] True if this value is the same as the other,
333
371
  # false otherwise
334
372
  def eq(other)
335
- Sass::Script::Bool.new(
373
+ Sass::Script::Value::Bool.new(
336
374
  other.is_a?(Color) && rgb == other.rgb && alpha == other.alpha)
337
375
  end
338
376
 
377
+ def hash
378
+ [rgb, alpha].hash
379
+ end
380
+
339
381
  # Returns a copy of this color with one or more channels changed.
340
382
  # RGB or HSL colors may be changed, but not both at once.
341
383
  #
@@ -386,14 +428,14 @@ module Sass::Script
386
428
  # {Color}
387
429
  # : Adds each of the RGB color channels together.
388
430
  #
389
- # {Literal}
390
- # : See {Literal#plus}.
431
+ # {Value}
432
+ # : See {Value::Base#plus}.
391
433
  #
392
- # @param other [Literal] The right-hand side of the operator
434
+ # @param other [Value] The right-hand side of the operator
393
435
  # @return [Color] The resulting color
394
436
  # @raise [Sass::SyntaxError] if `other` is a number with units
395
437
  def plus(other)
396
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
438
+ if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
397
439
  piecewise(other, :+)
398
440
  else
399
441
  super
@@ -409,14 +451,14 @@ module Sass::Script
409
451
  # {Color}
410
452
  # : Subtracts each of the other color's RGB color channels from this color's.
411
453
  #
412
- # {Literal}
413
- # : See {Literal#minus}.
454
+ # {Value}
455
+ # : See {Value::Base#minus}.
414
456
  #
415
- # @param other [Literal] The right-hand side of the operator
457
+ # @param other [Value] The right-hand side of the operator
416
458
  # @return [Color] The resulting color
417
459
  # @raise [Sass::SyntaxError] if `other` is a number with units
418
460
  def minus(other)
419
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
461
+ if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
420
462
  piecewise(other, :-)
421
463
  else
422
464
  super
@@ -436,7 +478,7 @@ module Sass::Script
436
478
  # @return [Color] The resulting color
437
479
  # @raise [Sass::SyntaxError] if `other` is a number with units
438
480
  def times(other)
439
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
481
+ if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
440
482
  piecewise(other, :*)
441
483
  else
442
484
  raise NoMethodError.new(nil, :times)
@@ -452,14 +494,15 @@ module Sass::Script
452
494
  # {Color}
453
495
  # : Divides each of this color's RGB color channels by the other color's.
454
496
  #
455
- # {Literal}
456
- # : See {Literal#div}.
497
+ # {Value}
498
+ # : See {Value::Base#div}.
457
499
  #
458
- # @param other [Literal] The right-hand side of the operator
500
+ # @param other [Value] The right-hand side of the operator
459
501
  # @return [Color] The resulting color
460
502
  # @raise [Sass::SyntaxError] if `other` is a number with units
461
503
  def div(other)
462
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
504
+ if other.is_a?(Sass::Script::Value::Number) ||
505
+ other.is_a?(Sass::Script::Value::Color)
463
506
  piecewise(other, :/)
464
507
  else
465
508
  super
@@ -479,7 +522,8 @@ module Sass::Script
479
522
  # @return [Color] The resulting color
480
523
  # @raise [Sass::SyntaxError] if `other` is a number with units
481
524
  def mod(other)
482
- if other.is_a?(Sass::Script::Number) || other.is_a?(Sass::Script::Color)
525
+ if other.is_a?(Sass::Script::Value::Number) ||
526
+ other.is_a?(Sass::Script::Value::Color)
483
527
  piecewise(other, :%)
484
528
  else
485
529
  raise NoMethodError.new(nil, :mod)
@@ -492,10 +536,9 @@ module Sass::Script
492
536
  #
493
537
  # @return [String] The string representation
494
538
  def to_s(opts = {})
495
- return rgba_str if alpha?
496
539
  return smallest if options[:style] == :compressed
497
- return COLOR_NAMES_REVERSE[rgb] if COLOR_NAMES_REVERSE[rgb]
498
- hex_str
540
+ return COLOR_NAMES_REVERSE[rgba] if COLOR_NAMES_REVERSE[rgba]
541
+ alpha? ? rgba_str : hex_str
499
542
  end
500
543
  alias_method :to_sass, :to_s
501
544
 
@@ -509,10 +552,10 @@ module Sass::Script
509
552
  private
510
553
 
511
554
  def smallest
512
- small_hex_str = hex_str.gsub(/^#(.)\1(.)\2(.)\3$/, '#\1\2\3')
513
- return small_hex_str unless (color = COLOR_NAMES_REVERSE[rgb]) &&
514
- color.size <= small_hex_str.size
515
- return color
555
+ small_explicit_str = alpha? ? rgba_str : hex_str.gsub(/^#(.)\1(.)\2(.)\3$/, '#\1\2\3')
556
+ return small_explicit_str unless (color = COLOR_NAMES_REVERSE[rgba]) &&
557
+ color.size <= small_explicit_str.size
558
+ color
516
559
  end
517
560
 
518
561
  def rgba_str
@@ -521,20 +564,21 @@ module Sass::Script
521
564
  end
522
565
 
523
566
  def hex_str
524
- red, green, blue = rgb.map { |num| num.to_s(16).rjust(2, '0') }
567
+ red, green, blue = rgb.map {|num| num.to_s(16).rjust(2, '0')}
525
568
  "##{red}#{green}#{blue}"
526
569
  end
527
570
 
528
571
  def piecewise(other, operation)
529
572
  other_num = other.is_a? Number
530
573
  if other_num && !other.unitless?
531
- raise Sass::SyntaxError.new("Cannot add a number with units (#{other}) to a color (#{self}).")
574
+ raise Sass::SyntaxError.new(
575
+ "Cannot add a number with units (#{other}) to a color (#{self}).")
532
576
  end
533
577
 
534
578
  result = []
535
- for i in (0...3)
579
+ (0...3).each do |i|
536
580
  res = rgb[i].send(operation, other_num ? other.value : other.rgb[i])
537
- result[i] = [ [res, 255].min, 0 ].max
581
+ result[i] = [[res, 255].min, 0].max
538
582
  end
539
583
 
540
584
  if !other_num && other.alpha != alpha
@@ -555,9 +599,9 @@ module Sass::Script
555
599
  m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s
556
600
  m1 = l * 2 - m2
557
601
  @attrs[:red], @attrs[:green], @attrs[:blue] = [
558
- hue_to_rgb(m1, m2, h + 1.0/3),
602
+ hue_to_rgb(m1, m2, h + 1.0 / 3),
559
603
  hue_to_rgb(m1, m2, h),
560
- hue_to_rgb(m1, m2, h - 1.0/3)
604
+ hue_to_rgb(m1, m2, h - 1.0 / 3)
561
605
  ].map {|c| (c * 0xff).round}
562
606
  end
563
607
 
@@ -566,8 +610,8 @@ module Sass::Script
566
610
  h -= 1 if h > 1
567
611
  return m1 + (m2 - m1) * h * 6 if h * 6 < 1
568
612
  return m2 if h * 2 < 1
569
- return m1 + (m2 - m1) * (2.0/3 - h) * 6 if h * 3 < 2
570
- return m1
613
+ return m1 + (m2 - m1) * (2.0 / 3 - h) * 6 if h * 3 < 2
614
+ m1
571
615
  end
572
616
 
573
617
  def rgb_to_hsl!
@@ -582,20 +626,20 @@ module Sass::Script
582
626
  h =
583
627
  case max
584
628
  when min; 0
585
- when r; 60 * (g-b)/d
586
- when g; 60 * (b-r)/d + 120
587
- when b; 60 * (r-g)/d + 240
629
+ when r; 60 * (g - b) / d
630
+ when g; 60 * (b - r) / d + 120
631
+ when b; 60 * (r - g) / d + 240
588
632
  end
589
633
 
590
- l = (max + min)/2.0
634
+ l = (max + min) / 2.0
591
635
 
592
636
  s =
593
637
  if max == min
594
638
  0
595
639
  elsif l < 0.5
596
- d/(2*l)
640
+ d / (2 * l)
597
641
  else
598
- d/(2 - 2*l)
642
+ d / (2 - 2 * l)
599
643
  end
600
644
 
601
645
  @attrs[:hue] = h % 360