cprint-python/cprint.py

84 lines
2.8 KiB
Python

# Felix Albrigtsen 2021
#Usage: cprint("%MARKERS[, ..]% text").
#Example: cprint("%b,U% This is blue and underlined")
#Consider hardcoding \u001b[ in getSequence(), only store the variable part in a dict
#Currently keeping it this way to avoid hardcoding, simplify adapting to other terminals.
escSeq = {
# Modifiers:
"B": "\u001b[1m", #Bold
"U": "\u001b[4m", #Underline
"I": "\u001b[7m", #Inverted
"rs": "\u001b[0m", #Reset
# FG-Colors:
"bl": "\u001b[30m", #Black text
"r": "\u001b[31m", #Red text
"g": "\u001b[32m", #Green text
"y": "\u001b[33m", #Yellow text
"b": "\u001b[34m", #Blue text
"m": "\u001b[35m", #Magenta text
"c": "\u001b[36m", #Cyan text
"w": "\u001b[37m", #White text
# BG-Colors
"bbl": "\u001b[40m", #Black background
"br": "\u001b[41m", #Red background
"bg": "\u001b[42m", #Green background
"by": "\u001b[43m", #Yellow background
"bb": "\u001b[44m", #Blue background
"bm": "\u001b[45m", #Magenta background
"bc": "\u001b[46m", #Cyan background
"bw": "\u001b[47m" #White background
}
macros = {
"warning": ["y", "B"],
"error": ["r", "B", "U"]
}
#Translate prettyprint codes to ANSI codes
def getSequence(codeStr):
codes = codeStr.split(",") #Split lists of several codes
for code in codes: #Substitute macro shortcuts into the list
if code in macros:
codes.remove(code)
codes += macros[code]
outSeq = ""
for code in codes:
if code in escSeq:
outSeq += escSeq[code] #Simple dictionary lookup, insert the ANSI code corresponding to our symbol
else:
print(code)
raise ValueError("Invalid prettyprint code") #Raise exception on invalid codes.
return outSeq
def getString(inStr):
pos = 0
out = "" # String that stores the result after "translation"
while pos < len(inStr):
if (inStr[pos] == "%") and (pos>0 or inStr[pos-1] != "\\"): # Found a non-escaped %
code = ""
pos += 1
while inStr[pos] != "%": # Scan until the closing %
code += inStr[pos]
pos += 1
pos += 1
out += getSequence(code) # Look up the escape character and insert it
if pos < len(inStr):
out += inStr[pos] # Normal(non-%) characters, send to output
pos += 1
return out
def cprint(inStr):
print(getString(inStr) + getSequence("rs"))
# EXAMPLES / TESTS
# cprint("%bc,r%This is pretty high visibility %y%with different colors")
# cprint("%bw,b%This text is blue on white, %B,U,I% this is bold, underlined and white on blue")
# cprint("%warning%This is a warning!")
# cprint("%error%And this is an error")