On 04/16/10 19:28, Jonathan Hartley wrote: > I'm playing with ideas of what API to expose. My favourite one is to > simply embed ANSI codes in the stream to be printed. Then this will > work as-is on Mac and *nix. To make it work on Windows, printing could > be done to a file0-like object which wraps stdout:
The problem with that is you're simply reinventing ANSI.SYS device driver. An alternative API is you could override .__add__(), like so (completely untested): class Color(object): def __init__(self, color): self.color = map_the_color(color) self.string = "" def __add__(self, string): self.string += string return self def __str__(self): if terminal_can_do_ansi_color: return ansicolorescape(self.string, self.color) elif windows: syscalltocolor(self.color) print self.string syscalltocolor(reset the color) return "" GREEN = Color('green') print GREEN + "Great" + "Good" you can even go a bit further and allow chained calls (again, completely untested, but you get the idea): class Color(object): def __init__(self, color): self.color = map_the_color(color) self.stack = [] def __add__(self, string): if isinstance(string, Color): # not a string, chain the calls self.stack.append((string.color, []])) else: # a string, self.stack[-1][1].append(string) return self def __radd__(self, string): self.stack.append([self.default, string]) return self def __str__(self): if ansi_capable: return colorescape(format, string) elif windows: for format, string in self.stack: syscalltocolor(color) print string return "" GREEN = Color('green') RED = Color('red') print "Fairly" + GREEN + "Great" + RED + "Poor" or something like that, and you will have an API that works transparently on all platforms. The downside is that you cannot call str(GREEN + "foo") on windows. -- http://mail.python.org/mailman/listinfo/python-list