summaryrefslogtreecommitdiff
path: root/scss/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'scss/__init__.py')
-rw-r--r--scss/__init__.py28
1 files changed, 16 insertions, 12 deletions
diff --git a/scss/__init__.py b/scss/__init__.py
index d8d18af..2100466 100644
--- a/scss/__init__.py
+++ b/scss/__init__.py
@@ -606,20 +606,24 @@ class Scss(object):
if not block.argument:
raise SyntaxError("%s requires a function name (%s)" % (block.directive, rule.file_and_line))
- funct, params, _ = block.argument.partition('(')
- funct = normalize_var(funct.strip())
- params = split_params(depar(params + _))
+ funct, lpar, argstr = block.argument.strip().partition('(')
defaults = {}
new_params = []
- for param in params:
- param, _, default = param.partition(':')
- param = normalize_var(param.strip())
- default = default.strip()
- if param:
- new_params.append(param)
- if default:
- calculator = Calculator(rule.namespace)
- defaults[param] = calculator.parse_expression(default)
+
+ if lpar:
+ # Has arguments; parse them with the argspec rule
+ if not argstr.endswith(')'):
+ raise SyntaxError("Expected ')', found end of line: %r" % (block.argument,))
+ argstr = argstr[:-1]
+
+ calculator = Calculator(rule.namespace)
+ argspec_node = calculator.parse_expression(argstr, target='argspec')
+
+ for var_name, default in argspec_node.iter_def_argspec():
+ new_params.append(var_name)
+ if default is not None:
+ defaults[var_name] = default
+
mixin = [list(new_params), defaults, block.unparsed_contents]
if block.directive == '@function':
def _call(mixin):