haml 3.1.0 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of haml might be problematic. Click here for more details.

Files changed (87) hide show
  1. data/VERSION +1 -1
  2. data/vendor/sass/Rakefile +22 -46
  3. data/vendor/sass/VERSION +1 -1
  4. data/vendor/sass/VERSION_NAME +1 -1
  5. data/vendor/sass/bin/scss +8 -0
  6. data/vendor/sass/doc-src/SASS_CHANGELOG.md +125 -9
  7. data/vendor/sass/doc-src/SASS_REFERENCE.md +84 -8
  8. data/vendor/sass/lib/sass.rb +0 -3
  9. data/vendor/sass/lib/sass/cache_stores.rb +1 -0
  10. data/vendor/sass/lib/sass/cache_stores/base.rb +2 -2
  11. data/vendor/sass/lib/sass/cache_stores/chain.rb +33 -0
  12. data/vendor/sass/lib/sass/cache_stores/filesystem.rb +6 -4
  13. data/vendor/sass/lib/sass/cache_stores/memory.rb +8 -12
  14. data/vendor/sass/lib/sass/engine.rb +65 -56
  15. data/vendor/sass/lib/sass/environment.rb +5 -2
  16. data/vendor/sass/lib/sass/exec.rb +52 -21
  17. data/vendor/sass/lib/sass/importers/filesystem.rb +32 -9
  18. data/vendor/sass/lib/sass/less.rb +1 -1
  19. data/vendor/sass/lib/sass/plugin.rb +11 -1
  20. data/vendor/sass/lib/sass/plugin/compiler.rb +21 -12
  21. data/vendor/sass/lib/sass/plugin/rails.rb +8 -82
  22. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +10 -10
  23. data/vendor/sass/lib/sass/railtie.rb +3 -2
  24. data/vendor/sass/lib/sass/script.rb +2 -25
  25. data/vendor/sass/lib/sass/script/color.rb +4 -15
  26. data/vendor/sass/lib/sass/script/funcall.rb +63 -19
  27. data/vendor/sass/lib/sass/script/functions.rb +257 -19
  28. data/vendor/sass/lib/sass/script/lexer.rb +1 -4
  29. data/vendor/sass/lib/sass/script/list.rb +2 -2
  30. data/vendor/sass/lib/sass/script/node.rb +0 -27
  31. data/vendor/sass/lib/sass/script/number.rb +1 -1
  32. data/vendor/sass/lib/sass/script/operation.rb +0 -5
  33. data/vendor/sass/lib/sass/script/parser.rb +30 -12
  34. data/vendor/sass/lib/sass/script/string.rb +2 -17
  35. data/vendor/sass/lib/sass/script/string_interpolation.rb +1 -0
  36. data/vendor/sass/lib/sass/scss/parser.rb +58 -18
  37. data/vendor/sass/lib/sass/scss/rx.rb +2 -1
  38. data/vendor/sass/lib/sass/scss/script_lexer.rb +1 -1
  39. data/vendor/sass/lib/sass/selector/comma_sequence.rb +2 -3
  40. data/vendor/sass/lib/sass/selector/sequence.rb +3 -6
  41. data/vendor/sass/lib/sass/selector/simple_sequence.rb +2 -3
  42. data/vendor/sass/lib/sass/tree/charset_node.rb +0 -15
  43. data/vendor/sass/lib/sass/tree/comment_node.rb +20 -71
  44. data/vendor/sass/lib/sass/tree/debug_node.rb +4 -22
  45. data/vendor/sass/lib/sass/tree/directive_node.rb +0 -52
  46. data/vendor/sass/lib/sass/tree/each_node.rb +8 -38
  47. data/vendor/sass/lib/sass/tree/extend_node.rb +12 -48
  48. data/vendor/sass/lib/sass/tree/for_node.rb +20 -51
  49. data/vendor/sass/lib/sass/tree/function_node.rb +27 -0
  50. data/vendor/sass/lib/sass/tree/if_node.rb +22 -57
  51. data/vendor/sass/lib/sass/tree/import_node.rb +0 -56
  52. data/vendor/sass/lib/sass/tree/media_node.rb +0 -43
  53. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +12 -45
  54. data/vendor/sass/lib/sass/tree/mixin_node.rb +13 -124
  55. data/vendor/sass/lib/sass/tree/node.rb +18 -304
  56. data/vendor/sass/lib/sass/tree/prop_node.rb +24 -92
  57. data/vendor/sass/lib/sass/tree/return_node.rb +18 -0
  58. data/vendor/sass/lib/sass/tree/root_node.rb +4 -133
  59. data/vendor/sass/lib/sass/tree/rule_node.rb +21 -164
  60. data/vendor/sass/lib/sass/tree/variable_node.rb +14 -23
  61. data/vendor/sass/lib/sass/tree/visitors/base.rb +75 -0
  62. data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +134 -0
  63. data/vendor/sass/lib/sass/tree/visitors/convert.rb +255 -0
  64. data/vendor/sass/lib/sass/tree/visitors/cssize.rb +175 -0
  65. data/vendor/sass/lib/sass/tree/visitors/perform.rb +301 -0
  66. data/vendor/sass/lib/sass/tree/visitors/to_css.rb +216 -0
  67. data/vendor/sass/lib/sass/tree/warn_node.rb +4 -28
  68. data/vendor/sass/lib/sass/tree/while_node.rb +5 -35
  69. data/vendor/sass/lib/sass/util.rb +0 -50
  70. data/vendor/sass/sass.gemspec +1 -1
  71. data/vendor/sass/test/sass/conversion_test.rb +53 -102
  72. data/vendor/sass/test/sass/engine_test.rb +416 -540
  73. data/vendor/sass/test/sass/functions_test.rb +306 -4
  74. data/vendor/sass/test/sass/importer_test.rb +0 -22
  75. data/vendor/sass/test/sass/plugin_test.rb +51 -21
  76. data/vendor/sass/test/sass/results/if.css +3 -0
  77. data/vendor/sass/test/sass/script_conversion_test.rb +0 -38
  78. data/vendor/sass/test/sass/script_test.rb +19 -4
  79. data/vendor/sass/test/sass/scss/scss_test.rb +32 -11
  80. data/vendor/sass/test/sass/templates/if.sass +11 -0
  81. data/vendor/sass/test/sass/templates/nested_import.sass +2 -0
  82. data/vendor/sass/test/sass/util_test.rb +0 -21
  83. data/vendor/sass/test/test_helper.rb +0 -3
  84. metadata +268 -258
  85. data/vendor/sass/bin/css2sass +0 -13
  86. data/vendor/sass/lib/sass/cache_stores/active_support.rb +0 -28
  87. data/vendor/sass/lib/sass/importers/rails.rb +0 -75
@@ -4,33 +4,15 @@ module Sass
4
4
  #
5
5
  # @see Sass::Tree
6
6
  class DebugNode < Node
7
+ # The expression to print.
8
+ # @return [Script::Node]
9
+ attr_reader :expr
10
+
7
11
  # @param expr [Script::Node] The expression to print
8
12
  def initialize(expr)
9
13
  @expr = expr
10
14
  super()
11
15
  end
12
-
13
- protected
14
-
15
- # @see Node#to_src
16
- def to_src(tabs, opts, fmt)
17
- "#{' ' * tabs}@debug #{@expr.to_sass(opts)}#{semi fmt}\n"
18
- end
19
-
20
- # Prints the expression to STDERR.
21
- #
22
- # @param environment [Sass::Environment] The lexical environment containing
23
- # variable and mixin values
24
- def _perform(environment)
25
- res = @expr.perform(environment)
26
- res = res.value if res.is_a?(Sass::Script::String)
27
- if filename
28
- $stderr.puts "#{filename}:#{line} DEBUG: #{res}"
29
- else
30
- $stderr.puts "Line #{line} DEBUG: #{res}"
31
- end
32
- []
33
- end
34
16
  end
35
17
  end
36
18
  end
@@ -19,57 +19,5 @@ module Sass::Tree
19
19
  @value = value
20
20
  super()
21
21
  end
22
-
23
- protected
24
-
25
- # @see Node#to_src
26
- def to_src(tabs, opts, fmt)
27
- res = "#{' ' * tabs}#{value}"
28
- return res + "#{semi fmt}\n" unless has_children
29
- res + children_to_src(tabs, opts, fmt) + "\n"
30
- end
31
-
32
- # Computes the CSS for the directive.
33
- #
34
- # @param tabs [Fixnum] The level of indentation for the CSS
35
- # @return [String] The resulting CSS
36
- def _to_s(tabs)
37
- return value + ";" unless has_children
38
- return value + " {}" if children.empty?
39
- result = if style == :compressed
40
- "#{value}{"
41
- else
42
- "#{' ' * (tabs - 1)}#{value} {" + (style == :compact ? ' ' : "\n")
43
- end
44
- was_prop = false
45
- first = true
46
- children.each do |child|
47
- next if child.invisible?
48
- if style == :compact
49
- if child.is_a?(PropNode)
50
- result << "#{child.to_s(first || was_prop ? 1 : tabs + 1)} "
51
- else
52
- if was_prop
53
- result[-1] = "\n"
54
- end
55
- rendered = child.to_s(tabs + 1).dup
56
- rendered = rendered.lstrip if first
57
- result << rendered.rstrip + "\n"
58
- end
59
- was_prop = child.is_a?(PropNode)
60
- first = false
61
- elsif style == :compressed
62
- result << (was_prop ? ";#{child.to_s(1)}" : child.to_s(1))
63
- was_prop = child.is_a?(PropNode)
64
- else
65
- result << child.to_s(tabs + 1) + "\n"
66
- end
67
- end
68
- result.rstrip + if style == :compressed
69
- "}"
70
- else
71
- (style == :expanded ? "\n" : " ") + "}\n"
72
- end
73
- end
74
22
  end
75
23
  end
@@ -5,6 +5,14 @@ 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
11
+
12
+ # The parse tree for the list.
13
+ # @param [Script::Node]
14
+ attr_reader :list
15
+
8
16
  # @param var [String] The name of the loop variable
9
17
  # @param list [Script::Node] The parse tree for the list
10
18
  def initialize(var, list)
@@ -12,43 +20,5 @@ module Sass::Tree
12
20
  @list = list
13
21
  super()
14
22
  end
15
-
16
- protected
17
-
18
- # @see Node#to_src
19
- def to_src(tabs, opts, fmt)
20
- "#{' ' * tabs}@each $#{dasherize(@var, opts)} in #{@list.to_sass(opts)}" +
21
- children_to_src(tabs, opts, fmt)
22
- end
23
-
24
- # Runs the child nodes once for each value in the list.
25
- #
26
- # @param environment [Sass::Environment] The lexical environment containing
27
- # variable and mixin values
28
- # @return [Array<Tree::Node>] The resulting static nodes
29
- # @see Sass::Tree
30
- def _perform(environment)
31
- list = @list.perform(environment)
32
-
33
- children = []
34
- environment = Sass::Environment.new(environment)
35
- list.to_a.each do |v|
36
- environment.set_local_var(@var, v)
37
- children += perform_children(environment)
38
- end
39
- children
40
- end
41
-
42
- # Returns an error message if the given child node is invalid,
43
- # and false otherwise.
44
- #
45
- # {ExtendNode}s are valid within {EachNode}s.
46
- #
47
- # @param child [Tree::Node] A potential child node.
48
- # @return [Boolean, String] Whether or not the child node is valid,
49
- # as well as the error message to display if it is invalid
50
- def invalid_child?(child)
51
- super unless child.is_a?(ExtendNode)
52
- end
53
23
  end
54
24
  end
@@ -5,6 +5,18 @@ module Sass::Tree
5
5
  #
6
6
  # @see Sass::Tree
7
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_reader :selector
19
+
8
20
  # @param selector [Array<String, Sass::Script::Node>]
9
21
  # The CSS selector to extend,
10
22
  # interspersed with {Sass::Script::Node}s
@@ -13,53 +25,5 @@ module Sass::Tree
13
25
  @selector = selector
14
26
  super()
15
27
  end
16
-
17
- # Registers this extension in the `extends` subset map.
18
- #
19
- # @param extends [Sass::Util::SubsetMap{Selector::Simple => Selector::Sequence}]
20
- # The extensions defined for this tree
21
- # @param parent [RuleNode] The parent node of this node
22
- # @see Node#cssize
23
- def cssize(extends, parent)
24
- @resolved_selector.members.each do |seq|
25
- if seq.members.size > 1
26
- raise Sass::SyntaxError.new("Can't extend #{seq.to_a.join}: can't extend nested selectors")
27
- end
28
-
29
- sseq = seq.members.first
30
- if !sseq.is_a?(Sass::Selector::SimpleSequence)
31
- raise Sass::SyntaxError.new("Can't extend #{seq.to_a.join}: invalid selector")
32
- end
33
-
34
- sel = sseq.members
35
- parent.resolved_rules.members.each do |seq|
36
- if !seq.members.last.is_a?(Sass::Selector::SimpleSequence)
37
- raise Sass::SyntaxError.new("#{seq} can't extend: invalid selector")
38
- end
39
-
40
- extends[sel] = seq
41
- end
42
- end
43
-
44
- []
45
- end
46
-
47
- protected
48
-
49
- # @see Node#to_src
50
- def to_src(tabs, opts, fmt)
51
- "#{' ' * tabs}@extend #{selector_to_src(@selector, tabs, opts, fmt).lstrip}#{semi fmt}\n"
52
- end
53
-
54
- # Runs SassScript interpolation in the selector,
55
- # and then parses the result into a {Sass::Selector::CommaSequence}.
56
- #
57
- # @param environment [Sass::Environment] The lexical environment containing
58
- # variable and mixin values
59
- def perform!(environment)
60
- @resolved_selector = Sass::SCSS::CssParser.new(run_interp(@selector, environment), self.line).
61
- parse_selector(self.filename)
62
- super
63
- end
64
28
  end
65
29
  end
@@ -5,11 +5,26 @@ module Sass::Tree
5
5
  #
6
6
  # @see Sass::Tree
7
7
  class ForNode < Node
8
- # @param var [String] The name of the loop variable
9
- # @param from [Script::Node] The parse tree for the initial expression
10
- # @param to [Script::Node] The parse tree for the final expression
11
- # @param exclusive [Boolean] Whether to include `to` in the loop
12
- # or stop just before
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_reader :from
15
+
16
+ # The parse tree for the final expression.
17
+ # @return [Script::Node]
18
+ attr_reader :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}
13
28
  def initialize(var, from, to, exclusive)
14
29
  @var = var
15
30
  @from = from
@@ -17,51 +32,5 @@ module Sass::Tree
17
32
  @exclusive = exclusive
18
33
  super()
19
34
  end
20
-
21
- protected
22
-
23
- # @see Node#to_src
24
- def to_src(tabs, opts, fmt)
25
- to = @exclusive ? "to" : "through"
26
- "#{' ' * tabs}@for $#{dasherize(@var, opts)} from #{@from.to_sass(opts)} #{to} #{@to.to_sass(opts)}" +
27
- children_to_src(tabs, opts, fmt)
28
- end
29
-
30
- # Runs the child nodes once for each time through the loop,
31
- # varying the variable each time.
32
- #
33
- # @param environment [Sass::Environment] The lexical environment containing
34
- # variable and mixin values
35
- # @return [Array<Tree::Node>] The resulting static nodes
36
- # @see Sass::Tree
37
- def _perform(environment)
38
- from = @from.perform(environment)
39
- to = @to.perform(environment)
40
- from.assert_int!
41
- to.assert_int!
42
-
43
- to = to.coerce(from.numerator_units, from.denominator_units)
44
- range = Range.new(from.to_i, to.to_i, @exclusive)
45
-
46
- children = []
47
- environment = Sass::Environment.new(environment)
48
- range.each do |i|
49
- environment.set_local_var(@var, Sass::Script::Number.new(i, from.numerator_units, from.denominator_units))
50
- children += perform_children(environment)
51
- end
52
- children
53
- end
54
-
55
- # Returns an error message if the given child node is invalid,
56
- # and false otherwise.
57
- #
58
- # {ExtendNode}s are valid within {ForNode}s.
59
- #
60
- # @param child [Tree::Node] A potential child node.
61
- # @return [Boolean, String] Whether or not the child node is valid,
62
- # as well as the error message to display if it is invalid
63
- def invalid_child?(child)
64
- super unless child.is_a?(ExtendNode)
65
- end
66
35
  end
67
36
  end
@@ -0,0 +1,27 @@
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_reader :args
17
+
18
+ # @param name [String] The function name
19
+ # @param args [Array<(Script::Node, Script::Node)>] The arguments for the function.
20
+ def initialize(name, args)
21
+ @name = name
22
+ @args = args
23
+ super()
24
+ end
25
+ end
26
+ end
27
+ end
@@ -9,13 +9,18 @@ module Sass::Tree
9
9
  #
10
10
  # @see Sass::Tree
11
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_reader :expr
17
+
12
18
  # The next {IfNode} in the if-else list, or `nil`.
13
19
  #
14
20
  # @return [IfNode]
15
21
  attr_accessor :else
16
22
 
17
- # @param expr [Script::Expr] The conditional expression.
18
- # If this is nil, this is an `@else` node, not an `@else if`
23
+ # @param expr [Script::Expr] See \{#expr}
19
24
  def initialize(expr)
20
25
  @expr = expr
21
26
  @last_else = self
@@ -36,65 +41,25 @@ module Sass::Tree
36
41
  self.else.options = options if self.else
37
42
  end
38
43
 
39
- # @see Node#_around_dump
40
- def _around_dump
41
- old_else = @else
42
- old_last_else = @last_else
43
- @else = Sass::Util.dump(@else)
44
- @last_else = (self == @last_else ? nil : Sass::Util.dump(@last_else))
45
- super
46
- ensure
47
- @else = old_else
48
- @last_else = old_last_else
49
- end
50
-
51
- # @see Node#_after_load
52
- def _after_load
53
- super
54
- @else = Sass::Util.load(@else)
55
- @last_else = (@last_else ? Sass::Util.load(@last_else) : self)
56
- end
57
-
58
- protected
59
-
60
- # @see Node#to_src
61
- def to_src(tabs, opts, fmt, is_else = false)
62
- name =
63
- if !is_else; "if"
64
- elsif @expr; "else if"
65
- else; "else"
66
- end
67
- str = "#{' ' * tabs}@#{name}"
68
- str << " #{@expr.to_sass(opts)}" if @expr
69
- str << children_to_src(tabs, opts, fmt)
70
- str << @else.send(:to_src, tabs, opts, fmt, true) if @else
71
- str
44
+ def _dump(f)
45
+ Marshal.dump([self.expr, self.else, self.children])
72
46
  end
73
47
 
74
- # Runs the child nodes if the conditional expression is true;
75
- # otherwise, tries the \{#else} nodes.
76
- #
77
- # @param environment [Sass::Environment] The lexical environment containing
78
- # variable and mixin values
79
- # @return [Array<Tree::Node>] The resulting static nodes
80
- # @see Sass::Tree
81
- def _perform(environment)
82
- environment = Sass::Environment.new(environment)
83
- return perform_children(environment) if @expr.nil? || @expr.perform(environment).to_bool
84
- return @else.perform(environment) if @else
85
- []
48
+ def self._load(data)
49
+ expr, else_, children = Marshal.load(data)
50
+ node = IfNode.new(expr)
51
+ node.else = else_
52
+ node.children = children
53
+ node.instance_variable_set('@last_else',
54
+ node.else ? node.else.instance_variable_get('@last_else') : node)
55
+ node
86
56
  end
87
57
 
88
- # Returns an error message if the given child node is invalid,
89
- # and false otherwise.
90
- #
91
- # {ExtendNode}s are valid within {IfNode}s.
92
- #
93
- # @param child [Tree::Node] A potential child node.
94
- # @return [Boolean, String] Whether or not the child node is valid,
95
- # as well as the error message to display if it is invalid
96
- def invalid_child?(child)
97
- super unless child.is_a?(ExtendNode)
58
+ # @see Node#deep_copy
59
+ def deep_copy
60
+ node = super
61
+ node.else = self.else.deep_copy if self.else
62
+ node
98
63
  end
99
64
  end
100
65
  end
@@ -25,21 +25,6 @@ module Sass
25
25
  @imported_file ||= import
26
26
  end
27
27
 
28
- # @see Node#to_sass
29
- def to_sass(tabs = 0, opts = {})
30
- "#{' ' * tabs}@import #{@imported_filename}\n"
31
- end
32
-
33
- # @see Node#to_scss
34
- def to_scss(tabs = 0, opts = {})
35
- "#{' ' * tabs}@import \"#{@imported_filename}\";\n"
36
- end
37
-
38
- # @see Node#cssize
39
- def cssize(*args)
40
- super.first
41
- end
42
-
43
28
  # Returns whether or not this import should emit a CSS @import declaration
44
29
  #
45
30
  # @return [Boolean] Whether or not this is a simple CSS @import declaration.
@@ -51,47 +36,6 @@ module Sass
51
36
  end
52
37
  end
53
38
 
54
- protected
55
-
56
- # @see Node#_cssize
57
- def _cssize(*args)
58
- super.children
59
- rescue Sass::SyntaxError => e
60
- e.modify_backtrace(:filename => children.first.filename)
61
- e.add_backtrace(:filename => @filename, :line => @line)
62
- raise e
63
- end
64
-
65
- # Returns a static DirectiveNode if this is importing a CSS file,
66
- # or parses and includes the imported Sass file.
67
- #
68
- # @param environment [Sass::Environment] The lexical environment containing
69
- # variable and mixin values
70
- def _perform(environment)
71
- if path = css_import?
72
- return DirectiveNode.new("@import url(#{path})")
73
- end
74
- super
75
- end
76
-
77
- # Parses the imported file and runs the dynamic Sass for it.
78
- #
79
- # @param environment [Sass::Environment] The lexical environment containing
80
- # variable and mixin values
81
- def perform!(environment)
82
- environment.push_frame(:filename => @filename, :line => @line)
83
- # TODO: re-enable caching
84
- root = imported_file.to_tree
85
- self.children = root.children
86
- self.children = perform_children(environment)
87
- rescue Sass::SyntaxError => e
88
- e.modify_backtrace(:filename => imported_file.options[:filename])
89
- e.add_backtrace(:filename => @filename, :line => @line)
90
- raise e
91
- ensure
92
- environment.pop_frame
93
- end
94
-
95
39
  private
96
40
 
97
41
  def import