def color_by_name(name, fg=None, bg=None): """Converts a color name to a color token, foreground name, and background name. Will take into consideration current foreground and background colors, if provided. Parameters ---------- name : str Color name. fg : str, optional Foreground color name. bg : str, optional Background color name. Returns ------- tok : Token Pygments Token.Color subclass fg : str or None New computed foreground color name. bg : str or None New computed background color name. """ name = name.upper() if name in ("RESET", "NO_COLOR"): return Color.DEFAULT, None, None m = RE_BACKGROUND.search(name) if m is None: # must be foreground color fg = norm_name(name) else: bg = norm_name(name) # assemble token if fg is None and bg is None: tokname = "RESET" elif fg is None: tokname = bg elif bg is None: tokname = fg else: tokname = fg + "__" + bg tok = getattr(Color, tokname) return tok, fg, bg
def color_by_name(name, fg=None, bg=None): """Converts a color name to a color token, foreground name, and background name. Will take into consideration current foreground and background colors, if provided. Parameters ---------- name : str Color name. fg : str, optional Foreground color name. bg : str, optional Background color name. Returns ------- tok : Token Pygments Token.Color subclass fg : str or None New computed foreground color name. bg : str or None New computed background color name. """ name = name.upper() if name == 'NO_COLOR': return Color.NO_COLOR, None, None m = RE_BACKGROUND.search(name) if m is None: # must be foreground color fg = norm_name(name) else: bg = norm_name(name) # assemble token if fg is None and bg is None: tokname = 'NO_COLOR' elif fg is None: tokname = bg elif bg is None: tokname = fg else: tokname = fg + '__' + bg tok = getattr(Color, tokname) return tok, fg, bg
def color_token_by_name(xc: tuple, styles=None) -> Color: """Returns (color) token corresponding to Xonsh color tuple, side effect: defines token is defined in styles""" if not styles: try: styles = builtins.__xonsh__.shell.shell.styler.styles except AttributeError: return Color tokName = xc[0] pc = color_name_to_pygments_code(xc[0], styles) if len(xc) > 1: pc += " " + color_name_to_pygments_code(xc[1], styles) tokName += "__" + xc[1] token = getattr(Color, norm_name(tokName)) styles[token] = pc return token
def color_name_to_pygments_code(name, styles): """Converts a xonsh color name to a pygments color code.""" token = getattr(Color, norm_name(name)) if token in styles: return styles[token] m = RE_XONSH_COLOR.match(name) if m is None: raise ValueError("{!r} is not a color!".format(name)) parts = m.groupdict() # convert regex match into actual pygments colors if parts["reset"] is not None: if parts["reset"] == "NO_COLOR": warn_deprecated_no_color() res = "noinherit" elif parts["bghex"] is not None: res = "bg:#" + parts["bghex"][3:] elif parts["background"] is not None: color = parts["color"] if "#" in color: fgcolor = color else: fgcolor = styles[getattr(Color, color)] res = "bg:" + fgcolor else: # have regular, non-background color mods = parts["modifiers"] if mods is None: mods = [] else: mods = mods.strip("_").split("_") mods = [PYGMENTS_MODIFIERS[mod] for mod in mods] mods = list(filter(None, mods)) # remove unsupported entries color = parts["color"] if "#" in color: mods.append(color) else: mods.append(styles[getattr(Color, color)]) res = " ".join(mods) styles[token] = res return res
def color_name_to_pygments_code(name, styles): """Converts a xonsh color name to a pygments color code.""" token = getattr(Color, norm_name(name)) if token in styles: return styles[token] m = RE_XONSH_COLOR.match(name) if m is None: raise ValueError("{!r} is not a color!".format(name)) parts = m.groupdict() # convert regex match into actual pygments colors if parts["nocolor"] is not None: res = "noinherit" elif parts["bghex"] is not None: res = "bg:#" + parts["bghex"][3:] elif parts["background"] is not None: color = parts["color"] if "#" in color: fgcolor = color else: fgcolor = styles[getattr(Color, color)] res = "bg:" + fgcolor else: # have regular, non-background color mods = parts["modifiers"] if mods is None: mods = [] else: mods = mods.strip("_").split("_") mods = [PYGMENTS_MODIFIERS[mod] for mod in mods] mods = list(filter(None, mods)) # remove unsupported entries color = parts["color"] if "#" in color: mods.append(color) else: mods.append(styles[getattr(Color, color)]) res = " ".join(mods) styles[token] = res return res