From fdf6d0f78bda6b723165b47989dd672fa4bc2a05 Mon Sep 17 00:00:00 2001 From: "Eevee (Alex Munroe)" Date: Tue, 13 Aug 2013 15:47:28 -0700 Subject: Force variable assignment to always perform division. --- scss/__init__.py | 16 +++++++++------- scss/expression.py | 8 ++++---- scss/tests/files/bugs/009-division-in-assignment.css | 3 +++ scss/tests/files/bugs/009-division-in-assignment.scss | 5 +++++ 4 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 scss/tests/files/bugs/009-division-in-assignment.css create mode 100644 scss/tests/files/bugs/009-division-in-assignment.scss 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; +} -- cgit v1.2.1