Conversion to number unsuccessful
trjordan opened this issue · 1 comments
trjordan commented
I'm a bit new at Sass, so I'm not sure exactly what all this is called, but I believe this is a discrepancy between normal Sass and pyScss:
Input:
$spacing-unit: 30px;
.footer { width: -webkit-calc(100% - (#{$spacing-unit} / 2)); }
CSS output from
.footer {
width: -webkit-calc(100% - (30px / 2));
}
Error produced by scss:
In [6]: c.compile_string("""
...: $spacing-unit: 30px;
...: .footer { width: -webkit-calc(100% - (#{$spacing-unit} / 2)); }
...: """)
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line string', (1, 0))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
//site-packages/scss/calculator.py in evaluate_expression(self, expr,
divide)
140 try:
--> 141 return ast.evaluate(self, divide=divide)
142 except Exception as e:
//site-packages/scss/ast.py in evaluate(self, calculator, divide)
200 # work?
--> 201 args, kwargs = argspec_node.evaluate_call_args(calculator)
202 argspec_len = len(args) + len(kwargs)
//site-packages/scss/ast.py in evaluate_call_args(self, calculator)
476 for var_node, value_node in self.argpairs:
--> 477 value = value_node.evaluate(calculator, divide=True)
478 if var_node is None:
//site-packages/scss/ast.py in evaluate(self, calculator, divide)
138
--> 139 return self.op(left, right)
140
TypeError: unsupported operand type(s) for -: 'Number' and 'String'
During handling of the above exception, another exception occurred:
SassEvaluationError Traceback (most recent call last)
<ipython-input-6-b871d0db8b89> in <module>()
2 $spacing-unit: 30px;
3 .footer { width: -webkit-calc(100% - (#{$spacing-unit} / 2)); }
----> 4 """)
//site-packages/scss/compiler.py in compile_string(self, string)
208 compilation = self.make_compilation()
209 compilation.add_source(source)
--> 210 return self.call_and_catch_errors(compilation.run)
211
212
//site-packages/scss/compiler.py in call_and_catch_errors(self, f, *a
rgs, **kwargs)
174 """
175 try:
--> 176 return f(*args, **kwargs)
177 except SassError as e:
178 if self.live_errors:
//site-packages/scss/compiler.py in run(self)
276 def run(self):
277 # this will compile and manage rule: child objects inside of a node
--> 278 self.parse_children()
279
280 # this will manage @extends
//site-packages/scss/compiler.py in parse_children(self, scope)
350
351 for rule in children:
--> 352 self.manage_children(rule, scope)
353
354 self._warn_unused_imports(self.rules[0])
//site-packages/scss/compiler.py in manage_children(self, rule, scope
)
372 def manage_children(self, rule, scope):
373 try:
--> 374 self._manage_children_impl(rule, scope)
375 except SassBaseError as e:
376 e.add_rule(rule)
//site-packages/scss/compiler.py in _manage_children_impl(self, rule,
scope)
421 # Nested rules
422 elif scope is None: # needs to have no scope to crawl down the nested rules
--> 423 self._nest_rules(rule, scope, block)
424
425 def _at_warn(self, calculator, rule, scope, block):
//site-packages/scss/compiler.py in _nest_rules(self, rule, scope, bl
ock)
1225 self.rules.append(new_rule)
1226 rule.namespace.use_import(rule.source_file)
-> 1227 self.manage_children(new_rule, scope)
1228
1229 self._warn_unused_imports(new_rule)
//site-packages/scss/compiler.py in manage_children(self, rule, scope
)
372 def manage_children(self, rule, scope):
373 try:
--> 374 self._manage_children_impl(rule, scope)
375 except SassBaseError as e:
376 e.add_rule(rule)
//site-packages/scss/compiler.py in _manage_children_impl(self, rule,
scope)
406 # Properties
407 elif block.unparsed_contents is None:
--> 408 self._get_properties(rule, scope, block)
409
410 # Nested properties
//site-packages/scss/compiler.py in _get_properties(self, rule, scope
, block)
1114 value = None
1115 else:
-> 1116 value = calculator.calculate(raw_value)
1117
1118 if value is None:
//site-packages/scss/calculator.py in calculate(self, expression, div
ide)
114
115 def calculate(self, expression, divide=False):
--> 116 result = self.evaluate_expression(expression, divide=divide)
117
118 if result is None:
//site-packages/scss/calculator.py in evaluate_expression(self, expr,
divide)
141 return ast.evaluate(self, divide=divide)
142 except Exception as e:
--> 143 six.reraise(SassEvaluationError, SassEvaluationError(e, expression=expr), sys.exc_info()[2])
144
145 def parse_expression(self, expr, target='goal'):
//site-packages/six.py in reraise(tp, value, tb)
656 value = tp()
657 if value.__traceback__ is not tb:
--> 658 raise value.with_traceback(tb)
659 raise value
660
//site-packages/scss/calculator.py in evaluate_expression(self, expr,
divide)
139
140 try:
--> 141 return ast.evaluate(self, divide=divide)
142 except Exception as e:
143 six.reraise(SassEvaluationError, SassEvaluationError(e, expression=expr), sys.exc_info()[2])
//site-packages/scss/ast.py in evaluate(self, calculator, divide)
199 # TODO unclear whether this is correct -- how does arg, kwarg, arg
200 # work?
--> 201 args, kwargs = argspec_node.evaluate_call_args(calculator)
202 argspec_len = len(args) + len(kwargs)
203
//site-packages/scss/ast.py in evaluate_call_args(self, calculator)
475 kwargs = OrderedDict() # Sass kwargs preserve order
476 for var_node, value_node in self.argpairs:
--> 477 value = value_node.evaluate(calculator, divide=True)
478 if var_node is None:
479 # Positional
//site-packages/scss/ast.py in evaluate(self, calculator, divide)
137 return String.unquoted(left.render() + op + right.render())
138
--> 139 return self.op(left, right)
140
141
SassEvaluationError: Error evaluating expression:
-webkit-calc(100% - (#{$spacing-unit} / 2))
on line 3 of 'string:1c352021e6b47bfa:\n$spacing-unit: 30px;\n.footer { width: -webkit-calc(100% - (#{$spacing-u
nit} / 2)); }\n'
Traceback:
File "//site-packages/scss/calculator.py", line 141, in evaluate_ex
pression
return ast.evaluate(self, divide=divide)
File "//site-packages/scss/ast.py", line 201, in evaluate
args, kwargs = argspec_node.evaluate_call_args(calculator)
File "//site-packages/scss/ast.py", line 477, in evaluate_call_args
value = value_node.evaluate(calculator, divide=True)
File "//site-packages/scss/ast.py", line 139, in evaluate
return self.op(left, right)
TypeError: unsupported operand type(s) for -: 'Number' and 'String'
eevee commented
calc
was recognized as a CSS function taking an expression, but -webkit-calc
and -moz-calc
weren't. Fixed in 1.3.5. (If you're even still using the prefixed versions by now, ha.)