haml-edge 2.3.186 → 2.3.187
Sign up to get free protection for your applications and to get access to all the features.
- data/EDGE_GEM_VERSION +1 -1
- data/VERSION +1 -1
- data/lib/haml/exec.rb +94 -18
- data/lib/haml/helpers.rb +3 -1
- data/lib/sass/engine.rb +1 -1
- data/lib/sass/script/bool.rb +1 -1
- data/lib/sass/script/color.rb +1 -1
- data/lib/sass/script/funcall.rb +2 -2
- data/lib/sass/script/interpolation.rb +5 -5
- data/lib/sass/script/literal.rb +1 -1
- data/lib/sass/script/node.rb +10 -1
- data/lib/sass/script/number.rb +1 -1
- data/lib/sass/script/operation.rb +5 -5
- data/lib/sass/script/string.rb +12 -5
- data/lib/sass/script/unary_operation.rb +3 -3
- data/lib/sass/script/variable.rb +2 -2
- data/lib/sass/scss/css_parser.rb +1 -0
- data/lib/sass/scss/parser.rb +45 -25
- data/lib/sass/scss/rx.rb +1 -0
- data/lib/sass/tree/for_node.rb +1 -1
- data/lib/sass/tree/if_node.rb +1 -1
- data/lib/sass/tree/mixin_def_node.rb +3 -3
- data/lib/sass/tree/mixin_node.rb +2 -2
- data/lib/sass/tree/node.rb +8 -0
- data/lib/sass/tree/prop_node.rb +17 -16
- data/lib/sass/tree/rule_node.rb +2 -2
- data/lib/sass/tree/variable_node.rb +1 -1
- data/lib/sass/tree/while_node.rb +1 -1
- data/test/sass/conversion_test.rb +47 -0
- data/test/sass/scss/css_test.rb +3 -3
- data/test/sass/scss/scss_test.rb +40 -0
- metadata +2 -37
- data/test/haml/spec/README.md +0 -97
- data/test/haml/spec/lua_haml_spec.lua +0 -30
- data/test/haml/spec/ruby_haml_test.rb +0 -19
- data/test/haml/spec/tests.json +0 -534
- data/vendor/fssm/LICENSE +0 -20
- data/vendor/fssm/README.markdown +0 -55
- data/vendor/fssm/Rakefile +0 -59
- data/vendor/fssm/VERSION.yml +0 -5
- data/vendor/fssm/example.rb +0 -9
- data/vendor/fssm/fssm.gemspec +0 -77
- data/vendor/fssm/lib/fssm/backends/fsevents.rb +0 -36
- data/vendor/fssm/lib/fssm/backends/inotify.rb +0 -26
- data/vendor/fssm/lib/fssm/backends/polling.rb +0 -25
- data/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +0 -131
- data/vendor/fssm/lib/fssm/monitor.rb +0 -26
- data/vendor/fssm/lib/fssm/path.rb +0 -91
- data/vendor/fssm/lib/fssm/pathname.rb +0 -502
- data/vendor/fssm/lib/fssm/state/directory.rb +0 -57
- data/vendor/fssm/lib/fssm/state/file.rb +0 -24
- data/vendor/fssm/lib/fssm/support.rb +0 -63
- data/vendor/fssm/lib/fssm/tree.rb +0 -176
- data/vendor/fssm/lib/fssm.rb +0 -33
- data/vendor/fssm/profile/prof-cache.rb +0 -40
- data/vendor/fssm/profile/prof-fssm-pathname.html +0 -1231
- data/vendor/fssm/profile/prof-pathname.rb +0 -68
- data/vendor/fssm/profile/prof-plain-pathname.html +0 -988
- data/vendor/fssm/profile/prof.html +0 -2379
- data/vendor/fssm/spec/path_spec.rb +0 -75
- data/vendor/fssm/spec/root/duck/quack.txt +0 -0
- data/vendor/fssm/spec/root/file.css +0 -0
- data/vendor/fssm/spec/root/file.rb +0 -0
- data/vendor/fssm/spec/root/file.yml +0 -0
- data/vendor/fssm/spec/root/moo/cow.txt +0 -0
- data/vendor/fssm/spec/spec_helper.rb +0 -14
data/EDGE_GEM_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.
|
1
|
+
2.3.187
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.
|
1
|
+
2.3.187
|
data/lib/haml/exec.rb
CHANGED
@@ -105,6 +105,39 @@ module Haml
|
|
105
105
|
@options[:input], @options[:output] = input, output
|
106
106
|
end
|
107
107
|
|
108
|
+
# @private
|
109
|
+
COLORS = { :red => 31, :green => 32, :yellow => 33 }
|
110
|
+
|
111
|
+
# Prints a status message about performing the given action,
|
112
|
+
# colored using the given color (via terminal escapes) if possible.
|
113
|
+
#
|
114
|
+
# @param name [#to_s] A short name for the action being performed.
|
115
|
+
# Shouldn't be longer than 11 characters.
|
116
|
+
# @param color [Symbol] The name of the color to use for this action.
|
117
|
+
# Can be `:red`, `:green`, or `:yellow`.
|
118
|
+
def puts_action(name, color, arg)
|
119
|
+
printf color(color, "%11s %s\n"), name, arg
|
120
|
+
end
|
121
|
+
|
122
|
+
# Wraps the given string in terminal escapes
|
123
|
+
# causing it to have the given color.
|
124
|
+
# If terminal esapes aren't supported on this platform,
|
125
|
+
# just returns the string instead.
|
126
|
+
#
|
127
|
+
# @param color [Symbol] The name of the color to use.
|
128
|
+
# Can be `:red`, `:green`, or `:yellow`.
|
129
|
+
# @param str [String] The string to wrap in the given color.
|
130
|
+
# @return [String] The wrapped string.
|
131
|
+
def color(color, str)
|
132
|
+
raise "[BUG] Unrecognized color #{color}" unless COLORS[color]
|
133
|
+
|
134
|
+
# Almost any real Unix terminal will support color,
|
135
|
+
# so we just filter for Windows terms (which don't set TERM)
|
136
|
+
# and not-real terminals, which aren't ttys.
|
137
|
+
return str if ENV["TERM"].nil? || ENV["TERM"].empty? || !STDOUT.tty?
|
138
|
+
return "\e[#{COLORS[color]}m#{str}\e[0m"
|
139
|
+
end
|
140
|
+
|
108
141
|
private
|
109
142
|
|
110
143
|
def open_file(filename, flag = 'r')
|
@@ -358,23 +391,6 @@ MSG
|
|
358
391
|
|
359
392
|
::Sass::Plugin.watch(files)
|
360
393
|
end
|
361
|
-
|
362
|
-
# @private
|
363
|
-
COLORS = { :red => 31, :green => 32, :yellow => 33 }
|
364
|
-
|
365
|
-
def puts_action(name, color, arg)
|
366
|
-
printf color(color, "%11s %s\n"), name, arg
|
367
|
-
end
|
368
|
-
|
369
|
-
def color(color, str)
|
370
|
-
raise "[BUG] Unrecognized color #{color}" unless COLORS[color]
|
371
|
-
|
372
|
-
# Almost any real Unix terminal will support color,
|
373
|
-
# so we just filter for Windows terms (which don't set TERM)
|
374
|
-
# and not-real terminals, which aren't ttys.
|
375
|
-
return str if ENV["TERM"].nil? || ENV["TERM"].empty? || !STDOUT.tty?
|
376
|
-
return "\e[#{COLORS[color]}m#{str}\e[0m"
|
377
|
-
end
|
378
394
|
end
|
379
395
|
|
380
396
|
# The `haml` executable.
|
@@ -574,12 +590,21 @@ END
|
|
574
590
|
@options[:to] = name.downcase.to_sym
|
575
591
|
end
|
576
592
|
|
593
|
+
opts.on('-R', '--recursive',
|
594
|
+
'Convert all the files in a directory. Requires --from and --to.') do
|
595
|
+
@options[:recursive] = true
|
596
|
+
end
|
597
|
+
|
577
598
|
opts.on('-i', '--in-place',
|
578
599
|
'Convert a file to its own syntax.',
|
579
600
|
'This can be used to update some deprecated syntax.') do
|
580
601
|
@options[:in_place] = true
|
581
602
|
end
|
582
603
|
|
604
|
+
opts.on('--dasherize', 'Convert underscores to dashes') do
|
605
|
+
@options[:dasherize] = true
|
606
|
+
end
|
607
|
+
|
583
608
|
opts.on('--old', 'Output the old-style ":prop val" property syntax.',
|
584
609
|
'Only meaningful when generating Sass.') do
|
585
610
|
@options[:for_tree][:old] = true
|
@@ -596,12 +621,63 @@ END
|
|
596
621
|
# and runs the CSS compiler appropriately.
|
597
622
|
def process_result
|
598
623
|
require 'sass'
|
599
|
-
super
|
600
624
|
|
625
|
+
if @options[:recursive]
|
626
|
+
process_directory
|
627
|
+
return
|
628
|
+
end
|
629
|
+
|
630
|
+
super
|
601
631
|
input = @options[:input]
|
632
|
+
raise "Error: '#{input}' is a directory (did you mean to use --recursive?)" if File.directory?(input)
|
602
633
|
output = @options[:output]
|
603
634
|
output = input if @options[:in_place]
|
635
|
+
process_file(input, output)
|
636
|
+
end
|
637
|
+
|
638
|
+
def process_directory
|
639
|
+
input = @options[:input] = @args.shift
|
640
|
+
output = @options[:output] = @args.shift
|
641
|
+
raise "Error: --from required when using --recursive." unless @options[:from]
|
642
|
+
raise "Error: --to required when using --recursive." unless @options[:to]
|
643
|
+
raise "Error: '#{@options[:input]}' is not a directory" unless File.directory?(@options[:input])
|
644
|
+
if @options[:output] && File.exists?(@options[:output]) && !File.directory?(@options[:output])
|
645
|
+
raise "Error: '#{@options[:output]}' is not a directory"
|
646
|
+
end
|
647
|
+
@options[:output] ||= @options[:input]
|
648
|
+
|
649
|
+
ext = @options[:from]
|
650
|
+
ext = :sass if ext == :sass2
|
651
|
+
Dir.glob("#{@options[:input]}/**/*.#{ext}") do |f|
|
652
|
+
output =
|
653
|
+
if @options[:in_place]
|
654
|
+
f
|
655
|
+
elsif @options[:output]
|
656
|
+
output_name = f.gsub(/\.(c|sa|sc)ss$/, ".#{@options[:to]}")
|
657
|
+
output_name[0...@options[:input].size] = @options[:output]
|
658
|
+
output_name
|
659
|
+
else
|
660
|
+
f.gsub(/\.(c|sa|sc)ss$/, ".#{@options[:to]}")
|
661
|
+
end
|
662
|
+
|
663
|
+
unless File.directory?(File.dirname(output))
|
664
|
+
puts_action :directory, :green, File.dirname(output)
|
665
|
+
FileUtils.mkdir_p(File.dirname(output))
|
666
|
+
end
|
667
|
+
puts_action :convert, :green, f
|
668
|
+
if File.exists?(output)
|
669
|
+
puts_action :overwrite, :yellow, output
|
670
|
+
else
|
671
|
+
puts_action :create, :green, output
|
672
|
+
end
|
673
|
+
|
674
|
+
input = open_file(f)
|
675
|
+
output = @options[:in_place] ? input : open_file(output, "w")
|
676
|
+
process_file(input, output)
|
677
|
+
end
|
678
|
+
end
|
604
679
|
|
680
|
+
def process_file(input, output)
|
605
681
|
if input.is_a?(File)
|
606
682
|
@options[:from] ||=
|
607
683
|
case input.path
|
data/lib/haml/helpers.rb
CHANGED
@@ -348,7 +348,9 @@ MESSAGE
|
|
348
348
|
haml_buffer.capture_position = position
|
349
349
|
block.call(*args)
|
350
350
|
|
351
|
-
captured = haml_buffer.buffer.slice!(position..-1)
|
351
|
+
captured = haml_buffer.buffer.slice!(position..-1)
|
352
|
+
return captured if haml_buffer.options[:ugly]
|
353
|
+
captured = captured.split(/^/)
|
352
354
|
|
353
355
|
min_tabs = nil
|
354
356
|
captured.each do |line|
|
data/lib/sass/engine.rb
CHANGED
@@ -415,7 +415,7 @@ WARNING
|
|
415
415
|
if eq.strip[0] == SCRIPT_CHAR
|
416
416
|
expr.context = :equals
|
417
417
|
Script.equals_warning("properties", name,
|
418
|
-
Sass::Tree::PropNode.val_to_sass(expr), false,
|
418
|
+
Sass::Tree::PropNode.val_to_sass(expr, @options), false,
|
419
419
|
@line, line.offset + 1, @options[:filename])
|
420
420
|
end
|
421
421
|
end
|
data/lib/sass/script/bool.rb
CHANGED
data/lib/sass/script/color.rb
CHANGED
@@ -375,7 +375,7 @@ END
|
|
375
375
|
# but if the color has a name that's used instead.
|
376
376
|
#
|
377
377
|
# @return [String] The string representation
|
378
|
-
def to_s
|
378
|
+
def to_s(opts = {})
|
379
379
|
return rgba_str if alpha?
|
380
380
|
return smallest if options[:style] == :compressed
|
381
381
|
return HTML4_COLORS_REVERSE[rgb] if HTML4_COLORS_REVERSE[rgb]
|
data/lib/sass/script/funcall.rb
CHANGED
@@ -31,8 +31,8 @@ module Sass
|
|
31
31
|
end
|
32
32
|
|
33
33
|
# @see Node#to_sass
|
34
|
-
def to_sass
|
35
|
-
"#{name}(#{args.map {|a| a.to_sass}.join(', ')})"
|
34
|
+
def to_sass(opts = {})
|
35
|
+
"#{dasherize(name, opts)}(#{args.map {|a| a.to_sass(opts)}.join(', ')})"
|
36
36
|
end
|
37
37
|
|
38
38
|
# Returns the arguments to the function.
|
@@ -9,16 +9,16 @@ module Sass::Script
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def inspect
|
12
|
-
"(interpolation #{@before.inspect} #{@mid.inspect} #{after.inspect})"
|
12
|
+
"(interpolation #{@before.inspect} #{@mid.inspect} #{@after.inspect})"
|
13
13
|
end
|
14
14
|
|
15
|
-
def to_sass
|
15
|
+
def to_sass(opts = {})
|
16
16
|
res = ""
|
17
|
-
res << @before.to_sass if @before
|
17
|
+
res << @before.to_sass(opts) if @before
|
18
18
|
res << ' ' if @before && @whitespace_before
|
19
|
-
res << '#{' << @mid.to_sass << '}'
|
19
|
+
res << '#{' << @mid.to_sass(opts) << '}'
|
20
20
|
res << ' ' if @after && @whitespace_after
|
21
|
-
res << @after.to_sass if @after
|
21
|
+
res << @after.to_sass(opts) if @after
|
22
22
|
res
|
23
23
|
end
|
24
24
|
|
data/lib/sass/script/literal.rb
CHANGED
@@ -218,7 +218,7 @@ MSG
|
|
218
218
|
# as it would be output to the CSS document.
|
219
219
|
#
|
220
220
|
# @return [String]
|
221
|
-
def to_s
|
221
|
+
def to_s(opts = {})
|
222
222
|
raise Sass::SyntaxError.new("[BUG] All subclasses of Sass::Literal must implement #to_s.")
|
223
223
|
end
|
224
224
|
alias_method :to_sass, :to_s
|
data/lib/sass/script/node.rb
CHANGED
@@ -74,12 +74,21 @@ module Sass::Script
|
|
74
74
|
# Returns the text of this SassScript expression.
|
75
75
|
#
|
76
76
|
# @return [String]
|
77
|
-
def to_sass
|
77
|
+
def to_sass(opts = {})
|
78
78
|
raise NotImplementedError.new("All subclasses of Sass::Script::Node must override #to_sass.")
|
79
79
|
end
|
80
80
|
|
81
81
|
protected
|
82
82
|
|
83
|
+
# Converts underscores to dashes if the :dasherize option is set.
|
84
|
+
def dasherize(s, opts)
|
85
|
+
if opts[:dasherize]
|
86
|
+
s.gsub(/_/,'-')
|
87
|
+
else
|
88
|
+
s
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
83
92
|
# Evaluates this node.
|
84
93
|
#
|
85
94
|
# @param environment [Sass::Environment] The environment in which to evaluate the SassScript
|
data/lib/sass/script/number.rb
CHANGED
@@ -238,7 +238,7 @@ module Sass::Script
|
|
238
238
|
# as long as there is only one unit.
|
239
239
|
#
|
240
240
|
# @return [String] The representation
|
241
|
-
def inspect
|
241
|
+
def inspect(opts = {})
|
242
242
|
value =
|
243
243
|
if self.value.is_a?(Float) && (self.value.infinite? || self.value.nan?)
|
244
244
|
self.value
|
@@ -33,10 +33,10 @@ module Sass::Script
|
|
33
33
|
end
|
34
34
|
|
35
35
|
# @see Node#to_sass
|
36
|
-
def to_sass
|
36
|
+
def to_sass(opts = {})
|
37
37
|
pred = Sass::Script::Parser.precedence_of(@operator)
|
38
|
-
o1 = operand_to_sass pred, @operand1
|
39
|
-
o2 = operand_to_sass pred, @operand2
|
38
|
+
o1 = operand_to_sass pred, @operand1, opts
|
39
|
+
o2 = operand_to_sass pred, @operand2, opts
|
40
40
|
sep =
|
41
41
|
case @operator
|
42
42
|
when :comma; ", "
|
@@ -82,10 +82,10 @@ module Sass::Script
|
|
82
82
|
|
83
83
|
private
|
84
84
|
|
85
|
-
def operand_to_sass(pred, op)
|
85
|
+
def operand_to_sass(pred, op, opts = {})
|
86
86
|
return "(#{op.to_sass})" if op.is_a?(Operation) &&
|
87
87
|
Sass::Script::Parser.precedence_of(op.operator) < pred
|
88
|
-
op.to_sass
|
88
|
+
op.to_sass(opts)
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
data/lib/sass/script/string.rb
CHANGED
@@ -35,23 +35,30 @@ module Sass::Script
|
|
35
35
|
end
|
36
36
|
|
37
37
|
# @see Node#to_s
|
38
|
-
def to_s
|
39
|
-
to_sass
|
38
|
+
def to_s(opts = {})
|
39
|
+
to_sass(opts)
|
40
40
|
end
|
41
41
|
|
42
|
-
# @param
|
43
|
-
#
|
42
|
+
# @param opts [{Symbol => Object}]
|
43
|
+
# `opts[:type]` -- The type of string to render this as.
|
44
|
+
# `:string`s have double quotes, `:identifier`s do not.
|
45
|
+
# Defaults to `:identifier`.
|
44
46
|
# @see Node#to_sass
|
45
|
-
def to_sass(
|
47
|
+
def to_sass(opts = {})
|
48
|
+
type = opts[:type] || self.type
|
46
49
|
if type == :identifier
|
47
50
|
if context == :equals && Sass::SCSS::RX.escape_ident(self.value).include?(?\\)
|
48
51
|
return "unquote(#{Sass::Script::String.new(self.value, :string).to_sass})"
|
52
|
+
elsif context == :equals && self.value.size == 0
|
53
|
+
return %q{""}
|
49
54
|
end
|
50
55
|
return self.value
|
51
56
|
end
|
52
57
|
|
53
58
|
# Replace single backslashes with double. Really.
|
54
59
|
value = self.value.gsub("\\", "\\\\\\\\")
|
60
|
+
return "\"#{value.gsub('"', "\\\"")}\"" if opts[:quote] == %q{"}
|
61
|
+
return "'#{value.gsub("'", "\\'")}'" if opts[:quote] == %q{'}
|
55
62
|
return "\"#{value}\"" unless value.include?('"')
|
56
63
|
return "'#{value}'" unless value.include?("'")
|
57
64
|
"\"#{value.gsub('"', "\\\"")}\"" #'
|
@@ -19,12 +19,12 @@ module Sass::Script
|
|
19
19
|
end
|
20
20
|
|
21
21
|
# @see Node#to_sass
|
22
|
-
def to_sass
|
23
|
-
operand = @operand.to_sass
|
22
|
+
def to_sass(opts = {})
|
23
|
+
operand = @operand.to_sass(opts)
|
24
24
|
if @operand.is_a?(Operation) ||
|
25
25
|
(@operator == :minus &&
|
26
26
|
(operand =~ Sass::SCSS::RX::IDENT) == 0)
|
27
|
-
operand = "(#{@operand.to_sass})"
|
27
|
+
operand = "(#{@operand.to_sass(opts)})"
|
28
28
|
end
|
29
29
|
op = Lexer::OPERATORS_REVERSE[@operator]
|
30
30
|
op + (op =~ /[a-z]/ ? " " : "") + operand
|
data/lib/sass/script/variable.rb
CHANGED
@@ -14,9 +14,9 @@ module Sass
|
|
14
14
|
end
|
15
15
|
|
16
16
|
# @return [String] A string representation of the variable
|
17
|
-
def inspect
|
17
|
+
def inspect(opts = {})
|
18
18
|
return "!important" if name == "important"
|
19
|
-
"$#{name}"
|
19
|
+
"$#{dasherize(name, opts)}"
|
20
20
|
end
|
21
21
|
alias_method :to_sass, :inspect
|
22
22
|
|
data/lib/sass/scss/css_parser.rb
CHANGED
data/lib/sass/scss/parser.rb
CHANGED
@@ -366,12 +366,12 @@ module Sass
|
|
366
366
|
|
367
367
|
def simple_selector_sequence
|
368
368
|
# This allows for stuff like http://www.w3.org/TR/css3-animations/#keyframes-
|
369
|
-
return expr unless e = element_name ||
|
369
|
+
return expr unless e = element_name || id_selector || class_selector ||
|
370
370
|
attrib || negation || pseudo || parent_selector || interpolation
|
371
371
|
res = [e]
|
372
372
|
|
373
373
|
# The tok(/\*/) allows the "E*" hack
|
374
|
-
while v = element_name ||
|
374
|
+
while v = element_name || id_selector || class_selector ||
|
375
375
|
attrib || negation || pseudo || tok(/\*/) || interpolation
|
376
376
|
res << v
|
377
377
|
end
|
@@ -382,9 +382,16 @@ module Sass
|
|
382
382
|
tok(/&/)
|
383
383
|
end
|
384
384
|
|
385
|
-
def
|
385
|
+
def class_selector
|
386
386
|
return unless tok(/\./)
|
387
|
-
|
387
|
+
@expected = "class name"
|
388
|
+
['.', expr!(:interp_ident)]
|
389
|
+
end
|
390
|
+
|
391
|
+
def id_selector
|
392
|
+
return unless tok(/#(?!\{)/)
|
393
|
+
@expected = "id name"
|
394
|
+
['#', expr!(:interp_name)]
|
388
395
|
end
|
389
396
|
|
390
397
|
def element_name
|
@@ -398,7 +405,7 @@ module Sass
|
|
398
405
|
|
399
406
|
def attrib
|
400
407
|
return unless tok(/\[/)
|
401
|
-
res = ['[', str{ss},
|
408
|
+
res = ['[', str{ss}, attrib_name!, str{ss}]
|
402
409
|
|
403
410
|
if m = tok(/=/) ||
|
404
411
|
tok(INCLUDES) ||
|
@@ -413,31 +420,29 @@ module Sass
|
|
413
420
|
end
|
414
421
|
|
415
422
|
def attrib_name!
|
416
|
-
if
|
417
|
-
# E, E|E
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
423
|
+
if name_or_ns = interp_ident
|
424
|
+
# E, E|E
|
425
|
+
if tok(/\|(?!=)/)
|
426
|
+
ns = name_or_ns
|
427
|
+
name = interp_ident
|
428
|
+
else
|
429
|
+
name = name_or_ns
|
430
|
+
end
|
424
431
|
else
|
425
|
-
#
|
426
|
-
tok(
|
427
|
-
tok!
|
432
|
+
# *|E or |E
|
433
|
+
ns = tok(/\*/) || ""
|
434
|
+
tok!(/\|/)
|
435
|
+
name = expr!(:interp_ident)
|
428
436
|
end
|
437
|
+
return [ns, ("|" if ns), name]
|
429
438
|
end
|
430
439
|
|
431
440
|
def pseudo
|
432
441
|
return unless s = tok(/::?/)
|
433
|
-
|
434
442
|
@expected = "pseudoclass or pseudoelement"
|
435
|
-
[s,
|
436
|
-
|
437
|
-
|
438
|
-
def functional_pseudo
|
439
|
-
return unless fn = tok(FUNCTION)
|
440
|
-
[fn, str{ss}, expr!(:pseudo_expr), tok!(/\)/)]
|
443
|
+
res = [s, expr!(:interp_ident)]
|
444
|
+
return res unless tok(/\(/)
|
445
|
+
res << '(' << str{ss} << expr!(:pseudo_expr) << tok!(/\)/)
|
441
446
|
end
|
442
447
|
|
443
448
|
def pseudo_expr
|
@@ -455,7 +460,7 @@ module Sass
|
|
455
460
|
return unless tok(NOT)
|
456
461
|
res = [":not(", str{ss}]
|
457
462
|
@expected = "selector"
|
458
|
-
res << (element_name ||
|
463
|
+
res << (element_name || id_selector || class_selector || attrib || expr!(:pseudo))
|
459
464
|
res << tok!(/\)/)
|
460
465
|
end
|
461
466
|
|
@@ -553,7 +558,7 @@ MESSAGE
|
|
553
558
|
end
|
554
559
|
|
555
560
|
def interpolation
|
556
|
-
return unless tok(
|
561
|
+
return unless tok(INTERP_START)
|
557
562
|
sass_script(:parse_interpolated)
|
558
563
|
end
|
559
564
|
|
@@ -571,6 +576,19 @@ MESSAGE
|
|
571
576
|
res
|
572
577
|
end
|
573
578
|
|
579
|
+
def interp_ident(ident = IDENT)
|
580
|
+
return unless val = tok(ident) || interpolation
|
581
|
+
res = [val]
|
582
|
+
while val = tok(ident) || interpolation
|
583
|
+
res << val
|
584
|
+
end
|
585
|
+
res
|
586
|
+
end
|
587
|
+
|
588
|
+
def interp_name
|
589
|
+
interp_ident NAME
|
590
|
+
end
|
591
|
+
|
574
592
|
def str
|
575
593
|
@strs.push ""
|
576
594
|
yield
|
@@ -608,6 +626,8 @@ MESSAGE
|
|
608
626
|
:media_query => "media query (e.g. print, screen, print and screen)",
|
609
627
|
:media_expr => "media expression (e.g. (min-device-width: 800px)))",
|
610
628
|
:pseudo_expr => "expression (e.g. fr, 2n+1)",
|
629
|
+
:interp_ident => "identifier",
|
630
|
+
:interp_name => "identifier",
|
611
631
|
:expr => "expression (e.g. 1px, bold)",
|
612
632
|
}
|
613
633
|
|
data/lib/sass/scss/rx.rb
CHANGED
data/lib/sass/tree/for_node.rb
CHANGED
@@ -22,7 +22,7 @@ module Sass::Tree
|
|
22
22
|
|
23
23
|
def to_src(tabs, opts, fmt)
|
24
24
|
to = @exclusive ? "to" : "through"
|
25
|
-
"#{' ' * tabs}@for $#{@var} from #{@from.to_sass} #{to} #{@to.to_sass}" +
|
25
|
+
"#{' ' * tabs}@for $#{dasherize(@var, opts)} from #{@from.to_sass(opts)} #{to} #{@to.to_sass(opts)}" +
|
26
26
|
children_to_src(tabs, opts, fmt)
|
27
27
|
end
|
28
28
|
|
data/lib/sass/tree/if_node.rb
CHANGED
@@ -44,7 +44,7 @@ module Sass::Tree
|
|
44
44
|
else; "else"
|
45
45
|
end
|
46
46
|
str = "#{' ' * tabs}@#{name}"
|
47
|
-
str << " #{@expr.to_sass}" if @expr
|
47
|
+
str << " #{@expr.to_sass(opts)}" if @expr
|
48
48
|
str << children_to_src(tabs, opts, fmt)
|
49
49
|
str << @else.send(:to_src, tabs, opts, fmt, true) if @else
|
50
50
|
str
|
@@ -23,14 +23,14 @@ module Sass
|
|
23
23
|
else
|
24
24
|
'(' + @args.map do |v, d|
|
25
25
|
if d
|
26
|
-
"#{v.to_sass}: #{d.to_sass}"
|
26
|
+
"#{v.to_sass(opts)}: #{d.to_sass(opts)}"
|
27
27
|
else
|
28
|
-
v.to_sass
|
28
|
+
v.to_sass(opts)
|
29
29
|
end
|
30
30
|
end.join(", ") + ')'
|
31
31
|
end
|
32
32
|
|
33
|
-
"#{' ' * tabs}#{fmt == :sass ? '=' : '@mixin '}#{@name}#{args}" +
|
33
|
+
"#{' ' * tabs}#{fmt == :sass ? '=' : '@mixin '}#{dasherize(@name, opts)}#{args}" +
|
34
34
|
children_to_src(tabs, opts, fmt)
|
35
35
|
end
|
36
36
|
|
data/lib/sass/tree/mixin_node.rb
CHANGED
@@ -29,8 +29,8 @@ module Sass::Tree
|
|
29
29
|
protected
|
30
30
|
|
31
31
|
def to_src(tabs, opts, fmt)
|
32
|
-
args = '(' + @args.map {|a| a.to_sass}.join(", ") + ')' unless @args.empty?
|
33
|
-
"#{' ' * tabs}#{fmt == :sass ? '+' : '@include '}#{@name}#{args}#{semi fmt}\n"
|
32
|
+
args = '(' + @args.map {|a| a.to_sass(opts)}.join(", ") + ')' unless @args.empty?
|
33
|
+
"#{' ' * tabs}#{fmt == :sass ? '+' : '@include '}#{dasherize(@name, opts)}#{args}#{semi fmt}\n"
|
34
34
|
end
|
35
35
|
|
36
36
|
# @see Node#_cssize
|
data/lib/sass/tree/node.rb
CHANGED
@@ -366,6 +366,14 @@ module Sass
|
|
366
366
|
(fmt == :sass ? "\n" : " }\n")
|
367
367
|
end
|
368
368
|
|
369
|
+
def dasherize(s, opts)
|
370
|
+
if opts[:dasherize]
|
371
|
+
s.gsub(/_/,'-')
|
372
|
+
else
|
373
|
+
s
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
369
377
|
# Returns a semicolon if this is SCSS, or an empty string if this is Sass.
|
370
378
|
#
|
371
379
|
# @param fmt [Symbol] `:sass` or `:scss`
|
data/lib/sass/tree/prop_node.rb
CHANGED
@@ -79,13 +79,13 @@ module Sass::Tree
|
|
79
79
|
protected
|
80
80
|
|
81
81
|
def to_src(tabs, opts, fmt)
|
82
|
-
name = self.name.map {|n| n.is_a?(String) ? n : "\#{#{n.to_sass}}"}.join
|
82
|
+
name = self.name.map {|n| n.is_a?(String) ? n : "\#{#{n.to_sass(opts)}}"}.join
|
83
83
|
old = opts[:old] && fmt == :sass
|
84
84
|
initial = old ? ':' : ''
|
85
85
|
mid = old ? '' : ':'
|
86
|
-
res = "#{' ' * tabs}#{initial}#{name}#{mid} #{self.class.val_to_sass(value)}"
|
86
|
+
res = "#{' ' * tabs}#{initial}#{name}#{mid} #{self.class.val_to_sass(value, opts)}"
|
87
87
|
return res + "#{semi fmt}\n" if children.empty?
|
88
|
-
res.rstrip + children_to_src(tabs, opts, fmt)
|
88
|
+
res.rstrip + children_to_src(tabs, opts, fmt).rstrip + semi(fmt) + "\n"
|
89
89
|
end
|
90
90
|
|
91
91
|
# Computes the CSS for the property.
|
@@ -175,42 +175,43 @@ module Sass::Tree
|
|
175
175
|
|
176
176
|
class << self
|
177
177
|
# @private
|
178
|
-
def val_to_sass(value)
|
179
|
-
return value.to_sass unless value.context == :equals
|
180
|
-
val_to_sass_comma(value).to_sass
|
178
|
+
def val_to_sass(value, opts)
|
179
|
+
return value.to_sass(opts) unless value.context == :equals
|
180
|
+
val_to_sass_comma(value, opts).to_sass(opts)
|
181
181
|
end
|
182
182
|
|
183
183
|
private
|
184
184
|
|
185
|
-
def val_to_sass_comma(node)
|
185
|
+
def val_to_sass_comma(node, opts)
|
186
186
|
return node unless node.is_a?(Sass::Script::Operation)
|
187
|
-
return val_to_sass_concat(node) unless node.operator == :comma
|
187
|
+
return val_to_sass_concat(node, opts) unless node.operator == :comma
|
188
188
|
|
189
189
|
Sass::Script::Operation.new(
|
190
|
-
val_to_sass_concat(node.operand1),
|
191
|
-
val_to_sass_comma(node.operand2),
|
190
|
+
val_to_sass_concat(node.operand1, opts),
|
191
|
+
val_to_sass_comma(node.operand2, opts),
|
192
192
|
node.operator)
|
193
193
|
end
|
194
194
|
|
195
|
-
def val_to_sass_concat(node)
|
195
|
+
def val_to_sass_concat(node, opts)
|
196
196
|
return node unless node.is_a?(Sass::Script::Operation)
|
197
|
-
return val_to_sass_div(node) unless node.operator == :concat
|
197
|
+
return val_to_sass_div(node, opts) unless node.operator == :concat
|
198
198
|
|
199
199
|
Sass::Script::Operation.new(
|
200
|
-
val_to_sass_div(node.operand1),
|
201
|
-
val_to_sass_concat(node.operand2),
|
200
|
+
val_to_sass_div(node.operand1, opts),
|
201
|
+
val_to_sass_concat(node.operand2, opts),
|
202
202
|
node.operator)
|
203
203
|
end
|
204
204
|
|
205
|
-
def val_to_sass_div(node)
|
205
|
+
def val_to_sass_div(node, opts)
|
206
206
|
unless node.is_a?(Sass::Script::Operation) && node.operator == :div &&
|
207
207
|
node.operand1.is_a?(Sass::Script::Number) &&
|
208
208
|
node.operand2.is_a?(Sass::Script::Number)
|
209
209
|
return node
|
210
210
|
end
|
211
211
|
|
212
|
-
Sass::Script::String.new("(#{node.to_sass})")
|
212
|
+
Sass::Script::String.new("(#{node.to_sass(opts)})")
|
213
213
|
end
|
214
|
+
|
214
215
|
end
|
215
216
|
end
|
216
217
|
end
|