Created
July 11, 2020 03:40
-
-
Save devilholk/5544b4a9dff5ec0b44dfd44a7fc8c890 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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