84 lines
2.8 KiB
Python
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")
|