c++ template error message decoder and colorizer
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
#!/usr/bin/env python3 | |
""" | |
C++ template error message decoder and colorizer. | |
Copyright (C) 2017 Jonas Jelten <jj@stusta.net> | |
Licensed under GNU GPLv3 or later. | |
""" | |
import argparse | |
import sys | |
def main(): | |
""" | |
Decode and colorize template error messages. | |
It can surely be improved, but it was written while in rage. | |
""" | |
cmd = argparse.ArgumentParser() | |
cmd.add_argument("-c", "--no-color", action="store_true", | |
help="don't colorize output") | |
args = cmd.parse_args() | |
print("pls giev template data on stdin...") | |
data = [] | |
while True: | |
read = sys.stdin.buffer.read() | |
if not read: | |
break | |
data.append(read) | |
indent_per_level = 4 | |
indent = 0 | |
in_quotes = False | |
opentags = 0 | |
current_line = bytearray() | |
output = [] | |
for group in data: | |
for char in group: | |
if char == ord("\n"): | |
continue | |
elif char == ord(","): | |
# newline after , | |
current_line.append(char) | |
output.append((indent, current_line)) | |
current_line = bytearray() | |
elif char == ord("'"): | |
# newline after ' if in quotes | |
if in_quotes: | |
output.append((indent, current_line)) | |
current_line = bytearray() | |
current_line.append(char) | |
in_quotes = False | |
else: | |
current_line.append(char) | |
output.append((indent, current_line)) | |
current_line = bytearray() | |
in_quotes = True | |
elif char == ord("<"): | |
# newline after < then indent | |
current_line.append(char) | |
output.append((indent, current_line)) | |
current_line = bytearray() | |
indent += indent_per_level | |
opentags += 1 | |
elif char == ord(">"): | |
# newline before > then dedent | |
output.append((indent, current_line)) | |
current_line = bytearray() | |
current_line.append(char) | |
indent -= indent_per_level | |
if opentags == 0: | |
print("ERR: have more closing > than opening ones!") | |
opentags -= 1 | |
else: | |
current_line.append(char) | |
if current_line: | |
output.append((indent, current_line)) | |
if opentags != 0: | |
print("ERR: unbalanced < and > count!") | |
for indent, line in output: | |
if not args.no_color: | |
color = str(31 + (indent//indent_per_level) % 8).encode() | |
sys.stdout.buffer.write(b"\x1b[%sm" % color) | |
for elem in (b" " * indent, line.strip(), b"\n"): | |
sys.stdout.buffer.write(elem) | |
if not args.no_color: | |
sys.stdout.buffer.write(b"\x1b[m") | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment