summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEevee (Alex Munroe) <eevee.git@veekun.com>2013-10-08 11:45:04 -0700
committerEevee (Alex Munroe) <eevee.git@veekun.com>2013-10-08 11:45:04 -0700
commit5d7f56be690bcaf3b7b7dce6507aa06c067f31ec (patch)
treee44cb3c1eefef5ffd99b27f1a7df0f6d5d3d2093
parentae645836e69229051e69722201144ada385eca04 (diff)
downloadpyscss-5d7f56be690bcaf3b7b7dce6507aa06c067f31ec.tar.gz
Improve behavior of null values in lists.
-rw-r--r--scss/__init__.py9
-rw-r--r--scss/expression.py3
-rw-r--r--scss/tests/files/general/null-values.css5
-rw-r--r--scss/tests/files/general/null-values.scss11
-rw-r--r--scss/types.py16
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