Colorize expanded tabs

Peter Otten __peter__ at web.de
Sun Dec 4 09:55:41 EST 2005


qwweeeit wrote:

> Hi all,
> from a string embedding tabs I want to colorize them when expanded:
> 
> # Starting from a string:
> a= '1234\t5678\t\t90\nqwerty\nasdfg'
> # which embeds both tabs and lfs
> 
> # printing it you obtain:
> print a
> # 1234    5678            90
> # qwerty
> # asdfg
> 
> # print automatically expands tabs and interprets the NL.
> 
> # to colorize the expanded tabs, I tried:
> print a.replace('\t',"\033[41m\t\033[0m") # 41 = red color
> # instead it works (in Linux) for the \n (substituted with a red
> space):
> print a.replace('\n',"\033[41m \033[0m\n")
> 
> Can you help me?
> Bye.

If all else fails you can colorize the tabs after converting them to
spaces:

def splititer(text, token):
    # A lazy iter(text.split(token)).
    # Probably not worth the effort.
    start = 0
    while True:
        try:
            end = text.index(token, start)
        except ValueError:
            break
        yield text[start:end]
        start = end + len(token)
    yield text[start:]

def colortabs(text, tabcolor, normcolor, tabwidth=8):
    parts = splititer(text, "\t")
    part = parts.next()
    pos = len(part)
    yield part
    for part in parts:
        width = tabwidth - pos % tabwidth
        yield tabcolor
        yield " " * width
        yield normcolor
        yield part
        pos += width + len(part)

print "\t1234\t5678\t\t90".replace("\t", "\033[41m\t\033[0m")
print "".join(colortabs("\t1234\t5678\t\t90", "\033[41m", "\033[0m"))

Peter




More information about the Python-list mailing list