aliddle-sass 1.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 (238) hide show
  1. data/.yardopts +11 -0
  2. data/CONTRIBUTING +3 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +201 -0
  5. data/Rakefile +347 -0
  6. data/VERSION +1 -0
  7. data/VERSION_NAME +1 -0
  8. data/bin/sass +9 -0
  9. data/bin/sass-convert +8 -0
  10. data/bin/scss +9 -0
  11. data/extra/update_watch.rb +13 -0
  12. data/init.rb +18 -0
  13. data/lib/sass.rb +95 -0
  14. data/lib/sass/cache_stores.rb +15 -0
  15. data/lib/sass/cache_stores/base.rb +88 -0
  16. data/lib/sass/cache_stores/chain.rb +33 -0
  17. data/lib/sass/cache_stores/filesystem.rb +60 -0
  18. data/lib/sass/cache_stores/memory.rb +47 -0
  19. data/lib/sass/cache_stores/null.rb +25 -0
  20. data/lib/sass/callbacks.rb +66 -0
  21. data/lib/sass/css.rb +409 -0
  22. data/lib/sass/engine.rb +928 -0
  23. data/lib/sass/environment.rb +101 -0
  24. data/lib/sass/error.rb +201 -0
  25. data/lib/sass/exec.rb +707 -0
  26. data/lib/sass/importers.rb +22 -0
  27. data/lib/sass/importers/base.rb +139 -0
  28. data/lib/sass/importers/filesystem.rb +190 -0
  29. data/lib/sass/logger.rb +15 -0
  30. data/lib/sass/logger/base.rb +32 -0
  31. data/lib/sass/logger/log_level.rb +49 -0
  32. data/lib/sass/media.rb +213 -0
  33. data/lib/sass/plugin.rb +132 -0
  34. data/lib/sass/plugin/compiler.rb +406 -0
  35. data/lib/sass/plugin/configuration.rb +123 -0
  36. data/lib/sass/plugin/generic.rb +15 -0
  37. data/lib/sass/plugin/merb.rb +48 -0
  38. data/lib/sass/plugin/rack.rb +60 -0
  39. data/lib/sass/plugin/rails.rb +47 -0
  40. data/lib/sass/plugin/staleness_checker.rb +183 -0
  41. data/lib/sass/railtie.rb +9 -0
  42. data/lib/sass/repl.rb +57 -0
  43. data/lib/sass/root.rb +7 -0
  44. data/lib/sass/script.rb +39 -0
  45. data/lib/sass/script/arg_list.rb +52 -0
  46. data/lib/sass/script/bool.rb +18 -0
  47. data/lib/sass/script/color.rb +606 -0
  48. data/lib/sass/script/css_lexer.rb +29 -0
  49. data/lib/sass/script/css_parser.rb +31 -0
  50. data/lib/sass/script/funcall.rb +237 -0
  51. data/lib/sass/script/functions.rb +1543 -0
  52. data/lib/sass/script/interpolation.rb +79 -0
  53. data/lib/sass/script/lexer.rb +348 -0
  54. data/lib/sass/script/list.rb +85 -0
  55. data/lib/sass/script/literal.rb +221 -0
  56. data/lib/sass/script/node.rb +99 -0
  57. data/lib/sass/script/null.rb +37 -0
  58. data/lib/sass/script/number.rb +453 -0
  59. data/lib/sass/script/operation.rb +110 -0
  60. data/lib/sass/script/parser.rb +495 -0
  61. data/lib/sass/script/string.rb +51 -0
  62. data/lib/sass/script/string_interpolation.rb +103 -0
  63. data/lib/sass/script/unary_operation.rb +69 -0
  64. data/lib/sass/script/variable.rb +58 -0
  65. data/lib/sass/scss.rb +16 -0
  66. data/lib/sass/scss/css_parser.rb +36 -0
  67. data/lib/sass/scss/parser.rb +1179 -0
  68. data/lib/sass/scss/rx.rb +133 -0
  69. data/lib/sass/scss/script_lexer.rb +15 -0
  70. data/lib/sass/scss/script_parser.rb +25 -0
  71. data/lib/sass/scss/static_parser.rb +54 -0
  72. data/lib/sass/selector.rb +452 -0
  73. data/lib/sass/selector/abstract_sequence.rb +94 -0
  74. data/lib/sass/selector/comma_sequence.rb +92 -0
  75. data/lib/sass/selector/sequence.rb +507 -0
  76. data/lib/sass/selector/simple.rb +119 -0
  77. data/lib/sass/selector/simple_sequence.rb +212 -0
  78. data/lib/sass/shared.rb +76 -0
  79. data/lib/sass/supports.rb +229 -0
  80. data/lib/sass/tree/charset_node.rb +22 -0
  81. data/lib/sass/tree/comment_node.rb +82 -0
  82. data/lib/sass/tree/content_node.rb +9 -0
  83. data/lib/sass/tree/css_import_node.rb +60 -0
  84. data/lib/sass/tree/debug_node.rb +18 -0
  85. data/lib/sass/tree/directive_node.rb +42 -0
  86. data/lib/sass/tree/each_node.rb +24 -0
  87. data/lib/sass/tree/extend_node.rb +36 -0
  88. data/lib/sass/tree/for_node.rb +36 -0
  89. data/lib/sass/tree/function_node.rb +34 -0
  90. data/lib/sass/tree/if_node.rb +52 -0
  91. data/lib/sass/tree/import_node.rb +75 -0
  92. data/lib/sass/tree/media_node.rb +58 -0
  93. data/lib/sass/tree/mixin_def_node.rb +38 -0
  94. data/lib/sass/tree/mixin_node.rb +39 -0
  95. data/lib/sass/tree/node.rb +196 -0
  96. data/lib/sass/tree/prop_node.rb +152 -0
  97. data/lib/sass/tree/return_node.rb +18 -0
  98. data/lib/sass/tree/root_node.rb +28 -0
  99. data/lib/sass/tree/rule_node.rb +132 -0
  100. data/lib/sass/tree/supports_node.rb +51 -0
  101. data/lib/sass/tree/trace_node.rb +32 -0
  102. data/lib/sass/tree/variable_node.rb +30 -0
  103. data/lib/sass/tree/visitors/base.rb +75 -0
  104. data/lib/sass/tree/visitors/check_nesting.rb +147 -0
  105. data/lib/sass/tree/visitors/convert.rb +316 -0
  106. data/lib/sass/tree/visitors/cssize.rb +229 -0
  107. data/lib/sass/tree/visitors/deep_copy.rb +102 -0
  108. data/lib/sass/tree/visitors/extend.rb +68 -0
  109. data/lib/sass/tree/visitors/perform.rb +446 -0
  110. data/lib/sass/tree/visitors/set_options.rb +125 -0
  111. data/lib/sass/tree/visitors/to_css.rb +230 -0
  112. data/lib/sass/tree/warn_node.rb +18 -0
  113. data/lib/sass/tree/while_node.rb +18 -0
  114. data/lib/sass/util.rb +906 -0
  115. data/lib/sass/util/multibyte_string_scanner.rb +155 -0
  116. data/lib/sass/util/subset_map.rb +109 -0
  117. data/lib/sass/util/test.rb +10 -0
  118. data/lib/sass/version.rb +126 -0
  119. data/rails/init.rb +1 -0
  120. data/test/Gemfile +3 -0
  121. data/test/Gemfile.lock +10 -0
  122. data/test/sass/cache_test.rb +89 -0
  123. data/test/sass/callbacks_test.rb +61 -0
  124. data/test/sass/conversion_test.rb +1760 -0
  125. data/test/sass/css2sass_test.rb +439 -0
  126. data/test/sass/data/hsl-rgb.txt +319 -0
  127. data/test/sass/engine_test.rb +3243 -0
  128. data/test/sass/exec_test.rb +86 -0
  129. data/test/sass/extend_test.rb +1461 -0
  130. data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  131. data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  132. data/test/sass/functions_test.rb +1139 -0
  133. data/test/sass/importer_test.rb +192 -0
  134. data/test/sass/logger_test.rb +58 -0
  135. data/test/sass/mock_importer.rb +49 -0
  136. data/test/sass/more_results/more1.css +9 -0
  137. data/test/sass/more_results/more1_with_line_comments.css +26 -0
  138. data/test/sass/more_results/more_import.css +29 -0
  139. data/test/sass/more_templates/_more_partial.sass +2 -0
  140. data/test/sass/more_templates/more1.sass +23 -0
  141. data/test/sass/more_templates/more_import.sass +11 -0
  142. data/test/sass/plugin_test.rb +550 -0
  143. data/test/sass/results/alt.css +4 -0
  144. data/test/sass/results/basic.css +9 -0
  145. data/test/sass/results/cached_import_option.css +3 -0
  146. data/test/sass/results/compact.css +5 -0
  147. data/test/sass/results/complex.css +86 -0
  148. data/test/sass/results/compressed.css +1 -0
  149. data/test/sass/results/expanded.css +19 -0
  150. data/test/sass/results/filename_fn.css +3 -0
  151. data/test/sass/results/if.css +3 -0
  152. data/test/sass/results/import.css +31 -0
  153. data/test/sass/results/import_charset.css +5 -0
  154. data/test/sass/results/import_charset_1_8.css +5 -0
  155. data/test/sass/results/import_charset_ibm866.css +5 -0
  156. data/test/sass/results/import_content.css +1 -0
  157. data/test/sass/results/line_numbers.css +49 -0
  158. data/test/sass/results/mixins.css +95 -0
  159. data/test/sass/results/multiline.css +24 -0
  160. data/test/sass/results/nested.css +22 -0
  161. data/test/sass/results/options.css +1 -0
  162. data/test/sass/results/parent_ref.css +13 -0
  163. data/test/sass/results/script.css +16 -0
  164. data/test/sass/results/scss_import.css +31 -0
  165. data/test/sass/results/scss_importee.css +2 -0
  166. data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  167. data/test/sass/results/subdir/subdir.css +3 -0
  168. data/test/sass/results/units.css +11 -0
  169. data/test/sass/results/warn.css +0 -0
  170. data/test/sass/results/warn_imported.css +0 -0
  171. data/test/sass/script_conversion_test.rb +299 -0
  172. data/test/sass/script_test.rb +591 -0
  173. data/test/sass/scss/css_test.rb +1093 -0
  174. data/test/sass/scss/rx_test.rb +156 -0
  175. data/test/sass/scss/scss_test.rb +2043 -0
  176. data/test/sass/scss/test_helper.rb +37 -0
  177. data/test/sass/templates/_cached_import_option_partial.scss +1 -0
  178. data/test/sass/templates/_double_import_loop2.sass +1 -0
  179. data/test/sass/templates/_filename_fn_import.scss +11 -0
  180. data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  181. data/test/sass/templates/_imported_charset_utf8.sass +4 -0
  182. data/test/sass/templates/_imported_content.sass +3 -0
  183. data/test/sass/templates/_partial.sass +2 -0
  184. data/test/sass/templates/_same_name_different_partiality.scss +1 -0
  185. data/test/sass/templates/alt.sass +16 -0
  186. data/test/sass/templates/basic.sass +23 -0
  187. data/test/sass/templates/bork1.sass +2 -0
  188. data/test/sass/templates/bork2.sass +2 -0
  189. data/test/sass/templates/bork3.sass +2 -0
  190. data/test/sass/templates/bork4.sass +2 -0
  191. data/test/sass/templates/bork5.sass +3 -0
  192. data/test/sass/templates/cached_import_option.scss +3 -0
  193. data/test/sass/templates/compact.sass +17 -0
  194. data/test/sass/templates/complex.sass +305 -0
  195. data/test/sass/templates/compressed.sass +15 -0
  196. data/test/sass/templates/double_import_loop1.sass +1 -0
  197. data/test/sass/templates/expanded.sass +17 -0
  198. data/test/sass/templates/filename_fn.scss +18 -0
  199. data/test/sass/templates/if.sass +11 -0
  200. data/test/sass/templates/import.sass +12 -0
  201. data/test/sass/templates/import_charset.sass +9 -0
  202. data/test/sass/templates/import_charset_1_8.sass +6 -0
  203. data/test/sass/templates/import_charset_ibm866.sass +11 -0
  204. data/test/sass/templates/import_content.sass +4 -0
  205. data/test/sass/templates/importee.less +2 -0
  206. data/test/sass/templates/importee.sass +19 -0
  207. data/test/sass/templates/line_numbers.sass +13 -0
  208. data/test/sass/templates/mixin_bork.sass +5 -0
  209. data/test/sass/templates/mixins.sass +76 -0
  210. data/test/sass/templates/multiline.sass +20 -0
  211. data/test/sass/templates/nested.sass +25 -0
  212. data/test/sass/templates/nested_bork1.sass +2 -0
  213. data/test/sass/templates/nested_bork2.sass +2 -0
  214. data/test/sass/templates/nested_bork3.sass +2 -0
  215. data/test/sass/templates/nested_bork4.sass +2 -0
  216. data/test/sass/templates/nested_import.sass +2 -0
  217. data/test/sass/templates/nested_mixin_bork.sass +6 -0
  218. data/test/sass/templates/options.sass +2 -0
  219. data/test/sass/templates/parent_ref.sass +25 -0
  220. data/test/sass/templates/same_name_different_ext.sass +2 -0
  221. data/test/sass/templates/same_name_different_ext.scss +1 -0
  222. data/test/sass/templates/same_name_different_partiality.scss +1 -0
  223. data/test/sass/templates/script.sass +101 -0
  224. data/test/sass/templates/scss_import.scss +11 -0
  225. data/test/sass/templates/scss_importee.scss +1 -0
  226. data/test/sass/templates/single_import_loop.sass +1 -0
  227. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  228. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  229. data/test/sass/templates/subdir/subdir.sass +6 -0
  230. data/test/sass/templates/units.sass +11 -0
  231. data/test/sass/templates/warn.sass +3 -0
  232. data/test/sass/templates/warn_imported.sass +4 -0
  233. data/test/sass/test_helper.rb +8 -0
  234. data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
  235. data/test/sass/util/subset_map_test.rb +91 -0
  236. data/test/sass/util_test.rb +313 -0
  237. data/test/test_helper.rb +80 -0
  238. metadata +348 -0
@@ -0,0 +1,22 @@
1
+ module Sass::Tree
2
+ # A static node representing an unproccessed Sass `@charset` directive.
3
+ #
4
+ # @see Sass::Tree
5
+ class CharsetNode < Node
6
+ # The name of the charset.
7
+ #
8
+ # @return [String]
9
+ attr_accessor :name
10
+
11
+ # @param name [String] see \{#name}
12
+ def initialize(name)
13
+ @name = name
14
+ super()
15
+ end
16
+
17
+ # @see Node#invisible?
18
+ def invisible?
19
+ !Sass::Util.ruby1_8?
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,82 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A static node representing a Sass comment (silent or loud).
5
+ #
6
+ # @see Sass::Tree
7
+ class CommentNode < Node
8
+ # The text of the comment, not including `/*` and `*/`.
9
+ # Interspersed with {Sass::Script::Node}s representing `#{}`-interpolation
10
+ # if this is a loud comment.
11
+ #
12
+ # @return [Array<String, Sass::Script::Node>]
13
+ attr_accessor :value
14
+
15
+ # The text of the comment
16
+ # after any interpolated SassScript has been resolved.
17
+ # Only set once \{Tree::Visitors::Perform} has been run.
18
+ #
19
+ # @return [String]
20
+ attr_accessor :resolved_value
21
+
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`.
25
+ #
26
+ # @return [Symbol]
27
+ attr_accessor :type
28
+
29
+ # @param value [Array<String, Sass::Script::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
+ super()
35
+ end
36
+
37
+ # Compares the contents of two comments.
38
+ #
39
+ # @param other [Object] The object to compare with
40
+ # @return [Boolean] Whether or not this node and the other object
41
+ # are the same
42
+ def ==(other)
43
+ self.class == other.class && value == other.value && type == other.type
44
+ end
45
+
46
+ # Returns `true` if this is a silent comment
47
+ # or the current style doesn't render comments.
48
+ #
49
+ # Comments starting with ! are never invisible (and the ! is removed from the output.)
50
+ #
51
+ # @return [Boolean]
52
+ def invisible?
53
+ case @type
54
+ when :loud; false
55
+ when :silent; true
56
+ else; style == :compressed
57
+ end
58
+ end
59
+
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
68
+ end
69
+
70
+ private
71
+
72
+ def normalize_indentation(str)
73
+ ind = str.split("\n").inject(str[/^[ \t]*/].split("")) do |pre, line|
74
+ line[/^[ \t]*/].split("").zip(pre).inject([]) do |arr, (a, b)|
75
+ break arr if a != b
76
+ arr << a
77
+ end
78
+ end.join
79
+ str.gsub(/^#{ind}/, '')
80
+ end
81
+ end
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::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 {Sass::Script::Node}s
19
+ # representing `#{}`-interpolation. Any adjacent strings will be merged
20
+ # together.
21
+ #
22
+ # @return [Array<String, Sass::Script::Node>]
23
+ attr_accessor :query
24
+
25
+ # The media query for this rule, without any unresolved interpolation. It's
26
+ # only set once {Tree::Node#perform} has been called.
27
+ #
28
+ # @return [Sass::Media::QueryList]
29
+ attr_accessor :resolved_query
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)
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
@@ -0,0 +1,18 @@
1
+ module Sass
2
+ module Tree
3
+ # A dynamic node representing a Sass `@debug` statement.
4
+ #
5
+ # @see Sass::Tree
6
+ class DebugNode < Node
7
+ # The expression to print.
8
+ # @return [Script::Node]
9
+ attr_accessor :expr
10
+
11
+ # @param expr [Script::Node] The expression to print
12
+ def initialize(expr)
13
+ @expr = expr
14
+ super()
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,42 @@
1
+ module Sass::Tree
2
+ # A static node representing an unproccessed Sass `@`-directive.
3
+ # Directives known to Sass, like `@for` and `@debug`,
4
+ # are handled by their own nodes;
5
+ # only CSS directives like `@media` and `@font-face` become {DirectiveNode}s.
6
+ #
7
+ # `@import` and `@charset` are special cases;
8
+ # they become {ImportNode}s and {CharsetNode}s, respectively.
9
+ #
10
+ # @see Sass::Tree
11
+ class DirectiveNode < Node
12
+ # The text of the directive, `@` and all, with interpolation included.
13
+ #
14
+ # @return [Array<String, Sass::Script::Node>]
15
+ attr_accessor :value
16
+
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
+ # @param value [Array<String, Sass::Script::Node>] See \{#value}
24
+ def initialize(value)
25
+ @value = value
26
+ super()
27
+ end
28
+
29
+ # @param value [String] See \{#resolved_value}
30
+ # @return [DirectiveNode]
31
+ def self.resolved(value)
32
+ node = new([value])
33
+ node.resolved_value = value
34
+ node
35
+ end
36
+
37
+ # @return [String] The name of the directive, including `@`.
38
+ def name
39
+ value.first.gsub(/ .*$/, '')
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,24 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A dynamic node representing a Sass `@each` loop.
5
+ #
6
+ # @see Sass::Tree
7
+ class EachNode < Node
8
+ # The name of the loop variable.
9
+ # @return [String]
10
+ attr_reader :var
11
+
12
+ # The parse tree for the list.
13
+ # @param [Script::Node]
14
+ attr_accessor :list
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
20
+ @list = list
21
+ super()
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A static node reprenting an `@extend` directive.
5
+ #
6
+ # @see Sass::Tree
7
+ class ExtendNode < Node
8
+ # The parsed selector after interpolation has been resolved.
9
+ # Only set once {Tree::Visitors::Perform} has been run.
10
+ #
11
+ # @return [Selector::CommaSequence]
12
+ attr_accessor :resolved_selector
13
+
14
+ # The CSS selector to extend, interspersed with {Sass::Script::Node}s
15
+ # representing `#{}`-interpolation.
16
+ #
17
+ # @return [Array<String, Sass::Script::Node>]
18
+ attr_accessor :selector
19
+
20
+ # Whether the `@extend` is allowed to match no selectors or not.
21
+ #
22
+ # @return [Boolean]
23
+ def optional?; @optional; end
24
+
25
+ # @param selector [Array<String, Sass::Script::Node>]
26
+ # The CSS selector to extend,
27
+ # interspersed with {Sass::Script::Node}s
28
+ # representing `#{}`-interpolation.
29
+ # @param optional [Boolean] See \{#optional}
30
+ def initialize(selector, optional)
31
+ @selector = selector
32
+ @optional = optional
33
+ super()
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A dynamic node representing a Sass `@for` loop.
5
+ #
6
+ # @see Sass::Tree
7
+ class ForNode < Node
8
+ # The name of the loop variable.
9
+ # @return [String]
10
+ attr_reader :var
11
+
12
+ # The parse tree for the initial expression.
13
+ # @return [Script::Node]
14
+ attr_accessor :from
15
+
16
+ # The parse tree for the final expression.
17
+ # @return [Script::Node]
18
+ attr_accessor :to
19
+
20
+ # Whether to include `to` in the loop or stop just before.
21
+ # @return [Boolean]
22
+ attr_reader :exclusive
23
+
24
+ # @param var [String] See \{#var}
25
+ # @param from [Script::Node] See \{#from}
26
+ # @param to [Script::Node] See \{#to}
27
+ # @param exclusive [Boolean] See \{#exclusive}
28
+ def initialize(var, from, to, exclusive)
29
+ @var = var
30
+ @from = from
31
+ @to = to
32
+ @exclusive = exclusive
33
+ super()
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ module Sass
2
+ module Tree
3
+ # A dynamic node representing a function definition.
4
+ #
5
+ # @see Sass::Tree
6
+ class FunctionNode < Node
7
+ # The name of the function.
8
+ # @return [String]
9
+ attr_reader :name
10
+
11
+ # The arguments to the function. Each element is a tuple
12
+ # containing the variable for argument and the parse tree for
13
+ # the default value of the argument
14
+ #
15
+ # @return [Array<Script::Node>]
16
+ attr_accessor :args
17
+
18
+ # The splat argument for this function, if one exists.
19
+ #
20
+ # @return [Script::Node?]
21
+ attr_accessor :splat
22
+
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}
26
+ def initialize(name, args, splat)
27
+ @name = name
28
+ @args = args
29
+ @splat = splat
30
+ super()
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,52 @@
1
+ require 'sass/tree/node'
2
+
3
+ module Sass::Tree
4
+ # A dynamic node representing a Sass `@if` statement.
5
+ #
6
+ # {IfNode}s are a little odd, in that they also represent `@else` and `@else if`s.
7
+ # This is done as a linked list:
8
+ # each {IfNode} has a link (\{#else}) to the next {IfNode}.
9
+ #
10
+ # @see Sass::Tree
11
+ class IfNode < Node
12
+ # The conditional expression.
13
+ # If this is nil, this is an `@else` node, not an `@else if`.
14
+ #
15
+ # @return [Script::Expr]
16
+ attr_accessor :expr
17
+
18
+ # The next {IfNode} in the if-else list, or `nil`.
19
+ #
20
+ # @return [IfNode]
21
+ attr_accessor :else
22
+
23
+ # @param expr [Script::Expr] See \{#expr}
24
+ def initialize(expr)
25
+ @expr = expr
26
+ @last_else = self
27
+ super()
28
+ end
29
+
30
+ # Append an `@else` node to the end of the list.
31
+ #
32
+ # @param node [IfNode] The `@else` node to append
33
+ def add_else(node)
34
+ @last_else.else = node
35
+ @last_else = node
36
+ end
37
+
38
+ def _dump(f)
39
+ Marshal.dump([self.expr, self.else, self.children])
40
+ end
41
+
42
+ def self._load(data)
43
+ expr, else_, children = Marshal.load(data)
44
+ node = IfNode.new(expr)
45
+ node.else = else_
46
+ node.children = children
47
+ node.instance_variable_set('@last_else',
48
+ node.else ? node.else.instance_variable_get('@last_else') : node)
49
+ node
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,75 @@
1
+ module Sass
2
+ module Tree
3
+ # A static node that wraps the {Sass::Tree} for an `@import`ed file.
4
+ # It doesn't have a functional purpose other than to add the `@import`ed file
5
+ # to the backtrace if an error occurs.
6
+ class ImportNode < RootNode
7
+ # The name of the imported file as it appears in the Sass document.
8
+ #
9
+ # @return [String]
10
+ attr_reader :imported_filename
11
+
12
+ # Sets the imported file.
13
+ attr_writer :imported_file
14
+
15
+ # @param imported_filename [String] The name of the imported file
16
+ def initialize(imported_filename)
17
+ @imported_filename = imported_filename
18
+ super(nil)
19
+ end
20
+
21
+ def invisible?; to_s.empty?; end
22
+
23
+ # Returns the imported file.
24
+ #
25
+ # @return [Sass::Engine]
26
+ # @raise [Sass::SyntaxError] If no file could be found to import.
27
+ def imported_file
28
+ @imported_file ||= import
29
+ end
30
+
31
+ # Returns whether or not this import should emit a CSS @import declaration
32
+ #
33
+ # @return [Boolean] Whether or not this is a simple CSS @import declaration.
34
+ def css_import?
35
+ if @imported_filename =~ /\.css$/
36
+ @imported_filename
37
+ elsif imported_file.is_a?(String) && imported_file =~ /\.css$/
38
+ imported_file
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def import
45
+ paths = @options[:load_paths]
46
+
47
+ if @options[:importer]
48
+ f = @options[:importer].find_relative(
49
+ @imported_filename, @options[:filename], options_for_importer)
50
+ return f if f
51
+ end
52
+
53
+ paths.each do |p|
54
+ if f = p.find(@imported_filename, options_for_importer)
55
+ return f
56
+ end
57
+ end
58
+
59
+ message = "File to import not found or unreadable: #{@imported_filename}.\n"
60
+ if paths.size == 1
61
+ message << "Load path: #{paths.first}"
62
+ else
63
+ message << "Load paths:\n " << paths.join("\n ")
64
+ end
65
+ raise SyntaxError.new(message)
66
+ rescue SyntaxError => e
67
+ raise SyntaxError.new(e.message, :line => self.line, :filename => @filename)
68
+ end
69
+
70
+ def options_for_importer
71
+ @options.merge(:_line => line)
72
+ end
73
+ end
74
+ end
75
+ end