better colour stacking

This commit is contained in:
Mattias Andrée 2012-09-01 06:52:42 +02:00
parent 1b78d94ef4
commit 1601dda9d3

36
ponysay
View file

@ -1246,8 +1246,8 @@ class Backend():
h = int(props[props.index(',') + 1:]) h = int(props[props.index(',') + 1:])
else: else:
w = int(props) w = int(props)
balloon = self.__getballoon(w, h, indent).split('\n') balloon = self.__getballoon(w, h, indent)
balloon = [AUTO_PUSH + item + AUTO_POP for item in balloon] balloon = balloon.split('\n')
for b in balloon[0]: for b in balloon[0]:
self.output += b + colourstack.feed(b) self.output += b + colourstack.feed(b)
if lineindex == 0: if lineindex == 0:
@ -1507,45 +1507,33 @@ class ColourStack():
''' '''
def __init__(self, autopush, autopop): def __init__(self, autopush, autopop):
self.autopush = autopush self.autopush = autopush
self.autopop = autopop self.autopop = autopop
self.lenpush = len(autopush) self.lenpush = len(autopush)
self.lenpop = len(autopop) self.lenpop = len(autopop)
self.bufproto = ' ' * (self.lenpush if self.lenpush > self.lenpop else self.lenpop) self.bufproto = ' ' * (self.lenpush if self.lenpush > self.lenpop else self.lenpop)
self.stack = [] self.stack = []
self.push() self.push()
self.seq = None self.seq = None
def push(self): def push(self):
self.stack = [[self.bufproto, None, None, [False] * 9]] + self.stack self.stack = [[self.bufproto, None, None, [False] * 9]] + self.stack
if len(self.stack) == 1: if len(self.stack) == 1:
return None return None
old = self.stack[1] return '\033[0m'
rc = '\033['
if old[1] is not None: rc += '39;'
if old[2] is not None: rc += '49;'
for i in range(0, 9):
if old[3][i]:
rc += '2%i;' % (i + 1)
return '' if len(rc) == 2 else (rc[:-1] + 'm')
def pop(self): def pop(self):
old = self.stack[0] old = self.stack[0]
self.stack = self.stack[1:] self.stack = self.stack[1:]
rc = '\033[' rc = '\033[0;'
if old[1] is not None: rc += '39;'
if old[2] is not None: rc += '49;'
for i in range(0, 9):
if old[3][i]:
rc += str(i + 21) + ';'
new = self.stack[0] new = self.stack[0]
if new[1] is not None: rc += new[1] + ';' if new[1] is not None: rc += new[1] + ';'
if new[2] is not None: rc += new[2] + ';' if new[2] is not None: rc += new[2] + ';'
for i in range(0, 9): for i in range(0, 9):
if new[3][i]: if new[3][i]:
rc += str(i + 1) + ';' rc += str(i + 1) + ';'
return '' if len(rc) == 2 else (rc[:-1] + 'm') return rc[:-1] + 'm'
def feed(self, char): def feed(self, char):
@ -1580,8 +1568,8 @@ class ColourStack():
buf = self.stack[0][0] buf = self.stack[0][0]
buf = buf[1:] + char buf = buf[1:] + char
rc = '' rc = ''
if buf[-self.lenpush:] == self.autopush: rc = self.push() if buf[-self.lenpush:] == self.autopush: rc = self.push()
elif buf[-self.lenpop:] == self.autopop: rc = self.pop() elif buf[-self.lenpop:] == self.autopop: rc = self.pop()
self.stack[0][0] = buf self.stack[0][0] = buf
return rc return rc