haml 3.1.3 → 3.1.4

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 (134) hide show
  1. data/Rakefile +42 -17
  2. data/VERSION +1 -1
  3. data/lib/haml/compiler.rb +3 -3
  4. data/lib/haml/helpers/action_view_mods.rb +4 -3
  5. data/lib/haml/template.rb +3 -1
  6. data/test/gemfiles/Gemfile.rails-2.0.x +8 -0
  7. data/test/gemfiles/Gemfile.rails-2.0.x.lock +38 -0
  8. data/test/gemfiles/Gemfile.rails-2.1.x +8 -0
  9. data/test/gemfiles/Gemfile.rails-2.1.x.lock +38 -0
  10. data/test/gemfiles/Gemfile.rails-2.2.x +8 -0
  11. data/test/gemfiles/Gemfile.rails-2.2.x.lock +38 -0
  12. data/test/gemfiles/Gemfile.rails-2.3.x +8 -0
  13. data/test/gemfiles/Gemfile.rails-2.3.x.lock +40 -0
  14. data/test/gemfiles/Gemfile.rails-3.0.x +8 -0
  15. data/test/gemfiles/Gemfile.rails-3.0.x.lock +85 -0
  16. data/test/gemfiles/Gemfile.rails-3.1.x +8 -0
  17. data/test/gemfiles/Gemfile.rails-3.1.x.lock +98 -0
  18. data/test/gemfiles/Gemfile.rails-xss-2.3.x +9 -0
  19. data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +42 -0
  20. data/test/haml/engine_test.rb +19 -0
  21. data/test/haml/html2haml_test.rb +1 -1
  22. data/test/haml/template_test.rb +20 -2
  23. data/test/haml/templates/partial_layout.haml +4 -1
  24. data/test/linked_rails.rb +4 -4
  25. data/vendor/sass/VERSION +1 -1
  26. data/vendor/sass/doc-src/SASS_CHANGELOG.md +115 -2
  27. data/vendor/sass/doc-src/SASS_REFERENCE.md +12 -4
  28. data/vendor/sass/lib/sass.rb +1 -0
  29. data/vendor/sass/lib/sass/cache_stores/base.rb +3 -1
  30. data/vendor/sass/lib/sass/cache_stores/filesystem.rb +2 -0
  31. data/vendor/sass/lib/sass/css.rb +2 -1
  32. data/vendor/sass/lib/sass/engine.rb +39 -23
  33. data/vendor/sass/lib/sass/environment.rb +11 -0
  34. data/vendor/sass/lib/sass/exec.rb +14 -1
  35. data/vendor/sass/lib/sass/importers/base.rb +2 -1
  36. data/vendor/sass/lib/sass/importers/filesystem.rb +18 -13
  37. data/vendor/sass/lib/sass/less.rb +2 -2
  38. data/vendor/sass/lib/sass/logger.rb +15 -0
  39. data/vendor/sass/lib/sass/logger/base.rb +32 -0
  40. data/vendor/sass/lib/sass/logger/log_level.rb +49 -0
  41. data/vendor/sass/lib/sass/plugin.rb +4 -8
  42. data/vendor/sass/lib/sass/plugin/compiler.rb +42 -17
  43. data/vendor/sass/lib/sass/plugin/configuration.rb +0 -2
  44. data/vendor/sass/lib/sass/railtie.rb +1 -1
  45. data/vendor/sass/lib/sass/script/funcall.rb +14 -1
  46. data/vendor/sass/lib/sass/script/functions.rb +44 -1
  47. data/vendor/sass/lib/sass/script/interpolation.rb +9 -0
  48. data/vendor/sass/lib/sass/script/lexer.rb +6 -1
  49. data/vendor/sass/lib/sass/script/list.rb +7 -0
  50. data/vendor/sass/lib/sass/script/literal.rb +5 -0
  51. data/vendor/sass/lib/sass/script/node.rb +8 -0
  52. data/vendor/sass/lib/sass/script/number.rb +28 -5
  53. data/vendor/sass/lib/sass/script/operation.rb +8 -0
  54. data/vendor/sass/lib/sass/script/parser.rb +12 -5
  55. data/vendor/sass/lib/sass/script/string_interpolation.rb +9 -0
  56. data/vendor/sass/lib/sass/script/unary_operation.rb +7 -0
  57. data/vendor/sass/lib/sass/script/variable.rb +5 -0
  58. data/vendor/sass/lib/sass/scss/parser.rb +78 -38
  59. data/vendor/sass/lib/sass/scss/rx.rb +2 -1
  60. data/vendor/sass/lib/sass/scss/static_parser.rb +2 -2
  61. data/vendor/sass/lib/sass/shared.rb +1 -1
  62. data/vendor/sass/lib/sass/tree/comment_node.rb +24 -11
  63. data/vendor/sass/lib/sass/tree/debug_node.rb +1 -1
  64. data/vendor/sass/lib/sass/tree/each_node.rb +1 -1
  65. data/vendor/sass/lib/sass/tree/extend_node.rb +1 -1
  66. data/vendor/sass/lib/sass/tree/for_node.rb +2 -2
  67. data/vendor/sass/lib/sass/tree/function_node.rb +1 -1
  68. data/vendor/sass/lib/sass/tree/if_node.rb +1 -14
  69. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +1 -1
  70. data/vendor/sass/lib/sass/tree/mixin_node.rb +2 -2
  71. data/vendor/sass/lib/sass/tree/node.rb +2 -5
  72. data/vendor/sass/lib/sass/tree/prop_node.rb +2 -9
  73. data/vendor/sass/lib/sass/tree/return_node.rb +1 -1
  74. data/vendor/sass/lib/sass/tree/rule_node.rb +9 -2
  75. data/vendor/sass/lib/sass/tree/variable_node.rb +1 -1
  76. data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +17 -18
  77. data/vendor/sass/lib/sass/tree/visitors/convert.rb +10 -5
  78. data/vendor/sass/lib/sass/tree/visitors/deep_copy.rb +87 -0
  79. data/vendor/sass/lib/sass/tree/visitors/perform.rb +50 -19
  80. data/vendor/sass/lib/sass/tree/visitors/set_options.rb +97 -0
  81. data/vendor/sass/lib/sass/tree/visitors/to_css.rb +9 -15
  82. data/vendor/sass/lib/sass/tree/warn_node.rb +1 -1
  83. data/vendor/sass/lib/sass/tree/while_node.rb +1 -1
  84. data/vendor/sass/lib/sass/util.rb +58 -6
  85. data/vendor/sass/sass.gemspec +2 -1
  86. data/vendor/sass/test/Gemfile +4 -0
  87. data/vendor/sass/test/Gemfile.lock +19 -0
  88. data/vendor/sass/test/sass/cache_test.rb +15 -0
  89. data/vendor/sass/test/sass/conversion_test.rb +2 -6
  90. data/vendor/sass/test/sass/css2sass_test.rb +9 -0
  91. data/vendor/sass/test/sass/engine_test.rb +124 -26
  92. data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
  93. data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
  94. data/vendor/sass/test/sass/functions_test.rb +13 -0
  95. data/vendor/sass/test/sass/importer_test.rb +110 -0
  96. data/vendor/sass/test/sass/logger_test.rb +58 -0
  97. data/vendor/sass/test/sass/plugin_test.rb +16 -13
  98. data/vendor/sass/test/sass/script_conversion_test.rb +2 -0
  99. data/vendor/sass/test/sass/script_test.rb +18 -0
  100. data/vendor/sass/test/sass/scss/css_test.rb +7 -1
  101. data/vendor/sass/test/sass/scss/scss_test.rb +37 -13
  102. data/vendor/sass/test/sass/templates/bork5.sass +3 -0
  103. data/vendor/sass/test/sass/templates/nested_bork5.sass +2 -0
  104. data/vendor/sass/test/sass/test_helper.rb +1 -1
  105. data/vendor/sass/test/sass/util_test.rb +12 -0
  106. data/vendor/sass/vendor/fssm/Gemfile +3 -0
  107. data/vendor/sass/vendor/fssm/LICENSE +1 -1
  108. data/vendor/sass/vendor/fssm/README.markdown +55 -27
  109. data/vendor/sass/vendor/fssm/Rakefile +6 -54
  110. data/vendor/sass/vendor/fssm/example.rb +6 -3
  111. data/vendor/sass/vendor/fssm/fssm.gemspec +17 -70
  112. data/vendor/sass/vendor/fssm/lib/fssm.rb +7 -3
  113. data/vendor/sass/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
  114. data/vendor/sass/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
  115. data/vendor/sass/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
  116. data/vendor/sass/vendor/fssm/lib/fssm/backends/rbfsevent.rb +42 -0
  117. data/vendor/sass/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
  118. data/vendor/sass/vendor/fssm/lib/fssm/monitor.rb +19 -9
  119. data/vendor/sass/vendor/fssm/lib/fssm/path.rb +24 -21
  120. data/vendor/sass/vendor/fssm/lib/fssm/pathname.rb +13 -479
  121. data/vendor/sass/vendor/fssm/lib/fssm/state/directory.rb +29 -11
  122. data/vendor/sass/vendor/fssm/lib/fssm/state/file.rb +1 -1
  123. data/vendor/sass/vendor/fssm/lib/fssm/support.rb +41 -12
  124. data/vendor/sass/vendor/fssm/lib/fssm/tree.rb +6 -6
  125. data/vendor/sass/vendor/fssm/lib/fssm/version.rb +3 -0
  126. data/vendor/sass/vendor/fssm/profile/prof-cache.rb +3 -3
  127. data/vendor/sass/vendor/fssm/profile/prof-pathname-rubinius.rb +35 -0
  128. data/vendor/sass/vendor/fssm/profile/prof-pathname.rb +7 -7
  129. data/vendor/sass/vendor/fssm/spec/count_down_latch.rb +151 -0
  130. data/vendor/sass/vendor/fssm/spec/monitor_spec.rb +202 -0
  131. data/vendor/sass/vendor/fssm/spec/path_spec.rb +36 -15
  132. data/vendor/sass/vendor/fssm/spec/spec_helper.rb +6 -6
  133. metadata +36 -5
  134. data/vendor/sass/vendor/fssm/VERSION.yml +0 -5
@@ -34,6 +34,11 @@ module Sass
34
34
  []
35
35
  end
36
36
 
37
+ # @see Node#deep_copy
38
+ def deep_copy
39
+ dup
40
+ end
41
+
37
42
  protected
38
43
 
39
44
  # Evaluates the variable.
@@ -9,10 +9,12 @@ module Sass
9
9
  # @param str [String, StringScanner] The source document to parse.
10
10
  # Note that `Parser` *won't* raise a nice error message if this isn't properly parsed;
11
11
  # for that, you should use the higher-level {Sass::Engine} or {Sass::CSS}.
12
+ # @param filename [String] The name of the file being parsed. Used for warnings.
12
13
  # @param line [Fixnum] The line on which the source string appeared,
13
- # if it's part of another document
14
- def initialize(str, line = 1)
14
+ # if it's part of another document.
15
+ def initialize(str, filename, line = 1)
15
16
  @template = str
17
+ @filename = filename
16
18
  @line = line
17
19
  @strs = []
18
20
  end
@@ -87,14 +89,28 @@ module Sass
87
89
  end
88
90
 
89
91
  def process_comment(text, node)
90
- single_line = text =~ /^\/\//
91
- pre_str = single_line ? "" : @scanner.
92
- string[0...@scanner.pos].
93
- reverse[/.*?\*\/(.*?)($|\Z)/, 1].
94
- reverse.gsub(/[^\s]/, ' ')
95
- text = text.sub(/^\s*\/\//, '/*').gsub(/^\s*\/\//, ' *') + ' */' if single_line
96
- comment = Sass::Tree::CommentNode.new(pre_str + text, single_line)
97
- comment.line = @line - text.count("\n")
92
+ silent = text =~ /^\/\//
93
+ line = @line - text.count("\n")
94
+ if loud = text =~ %r{^/[/*]!}
95
+ value = Sass::Engine.parse_interp(text, line, @scanner.pos - text.size, :filename => @filename)
96
+ value[0].slice!(2) # get rid of the "!"
97
+ else
98
+ value = [text]
99
+ end
100
+
101
+ if silent
102
+ value = Sass::Util.with_extracted_values(value) do |str|
103
+ str.sub(/^\s*\/\//, '/*').gsub(/^\s*\/\//, ' *') + ' */'
104
+ end
105
+ else
106
+ value.unshift(@scanner.
107
+ string[0...@scanner.pos].
108
+ reverse[/.*?\*\/(.*?)($|\Z)/, 1].
109
+ reverse.gsub(/[^\s]/, ' '))
110
+ end
111
+
112
+ comment = Sass::Tree::CommentNode.new(value, silent, loud)
113
+ comment.line = line
98
114
  node << comment
99
115
  end
100
116
 
@@ -487,21 +503,30 @@ module Sass
487
503
  res = [e]
488
504
 
489
505
  # The tok(/\*/) allows the "E*" hack
490
- while v = element_name || id_selector || class_selector ||
491
- attrib || negation || pseudo || interpolation_selector ||
492
- (tok(/\*/) && Selector::Universal.new(nil))
506
+ while v = id_selector || class_selector || attrib || negation || pseudo ||
507
+ interpolation_selector || (tok(/\*/) && Selector::Universal.new(nil))
493
508
  res << v
494
509
  end
495
510
 
496
- if tok?(/&/)
497
- begin
498
- expected('"{"')
499
- rescue Sass::SyntaxError => e
500
- e.message << "\n\n" << <<MESSAGE
501
- In Sass 3, the parent selector & can only be used where element names are valid,
502
- since it could potentially be replaced by an element name.
511
+ pos = @scanner.pos
512
+ line = @line
513
+ if sel = str? {simple_selector_sequence}
514
+ @scanner.pos = pos
515
+ @line = line
516
+
517
+ if sel =~ /^&/
518
+ begin
519
+ throw_error {expected('"{"')}
520
+ rescue Sass::SyntaxError => e
521
+ e.message << "\n\n\"#{sel}\" may only be used at the beginning of a selector."
522
+ raise e
523
+ end
524
+ else
525
+ Sass::Util.sass_warn(<<MESSAGE)
526
+ DEPRECATION WARNING:
527
+ On line #{@line}#{" of \"#{@filename}\"" if @filename}, after "#{self.class.prior_snippet(@scanner)}"
528
+ Starting in Sass 3.2, "#{sel}" may only be used at the beginning of a selector.
503
529
  MESSAGE
504
- raise e
505
530
  end
506
531
  end
507
532
 
@@ -638,11 +663,9 @@ MESSAGE
638
663
  tok!(/:/)
639
664
  space, value = value!
640
665
  ss
641
- important = tok(IMPORTANT)
642
- ss
643
666
  require_block = tok?(/\{/)
644
667
 
645
- node = node(Sass::Tree::PropNode.new(name.flatten.compact, value, !!important, :new))
668
+ node = node(Sass::Tree::PropNode.new(name.flatten.compact, value, :new))
646
669
 
647
670
  return node unless require_block
648
671
  nested_properties! node, space
@@ -747,7 +770,7 @@ MESSAGE
747
770
  end
748
771
 
749
772
  def interp_ident(start = IDENT)
750
- return unless val = tok(start) || interpolation
773
+ return unless val = tok(start) || interpolation || tok(IDENT_HYPHEN_INTERP)
751
774
  res = [val]
752
775
  while val = tok(NAME) || interpolation
753
776
  res << val
@@ -767,9 +790,15 @@ MESSAGE
767
790
  @strs.pop
768
791
  end
769
792
 
770
- def str?
793
+ def str?(&block)
794
+ pos = @scanner.pos
795
+ line = @line
771
796
  @strs.push ""
772
- yield && @strs.last
797
+ throw_error(&block) && @strs.last
798
+ rescue Sass::SyntaxError => e
799
+ @scanner.pos = pos
800
+ @line = line
801
+ nil
773
802
  ensure
774
803
  @strs.pop
775
804
  end
@@ -848,6 +877,13 @@ MESSAGE
848
877
  raise Sass::SyntaxError.new(msg, :line => @line)
849
878
  end
850
879
 
880
+ def throw_error
881
+ old_throw_error, @throw_error = @throw_error, false
882
+ yield
883
+ ensure
884
+ @throw_error = old_throw_error
885
+ end
886
+
851
887
  def catch_error(&block)
852
888
  old_throw_error, @throw_error = @throw_error, true
853
889
  pos = @scanner.pos
@@ -877,16 +913,6 @@ MESSAGE
877
913
 
878
914
  # @private
879
915
  def self.expected(scanner, expected, line)
880
- pos = scanner.pos
881
-
882
- after = scanner.string[0...pos]
883
- # Get rid of whitespace between pos and the last token,
884
- # but only if there's a newline in there
885
- after.gsub!(/\s*\n\s*$/, '')
886
- # Also get rid of stuff before the last newline
887
- after.gsub!(/.*\n/, '')
888
- after = "..." + after[-15..-1] if after.size > 18
889
-
890
916
  was = scanner.rest.dup
891
917
  # Get rid of whitespace between pos and the next token,
892
918
  # but only if there's a newline in there
@@ -896,10 +922,24 @@ MESSAGE
896
922
  was = was[0...15] + "..." if was.size > 18
897
923
 
898
924
  raise Sass::SyntaxError.new(
899
- "Invalid CSS after \"#{after}\": expected #{expected}, was \"#{was}\"",
925
+ "Invalid CSS after \"#{prior_snippet(scanner)}\": expected #{expected}, was \"#{was}\"",
900
926
  :line => line)
901
927
  end
902
928
 
929
+ # @private
930
+ def self.prior_snippet(scanner)
931
+ pos = scanner.pos
932
+
933
+ after = scanner.string[0...pos]
934
+ # Get rid of whitespace between pos and the last token,
935
+ # but only if there's a newline in there
936
+ after.gsub!(/\s*\n\s*$/, '')
937
+ # Also get rid of stuff before the last newline
938
+ after.gsub!(/.*\n/, '')
939
+ after = "..." + after[-15..-1] if after.size > 18
940
+ after
941
+ end
942
+
903
943
  # Avoid allocating lots of new strings for `#tok`.
904
944
  # This is important because `#tok` is called all the time.
905
945
  NEWLINE = "\n"
@@ -112,6 +112,7 @@ module Sass
112
112
  INTERP_START = /#\{/
113
113
  MOZ_ANY = quote(":-moz-any(", Regexp::IGNORECASE)
114
114
 
115
+ IDENT_HYPHEN_INTERP = /-(?=#\{)/
115
116
  STRING1_NOINTERP = /\"((?:[^\n\r\f\\"#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\"/
116
117
  STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|\\#{NL}|#{ESCAPE})*)\'/
117
118
  STRING_NOINTERP = /#{STRING1_NOINTERP}|#{STRING2_NOINTERP}/
@@ -119,7 +120,7 @@ module Sass
119
120
  # We could use it for 1.9 only, but I don't want to introduce a cross-version
120
121
  # behavior difference.
121
122
  # In any case, almost all CSS idents will be matched by this.
122
- STATIC_VALUE = /(-?#{NMSTART}|#{STRING_NOINTERP}|\s(?!%)|#[a-f0-9]|[,%]|#{NUM})+(?=[;}])/i
123
+ STATIC_VALUE = /(-?#{NMSTART}|#{STRING_NOINTERP}|\s(?!%)|#[a-f0-9]|[,%]|#{NUM}|\!important)+(?=[;}])/i
123
124
 
124
125
  STATIC_SELECTOR = /(#{NMCHAR}|\s|[,>+*]|[:#.]#{NMSTART})+(?=[{])/i
125
126
  end
@@ -13,12 +13,12 @@ module Sass
13
13
  # Used for error reporting.
14
14
  # @return [Selector::CommaSequence] The parsed selector
15
15
  # @raise [Sass::SyntaxError] if there's a syntax error in the selector
16
- def parse_selector(filename)
16
+ def parse_selector
17
17
  init_scanner!
18
18
  seq = expr!(:selector_comma_sequence)
19
19
  expected("selector") unless @scanner.eos?
20
20
  seq.line = @line
21
- seq.filename = filename
21
+ seq.filename = @filename
22
22
  seq
23
23
  end
24
24
 
@@ -17,7 +17,7 @@ module Sass
17
17
  # @return [String] The text remaining in the scanner after all `#{`s have been processed
18
18
  def handle_interpolation(str)
19
19
  scan = StringScanner.new(str)
20
- yield scan while scan.scan(/(.*?)(\\*)\#\{/)
20
+ yield scan while scan.scan(/(.*?)(\\*)\#\{/m)
21
21
  scan.rest
22
22
  end
23
23
 
@@ -6,10 +6,19 @@ module Sass::Tree
6
6
  # @see Sass::Tree
7
7
  class CommentNode < Node
8
8
  # The text of the comment, not including `/*` and `*/`.
9
+ # Interspersed with {Sass::Script::Node}s representing `#{}`-interpolation
10
+ # if this is a loud comment.
9
11
  #
10
- # @return [String]
12
+ # @return [Array<String, Sass::Script::Node>]
11
13
  attr_accessor :value
12
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
+
13
22
  # Whether the comment is loud.
14
23
  #
15
24
  # Loud comments start with ! and force the comment to be generated
@@ -23,14 +32,13 @@ module Sass::Tree
23
32
  # @return [Boolean]
24
33
  attr_accessor :silent
25
34
 
26
- # @param value [String] See \{#value}
35
+ # @param value [Array<String, Sass::Script::Node>] See \{#value}
27
36
  # @param silent [Boolean] See \{#silent}
28
- def initialize(value, silent)
29
- @lines = []
37
+ # @param loud [Boolean] See \{#loud}
38
+ def initialize(value, silent, loud)
39
+ @value = Sass::Util.with_extracted_values(value) {|str| normalize_indentation str}
30
40
  @silent = silent
31
- @value = normalize_indentation value
32
- @loud = @value =~ %r{^(/[\/\*])?!}
33
- @value.sub!("#{$1}!", $1.to_s) if @loud
41
+ @loud = loud
34
42
  super()
35
43
  end
36
44
 
@@ -40,7 +48,7 @@ module Sass::Tree
40
48
  # @return [Boolean] Whether or not this node and the other object
41
49
  # are the same
42
50
  def ==(other)
43
- self.class == other.class && value == other.value && silent == other.silent
51
+ self.class == other.class && value == other.value && silent == other.silent && loud == other.loud
44
52
  end
45
53
 
46
54
  # Returns `true` if this is a silent comment
@@ -57,9 +65,14 @@ module Sass::Tree
57
65
  end
58
66
  end
59
67
 
60
- # Returns whether this comment should be interpolated for dynamic comment generation.
61
- def evaluated?
62
- @loud
68
+ # Returns the number of lines in the comment.
69
+ #
70
+ # @return [Fixnum]
71
+ def lines
72
+ @value.inject(0) do |s, e|
73
+ next s + e.count("\n") if e.is_a?(String)
74
+ next s
75
+ end
63
76
  end
64
77
 
65
78
  private
@@ -6,7 +6,7 @@ module Sass
6
6
  class DebugNode < Node
7
7
  # The expression to print.
8
8
  # @return [Script::Node]
9
- attr_reader :expr
9
+ attr_accessor :expr
10
10
 
11
11
  # @param expr [Script::Node] The expression to print
12
12
  def initialize(expr)
@@ -11,7 +11,7 @@ module Sass::Tree
11
11
 
12
12
  # The parse tree for the list.
13
13
  # @param [Script::Node]
14
- attr_reader :list
14
+ attr_accessor :list
15
15
 
16
16
  # @param var [String] The name of the loop variable
17
17
  # @param list [Script::Node] The parse tree for the list
@@ -15,7 +15,7 @@ module Sass::Tree
15
15
  # representing `#{}`-interpolation.
16
16
  #
17
17
  # @return [Array<String, Sass::Script::Node>]
18
- attr_reader :selector
18
+ attr_accessor :selector
19
19
 
20
20
  # @param selector [Array<String, Sass::Script::Node>]
21
21
  # The CSS selector to extend,
@@ -11,11 +11,11 @@ module Sass::Tree
11
11
 
12
12
  # The parse tree for the initial expression.
13
13
  # @return [Script::Node]
14
- attr_reader :from
14
+ attr_accessor :from
15
15
 
16
16
  # The parse tree for the final expression.
17
17
  # @return [Script::Node]
18
- attr_reader :to
18
+ attr_accessor :to
19
19
 
20
20
  # Whether to include `to` in the loop or stop just before.
21
21
  # @return [Boolean]
@@ -13,7 +13,7 @@ module Sass
13
13
  # the default value of the argument
14
14
  #
15
15
  # @return [Array<Script::Node>]
16
- attr_reader :args
16
+ attr_accessor :args
17
17
 
18
18
  # @param name [String] The function name
19
19
  # @param args [Array<(Script::Node, Script::Node)>] The arguments for the function.
@@ -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,12 +35,6 @@ 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
39
  Marshal.dump([self.expr, self.else, self.children])
46
40
  end
@@ -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
@@ -13,7 +13,7 @@ module Sass
13
13
  # and the parse tree for the default value of the argument.
14
14
  #
15
15
  # @return [Array<(Script::Node, Script::Node)>]
16
- attr_reader :args
16
+ attr_accessor :args
17
17
 
18
18
  # @param name [String] The mixin name
19
19
  # @param args [Array<(Script::Node, Script::Node)>] See \{#args}
@@ -13,11 +13,11 @@ module Sass::Tree
13
13
 
14
14
  # The arguments to the mixin.
15
15
  # @return [Array<Script::Node>]
16
- attr_reader :args
16
+ attr_accessor :args
17
17
 
18
18
  # A hash from keyword argument names to values.
19
19
  # @return [{String => Script::Node}]
20
- attr_reader :keywords
20
+ attr_accessor :keywords
21
21
 
22
22
  # @param name [String] The name of the mixin
23
23
  # @param args [Array<Script::Node>] See \{#args}
@@ -65,8 +65,7 @@ module Sass
65
65
  # @param options [{Symbol => Object}] The options
66
66
  # @see #options
67
67
  def options=(options)
68
- children.each {|c| c.options = options}
69
- @options = options
68
+ Sass::Tree::Visitors::SetOptions.visit(self, options)
70
69
  end
71
70
 
72
71
  # @private
@@ -185,9 +184,7 @@ module Sass
185
184
  #
186
185
  # @return [Node]
187
186
  def deep_copy
188
- node = dup
189
- node.children = children.map {|c| c.deep_copy}
190
- node
187
+ Sass::Tree::Visitors::DeepCopy.visit(self)
191
188
  end
192
189
 
193
190
  protected
@@ -23,11 +23,6 @@ module Sass::Tree
23
23
  # @return [Sass::Script::Node]
24
24
  attr_accessor :value
25
25
 
26
- # Whether the property was marked as !important.
27
- #
28
- # @return [Boolean]
29
- attr_accessor :important
30
-
31
26
  # The value of the property
32
27
  # after any interpolated SassScript has been resolved.
33
28
  # Only set once \{Tree::Visitors::Perform} has been run.
@@ -49,16 +44,14 @@ module Sass::Tree
49
44
 
50
45
  # @param name [Array<String, Sass::Script::Node>] See \{#name}
51
46
  # @param value [Sass::Script::Node] See \{#value}
52
- # @param important [Boolean] whether this is an !important property
53
47
  # @param prop_syntax [Symbol] `:new` if this property uses `a: b`-style syntax,
54
48
  # `:old` if it uses `:a b`-style syntax
55
- def initialize(name, value, important, prop_syntax)
49
+ def initialize(name, value, prop_syntax)
56
50
  @name = Sass::Util.strip_string_array(
57
51
  Sass::Util.merge_adjacent_strings(name))
58
52
  @value = value
59
53
  @tabs = 0
60
54
  @prop_syntax = prop_syntax
61
- @important = important
62
55
  super()
63
56
  end
64
57
 
@@ -96,7 +89,7 @@ module Sass::Tree
96
89
  old = opts[:old] && fmt == :sass
97
90
  initial = old ? ':' : ''
98
91
  mid = old ? '' : ':'
99
- "#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}#{' !important' if important}".rstrip
92
+ "#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}".rstrip
100
93
  end
101
94
 
102
95
  private