sass 3.2.0.alpha.11 → 3.2.0.alpha.21
Sign up to get free protection for your applications and to get access to all the features.
- data/REVISION +1 -1
- data/VERSION +1 -1
- data/lib/sass/cache_stores/base.rb +4 -9
- data/lib/sass/cache_stores/filesystem.rb +2 -0
- data/lib/sass/css.rb +2 -1
- data/lib/sass/engine.rb +28 -8
- data/lib/sass/environment.rb +26 -0
- data/lib/sass/exec.rb +13 -0
- data/lib/sass/importers/base.rb +2 -1
- data/lib/sass/script/funcall.rb +8 -0
- data/lib/sass/script/interpolation.rb +9 -0
- data/lib/sass/script/list.rb +7 -0
- data/lib/sass/script/literal.rb +5 -0
- data/lib/sass/script/node.rb +8 -0
- data/lib/sass/script/number.rb +28 -5
- data/lib/sass/script/operation.rb +8 -0
- data/lib/sass/script/string_interpolation.rb +9 -0
- data/lib/sass/script/unary_operation.rb +7 -0
- data/lib/sass/script/variable.rb +5 -0
- data/lib/sass/scss/parser.rb +26 -13
- data/lib/sass/scss/rx.rb +1 -1
- data/lib/sass/scss/static_parser.rb +2 -2
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/debug_node.rb +1 -6
- data/lib/sass/tree/each_node.rb +1 -7
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/for_node.rb +2 -7
- data/lib/sass/tree/function_node.rb +1 -6
- data/lib/sass/tree/if_node.rb +1 -19
- data/lib/sass/tree/mixin_def_node.rb +5 -6
- data/lib/sass/tree/mixin_node.rb +2 -7
- data/lib/sass/tree/node.rb +4 -19
- data/lib/sass/tree/prop_node.rb +0 -5
- data/lib/sass/tree/return_node.rb +1 -6
- data/lib/sass/tree/rule_node.rb +9 -7
- data/lib/sass/tree/trace_node.rb +32 -0
- data/lib/sass/tree/variable_node.rb +1 -7
- data/lib/sass/tree/visitors/check_nesting.rb +30 -13
- data/lib/sass/tree/visitors/convert.rb +5 -1
- data/lib/sass/tree/visitors/cssize.rb +3 -3
- data/lib/sass/tree/visitors/deep_copy.rb +87 -0
- data/lib/sass/tree/visitors/perform.rb +36 -16
- data/lib/sass/tree/visitors/set_options.rb +97 -0
- data/lib/sass/tree/visitors/to_css.rb +5 -1
- data/lib/sass/tree/warn_node.rb +1 -7
- data/lib/sass/tree/while_node.rb +1 -7
- data/test/sass/cache_test.rb +15 -0
- data/test/sass/conversion_test.rb +38 -0
- data/test/sass/css2sass_test.rb +9 -0
- data/test/sass/engine_test.rb +248 -17
- data/test/sass/scss/css_test.rb +4 -2
- data/test/sass/scss/scss_test.rb +53 -12
- data/vendor/fssm/Gemfile +3 -0
- data/vendor/fssm/LICENSE +1 -1
- data/vendor/fssm/README.markdown +55 -27
- data/vendor/fssm/Rakefile +6 -54
- data/vendor/fssm/example.rb +6 -3
- data/vendor/fssm/fssm.gemspec +17 -70
- data/vendor/fssm/lib/fssm.rb +7 -3
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
- data/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
- data/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
- data/vendor/fssm/lib/fssm/backends/rbfsevent.rb +42 -0
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
- data/vendor/fssm/lib/fssm/monitor.rb +19 -9
- data/vendor/fssm/lib/fssm/path.rb +24 -21
- data/vendor/fssm/lib/fssm/pathname.rb +13 -479
- data/vendor/fssm/lib/fssm/state/directory.rb +29 -11
- data/vendor/fssm/lib/fssm/state/file.rb +1 -1
- data/vendor/fssm/lib/fssm/support.rb +41 -12
- data/vendor/fssm/lib/fssm/tree.rb +6 -6
- data/vendor/fssm/lib/fssm/version.rb +3 -0
- data/vendor/fssm/profile/prof-cache.rb +3 -3
- data/vendor/fssm/profile/prof-pathname-rubinius.rb +35 -0
- data/vendor/fssm/profile/prof-pathname.rb +7 -7
- data/vendor/fssm/spec/count_down_latch.rb +151 -0
- data/vendor/fssm/spec/monitor_spec.rb +202 -0
- data/vendor/fssm/spec/path_spec.rb +36 -15
- data/vendor/fssm/spec/spec_helper.rb +6 -6
- metadata +14 -4
- data/vendor/fssm/VERSION.yml +0 -5
data/lib/sass/scss/rx.rb
CHANGED
@@ -110,7 +110,7 @@ module Sass
|
|
110
110
|
# Custom
|
111
111
|
HEXCOLOR = /\#[0-9a-fA-F]+/
|
112
112
|
INTERP_START = /#\{/
|
113
|
-
|
113
|
+
ANY = /:(-[-\w]+-)?any\(/i
|
114
114
|
|
115
115
|
STRING1_NOINTERP = /\"((?:[^\n\r\f\\"#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\"/
|
116
116
|
STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\'/
|
@@ -13,12 +13,12 @@ module Sass
|
|
13
13
|
# Used for error reporting.
|
14
14
|
# @return [Selector::CommaSequence] The parsed selector
|
15
15
|
# @raise [Sass::SyntaxError] if there's a syntax error in the selector
|
16
|
-
def parse_selector
|
16
|
+
def parse_selector
|
17
17
|
init_scanner!
|
18
18
|
seq = expr!(:selector_comma_sequence)
|
19
19
|
expected("selector") unless @scanner.eos?
|
20
20
|
seq.line = @line
|
21
|
-
seq.filename = filename
|
21
|
+
seq.filename = @filename
|
22
22
|
seq
|
23
23
|
end
|
24
24
|
|
data/lib/sass/tree/debug_node.rb
CHANGED
@@ -6,12 +6,7 @@ module Sass
|
|
6
6
|
class DebugNode < Node
|
7
7
|
# The expression to print.
|
8
8
|
# @return [Script::Node]
|
9
|
-
|
10
|
-
|
11
|
-
# Returns sub nodes that are not tree children.
|
12
|
-
def subnodes
|
13
|
-
Array(expr)
|
14
|
-
end
|
9
|
+
attr_accessor :expr
|
15
10
|
|
16
11
|
# @param expr [Script::Node] The expression to print
|
17
12
|
def initialize(expr)
|
data/lib/sass/tree/each_node.rb
CHANGED
@@ -11,7 +11,7 @@ module Sass::Tree
|
|
11
11
|
|
12
12
|
# The parse tree for the list.
|
13
13
|
# @param [Script::Node]
|
14
|
-
|
14
|
+
attr_accessor :list
|
15
15
|
|
16
16
|
# @param var [String] The name of the loop variable
|
17
17
|
# @param list [Script::Node] The parse tree for the list
|
@@ -20,11 +20,5 @@ module Sass::Tree
|
|
20
20
|
@list = list
|
21
21
|
super()
|
22
22
|
end
|
23
|
-
|
24
|
-
# Returns sub nodes that are not tree children.
|
25
|
-
def subnodes
|
26
|
-
Array(list)
|
27
|
-
end
|
28
|
-
|
29
23
|
end
|
30
24
|
end
|
data/lib/sass/tree/for_node.rb
CHANGED
@@ -11,11 +11,11 @@ module Sass::Tree
|
|
11
11
|
|
12
12
|
# The parse tree for the initial expression.
|
13
13
|
# @return [Script::Node]
|
14
|
-
|
14
|
+
attr_accessor :from
|
15
15
|
|
16
16
|
# The parse tree for the final expression.
|
17
17
|
# @return [Script::Node]
|
18
|
-
|
18
|
+
attr_accessor :to
|
19
19
|
|
20
20
|
# Whether to include `to` in the loop or stop just before.
|
21
21
|
# @return [Boolean]
|
@@ -32,10 +32,5 @@ module Sass::Tree
|
|
32
32
|
@exclusive = exclusive
|
33
33
|
super()
|
34
34
|
end
|
35
|
-
|
36
|
-
# Returns sub nodes that are not tree children.
|
37
|
-
def subnodes
|
38
|
-
Array(from) + Array(to)
|
39
|
-
end
|
40
35
|
end
|
41
36
|
end
|
@@ -13,7 +13,7 @@ module Sass
|
|
13
13
|
# the default value of the argument
|
14
14
|
#
|
15
15
|
# @return [Array<Script::Node>]
|
16
|
-
|
16
|
+
attr_accessor :args
|
17
17
|
|
18
18
|
# @param name [String] The function name
|
19
19
|
# @param args [Array<(Script::Node, Script::Node)>] The arguments for the function.
|
@@ -22,11 +22,6 @@ module Sass
|
|
22
22
|
@args = args
|
23
23
|
super()
|
24
24
|
end
|
25
|
-
|
26
|
-
# Returns sub nodes that are not tree children.
|
27
|
-
def subnodes
|
28
|
-
Array(args)
|
29
|
-
end
|
30
25
|
end
|
31
26
|
end
|
32
27
|
end
|
data/lib/sass/tree/if_node.rb
CHANGED
@@ -13,7 +13,7 @@ module Sass::Tree
|
|
13
13
|
# If this is nil, this is an `@else` node, not an `@else if`.
|
14
14
|
#
|
15
15
|
# @return [Script::Expr]
|
16
|
-
|
16
|
+
attr_accessor :expr
|
17
17
|
|
18
18
|
# The next {IfNode} in the if-else list, or `nil`.
|
19
19
|
#
|
@@ -35,12 +35,6 @@ module Sass::Tree
|
|
35
35
|
@last_else = node
|
36
36
|
end
|
37
37
|
|
38
|
-
# @see Node#options=
|
39
|
-
def options=(options)
|
40
|
-
super
|
41
|
-
self.else.options = options if self.else
|
42
|
-
end
|
43
|
-
|
44
38
|
def _dump(f)
|
45
39
|
Marshal.dump([self.expr, self.else, self.children])
|
46
40
|
end
|
@@ -54,17 +48,5 @@ module Sass::Tree
|
|
54
48
|
node.else ? node.else.instance_variable_get('@last_else') : node)
|
55
49
|
node
|
56
50
|
end
|
57
|
-
|
58
|
-
# @see Node#deep_copy
|
59
|
-
def deep_copy
|
60
|
-
node = super
|
61
|
-
node.else = self.else.deep_copy if self.else
|
62
|
-
node
|
63
|
-
end
|
64
|
-
|
65
|
-
# Returns sub nodes that are not tree children.
|
66
|
-
def subnodes
|
67
|
-
Array(expr) + Array(self.else)
|
68
|
-
end
|
69
51
|
end
|
70
52
|
end
|
@@ -13,7 +13,11 @@ module Sass
|
|
13
13
|
# and the parse tree for the default value of the argument.
|
14
14
|
#
|
15
15
|
# @return [Array<(Script::Node, Script::Node)>]
|
16
|
-
|
16
|
+
attr_accessor :args
|
17
|
+
|
18
|
+
# Whether the mixin uses `@content`. Set during the nesting check phase.
|
19
|
+
# @return [Boolean]
|
20
|
+
attr_accessor :has_content
|
17
21
|
|
18
22
|
# @param name [String] The mixin name
|
19
23
|
# @param args [Array<(Script::Node, Script::Node)>] See \{#args}
|
@@ -22,11 +26,6 @@ module Sass
|
|
22
26
|
@args = args
|
23
27
|
super()
|
24
28
|
end
|
25
|
-
|
26
|
-
# Returns sub nodes that are not tree children.
|
27
|
-
def subnodes
|
28
|
-
Array(args)
|
29
|
-
end
|
30
29
|
end
|
31
30
|
end
|
32
31
|
end
|
data/lib/sass/tree/mixin_node.rb
CHANGED
@@ -13,11 +13,11 @@ module Sass::Tree
|
|
13
13
|
|
14
14
|
# The arguments to the mixin.
|
15
15
|
# @return [Array<Script::Node>]
|
16
|
-
|
16
|
+
attr_accessor :args
|
17
17
|
|
18
18
|
# A hash from keyword argument names to values.
|
19
19
|
# @return [{String => Script::Node}]
|
20
|
-
|
20
|
+
attr_accessor :keywords
|
21
21
|
|
22
22
|
# @param name [String] The name of the mixin
|
23
23
|
# @param args [Array<Script::Node>] See \{#args}
|
@@ -28,10 +28,5 @@ module Sass::Tree
|
|
28
28
|
@keywords = keywords
|
29
29
|
super()
|
30
30
|
end
|
31
|
-
|
32
|
-
# Returns sub nodes that are not tree children.
|
33
|
-
def subnodes
|
34
|
-
Array(args) + (keywords||{}).values
|
35
|
-
end
|
36
31
|
end
|
37
32
|
end
|
data/lib/sass/tree/node.rb
CHANGED
@@ -14,7 +14,8 @@ module Sass
|
|
14
14
|
# The nodes in this state are in the same structure as the Sass document:
|
15
15
|
# rules and properties are nested beneath one another.
|
16
16
|
# Nodes that can be in this state or in the dynamic state
|
17
|
-
# are called **static nodes
|
17
|
+
# are called **static nodes**; nodes that can only be in this state
|
18
|
+
# are called **solely static nodes**.
|
18
19
|
#
|
19
20
|
# {Tree::Visitors::Cssize} is then used to create a static CSS tree.
|
20
21
|
# This is like a static Sass tree,
|
@@ -65,11 +66,7 @@ module Sass
|
|
65
66
|
# @param options [{Symbol => Object}] The options
|
66
67
|
# @see #options
|
67
68
|
def options=(options)
|
68
|
-
|
69
|
-
if respond_to?(:subnodes)
|
70
|
-
subnodes.each {|n| n.options = options if n.respond_to?(:options=)}
|
71
|
-
end
|
72
|
-
@options = options
|
69
|
+
Sass::Tree::Visitors::SetOptions.visit(self, options)
|
73
70
|
end
|
74
71
|
|
75
72
|
# @private
|
@@ -188,19 +185,7 @@ module Sass
|
|
188
185
|
#
|
189
186
|
# @return [Node]
|
190
187
|
def deep_copy
|
191
|
-
|
192
|
-
node.children = children.map {|c| c.deep_copy}
|
193
|
-
node
|
194
|
-
end
|
195
|
-
|
196
|
-
def before_sass_cache_store
|
197
|
-
o = self.options
|
198
|
-
self.options = {}
|
199
|
-
return o
|
200
|
-
end
|
201
|
-
|
202
|
-
def after_sass_cache_store(o)
|
203
|
-
self.options = o
|
188
|
+
Sass::Tree::Visitors::DeepCopy.visit(self)
|
204
189
|
end
|
205
190
|
|
206
191
|
protected
|
data/lib/sass/tree/prop_node.rb
CHANGED
@@ -55,11 +55,6 @@ module Sass::Tree
|
|
55
55
|
super()
|
56
56
|
end
|
57
57
|
|
58
|
-
# Returns sub nodes that are not tree children.
|
59
|
-
def subnodes
|
60
|
-
Array(name).select{|n| n.is_a?(Sass::Script::Node)} + [value]
|
61
|
-
end
|
62
|
-
|
63
58
|
# Compares the names and values of two properties.
|
64
59
|
#
|
65
60
|
# @param other [Object] The object to compare with
|
@@ -6,18 +6,13 @@ module Sass
|
|
6
6
|
class ReturnNode < Node
|
7
7
|
# The expression to return.
|
8
8
|
# @type [Script::Node]
|
9
|
-
|
9
|
+
attr_accessor :expr
|
10
10
|
|
11
11
|
# @param expr [Script::Node] The expression to return
|
12
12
|
def initialize(expr)
|
13
13
|
@expr = expr
|
14
14
|
super()
|
15
15
|
end
|
16
|
-
|
17
|
-
# Returns sub nodes that are not tree children.
|
18
|
-
def subnodes
|
19
|
-
Array(expr)
|
20
|
-
end
|
21
16
|
end
|
22
17
|
end
|
23
18
|
end
|
data/lib/sass/tree/rule_node.rb
CHANGED
@@ -50,6 +50,13 @@ module Sass::Tree
|
|
50
50
|
# @return [Boolean]
|
51
51
|
attr_accessor :group_end
|
52
52
|
|
53
|
+
# The stack trace.
|
54
|
+
# This is only readable in a CSS tree as it is written during the perform step
|
55
|
+
# and only when the :trace_selectors option is set.
|
56
|
+
#
|
57
|
+
# @return [Array<String>]
|
58
|
+
attr_accessor :stack_trace
|
59
|
+
|
53
60
|
# @param rule [Array<String, Sass::Script::Node>]
|
54
61
|
# The CSS rule. See \{#rule}
|
55
62
|
def initialize(rule)
|
@@ -115,19 +122,14 @@ module Sass::Tree
|
|
115
122
|
:line => self.line}
|
116
123
|
end
|
117
124
|
|
118
|
-
# Returns sub nodes that are not tree children.
|
119
|
-
def subnodes
|
120
|
-
rule.select{|r| r.is_a?(Sass::Script::Node)}
|
121
|
-
end
|
122
|
-
|
123
125
|
private
|
124
126
|
|
125
127
|
def try_to_parse_non_interpolated_rules
|
126
128
|
if @rule.all? {|t| t.kind_of?(String)}
|
127
129
|
# We don't use real filename/line info because we don't have it yet.
|
128
130
|
# When we get it, we'll set it on the parsed rules if possible.
|
129
|
-
parser = Sass::SCSS::StaticParser.new(@rule.join.strip, 1)
|
130
|
-
@parsed_rules = parser.parse_selector
|
131
|
+
parser = Sass::SCSS::StaticParser.new(@rule.join.strip, '', 1)
|
132
|
+
@parsed_rules = parser.parse_selector rescue nil
|
131
133
|
end
|
132
134
|
end
|
133
135
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'sass/tree/node'
|
2
|
+
|
3
|
+
module Sass::Tree
|
4
|
+
# A solely static node left over after a mixin include or @content has been performed.
|
5
|
+
# Its sole purpose is to wrap exceptions to add to the backtrace.
|
6
|
+
#
|
7
|
+
# @see Sass::Tree
|
8
|
+
class TraceNode < Node
|
9
|
+
# The name of the trace entry to add.
|
10
|
+
# @return [String]
|
11
|
+
attr_reader :name
|
12
|
+
|
13
|
+
# @param name [String] The name of the trace entry to add.
|
14
|
+
def initialize(name)
|
15
|
+
@name = name
|
16
|
+
self.has_children = true
|
17
|
+
super()
|
18
|
+
end
|
19
|
+
|
20
|
+
# Initializes this node from an existing node.
|
21
|
+
# @param name [String] The name of the trace entry to add.
|
22
|
+
# @param mixin [Node] The node to copy information from.
|
23
|
+
# @return [TraceNode]
|
24
|
+
def self.from_node(name, node)
|
25
|
+
trace = new(name)
|
26
|
+
trace.line = node.line
|
27
|
+
trace.filename = node.filename
|
28
|
+
trace.options = node.options
|
29
|
+
trace
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -10,7 +10,7 @@ module Sass
|
|
10
10
|
|
11
11
|
# The parse tree for the variable value.
|
12
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]
|
@@ -25,12 +25,6 @@ module Sass
|
|
25
25
|
@guarded = guarded
|
26
26
|
super()
|
27
27
|
end
|
28
|
-
|
29
|
-
# Returns sub nodes that are not tree children.
|
30
|
-
def subnodes
|
31
|
-
Array(expr)
|
32
|
-
end
|
33
|
-
|
34
28
|
end
|
35
29
|
end
|
36
30
|
end
|
@@ -18,7 +18,7 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
18
18
|
end
|
19
19
|
|
20
20
|
PARENT_CLASSES = [ Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode,
|
21
|
-
Sass::Tree::ImportNode, Sass::Tree::
|
21
|
+
Sass::Tree::ImportNode, Sass::Tree::TraceNode, Sass::Tree::WhileNode]
|
22
22
|
def visit_children(parent)
|
23
23
|
old_parent = @parent
|
24
24
|
@parent = parent unless is_any_of?(parent, PARENT_CLASSES)
|
@@ -44,13 +44,29 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
44
44
|
raise e
|
45
45
|
end
|
46
46
|
|
47
|
+
def visit_mixindef(node)
|
48
|
+
@current_mixin_def, old_mixin_def = node, @current_mixin_def
|
49
|
+
yield
|
50
|
+
ensure
|
51
|
+
@current_mixin_def = old_mixin_def
|
52
|
+
end
|
53
|
+
|
54
|
+
def invalid_content_parent?(parent, child)
|
55
|
+
if @current_mixin_def
|
56
|
+
@current_mixin_def.has_content = true
|
57
|
+
nil
|
58
|
+
else
|
59
|
+
"@content may only be used within a mixin."
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
47
63
|
def invalid_charset_parent?(parent, child)
|
48
64
|
"@charset may only be used at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
49
65
|
end
|
50
66
|
|
51
|
-
|
67
|
+
VALID_EXTEND_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::MixinDefNode, Sass::Tree::MixinNode]
|
52
68
|
def invalid_extend_parent?(parent, child)
|
53
|
-
unless is_any_of?(parent,
|
69
|
+
unless is_any_of?(parent, VALID_EXTEND_PARENTS)
|
54
70
|
"Extend directives may only be used within rules."
|
55
71
|
end
|
56
72
|
end
|
@@ -59,20 +75,20 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
59
75
|
"Functions may only be defined at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
60
76
|
end
|
61
77
|
|
62
|
-
|
78
|
+
VALID_FUNCTION_CHILDREN = [
|
63
79
|
Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::EachNode,
|
64
80
|
Sass::Tree::ForNode, Sass::Tree::IfNode, Sass::Tree::ReturnNode,
|
65
81
|
Sass::Tree::VariableNode, Sass::Tree::WarnNode, Sass::Tree::WhileNode
|
66
82
|
]
|
67
83
|
def invalid_function_child?(parent, child)
|
68
|
-
unless is_any_of?(child,
|
84
|
+
unless is_any_of?(child, VALID_FUNCTION_CHILDREN)
|
69
85
|
"Functions can only contain variable declarations and control directives."
|
70
86
|
end
|
71
87
|
end
|
72
88
|
|
73
89
|
INVALID_IMPORT_PARENTS = [
|
74
|
-
Sass::Tree::IfNode, Sass::Tree::ForNode,
|
75
|
-
Sass::Tree::EachNode, Sass::Tree::MixinDefNode
|
90
|
+
Sass::Tree::IfNode, Sass::Tree::ForNode, Sass::Tree::WhileNode,
|
91
|
+
Sass::Tree::EachNode, Sass::Tree::MixinDefNode, Sass::Tree::MixinNode
|
76
92
|
]
|
77
93
|
def invalid_import_parent?(parent, child)
|
78
94
|
if is_any_of?(@real_parent, INVALID_IMPORT_PARENTS)
|
@@ -98,18 +114,19 @@ class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
|
|
98
114
|
"Mixins may only be defined at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
|
99
115
|
end
|
100
116
|
|
101
|
-
|
117
|
+
VALID_PROP_CHILDREN = [Sass::Tree::CommentNode, Sass::Tree::PropNode]
|
102
118
|
def invalid_prop_child?(parent, child)
|
103
|
-
unless is_any_of?(child,
|
119
|
+
unless is_any_of?(child, VALID_PROP_CHILDREN)
|
104
120
|
"Illegal nesting: Only properties may be nested beneath properties."
|
105
121
|
end
|
106
122
|
end
|
107
123
|
|
108
|
-
|
109
|
-
|
124
|
+
VALID_PROP_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::PropNode,
|
125
|
+
Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode,
|
126
|
+
Sass::Tree::MixinNode]
|
110
127
|
def invalid_prop_parent?(parent, child)
|
111
|
-
unless is_any_of?(parent,
|
112
|
-
"Properties are only allowed within rules, directives, or other properties." + child.pseudo_class_selector_message
|
128
|
+
unless is_any_of?(parent, VALID_PROP_PARENTS)
|
129
|
+
"Properties are only allowed within rules, directives, mixin includes, or other properties." + child.pseudo_class_selector_message
|
113
130
|
end
|
114
131
|
end
|
115
132
|
|