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.
- data/.yardopts +11 -0
- data/CONTRIBUTING +3 -0
- data/MIT-LICENSE +20 -0
- data/README.md +201 -0
- data/Rakefile +347 -0
- data/VERSION +1 -0
- data/VERSION_NAME +1 -0
- data/bin/sass +9 -0
- data/bin/sass-convert +8 -0
- data/bin/scss +9 -0
- data/extra/update_watch.rb +13 -0
- data/init.rb +18 -0
- data/lib/sass.rb +95 -0
- data/lib/sass/cache_stores.rb +15 -0
- data/lib/sass/cache_stores/base.rb +88 -0
- data/lib/sass/cache_stores/chain.rb +33 -0
- data/lib/sass/cache_stores/filesystem.rb +60 -0
- data/lib/sass/cache_stores/memory.rb +47 -0
- data/lib/sass/cache_stores/null.rb +25 -0
- data/lib/sass/callbacks.rb +66 -0
- data/lib/sass/css.rb +409 -0
- data/lib/sass/engine.rb +928 -0
- data/lib/sass/environment.rb +101 -0
- data/lib/sass/error.rb +201 -0
- data/lib/sass/exec.rb +707 -0
- data/lib/sass/importers.rb +22 -0
- data/lib/sass/importers/base.rb +139 -0
- data/lib/sass/importers/filesystem.rb +190 -0
- data/lib/sass/logger.rb +15 -0
- data/lib/sass/logger/base.rb +32 -0
- data/lib/sass/logger/log_level.rb +49 -0
- data/lib/sass/media.rb +213 -0
- data/lib/sass/plugin.rb +132 -0
- data/lib/sass/plugin/compiler.rb +406 -0
- data/lib/sass/plugin/configuration.rb +123 -0
- data/lib/sass/plugin/generic.rb +15 -0
- data/lib/sass/plugin/merb.rb +48 -0
- data/lib/sass/plugin/rack.rb +60 -0
- data/lib/sass/plugin/rails.rb +47 -0
- data/lib/sass/plugin/staleness_checker.rb +183 -0
- data/lib/sass/railtie.rb +9 -0
- data/lib/sass/repl.rb +57 -0
- data/lib/sass/root.rb +7 -0
- data/lib/sass/script.rb +39 -0
- data/lib/sass/script/arg_list.rb +52 -0
- data/lib/sass/script/bool.rb +18 -0
- data/lib/sass/script/color.rb +606 -0
- data/lib/sass/script/css_lexer.rb +29 -0
- data/lib/sass/script/css_parser.rb +31 -0
- data/lib/sass/script/funcall.rb +237 -0
- data/lib/sass/script/functions.rb +1543 -0
- data/lib/sass/script/interpolation.rb +79 -0
- data/lib/sass/script/lexer.rb +348 -0
- data/lib/sass/script/list.rb +85 -0
- data/lib/sass/script/literal.rb +221 -0
- data/lib/sass/script/node.rb +99 -0
- data/lib/sass/script/null.rb +37 -0
- data/lib/sass/script/number.rb +453 -0
- data/lib/sass/script/operation.rb +110 -0
- data/lib/sass/script/parser.rb +495 -0
- data/lib/sass/script/string.rb +51 -0
- data/lib/sass/script/string_interpolation.rb +103 -0
- data/lib/sass/script/unary_operation.rb +69 -0
- data/lib/sass/script/variable.rb +58 -0
- data/lib/sass/scss.rb +16 -0
- data/lib/sass/scss/css_parser.rb +36 -0
- data/lib/sass/scss/parser.rb +1179 -0
- data/lib/sass/scss/rx.rb +133 -0
- data/lib/sass/scss/script_lexer.rb +15 -0
- data/lib/sass/scss/script_parser.rb +25 -0
- data/lib/sass/scss/static_parser.rb +54 -0
- data/lib/sass/selector.rb +452 -0
- data/lib/sass/selector/abstract_sequence.rb +94 -0
- data/lib/sass/selector/comma_sequence.rb +92 -0
- data/lib/sass/selector/sequence.rb +507 -0
- data/lib/sass/selector/simple.rb +119 -0
- data/lib/sass/selector/simple_sequence.rb +212 -0
- data/lib/sass/shared.rb +76 -0
- data/lib/sass/supports.rb +229 -0
- data/lib/sass/tree/charset_node.rb +22 -0
- data/lib/sass/tree/comment_node.rb +82 -0
- data/lib/sass/tree/content_node.rb +9 -0
- data/lib/sass/tree/css_import_node.rb +60 -0
- data/lib/sass/tree/debug_node.rb +18 -0
- data/lib/sass/tree/directive_node.rb +42 -0
- data/lib/sass/tree/each_node.rb +24 -0
- data/lib/sass/tree/extend_node.rb +36 -0
- data/lib/sass/tree/for_node.rb +36 -0
- data/lib/sass/tree/function_node.rb +34 -0
- data/lib/sass/tree/if_node.rb +52 -0
- data/lib/sass/tree/import_node.rb +75 -0
- data/lib/sass/tree/media_node.rb +58 -0
- data/lib/sass/tree/mixin_def_node.rb +38 -0
- data/lib/sass/tree/mixin_node.rb +39 -0
- data/lib/sass/tree/node.rb +196 -0
- data/lib/sass/tree/prop_node.rb +152 -0
- data/lib/sass/tree/return_node.rb +18 -0
- data/lib/sass/tree/root_node.rb +28 -0
- data/lib/sass/tree/rule_node.rb +132 -0
- data/lib/sass/tree/supports_node.rb +51 -0
- data/lib/sass/tree/trace_node.rb +32 -0
- data/lib/sass/tree/variable_node.rb +30 -0
- data/lib/sass/tree/visitors/base.rb +75 -0
- data/lib/sass/tree/visitors/check_nesting.rb +147 -0
- data/lib/sass/tree/visitors/convert.rb +316 -0
- data/lib/sass/tree/visitors/cssize.rb +229 -0
- data/lib/sass/tree/visitors/deep_copy.rb +102 -0
- data/lib/sass/tree/visitors/extend.rb +68 -0
- data/lib/sass/tree/visitors/perform.rb +446 -0
- data/lib/sass/tree/visitors/set_options.rb +125 -0
- data/lib/sass/tree/visitors/to_css.rb +230 -0
- data/lib/sass/tree/warn_node.rb +18 -0
- data/lib/sass/tree/while_node.rb +18 -0
- data/lib/sass/util.rb +906 -0
- data/lib/sass/util/multibyte_string_scanner.rb +155 -0
- data/lib/sass/util/subset_map.rb +109 -0
- data/lib/sass/util/test.rb +10 -0
- data/lib/sass/version.rb +126 -0
- data/rails/init.rb +1 -0
- data/test/Gemfile +3 -0
- data/test/Gemfile.lock +10 -0
- data/test/sass/cache_test.rb +89 -0
- data/test/sass/callbacks_test.rb +61 -0
- data/test/sass/conversion_test.rb +1760 -0
- data/test/sass/css2sass_test.rb +439 -0
- data/test/sass/data/hsl-rgb.txt +319 -0
- data/test/sass/engine_test.rb +3243 -0
- data/test/sass/exec_test.rb +86 -0
- data/test/sass/extend_test.rb +1461 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/test/sass/functions_test.rb +1139 -0
- data/test/sass/importer_test.rb +192 -0
- data/test/sass/logger_test.rb +58 -0
- data/test/sass/mock_importer.rb +49 -0
- data/test/sass/more_results/more1.css +9 -0
- data/test/sass/more_results/more1_with_line_comments.css +26 -0
- data/test/sass/more_results/more_import.css +29 -0
- data/test/sass/more_templates/_more_partial.sass +2 -0
- data/test/sass/more_templates/more1.sass +23 -0
- data/test/sass/more_templates/more_import.sass +11 -0
- data/test/sass/plugin_test.rb +550 -0
- data/test/sass/results/alt.css +4 -0
- data/test/sass/results/basic.css +9 -0
- data/test/sass/results/cached_import_option.css +3 -0
- data/test/sass/results/compact.css +5 -0
- data/test/sass/results/complex.css +86 -0
- data/test/sass/results/compressed.css +1 -0
- data/test/sass/results/expanded.css +19 -0
- data/test/sass/results/filename_fn.css +3 -0
- data/test/sass/results/if.css +3 -0
- data/test/sass/results/import.css +31 -0
- data/test/sass/results/import_charset.css +5 -0
- data/test/sass/results/import_charset_1_8.css +5 -0
- data/test/sass/results/import_charset_ibm866.css +5 -0
- data/test/sass/results/import_content.css +1 -0
- data/test/sass/results/line_numbers.css +49 -0
- data/test/sass/results/mixins.css +95 -0
- data/test/sass/results/multiline.css +24 -0
- data/test/sass/results/nested.css +22 -0
- data/test/sass/results/options.css +1 -0
- data/test/sass/results/parent_ref.css +13 -0
- data/test/sass/results/script.css +16 -0
- data/test/sass/results/scss_import.css +31 -0
- data/test/sass/results/scss_importee.css +2 -0
- data/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
- data/test/sass/results/subdir/subdir.css +3 -0
- data/test/sass/results/units.css +11 -0
- data/test/sass/results/warn.css +0 -0
- data/test/sass/results/warn_imported.css +0 -0
- data/test/sass/script_conversion_test.rb +299 -0
- data/test/sass/script_test.rb +591 -0
- data/test/sass/scss/css_test.rb +1093 -0
- data/test/sass/scss/rx_test.rb +156 -0
- data/test/sass/scss/scss_test.rb +2043 -0
- data/test/sass/scss/test_helper.rb +37 -0
- data/test/sass/templates/_cached_import_option_partial.scss +1 -0
- data/test/sass/templates/_double_import_loop2.sass +1 -0
- data/test/sass/templates/_filename_fn_import.scss +11 -0
- data/test/sass/templates/_imported_charset_ibm866.sass +4 -0
- data/test/sass/templates/_imported_charset_utf8.sass +4 -0
- data/test/sass/templates/_imported_content.sass +3 -0
- data/test/sass/templates/_partial.sass +2 -0
- data/test/sass/templates/_same_name_different_partiality.scss +1 -0
- data/test/sass/templates/alt.sass +16 -0
- data/test/sass/templates/basic.sass +23 -0
- data/test/sass/templates/bork1.sass +2 -0
- data/test/sass/templates/bork2.sass +2 -0
- data/test/sass/templates/bork3.sass +2 -0
- data/test/sass/templates/bork4.sass +2 -0
- data/test/sass/templates/bork5.sass +3 -0
- data/test/sass/templates/cached_import_option.scss +3 -0
- data/test/sass/templates/compact.sass +17 -0
- data/test/sass/templates/complex.sass +305 -0
- data/test/sass/templates/compressed.sass +15 -0
- data/test/sass/templates/double_import_loop1.sass +1 -0
- data/test/sass/templates/expanded.sass +17 -0
- data/test/sass/templates/filename_fn.scss +18 -0
- data/test/sass/templates/if.sass +11 -0
- data/test/sass/templates/import.sass +12 -0
- data/test/sass/templates/import_charset.sass +9 -0
- data/test/sass/templates/import_charset_1_8.sass +6 -0
- data/test/sass/templates/import_charset_ibm866.sass +11 -0
- data/test/sass/templates/import_content.sass +4 -0
- data/test/sass/templates/importee.less +2 -0
- data/test/sass/templates/importee.sass +19 -0
- data/test/sass/templates/line_numbers.sass +13 -0
- data/test/sass/templates/mixin_bork.sass +5 -0
- data/test/sass/templates/mixins.sass +76 -0
- data/test/sass/templates/multiline.sass +20 -0
- data/test/sass/templates/nested.sass +25 -0
- data/test/sass/templates/nested_bork1.sass +2 -0
- data/test/sass/templates/nested_bork2.sass +2 -0
- data/test/sass/templates/nested_bork3.sass +2 -0
- data/test/sass/templates/nested_bork4.sass +2 -0
- data/test/sass/templates/nested_import.sass +2 -0
- data/test/sass/templates/nested_mixin_bork.sass +6 -0
- data/test/sass/templates/options.sass +2 -0
- data/test/sass/templates/parent_ref.sass +25 -0
- data/test/sass/templates/same_name_different_ext.sass +2 -0
- data/test/sass/templates/same_name_different_ext.scss +1 -0
- data/test/sass/templates/same_name_different_partiality.scss +1 -0
- data/test/sass/templates/script.sass +101 -0
- data/test/sass/templates/scss_import.scss +11 -0
- data/test/sass/templates/scss_importee.scss +1 -0
- data/test/sass/templates/single_import_loop.sass +1 -0
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
- data/test/sass/templates/subdir/subdir.sass +6 -0
- data/test/sass/templates/units.sass +11 -0
- data/test/sass/templates/warn.sass +3 -0
- data/test/sass/templates/warn_imported.sass +4 -0
- data/test/sass/test_helper.rb +8 -0
- data/test/sass/util/multibyte_string_scanner_test.rb +147 -0
- data/test/sass/util/subset_map_test.rb +91 -0
- data/test/sass/util_test.rb +313 -0
- data/test/test_helper.rb +80 -0
- 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,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
|