def __color_stops(percentages, *args): if len(args) == 1: if isinstance(args[0], (list, tuple, List)): list(args[0]) elif isinstance(args[0], (String, six.string_types)): color_stops = [] colors = split_params(getattr(args[0], 'value', args[0])) for color in colors: color = color.strip() if color.startswith('color-stop('): s, c = split_params(color[11:].rstrip(')')) s = s.strip() c = c.strip() else: c, s = color.split() color_stops.append((to_float(s), c)) return color_stops colors = [] stops = [] prev_color = False for c in args: for c in List.from_maybe(c): if isinstance(c, Color): if prev_color: stops.append(None) colors.append(c) prev_color = True elif isinstance(c, Number): stops.append(c) prev_color = False if prev_color: stops.append(None) stops = stops[:len(colors)] if stops[0] is None: stops[0] = Number(0, '%') if stops[-1] is None: stops[-1] = Number(100, '%') maxable_stops = [s for s in stops if s and not s.is_simple_unit('%')] if maxable_stops: max_stops = max(maxable_stops) else: max_stops = None stops = [_s / max_stops if _s and not _s.is_simple_unit('%') else _s for _s in stops] init = 0 start = None for i, s in enumerate(stops + [1.0]): if s is None: if start is None: start = i end = i else: final = s if start is not None: stride = (final - init) / Number(end - start + 1 + (1 if i < len(stops) else 0)) for j in range(start, end + 1): stops[j] = init + stride * Number(j - start + 1) init = final start = None if not max_stops or percentages: pass else: stops = [s if s.is_simple_unit('%') else s * max_stops for s in stops] return list(zip(stops, colors))
def __color_stops(percentages, *args): if len(args) == 1: if isinstance(args[0], (list, tuple, List)): return list(args[0]) elif isinstance(args[0], (String, six.string_types)): color_stops = [] colors = split_params(getattr(args[0], 'value', args[0])) for color in colors: color = color.strip() if color.startswith('color-stop('): s, c = split_params(color[11:].rstrip(')')) s = s.strip() c = c.strip() else: c, s = color.split() color_stops.append((to_float(s), c)) return color_stops colors = [] stops = [] prev_color = False for c in args: for c in List.from_maybe(c): if _is_color(c): if prev_color: stops.append(None) colors.append(c) prev_color = True elif isinstance(c, Number): stops.append(c) prev_color = False if prev_color: stops.append(None) stops = stops[:len(colors)] if stops[0] is None or stops[0] == Number(0): stops[0] = Number(0, '%') if stops[-1] is None: stops[-1] = Number(100, '%') maxable_stops = [s for s in stops if s and not s.is_simple_unit('%')] if maxable_stops: max_stops = max(maxable_stops) else: max_stops = None stops = [_s / max_stops if _s and not _s.is_simple_unit('%') else _s for _s in stops] init = 0 start = None for i, s in enumerate(stops + [1.0]): if s is None: if start is None: start = i end = i else: final = s if start is not None: stride = (final - init) / Number(end - start + 1 + (1 if i < len(stops) else 0)) for j in range(start, end + 1): stops[j] = init + stride * Number(j - start + 1) init = final start = None if not max_stops or percentages: pass else: stops = [s if s.is_simple_unit('%') else s * max_stops for s in stops] return List(List(pair) for pair in zip(stops, colors))
def __color_stops(percentages, *args): if len(args) == 1: if isinstance(args[0], (list, tuple, ListValue)): return ListValue(args[0]).values() elif isinstance(args[0], (StringValue, basestring)): color_stops = [] colors = split_params(args[0].value) for color in colors: color = color.strip() if color.startswith('color-stop('): s, c = split_params(color[11:].rstrip(')')) s = s.strip() c = c.strip() else: c, s = color.split() color_stops.append((to_float(s), c)) return color_stops colors = [] stops = [] prev_color = False for c in args: if isinstance(c, ListValue): for i, c in c.items(): if isinstance(c, ColorValue): if prev_color: stops.append(None) colors.append(c) prev_color = True elif isinstance(c, NumberValue): stops.append(c) prev_color = False else: if isinstance(c, ColorValue): if prev_color: stops.append(None) colors.append(c) prev_color = True elif isinstance(c, NumberValue): stops.append(NumberValue(c)) prev_color = False if prev_color: stops.append(None) stops = stops[:len(colors)] if percentages: max_stops = max(s and (s.value if s.unit != '%' else None) or None for s in stops) else: max_stops = max(s and (s if s.unit != '%' else None) or None for s in stops) stops = [s and (s.value / max_stops if s.unit != '%' else s.value) for s in stops] init = 0 start = None for i, s in enumerate(stops + [1.0]): if s is None: if start is None: start = i end = i else: final = s if start is not None: stride = (final - init) / (end - start + 1 + (1 if i < len(stops) else 0)) for j in range(start, end + 1): stops[j] = init + stride * (j - start + 1) init = final start = None if not max_stops or percentages: stops = [NumberValue(s, '%') for s in stops] else: stops = [s * max_stops for s in stops] return zip(stops, colors)