143 lines
3.3 KiB
Python
Raw Normal View History

2021-10-25 20:04:55 +01:00
# -*- python -*-
# -*- coding: utf-8 -*-
#
# This file is part of the easydev software
# It is a modified version of console.py from the sphinx software
#
# Copyright (c) 2011-2014
#
# File author(s): Thomas Cokelaer <cokelaer@gmail.com>
#
# Distributed under the GPLv3 License.
# See accompanying file LICENSE.txt or copy at
# http://www.gnu.org/licenses/gpl-3.0.html
#
# Website: https://github.com/cokelaer/easydev
# Documentation: http://packages.python.org/easydev
#
##############################################################################
"""Format colored consoled output. Modified from sphinx.util.console"""
import os
import sys
import platform
__all__ = ["color_terminal", "get_terminal_width", "term_width_line"]
try:
plf = platform.platform.lower()
if plf.starstwith("win"): # pragma: no cover
import colorama
colorama.init()
except AttributeError:
pass
# colors and other functions from the attributes codes are added dynamically to
# this __all__ variable
codes = {}
def get_terminal_width():
"""Returns the current terminal width"""
try:
import termios, fcntl, struct
call = fcntl.ioctl(0, termios.TIOCGWINSZ, struct.pack("hhhh", 0, 0, 0, 0))
_, width = struct.unpack("hhhh", call)[:2]
terminal_width = width
except (SystemExit, KeyboardInterrupt): # pragma: no cover
raise
except:
# FALLBACK
terminal_width = int(os.environ.get("COLUMNS", 80)) - 1
return terminal_width
def term_width_line(text):
"""prints pruned version of the input text (limited to terminal width)
:param str text:
:return str text:
"""
_tw = get_terminal_width()
if not codes:
# if no coloring, don't output fancy backspaces
return text + "\n"
else:
return text.ljust(_tw) + "\r"
def color_terminal():
"""Does terminal allows coloring
:return: boolean"""
if not hasattr(sys.stdout, "isatty"):
return False
if not sys.stdout.isatty():
return False
if "COLORTERM" in os.environ: # pragma: no cover
return True
term = os.environ.get("TERM", "dumb").lower()
if term in ("xterm", "linux") or "color" in term:
return True
return False
def __nocolor(): # pragma: no cover
"""set color codes off"""
codes.clear()
def __coloron(): # pragma: no cover
"""Set color codes on"""
codes.update(_orig_codes)
def _colorize(name, text):
return codes.get(name, "") + text + codes.get("reset", "")
def _create_color_func(name):
def inner(text):
return _colorize(name, text)
globals()[name] = inner
_attrs = {
"reset": "39;49;00m",
"bold": "01m",
"faint": "02m",
"standout": "03m",
"underline": "04m",
"blink": "05m",
}
for _name, _value in _attrs.items():
codes[_name] = "\x1b[" + _value
_colors = [
("black", "darkgray"),
("darkred", "red"),
("darkgreen", "green"),
("brown", "yellow"),
("darkblue", "blue"),
("purple", "fuchsia"),
("turquoise", "teal"),
("lightgray", "white"),
]
for i, (dark, light) in enumerate(_colors):
codes[dark] = "\x1b[%im" % (i + 30)
codes[light] = "\x1b[%i;01m" % (i + 30)
_orig_codes = codes.copy()
for _name in codes:
_create_color_func(_name)
# dynamically set the colors
for x in codes.keys():
__all__.append(x)