oreorenasass 3.4.4 → 3.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +50 -70
  4. data/Rakefile +5 -26
  5. data/VERSION +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/bin/sass +1 -1
  8. data/bin/scss +1 -1
  9. data/lib/sass.rb +12 -19
  10. data/lib/sass/cache_stores/base.rb +2 -2
  11. data/lib/sass/cache_stores/chain.rb +1 -2
  12. data/lib/sass/cache_stores/filesystem.rb +5 -1
  13. data/lib/sass/cache_stores/memory.rb +1 -1
  14. data/lib/sass/cache_stores/null.rb +2 -2
  15. data/lib/sass/callbacks.rb +0 -1
  16. data/lib/sass/css.rb +13 -11
  17. data/lib/sass/engine.rb +173 -424
  18. data/lib/sass/environment.rb +58 -148
  19. data/lib/sass/error.rb +14 -11
  20. data/lib/sass/exec.rb +703 -5
  21. data/lib/sass/importers/base.rb +6 -49
  22. data/lib/sass/importers/filesystem.rb +19 -44
  23. data/lib/sass/logger.rb +4 -1
  24. data/lib/sass/logger/base.rb +4 -2
  25. data/lib/sass/logger/log_level.rb +7 -3
  26. data/lib/sass/media.rb +23 -20
  27. data/lib/sass/plugin.rb +7 -7
  28. data/lib/sass/plugin/compiler.rb +145 -304
  29. data/lib/sass/plugin/configuration.rb +23 -18
  30. data/lib/sass/plugin/merb.rb +1 -1
  31. data/lib/sass/plugin/staleness_checker.rb +3 -3
  32. data/lib/sass/repl.rb +3 -3
  33. data/lib/sass/script.rb +8 -35
  34. data/lib/sass/script/{value/arg_list.rb → arg_list.rb} +25 -9
  35. data/lib/sass/script/bool.rb +18 -0
  36. data/lib/sass/script/color.rb +606 -0
  37. data/lib/sass/script/css_lexer.rb +4 -8
  38. data/lib/sass/script/css_parser.rb +2 -5
  39. data/lib/sass/script/funcall.rb +245 -0
  40. data/lib/sass/script/functions.rb +408 -1491
  41. data/lib/sass/script/interpolation.rb +79 -0
  42. data/lib/sass/script/lexer.rb +68 -172
  43. data/lib/sass/script/list.rb +85 -0
  44. data/lib/sass/script/literal.rb +221 -0
  45. data/lib/sass/script/{tree/node.rb → node.rb} +12 -22
  46. data/lib/sass/script/{value/null.rb → null.rb} +7 -14
  47. data/lib/sass/script/{value/number.rb → number.rb} +75 -152
  48. data/lib/sass/script/{tree/operation.rb → operation.rb} +24 -17
  49. data/lib/sass/script/parser.rb +110 -245
  50. data/lib/sass/script/string.rb +51 -0
  51. data/lib/sass/script/{tree/string_interpolation.rb → string_interpolation.rb} +4 -5
  52. data/lib/sass/script/{tree/unary_operation.rb → unary_operation.rb} +6 -6
  53. data/lib/sass/script/variable.rb +58 -0
  54. data/lib/sass/scss/css_parser.rb +3 -9
  55. data/lib/sass/scss/parser.rb +421 -450
  56. data/lib/sass/scss/rx.rb +11 -19
  57. data/lib/sass/scss/static_parser.rb +7 -321
  58. data/lib/sass/selector.rb +194 -68
  59. data/lib/sass/selector/abstract_sequence.rb +14 -29
  60. data/lib/sass/selector/comma_sequence.rb +25 -108
  61. data/lib/sass/selector/sequence.rb +66 -159
  62. data/lib/sass/selector/simple.rb +25 -23
  63. data/lib/sass/selector/simple_sequence.rb +63 -173
  64. data/lib/sass/shared.rb +1 -1
  65. data/lib/sass/supports.rb +15 -13
  66. data/lib/sass/tree/charset_node.rb +1 -1
  67. data/lib/sass/tree/comment_node.rb +3 -3
  68. data/lib/sass/tree/css_import_node.rb +11 -11
  69. data/lib/sass/tree/debug_node.rb +2 -2
  70. data/lib/sass/tree/directive_node.rb +4 -21
  71. data/lib/sass/tree/each_node.rb +8 -8
  72. data/lib/sass/tree/extend_node.rb +7 -14
  73. data/lib/sass/tree/for_node.rb +4 -4
  74. data/lib/sass/tree/function_node.rb +4 -9
  75. data/lib/sass/tree/if_node.rb +1 -1
  76. data/lib/sass/tree/import_node.rb +5 -4
  77. data/lib/sass/tree/media_node.rb +14 -4
  78. data/lib/sass/tree/mixin_def_node.rb +4 -4
  79. data/lib/sass/tree/mixin_node.rb +8 -21
  80. data/lib/sass/tree/node.rb +12 -54
  81. data/lib/sass/tree/prop_node.rb +20 -39
  82. data/lib/sass/tree/return_node.rb +2 -3
  83. data/lib/sass/tree/root_node.rb +3 -19
  84. data/lib/sass/tree/rule_node.rb +22 -35
  85. data/lib/sass/tree/supports_node.rb +13 -0
  86. data/lib/sass/tree/trace_node.rb +1 -2
  87. data/lib/sass/tree/variable_node.rb +3 -9
  88. data/lib/sass/tree/visitors/base.rb +8 -5
  89. data/lib/sass/tree/visitors/check_nesting.rb +19 -49
  90. data/lib/sass/tree/visitors/convert.rb +56 -74
  91. data/lib/sass/tree/visitors/cssize.rb +74 -202
  92. data/lib/sass/tree/visitors/deep_copy.rb +5 -10
  93. data/lib/sass/tree/visitors/extend.rb +7 -7
  94. data/lib/sass/tree/visitors/perform.rb +185 -278
  95. data/lib/sass/tree/visitors/set_options.rb +6 -20
  96. data/lib/sass/tree/visitors/to_css.rb +81 -234
  97. data/lib/sass/tree/warn_node.rb +2 -2
  98. data/lib/sass/tree/while_node.rb +2 -2
  99. data/lib/sass/util.rb +152 -522
  100. data/lib/sass/util/multibyte_string_scanner.rb +0 -2
  101. data/lib/sass/util/subset_map.rb +3 -4
  102. data/lib/sass/util/test.rb +1 -0
  103. data/lib/sass/version.rb +22 -20
  104. data/test/Gemfile +3 -0
  105. data/test/Gemfile.lock +10 -0
  106. data/test/sass/cache_test.rb +20 -62
  107. data/test/sass/callbacks_test.rb +1 -1
  108. data/test/sass/conversion_test.rb +2 -296
  109. data/test/sass/css2sass_test.rb +4 -23
  110. data/test/sass/engine_test.rb +354 -411
  111. data/test/sass/exec_test.rb +2 -2
  112. data/test/sass/extend_test.rb +145 -324
  113. data/test/sass/functions_test.rb +86 -873
  114. data/test/sass/importer_test.rb +21 -241
  115. data/test/sass/logger_test.rb +1 -1
  116. data/test/sass/more_results/more_import.css +1 -1
  117. data/test/sass/plugin_test.rb +26 -16
  118. data/test/sass/results/compact.css +1 -1
  119. data/test/sass/results/complex.css +4 -4
  120. data/test/sass/results/expanded.css +1 -1
  121. data/test/sass/results/import.css +1 -1
  122. data/test/sass/results/import_charset_ibm866.css +2 -2
  123. data/test/sass/results/mixins.css +17 -17
  124. data/test/sass/results/nested.css +1 -1
  125. data/test/sass/results/parent_ref.css +2 -2
  126. data/test/sass/results/script.css +3 -3
  127. data/test/sass/results/scss_import.css +1 -1
  128. data/test/sass/script_conversion_test.rb +7 -36
  129. data/test/sass/script_test.rb +53 -485
  130. data/test/sass/scss/css_test.rb +28 -143
  131. data/test/sass/scss/rx_test.rb +4 -4
  132. data/test/sass/scss/scss_test.rb +325 -2119
  133. data/test/sass/templates/scss_import.scss +1 -2
  134. data/test/sass/test_helper.rb +1 -1
  135. data/test/sass/util/multibyte_string_scanner_test.rb +1 -1
  136. data/test/sass/util/subset_map_test.rb +2 -2
  137. data/test/sass/util_test.rb +1 -86
  138. data/test/test_helper.rb +8 -37
  139. metadata +19 -66
  140. data/lib/sass/exec/base.rb +0 -187
  141. data/lib/sass/exec/sass_convert.rb +0 -264
  142. data/lib/sass/exec/sass_scss.rb +0 -424
  143. data/lib/sass/features.rb +0 -47
  144. data/lib/sass/script/tree.rb +0 -16
  145. data/lib/sass/script/tree/funcall.rb +0 -306
  146. data/lib/sass/script/tree/interpolation.rb +0 -118
  147. data/lib/sass/script/tree/list_literal.rb +0 -77
  148. data/lib/sass/script/tree/literal.rb +0 -45
  149. data/lib/sass/script/tree/map_literal.rb +0 -64
  150. data/lib/sass/script/tree/selector.rb +0 -26
  151. data/lib/sass/script/tree/variable.rb +0 -57
  152. data/lib/sass/script/value.rb +0 -11
  153. data/lib/sass/script/value/base.rb +0 -240
  154. data/lib/sass/script/value/bool.rb +0 -35
  155. data/lib/sass/script/value/color.rb +0 -680
  156. data/lib/sass/script/value/helpers.rb +0 -262
  157. data/lib/sass/script/value/list.rb +0 -113
  158. data/lib/sass/script/value/map.rb +0 -70
  159. data/lib/sass/script/value/string.rb +0 -97
  160. data/lib/sass/selector/pseudo.rb +0 -256
  161. data/lib/sass/source/map.rb +0 -210
  162. data/lib/sass/source/position.rb +0 -39
  163. data/lib/sass/source/range.rb +0 -41
  164. data/lib/sass/stack.rb +0 -120
  165. data/lib/sass/tree/at_root_node.rb +0 -83
  166. data/lib/sass/tree/error_node.rb +0 -18
  167. data/lib/sass/tree/keyframe_rule_node.rb +0 -15
  168. data/lib/sass/util/cross_platform_random.rb +0 -19
  169. data/lib/sass/util/normalized_map.rb +0 -130
  170. data/lib/sass/util/ordered_hash.rb +0 -192
  171. data/test/sass/compiler_test.rb +0 -232
  172. data/test/sass/encoding_test.rb +0 -219
  173. data/test/sass/source_map_test.rb +0 -977
  174. data/test/sass/superselector_test.rb +0 -191
  175. data/test/sass/util/normalized_map_test.rb +0 -51
  176. data/test/sass/value_helpers_test.rb +0 -179
@@ -1,14 +1,14 @@
1
1
  module Sass::Tree
2
- # A static node representing a CSS property.
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::Tree::Node}s
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::Tree::Node>]
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::Tree::Node]
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
- # The source range in which the property name appears.
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::Tree::Operation)
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::Tree::Operation.new(
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::Tree::Operation)
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::Tree::Operation.new(
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::Tree::Operation) && node.operator == :div &&
159
- node.operand1.is_a?(Sass::Script::Tree::Literal) &&
160
- node.operand1.value.is_a?(Sass::Script::Value::Number) &&
161
- node.operand2.is_a?(Sass::Script::Tree::Literal) &&
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::Value::String.new("(#{node.to_sass(opts)})")
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::Tree::Node] The expression to return
11
+ # @param expr [Script::Node] The expression to return
13
12
  def initialize(expr)
14
13
  @expr = expr
15
14
  super()
@@ -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
@@ -1,7 +1,8 @@
1
1
  require 'pathname'
2
+ require 'uri'
2
3
 
3
4
  module Sass::Tree
4
- # A static node representing a CSS rule.
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::Tree::Node}s
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::Tree::Node>]
17
+ # @return [Array<String, Sass::Script::Node>]
17
18
  attr_accessor :rule
18
19
 
19
- # The CSS selector for this rule, without any unresolved
20
- # interpolation but with parent references still intact. It's only
21
- # guaranteed to be set once {Tree::Visitors::Perform} has been
22
- # run, but it may be set before then for optimization reasons.
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, without any unresolved
28
- # interpolation or parent references. It's only set once
29
- # {Tree::Visitors::Perform} has been run.
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::Tree::Node>, Sass::Selector::CommaSequence]
64
- # The CSS rule, either unparsed or parsed.
65
- # @param selector_source_range [Sass::Source::Range]
66
- def initialize(rule, selector_source_range = nil)
67
- if rule.is_a?(Sass::Selector::CommaSequence)
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://" + Sass::Util.escape_uri(File.expand_path(filename))),
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, nil, nil, 1)
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
@@ -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 node [Node] The node to copy information from.
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::Tree::Node]
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::Tree::Node] See \{#expr}
20
+ # @param expr [Script::Node] See \{#expr}
25
21
  # @param guarded [Boolean] See \{#guarded}
26
- # @param global [Boolean] See \{#global}
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
- if respond_to?(node.class.visit_method, true)
36
- send(node.class.visit_method, node) {visit_children(node)}
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 self.node_name(node)
60
- Sass::Util.deprecated(self, "Call node.class.node_name instead.")
61
- node.class.node_name
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 (error = @parent && (
11
- try_send(@parent.class.invalid_child_method_name, @parent, node) ||
12
- try_send(node.class.invalid_parent_method_name, @parent, 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
- Sass::Tree::WhileNode, Sass::Tree::TraceNode]
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
- # When checking a static tree, resolve at-roots to be sure they won't send
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
- begin
49
- super
50
- ensure
51
- @parent = old_parent
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, Sass::Tree::ErrorNode
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 = CONTROL_NODES + [Sass::Tree::CommentNode,
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::KeyframeRuleNode, Sass::Tree::PropNode,
144
- Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode, Sass::Tree::MixinNode]
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
- classes.each do |c|
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
+