diff options
author | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2013-08-15 16:00:16 -0700 |
---|---|---|
committer | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2013-08-15 16:00:16 -0700 |
commit | c110c14affb066fb861ac688f287d0f3067dd11d (patch) | |
tree | 06451a8605382ae332b7f83346077b5f75a1576e | |
parent | 1b97eefb7895435203631c79ce9c32192927e7b7 (diff) | |
download | pyscss-c110c14affb066fb861ac688f287d0f3067dd11d.tar.gz |
Support destructuring @each.
-rw-r--r-- | scss/__init__.py | 22 | ||||
-rw-r--r-- | scss/expression.py | 8 | ||||
-rw-r--r-- | scss/tests/files/general/008-multiple-each.css | 9 | ||||
-rw-r--r-- | scss/tests/files/general/008-multiple-each.scss | 5 | ||||
-rw-r--r-- | scss/tests/files/general/009-destructuring-each.css | 10 | ||||
-rw-r--r-- | scss/tests/files/general/009-destructuring-each.scss | 10 | ||||
-rw-r--r-- | scss/types.py | 5 |
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) |