Skip to content

Instantly share code, notes, and snippets.

@devilholk
Created July 11, 2020 03:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devilholk/5544b4a9dff5ec0b44dfd44a7fc8c890 to your computer and use it in GitHub Desktop.
Save devilholk/5544b4a9dff5ec0b44dfd44a7fc8c890 to your computer and use it in GitHub Desktop.
import colorsys, sys
def bold(text):
return f'\x1b[1m{text}\x1b[21m'
def italics(text):
return f'\x1b[3m{text}\x1b[23m'
class color:
black = lambda text: f'\x1b[30m{text}\x1b[38m'
red = lambda text: f'\x1b[31m{text}\x1b[38m'
green = lambda text: f'\x1b[32m{text}\x1b[38m'
brown = lambda text: f'\x1b[33m{text}\x1b[38m'
blue = lambda text: f'\x1b[34m{text}\x1b[38m'
magenta = lambda text: f'\x1b[35m{text}\x1b[38m'
cyan = lambda text: f'\x1b[36m{text}\x1b[38m'
light_grey = lambda text: f'\x1b[37m{text}\x1b[38m'
@staticmethod
def rgb_f(text, R, G, B):
r = max(min(int(R*255), 255), 0)
g = max(min(int(G*255), 255), 0)
b = max(min(int(B*255), 255), 0)
return f'\x1b[38;2;{r};{g};{b}m{text}\x1b[38m'
def hsv_f(text, H, S, V):
return color.rgb_f(text, *colorsys.hsv_to_rgb(H, S, V))
good = green
bad = red
info = cyan
class context_handler:
def __init__(self, ingress=None, egress=None):
self.ingress = ingress
self.egress = egress
def __enter__(self):
return self.ingress()
def __exit__(self, ev, et, tb):
self.egress()
class stream_line_filter:
#This could be done better since there might be a stray line but this is good for our current purposes
def __init__(self, target, target_filter_function):
self.target = target
self.target_filter_function = target_filter_function
self.filter_function = self.indented_filter_function
self.buffer = ''
self.indent = 0
self.indention = '\t'
def indented_filter_function(self, piece):
return self.target_filter_function(self.indent * self.indention + piece)
@property
def indented(self):
return context_handler(self.increase_indent, self.decrease_indent)
def increase_indent(self):
self.indent += 1
def decrease_indent(self):
self.indent -= 1
def flush_buffer(self):
self.target.write(self.filter_function(self.buffer))
self.buffer = ''
def write(self, data):
self.buffer += data
if '\n' in data:
pieces = self.buffer.split('\n')
for piece in pieces[:-1]:
self.target.write(self.filter_function(piece))
if len(pieces) >= 2:
self.buffer = pieces[-1]
def flush(self):
self.flush_buffer()
self.target.flush()
def install_colored_stdout_retabulator():
def filter_function(data):
#print(data, file=sys.stderr)
stripped = data.lstrip('\t')
tabs = len(data) - len(stripped)
return f'{tabs*" "}{color.hsv_f(stripped, 0.6+tabs*0.1, 0.5, 1.0)}\n'
sys.stdout = stream_line_filter(sys.stdout, filter_function)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment