diff options
author | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2013-10-08 11:45:04 -0700 |
---|---|---|
committer | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2013-10-08 11:45:04 -0700 |
commit | 5d7f56be690bcaf3b7b7dce6507aa06c067f31ec (patch) | |
tree | e44cb3c1eefef5ffd99b27f1a7df0f6d5d3d2093 | |
parent | ae645836e69229051e69722201144ada385eca04 (diff) | |
download | pyscss-5d7f56be690bcaf3b7b7dce6507aa06c067f31ec.tar.gz |
Improve behavior of null values in lists.
-rw-r--r-- | scss/__init__.py | 9 | ||||
-rw-r--r-- | scss/expression.py | 3 | ||||
-rw-r--r-- | scss/tests/files/general/null-values.css | 5 | ||||
-rw-r--r-- | scss/tests/files/general/null-values.scss | 11 | ||||
-rw-r--r-- | scss/types.py | 16 |
5 files changed, 39 insertions, 5 deletions
diff --git a/scss/__init__.py b/scss/__init__.py index 3eeaaed..7d8c3b0 100644 --- a/scss/__init__.py +++ b/scss/__init__.py @@ -1568,12 +1568,17 @@ class Scss(object): result = '' last_prop_index = len(properties) - 1 for i, (name, value) in enumerate(properties): - if value is not None: + if value is None: + prop = name + elif value: if nl: value = (nl + tb + tb).join(self._textwrap(value)) prop = name + ':' + sp + value else: - prop = name + # Empty string means there's supposed to be a value but it + # evaluated to nothing; skip this + # TODO interacts poorly with last_prop_index + continue if i == last_prop_index: if sc: diff --git a/scss/expression.py b/scss/expression.py index 1c38100..8b42e7d 100644 --- a/scss/expression.py +++ b/scss/expression.py @@ -378,7 +378,8 @@ class ListLiteral(Expression): def evaluate(self, calculator, divide=False): items = [item.evaluate(calculator, divide=divide) for item in self.items] - return List(items, separator="," if self.comma else "") + # TODO sort of overloading "divide" here... rename i think + return List(items, use_comma=self.comma, is_literal=not divide) class MapLiteral(Expression): diff --git a/scss/tests/files/general/null-values.css b/scss/tests/files/general/null-values.css new file mode 100644 index 0000000..16deaae --- /dev/null +++ b/scss/tests/files/general/null-values.css @@ -0,0 +1,5 @@ +div { + a: 1, 2, 3; + b: 1, null, 2, null, 3; + c: 1 2; +} diff --git a/scss/tests/files/general/null-values.scss b/scss/tests/files/general/null-values.scss new file mode 100644 index 0000000..d657ab2 --- /dev/null +++ b/scss/tests/files/general/null-values.scss @@ -0,0 +1,11 @@ +div { + // nulls should be omitted from evaluated lists + a: (1, null, 2, null, 3); + // but not from literal untouched lists + b: 1, null, 2, null, 3; + + // entirely null lists become nothing + c: 1 (null, null) 2; + // empty properties aren't printed + d: (null, null); +} diff --git a/scss/types.py b/scss/types.py index d0079d3..4a027d7 100644 --- a/scss/types.py +++ b/scss/types.py @@ -549,7 +549,7 @@ class List(Value): sass_type_name = u'list' - def __init__(self, iterable, separator=None, use_comma=None): + def __init__(self, iterable, separator=None, use_comma=None, is_literal=False): if isinstance(iterable, List): iterable = iterable.value @@ -568,6 +568,8 @@ class List(Value): else: self.use_comma = use_comma + self.is_literal = is_literal + @classmethod def maybe_new(cls, values, use_comma=True): """If `values` contains only one item, return that item. Otherwise, @@ -662,9 +664,19 @@ class List(Value): delim = self.delimiter(compress) + if self.is_literal: + value = self.value + else: + # Non-literal lists have nulls stripped + value = [item for item in self.value if not item.is_null] + # Non-empty lists containing only nulls become nothing, just like + # single nulls + if not value: + return '' + return delim.join( item.render(compress=compress) - for item in self.value + for item in value ) # DEVIATION: binary ops on lists and scalars act element-wise |