Stylish ANSI terminal colors and helpers.
from snazzy import enable_colors, green, wrap
enable_colors()
print("That looks " + green("good") + ", right?")
Note two things:
enable_colors()
first.green(<text>)
wraps the text in ANSI escape sequences to applyThe function green(<text>)
is only a convenience shortcut for wrap(<text>, ...)
:
assert green("good") == wrap("good", fg="green")
However wrap()
is more powerful and flexible, since it also allows to set background
color and attributes (bold, italic, underline):
print(wrap("white on blue", "white", bg="blue"))
print(wrap("ERROR:", "yellow", bg="red", bold=True) + " that went wrong.")
Alternative pattern, using a context manager:
with Snazzy(fg="green", bg="black"))
print("This is so eighties...")
The context manager pattern is syntactic sugar for this explicit code:
print(ansi("green", bg="black"), end="")
print("This is so eighties...")
print(ansi_reset(), end="")
Color keys can be used as foreground or background using the fg=COLOR
and
bg=COLOR
option respectively.
Note: Not all platforms implement all features
see here for an overview.
These are well supported in most terminals:
"black"
, "red"
, "green"
, "yellow"
, "blue"
, "magenta"
, "cyan"
, "white"
.
These are less good supported:
"li_black"
, "li_red"
, "li_green"
, "li_yellow"
, "li_blue"
, "li_magenta"
,
"li_cyan"
, "li_white"
.
These are less supported:
"da_black"
, "da_red"
, "da_green"
, "da_yellow"
, "da_blue"
, "da_magenta"
,
"da_cyan"
, "da_white"
.
We can also pass RGB tuples like so if the platform supports it:
print(wrap("white on blue", (255, 255, 255), bg=(0, 0, 200)))
The following effects are available:
"bold"
, "dim"
, "italic"
, "underline"
, "blink"
, "inverse"
, "hidden"
,
"strike"
.
("b"
, "i"
, and "u"
may be used as alias for bold, italic, and underline.)
The following codes reset distinct formattings to default values:
"reset_all"
, "reset_fg"
, "reset_bg"
, "reset_bold_dim"
, "reset_italic"
,
"reset_underline"
, "reset_blink"
, "reset_inverse"
, "reset_hidden"
,
"reset_strike"
.
(The wrap()
methods appends this automatically to the wrapped text.)
Snazzy is disabled by default, because not all terminals and platforms support
ANSI codes, resulting in ugly text.
Also, when output is redirected to log files, we want to suppress those escape
sequences.
Finally, a command line tool that uses snazzy
might want to offer a
command line argument --no-color
to disable colors:
if not args.no_color:
snazzy.enable_colors()
Until explicitly enabled, no escape sequencrs are generated, so the the wrappers behave transparently:
from snazzy import red, enable_colors
assert red("error") == "error"
enable_colors(True)
assert red("error") == "\x1b[91merror\x1b[39m"
The emoji(s, fallback)
method allows to emit emojis and other fancy unicode
characters, but fallback to a replacement string if the terminal does not
support this.
print("{} this is a bug.".format(emoji("❌", red("X"))))
print(emoji("✨ 🍰 ✨", ":-)"))
Note: Currently we assume that on Windows CMD and Powershell don't support emojis, but 'Windows Terminal' does. Linux and macOS platforms are supposed to support emojis.
The cleanup_ansi_codes(s)
method removes ANSI codes from a string:
s = wrap("foo", underline=True)
assert s == "\x1b[4mfoo\x1b[24m"
assert cleanup_ansi_codes(s) == "foo"