summaryrefslogtreecommitdiff
path: root/scss/expression.py
diff options
context:
space:
mode:
Diffstat (limited to 'scss/expression.py')
-rw-r--r--scss/expression.py32
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.
################################################################################