diff options
Diffstat (limited to 'scss/expression.py')
-rw-r--r-- | scss/expression.py | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/scss/expression.py b/scss/expression.py index 8305bdc..0da97a4 100644 --- a/scss/expression.py +++ b/scss/expression.py @@ -11,7 +11,7 @@ import scss.config as config from scss.cssdefs import COLOR_NAMES, is_builtin_css_function, _expr_glob_re, _interpolate_re, _variable_re from scss.rule import Namespace from scss.types import BooleanValue, ColorValue, ListValue, Null, NumberValue, ParserValue, String, Undefined -from scss.util import dequote, normalize_var, to_str +from scss.util import dequote, normalize_var ################################################################################ # Load C acceleration modules @@ -97,7 +97,6 @@ class Calculator(object): return better_expr_str - # TODO only used by magic-import...? def interpolate(self, var): value = self.namespace.variable(var) @@ -107,7 +106,6 @@ class Calculator(object): value = _vi return value - def evaluate_expression(self, expr): if not isinstance(expr, six.string_types): raise TypeError("Expected string, got %r" % (expr,)) @@ -153,8 +151,6 @@ class Calculator(object): return ast - - # ------------------------------------------------------------------------------ # Expression classes -- the AST resulting from a parse @@ -171,6 +167,7 @@ class Expression(object): """ raise NotImplementedError + class Parentheses(object): """An expression of the form `(foo)`. @@ -183,6 +180,7 @@ class Parentheses(object): def evaluate(self, calculator, divide=False): return self.contents.evaluate(calculator, divide=True) + class UnaryOp(Expression): def __init__(self, op, operand): self.op = op @@ -191,6 +189,7 @@ class UnaryOp(Expression): def evaluate(self, calculator, divide=False): return self.op(self.operand.evaluate(calculator, divide=True)) + class BinaryOp(Expression): def __init__(self, op, left, right): self.op = op @@ -208,15 +207,16 @@ class BinaryOp(Expression): # covered by the `divide` argument: other nodes that perform arithmetic # will pass in True, indicating that this should always be a division. if ( - self.op is operator.truediv - and not divide - and isinstance(self.left, Literal) - and isinstance(self.right, Literal) - ): + self.op is operator.truediv + and not divide + and isinstance(self.left, Literal) + and isinstance(self.right, Literal) + ): return String(left.render() + ' / ' + right.render(), quotes=None) return self.op(left, right) + class AnyOp(Expression): def __init__(self, *operands): self.operands = operands @@ -225,6 +225,7 @@ class AnyOp(Expression): operands = [operand.evaluate(calculator, divide=True) for operand in self.operands] return BooleanValue(any(operands)) + class AllOp(Expression): def __init__(self, *operands): self.operands = operands @@ -233,6 +234,7 @@ class AllOp(Expression): operands = [operand.evaluate(calculator, divide=True) for operand in self.operands] return BooleanValue(all(operands)) + class NotOp(Expression): def __init__(self, operand): self.operand = operand @@ -241,6 +243,7 @@ class NotOp(Expression): operand = self.operand.evaluate(calculator, divide=True) return BooleanValue(not(operand)) + class CallOp(Expression): def __init__(self, func_name, argspec): self.func_name = func_name @@ -263,7 +266,7 @@ class CallOp(Expression): if var is None: args.append(value) else: - kwargs[ var.lstrip('$').replace('-', '_') ] = value + kwargs[var.lstrip('$').replace('-', '_')] = value num_args = len(self.argspec.argpairs) @@ -293,6 +296,7 @@ class CallOp(Expression): else: return func(*args, **kwargs) + class Literal(Expression): def __init__(self, value): self.value = value @@ -300,6 +304,7 @@ class Literal(Expression): def evaluate(self, calculator, divide=False): return self.value + class Variable(Expression): def __init__(self, name): self.name = name @@ -320,6 +325,7 @@ class Variable(Expression): return evald return value + class ListLiteral(Expression): def __init__(self, items, comma=True): self.items = items @@ -329,6 +335,7 @@ class ListLiteral(Expression): items = [item.evaluate(calculator, divide=divide) for item in self.items] return ListValue(items, separator="," if self.comma else "") + class ArgspecLiteral(Expression): """Contains pairs of argument names and values, as parsed from a function definition or function call. @@ -377,8 +384,6 @@ def parse_bareword(word): return String(word, quotes=None) - - class Parser(object): def __init__(self, scanner): self._scanner = scanner @@ -665,7 +670,6 @@ class SassExpression(Parser): expr_slst_rsts = set(['LPAR', 'END', 'COLOR', 'QSTR', 'RPAR', 'VAR', 'ADD', 'NUM', 'COMMA', 'FNCT', 'STR', 'NOT', 'SIGN', 'ID']) - ### Grammar ends. ################################################################################ |