PHP 8.5.2
Preview: palette.py Size: 3.21 KB
//lib/python3/dist-packages/rich/palette.py

from math import sqrt
from functools import lru_cache
from typing import Sequence, Tuple, TYPE_CHECKING

from .color_triplet import ColorTriplet

if TYPE_CHECKING:
    from rich.table import Table


class Palette:
    """A palette of available colors."""

    def __init__(self, colors: Sequence[Tuple[int, int, int]]):
        self._colors = colors

    def __getitem__(self, number: int) -> ColorTriplet:
        return ColorTriplet(*self._colors[number])

    def __rich__(self) -> "Table":
        from rich.color import Color
        from rich.style import Style
        from rich.text import Text
        from rich.table import Table

        table = Table(
            "index",
            "RGB",
            "Color",
            title="Palette",
            caption=f"{len(self._colors)} colors",
            highlight=True,
            caption_justify="right",
        )
        for index, color in enumerate(self._colors):
            table.add_row(
                str(index),
                repr(color),
                Text(" " * 16, style=Style(bgcolor=Color.from_rgb(*color))),
            )
        return table

    # This is somewhat inefficient and needs caching
    @lru_cache(maxsize=1024)
    def match(self, color: Tuple[int, int, int]) -> int:
        """Find a color from a palette that most closely matches a given color.

        Args:
            color (Tuple[int, int, int]): RGB components in range 0 > 255.

        Returns:
            int: Index of closes matching color.
        """
        red1, green1, blue1 = color
        _sqrt = sqrt
        get_color = self._colors.__getitem__

        def get_color_distance(index: int) -> float:
            """Get the distance to a color."""
            red2, green2, blue2 = get_color(index)
            red_mean = (red1 + red2) // 2
            red = red1 - red2
            green = green1 - green2
            blue = blue1 - blue2
            return _sqrt(
                (((512 + red_mean) * red * red) >> 8)
                + 4 * green * green
                + (((767 - red_mean) * blue * blue) >> 8)
            )

        min_index = min(range(len(self._colors)), key=get_color_distance)
        return min_index


if __name__ == "__main__":  # pragma: no cover
    import colorsys
    from typing import Iterable
    from rich.color import Color
    from rich.console import Console, ConsoleOptions
    from rich.segment import Segment
    from rich.style import Style

    class ColorBox:
        def __rich_console__(
            self, console: Console, options: ConsoleOptions
        ) -> Iterable[Segment]:
            height = console.size.height - 3
            for y in range(0, height):
                for x in range(options.max_width):
                    h = x / options.max_width
                    l = y / (height + 1)
                    r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0)
                    r2, g2, b2 = colorsys.hls_to_rgb(h, l + (1 / height / 2), 1.0)
                    bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255)
                    color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255)
                    yield Segment("▄", Style(color=color, bgcolor=bgcolor))
                yield Segment.line()

    console = Console()
    console.print(ColorBox())

Directory Contents

Dirs: 1 × Files: 79

Name Size Perms Modified Actions
- drwxr-xr-x 2026-01-08 12:54:44
Edit Download
878 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
10.08 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
6.74 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
3.19 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
10.53 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
4.67 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
17.80 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.03 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
6.96 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
96.78 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.26 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
5.37 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
6.45 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
7.86 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
924 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
2.41 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
642 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
2.45 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.64 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
9.36 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
4.90 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
3.15 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
13.62 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
13.94 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
3.57 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
11.61 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
25.55 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
8.23 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
5.18 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
4.84 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
828 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
3.21 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
10.45 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
34.97 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
58.30 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
7.97 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
11.03 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.33 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
0 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
166 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
4.32 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
4.48 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
2.76 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.54 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
23.64 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
4.24 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
4.32 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
26.44 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.21 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
34.54 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
38.71 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
3.29 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
46.19 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
3.69 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
102 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
28.84 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
8.89 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
9.97 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
136.95 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.04 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
2.08 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
241 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
799 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
9.47 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
3.14 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.21 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.35 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
6.90 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
423 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
5.33 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
19.45 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
351 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
417 B lrw-r--r-- 2024-03-04 23:07:14
Edit Download
22.25 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
1.86 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
2.69 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
3.32 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
5.92 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download
8.14 KB lrw-r--r-- 2024-03-04 23:07:14
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).