summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEevee (Alex Munroe) <eevee.git@veekun.com>2013-08-19 17:25:46 -0700
committerEevee (Alex Munroe) <eevee.git@veekun.com>2013-08-19 17:25:46 -0700
commitd1cb4b5bbf3e9629052a433dc210514c3dcf3cb1 (patch)
treedc907eac9e56fe78fbbd461abbdc9e82cd7c1433
parent03628c2b0b7841506fb0e0d8e5b5c60f2069e143 (diff)
downloadpyscss-d1cb4b5bbf3e9629052a433dc210514c3dcf3cb1.tar.gz
Fix bug in error printing. Make evaluate_expression use parse_expression.
-rw-r--r--scss/errors.py4
-rw-r--r--scss/expression.py40
2 files changed, 17 insertions, 27 deletions
diff --git a/scss/errors.py b/scss/errors.py
index e06bc87..c898500 100644
--- a/scss/errors.py
+++ b/scss/errors.py
@@ -48,8 +48,8 @@ class SassError(Exception):
def format_prefix(self):
# TODO this contains NULs and line numbers; could be much prettier
- if self.rule:
- return "Error parsing block:\n" + " " + self.rule.unparsed_contents
+ if self.rule_stack:
+ return "Error parsing block:\n" + " " + self.rule_stack[0].unparsed_contents
else:
return "Unknown error"
diff --git a/scss/expression.py b/scss/expression.py
index 73096b6..686781f 100644
--- a/scss/expression.py
+++ b/scss/expression.py
@@ -9,7 +9,7 @@ import six
import scss.config as config
from scss.cssdefs import COLOR_NAMES, is_builtin_css_function, _expr_glob_re, _interpolate_re, _variable_re
-from scss.errors import SassEvaluationError, SassParseError
+from scss.errors import SassError, SassEvaluationError, SassParseError
from scss.rule import Namespace
from scss.types import Boolean, Color, List, Map, Null, Number, ParserValue, String, Undefined
from scss.util import dequote, normalize_var
@@ -123,28 +123,13 @@ class Calculator(object):
return self.ast_cache[target]
def evaluate_expression(self, expr, divide=False):
- if not isinstance(expr, six.string_types):
- raise TypeError("Expected string, got %r" % (expr,))
-
- ast_cache = self.get_ast_cache('goal')
- if expr in ast_cache:
- ast = ast_cache[expr]
-
- elif _variable_re.match(expr):
- # Short-circuit for variable names
- ast = Variable(expr)
-
- else:
- try:
- parser = SassExpression(SassExpressionScanner(expr))
- ast = parser.goal()
- except SyntaxError, e:
- if config.DEBUG:
- raise SassParseError(e, expression=expr, expression_pos=parser._char_pos)
- else:
- return None
+ try:
+ ast = self.parse_expression(expr)
+ except SassError:
+ if config.DEBUG:
+ raise
else:
- ast_cache[expr] = ast
+ return None
try:
return ast.evaluate(self, divide=divide)
@@ -152,15 +137,20 @@ class Calculator(object):
raise SassEvaluationError(e, expression=expr)
def parse_expression(self, expr, target='goal'):
+ if not isinstance(expr, six.string_types):
+ raise TypeError("Expected string, got %r" % (expr,))
+
ast_cache = self.get_ast_cache(target)
if expr in ast_cache:
return ast_cache[expr]
- parser = SassExpression(SassExpressionScanner(expr))
- ast = getattr(parser, target)()
+ try:
+ parser = SassExpression(SassExpressionScanner(expr))
+ ast = getattr(parser, target)()
+ except SyntaxError, e:
+ raise SassParseError(e, expression=expr, expression_pos=parser._char_pos)
ast_cache[expr] = ast
-
return ast