sass4 4.0.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/.yardopts +13 -0
- data/AGENTS.md +534 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/CONTRIBUTING.md +148 -0
- data/MIT-LICENSE +20 -0
- data/README.md +242 -0
- data/VERSION +1 -0
- data/VERSION_NAME +1 -0
- data/bin/sass +13 -0
- data/bin/sass-convert +12 -0
- data/bin/scss +13 -0
- data/extra/sass-spec-ref.sh +40 -0
- data/extra/update_watch.rb +13 -0
- data/init.rb +18 -0
- data/lib/sass/cache_stores/base.rb +88 -0
- data/lib/sass/cache_stores/chain.rb +34 -0
- data/lib/sass/cache_stores/filesystem.rb +60 -0
- data/lib/sass/cache_stores/memory.rb +46 -0
- data/lib/sass/cache_stores/null.rb +25 -0
- data/lib/sass/cache_stores.rb +15 -0
- data/lib/sass/callbacks.rb +67 -0
- data/lib/sass/css.rb +407 -0
- data/lib/sass/deprecation.rb +55 -0
- data/lib/sass/engine.rb +1236 -0
- data/lib/sass/environment.rb +236 -0
- data/lib/sass/error.rb +198 -0
- data/lib/sass/exec/base.rb +188 -0
- data/lib/sass/exec/sass_convert.rb +283 -0
- data/lib/sass/exec/sass_scss.rb +436 -0
- data/lib/sass/exec.rb +9 -0
- data/lib/sass/features.rb +48 -0
- data/lib/sass/importers/base.rb +182 -0
- data/lib/sass/importers/deprecated_path.rb +51 -0
- data/lib/sass/importers/filesystem.rb +221 -0
- data/lib/sass/importers.rb +23 -0
- data/lib/sass/logger/base.rb +47 -0
- data/lib/sass/logger/delayed.rb +50 -0
- data/lib/sass/logger/log_level.rb +45 -0
- data/lib/sass/logger.rb +17 -0
- data/lib/sass/media.rb +210 -0
- data/lib/sass/plugin/compiler.rb +552 -0
- data/lib/sass/plugin/configuration.rb +134 -0
- data/lib/sass/plugin/generic.rb +15 -0
- data/lib/sass/plugin/merb.rb +48 -0
- data/lib/sass/plugin/rack.rb +60 -0
- data/lib/sass/plugin/rails.rb +47 -0
- data/lib/sass/plugin/staleness_checker.rb +199 -0
- data/lib/sass/plugin.rb +134 -0
- data/lib/sass/railtie.rb +10 -0
- data/lib/sass/repl.rb +57 -0
- data/lib/sass/root.rb +7 -0
- data/lib/sass/script/css_lexer.rb +33 -0
- data/lib/sass/script/css_parser.rb +36 -0
- data/lib/sass/script/functions.rb +3103 -0
- data/lib/sass/script/lexer.rb +518 -0
- data/lib/sass/script/parser.rb +1164 -0
- data/lib/sass/script/tree/funcall.rb +314 -0
- data/lib/sass/script/tree/interpolation.rb +220 -0
- data/lib/sass/script/tree/list_literal.rb +119 -0
- data/lib/sass/script/tree/literal.rb +49 -0
- data/lib/sass/script/tree/map_literal.rb +64 -0
- data/lib/sass/script/tree/node.rb +119 -0
- data/lib/sass/script/tree/operation.rb +149 -0
- data/lib/sass/script/tree/selector.rb +26 -0
- data/lib/sass/script/tree/string_interpolation.rb +125 -0
- data/lib/sass/script/tree/unary_operation.rb +69 -0
- data/lib/sass/script/tree/variable.rb +57 -0
- data/lib/sass/script/tree.rb +16 -0
- data/lib/sass/script/value/arg_list.rb +36 -0
- data/lib/sass/script/value/base.rb +258 -0
- data/lib/sass/script/value/bool.rb +35 -0
- data/lib/sass/script/value/callable.rb +25 -0
- data/lib/sass/script/value/color.rb +704 -0
- data/lib/sass/script/value/function.rb +19 -0
- data/lib/sass/script/value/helpers.rb +298 -0
- data/lib/sass/script/value/list.rb +135 -0
- data/lib/sass/script/value/map.rb +70 -0
- data/lib/sass/script/value/null.rb +44 -0
- data/lib/sass/script/value/number.rb +564 -0
- data/lib/sass/script/value/string.rb +138 -0
- data/lib/sass/script/value.rb +13 -0
- data/lib/sass/script.rb +66 -0
- data/lib/sass/scss/css_parser.rb +61 -0
- data/lib/sass/scss/parser.rb +1343 -0
- data/lib/sass/scss/rx.rb +134 -0
- data/lib/sass/scss/static_parser.rb +351 -0
- data/lib/sass/scss.rb +14 -0
- data/lib/sass/selector/abstract_sequence.rb +112 -0
- data/lib/sass/selector/comma_sequence.rb +195 -0
- data/lib/sass/selector/pseudo.rb +291 -0
- data/lib/sass/selector/sequence.rb +661 -0
- data/lib/sass/selector/simple.rb +124 -0
- data/lib/sass/selector/simple_sequence.rb +348 -0
- data/lib/sass/selector.rb +327 -0
- data/lib/sass/shared.rb +76 -0
- data/lib/sass/source/map.rb +209 -0
- data/lib/sass/source/position.rb +39 -0
- data/lib/sass/source/range.rb +41 -0
- data/lib/sass/stack.rb +140 -0
- data/lib/sass/supports.rb +225 -0
- data/lib/sass/tree/at_root_node.rb +83 -0
- data/lib/sass/tree/charset_node.rb +22 -0
- data/lib/sass/tree/comment_node.rb +82 -0
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/css_import_node.rb +68 -0
- data/lib/sass/tree/debug_node.rb +18 -0
- data/lib/sass/tree/directive_node.rb +59 -0
- data/lib/sass/tree/each_node.rb +24 -0
- data/lib/sass/tree/error_node.rb +18 -0
- data/lib/sass/tree/extend_node.rb +43 -0
- data/lib/sass/tree/for_node.rb +36 -0
- data/lib/sass/tree/function_node.rb +44 -0
- data/lib/sass/tree/if_node.rb +52 -0
- data/lib/sass/tree/import_node.rb +75 -0
- data/lib/sass/tree/keyframe_rule_node.rb +15 -0
- data/lib/sass/tree/media_node.rb +48 -0
- data/lib/sass/tree/mixin_def_node.rb +38 -0
- data/lib/sass/tree/mixin_node.rb +52 -0
- data/lib/sass/tree/node.rb +240 -0
- data/lib/sass/tree/prop_node.rb +162 -0
- data/lib/sass/tree/return_node.rb +19 -0
- data/lib/sass/tree/root_node.rb +44 -0
- data/lib/sass/tree/rule_node.rb +153 -0
- 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 +36 -0
- data/lib/sass/tree/visitors/base.rb +72 -0
- data/lib/sass/tree/visitors/check_nesting.rb +173 -0
- data/lib/sass/tree/visitors/convert.rb +350 -0
- data/lib/sass/tree/visitors/cssize.rb +362 -0
- data/lib/sass/tree/visitors/deep_copy.rb +107 -0
- data/lib/sass/tree/visitors/extend.rb +64 -0
- data/lib/sass/tree/visitors/perform.rb +572 -0
- data/lib/sass/tree/visitors/set_options.rb +139 -0
- data/lib/sass/tree/visitors/to_css.rb +440 -0
- data/lib/sass/tree/warn_node.rb +18 -0
- data/lib/sass/tree/while_node.rb +18 -0
- data/lib/sass/util/multibyte_string_scanner.rb +151 -0
- data/lib/sass/util/normalized_map.rb +122 -0
- data/lib/sass/util/subset_map.rb +109 -0
- data/lib/sass/util/test.rb +9 -0
- data/lib/sass/util.rb +1137 -0
- data/lib/sass/version.rb +120 -0
- data/lib/sass.rb +102 -0
- data/rails/init.rb +1 -0
- metadata +283 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
require 'delegate'
|
|
2
|
+
|
|
3
|
+
module Sass
|
|
4
|
+
module Util
|
|
5
|
+
# A hash that normalizes its string keys while still allowing you to get back
|
|
6
|
+
# to the original keys that were stored. If several different values normalize
|
|
7
|
+
# to the same value, whichever is stored last wins.
|
|
8
|
+
class NormalizedMap
|
|
9
|
+
# Create a normalized map
|
|
10
|
+
def initialize(map = nil)
|
|
11
|
+
@key_strings = {}
|
|
12
|
+
@map = {}
|
|
13
|
+
|
|
14
|
+
map.each {|key, value| self[key] = value} if map
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Specifies how to transform the key.
|
|
18
|
+
#
|
|
19
|
+
# This can be overridden to create other normalization behaviors.
|
|
20
|
+
def normalize(key)
|
|
21
|
+
key.tr("-", "_")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Returns the version of `key` as it was stored before
|
|
25
|
+
# normalization. If `key` isn't in the map, returns it as it was
|
|
26
|
+
# passed in.
|
|
27
|
+
#
|
|
28
|
+
# @return [String]
|
|
29
|
+
def denormalize(key)
|
|
30
|
+
@key_strings[normalize(key)] || key
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @private
|
|
34
|
+
def []=(k, v)
|
|
35
|
+
normalized = normalize(k)
|
|
36
|
+
@map[normalized] = v
|
|
37
|
+
@key_strings[normalized] = k
|
|
38
|
+
v
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @private
|
|
42
|
+
def [](k)
|
|
43
|
+
@map[normalize(k)]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @private
|
|
47
|
+
def has_key?(k)
|
|
48
|
+
@map.has_key?(normalize(k))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @private
|
|
52
|
+
def delete(k)
|
|
53
|
+
normalized = normalize(k)
|
|
54
|
+
@key_strings.delete(normalized)
|
|
55
|
+
@map.delete(normalized)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @return [Hash] Hash with the keys as they were stored (before normalization).
|
|
59
|
+
def as_stored
|
|
60
|
+
Sass::Util.map_keys(@map) {|k| @key_strings[k]}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def empty?
|
|
64
|
+
@map.empty?
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def values
|
|
68
|
+
@map.values
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def keys
|
|
72
|
+
@map.keys
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def each
|
|
76
|
+
@map.each {|k, v| yield(k, v)}
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def size
|
|
80
|
+
@map.size
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def to_hash
|
|
84
|
+
@map.dup
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def to_a
|
|
88
|
+
@map.to_a
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def map
|
|
92
|
+
@map.map {|k, v| yield(k, v)}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def dup
|
|
96
|
+
d = super
|
|
97
|
+
d.send(:instance_variable_set, "@map", @map.dup)
|
|
98
|
+
d
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def sort_by
|
|
102
|
+
@map.sort_by {|k, v| yield k, v}
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def update(map)
|
|
106
|
+
map = map.as_stored if map.is_a?(NormalizedMap)
|
|
107
|
+
map.each {|k, v| self[k] = v}
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def method_missing(method, *args, &block)
|
|
111
|
+
if Sass.tests_running
|
|
112
|
+
raise ArgumentError.new("The method #{method} must be implemented explicitly")
|
|
113
|
+
end
|
|
114
|
+
@map.send(method, *args, &block)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def respond_to_missing?(method, include_private = false)
|
|
118
|
+
@map.respond_to?(method, include_private)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
|
|
3
|
+
module Sass
|
|
4
|
+
module Util
|
|
5
|
+
# A map from sets to values.
|
|
6
|
+
# A value is \{#\[]= set} by providing a set (the "set-set") and a value,
|
|
7
|
+
# which is then recorded as corresponding to that set.
|
|
8
|
+
# Values are \{#\[] accessed} by providing a set (the "get-set")
|
|
9
|
+
# and returning all values that correspond to set-sets
|
|
10
|
+
# that are subsets of the get-set.
|
|
11
|
+
#
|
|
12
|
+
# SubsetMap preserves the order of values as they're inserted.
|
|
13
|
+
#
|
|
14
|
+
# @example
|
|
15
|
+
# ssm = SubsetMap.new
|
|
16
|
+
# ssm[Set[1, 2]] = "Foo"
|
|
17
|
+
# ssm[Set[2, 3]] = "Bar"
|
|
18
|
+
# ssm[Set[1, 2, 3]] = "Baz"
|
|
19
|
+
#
|
|
20
|
+
# ssm[Set[1, 2, 3]] #=> ["Foo", "Bar", "Baz"]
|
|
21
|
+
class SubsetMap
|
|
22
|
+
# Creates a new, empty SubsetMap.
|
|
23
|
+
def initialize
|
|
24
|
+
@hash = {}
|
|
25
|
+
@vals = []
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Whether or not this SubsetMap has any key-value pairs.
|
|
29
|
+
#
|
|
30
|
+
# @return [Boolean]
|
|
31
|
+
def empty?
|
|
32
|
+
@hash.empty?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Associates a value with a set.
|
|
36
|
+
# When `set` or any of its supersets is accessed,
|
|
37
|
+
# `value` will be among the values returned.
|
|
38
|
+
#
|
|
39
|
+
# Note that if the same `set` is passed to this method multiple times,
|
|
40
|
+
# all given `value`s will be associated with that `set`.
|
|
41
|
+
#
|
|
42
|
+
# This runs in `O(n)` time, where `n` is the size of `set`.
|
|
43
|
+
#
|
|
44
|
+
# @param set [#to_set] The set to use as the map key. May not be empty.
|
|
45
|
+
# @param value [Object] The value to associate with `set`.
|
|
46
|
+
# @raise [ArgumentError] If `set` is empty.
|
|
47
|
+
def []=(set, value)
|
|
48
|
+
raise ArgumentError.new("SubsetMap keys may not be empty.") if set.empty?
|
|
49
|
+
|
|
50
|
+
index = @vals.size
|
|
51
|
+
@vals << value
|
|
52
|
+
set.each do |k|
|
|
53
|
+
@hash[k] ||= []
|
|
54
|
+
@hash[k] << [set, set.to_set, index]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns all values associated with subsets of `set`.
|
|
59
|
+
#
|
|
60
|
+
# In the worst case, this runs in `O(m*max(n, log m))` time,
|
|
61
|
+
# where `n` is the size of `set`
|
|
62
|
+
# and `m` is the number of associations in the map.
|
|
63
|
+
# However, unless many keys in the map overlap with `set`,
|
|
64
|
+
# `m` will typically be much smaller.
|
|
65
|
+
#
|
|
66
|
+
# @param set [Set] The set to use as the map key.
|
|
67
|
+
# @return [Array<(Object, #to_set)>] An array of pairs,
|
|
68
|
+
# where the first value is the value associated with a subset of `set`,
|
|
69
|
+
# and the second value is that subset of `set`
|
|
70
|
+
# (or whatever `#to_set` object was used to set the value)
|
|
71
|
+
# This array is in insertion order.
|
|
72
|
+
# @see #[]
|
|
73
|
+
def get(set)
|
|
74
|
+
res = set.map do |k|
|
|
75
|
+
subsets = @hash[k]
|
|
76
|
+
next unless subsets
|
|
77
|
+
subsets.map do |subenum, subset, index|
|
|
78
|
+
next unless subset.subset?(set)
|
|
79
|
+
[index, subenum]
|
|
80
|
+
end
|
|
81
|
+
end.flatten(1)
|
|
82
|
+
res.compact!
|
|
83
|
+
res.uniq!
|
|
84
|
+
res.sort!
|
|
85
|
+
res.map! {|i, s| [@vals[i], s]}
|
|
86
|
+
res
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Same as \{#get}, but doesn't return the subsets of the argument
|
|
90
|
+
# for which values were found.
|
|
91
|
+
#
|
|
92
|
+
# @param set [Set] The set to use as the map key.
|
|
93
|
+
# @return [Array] The array of all values
|
|
94
|
+
# associated with subsets of `set`, in insertion order.
|
|
95
|
+
# @see #get
|
|
96
|
+
def [](set)
|
|
97
|
+
get(set).map {|v, _| v}
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Iterates over each value in the subset map. Ignores keys completely. If
|
|
101
|
+
# multiple keys have the same value, this will return them multiple times.
|
|
102
|
+
#
|
|
103
|
+
# @yield [Object] Each value in the map.
|
|
104
|
+
def each_value
|
|
105
|
+
@vals.each {|v| yield v}
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|