def __init__(self, tokens, type=None): self.tokens = tokens self.units = {} if tokens is None: self.value = 0.0 elif isinstance(tokens, NumberValue): self.value = tokens.value self.units = tokens.units.copy() if tokens.units: type = None elif isinstance(tokens, (StringValue, basestring)): tokens = getattr(tokens, "value", tokens) try: if tokens and tokens[-1] == "%": self.value = to_float(tokens[:-1]) / 100.0 self.units = {"%": _units_weights.get("%", 1), "_": "%"} else: self.value = to_float(tokens) except ValueError: raise ValueError("Value is not a Number! (%s)" % tokens) elif isinstance(tokens, (int, float)): # TODO i don't like this; should store the original and only divide # when converting. requires fixing __str__ though self.value = float(tokens) * _conv_factor.get(type, 1.0) else: raise ValueError("Can't convert to CSS number: %s" % repr(tokens)) if type is not None: self.units = {type: _units_weights.get(type, 1), "_": type}
def convert_to(self, type): val = self.value if not self.unit: val *= _conv_factor.get(type, 1.0) ret = NumberValue(val) if type == 'deg' and ret.value > 360: ret.value = ret.value % 360.0 ret.units = {type: _units_weights.get(type, 1), '_': type} return ret
def __str__(self): unit = self.unit val = self.value / _conv_factor.get(unit, 1.0) val = to_str(val) + unit return val