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.
- data/Rakefile +42 -17
- data/VERSION +1 -1
- data/lib/haml/compiler.rb +3 -3
- data/lib/haml/helpers/action_view_mods.rb +4 -3
- data/lib/haml/template.rb +3 -1
- data/test/gemfiles/Gemfile.rails-2.0.x +8 -0
- data/test/gemfiles/Gemfile.rails-2.0.x.lock +38 -0
- data/test/gemfiles/Gemfile.rails-2.1.x +8 -0
- data/test/gemfiles/Gemfile.rails-2.1.x.lock +38 -0
- data/test/gemfiles/Gemfile.rails-2.2.x +8 -0
- data/test/gemfiles/Gemfile.rails-2.2.x.lock +38 -0
- data/test/gemfiles/Gemfile.rails-2.3.x +8 -0
- data/test/gemfiles/Gemfile.rails-2.3.x.lock +40 -0
- data/test/gemfiles/Gemfile.rails-3.0.x +8 -0
- data/test/gemfiles/Gemfile.rails-3.0.x.lock +85 -0
- data/test/gemfiles/Gemfile.rails-3.1.x +8 -0
- data/test/gemfiles/Gemfile.rails-3.1.x.lock +98 -0
- data/test/gemfiles/Gemfile.rails-xss-2.3.x +9 -0
- data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +42 -0
- data/test/haml/engine_test.rb +19 -0
- data/test/haml/html2haml_test.rb +1 -1
- data/test/haml/template_test.rb +20 -2
- data/test/haml/templates/partial_layout.haml +4 -1
- data/test/linked_rails.rb +4 -4
- data/vendor/sass/VERSION +1 -1
- data/vendor/sass/doc-src/SASS_CHANGELOG.md +115 -2
- data/vendor/sass/doc-src/SASS_REFERENCE.md +12 -4
- data/vendor/sass/lib/sass.rb +1 -0
- data/vendor/sass/lib/sass/cache_stores/base.rb +3 -1
- data/vendor/sass/lib/sass/cache_stores/filesystem.rb +2 -0
- data/vendor/sass/lib/sass/css.rb +2 -1
- data/vendor/sass/lib/sass/engine.rb +39 -23
- data/vendor/sass/lib/sass/environment.rb +11 -0
- data/vendor/sass/lib/sass/exec.rb +14 -1
- data/vendor/sass/lib/sass/importers/base.rb +2 -1
- data/vendor/sass/lib/sass/importers/filesystem.rb +18 -13
- data/vendor/sass/lib/sass/less.rb +2 -2
- data/vendor/sass/lib/sass/logger.rb +15 -0
- data/vendor/sass/lib/sass/logger/base.rb +32 -0
- data/vendor/sass/lib/sass/logger/log_level.rb +49 -0
- data/vendor/sass/lib/sass/plugin.rb +4 -8
- data/vendor/sass/lib/sass/plugin/compiler.rb +42 -17
- data/vendor/sass/lib/sass/plugin/configuration.rb +0 -2
- data/vendor/sass/lib/sass/railtie.rb +1 -1
- data/vendor/sass/lib/sass/script/funcall.rb +14 -1
- data/vendor/sass/lib/sass/script/functions.rb +44 -1
- data/vendor/sass/lib/sass/script/interpolation.rb +9 -0
- data/vendor/sass/lib/sass/script/lexer.rb +6 -1
- data/vendor/sass/lib/sass/script/list.rb +7 -0
- data/vendor/sass/lib/sass/script/literal.rb +5 -0
- data/vendor/sass/lib/sass/script/node.rb +8 -0
- data/vendor/sass/lib/sass/script/number.rb +28 -5
- data/vendor/sass/lib/sass/script/operation.rb +8 -0
- data/vendor/sass/lib/sass/script/parser.rb +12 -5
- data/vendor/sass/lib/sass/script/string_interpolation.rb +9 -0
- data/vendor/sass/lib/sass/script/unary_operation.rb +7 -0
- data/vendor/sass/lib/sass/script/variable.rb +5 -0
- data/vendor/sass/lib/sass/scss/parser.rb +78 -38
- data/vendor/sass/lib/sass/scss/rx.rb +2 -1
- data/vendor/sass/lib/sass/scss/static_parser.rb +2 -2
- data/vendor/sass/lib/sass/shared.rb +1 -1
- data/vendor/sass/lib/sass/tree/comment_node.rb +24 -11
- data/vendor/sass/lib/sass/tree/debug_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/each_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/extend_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/for_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/function_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/if_node.rb +1 -14
- data/vendor/sass/lib/sass/tree/mixin_def_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/mixin_node.rb +2 -2
- data/vendor/sass/lib/sass/tree/node.rb +2 -5
- data/vendor/sass/lib/sass/tree/prop_node.rb +2 -9
- data/vendor/sass/lib/sass/tree/return_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/rule_node.rb +9 -2
- data/vendor/sass/lib/sass/tree/variable_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +17 -18
- data/vendor/sass/lib/sass/tree/visitors/convert.rb +10 -5
- data/vendor/sass/lib/sass/tree/visitors/deep_copy.rb +87 -0
- data/vendor/sass/lib/sass/tree/visitors/perform.rb +50 -19
- data/vendor/sass/lib/sass/tree/visitors/set_options.rb +97 -0
- data/vendor/sass/lib/sass/tree/visitors/to_css.rb +9 -15
- data/vendor/sass/lib/sass/tree/warn_node.rb +1 -1
- data/vendor/sass/lib/sass/tree/while_node.rb +1 -1
- data/vendor/sass/lib/sass/util.rb +58 -6
- data/vendor/sass/sass.gemspec +2 -1
- data/vendor/sass/test/Gemfile +4 -0
- data/vendor/sass/test/Gemfile.lock +19 -0
- data/vendor/sass/test/sass/cache_test.rb +15 -0
- data/vendor/sass/test/sass/conversion_test.rb +2 -6
- data/vendor/sass/test/sass/css2sass_test.rb +9 -0
- data/vendor/sass/test/sass/engine_test.rb +124 -26
- data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.css +1 -0
- data/vendor/sass/test/sass/fixtures/test_staleness_check_across_importers.scss +1 -0
- data/vendor/sass/test/sass/functions_test.rb +13 -0
- data/vendor/sass/test/sass/importer_test.rb +110 -0
- data/vendor/sass/test/sass/logger_test.rb +58 -0
- data/vendor/sass/test/sass/plugin_test.rb +16 -13
- data/vendor/sass/test/sass/script_conversion_test.rb +2 -0
- data/vendor/sass/test/sass/script_test.rb +18 -0
- data/vendor/sass/test/sass/scss/css_test.rb +7 -1
- data/vendor/sass/test/sass/scss/scss_test.rb +37 -13
- data/vendor/sass/test/sass/templates/bork5.sass +3 -0
- data/vendor/sass/test/sass/templates/nested_bork5.sass +2 -0
- data/vendor/sass/test/sass/test_helper.rb +1 -1
- data/vendor/sass/test/sass/util_test.rb +12 -0
- data/vendor/sass/vendor/fssm/Gemfile +3 -0
- data/vendor/sass/vendor/fssm/LICENSE +1 -1
- data/vendor/sass/vendor/fssm/README.markdown +55 -27
- data/vendor/sass/vendor/fssm/Rakefile +6 -54
- data/vendor/sass/vendor/fssm/example.rb +6 -3
- data/vendor/sass/vendor/fssm/fssm.gemspec +17 -70
- data/vendor/sass/vendor/fssm/lib/fssm.rb +7 -3
- data/vendor/sass/vendor/fssm/lib/fssm/backends/fsevents.rb +1 -1
- data/vendor/sass/vendor/fssm/lib/fssm/backends/inotify.rb +2 -2
- data/vendor/sass/vendor/fssm/lib/fssm/backends/polling.rb +2 -2
- data/vendor/sass/vendor/fssm/lib/fssm/backends/rbfsevent.rb +42 -0
- data/vendor/sass/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +10 -10
- data/vendor/sass/vendor/fssm/lib/fssm/monitor.rb +19 -9
- data/vendor/sass/vendor/fssm/lib/fssm/path.rb +24 -21
- data/vendor/sass/vendor/fssm/lib/fssm/pathname.rb +13 -479
- data/vendor/sass/vendor/fssm/lib/fssm/state/directory.rb +29 -11
- data/vendor/sass/vendor/fssm/lib/fssm/state/file.rb +1 -1
- data/vendor/sass/vendor/fssm/lib/fssm/support.rb +41 -12
- data/vendor/sass/vendor/fssm/lib/fssm/tree.rb +6 -6
- data/vendor/sass/vendor/fssm/lib/fssm/version.rb +3 -0
- data/vendor/sass/vendor/fssm/profile/prof-cache.rb +3 -3
- data/vendor/sass/vendor/fssm/profile/prof-pathname-rubinius.rb +35 -0
- data/vendor/sass/vendor/fssm/profile/prof-pathname.rb +7 -7
- data/vendor/sass/vendor/fssm/spec/count_down_latch.rb +151 -0
- data/vendor/sass/vendor/fssm/spec/monitor_spec.rb +202 -0
- data/vendor/sass/vendor/fssm/spec/path_spec.rb +36 -15
- data/vendor/sass/vendor/fssm/spec/spec_helper.rb +6 -6
- metadata +36 -5
- data/vendor/sass/vendor/fssm/VERSION.yml +0 -5
@@ -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
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
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 =
|
491
|
-
|
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
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
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,
|
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
|
-
|
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 \"#{
|
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
|
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
|
-
|
29
|
-
|
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
|
-
@
|
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
|
61
|
-
|
62
|
-
|
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
|
@@ -11,11 +11,11 @@ module Sass::Tree
|
|
11
11
|
|
12
12
|
# The parse tree for the initial expression.
|
13
13
|
# @return [Script::Node]
|
14
|
-
|
14
|
+
attr_accessor :from
|
15
15
|
|
16
16
|
# The parse tree for the final expression.
|
17
17
|
# @return [Script::Node]
|
18
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
16
|
+
attr_accessor :args
|
17
17
|
|
18
18
|
# A hash from keyword argument names to values.
|
19
19
|
# @return [{String => Script::Node}]
|
20
|
-
|
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
|
-
|
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
|
-
|
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,
|
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)}
|
92
|
+
"#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}".rstrip
|
100
93
|
end
|
101
94
|
|
102
95
|
private
|