diff --git a/hyfetch/presets.py b/hyfetch/presets.py index 1bbdcf03..9006146d 100644 --- a/hyfetch/presets.py +++ b/hyfetch/presets.py @@ -16,3 +16,45 @@ class ColorProfile: :return: List of RGBs """ return [RGB.from_hex(c) for c in self.colors] + + def with_weights(self, weights: list[int]) -> list[RGB]: + """ + Map colors based on weights + + :param weights: Weights of each color (weights[i] = how many times color[i] appears) + :return: + """ + colors = self.decode() + return [c for i, w in enumerate(weights) for c in [colors[i]] * w] + + def with_length(self, length: int) -> list[RGB]: + """ + Spread to a specific length of text + + :param length: Length of text + :return: List of RGBs of the length + """ + preset_len = len(self.colors) + center_i = preset_len // 2 + + # How many copies of each color should be displayed at least? + repeats = length // preset_len + weights = [repeats] * preset_len + + # How many extra space left? + extras = length % preset_len + + # If there is an even space left, extend the center by one space + if extras % 2 == 1: + extras -= 1 + weights[center_i] += 1 + + # Add weight to border until there's no space left (extras must be even at this point) + border_i = 0 + while extras > 0: + extras -= 2 + weights[border_i] += 1 + weights[-border_i] += 1 + border_i += 1 + + return self.with_weights(weights)