summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEevee (Alex Munroe) <eevee.git@veekun.com>2013-08-13 15:47:28 -0700
committerEevee (Alex Munroe) <eevee.git@veekun.com>2013-08-13 17:11:01 -0700
commitfdf6d0f78bda6b723165b47989dd672fa4bc2a05 (patch)
tree483761b2f3bf2a2039798d4f1b4afc6c6d0c7c8d
parent3f621f32d2a25bbc51a12b59aa2261e068b3e8de (diff)
downloadpyscss-fdf6d0f78bda6b723165b47989dd672fa4bc2a05.tar.gz
Force variable assignment to always perform division.
-rw-r--r--scss/__init__.py16
-rw-r--r--scss/expression.py8
-rw-r--r--scss/tests/files/bugs/009-division-in-assignment.css3
-rw-r--r--scss/tests/files/bugs/009-division-in-assignment.scss5
4 files changed, 21 insertions, 11 deletions
diff --git a/scss/__init__.py b/scss/__init__.py
index a665d1c..3494bfd 100644
--- a/scss/__init__.py
+++ b/scss/__init__.py
@@ -1052,7 +1052,7 @@ class Scss(object):
"""
Implements properties and variables extraction and assignment
"""
- prop, value = (_prop_split_re.split(block.prop, 1) + [None])[:2]
+ prop, raw_value = (_prop_split_re.split(block.prop, 1) + [None])[:2]
try:
is_var = (block.prop[len(prop)] == '=')
except IndexError:
@@ -1065,17 +1065,15 @@ class Scss(object):
# Parse the value and determine whether it's a default assignment
is_default = False
- if value is not None:
- value = value.strip()
+ if raw_value is not None:
+ raw_value = raw_value.strip()
if prop.startswith('$'):
- value, subs = re.subn(r'(?i)\s+!default\Z', '', value)
+ raw_value, subs = re.subn(r'(?i)\s+!default\Z', '', raw_value)
if subs:
is_default = True
- value = calculator.calculate(value)
-
_prop = (scope or '') + prop
- if is_var or prop.startswith('$') and value is not None:
+ if is_var or prop.startswith('$') and raw_value is not None:
# Variable assignment
_prop = normalize_var(_prop)
try:
@@ -1090,10 +1088,14 @@ class Scss(object):
if is_defined and prop.startswith('$') and prop[1].isupper():
log.warn("Constant %r redefined", prop)
+ # Variable assignment is an expression, so it always performs
+ # real division
+ value = calculator.calculate(raw_value, divide=True)
rule.namespace.set_variable(_prop, value)
else:
# Regular property destined for output
_prop = calculator.apply_vars(_prop)
+ value = calculator.calculate(raw_value)
if value is None:
pass
elif isinstance(value, six.string_types):
diff --git a/scss/expression.py b/scss/expression.py
index 54f8c1a..cba149f 100644
--- a/scss/expression.py
+++ b/scss/expression.py
@@ -85,12 +85,12 @@ class Calculator(object):
cont = self.do_glob_math(cont)
return cont
- def calculate(self, _base_str):
+ def calculate(self, _base_str, divide=False):
better_expr_str = _base_str
better_expr_str = self.do_glob_math(better_expr_str)
- better_expr_str = self.evaluate_expression(better_expr_str)
+ better_expr_str = self.evaluate_expression(better_expr_str, divide=divide)
if better_expr_str is None:
better_expr_str = self.apply_vars(_base_str)
@@ -106,7 +106,7 @@ class Calculator(object):
value = _vi
return value
- def evaluate_expression(self, expr):
+ def evaluate_expression(self, expr, divide=False):
if not isinstance(expr, six.string_types):
raise TypeError("Expected string, got %r" % (expr,))
@@ -135,7 +135,7 @@ class Calculator(object):
else:
ast_cache[expr] = ast
- return ast.evaluate(self)
+ return ast.evaluate(self, divide=divide)
def parse_expression(self, expr, target='goal'):
if expr in ast_cache:
diff --git a/scss/tests/files/bugs/009-division-in-assignment.css b/scss/tests/files/bugs/009-division-in-assignment.css
new file mode 100644
index 0000000..312a8bc
--- /dev/null
+++ b/scss/tests/files/bugs/009-division-in-assignment.css
@@ -0,0 +1,3 @@
+p {
+ height: 6px;
+}
diff --git a/scss/tests/files/bugs/009-division-in-assignment.scss b/scss/tests/files/bugs/009-division-in-assignment.scss
new file mode 100644
index 0000000..df657f1
--- /dev/null
+++ b/scss/tests/files/bugs/009-division-in-assignment.scss
@@ -0,0 +1,5 @@
+$em-scale: 12em / 1px;
+
+p {
+ height: 0.5em * $em-scale;
+}