Source code for gslides.colors

# -*- coding: utf-8 -*-
"""
Manages the color configuration
"""

import os
from typing import Dict, List, Optional, Tuple, TypeVar

import yaml

from .utils import hex_to_rgb, validate_hex_color_code

CURR_DIR = os.path.dirname(os.path.abspath(__file__))

with open(os.path.join(CURR_DIR, "config/color_mapping.yaml"), "r") as f:
    color_mapping: Dict[str, str] = yaml.safe_load(f)

with open(os.path.join(CURR_DIR, "config/base_palettes.yaml"), "r") as f:
    base_palettes: Dict[str, List[str]] = yaml.safe_load(f)

custom_palettes_path = os.path.join(
    os.path.expanduser("~"), ".gslides/custom_palettes.yaml"
)
if os.path.isfile(custom_palettes_path):
    with open(custom_palettes_path, "r") as f:
        base_palettes.update(yaml.safe_load(f))


[docs]def translate_color(color: str) -> str: """Translates a color from a named color to a hex code :param color: Named color :type color: str :return: Hex code corresponding to the color :rtype: str :raises ValueError: """ if color.lower() in color_mapping.keys(): return color_mapping[color.lower()] elif color[0] == "#": return color else: raise ValueError(f"{color} is not a valid hex or named color")
TPalette = TypeVar("TPalette", bound="Palette")
[docs]class Palette: """An iterator for a list of colors. :param palette: Name of a palette :type palette: str """ def __init__(self, palette: Optional[str] = None) -> None: """Constructor method""" if palette: if palette in base_palettes.keys(): self.colors = base_palettes[palette] else: raise ValueError( f'{palette} is not in available palettes: {", .".join(base_palettes.keys())}' ) else: self.colors = base_palettes["black"] self._clean_palette() self.index = 0
[docs] def load_palette(self, name: str) -> None: """Loads a given palette :param palette: Name of a palette :type palette: str """ self.colors = base_palettes[name] self._clean_palette() self.index = 0
def _clean_palette(self) -> None: """Cleans and transletes colors in the palette""" self.colors = [ validate_hex_color_code(translate_color(color)) for color in self.colors ] def __iter__(self: TPalette) -> TPalette: """Iterator function :return: :class:`Palette` :rtype: :class:`Palette` """ return self def __next__(self) -> Tuple[float, ...]: """Next function :return: A tuple for the r, g, b values of the next color in the iterator :rtype: tuple """ color = self.colors[self.index] if self.index + 1 >= len(self.colors): self.index = 0 else: self.index += 1 return hex_to_rgb(color)