sass 3.2.7 → 3.3.0.rc.1

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 (184) hide show
  1. data/MIT-LICENSE +2 -2
  2. data/README.md +14 -2
  3. data/Rakefile +25 -1
  4. data/VERSION +1 -1
  5. data/VERSION_DATE +1 -1
  6. data/VERSION_NAME +1 -1
  7. data/lib/sass/cache_stores/base.rb +4 -2
  8. data/lib/sass/cache_stores/chain.rb +2 -1
  9. data/lib/sass/cache_stores/filesystem.rb +2 -6
  10. data/lib/sass/cache_stores/memory.rb +1 -1
  11. data/lib/sass/cache_stores/null.rb +2 -2
  12. data/lib/sass/callbacks.rb +1 -0
  13. data/lib/sass/css.rb +10 -10
  14. data/lib/sass/engine.rb +403 -150
  15. data/lib/sass/environment.rb +136 -57
  16. data/lib/sass/error.rb +7 -7
  17. data/lib/sass/exec.rb +123 -39
  18. data/lib/sass/features.rb +41 -0
  19. data/lib/sass/importers/base.rb +33 -2
  20. data/lib/sass/importers/deprecated_path.rb +45 -0
  21. data/lib/sass/importers/filesystem.rb +25 -14
  22. data/lib/sass/importers.rb +1 -0
  23. data/lib/sass/logger/base.rb +3 -3
  24. data/lib/sass/logger/log_level.rb +4 -6
  25. data/lib/sass/media.rb +19 -19
  26. data/lib/sass/plugin/compiler.rb +141 -101
  27. data/lib/sass/plugin/configuration.rb +18 -22
  28. data/lib/sass/plugin/merb.rb +1 -1
  29. data/lib/sass/plugin/staleness_checker.rb +24 -8
  30. data/lib/sass/plugin.rb +4 -2
  31. data/lib/sass/repl.rb +3 -3
  32. data/lib/sass/script/css_lexer.rb +9 -4
  33. data/lib/sass/script/css_parser.rb +6 -2
  34. data/lib/sass/script/functions.rb +1343 -590
  35. data/lib/sass/script/lexer.rb +84 -52
  36. data/lib/sass/script/parser.rb +217 -97
  37. data/lib/sass/script/tree/funcall.rb +290 -0
  38. data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +34 -13
  39. data/lib/sass/script/tree/list_literal.rb +80 -0
  40. data/lib/sass/script/tree/literal.rb +47 -0
  41. data/lib/sass/script/tree/map_literal.rb +64 -0
  42. data/lib/sass/script/{node.rb → tree/node.rb} +22 -12
  43. data/lib/sass/script/{operation.rb → tree/operation.rb} +17 -25
  44. data/lib/sass/script/tree/selector.rb +30 -0
  45. data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +5 -4
  46. data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +14 -9
  47. data/lib/sass/script/tree/variable.rb +57 -0
  48. data/lib/sass/script/tree.rb +16 -0
  49. data/lib/sass/script/{arg_list.rb → value/arg_list.rb} +4 -24
  50. data/lib/sass/script/value/base.rb +248 -0
  51. data/lib/sass/script/value/bool.rb +36 -0
  52. data/lib/sass/script/{color.rb → value/color.rb} +239 -195
  53. data/lib/sass/script/value/helpers.rb +155 -0
  54. data/lib/sass/script/value/list.rb +119 -0
  55. data/lib/sass/script/value/map.rb +70 -0
  56. data/lib/sass/script/value/null.rb +45 -0
  57. data/lib/sass/script/{number.rb → value/number.rb} +91 -65
  58. data/lib/sass/script/{string.rb → value/string.rb} +9 -11
  59. data/lib/sass/script/value.rb +11 -0
  60. data/lib/sass/script.rb +35 -8
  61. data/lib/sass/scss/css_parser.rb +2 -1
  62. data/lib/sass/scss/parser.rb +338 -170
  63. data/lib/sass/scss/rx.rb +5 -6
  64. data/lib/sass/scss/script_lexer.rb +1 -0
  65. data/lib/sass/scss/script_parser.rb +1 -0
  66. data/lib/sass/scss/static_parser.rb +23 -6
  67. data/lib/sass/selector/abstract_sequence.rb +2 -2
  68. data/lib/sass/selector/comma_sequence.rb +21 -16
  69. data/lib/sass/selector/sequence.rb +60 -34
  70. data/lib/sass/selector/simple.rb +11 -12
  71. data/lib/sass/selector/simple_sequence.rb +55 -33
  72. data/lib/sass/selector.rb +52 -48
  73. data/lib/sass/source/map.rb +211 -0
  74. data/lib/sass/source/position.rb +39 -0
  75. data/lib/sass/source/range.rb +41 -0
  76. data/lib/sass/stack.rb +120 -0
  77. data/lib/sass/supports.rb +12 -13
  78. data/lib/sass/tree/at_root_node.rb +82 -0
  79. data/lib/sass/tree/comment_node.rb +3 -3
  80. data/lib/sass/tree/css_import_node.rb +11 -11
  81. data/lib/sass/tree/debug_node.rb +2 -2
  82. data/lib/sass/tree/directive_node.rb +13 -2
  83. data/lib/sass/tree/each_node.rb +8 -8
  84. data/lib/sass/tree/extend_node.rb +13 -6
  85. data/lib/sass/tree/for_node.rb +4 -4
  86. data/lib/sass/tree/function_node.rb +5 -4
  87. data/lib/sass/tree/if_node.rb +1 -1
  88. data/lib/sass/tree/import_node.rb +4 -5
  89. data/lib/sass/tree/media_node.rb +4 -14
  90. data/lib/sass/tree/mixin_def_node.rb +4 -4
  91. data/lib/sass/tree/mixin_node.rb +21 -8
  92. data/lib/sass/tree/node.rb +29 -12
  93. data/lib/sass/tree/prop_node.rb +38 -18
  94. data/lib/sass/tree/return_node.rb +3 -2
  95. data/lib/sass/tree/root_node.rb +19 -3
  96. data/lib/sass/tree/rule_node.rb +25 -17
  97. data/lib/sass/tree/supports_node.rb +0 -13
  98. data/lib/sass/tree/trace_node.rb +2 -1
  99. data/lib/sass/tree/variable_node.rb +9 -3
  100. data/lib/sass/tree/visitors/base.rb +6 -6
  101. data/lib/sass/tree/visitors/check_nesting.rb +12 -9
  102. data/lib/sass/tree/visitors/convert.rb +63 -38
  103. data/lib/sass/tree/visitors/cssize.rb +63 -23
  104. data/lib/sass/tree/visitors/deep_copy.rb +6 -5
  105. data/lib/sass/tree/visitors/extend.rb +7 -7
  106. data/lib/sass/tree/visitors/perform.rb +256 -151
  107. data/lib/sass/tree/visitors/set_options.rb +6 -6
  108. data/lib/sass/tree/visitors/to_css.rb +231 -81
  109. data/lib/sass/tree/warn_node.rb +2 -2
  110. data/lib/sass/tree/while_node.rb +2 -2
  111. data/lib/sass/util/multibyte_string_scanner.rb +2 -0
  112. data/lib/sass/util/normalized_map.rb +65 -0
  113. data/lib/sass/util/ordered_hash.rb +188 -0
  114. data/lib/sass/util/subset_map.rb +3 -2
  115. data/lib/sass/util/test.rb +9 -0
  116. data/lib/sass/util.rb +220 -34
  117. data/lib/sass/version.rb +9 -9
  118. data/lib/sass.rb +14 -7
  119. data/test/sass/compiler_test.rb +213 -0
  120. data/test/sass/conversion_test.rb +235 -9
  121. data/test/sass/engine_test.rb +230 -60
  122. data/test/sass/exec_test.rb +86 -0
  123. data/test/sass/extend_test.rb +215 -147
  124. data/test/sass/functions_test.rb +584 -99
  125. data/test/sass/importer_test.rb +165 -17
  126. data/test/sass/plugin_test.rb +19 -13
  127. data/test/sass/script_conversion_test.rb +40 -0
  128. data/test/sass/script_test.rb +231 -21
  129. data/test/sass/scss/css_test.rb +14 -5
  130. data/test/sass/scss/scss_test.rb +1266 -66
  131. data/test/sass/source_map_test.rb +879 -0
  132. data/test/sass/templates/bork5.sass +3 -0
  133. data/test/sass/util/normalized_map_test.rb +30 -0
  134. data/test/sass/util_test.rb +90 -0
  135. data/test/sass/value_helpers_test.rb +181 -0
  136. data/test/test_helper.rb +7 -2
  137. metadata +316 -291
  138. data/lib/sass/script/bool.rb +0 -18
  139. data/lib/sass/script/funcall.rb +0 -231
  140. data/lib/sass/script/list.rb +0 -84
  141. data/lib/sass/script/literal.rb +0 -239
  142. data/lib/sass/script/null.rb +0 -34
  143. data/lib/sass/script/variable.rb +0 -58
  144. data/test/Gemfile +0 -3
  145. data/vendor/listen/CHANGELOG.md +0 -221
  146. data/vendor/listen/CONTRIBUTING.md +0 -38
  147. data/vendor/listen/Gemfile +0 -30
  148. data/vendor/listen/Guardfile +0 -8
  149. data/vendor/listen/LICENSE +0 -20
  150. data/vendor/listen/README.md +0 -315
  151. data/vendor/listen/Rakefile +0 -47
  152. data/vendor/listen/Vagrantfile +0 -96
  153. data/vendor/listen/lib/listen/adapter.rb +0 -214
  154. data/vendor/listen/lib/listen/adapters/bsd.rb +0 -112
  155. data/vendor/listen/lib/listen/adapters/darwin.rb +0 -85
  156. data/vendor/listen/lib/listen/adapters/linux.rb +0 -113
  157. data/vendor/listen/lib/listen/adapters/polling.rb +0 -67
  158. data/vendor/listen/lib/listen/adapters/windows.rb +0 -87
  159. data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
  160. data/vendor/listen/lib/listen/directory_record.rb +0 -371
  161. data/vendor/listen/lib/listen/listener.rb +0 -225
  162. data/vendor/listen/lib/listen/multi_listener.rb +0 -143
  163. data/vendor/listen/lib/listen/turnstile.rb +0 -28
  164. data/vendor/listen/lib/listen/version.rb +0 -3
  165. data/vendor/listen/lib/listen.rb +0 -40
  166. data/vendor/listen/listen.gemspec +0 -22
  167. data/vendor/listen/spec/listen/adapter_spec.rb +0 -183
  168. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +0 -36
  169. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +0 -37
  170. data/vendor/listen/spec/listen/adapters/linux_spec.rb +0 -47
  171. data/vendor/listen/spec/listen/adapters/polling_spec.rb +0 -68
  172. data/vendor/listen/spec/listen/adapters/windows_spec.rb +0 -30
  173. data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
  174. data/vendor/listen/spec/listen/directory_record_spec.rb +0 -1225
  175. data/vendor/listen/spec/listen/listener_spec.rb +0 -169
  176. data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
  177. data/vendor/listen/spec/listen/turnstile_spec.rb +0 -56
  178. data/vendor/listen/spec/listen_spec.rb +0 -73
  179. data/vendor/listen/spec/spec_helper.rb +0 -21
  180. data/vendor/listen/spec/support/adapter_helper.rb +0 -629
  181. data/vendor/listen/spec/support/directory_record_helper.rb +0 -55
  182. data/vendor/listen/spec/support/fixtures_helper.rb +0 -29
  183. data/vendor/listen/spec/support/listeners_helper.rb +0 -156
  184. data/vendor/listen/spec/support/platform_helper.rb +0 -15
data/lib/sass/supports.rb CHANGED
@@ -4,7 +4,7 @@ module Sass::Supports
4
4
  class Condition
5
5
  # Runs the SassScript in the supports condition.
6
6
  #
7
- # @param env [Sass::Environment] The environment in which to run the script.
7
+ # @param environment [Sass::Environment] The environment in which to run the script.
8
8
  def perform(environment); Sass::Util.abstract(self); end
9
9
 
10
10
  # Returns the CSS for this condition.
@@ -81,12 +81,12 @@ module Sass::Supports
81
81
 
82
82
  def left_parens(str)
83
83
  return "(#{str})" if @left.is_a?(Negation)
84
- return str
84
+ str
85
85
  end
86
86
 
87
87
  def right_parens(str)
88
88
  return "(#{str})" if @right.is_a?(Negation) || @right.is_a?(Operator)
89
- return str
89
+ str
90
90
  end
91
91
  end
92
92
 
@@ -127,26 +127,25 @@ module Sass::Supports
127
127
 
128
128
  def parens(str)
129
129
  return "(#{str})" if @condition.is_a?(Negation) || @condition.is_a?(Operator)
130
- return str
130
+ str
131
131
  end
132
132
  end
133
133
 
134
134
  # A declaration condition (e.g. `(feature: value)`).
135
135
  class Declaration < Condition
136
- # The feature name.
137
- #
138
- # @param [Sass::Script::Node]
136
+ # @return [Sass::Script::Tree::Node] The feature name.
139
137
  attr_accessor :name
140
138
 
141
- # The name of the feature after any SassScript has been resolved.
142
- # Only set once \{Tree::Visitors::Perform} has been run.
139
+ # @!attribute resolved_name
140
+ # The name of the feature after any SassScript has been resolved.
141
+ # Only set once \{Tree::Visitors::Perform} has been run.
143
142
  #
144
- # @return [String]
143
+ # @return [String]
145
144
  attr_accessor :resolved_name
146
145
 
147
146
  # The feature value.
148
147
  #
149
- # @param [Sass::Script::Node]
148
+ # @return [Sass::Script::Tree::Node]
150
149
  attr_accessor :value
151
150
 
152
151
  # The value of the feature after any SassScript has been resolved.
@@ -190,7 +189,7 @@ module Sass::Supports
190
189
  class Interpolation < Condition
191
190
  # The SassScript expression in the interpolation.
192
191
  #
193
- # @param [Sass::Script::Node]
192
+ # @return [Sass::Script::Tree::Node]
194
193
  attr_accessor :value
195
194
 
196
195
  # The value of the expression after it's been resolved.
@@ -205,7 +204,7 @@ module Sass::Supports
205
204
 
206
205
  def perform(env)
207
206
  val = value.perform(env)
208
- @resolved_value = val.is_a?(Sass::Script::String) ? val.value : val.to_s
207
+ @resolved_value = val.is_a?(Sass::Script::Value::String) ? val.value : val.to_s
209
208
  end
210
209
 
211
210
  def to_css
@@ -0,0 +1,82 @@
1
+ module Sass
2
+ module Tree
3
+ # A dynamic node representing an `@at-root` directive.
4
+ #
5
+ # An `@at-root` directive with a selector is converted to an \{AtRootNode}
6
+ # containing a \{RuleNode} at parse time.
7
+ #
8
+ # @see Sass::Tree
9
+ class AtRootNode < Node
10
+ # The query for this node (e.g. `(without: media)`),
11
+ # interspersed with {Sass::Script::Tree::Node}s representing
12
+ # `#{}`-interpolation. Any adjacent strings will be merged
13
+ # together.
14
+ #
15
+ # This will be nil if the directive didn't have a query. In this
16
+ # case, {#resolved\_type} will automatically be set to
17
+ # `:without` and {#resolved\_rule} will automatically be set to `["rule"]`.
18
+ #
19
+ # @return [Array<String, Sass::Script::Tree::Node>]
20
+ attr_accessor :query
21
+
22
+ # The resolved type of this directive. `:with` or `:without`.
23
+ #
24
+ # @return [Symbol]
25
+ attr_accessor :resolved_type
26
+
27
+ # The resolved value of this directive -- a list of directives
28
+ # to either include or exclude.
29
+ #
30
+ # @return [Array<String>]
31
+ attr_accessor :resolved_value
32
+
33
+ # The number of additional tabs that the contents of this node
34
+ # should be indented.
35
+ #
36
+ # @return [Number]
37
+ attr_accessor :tabs
38
+
39
+ # Whether the last child of this node should be considered the
40
+ # end of a group.
41
+ #
42
+ # @return [Boolean]
43
+ attr_accessor :group_end
44
+
45
+ def initialize(query = nil)
46
+ super()
47
+ @query = Sass::Util.strip_string_array(Sass::Util.merge_adjacent_strings(query)) if query
48
+ @tabs = 0
49
+ end
50
+
51
+ # Returns whether or not the given directive is excluded by this
52
+ # node. `directive` may be "rule", which indicates whether
53
+ # normal CSS rules should be excluded.
54
+ #
55
+ # @param directive [String]
56
+ # @return [Boolean]
57
+ def exclude?(directive)
58
+ if resolved_type == :with
59
+ return false if resolved_value.include?('all')
60
+ !resolved_value.include?(directive)
61
+ else # resolved_type == :without
62
+ return true if resolved_value.include?('all')
63
+ resolved_value.include?(directive)
64
+ end
65
+ end
66
+
67
+ # Returns whether the given node is excluded by this node.
68
+ #
69
+ # @param node [Sass::Tree::Node]
70
+ # @return [Boolean]
71
+ def exclude_node?(node)
72
+ return exclude?(node.name.gsub(/^@/, '')) if node.is_a?(Sass::Tree::DirectiveNode)
73
+ exclude?(node.class.to_s.gsub(/.*::(.*)Node$/, '\1').downcase)
74
+ end
75
+
76
+ # @see Node#bubbles?
77
+ def bubbles?
78
+ true
79
+ end
80
+ end
81
+ end
82
+ end
@@ -6,10 +6,10 @@ module Sass::Tree
6
6
  # @see Sass::Tree
7
7
  class CommentNode < Node
8
8
  # The text of the comment, not including `/*` and `*/`.
9
- # Interspersed with {Sass::Script::Node}s representing `#{}`-interpolation
9
+ # Interspersed with {Sass::Script::Tree::Node}s representing `#{}`-interpolation
10
10
  # if this is a loud comment.
11
11
  #
12
- # @return [Array<String, Sass::Script::Node>]
12
+ # @return [Array<String, Sass::Script::Tree::Node>]
13
13
  attr_accessor :value
14
14
 
15
15
  # The text of the comment
@@ -26,7 +26,7 @@ module Sass::Tree
26
26
  # @return [Symbol]
27
27
  attr_accessor :type
28
28
 
29
- # @param value [Array<String, Sass::Script::Node>] See \{#value}
29
+ # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value}
30
30
  # @param type [Symbol] See \{#type}
31
31
  def initialize(value, type)
32
32
  @value = Sass::Util.with_extracted_values(value) {|str| normalize_indentation str}
@@ -6,31 +6,31 @@ module Sass::Tree
6
6
  # The URI being imported, either as a plain string or an interpolated
7
7
  # script string.
8
8
  #
9
- # @return [String, Sass::Script::Node]
9
+ # @return [String, Sass::Script::Tree::Node]
10
10
  attr_accessor :uri
11
11
 
12
12
  # The text of the URI being imported after any interpolated SassScript has
13
- # been resolved. Only set once \{Tree::Visitors::Perform} has been run.
13
+ # been resolved. Only set once {Tree::Visitors::Perform} has been run.
14
14
  #
15
15
  # @return [String]
16
16
  attr_accessor :resolved_uri
17
17
 
18
- # The media query for this rule, interspersed with {Sass::Script::Node}s
19
- # representing `#{}`-interpolation. Any adjacent strings will be merged
20
- # together.
18
+ # The media query for this rule, interspersed with
19
+ # {Sass::Script::Tree::Node}s representing `#{}`-interpolation. Any adjacent
20
+ # strings will be merged together.
21
21
  #
22
- # @return [Array<String, Sass::Script::Node>]
22
+ # @return [Array<String, Sass::Script::Tree::Node>]
23
23
  attr_accessor :query
24
24
 
25
- # The media query for this rule, without any unresolved interpolation. It's
26
- # only set once {Tree::Node#perform} has been called.
25
+ # The media query for this rule, without any unresolved interpolation.
26
+ # It's only set once {Tree::Visitors::Perform} has been run.
27
27
  #
28
28
  # @return [Sass::Media::QueryList]
29
29
  attr_accessor :resolved_query
30
30
 
31
- # @param uri [String, Sass::Script::Node] See \{#uri}
32
- # @param query [Array<String, Sass::Script::Node>] See \{#query}
33
- def initialize(uri, query = nil)
31
+ # @param uri [String, Sass::Script::Tree::Node] See \{#uri}
32
+ # @param query [Array<String, Sass::Script::Tree::Node>] See \{#query}
33
+ def initialize(uri, query = [])
34
34
  @uri = uri
35
35
  @query = query
36
36
  super('')
@@ -5,10 +5,10 @@ module Sass
5
5
  # @see Sass::Tree
6
6
  class DebugNode < Node
7
7
  # The expression to print.
8
- # @return [Script::Node]
8
+ # @return [Script::Tree::Node]
9
9
  attr_accessor :expr
10
10
 
11
- # @param expr [Script::Node] The expression to print
11
+ # @param expr [Script::Tree::Node] The expression to print
12
12
  def initialize(expr)
13
13
  @expr = expr
14
14
  super()
@@ -11,7 +11,7 @@ module Sass::Tree
11
11
  class DirectiveNode < Node
12
12
  # The text of the directive, `@` and all, with interpolation included.
13
13
  #
14
- # @return [Array<String, Sass::Script::Node>]
14
+ # @return [Array<String, Sass::Script::Tree::Node>]
15
15
  attr_accessor :value
16
16
 
17
17
  # The text of the directive after any interpolated SassScript has been resolved.
@@ -20,9 +20,16 @@ module Sass::Tree
20
20
  # @return [String]
21
21
  attr_accessor :resolved_value
22
22
 
23
- # @param value [Array<String, Sass::Script::Node>] See \{#value}
23
+ # @see RuleNode#tabs
24
+ attr_accessor :tabs
25
+
26
+ # @see RuleNode#group_end
27
+ attr_accessor :group_end
28
+
29
+ # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value}
24
30
  def initialize(value)
25
31
  @value = value
32
+ @tabs = 0
26
33
  super()
27
34
  end
28
35
 
@@ -38,5 +45,9 @@ module Sass::Tree
38
45
  def name
39
46
  value.first.gsub(/ .*$/, '')
40
47
  end
48
+
49
+ def bubbles?
50
+ has_children
51
+ end
41
52
  end
42
53
  end
@@ -5,18 +5,18 @@ module Sass::Tree
5
5
  #
6
6
  # @see Sass::Tree
7
7
  class EachNode < Node
8
- # The name of the loop variable.
9
- # @return [String]
10
- attr_reader :var
8
+ # The names of the loop variables.
9
+ # @return [Array<String>]
10
+ attr_reader :vars
11
11
 
12
12
  # The parse tree for the list.
13
- # @param [Script::Node]
13
+ # @return [Script::Tree::Node]
14
14
  attr_accessor :list
15
15
 
16
- # @param var [String] The name of the loop variable
17
- # @param list [Script::Node] The parse tree for the list
18
- def initialize(var, list)
19
- @var = var
16
+ # @param vars [Array<String>] The names of the loop variables
17
+ # @param list [Script::Tree::Node] The parse tree for the list
18
+ def initialize(vars, list)
19
+ @vars = vars
20
20
  @list = list
21
21
  super()
22
22
  end
@@ -11,25 +11,32 @@ module Sass::Tree
11
11
  # @return [Selector::CommaSequence]
12
12
  attr_accessor :resolved_selector
13
13
 
14
- # The CSS selector to extend, interspersed with {Sass::Script::Node}s
14
+ # The CSS selector to extend, interspersed with {Sass::Script::Tree::Node}s
15
15
  # representing `#{}`-interpolation.
16
16
  #
17
- # @return [Array<String, Sass::Script::Node>]
17
+ # @return [Array<String, Sass::Script::Tree::Node>]
18
18
  attr_accessor :selector
19
19
 
20
+ # The extended selector source range.
21
+ #
22
+ # @return [Sass::Source::Range]
23
+ attr_accessor :selector_source_range
24
+
20
25
  # Whether the `@extend` is allowed to match no selectors or not.
21
26
  #
22
27
  # @return [Boolean]
23
28
  def optional?; @optional; end
24
29
 
25
- # @param selector [Array<String, Sass::Script::Node>]
30
+ # @param selector [Array<String, Sass::Script::Tree::Node>]
26
31
  # The CSS selector to extend,
27
- # interspersed with {Sass::Script::Node}s
32
+ # interspersed with {Sass::Script::Tree::Node}s
28
33
  # representing `#{}`-interpolation.
29
- # @param optional [Boolean] See \{#optional}
30
- def initialize(selector, optional)
34
+ # @param optional [Boolean] See \{ExtendNode#optional?}
35
+ # @param selector_source_range [Sass::Source::Range] The extended selector source range.
36
+ def initialize(selector, optional, selector_source_range)
31
37
  @selector = selector
32
38
  @optional = optional
39
+ @selector_source_range = selector_source_range
33
40
  super()
34
41
  end
35
42
  end
@@ -10,11 +10,11 @@ module Sass::Tree
10
10
  attr_reader :var
11
11
 
12
12
  # The parse tree for the initial expression.
13
- # @return [Script::Node]
13
+ # @return [Script::Tree::Node]
14
14
  attr_accessor :from
15
15
 
16
16
  # The parse tree for the final expression.
17
- # @return [Script::Node]
17
+ # @return [Script::Tree::Node]
18
18
  attr_accessor :to
19
19
 
20
20
  # Whether to include `to` in the loop or stop just before.
@@ -22,8 +22,8 @@ module Sass::Tree
22
22
  attr_reader :exclusive
23
23
 
24
24
  # @param var [String] See \{#var}
25
- # @param from [Script::Node] See \{#from}
26
- # @param to [Script::Node] See \{#to}
25
+ # @param from [Script::Tree::Node] See \{#from}
26
+ # @param to [Script::Tree::Node] See \{#to}
27
27
  # @param exclusive [Boolean] See \{#exclusive}
28
28
  def initialize(var, from, to, exclusive)
29
29
  @var = var
@@ -12,17 +12,18 @@ module Sass
12
12
  # containing the variable for argument and the parse tree for
13
13
  # the default value of the argument
14
14
  #
15
- # @return [Array<Script::Node>]
15
+ # @return [Array<Script::Tree::Node>]
16
16
  attr_accessor :args
17
17
 
18
18
  # The splat argument for this function, if one exists.
19
19
  #
20
- # @return [Script::Node?]
20
+ # @return [Script::Tree::Node?]
21
21
  attr_accessor :splat
22
22
 
23
23
  # @param name [String] The function name
24
- # @param args [Array<(Script::Node, Script::Node)>] The arguments for the function.
25
- # @param splat [Script::Node] See \{#splat}
24
+ # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>]
25
+ # The arguments for the function.
26
+ # @param splat [Script::Tree::Node] See \{#splat}
26
27
  def initialize(name, args, splat)
27
28
  @name = name
28
29
  @args = args
@@ -36,7 +36,7 @@ module Sass::Tree
36
36
  end
37
37
 
38
38
  def _dump(f)
39
- Marshal.dump([self.expr, self.else, self.children])
39
+ Marshal.dump([expr, self.else, children])
40
40
  end
41
41
 
42
42
  def self._load(data)
@@ -51,9 +51,8 @@ module Sass
51
51
  end
52
52
 
53
53
  paths.each do |p|
54
- if f = p.find(@imported_filename, options_for_importer)
55
- return f
56
- end
54
+ f = p.find(@imported_filename, options_for_importer)
55
+ return f if f
57
56
  end
58
57
 
59
58
  message = "File to import not found or unreadable: #{@imported_filename}.\n"
@@ -64,11 +63,11 @@ module Sass
64
63
  end
65
64
  raise SyntaxError.new(message)
66
65
  rescue SyntaxError => e
67
- raise SyntaxError.new(e.message, :line => self.line, :filename => @filename)
66
+ raise SyntaxError.new(e.message, :line => line, :filename => @filename)
68
67
  end
69
68
 
70
69
  def options_for_importer
71
- @options.merge(:_line => line)
70
+ @options.merge(:_from_import_node => true)
72
71
  end
73
72
  end
74
73
  end
@@ -8,29 +8,22 @@ module Sass::Tree
8
8
  class MediaNode < DirectiveNode
9
9
  # TODO: parse and cache the query immediately if it has no dynamic elements
10
10
 
11
- # The media query for this rule, interspersed with {Sass::Script::Node}s
11
+ # The media query for this rule, interspersed with {Sass::Script::Tree::Node}s
12
12
  # representing `#{}`-interpolation. Any adjacent strings will be merged
13
13
  # together.
14
14
  #
15
- # @return [Array<String, Sass::Script::Node>]
15
+ # @return [Array<String, Sass::Script::Tree::Node>]
16
16
  attr_accessor :query
17
17
 
18
18
  # The media query for this rule, without any unresolved interpolation. It's
19
- # only set once {Tree::Node#perform} has been called.
19
+ # only set once {Tree::Visitors::Perform} has been run.
20
20
  #
21
21
  # @return [Sass::Media::QueryList]
22
22
  attr_accessor :resolved_query
23
23
 
24
- # @see RuleNode#tabs
25
- attr_accessor :tabs
26
-
27
- # @see RuleNode#group_end
28
- attr_accessor :group_end
29
-
30
- # @param query [Array<String, Sass::Script::Node>] See \{#query}
24
+ # @param query [Array<String, Sass::Script::Tree::Node>] See \{#query}
31
25
  def initialize(query)
32
26
  @query = query
33
- @tabs = 0
34
27
  super('')
35
28
  end
36
29
 
@@ -51,8 +44,5 @@ module Sass::Tree
51
44
  def invisible?
52
45
  children.all? {|c| c.invisible?}
53
46
  end
54
-
55
- # @see Node#bubbles?
56
- def bubbles?; true; end
57
47
  end
58
48
  end
@@ -12,12 +12,12 @@ module Sass
12
12
  # Each element is a tuple containing the variable for argument
13
13
  # and the parse tree for the default value of the argument.
14
14
  #
15
- # @return [Array<(Script::Node, Script::Node)>]
15
+ # @return [Array<(Script::Tree::Node, Script::Tree::Node)>]
16
16
  attr_accessor :args
17
17
 
18
18
  # The splat argument for this mixin, if one exists.
19
19
  #
20
- # @return [Script::Node?]
20
+ # @return [Script::Tree::Node?]
21
21
  attr_accessor :splat
22
22
 
23
23
  # Whether the mixin uses `@content`. Set during the nesting check phase.
@@ -25,8 +25,8 @@ module Sass
25
25
  attr_accessor :has_content
26
26
 
27
27
  # @param name [String] The mixin name
28
- # @param args [Array<(Script::Node, Script::Node)>] See \{#args}
29
- # @param splat [Script::Node] See \{#splat}
28
+ # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>] See \{#args}
29
+ # @param splat [Script::Tree::Node] See \{#splat}
30
30
  def initialize(name, args, splat)
31
31
  @name = name
32
32
  @args = args
@@ -12,27 +12,40 @@ module Sass::Tree
12
12
  attr_reader :name
13
13
 
14
14
  # The arguments to the mixin.
15
- # @return [Array<Script::Node>]
15
+ # @return [Array<Script::Tree::Node>]
16
16
  attr_accessor :args
17
17
 
18
18
  # A hash from keyword argument names to values.
19
- # @return [{String => Script::Node}]
19
+ # @return [{String => Script::Tree::Node}]
20
20
  attr_accessor :keywords
21
21
 
22
- # The splat argument for this mixin, if one exists.
22
+ # The first splat argument for this mixin, if one exists.
23
23
  #
24
- # @return [Script::Node?]
24
+ # This could be a list of positional arguments, a map of keyword
25
+ # arguments, or an arglist containing both.
26
+ #
27
+ # @return [Node?]
25
28
  attr_accessor :splat
26
29
 
30
+ # The second splat argument for this mixin, if one exists.
31
+ #
32
+ # If this exists, it's always a map of keyword arguments, and
33
+ # \{#splat} is always either a list or an arglist.
34
+ #
35
+ # @return [Node?]
36
+ attr_accessor :kwarg_splat
37
+
27
38
  # @param name [String] The name of the mixin
28
- # @param args [Array<Script::Node>] See \{#args}
29
- # @param splat [Script::Node] See \{#splat}
30
- # @param keywords [{String => Script::Node}] See \{#keywords}
31
- def initialize(name, args, keywords, splat)
39
+ # @param args [Array<Script::Tree::Node>] See \{#args}
40
+ # @param splat [Script::Tree::Node] See \{#splat}
41
+ # @param kwarg_splat [Script::Tree::Node] See \{#kwarg_splat}
42
+ # @param keywords [{String => Script::Tree::Node}] See \{#keywords}
43
+ def initialize(name, args, keywords, splat, kwarg_splat)
32
44
  @name = name
33
45
  @args = args
34
46
  @keywords = keywords
35
47
  @splat = splat
48
+ @kwarg_splat = kwarg_splat
36
49
  super()
37
50
  end
38
51
  end
@@ -8,14 +8,15 @@ module Sass
8
8
  # in addition to nodes for CSS rules and properties.
9
9
  # Nodes that only appear in this state are called **dynamic nodes**.
10
10
  #
11
- # {Tree::Visitors::Perform} creates a static Sass tree, which is different.
12
- # It still has nodes for CSS rules and properties
13
- # but it doesn't have any dynamic-generation-related nodes.
14
- # The nodes in this state are in the same structure as the Sass document:
15
- # rules and properties are nested beneath one another.
16
- # Nodes that can be in this state or in the dynamic state
17
- # are called **static nodes**; nodes that can only be in this state
18
- # are called **solely static nodes**.
11
+ # {Tree::Visitors::Perform} creates a static Sass tree, which is
12
+ # different. It still has nodes for CSS rules and properties but it
13
+ # doesn't have any dynamic-generation-related nodes. The nodes in
14
+ # this state are in a similar structure to the Sass document: rules
15
+ # and properties are nested beneath one another, although the
16
+ # {Tree::RuleNode} selectors are already in their final state. Nodes
17
+ # that can be in this state or in the dynamic state are called
18
+ # **static nodes**; nodes that can only be in this state are called
19
+ # **solely static nodes**.
19
20
  #
20
21
  # {Tree::Visitors::Cssize} is then used to create a static CSS tree.
21
22
  # This is like a static Sass tree,
@@ -32,7 +33,7 @@ module Sass
32
33
  # The child nodes of this node.
33
34
  #
34
35
  # @return [Array<Tree::Node>]
35
- attr_accessor :children
36
+ attr_reader :children
36
37
 
37
38
  # Whether or not this node has child nodes.
38
39
  # This may be true even when \{#children} is empty,
@@ -46,6 +47,11 @@ module Sass
46
47
  # @return [Fixnum]
47
48
  attr_accessor :line
48
49
 
50
+ # The source range in the document on which this node appeared.
51
+ #
52
+ # @return [Sass::Source::Range]
53
+ attr_accessor :source_range
54
+
49
55
  # The name of the document on which this node appeared.
50
56
  #
51
57
  # @return [String]
@@ -127,10 +133,21 @@ module Sass
127
133
 
128
134
  # Computes the CSS corresponding to this static CSS tree.
129
135
  #
130
- # @return [String, nil] The resulting CSS
136
+ # @return [String] The resulting CSS
137
+ # @see Sass::Tree
138
+ def css
139
+ Sass::Tree::Visitors::ToCss.new.visit(self)
140
+ end
141
+
142
+ # Computes the CSS corresponding to this static CSS tree, along with
143
+ # the respective source map.
144
+ #
145
+ # @return [(String, Sass::Source::Map)] The resulting CSS and the source map
131
146
  # @see Sass::Tree
132
- def to_s
133
- Sass::Tree::Visitors::ToCss.visit(self)
147
+ def css_with_sourcemap
148
+ visitor = Sass::Tree::Visitors::ToCss.new(:build_source_mapping)
149
+ result = visitor.visit(self)
150
+ return result, visitor.source_mapping
134
151
  end
135
152
 
136
153
  # Returns a representation of the node for debugging purposes.