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.
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
+