sass 3.1.0 → 3.3.0

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 (260) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING +1 -1
  3. data/MIT-LICENSE +2 -2
  4. data/README.md +29 -17
  5. data/Rakefile +43 -9
  6. data/VERSION +1 -1
  7. data/VERSION_DATE +1 -0
  8. data/VERSION_NAME +1 -1
  9. data/bin/sass +6 -1
  10. data/bin/sass-convert +6 -1
  11. data/bin/scss +6 -1
  12. data/ext/mkrf_conf.rb +27 -0
  13. data/lib/sass/cache_stores/base.rb +7 -3
  14. data/lib/sass/cache_stores/chain.rb +3 -2
  15. data/lib/sass/cache_stores/filesystem.rb +5 -7
  16. data/lib/sass/cache_stores/memory.rb +1 -1
  17. data/lib/sass/cache_stores/null.rb +2 -2
  18. data/lib/sass/callbacks.rb +2 -1
  19. data/lib/sass/css.rb +168 -53
  20. data/lib/sass/engine.rb +502 -174
  21. data/lib/sass/environment.rb +151 -111
  22. data/lib/sass/error.rb +7 -7
  23. data/lib/sass/exec.rb +176 -60
  24. data/lib/sass/features.rb +40 -0
  25. data/lib/sass/importers/base.rb +46 -7
  26. data/lib/sass/importers/deprecated_path.rb +51 -0
  27. data/lib/sass/importers/filesystem.rb +113 -30
  28. data/lib/sass/importers.rb +1 -0
  29. data/lib/sass/logger/base.rb +30 -0
  30. data/lib/sass/logger/log_level.rb +45 -0
  31. data/lib/sass/logger.rb +12 -0
  32. data/lib/sass/media.rb +213 -0
  33. data/lib/sass/plugin/compiler.rb +194 -104
  34. data/lib/sass/plugin/configuration.rb +18 -25
  35. data/lib/sass/plugin/merb.rb +1 -1
  36. data/lib/sass/plugin/staleness_checker.rb +37 -11
  37. data/lib/sass/plugin.rb +10 -13
  38. data/lib/sass/railtie.rb +2 -1
  39. data/lib/sass/repl.rb +5 -6
  40. data/lib/sass/script/css_lexer.rb +8 -4
  41. data/lib/sass/script/css_parser.rb +5 -2
  42. data/lib/sass/script/functions.rb +1547 -618
  43. data/lib/sass/script/lexer.rb +122 -72
  44. data/lib/sass/script/parser.rb +304 -135
  45. data/lib/sass/script/tree/funcall.rb +306 -0
  46. data/lib/sass/script/{interpolation.rb → tree/interpolation.rb} +43 -13
  47. data/lib/sass/script/tree/list_literal.rb +77 -0
  48. data/lib/sass/script/tree/literal.rb +45 -0
  49. data/lib/sass/script/tree/map_literal.rb +64 -0
  50. data/lib/sass/script/{node.rb → tree/node.rb} +30 -12
  51. data/lib/sass/script/{operation.rb → tree/operation.rb} +33 -21
  52. data/lib/sass/script/{string_interpolation.rb → tree/string_interpolation.rb} +14 -4
  53. data/lib/sass/script/{unary_operation.rb → tree/unary_operation.rb} +21 -9
  54. data/lib/sass/script/tree/variable.rb +57 -0
  55. data/lib/sass/script/tree.rb +15 -0
  56. data/lib/sass/script/value/arg_list.rb +36 -0
  57. data/lib/sass/script/value/base.rb +238 -0
  58. data/lib/sass/script/value/bool.rb +40 -0
  59. data/lib/sass/script/{color.rb → value/color.rb} +256 -74
  60. data/lib/sass/script/value/deprecated_false.rb +55 -0
  61. data/lib/sass/script/value/helpers.rb +155 -0
  62. data/lib/sass/script/value/list.rb +128 -0
  63. data/lib/sass/script/value/map.rb +70 -0
  64. data/lib/sass/script/value/null.rb +49 -0
  65. data/lib/sass/script/{number.rb → value/number.rb} +115 -62
  66. data/lib/sass/script/{string.rb → value/string.rb} +9 -11
  67. data/lib/sass/script/value.rb +12 -0
  68. data/lib/sass/script.rb +35 -9
  69. data/lib/sass/scss/css_parser.rb +2 -12
  70. data/lib/sass/scss/parser.rb +657 -230
  71. data/lib/sass/scss/rx.rb +17 -12
  72. data/lib/sass/scss/static_parser.rb +37 -6
  73. data/lib/sass/scss.rb +0 -1
  74. data/lib/sass/selector/abstract_sequence.rb +35 -3
  75. data/lib/sass/selector/comma_sequence.rb +29 -14
  76. data/lib/sass/selector/sequence.rb +371 -74
  77. data/lib/sass/selector/simple.rb +28 -13
  78. data/lib/sass/selector/simple_sequence.rb +163 -36
  79. data/lib/sass/selector.rb +138 -36
  80. data/lib/sass/shared.rb +3 -5
  81. data/lib/sass/source/map.rb +196 -0
  82. data/lib/sass/source/position.rb +39 -0
  83. data/lib/sass/source/range.rb +41 -0
  84. data/lib/sass/stack.rb +126 -0
  85. data/lib/sass/supports.rb +228 -0
  86. data/lib/sass/tree/at_root_node.rb +82 -0
  87. data/lib/sass/tree/comment_node.rb +34 -29
  88. data/lib/sass/tree/content_node.rb +9 -0
  89. data/lib/sass/tree/css_import_node.rb +60 -0
  90. data/lib/sass/tree/debug_node.rb +3 -3
  91. data/lib/sass/tree/directive_node.rb +33 -3
  92. data/lib/sass/tree/each_node.rb +9 -9
  93. data/lib/sass/tree/extend_node.rb +20 -6
  94. data/lib/sass/tree/for_node.rb +6 -6
  95. data/lib/sass/tree/function_node.rb +12 -4
  96. data/lib/sass/tree/if_node.rb +2 -15
  97. data/lib/sass/tree/import_node.rb +11 -5
  98. data/lib/sass/tree/media_node.rb +27 -11
  99. data/lib/sass/tree/mixin_def_node.rb +15 -4
  100. data/lib/sass/tree/mixin_node.rb +27 -7
  101. data/lib/sass/tree/node.rb +69 -35
  102. data/lib/sass/tree/prop_node.rb +47 -31
  103. data/lib/sass/tree/return_node.rb +4 -3
  104. data/lib/sass/tree/root_node.rb +20 -4
  105. data/lib/sass/tree/rule_node.rb +37 -26
  106. data/lib/sass/tree/supports_node.rb +38 -0
  107. data/lib/sass/tree/trace_node.rb +33 -0
  108. data/lib/sass/tree/variable_node.rb +10 -4
  109. data/lib/sass/tree/visitors/base.rb +5 -8
  110. data/lib/sass/tree/visitors/check_nesting.rb +67 -52
  111. data/lib/sass/tree/visitors/convert.rb +134 -53
  112. data/lib/sass/tree/visitors/cssize.rb +245 -51
  113. data/lib/sass/tree/visitors/deep_copy.rb +102 -0
  114. data/lib/sass/tree/visitors/extend.rb +68 -0
  115. data/lib/sass/tree/visitors/perform.rb +331 -105
  116. data/lib/sass/tree/visitors/set_options.rb +125 -0
  117. data/lib/sass/tree/visitors/to_css.rb +259 -95
  118. data/lib/sass/tree/warn_node.rb +3 -3
  119. data/lib/sass/tree/while_node.rb +3 -3
  120. data/lib/sass/util/cross_platform_random.rb +19 -0
  121. data/lib/sass/util/multibyte_string_scanner.rb +157 -0
  122. data/lib/sass/util/normalized_map.rb +130 -0
  123. data/lib/sass/util/ordered_hash.rb +192 -0
  124. data/lib/sass/util/subset_map.rb +11 -2
  125. data/lib/sass/util/test.rb +9 -0
  126. data/lib/sass/util.rb +565 -39
  127. data/lib/sass/version.rb +27 -15
  128. data/lib/sass.rb +39 -4
  129. data/test/sass/cache_test.rb +15 -0
  130. data/test/sass/compiler_test.rb +223 -0
  131. data/test/sass/conversion_test.rb +901 -107
  132. data/test/sass/css2sass_test.rb +94 -0
  133. data/test/sass/engine_test.rb +1059 -164
  134. data/test/sass/exec_test.rb +86 -0
  135. data/test/sass/extend_test.rb +933 -837
  136. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  137. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  138. data/test/sass/functions_test.rb +995 -136
  139. data/test/sass/importer_test.rb +338 -18
  140. data/test/sass/logger_test.rb +58 -0
  141. data/test/sass/more_results/more_import.css +2 -2
  142. data/test/sass/plugin_test.rb +114 -30
  143. data/test/sass/results/cached_import_option.css +3 -0
  144. data/test/sass/results/filename_fn.css +3 -0
  145. data/test/sass/results/import.css +2 -2
  146. data/test/sass/results/import_charset.css +1 -0
  147. data/test/sass/results/import_charset_1_8.css +1 -0
  148. data/test/sass/results/import_charset_ibm866.css +1 -0
  149. data/test/sass/results/import_content.css +1 -0
  150. data/test/sass/results/script.css +1 -1
  151. data/test/sass/results/scss_import.css +2 -2
  152. data/test/sass/results/units.css +2 -2
  153. data/test/sass/script_conversion_test.rb +43 -1
  154. data/test/sass/script_test.rb +380 -36
  155. data/test/sass/scss/css_test.rb +257 -75
  156. data/test/sass/scss/scss_test.rb +2322 -110
  157. data/test/sass/source_map_test.rb +887 -0
  158. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  159. data/test/sass/templates/_double_import_loop2.sass +1 -0
  160. data/test/sass/templates/_filename_fn_import.scss +11 -0
  161. data/test/sass/templates/_imported_content.sass +3 -0
  162. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  163. data/test/sass/templates/bork5.sass +3 -0
  164. data/test/sass/templates/cached_import_option.scss +3 -0
  165. data/test/sass/templates/double_import_loop1.sass +1 -0
  166. data/test/sass/templates/filename_fn.scss +18 -0
  167. data/test/sass/templates/import_charset.sass +2 -0
  168. data/test/sass/templates/import_charset_1_8.sass +2 -0
  169. data/test/sass/templates/import_charset_ibm866.sass +2 -0
  170. data/test/sass/templates/import_content.sass +4 -0
  171. data/test/sass/templates/same_name_different_ext.sass +2 -0
  172. data/test/sass/templates/same_name_different_ext.scss +1 -0
  173. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  174. data/test/sass/templates/single_import_loop.sass +1 -0
  175. data/test/sass/templates/subdir/import_up1.scss +1 -0
  176. data/test/sass/templates/subdir/import_up2.scss +1 -0
  177. data/test/sass/test_helper.rb +1 -1
  178. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  179. data/test/sass/util/normalized_map_test.rb +51 -0
  180. data/test/sass/util_test.rb +183 -0
  181. data/test/sass/value_helpers_test.rb +181 -0
  182. data/test/test_helper.rb +45 -5
  183. data/vendor/listen/CHANGELOG.md +228 -0
  184. data/vendor/listen/CONTRIBUTING.md +38 -0
  185. data/vendor/listen/Gemfile +30 -0
  186. data/vendor/listen/Guardfile +8 -0
  187. data/vendor/{fssm → listen}/LICENSE +1 -1
  188. data/vendor/listen/README.md +315 -0
  189. data/vendor/listen/Rakefile +47 -0
  190. data/vendor/listen/Vagrantfile +96 -0
  191. data/vendor/listen/lib/listen/adapter.rb +214 -0
  192. data/vendor/listen/lib/listen/adapters/bsd.rb +112 -0
  193. data/vendor/listen/lib/listen/adapters/darwin.rb +85 -0
  194. data/vendor/listen/lib/listen/adapters/linux.rb +113 -0
  195. data/vendor/listen/lib/listen/adapters/polling.rb +67 -0
  196. data/vendor/listen/lib/listen/adapters/windows.rb +87 -0
  197. data/vendor/listen/lib/listen/dependency_manager.rb +126 -0
  198. data/vendor/listen/lib/listen/directory_record.rb +371 -0
  199. data/vendor/listen/lib/listen/listener.rb +225 -0
  200. data/vendor/listen/lib/listen/multi_listener.rb +143 -0
  201. data/vendor/listen/lib/listen/turnstile.rb +28 -0
  202. data/vendor/listen/lib/listen/version.rb +3 -0
  203. data/vendor/listen/lib/listen.rb +40 -0
  204. data/vendor/listen/listen.gemspec +22 -0
  205. data/vendor/listen/spec/listen/adapter_spec.rb +183 -0
  206. data/vendor/listen/spec/listen/adapters/bsd_spec.rb +36 -0
  207. data/vendor/listen/spec/listen/adapters/darwin_spec.rb +37 -0
  208. data/vendor/listen/spec/listen/adapters/linux_spec.rb +47 -0
  209. data/vendor/listen/spec/listen/adapters/polling_spec.rb +68 -0
  210. data/vendor/listen/spec/listen/adapters/windows_spec.rb +30 -0
  211. data/vendor/listen/spec/listen/dependency_manager_spec.rb +107 -0
  212. data/vendor/listen/spec/listen/directory_record_spec.rb +1225 -0
  213. data/vendor/listen/spec/listen/listener_spec.rb +169 -0
  214. data/vendor/listen/spec/listen/multi_listener_spec.rb +174 -0
  215. data/vendor/listen/spec/listen/turnstile_spec.rb +56 -0
  216. data/vendor/listen/spec/listen_spec.rb +73 -0
  217. data/vendor/listen/spec/spec_helper.rb +21 -0
  218. data/vendor/listen/spec/support/adapter_helper.rb +629 -0
  219. data/vendor/listen/spec/support/directory_record_helper.rb +55 -0
  220. data/vendor/listen/spec/support/fixtures_helper.rb +29 -0
  221. data/vendor/listen/spec/support/listeners_helper.rb +156 -0
  222. data/vendor/listen/spec/support/platform_helper.rb +15 -0
  223. metadata +344 -271
  224. data/lib/sass/less.rb +0 -382
  225. data/lib/sass/script/bool.rb +0 -18
  226. data/lib/sass/script/funcall.rb +0 -162
  227. data/lib/sass/script/list.rb +0 -76
  228. data/lib/sass/script/literal.rb +0 -245
  229. data/lib/sass/script/variable.rb +0 -54
  230. data/lib/sass/scss/sass_parser.rb +0 -11
  231. data/test/sass/less_conversion_test.rb +0 -653
  232. data/vendor/fssm/README.markdown +0 -55
  233. data/vendor/fssm/Rakefile +0 -59
  234. data/vendor/fssm/VERSION.yml +0 -5
  235. data/vendor/fssm/example.rb +0 -9
  236. data/vendor/fssm/fssm.gemspec +0 -77
  237. data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
  238. data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
  239. data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
  240. data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
  241. data/vendor/fssm/lib/fssm/monitor.rb +0 -26
  242. data/vendor/fssm/lib/fssm/path.rb +0 -91
  243. data/vendor/fssm/lib/fssm/pathname.rb +0 -502
  244. data/vendor/fssm/lib/fssm/state/directory.rb +0 -57
  245. data/vendor/fssm/lib/fssm/state/file.rb +0 -24
  246. data/vendor/fssm/lib/fssm/support.rb +0 -63
  247. data/vendor/fssm/lib/fssm/tree.rb +0 -176
  248. data/vendor/fssm/lib/fssm.rb +0 -33
  249. data/vendor/fssm/profile/prof-cache.rb +0 -40
  250. data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
  251. data/vendor/fssm/profile/prof-pathname.rb +0 -68
  252. data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
  253. data/vendor/fssm/profile/prof.html +0 -2379
  254. data/vendor/fssm/spec/path_spec.rb +0 -75
  255. data/vendor/fssm/spec/root/duck/quack.txt +0 -0
  256. data/vendor/fssm/spec/root/file.css +0 -0
  257. data/vendor/fssm/spec/root/file.rb +0 -0
  258. data/vendor/fssm/spec/root/file.yml +0 -0
  259. data/vendor/fssm/spec/root/moo/cow.txt +0 -0
  260. data/vendor/fssm/spec/spec_helper.rb +0 -14
@@ -6,31 +6,31 @@ 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::Tree::Node}s representing `#{}`-interpolation
10
+ # if this is a loud comment.
9
11
  #
10
- # @return [String]
12
+ # @return [Array<String, Sass::Script::Tree::Node>]
11
13
  attr_accessor :value
12
14
 
13
- # Whether the comment is loud.
14
- #
15
- # Loud comments start with ! and force the comment to be generated
16
- # irrespective of compilation settings or the comment syntax used.
15
+ # The text of the comment
16
+ # after any interpolated SassScript has been resolved.
17
+ # Only set once \{Tree::Visitors::Perform} has been run.
17
18
  #
18
- # @return [Boolean]
19
- attr_accessor :loud
19
+ # @return [String]
20
+ attr_accessor :resolved_value
20
21
 
21
- # Whether or not the comment is silent (that is, doesn't output to CSS).
22
+ # The type of the comment. `:silent` means it's never output to CSS,
23
+ # `:normal` means it's output in every compile mode except `:compressed`,
24
+ # and `:loud` means it's output even in `:compressed`.
22
25
  #
23
- # @return [Boolean]
24
- attr_accessor :silent
26
+ # @return [Symbol]
27
+ attr_accessor :type
25
28
 
26
- # @param value [String] See \{#value}
27
- # @param silent [Boolean] See \{#silent}
28
- def initialize(value, silent)
29
- @lines = []
30
- @silent = silent
31
- @value = normalize_indentation value
32
- @loud = @value =~ %r{^(/[\/\*])?!}
33
- @value.sub!("#{$1}!", $1.to_s) if @loud
29
+ # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value}
30
+ # @param type [Symbol] See \{#type}
31
+ def initialize(value, type)
32
+ @value = Sass::Util.with_extracted_values(value) {|str| normalize_indentation str}
33
+ @type = type
34
34
  super()
35
35
  end
36
36
 
@@ -40,7 +40,7 @@ module Sass::Tree
40
40
  # @return [Boolean] Whether or not this node and the other object
41
41
  # are the same
42
42
  def ==(other)
43
- self.class == other.class && value == other.value && silent == other.silent
43
+ self.class == other.class && value == other.value && type == other.type
44
44
  end
45
45
 
46
46
  # Returns `true` if this is a silent comment
@@ -50,28 +50,33 @@ module Sass::Tree
50
50
  #
51
51
  # @return [Boolean]
52
52
  def invisible?
53
- if @loud
54
- return false
55
- else
56
- @silent || (style == :compressed)
53
+ case @type
54
+ when :loud; false
55
+ when :silent; true
56
+ else; style == :compressed
57
57
  end
58
58
  end
59
59
 
60
- # Returns whether this comment should be interpolated for dynamic comment generation.
61
- def evaluated?
62
- @loud
60
+ # Returns the number of lines in the comment.
61
+ #
62
+ # @return [Fixnum]
63
+ def lines
64
+ @value.inject(0) do |s, e|
65
+ next s + e.count("\n") if e.is_a?(String)
66
+ next s
67
+ end
63
68
  end
64
69
 
65
70
  private
66
71
 
67
72
  def normalize_indentation(str)
68
- pre = str.split("\n").inject(str[/^[ \t]*/].split("")) do |pre, line|
73
+ ind = str.split("\n").inject(str[/^[ \t]*/].split("")) do |pre, line|
69
74
  line[/^[ \t]*/].split("").zip(pre).inject([]) do |arr, (a, b)|
70
75
  break arr if a != b
71
- arr + [a]
76
+ arr << a
72
77
  end
73
78
  end.join
74
- str.gsub(/^#{pre}/, '')
79
+ str.gsub(/^#{ind}/, '')
75
80
  end
76
81
  end
77
82
  end
@@ -0,0 +1,9 @@
1
+ module Sass
2
+ module Tree
3
+ # A node representing the placement within a mixin of the include statement's content.
4
+ #
5
+ # @see Sass::Tree
6
+ class ContentNode < Node
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,60 @@
1
+ module Sass::Tree
2
+ # A node representing an `@import` rule that's importing plain CSS.
3
+ #
4
+ # @see Sass::Tree
5
+ class CssImportNode < DirectiveNode
6
+ # The URI being imported, either as a plain string or an interpolated
7
+ # script string.
8
+ #
9
+ # @return [String, Sass::Script::Tree::Node]
10
+ attr_accessor :uri
11
+
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.
14
+ #
15
+ # @return [String]
16
+ attr_accessor :resolved_uri
17
+
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
+ #
22
+ # @return [Array<String, Sass::Script::Tree::Node>]
23
+ attr_accessor :query
24
+
25
+ # The media query for this rule, without any unresolved interpolation.
26
+ # It's only set once {Tree::Visitors::Perform} has been run.
27
+ #
28
+ # @return [Sass::Media::QueryList]
29
+ attr_accessor :resolved_query
30
+
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
+ @uri = uri
35
+ @query = query
36
+ super('')
37
+ end
38
+
39
+ # @param uri [String] See \{#resolved_uri}
40
+ # @return [CssImportNode]
41
+ def self.resolved(uri)
42
+ node = new(uri)
43
+ node.resolved_uri = uri
44
+ node
45
+ end
46
+
47
+ # @see DirectiveNode#value
48
+ def value; raise NotImplementedError; end
49
+
50
+ # @see DirectiveNode#resolved_value
51
+ def resolved_value
52
+ @resolved_value ||=
53
+ begin
54
+ str = "@import #{resolved_uri}"
55
+ str << " #{resolved_query.to_css}" if resolved_query
56
+ str
57
+ end
58
+ end
59
+ end
60
+ end
@@ -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]
9
- attr_reader :expr
8
+ # @return [Script::Tree::Node]
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()
@@ -9,15 +9,45 @@ module Sass::Tree
9
9
  #
10
10
  # @see Sass::Tree
11
11
  class DirectiveNode < Node
12
- # The text of the directive, `@` and all.
12
+ # The text of the directive, `@` and all, with interpolation included.
13
13
  #
14
- # @return [String]
14
+ # @return [Array<String, Sass::Script::Tree::Node>]
15
15
  attr_accessor :value
16
16
 
17
- # @param value [String] See \{#value}
17
+ # The text of the directive after any interpolated SassScript has been resolved.
18
+ # Only set once \{Tree::Visitors::Perform} has been run.
19
+ #
20
+ # @return [String]
21
+ attr_accessor :resolved_value
22
+
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}
18
30
  def initialize(value)
19
31
  @value = value
32
+ @tabs = 0
20
33
  super()
21
34
  end
35
+
36
+ # @param value [String] See \{#resolved_value}
37
+ # @return [DirectiveNode]
38
+ def self.resolved(value)
39
+ node = new([value])
40
+ node.resolved_value = value
41
+ node
42
+ end
43
+
44
+ # @return [String] The name of the directive, including `@`.
45
+ def name
46
+ value.first.gsub(/ .*$/, '')
47
+ end
48
+
49
+ def bubbles?
50
+ has_children
51
+ end
22
52
  end
23
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]
14
- attr_reader :list
13
+ # @return [Script::Tree::Node]
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,18 +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>]
18
- attr_reader :selector
17
+ # @return [Array<String, Sass::Script::Tree::Node>]
18
+ attr_accessor :selector
19
19
 
20
- # @param selector [Array<String, Sass::Script::Node>]
20
+ # The extended selector source range.
21
+ #
22
+ # @return [Sass::Source::Range]
23
+ attr_accessor :selector_source_range
24
+
25
+ # Whether the `@extend` is allowed to match no selectors or not.
26
+ #
27
+ # @return [Boolean]
28
+ def optional?; @optional; end
29
+
30
+ # @param selector [Array<String, Sass::Script::Tree::Node>]
21
31
  # The CSS selector to extend,
22
- # interspersed with {Sass::Script::Node}s
32
+ # interspersed with {Sass::Script::Tree::Node}s
23
33
  # representing `#{}`-interpolation.
24
- def initialize(selector)
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)
25
37
  @selector = selector
38
+ @optional = optional
39
+ @selector_source_range = selector_source_range
26
40
  super()
27
41
  end
28
42
  end
@@ -10,20 +10,20 @@ module Sass::Tree
10
10
  attr_reader :var
11
11
 
12
12
  # The parse tree for the initial expression.
13
- # @return [Script::Node]
14
- attr_reader :from
13
+ # @return [Script::Tree::Node]
14
+ attr_accessor :from
15
15
 
16
16
  # The parse tree for the final expression.
17
- # @return [Script::Node]
18
- attr_reader :to
17
+ # @return [Script::Tree::Node]
18
+ attr_accessor :to
19
19
 
20
20
  # Whether to include `to` in the loop or stop just before.
21
21
  # @return [Boolean]
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,14 +12,22 @@ 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>]
16
- attr_reader :args
15
+ # @return [Array<Script::Tree::Node>]
16
+ attr_accessor :args
17
+
18
+ # The splat argument for this function, if one exists.
19
+ #
20
+ # @return [Script::Tree::Node?]
21
+ attr_accessor :splat
17
22
 
18
23
  # @param name [String] The function name
19
- # @param args [Array<(Script::Node, Script::Node)>] The arguments for the function.
20
- def initialize(name, args)
24
+ # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>]
25
+ # The arguments for the function.
26
+ # @param splat [Script::Tree::Node] See \{#splat}
27
+ def initialize(name, args, splat)
21
28
  @name = name
22
29
  @args = args
30
+ @splat = splat
23
31
  super()
24
32
  end
25
33
  end
@@ -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
- attr_reader :expr
16
+ attr_accessor :expr
17
17
 
18
18
  # The next {IfNode} in the if-else list, or `nil`.
19
19
  #
@@ -35,14 +35,8 @@ 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
- Marshal.dump([self.expr, self.else, self.children])
39
+ Marshal.dump([expr, self.else, children])
46
40
  end
47
41
 
48
42
  def self._load(data)
@@ -54,12 +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
51
  end
65
52
  end
@@ -9,6 +9,9 @@ module Sass
9
9
  # @return [String]
10
10
  attr_reader :imported_filename
11
11
 
12
+ # Sets the imported file.
13
+ attr_writer :imported_file
14
+
12
15
  # @param imported_filename [String] The name of the imported file
13
16
  def initialize(imported_filename)
14
17
  @imported_filename = imported_filename
@@ -43,14 +46,13 @@ module Sass
43
46
 
44
47
  if @options[:importer]
45
48
  f = @options[:importer].find_relative(
46
- @imported_filename, @options[:filename], @options.dup)
49
+ @imported_filename, @options[:filename], options_for_importer)
47
50
  return f if f
48
51
  end
49
52
 
50
53
  paths.each do |p|
51
- if f = p.find(@imported_filename, @options.dup)
52
- return f
53
- end
54
+ f = p.find(@imported_filename, options_for_importer)
55
+ return f if f
54
56
  end
55
57
 
56
58
  message = "File to import not found or unreadable: #{@imported_filename}.\n"
@@ -61,7 +63,11 @@ module Sass
61
63
  end
62
64
  raise SyntaxError.new(message)
63
65
  rescue SyntaxError => e
64
- raise SyntaxError.new(e.message, :line => self.line, :filename => @filename)
66
+ raise SyntaxError.new(e.message, :line => line, :filename => @filename)
67
+ end
68
+
69
+ def options_for_importer
70
+ @options.merge(:_from_import_node => true)
65
71
  end
66
72
  end
67
73
  end
@@ -6,27 +6,43 @@ module Sass::Tree
6
6
  #
7
7
  # @see Sass::Tree
8
8
  class MediaNode < DirectiveNode
9
- # The media query (e.g. `print` or `screen`).
9
+ # TODO: parse and cache the query immediately if it has no dynamic elements
10
+
11
+ # The media query for this rule, interspersed with {Sass::Script::Tree::Node}s
12
+ # representing `#{}`-interpolation. Any adjacent strings will be merged
13
+ # together.
10
14
  #
11
- # @return [String]
15
+ # @return [Array<String, Sass::Script::Tree::Node>]
12
16
  attr_accessor :query
13
17
 
14
- # @see RuleNode#tabs
15
- attr_accessor :tabs
16
-
17
- # @see RuleNode#group_end
18
- attr_accessor :group_end
18
+ # The media query for this rule, without any unresolved interpolation. It's
19
+ # only set once {Tree::Visitors::Perform} has been run.
20
+ #
21
+ # @return [Sass::Media::QueryList]
22
+ attr_accessor :resolved_query
19
23
 
20
- # @param query [String] See \{#query}
24
+ # @param query [Array<String, Sass::Script::Tree::Node>] See \{#query}
21
25
  def initialize(query)
22
26
  @query = query
23
- @tabs = 0
24
27
  super('')
25
28
  end
26
29
 
27
30
  # @see DirectiveNode#value
28
- def value
29
- "@media #{query}"
31
+ def value; raise NotImplementedError; end
32
+
33
+ # @see DirectiveNode#name
34
+ def name; '@media'; end
35
+
36
+ # @see DirectiveNode#resolved_value
37
+ def resolved_value
38
+ @resolved_value ||= "@media #{resolved_query.to_css}"
39
+ end
40
+
41
+ # True when the directive has no visible children.
42
+ #
43
+ # @return [Boolean]
44
+ def invisible?
45
+ children.all? {|c| c.invisible?}
30
46
  end
31
47
  end
32
48
  end
@@ -12,14 +12,25 @@ 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)>]
16
- attr_reader :args
15
+ # @return [Array<(Script::Tree::Node, Script::Tree::Node)>]
16
+ attr_accessor :args
17
+
18
+ # The splat argument for this mixin, if one exists.
19
+ #
20
+ # @return [Script::Tree::Node?]
21
+ attr_accessor :splat
22
+
23
+ # Whether the mixin uses `@content`. Set during the nesting check phase.
24
+ # @return [Boolean]
25
+ attr_accessor :has_content
17
26
 
18
27
  # @param name [String] The mixin name
19
- # @param args [Array<(Script::Node, Script::Node)>] See \{#args}
20
- def initialize(name, args)
28
+ # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>] See \{#args}
29
+ # @param splat [Script::Tree::Node] See \{#splat}
30
+ def initialize(name, args, splat)
21
31
  @name = name
22
32
  @args = args
33
+ @splat = splat
23
34
  super()
24
35
  end
25
36
  end
@@ -12,20 +12,40 @@ module Sass::Tree
12
12
  attr_reader :name
13
13
 
14
14
  # The arguments to the mixin.
15
- # @return [Array<Script::Node>]
16
- attr_reader :args
15
+ # @return [Array<Script::Tree::Node>]
16
+ attr_accessor :args
17
17
 
18
18
  # A hash from keyword argument names to values.
19
- # @return [{String => Script::Node}]
20
- attr_reader :keywords
19
+ # @return [Sass::Util::NormalizedMap<Script::Tree::Node>]
20
+ attr_accessor :keywords
21
+
22
+ # The first splat argument for this mixin, if one exists.
23
+ #
24
+ # This could be a list of positional arguments, a map of keyword
25
+ # arguments, or an arglist containing both.
26
+ #
27
+ # @return [Node?]
28
+ attr_accessor :splat
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
21
37
 
22
38
  # @param name [String] The name of the mixin
23
- # @param args [Array<Script::Node>] See \{#args}
24
- # @param keywords [{String => Script::Node}] See \{#keywords}
25
- def initialize(name, args, keywords)
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 [Sass::Util::NormalizedMap<Script::Tree::Node>] See \{#keywords}
43
+ def initialize(name, args, keywords, splat, kwarg_splat)
26
44
  @name = name
27
45
  @args = args
28
46
  @keywords = keywords
47
+ @splat = splat
48
+ @kwarg_splat = kwarg_splat
29
49
  super()
30
50
  end
31
51
  end