@snafu
Ich nehme mal, das es Dir um die farbige Terminalsache geht.
Hier mal eine einfache Version:
Code: Alles auswählen
import re
ANSI_CODES = {
'**' : {1: '\x1b[1m', 0: '\x1b[22m'},
'__' : {1: '\x1b[4m', 0: '\x1b[24m'},
'#red#': {1: '\x1b[91m', 0: '\x1b[39m'},
'#bg_blue#': {1: '\x1b[104m', 0: '\x1b[49m'},
}
def tokenize(tokens, s):
return re.split('(%s)'%'|'.join(re.escape(token)
for token in tokens), s)
def parse(tokens, s_tokenized):
stack = []
status = dict(((i, 0) for i in tokens))
for i, j in enumerate(s_tokenized):
if i%2:
if status[j]:
stack.append(tokens[j][0])
status[j] = 0
else:
stack.append(tokens[j][1])
status[j] = 1
else:
stack.append(j)
for i, j in status.iteritems():
if j:
stack.append(tokens[i][0])
return stack
s = """
Ich bin **fett**, Du bist __unterstrichen__, #red#farbtest#red#
__Ueberlappung **geht__ wohl** #bg_blue#auch#bg_blue#
"""
s_tokenized = tokenize(ANSI_CODES, s)
s_parsed = parse(ANSI_CODES, s_tokenized)
print s_parsed
print 'Kodiert:', ''.join(s_parsed)
print 'Plain:', ''.join(s_tokenized[::2])
Der Parser ist ziemlich dumm, ua. müßtest Du für überlappende Farbbereiche noch Farbstacks mitschleppen und auswerten. Desweiteren fehlen Escapes, falls man doch mal ein Steuertoken als Text haben will.
Interessant wäre auch, wie man das ganze in Windows ohne ansi.sys umsetzen würde (wenn ich mich recht entsinne, müssen dort extra Terminalbefehle abgesetzt werden)