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.
- checksums.yaml +7 -0
- data/CONTRIBUTING +1 -1
- data/MIT-LICENSE +2 -2
- data/README.md +29 -17
- data/Rakefile +43 -9
- data/VERSION +1 -1
- data/VERSION_DATE +1 -0
- data/VERSION_NAME +1 -1
- data/bin/sass +6 -1
- data/bin/sass-convert +6 -1
- data/bin/scss +6 -1
- data/ext/mkrf_conf.rb +27 -0
- data/lib/sass/cache_stores/base.rb +7 -3
- data/lib/sass/cache_stores/chain.rb +3 -2
- data/lib/sass/cache_stores/filesystem.rb +5 -7
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +2 -1
- data/lib/sass/css.rb +168 -53
- data/lib/sass/engine.rb +502 -174
- data/lib/sass/environment.rb +151 -111
- data/lib/sass/error.rb +7 -7
- data/lib/sass/exec.rb +176 -60
- data/lib/sass/features.rb +40 -0
- data/lib/sass/importers/base.rb +46 -7
- data/lib/sass/importers/deprecated_path.rb +51 -0
- data/lib/sass/importers/filesystem.rb +113 -30
- data/lib/sass/importers.rb +1 -0
- data/lib/sass/logger/base.rb +30 -0
- data/lib/sass/logger/log_level.rb +45 -0
- data/lib/sass/logger.rb +12 -0
- data/lib/sass/media.rb +213 -0
- data/lib/sass/plugin/compiler.rb +194 -104
- data/lib/sass/plugin/configuration.rb +18 -25
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +37 -11
- data/lib/sass/plugin.rb +10 -13
- data/lib/sass/railtie.rb +2 -1
- data/lib/sass/repl.rb +5 -6
- data/lib/sass/script/css_lexer.rb +8 -4
- data/lib/sass/script/css_parser.rb +5 -2
- data/lib/sass/script/functions.rb +1547 -618
- data/lib/sass/script/lexer.rb +122 -72
- data/lib/sass/script/parser.rb +304 -135
- data/lib/sass/script/tree/funcall.rb +306 -0
- data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +43 -13
- data/lib/sass/script/tree/list_literal.rb +77 -0
- data/lib/sass/script/tree/literal.rb +45 -0
- data/lib/sass/script/tree/map_literal.rb +64 -0
- data/lib/sass/script/{node.rb → tree/node.rb} +30 -12
- data/lib/sass/script/{operation.rb → tree/operation.rb} +33 -21
- data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +14 -4
- data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +21 -9
- data/lib/sass/script/tree/variable.rb +57 -0
- data/lib/sass/script/tree.rb +15 -0
- data/lib/sass/script/value/arg_list.rb +36 -0
- data/lib/sass/script/value/base.rb +238 -0
- data/lib/sass/script/value/bool.rb +40 -0
- data/lib/sass/script/{color.rb → value/color.rb} +256 -74
- data/lib/sass/script/value/deprecated_false.rb +55 -0
- data/lib/sass/script/value/helpers.rb +155 -0
- data/lib/sass/script/value/list.rb +128 -0
- data/lib/sass/script/value/map.rb +70 -0
- data/lib/sass/script/value/null.rb +49 -0
- data/lib/sass/script/{number.rb → value/number.rb} +115 -62
- data/lib/sass/script/{string.rb → value/string.rb} +9 -11
- data/lib/sass/script/value.rb +12 -0
- data/lib/sass/script.rb +35 -9
- data/lib/sass/scss/css_parser.rb +2 -12
- data/lib/sass/scss/parser.rb +657 -230
- data/lib/sass/scss/rx.rb +17 -12
- data/lib/sass/scss/static_parser.rb +37 -6
- data/lib/sass/scss.rb +0 -1
- data/lib/sass/selector/abstract_sequence.rb +35 -3
- data/lib/sass/selector/comma_sequence.rb +29 -14
- data/lib/sass/selector/sequence.rb +371 -74
- data/lib/sass/selector/simple.rb +28 -13
- data/lib/sass/selector/simple_sequence.rb +163 -36
- data/lib/sass/selector.rb +138 -36
- data/lib/sass/shared.rb +3 -5
- data/lib/sass/source/map.rb +196 -0
- data/lib/sass/source/position.rb +39 -0
- data/lib/sass/source/range.rb +41 -0
- data/lib/sass/stack.rb +126 -0
- data/lib/sass/supports.rb +228 -0
- data/lib/sass/tree/at_root_node.rb +82 -0
- data/lib/sass/tree/comment_node.rb +34 -29
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/css_import_node.rb +60 -0
- data/lib/sass/tree/debug_node.rb +3 -3
- data/lib/sass/tree/directive_node.rb +33 -3
- data/lib/sass/tree/each_node.rb +9 -9
- data/lib/sass/tree/extend_node.rb +20 -6
- data/lib/sass/tree/for_node.rb +6 -6
- data/lib/sass/tree/function_node.rb +12 -4
- data/lib/sass/tree/if_node.rb +2 -15
- data/lib/sass/tree/import_node.rb +11 -5
- data/lib/sass/tree/media_node.rb +27 -11
- data/lib/sass/tree/mixin_def_node.rb +15 -4
- data/lib/sass/tree/mixin_node.rb +27 -7
- data/lib/sass/tree/node.rb +69 -35
- data/lib/sass/tree/prop_node.rb +47 -31
- data/lib/sass/tree/return_node.rb +4 -3
- data/lib/sass/tree/root_node.rb +20 -4
- data/lib/sass/tree/rule_node.rb +37 -26
- data/lib/sass/tree/supports_node.rb +38 -0
- data/lib/sass/tree/trace_node.rb +33 -0
- data/lib/sass/tree/variable_node.rb +10 -4
- data/lib/sass/tree/visitors/base.rb +5 -8
- data/lib/sass/tree/visitors/check_nesting.rb +67 -52
- data/lib/sass/tree/visitors/convert.rb +134 -53
- data/lib/sass/tree/visitors/cssize.rb +245 -51
- data/lib/sass/tree/visitors/deep_copy.rb +102 -0
- data/lib/sass/tree/visitors/extend.rb +68 -0
- data/lib/sass/tree/visitors/perform.rb +331 -105
- data/lib/sass/tree/visitors/set_options.rb +125 -0
- data/lib/sass/tree/visitors/to_css.rb +259 -95
- data/lib/sass/tree/warn_node.rb +3 -3
- data/lib/sass/tree/while_node.rb +3 -3
- data/lib/sass/util/cross_platform_random.rb +19 -0
- data/lib/sass/util/multibyte_string_scanner.rb +157 -0
- data/lib/sass/util/normalized_map.rb +130 -0
- data/lib/sass/util/ordered_hash.rb +192 -0
- data/lib/sass/util/subset_map.rb +11 -2
- data/lib/sass/util/test.rb +9 -0
- data/lib/sass/util.rb +565 -39
- data/lib/sass/version.rb +27 -15
- data/lib/sass.rb +39 -4
- data/test/sass/cache_test.rb +15 -0
- data/test/sass/compiler_test.rb +223 -0
- data/test/sass/conversion_test.rb +901 -107
- data/test/sass/css2sass_test.rb +94 -0
- data/test/sass/engine_test.rb +1059 -164
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +933 -837
- data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/test/sass/functions_test.rb +995 -136
- data/test/sass/importer_test.rb +338 -18
- data/test/sass/logger_test.rb +58 -0
- data/test/sass/more_results/more_import.css +2 -2
- data/test/sass/plugin_test.rb +114 -30
- data/test/sass/results/cached_import_option.css +3 -0
- data/test/sass/results/filename_fn.css +3 -0
- data/test/sass/results/import.css +2 -2
- data/test/sass/results/import_charset.css +1 -0
- data/test/sass/results/import_charset_1_8.css +1 -0
- data/test/sass/results/import_charset_ibm866.css +1 -0
- data/test/sass/results/import_content.css +1 -0
- data/test/sass/results/script.css +1 -1
- data/test/sass/results/scss_import.css +2 -2
- data/test/sass/results/units.css +2 -2
- data/test/sass/script_conversion_test.rb +43 -1
- data/test/sass/script_test.rb +380 -36
- data/test/sass/scss/css_test.rb +257 -75
- data/test/sass/scss/scss_test.rb +2322 -110
- data/test/sass/source_map_test.rb +887 -0
- data/test/sass/templates/_cached_import_option_partial.scss +1 -0
- data/test/sass/templates/_double_import_loop2.sass +1 -0
- data/test/sass/templates/_filename_fn_import.scss +11 -0
- data/test/sass/templates/_imported_content.sass +3 -0
- data/test/sass/templates/_same_name_different_partiality.scss +1 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/templates/cached_import_option.scss +3 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/filename_fn.scss +18 -0
- data/test/sass/templates/import_charset.sass +2 -0
- data/test/sass/templates/import_charset_1_8.sass +2 -0
- data/test/sass/templates/import_charset_ibm866.sass +2 -0
- data/test/sass/templates/import_content.sass +4 -0
- data/test/sass/templates/same_name_different_ext.sass +2 -0
- data/test/sass/templates/same_name_different_ext.scss +1 -0
- data/test/sass/templates/same_name_different_partiality.scss +1 -0
- data/test/sass/templates/single_import_loop.sass +1 -0
- data/test/sass/templates/subdir/import_up1.scss +1 -0
- data/test/sass/templates/subdir/import_up2.scss +1 -0
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/test/sass/util/normalized_map_test.rb +51 -0
- data/test/sass/util_test.rb +183 -0
- data/test/sass/value_helpers_test.rb +181 -0
- data/test/test_helper.rb +45 -5
- data/vendor/listen/CHANGELOG.md +228 -0
- data/vendor/listen/CONTRIBUTING.md +38 -0
- data/vendor/listen/Gemfile +30 -0
- data/vendor/listen/Guardfile +8 -0
- data/vendor/{fssm → listen}/LICENSE +1 -1
- data/vendor/listen/README.md +315 -0
- data/vendor/listen/Rakefile +47 -0
- data/vendor/listen/Vagrantfile +96 -0
- data/vendor/listen/lib/listen/adapter.rb +214 -0
- data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
- data/vendor/listen/lib/listen/adapters/darwin.rb +85 -0
- data/vendor/listen/lib/listen/adapters/linux.rb +113 -0
- data/vendor/listen/lib/listen/adapters/polling.rb +67 -0
- data/vendor/listen/lib/listen/adapters/windows.rb +87 -0
- data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
- data/vendor/listen/lib/listen/directory_record.rb +371 -0
- data/vendor/listen/lib/listen/listener.rb +225 -0
- data/vendor/listen/lib/listen/multi_listener.rb +143 -0
- data/vendor/listen/lib/listen/turnstile.rb +28 -0
- data/vendor/listen/lib/listen/version.rb +3 -0
- data/vendor/listen/lib/listen.rb +40 -0
- data/vendor/listen/listen.gemspec +22 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +183 -0
- data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
- data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
- data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
- data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
- data/vendor/listen/spec/listen/directory_record_spec.rb +1225 -0
- data/vendor/listen/spec/listen/listener_spec.rb +169 -0
- data/vendor/listen/spec/listen/multi_listener_spec.rb +174 -0
- data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
- data/vendor/listen/spec/listen_spec.rb +73 -0
- data/vendor/listen/spec/spec_helper.rb +21 -0
- data/vendor/listen/spec/support/adapter_helper.rb +629 -0
- data/vendor/listen/spec/support/directory_record_helper.rb +55 -0
- data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
- data/vendor/listen/spec/support/listeners_helper.rb +156 -0
- data/vendor/listen/spec/support/platform_helper.rb +15 -0
- metadata +344 -271
- data/lib/sass/less.rb +0 -382
- data/lib/sass/script/bool.rb +0 -18
- data/lib/sass/script/funcall.rb +0 -162
- data/lib/sass/script/list.rb +0 -76
- data/lib/sass/script/literal.rb +0 -245
- data/lib/sass/script/variable.rb +0 -54
- data/lib/sass/scss/sass_parser.rb +0 -11
- data/test/sass/less_conversion_test.rb +0 -653
- data/vendor/fssm/README.markdown +0 -55
- data/vendor/fssm/Rakefile +0 -59
- data/vendor/fssm/VERSION.yml +0 -5
- data/vendor/fssm/example.rb +0 -9
- data/vendor/fssm/fssm.gemspec +0 -77
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
- data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
- data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
- data/vendor/fssm/lib/fssm/monitor.rb +0 -26
- data/vendor/fssm/lib/fssm/path.rb +0 -91
- data/vendor/fssm/lib/fssm/pathname.rb +0 -502
- data/vendor/fssm/lib/fssm/state/directory.rb +0 -57
- data/vendor/fssm/lib/fssm/state/file.rb +0 -24
- data/vendor/fssm/lib/fssm/support.rb +0 -63
- data/vendor/fssm/lib/fssm/tree.rb +0 -176
- data/vendor/fssm/lib/fssm.rb +0 -33
- data/vendor/fssm/profile/prof-cache.rb +0 -40
- data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
- data/vendor/fssm/profile/prof-pathname.rb +0 -68
- data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
- data/vendor/fssm/profile/prof.html +0 -2379
- data/vendor/fssm/spec/path_spec.rb +0 -75
- data/vendor/fssm/spec/root/duck/quack.txt +0 -0
- data/vendor/fssm/spec/root/file.css +0 -0
- data/vendor/fssm/spec/root/file.rb +0 -0
- data/vendor/fssm/spec/root/file.yml +0 -0
- data/vendor/fssm/spec/root/moo/cow.txt +0 -0
- data/vendor/fssm/spec/spec_helper.rb +0 -14
@@ -0,0 +1,155 @@
|
|
1
|
+
module Sass::Script::Value
|
2
|
+
# Provides helper functions for creating sass values from within ruby methods.
|
3
|
+
# @since `3.3.0`
|
4
|
+
module Helpers
|
5
|
+
# Construct a Sass Boolean.
|
6
|
+
#
|
7
|
+
# @param value [Object] A ruby object that will be tested for truthiness.
|
8
|
+
# @return [Sass::Script::Value::Bool] whether the ruby value is truthy.
|
9
|
+
def bool(value)
|
10
|
+
Bool.new(value)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Construct a Sass Color from a hex color string.
|
14
|
+
#
|
15
|
+
# @param value [::String] A string representing a hex color.
|
16
|
+
# The leading hash ("#") is optional.
|
17
|
+
# @param alpha [::Number] The alpha channel. A number between 0 and 1.
|
18
|
+
# @return [Sass::Script::Value::Color] the color object
|
19
|
+
def hex_color(value, alpha = nil)
|
20
|
+
Color.from_hex(value, alpha)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Construct a Sass Color from hsl values.
|
24
|
+
#
|
25
|
+
# @param hue [::Number] The hue of the color in degrees.
|
26
|
+
# A non-negative number, usually less than 360.
|
27
|
+
# @param saturation [::Number] The saturation of the color.
|
28
|
+
# Must be between 0 and 100 inclusive.
|
29
|
+
# @param lightness [::Number] The lightness of the color.
|
30
|
+
# Must be between 0 and 100 inclusive.
|
31
|
+
# @param alpha [::Number] The alpha channel. A number between 0 and 1.
|
32
|
+
#
|
33
|
+
# @return [Sass::Script::Value::Color] the color object
|
34
|
+
def hsl_color(hue, saturation, lightness, alpha = nil)
|
35
|
+
attrs = {:hue => hue, :saturation => saturation, :lightness => lightness}
|
36
|
+
attrs[:alpha] = alpha if alpha
|
37
|
+
Color.new(attrs)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Construct a Sass Color from rgb values.
|
41
|
+
#
|
42
|
+
# @param red [::Number] The red component. Must be between 0 and 255 inclusive.
|
43
|
+
# @param green [::Number] The green component. Must be between 0 and 255 inclusive.
|
44
|
+
# @param blue [::Number] The blue component. Must be between 0 and 255 inclusive.
|
45
|
+
# @param alpha [::Number] The alpha channel. A number between 0 and 1.
|
46
|
+
#
|
47
|
+
# @return [Sass::Script::Value::Color] the color object
|
48
|
+
def rgb_color(red, green, blue, alpha = nil)
|
49
|
+
attrs = {:red => red, :green => green, :blue => blue}
|
50
|
+
attrs[:alpha] = alpha if alpha
|
51
|
+
Color.new(attrs)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Construct a Sass Number from a ruby number.
|
55
|
+
#
|
56
|
+
# @param number [::Number] A numeric value.
|
57
|
+
# @param unit_string [::String] A unit string of the form
|
58
|
+
# `numeral_unit1 * numeral_unit2 ... / denominator_unit1 * denominator_unit2 ...`
|
59
|
+
# this is the same format that is returned by
|
60
|
+
# {Sass::Script::Value::Number#unit_str the `unit_str` method}
|
61
|
+
#
|
62
|
+
# @see Sass::Script::Value::Number#unit_str
|
63
|
+
#
|
64
|
+
# @return [Sass::Script::Value::Number] The sass number representing the given ruby number.
|
65
|
+
def number(number, unit_string = nil)
|
66
|
+
Number.new(number, *parse_unit_string(unit_string))
|
67
|
+
end
|
68
|
+
|
69
|
+
# @overload list(*elements, separator)
|
70
|
+
# Create a space-separated list from the arguments given.
|
71
|
+
# @param elements [Array<Sass::Script::Value::Base>] Each argument will be a list element.
|
72
|
+
# @param separator [Symbol] Either :space or :comma.
|
73
|
+
# @return [Sass::Script::Value::List] The space separated list.
|
74
|
+
#
|
75
|
+
# @overload list(array, separator)
|
76
|
+
# Create a space-separated list from the array given.
|
77
|
+
# @param array [Array<Sass::Script::Value::Base>] A ruby array of Sass values
|
78
|
+
# to make into a list.
|
79
|
+
# @return [Sass::Script::Value::List] The space separated list.
|
80
|
+
def list(*elements)
|
81
|
+
unless elements.last.is_a?(Symbol)
|
82
|
+
raise ArgumentError.new("A list type of :space or :comma must be specified.")
|
83
|
+
end
|
84
|
+
separator = elements.pop
|
85
|
+
if elements.size == 1 && elements.first.is_a?(Array)
|
86
|
+
elements = elements.first
|
87
|
+
end
|
88
|
+
Sass::Script::Value::List.new(elements, separator)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Construct a Sass map.
|
92
|
+
#
|
93
|
+
# @param hash [Hash<Sass::Script::Value::Base,
|
94
|
+
# Sass::Script::Value::Base>] A Ruby map to convert to a Sass map.
|
95
|
+
# @return [Sass::Script::Value::Map] The map.
|
96
|
+
def map(hash)
|
97
|
+
Map.new(hash)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Create a sass null value.
|
101
|
+
#
|
102
|
+
# @return [Sass::Script::Value::Null]
|
103
|
+
def null
|
104
|
+
Sass::Script::Value::Null.new
|
105
|
+
end
|
106
|
+
|
107
|
+
# Create a quoted string.
|
108
|
+
#
|
109
|
+
# @param str [::String] A ruby string.
|
110
|
+
# @return [Sass::Script::Value::String] A quoted string.
|
111
|
+
def quoted_string(str)
|
112
|
+
Sass::Script::String.new(str, :string)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Create an unquoted string.
|
116
|
+
#
|
117
|
+
# @param str [::String] A ruby string.
|
118
|
+
# @return [Sass::Script::Value::String] An unquoted string.
|
119
|
+
def unquoted_string(str)
|
120
|
+
Sass::Script::String.new(str, :identifier)
|
121
|
+
end
|
122
|
+
alias_method :identifier, :unquoted_string
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
# @private
|
127
|
+
VALID_UNIT = /#{Sass::SCSS::RX::NMSTART}#{Sass::SCSS::RX::NMCHAR}|%*/
|
128
|
+
|
129
|
+
# @example
|
130
|
+
# parse_unit_string("em*px/in*%") # => [["em", "px], ["in", "%"]]
|
131
|
+
#
|
132
|
+
# @param unit_string [String] A string adhering to the output of a number with complex
|
133
|
+
# units. E.g. "em*px/in*%"
|
134
|
+
# @return [Array<Array<String>>] A list of numerator units and a list of denominator units.
|
135
|
+
def parse_unit_string(unit_string)
|
136
|
+
denominator_units = numerator_units = Sass::Script::Value::Number::NO_UNITS
|
137
|
+
return numerator_units, denominator_units unless unit_string && unit_string.length > 0
|
138
|
+
num_over_denominator = unit_string.split(/ *\/ */)
|
139
|
+
unless (1..2).include?(num_over_denominator.size)
|
140
|
+
raise ArgumentError.new("Malformed unit string: #{unit_string}")
|
141
|
+
end
|
142
|
+
numerator_units = num_over_denominator[0].split(/ *\* */)
|
143
|
+
denominator_units = (num_over_denominator[1] || "").split(/ *\* */)
|
144
|
+
[[numerator_units, "numerator"], [denominator_units, "denominator"]].each do |units, name|
|
145
|
+
if unit_string =~ /\// && units.size == 0
|
146
|
+
raise ArgumentError.new("Malformed unit string: #{unit_string}")
|
147
|
+
end
|
148
|
+
if units.any? {|unit| unit !~ VALID_UNIT}
|
149
|
+
raise ArgumentError.new("Malformed #{name} in unit string: #{unit_string}")
|
150
|
+
end
|
151
|
+
end
|
152
|
+
[numerator_units, denominator_units]
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Sass::Script::Value
|
2
|
+
# A SassScript object representing a CSS list.
|
3
|
+
# This includes both comma-separated lists and space-separated lists.
|
4
|
+
class List < Base
|
5
|
+
# The Ruby array containing the contents of the list.
|
6
|
+
#
|
7
|
+
# @return [Array<Value>]
|
8
|
+
attr_reader :value
|
9
|
+
alias_method :to_a, :value
|
10
|
+
|
11
|
+
# The operator separating the values of the list.
|
12
|
+
# Either `:comma` or `:space`.
|
13
|
+
#
|
14
|
+
# @return [Symbol]
|
15
|
+
attr_reader :separator
|
16
|
+
|
17
|
+
# Creates a new list.
|
18
|
+
#
|
19
|
+
# @param value [Array<Value>] See \{#value}
|
20
|
+
# @param separator [Symbol] See \{#separator}
|
21
|
+
def initialize(value, separator)
|
22
|
+
super(value)
|
23
|
+
@separator = separator
|
24
|
+
end
|
25
|
+
|
26
|
+
# @see Value#options=
|
27
|
+
def options=(options)
|
28
|
+
super
|
29
|
+
value.each {|v| v.options = options}
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see Value#eq
|
33
|
+
def eq(other)
|
34
|
+
Sass::Script::Value::Bool.new(
|
35
|
+
other.is_a?(List) && value == other.value &&
|
36
|
+
separator == other.separator)
|
37
|
+
end
|
38
|
+
|
39
|
+
def hash
|
40
|
+
@hash ||= [value, separator].hash
|
41
|
+
end
|
42
|
+
|
43
|
+
# @see Value#to_s
|
44
|
+
def to_s(opts = {})
|
45
|
+
raise Sass::SyntaxError.new("() isn't a valid CSS value.") if value.empty?
|
46
|
+
value.
|
47
|
+
reject {|e| e.is_a?(Null) || e.is_a?(List) && e.value.empty?}.
|
48
|
+
map {|e| e.to_s(opts)}.join(sep_str)
|
49
|
+
end
|
50
|
+
|
51
|
+
# @see Value#to_sass
|
52
|
+
def to_sass(opts = {})
|
53
|
+
return "()" if value.empty?
|
54
|
+
members = value.map do |v|
|
55
|
+
if element_needs_parens?(v)
|
56
|
+
"(#{v.to_sass(opts)})"
|
57
|
+
else
|
58
|
+
v.to_sass(opts)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
return "(#{members.first},)" if members.length == 1 && separator == :comma
|
62
|
+
members.join(sep_str(nil))
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see Value#to_h
|
66
|
+
def to_h
|
67
|
+
return Sass::Util.ordered_hash if value.empty?
|
68
|
+
return @map ||= Sass::Util.to_hash(value.map {|e| e.to_a}) if is_pseudo_map?
|
69
|
+
super
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns whether a warning still needs to be printed for this list being used as a map.
|
73
|
+
#
|
74
|
+
# @return [Boolean]
|
75
|
+
def needs_map_warning?
|
76
|
+
!@value.empty? && !@map
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns whether this is a list of pairs that can be used as a map.
|
80
|
+
#
|
81
|
+
# @return [Boolean]
|
82
|
+
def is_pseudo_map?
|
83
|
+
@is_pseudo_map ||= value.all? {|e| e.is_a?(Sass::Script::Value::List) && e.to_a.length == 2}
|
84
|
+
end
|
85
|
+
|
86
|
+
# @see Value#inspect
|
87
|
+
def inspect
|
88
|
+
"(#{value.map {|e| e.inspect}.join(sep_str(nil))})"
|
89
|
+
end
|
90
|
+
|
91
|
+
# Asserts an index is within the list.
|
92
|
+
#
|
93
|
+
# @private
|
94
|
+
#
|
95
|
+
# @param list [Sass::Script::Value::List] The list for which the index should be checked.
|
96
|
+
# @param n [Sass::Script::Value::Number] The index being checked.
|
97
|
+
def self.assert_valid_index(list, n)
|
98
|
+
if !n.int? || n.to_i == 0
|
99
|
+
raise ArgumentError.new("List index #{n} must be a non-zero integer")
|
100
|
+
elsif list.to_a.size == 0
|
101
|
+
raise ArgumentError.new("List index is #{n} but list has no items")
|
102
|
+
elsif n.to_i.abs > (size = list.to_a.size)
|
103
|
+
raise ArgumentError.new(
|
104
|
+
"List index is #{n} but list is only #{size} item#{'s' if size != 1} long")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def element_needs_parens?(element)
|
111
|
+
if element.is_a?(List)
|
112
|
+
return false if element.value.empty?
|
113
|
+
precedence = Sass::Script::Parser.precedence_of(separator)
|
114
|
+
return Sass::Script::Parser.precedence_of(element.separator) <= precedence
|
115
|
+
end
|
116
|
+
|
117
|
+
return false unless separator == :space
|
118
|
+
return false unless element.is_a?(Sass::Script::Tree::UnaryOperation)
|
119
|
+
element.operator == :minus || element.operator == :plus
|
120
|
+
end
|
121
|
+
|
122
|
+
def sep_str(opts = options)
|
123
|
+
return ' ' if separator == :space
|
124
|
+
return ',' if opts && opts[:style] == :compressed
|
125
|
+
', '
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Sass::Script::Value
|
2
|
+
# A SassScript object representing a map from keys to values. Both keys and
|
3
|
+
# values can be any SassScript object.
|
4
|
+
class Map < Base
|
5
|
+
# The Ruby hash containing the contents of this map.
|
6
|
+
#
|
7
|
+
# @return [Hash<Node, Node>]
|
8
|
+
attr_reader :value
|
9
|
+
alias_method :to_h, :value
|
10
|
+
|
11
|
+
# Creates a new map.
|
12
|
+
#
|
13
|
+
# @param hash [Hash<Node, Node>]
|
14
|
+
def initialize(hash)
|
15
|
+
super(Sass::Util.ordered_hash(hash))
|
16
|
+
end
|
17
|
+
|
18
|
+
# @see Value#options=
|
19
|
+
def options=(options)
|
20
|
+
super
|
21
|
+
value.each do |k, v|
|
22
|
+
k.options = options
|
23
|
+
v.options = options
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see Value#separator
|
28
|
+
def separator
|
29
|
+
:comma unless value.empty?
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see Value#to_a
|
33
|
+
def to_a
|
34
|
+
value.map do |k, v|
|
35
|
+
list = List.new([k, v], :space)
|
36
|
+
list.options = options
|
37
|
+
list
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# @see Value#eq
|
42
|
+
def eq(other)
|
43
|
+
Bool.new(other.is_a?(Map) && value == other.value)
|
44
|
+
end
|
45
|
+
|
46
|
+
def hash
|
47
|
+
@hash ||= value.hash
|
48
|
+
end
|
49
|
+
|
50
|
+
# @see Value#to_s
|
51
|
+
def to_s(opts = {})
|
52
|
+
raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.")
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_sass(opts = {})
|
56
|
+
return "()" if value.empty?
|
57
|
+
|
58
|
+
to_sass = lambda do |value|
|
59
|
+
if value.is_a?(Map) || (value.is_a?(List) && value.separator == :comma)
|
60
|
+
"(#{value.to_sass(opts)})"
|
61
|
+
else
|
62
|
+
value.to_sass(opts)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
"(#{value.map {|(k, v)| "#{to_sass[k]}: #{to_sass[v]}"}.join(', ')})"
|
67
|
+
end
|
68
|
+
alias_method :inspect, :to_sass
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Sass::Script::Value
|
2
|
+
# A SassScript object representing a null value.
|
3
|
+
class Null < Base
|
4
|
+
# The null value in SassScript.
|
5
|
+
#
|
6
|
+
# This is assigned before new is overridden below so that we use the default implementation.
|
7
|
+
NULL = new(nil)
|
8
|
+
|
9
|
+
# We override object creation so that users of the core API
|
10
|
+
# will not need to know that null is a specific constant.
|
11
|
+
#
|
12
|
+
# @private
|
13
|
+
# @return [Null] the {NULL} constant.
|
14
|
+
def self.new
|
15
|
+
NULL
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Boolean] `false` (the Ruby boolean value)
|
19
|
+
def to_bool
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [Boolean] `true`
|
24
|
+
def null?
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
def neq(other)
|
29
|
+
return other.neq(self) if other.is_a?(DeprecatedFalse)
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [String] '' (An empty string)
|
34
|
+
def to_s(opts = {})
|
35
|
+
''
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_sass(opts = {})
|
39
|
+
'null'
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns a string representing a null value.
|
43
|
+
#
|
44
|
+
# @return [String]
|
45
|
+
def inspect
|
46
|
+
'null'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|