0
@@ -379,13 +379,20 @@ END
0
def parse_mixin_definition(line)
0
name, args = line.text.scan(/^=\s*([^(]+)(\([^)]*\))?$/).first
0
raise SyntaxError.new("Invalid mixin \"#{line.text[1..-1]}\".", @line) if name.nil?
0
+ default_arg_found = false
0
+ required_arg_count = 0
0
args = (args || "()")[1...-1].split(",", -1).map {|a| a.strip}.map do |arg|
0
raise SyntaxError.new("Mixin arguments can't be empty.", @line) if arg.empty? || arg == "!"
0
unless arg[0] == Constant::CONSTANT_CHAR
0
raise SyntaxError.new("Mixin argument \"#{arg}\" must begin with an exclamation point (!).", @line)
0
+ arg, default = arg.split(/\s*=\s*/, 2)
0
+ required_arg_count += 1 unless default
0
+ default_arg_found ||= default
0
raise SyntaxError.new("Invalid constant \"#{arg}\".", @line) unless arg =~ Constant::VALIDATE
0
+ raise SyntaxError.new("Required arguments must not follow optional arguments \"#{arg}\".", @line) if default_arg_found && !default
0
+ default = Sass::Constant.resolve(default, @constants, @line) if default
0
+ { :name => arg[1..-1], :default_value => default }
0
mixin = @mixins[name] = Mixin.new(args, line.children)
0
@@ -399,14 +406,19 @@ END
0
args = (args || "()")[1...-1].split(",", -1).map {|a| a.strip}
0
args.each {|a| raise SyntaxError.new("Mixin arguments can't be empty.", @line) if a.empty?}
0
- raise SyntaxError.new(<<END.gsub("\n", "")) unless args.size == mixin.args.size
0
-Mixin #{name} takes #{mixin.args.size} argument#{'s' if mixin.args != 1},
0
-but #{args.size} #{args.size == 1 ? 'was' : 'were'} passed.
0
+ raise SyntaxError.new(<<END.gsub("\n", "")) if mixin.args.size < args.size
0
+Mixin #{name} takes #{mixin.args.size} argument#{'s' if mixin.args.size != 1}
0
+ but #{args.size} #{args.size == 1 ? 'was' : 'were'} passed.
0
old_constants = @constants.dup
0
- mixin.args.zip(args).inject(@constants) do |constants, (name, value)|
0
- constants[name] = Sass::Constant.resolve(value, old_constants, @line)
0
+ mixin.args.zip(args).inject(@constants) do |constants, (arg, value)|
0
+ constants[arg[:name]] = if value
0
+ Sass::Constant.resolve(value, old_constants, @line)
0
+ raise SyntaxError.new("Mixin #{name} is missing parameter ##{mixin.args.index(arg)+1} (#{arg[:name]}).") unless constants[arg[:name]]
Comments
No one has commented yet.