summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEevee (Alex Munroe) <eevee.git@veekun.com>2013-08-15 16:00:16 -0700
committerEevee (Alex Munroe) <eevee.git@veekun.com>2013-08-15 16:00:16 -0700
commitc110c14affb066fb861ac688f287d0f3067dd11d (patch)
tree06451a8605382ae332b7f83346077b5f75a1576e
parent1b97eefb7895435203631c79ce9c32192927e7b7 (diff)
downloadpyscss-c110c14affb066fb861ac688f287d0f3067dd11d.tar.gz
Support destructuring @each.
-rw-r--r--scss/__init__.py22
-rw-r--r--scss/expression.py8
-rw-r--r--scss/tests/files/general/008-multiple-each.css9
-rw-r--r--scss/tests/files/general/008-multiple-each.scss5
-rw-r--r--scss/tests/files/general/009-destructuring-each.css10
-rw-r--r--scss/tests/files/general/009-destructuring-each.scss10
-rw-r--r--scss/types.py5
7 files changed, 58 insertions, 11 deletions
diff --git a/scss/__init__.py b/scss/__init__.py
index 3494bfd..3d8c1d9 100644
--- a/scss/__init__.py
+++ b/scss/__init__.py
@@ -999,21 +999,31 @@ class Scss(object):
"""
Implements @each
"""
- var, _, valuestring = block.argument.partition(' in ')
+ varstring, _, valuestring = block.argument.partition(' in ')
calculator = Calculator(rule.namespace)
values = calculator.calculate(valuestring)
if not values:
return
- var = var.strip()
- var = calculator.do_glob_math(var)
- var = normalize_var(var)
+ varlist = varstring.split(",")
+ varlist = [
+ normalize_var(calculator.do_glob_math(var.strip()))
+ for var in varlist
+ ]
for v in List.from_maybe(values):
inner_rule = rule.copy()
- inner_rule.namespace = inner_rule.namespace.derive()
inner_rule.unparsed_contents = block.unparsed_contents
- inner_rule.namespace.set_variable(var, v)
+ inner_rule.namespace = inner_rule.namespace.derive()
+
+ v = List.from_maybe(v)
+ for i, var in enumerate(varlist):
+ if i >= len(v):
+ value = Null()
+ else:
+ value = v[i]
+ inner_rule.namespace.set_variable(var, value)
+
self.manage_children(inner_rule, p_children, scope)
# @print_timing(10)
diff --git a/scss/expression.py b/scss/expression.py
index e970ccf..065d2b3 100644
--- a/scss/expression.py
+++ b/scss/expression.py
@@ -42,11 +42,11 @@ class Calculator(object):
better_expr_str = self.evaluate_expression(_base_str)
if better_expr_str is None:
- better_expr_str = self.apply_vars(_base_str)
+ return self.apply_vars(_base_str)
+ elif better_expr_str.is_null:
+ return ""
else:
- better_expr_str = dequote(better_expr_str.render())
-
- return better_expr_str
+ return dequote(better_expr_str.render())
def do_glob_math(self, cont):
"""Performs #{}-interpolation. The result is always treated as a fixed
diff --git a/scss/tests/files/general/008-multiple-each.css b/scss/tests/files/general/008-multiple-each.css
new file mode 100644
index 0000000..0cb9981
--- /dev/null
+++ b/scss/tests/files/general/008-multiple-each.css
@@ -0,0 +1,9 @@
+h1 {
+ font-size: 2em;
+}
+h2 {
+ font-size: 1.5em;
+}
+h3 {
+ font-size: 1.2em;
+}
diff --git a/scss/tests/files/general/008-multiple-each.scss b/scss/tests/files/general/008-multiple-each.scss
new file mode 100644
index 0000000..979efcb
--- /dev/null
+++ b/scss/tests/files/general/008-multiple-each.scss
@@ -0,0 +1,5 @@
+ @each $header, $size in (h1: 2em, h2: 1.5em, h3: 1.2em) {
+ #{$header} {
+ font-size: $size;
+ }
+}
diff --git a/scss/tests/files/general/009-destructuring-each.css b/scss/tests/files/general/009-destructuring-each.css
new file mode 100644
index 0000000..fcecab7
--- /dev/null
+++ b/scss/tests/files/general/009-destructuring-each.css
@@ -0,0 +1,10 @@
+a {
+ foo: 1px;
+ bar: 2px;
+ baz: 3px;
+}
+c {
+ foo: "Value is bar";
+ bar: "Value is baz";
+ bang: "Value is ";
+}
diff --git a/scss/tests/files/general/009-destructuring-each.scss b/scss/tests/files/general/009-destructuring-each.scss
new file mode 100644
index 0000000..cb22618
--- /dev/null
+++ b/scss/tests/files/general/009-destructuring-each.scss
@@ -0,0 +1,10 @@
+a {
+ @each $name, $number in (foo: 1px, bar: 2px, baz: 3px) {
+ #{$name}: $number;
+ }
+}
+c {
+ @each $key, $value in (foo bar) (bar, baz) bang {
+ #{$key}: "Value is #{$value}";
+ }
+}
diff --git a/scss/types.py b/scss/types.py
index afe65f4..504b3e1 100644
--- a/scss/types.py
+++ b/scss/types.py
@@ -425,7 +425,10 @@ class List(Value):
"""If `values` appears to not be a list, return a list containing it.
Otherwise, return a List as normal.
"""
- if not isinstance(values, (list, tuple, List)):
+ if isinstance(values, (List, Map)):
+ return values
+
+ if not isinstance(values, (list, tuple)):
values = [values]
return cls(values, use_comma=use_comma)