File: colors_256.py

package info (click to toggle)
python-easy-ansi 0.3-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 488 kB
  • sloc: python: 3,109; sh: 127; makefile: 2
file content (40 lines) | stat: -rw-r--r-- 1,509 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from typing import Optional

from easyansi._core.codes import CSI as _CSI
from easyansi._core.validations import validate_in_range as _validate_in_range
from easyansi._core.prnt import prnt as _prnt
from easyansi._core.colors.common_colors import reset_code, reset
from easyansi._core.colors.standard_colors import *
from easyansi._core.colors.gray_colors import *

MIN_COLOR = 0
MAX_COLOR = 255
MIN_ENHANCED_COLOR = 16
MAX_ENHANCED_COLOR = 231


def _build_color_code(color_idx: int, fg: bool) -> str:
    """Take a 256 color index value and return the ANSI sequence."""
    color_cd = _CSI
    color_cd += "38" if fg else "48"
    color_cd += ";5;" + str(color_idx) + "m"
    return color_cd


def color_code(fg: Optional[int] = None, bg: Optional[int] = None) -> str:
    """Return the ANSI code sequence for the selected 256 color combination."""
    if (fg is None) and (bg is None):
        raise ValueError("Must provide either a foreground or background color index")
    color_sequence = ""
    if fg is not None:
        _validate_in_range(fg, MIN_COLOR, MAX_COLOR, "Foreground 256 Color Index")
        color_sequence += _build_color_code(fg, True)
    if bg is not None:
        _validate_in_range(bg, MIN_COLOR, MAX_COLOR, "Background 256 Color Index")
        color_sequence += _build_color_code(bg, False)
    return color_sequence


def color(fg: Optional[int] = None, bg: Optional[int] = None) -> None:
    """Output the selected 256 color combination."""
    _prnt(color_code(fg=fg, bg=bg))