oreorenasass 3.4.4 → 3.4.5
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 +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +50 -70
- data/Rakefile +5 -26
- data/VERSION +1 -1
- data/VERSION_NAME +1 -1
- data/bin/sass +1 -1
- data/bin/scss +1 -1
- data/lib/sass.rb +12 -19
- data/lib/sass/cache_stores/base.rb +2 -2
- data/lib/sass/cache_stores/chain.rb +1 -2
- data/lib/sass/cache_stores/filesystem.rb +5 -1
- data/lib/sass/cache_stores/memory.rb +1 -1
- data/lib/sass/cache_stores/null.rb +2 -2
- data/lib/sass/callbacks.rb +0 -1
- data/lib/sass/css.rb +13 -11
- data/lib/sass/engine.rb +173 -424
- data/lib/sass/environment.rb +58 -148
- data/lib/sass/error.rb +14 -11
- data/lib/sass/exec.rb +703 -5
- data/lib/sass/importers/base.rb +6 -49
- data/lib/sass/importers/filesystem.rb +19 -44
- data/lib/sass/logger.rb +4 -1
- data/lib/sass/logger/base.rb +4 -2
- data/lib/sass/logger/log_level.rb +7 -3
- data/lib/sass/media.rb +23 -20
- data/lib/sass/plugin.rb +7 -7
- data/lib/sass/plugin/compiler.rb +145 -304
- data/lib/sass/plugin/configuration.rb +23 -18
- data/lib/sass/plugin/merb.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +3 -3
- data/lib/sass/repl.rb +3 -3
- data/lib/sass/script.rb +8 -35
- data/lib/sass/script/{value/arg_list.rb → arg_list.rb} +25 -9
- data/lib/sass/script/bool.rb +18 -0
- data/lib/sass/script/color.rb +606 -0
- data/lib/sass/script/css_lexer.rb +4 -8
- data/lib/sass/script/css_parser.rb +2 -5
- data/lib/sass/script/funcall.rb +245 -0
- data/lib/sass/script/functions.rb +408 -1491
- data/lib/sass/script/interpolation.rb +79 -0
- data/lib/sass/script/lexer.rb +68 -172
- data/lib/sass/script/list.rb +85 -0
- data/lib/sass/script/literal.rb +221 -0
- data/lib/sass/script/{tree/node.rb → node.rb} +12 -22
- data/lib/sass/script/{value/null.rb → null.rb} +7 -14
- data/lib/sass/script/{value/number.rb → number.rb} +75 -152
- data/lib/sass/script/{tree/operation.rb → operation.rb} +24 -17
- data/lib/sass/script/parser.rb +110 -245
- data/lib/sass/script/string.rb +51 -0
- data/lib/sass/script/{tree/string_interpolation.rb → string_interpolation.rb} +4 -5
- data/lib/sass/script/{tree/unary_operation.rb → unary_operation.rb} +6 -6
- data/lib/sass/script/variable.rb +58 -0
- data/lib/sass/scss/css_parser.rb +3 -9
- data/lib/sass/scss/parser.rb +421 -450
- data/lib/sass/scss/rx.rb +11 -19
- data/lib/sass/scss/static_parser.rb +7 -321
- data/lib/sass/selector.rb +194 -68
- data/lib/sass/selector/abstract_sequence.rb +14 -29
- data/lib/sass/selector/comma_sequence.rb +25 -108
- data/lib/sass/selector/sequence.rb +66 -159
- data/lib/sass/selector/simple.rb +25 -23
- data/lib/sass/selector/simple_sequence.rb +63 -173
- data/lib/sass/shared.rb +1 -1
- data/lib/sass/supports.rb +15 -13
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/comment_node.rb +3 -3
- data/lib/sass/tree/css_import_node.rb +11 -11
- data/lib/sass/tree/debug_node.rb +2 -2
- data/lib/sass/tree/directive_node.rb +4 -21
- data/lib/sass/tree/each_node.rb +8 -8
- data/lib/sass/tree/extend_node.rb +7 -14
- data/lib/sass/tree/for_node.rb +4 -4
- data/lib/sass/tree/function_node.rb +4 -9
- data/lib/sass/tree/if_node.rb +1 -1
- data/lib/sass/tree/import_node.rb +5 -4
- data/lib/sass/tree/media_node.rb +14 -4
- data/lib/sass/tree/mixin_def_node.rb +4 -4
- data/lib/sass/tree/mixin_node.rb +8 -21
- data/lib/sass/tree/node.rb +12 -54
- data/lib/sass/tree/prop_node.rb +20 -39
- data/lib/sass/tree/return_node.rb +2 -3
- data/lib/sass/tree/root_node.rb +3 -19
- data/lib/sass/tree/rule_node.rb +22 -35
- data/lib/sass/tree/supports_node.rb +13 -0
- data/lib/sass/tree/trace_node.rb +1 -2
- data/lib/sass/tree/variable_node.rb +3 -9
- data/lib/sass/tree/visitors/base.rb +8 -5
- data/lib/sass/tree/visitors/check_nesting.rb +19 -49
- data/lib/sass/tree/visitors/convert.rb +56 -74
- data/lib/sass/tree/visitors/cssize.rb +74 -202
- data/lib/sass/tree/visitors/deep_copy.rb +5 -10
- data/lib/sass/tree/visitors/extend.rb +7 -7
- data/lib/sass/tree/visitors/perform.rb +185 -278
- data/lib/sass/tree/visitors/set_options.rb +6 -20
- data/lib/sass/tree/visitors/to_css.rb +81 -234
- data/lib/sass/tree/warn_node.rb +2 -2
- data/lib/sass/tree/while_node.rb +2 -2
- data/lib/sass/util.rb +152 -522
- data/lib/sass/util/multibyte_string_scanner.rb +0 -2
- data/lib/sass/util/subset_map.rb +3 -4
- data/lib/sass/util/test.rb +1 -0
- data/lib/sass/version.rb +22 -20
- data/test/Gemfile +3 -0
- data/test/Gemfile.lock +10 -0
- data/test/sass/cache_test.rb +20 -62
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/conversion_test.rb +2 -296
- data/test/sass/css2sass_test.rb +4 -23
- data/test/sass/engine_test.rb +354 -411
- data/test/sass/exec_test.rb +2 -2
- data/test/sass/extend_test.rb +145 -324
- data/test/sass/functions_test.rb +86 -873
- data/test/sass/importer_test.rb +21 -241
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/plugin_test.rb +26 -16
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +4 -4
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +1 -1
- data/test/sass/results/import_charset_ibm866.css +2 -2
- data/test/sass/results/mixins.css +17 -17
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +2 -2
- data/test/sass/results/script.css +3 -3
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +7 -36
- data/test/sass/script_test.rb +53 -485
- data/test/sass/scss/css_test.rb +28 -143
- data/test/sass/scss/rx_test.rb +4 -4
- data/test/sass/scss/scss_test.rb +325 -2119
- data/test/sass/templates/scss_import.scss +1 -2
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +2 -2
- data/test/sass/util_test.rb +1 -86
- data/test/test_helper.rb +8 -37
- metadata +19 -66
- data/lib/sass/exec/base.rb +0 -187
- data/lib/sass/exec/sass_convert.rb +0 -264
- data/lib/sass/exec/sass_scss.rb +0 -424
- data/lib/sass/features.rb +0 -47
- data/lib/sass/script/tree.rb +0 -16
- data/lib/sass/script/tree/funcall.rb +0 -306
- data/lib/sass/script/tree/interpolation.rb +0 -118
- data/lib/sass/script/tree/list_literal.rb +0 -77
- data/lib/sass/script/tree/literal.rb +0 -45
- data/lib/sass/script/tree/map_literal.rb +0 -64
- data/lib/sass/script/tree/selector.rb +0 -26
- data/lib/sass/script/tree/variable.rb +0 -57
- data/lib/sass/script/value.rb +0 -11
- data/lib/sass/script/value/base.rb +0 -240
- data/lib/sass/script/value/bool.rb +0 -35
- data/lib/sass/script/value/color.rb +0 -680
- data/lib/sass/script/value/helpers.rb +0 -262
- data/lib/sass/script/value/list.rb +0 -113
- data/lib/sass/script/value/map.rb +0 -70
- data/lib/sass/script/value/string.rb +0 -97
- data/lib/sass/selector/pseudo.rb +0 -256
- data/lib/sass/source/map.rb +0 -210
- data/lib/sass/source/position.rb +0 -39
- data/lib/sass/source/range.rb +0 -41
- data/lib/sass/stack.rb +0 -120
- data/lib/sass/tree/at_root_node.rb +0 -83
- data/lib/sass/tree/error_node.rb +0 -18
- data/lib/sass/tree/keyframe_rule_node.rb +0 -15
- data/lib/sass/util/cross_platform_random.rb +0 -19
- data/lib/sass/util/normalized_map.rb +0 -130
- data/lib/sass/util/ordered_hash.rb +0 -192
- data/test/sass/compiler_test.rb +0 -232
- data/test/sass/encoding_test.rb +0 -219
- data/test/sass/source_map_test.rb +0 -977
- data/test/sass/superselector_test.rb +0 -191
- data/test/sass/util/normalized_map_test.rb +0 -51
- data/test/sass/value_helpers_test.rb +0 -179
data/lib/sass/tree/prop_node.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
module Sass::Tree
|
2
|
-
# A static node
|
2
|
+
# A static node reprenting a CSS property.
|
3
3
|
#
|
4
4
|
# @see Sass::Tree
|
5
5
|
class PropNode < Node
|
6
6
|
# The name of the property,
|
7
|
-
# interspersed with {Sass::Script::
|
7
|
+
# interspersed with {Sass::Script::Node}s
|
8
8
|
# representing `#{}`-interpolation.
|
9
9
|
# Any adjacent strings will be merged together.
|
10
10
|
#
|
11
|
-
# @return [Array<String, Sass::Script::
|
11
|
+
# @return [Array<String, Sass::Script::Node>]
|
12
12
|
attr_accessor :name
|
13
13
|
|
14
14
|
# The name of the property
|
@@ -20,7 +20,7 @@ module Sass::Tree
|
|
20
20
|
|
21
21
|
# The value of the property.
|
22
22
|
#
|
23
|
-
# @return [Sass::Script::
|
23
|
+
# @return [Sass::Script::Node]
|
24
24
|
attr_accessor :value
|
25
25
|
|
26
26
|
# The value of the property
|
@@ -42,18 +42,8 @@ module Sass::Tree
|
|
42
42
|
# @return [Fixnum]
|
43
43
|
attr_accessor :tabs
|
44
44
|
|
45
|
-
#
|
46
|
-
#
|
47
|
-
# @return [Sass::Source::Range]
|
48
|
-
attr_accessor :name_source_range
|
49
|
-
|
50
|
-
# The source range in which the property value appears.
|
51
|
-
#
|
52
|
-
# @return [Sass::Source::Range]
|
53
|
-
attr_accessor :value_source_range
|
54
|
-
|
55
|
-
# @param name [Array<String, Sass::Script::Tree::Node>] See \{#name}
|
56
|
-
# @param value [Sass::Script::Tree::Node] See \{#value}
|
45
|
+
# @param name [Array<String, Sass::Script::Node>] See \{#name}
|
46
|
+
# @param value [Sass::Script::Node] See \{#value}
|
57
47
|
# @param prop_syntax [Symbol] `:new` if this property uses `a: b`-style syntax,
|
58
48
|
# `:old` if it uses `:a b`-style syntax
|
59
49
|
def initialize(name, value, prop_syntax)
|
@@ -80,13 +70,7 @@ module Sass::Tree
|
|
80
70
|
#
|
81
71
|
# @return [String] The message
|
82
72
|
def pseudo_class_selector_message
|
83
|
-
if @prop_syntax == :new ||
|
84
|
-
!value.is_a?(Sass::Script::Tree::Literal) ||
|
85
|
-
!value.value.is_a?(Sass::Script::Value::String) ||
|
86
|
-
!value.value.value.empty?
|
87
|
-
return ""
|
88
|
-
end
|
89
|
-
|
73
|
+
return "" if @prop_syntax == :new || !value.is_a?(Sass::Script::String) || !value.value.empty?
|
90
74
|
"\nIf #{declaration.dump} should be a selector, use \"\\#{declaration}\" instead."
|
91
75
|
end
|
92
76
|
|
@@ -97,10 +81,9 @@ module Sass::Tree
|
|
97
81
|
# @param opts [{Symbol => Object}] The options hash for the tree.
|
98
82
|
# @param fmt [Symbol] `:scss` or `:sass`.
|
99
83
|
def declaration(opts = {:old => @prop_syntax == :old}, fmt = :sass)
|
100
|
-
name = self.name.map {|n| n.is_a?(String) ? n : n.to_sass(opts)}.join
|
84
|
+
name = self.name.map {|n| n.is_a?(String) ? n : "\#{#{n.to_sass(opts)}}"}.join
|
101
85
|
if name[0] == ?:
|
102
|
-
raise Sass::SyntaxError.new("The \"#{name}: #{self.class.val_to_sass(value, opts)}\""
|
103
|
-
" hack is not allowed in the Sass indented syntax")
|
86
|
+
raise Sass::SyntaxError.new("The \"#{name}: #{self.class.val_to_sass(value, opts)}\" hack is not allowed in the Sass indented syntax")
|
104
87
|
end
|
105
88
|
|
106
89
|
old = opts[:old] && fmt == :sass
|
@@ -121,8 +104,7 @@ module Sass::Tree
|
|
121
104
|
def check!
|
122
105
|
if @options[:property_syntax] && @options[:property_syntax] != @prop_syntax
|
123
106
|
raise Sass::SyntaxError.new(
|
124
|
-
"Illegal property syntax: can't use #{@prop_syntax} syntax when "
|
125
|
-
":property_syntax => #{@options[:property_syntax].inspect} is set.")
|
107
|
+
"Illegal property syntax: can't use #{@prop_syntax} syntax when :property_syntax => #{@options[:property_syntax].inspect} is set.")
|
126
108
|
end
|
127
109
|
end
|
128
110
|
|
@@ -135,37 +117,36 @@ module Sass::Tree
|
|
135
117
|
private
|
136
118
|
|
137
119
|
def val_to_sass_comma(node, opts)
|
138
|
-
return node unless node.is_a?(Sass::Script::
|
120
|
+
return node unless node.is_a?(Sass::Script::Operation)
|
139
121
|
return val_to_sass_concat(node, opts) unless node.operator == :comma
|
140
122
|
|
141
|
-
Sass::Script::
|
123
|
+
Sass::Script::Operation.new(
|
142
124
|
val_to_sass_concat(node.operand1, opts),
|
143
125
|
val_to_sass_comma(node.operand2, opts),
|
144
126
|
node.operator)
|
145
127
|
end
|
146
128
|
|
147
129
|
def val_to_sass_concat(node, opts)
|
148
|
-
return node unless node.is_a?(Sass::Script::
|
130
|
+
return node unless node.is_a?(Sass::Script::Operation)
|
149
131
|
return val_to_sass_div(node, opts) unless node.operator == :space
|
150
132
|
|
151
|
-
Sass::Script::
|
133
|
+
Sass::Script::Operation.new(
|
152
134
|
val_to_sass_div(node.operand1, opts),
|
153
135
|
val_to_sass_concat(node.operand2, opts),
|
154
136
|
node.operator)
|
155
137
|
end
|
156
138
|
|
157
139
|
def val_to_sass_div(node, opts)
|
158
|
-
unless node.is_a?(Sass::Script::
|
159
|
-
node.operand1.is_a?(Sass::Script::
|
160
|
-
node.
|
161
|
-
node.operand2.
|
162
|
-
node.operand2.value.is_a?(Sass::Script::Value::Number) &&
|
163
|
-
(!node.operand1.value.original || !node.operand2.value.original)
|
140
|
+
unless node.is_a?(Sass::Script::Operation) && node.operator == :div &&
|
141
|
+
node.operand1.is_a?(Sass::Script::Number) &&
|
142
|
+
node.operand2.is_a?(Sass::Script::Number) &&
|
143
|
+
(!node.operand1.original || !node.operand2.original)
|
164
144
|
return node
|
165
145
|
end
|
166
146
|
|
167
|
-
Sass::Script::
|
147
|
+
Sass::Script::String.new("(#{node.to_sass(opts)})")
|
168
148
|
end
|
149
|
+
|
169
150
|
end
|
170
151
|
end
|
171
152
|
end
|
@@ -5,11 +5,10 @@ module Sass
|
|
5
5
|
# @see Sass::Tree
|
6
6
|
class ReturnNode < Node
|
7
7
|
# The expression to return.
|
8
|
-
#
|
9
|
-
# @return [Script::Tree::Node]
|
8
|
+
# @type [Script::Node]
|
10
9
|
attr_accessor :expr
|
11
10
|
|
12
|
-
# @param expr [Script::
|
11
|
+
# @param expr [Script::Node] The expression to return
|
13
12
|
def initialize(expr)
|
14
13
|
@expr = expr
|
15
14
|
super()
|
data/lib/sass/tree/root_node.rb
CHANGED
@@ -13,31 +13,15 @@ module Sass
|
|
13
13
|
@template = template
|
14
14
|
end
|
15
15
|
|
16
|
-
# Runs the dynamic Sass code and computes the CSS for the tree.
|
17
|
-
#
|
18
|
-
# @return [String] The compiled CSS.
|
16
|
+
# Runs the dynamic Sass code *and* computes the CSS for the tree.
|
17
|
+
# @see #to_s
|
19
18
|
def render
|
20
|
-
css_tree.css
|
21
|
-
end
|
22
|
-
|
23
|
-
# Runs the dynamic Sass code and computes the CSS for the tree, along with
|
24
|
-
# the sourcemap.
|
25
|
-
#
|
26
|
-
# @return [(String, Sass::Source::Map)] The compiled CSS, as well as
|
27
|
-
# the source map. @see #render
|
28
|
-
def render_with_sourcemap
|
29
|
-
css_tree.css_with_sourcemap
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def css_tree
|
35
19
|
Visitors::CheckNesting.visit(self)
|
36
20
|
result = Visitors::Perform.visit(self)
|
37
21
|
Visitors::CheckNesting.visit(result) # Check again to validate mixins
|
38
22
|
result, extends = Visitors::Cssize.visit(result)
|
39
23
|
Visitors::Extend.visit(result, extends)
|
40
|
-
result
|
24
|
+
result.to_s
|
41
25
|
end
|
42
26
|
end
|
43
27
|
end
|
data/lib/sass/tree/rule_node.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'pathname'
|
2
|
+
require 'uri'
|
2
3
|
|
3
4
|
module Sass::Tree
|
4
|
-
# A static node
|
5
|
+
# A static node reprenting a CSS rule.
|
5
6
|
#
|
6
7
|
# @see Sass::Tree
|
7
8
|
class RuleNode < Node
|
@@ -9,24 +10,24 @@ module Sass::Tree
|
|
9
10
|
PARENT = '&'
|
10
11
|
|
11
12
|
# The CSS selector for this rule,
|
12
|
-
# interspersed with {Sass::Script::
|
13
|
+
# interspersed with {Sass::Script::Node}s
|
13
14
|
# representing `#{}`-interpolation.
|
14
15
|
# Any adjacent strings will be merged together.
|
15
16
|
#
|
16
|
-
# @return [Array<String, Sass::Script::
|
17
|
+
# @return [Array<String, Sass::Script::Node>]
|
17
18
|
attr_accessor :rule
|
18
19
|
|
19
|
-
# The CSS selector for this rule,
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
20
|
+
# The CSS selector for this rule,
|
21
|
+
# without any unresolved interpolation
|
22
|
+
# but with parent references still intact.
|
23
|
+
# It's only set once {Tree::Node#perform} has been called.
|
23
24
|
#
|
24
25
|
# @return [Selector::CommaSequence]
|
25
26
|
attr_accessor :parsed_rules
|
26
27
|
|
27
|
-
# The CSS selector for this rule,
|
28
|
-
# interpolation or parent references.
|
29
|
-
# {Tree::Visitors::
|
28
|
+
# The CSS selector for this rule,
|
29
|
+
# without any unresolved interpolation or parent references.
|
30
|
+
# It's only set once {Tree::Visitors::Cssize} has been run.
|
30
31
|
#
|
31
32
|
# @return [Selector::CommaSequence]
|
32
33
|
attr_accessor :resolved_rules
|
@@ -43,10 +44,6 @@ module Sass::Tree
|
|
43
44
|
# @return [Fixnum]
|
44
45
|
attr_accessor :tabs
|
45
46
|
|
46
|
-
# The entire selector source range for this rule.
|
47
|
-
# @return [Sass::Source::Range]
|
48
|
-
attr_accessor :selector_source_range
|
49
|
-
|
50
47
|
# Whether or not this rule is the last rule in a nested group.
|
51
48
|
# This is only set in a CSS tree.
|
52
49
|
#
|
@@ -57,23 +54,16 @@ module Sass::Tree
|
|
57
54
|
# This is only readable in a CSS tree as it is written during the perform step
|
58
55
|
# and only when the :trace_selectors option is set.
|
59
56
|
#
|
60
|
-
# @return [String]
|
57
|
+
# @return [Array<String>]
|
61
58
|
attr_accessor :stack_trace
|
62
59
|
|
63
|
-
# @param rule [Array<String, Sass::Script::
|
64
|
-
# The CSS rule
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
@rule = [rule.to_s]
|
69
|
-
@parsed_rules = rule
|
70
|
-
else
|
71
|
-
merged = Sass::Util.merge_adjacent_strings(rule)
|
72
|
-
@rule = Sass::Util.strip_string_array(merged)
|
73
|
-
try_to_parse_non_interpolated_rules
|
74
|
-
end
|
75
|
-
@selector_source_range = selector_source_range
|
60
|
+
# @param rule [Array<String, Sass::Script::Node>]
|
61
|
+
# The CSS rule. See \{#rule}
|
62
|
+
def initialize(rule)
|
63
|
+
merged = Sass::Util.merge_adjacent_strings(rule)
|
64
|
+
@rule = Sass::Util.strip_string_array(merged)
|
76
65
|
@tabs = 0
|
66
|
+
try_to_parse_non_interpolated_rules
|
77
67
|
super()
|
78
68
|
end
|
79
69
|
|
@@ -115,13 +105,12 @@ module Sass::Tree
|
|
115
105
|
|
116
106
|
# A hash that will be associated with this rule in the CSS document
|
117
107
|
# if the {file:SASS_REFERENCE.md#debug_info-option `:debug_info` option} is enabled.
|
118
|
-
# This data is used by e.g. [the FireSass Firebug
|
119
|
-
# extension](https://addons.mozilla.org/en-US/firefox/addon/103988).
|
108
|
+
# This data is used by e.g. [the FireSass Firebug extension](https://addons.mozilla.org/en-US/firefox/addon/103988).
|
120
109
|
#
|
121
110
|
# @return [{#to_s => #to_s}]
|
122
111
|
def debug_info
|
123
|
-
{:filename => filename && ("file://" +
|
124
|
-
:line => line}
|
112
|
+
{:filename => filename && ("file://" + URI.escape(File.expand_path(filename))),
|
113
|
+
:line => self.line}
|
125
114
|
end
|
126
115
|
|
127
116
|
# A rule node is invisible if it has only placeholder selectors.
|
@@ -135,10 +124,8 @@ module Sass::Tree
|
|
135
124
|
if @rule.all? {|t| t.kind_of?(String)}
|
136
125
|
# We don't use real filename/line info because we don't have it yet.
|
137
126
|
# When we get it, we'll set it on the parsed rules if possible.
|
138
|
-
parser = Sass::SCSS::StaticParser.new(@rule.join.strip,
|
139
|
-
# rubocop:disable RescueModifier
|
127
|
+
parser = Sass::SCSS::StaticParser.new(@rule.join.strip, '', 1)
|
140
128
|
@parsed_rules = parser.parse_selector rescue nil
|
141
|
-
# rubocop:enable RescueModifier
|
142
129
|
end
|
143
130
|
end
|
144
131
|
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
module Sass::Tree
|
2
2
|
# A static node representing a `@supports` rule.
|
3
|
+
# `@supports` rules behave differently from other directives
|
4
|
+
# in that when they're nested within rules,
|
5
|
+
# they bubble up to top-level.
|
3
6
|
#
|
4
7
|
# @see Sass::Tree
|
5
8
|
class SupportsNode < DirectiveNode
|
@@ -13,10 +16,17 @@ module Sass::Tree
|
|
13
16
|
# @return [Sass::Supports::Condition]
|
14
17
|
attr_accessor :condition
|
15
18
|
|
19
|
+
# @see RuleNode#tabs
|
20
|
+
attr_accessor :tabs
|
21
|
+
|
22
|
+
# @see RuleNode#group_end
|
23
|
+
attr_accessor :group_end
|
24
|
+
|
16
25
|
# @param condition [Sass::Supports::Condition] See \{#condition}
|
17
26
|
def initialize(name, condition)
|
18
27
|
@name = name
|
19
28
|
@condition = condition
|
29
|
+
@tabs = 0
|
20
30
|
super('')
|
21
31
|
end
|
22
32
|
|
@@ -34,5 +44,8 @@ module Sass::Tree
|
|
34
44
|
def invisible?
|
35
45
|
children.all? {|c| c.invisible?}
|
36
46
|
end
|
47
|
+
|
48
|
+
# @see Node#bubbles?
|
49
|
+
def bubbles?; true; end
|
37
50
|
end
|
38
51
|
end
|
data/lib/sass/tree/trace_node.rb
CHANGED
@@ -7,7 +7,6 @@ module Sass::Tree
|
|
7
7
|
# @see Sass::Tree
|
8
8
|
class TraceNode < Node
|
9
9
|
# The name of the trace entry to add.
|
10
|
-
#
|
11
10
|
# @return [String]
|
12
11
|
attr_reader :name
|
13
12
|
|
@@ -20,7 +19,7 @@ module Sass::Tree
|
|
20
19
|
|
21
20
|
# Initializes this node from an existing node.
|
22
21
|
# @param name [String] The name of the trace entry to add.
|
23
|
-
# @param
|
22
|
+
# @param mixin [Node] The node to copy information from.
|
24
23
|
# @return [TraceNode]
|
25
24
|
def self.from_node(name, node)
|
26
25
|
trace = new(name)
|
@@ -9,26 +9,20 @@ module Sass
|
|
9
9
|
attr_reader :name
|
10
10
|
|
11
11
|
# The parse tree for the variable value.
|
12
|
-
# @return [Script::
|
12
|
+
# @return [Script::Node]
|
13
13
|
attr_accessor :expr
|
14
14
|
|
15
15
|
# Whether this is a guarded variable assignment (`!default`).
|
16
16
|
# @return [Boolean]
|
17
17
|
attr_reader :guarded
|
18
18
|
|
19
|
-
# Whether this is a global variable assignment (`!global`).
|
20
|
-
# @return [Boolean]
|
21
|
-
attr_reader :global
|
22
|
-
|
23
19
|
# @param name [String] The name of the variable
|
24
|
-
# @param expr [Script::
|
20
|
+
# @param expr [Script::Node] See \{#expr}
|
25
21
|
# @param guarded [Boolean] See \{#guarded}
|
26
|
-
|
27
|
-
def initialize(name, expr, guarded, global)
|
22
|
+
def initialize(name, expr, guarded)
|
28
23
|
@name = name
|
29
24
|
@expr = expr
|
30
25
|
@guarded = guarded
|
31
|
-
@global = global
|
32
26
|
super()
|
33
27
|
end
|
34
28
|
end
|
@@ -32,8 +32,9 @@ module Sass::Tree::Visitors
|
|
32
32
|
# @param node [Tree::Node] The node to visit.
|
33
33
|
# @return [Object] The return value of the `visit_*` method for this node.
|
34
34
|
def visit(node)
|
35
|
-
|
36
|
-
|
35
|
+
method = "visit_#{node_name node}"
|
36
|
+
if self.respond_to?(method, true)
|
37
|
+
self.send(method, node) {visit_children(node)}
|
37
38
|
else
|
38
39
|
visit_children(node)
|
39
40
|
end
|
@@ -52,13 +53,15 @@ module Sass::Tree::Visitors
|
|
52
53
|
parent.children.map {|c| visit(c)}
|
53
54
|
end
|
54
55
|
|
56
|
+
NODE_NAME_RE = /.*::(.*?)Node$/
|
57
|
+
|
55
58
|
# Returns the name of a node as used in the `visit_*` method.
|
56
59
|
#
|
57
60
|
# @param [Tree::Node] node The node.
|
58
61
|
# @return [String] The name.
|
59
|
-
def
|
60
|
-
|
61
|
-
node.class.
|
62
|
+
def node_name(node)
|
63
|
+
@@node_names ||= {}
|
64
|
+
@@node_names[node.class.name] ||= node.class.name.gsub(NODE_NAME_RE, '\\1').downcase
|
62
65
|
end
|
63
66
|
|
64
67
|
# `yield`s, then runs the visitor on the `@else` clause if the node has one.
|
@@ -7,9 +7,9 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def visit(node)
|
10
|
-
if
|
11
|
-
try_send(@parent
|
12
|
-
try_send(node
|
10
|
+
if error = @parent && (
|
11
|
+
try_send("invalid_#{node_name @parent}_child?", @parent, node) ||
|
12
|
+
try_send("invalid_#{node_name node}_parent?", @parent, node))
|
13
13
|
raise Sass::SyntaxError.new(error)
|
14
14
|
end
|
15
15
|
super
|
@@ -19,38 +19,17 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
19
19
|
end
|
20
20
|
|
21
21
|
CONTROL_NODES = [Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode,
|
22
|
-
|
22
|
+
Sass::Tree::WhileNode, Sass::Tree::TraceNode]
|
23
23
|
SCRIPT_NODES = [Sass::Tree::ImportNode] + CONTROL_NODES
|
24
24
|
def visit_children(parent)
|
25
25
|
old_parent = @parent
|
26
|
-
|
27
|
-
|
28
|
-
# nodes where they don't belong.
|
29
|
-
if parent.is_a?(Sass::Tree::AtRootNode) && parent.resolved_value
|
30
|
-
old_parents = @parents
|
31
|
-
@parents = @parents.reject {|p| parent.exclude_node?(p)}
|
32
|
-
@parent = Sass::Util.enum_with_index(@parents.reverse).
|
33
|
-
find {|p, i| !transparent_parent?(p, @parents[-i - 2])}.first
|
34
|
-
|
35
|
-
begin
|
36
|
-
return super
|
37
|
-
ensure
|
38
|
-
@parents = old_parents
|
39
|
-
@parent = old_parent
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
unless transparent_parent?(parent, old_parent)
|
44
|
-
@parent = parent
|
45
|
-
end
|
46
|
-
|
26
|
+
@parent = parent unless is_any_of?(parent, SCRIPT_NODES) ||
|
27
|
+
(parent.bubbles? && !old_parent.is_a?(Sass::Tree::RootNode))
|
47
28
|
@parents.push parent
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
@parents.pop
|
53
|
-
end
|
29
|
+
super
|
30
|
+
ensure
|
31
|
+
@parent = old_parent
|
32
|
+
@parents.pop
|
54
33
|
end
|
55
34
|
|
56
35
|
def visit_root(node)
|
@@ -123,7 +102,7 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
123
102
|
|
124
103
|
VALID_FUNCTION_CHILDREN = [
|
125
104
|
Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::ReturnNode,
|
126
|
-
Sass::Tree::VariableNode, Sass::Tree::WarnNode
|
105
|
+
Sass::Tree::VariableNode, Sass::Tree::WarnNode
|
127
106
|
] + CONTROL_NODES
|
128
107
|
def invalid_function_child?(parent, child)
|
129
108
|
unless is_any_of?(child, VALID_FUNCTION_CHILDREN)
|
@@ -131,21 +110,19 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
131
110
|
end
|
132
111
|
end
|
133
112
|
|
134
|
-
VALID_PROP_CHILDREN =
|
135
|
-
Sass::Tree::PropNode,
|
136
|
-
Sass::Tree::MixinNode]
|
113
|
+
VALID_PROP_CHILDREN = [Sass::Tree::CommentNode, Sass::Tree::PropNode, Sass::Tree::MixinNode] + CONTROL_NODES
|
137
114
|
def invalid_prop_child?(parent, child)
|
138
115
|
unless is_any_of?(child, VALID_PROP_CHILDREN)
|
139
116
|
"Illegal nesting: Only properties may be nested beneath properties."
|
140
117
|
end
|
141
118
|
end
|
142
119
|
|
143
|
-
VALID_PROP_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::
|
144
|
-
Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode,
|
120
|
+
VALID_PROP_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::PropNode,
|
121
|
+
Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode,
|
122
|
+
Sass::Tree::MixinNode]
|
145
123
|
def invalid_prop_parent?(parent, child)
|
146
124
|
unless is_any_of?(parent, VALID_PROP_PARENTS)
|
147
|
-
"Properties are only allowed within rules, directives, mixin includes, or other properties." +
|
148
|
-
child.pseudo_class_selector_message
|
125
|
+
"Properties are only allowed within rules, directives, mixin includes, or other properties." + child.pseudo_class_selector_message
|
149
126
|
end
|
150
127
|
end
|
151
128
|
|
@@ -155,19 +132,11 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
155
132
|
|
156
133
|
private
|
157
134
|
|
158
|
-
# Whether `parent` should be assigned to `@parent`.
|
159
|
-
def transparent_parent?(parent, grandparent)
|
160
|
-
is_any_of?(parent, SCRIPT_NODES) ||
|
161
|
-
(parent.bubbles? &&
|
162
|
-
!grandparent.is_a?(Sass::Tree::RootNode) &&
|
163
|
-
!grandparent.is_a?(Sass::Tree::AtRootNode))
|
164
|
-
end
|
165
|
-
|
166
135
|
def is_any_of?(val, classes)
|
167
|
-
|
136
|
+
for c in classes
|
168
137
|
return true if val.is_a?(c)
|
169
138
|
end
|
170
|
-
false
|
139
|
+
return false
|
171
140
|
end
|
172
141
|
|
173
142
|
def try_send(method, *args)
|
@@ -175,3 +144,4 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
175
144
|
send(method, *args)
|
176
145
|
end
|
177
146
|
end
|
147
|
+
|