public
Description: HTML Abstraction Markup Language - A Markup Haiku
Homepage: http://haml.hamptoncatlin.com
Clone URL: git://github.com/nex3/haml.git
Allow mixins to declare default values for mixin arguments.

This is done by assigning the mixin argument in the declaration like so:
=mixin(!color = #ccc, !size = 5px)
  :border= !size solid !color
chriseppstein (author)
Sun Aug 10 13:14:10 -0700 2008
commit  7c881452f3f303224dd8dfaa185eb0078b28def2
tree    ba4b10790d2855f6bb8d21ccee35c681ee68c9c9
parent  b8388bad0032da23451d50208da9a33ba29211c4
...
379
380
381
 
 
382
383
384
385
386
 
 
 
387
388
 
 
 
389
390
391
...
399
400
401
402
403
404
 
 
 
405
406
407
408
409
 
 
 
 
 
 
 
410
411
412
...
379
380
381
382
383
384
385
386
387
388
389
390
391
392
 
393
394
395
396
397
398
...
406
407
408
 
 
 
409
410
411
412
413
414
 
 
415
416
417
418
419
420
421
422
423
424
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
         end
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
- arg[1..-1]
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
       end
0
       mixin = @mixins[name] = Mixin.new(args, line.children)
0
       :mixin
0
@@ -399,14 +406,19 @@ END
0
 
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
 END
0
 
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
+ else
0
+ arg[:default_value]
0
+ end
0
+ raise SyntaxError.new("Mixin #{name} is missing parameter ##{mixin.args.index(arg)+1} (#{arg[:name]}).") unless constants[arg[:name]]
0
         constants
0
       end
0
 
...
68
69
70
 
 
 
71
72
73
...
361
362
363
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
364
365
366
...
68
69
70
71
72
73
74
75
76
...
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
0
@@ -68,6 +68,9 @@ class SassEngineTest < Test::Unit::TestCase
0
     "a-\#{!b\n c: d" => ["Unbalanced brackets.", 1],
0
     "!a = 1 & 2" => "SassScript doesn't support a single-& operator.",
0
     "!a = 1 | 2" => "SassScript doesn't support a single-| operator.",
0
+ "=a(!b = 1, !c)" => "Required arguments must not follow optional arguments \"!c\".",
0
+ "=a(!b = 1)\n :a= !b\ndiv\n +a(1,2)" => "Mixin a takes 1 argument but 2 were passed.",
0
+ "=a(!b)\n :a= !b\ndiv\n +a" => "Mixin a is missing parameter #1 (b).",
0
 
0
     # Regression tests
0
     "a\n b:\n c\n d" => ["Illegal nesting: Only attributes may be nested beneath attributes.", 3],
0
@@ -361,6 +364,45 @@ blat
0
 SASS
0
   end
0
 
0
+ def test_default_values_for_mixin_arguments
0
+ assert_equal("white {\n color: #ffffff; }\n\nblack {\n color: #000000; }\n", render(<<SASS))
0
+=foo(!a = #FFF)
0
+ :color= !a
0
+white
0
+ +foo
0
+black
0
+ +foo(#000)
0
+SASS
0
+ assert_equal(<<CSS, render(<<SASS))
0
+one {
0
+ color: #ffffff;
0
+ padding: 1px;
0
+ margin: 8px; }
0
+
0
+two {
0
+ color: #ffffff;
0
+ padding: 2px;
0
+ margin: 8px; }
0
+
0
+three {
0
+ color: #ffffff;
0
+ padding: 2px;
0
+ margin: 3px; }
0
+CSS
0
+!a = 5px
0
+=foo(!a, !b = 1px, !c = 3px + !a)
0
+ :color= !a
0
+ :padding= !b
0
+ :margin= !c
0
+one
0
+ +foo(#fff)
0
+two
0
+ +foo(#fff, 2px)
0
+three
0
+ +foo(#fff, 2px, 3px)
0
+SASS
0
+ end
0
+
0
   def test_interpolation
0
     assert_equal("a-1 {\n b-2: c-3; }\n", render(<<SASS))
0
 !a = 1

Comments

    No one has commented yet.