Fix displaying lines that are longer than the number of columns

This commit is contained in:
Andrew Resch 2009-04-19 19:55:40 +00:00
parent e0f8369e91
commit 28bc5c839e
1 changed files with 68 additions and 1 deletions

View File

@ -116,7 +116,74 @@ class Screen(CursesStdIO):
""" """
log.debug("adding line: %s", text) log.debug("adding line: %s", text)
self.lines.extend(text.splitlines()) def get_line_length(line):
"""
Returns the string length without the color formatting.
"""
while line.find("{{") != -1:
line = line[:line.find("{{")] + line[line.find("}}") + 2:]
return len(line)
def get_line_chunks(line):
"""
Returns a list of 2-tuples (color string, text)
"""
chunks = []
num_chunks = line.count("{{")
for i in range(num_chunks):
# Find the beginning and end of the color tag
beg = line.find("{{")
end = line.find("}}") + 2
color = line[beg:end]
line = line[end:]
# Check to see if this is the last chunk
if i + 1 == num_chunks:
text = line
else:
# Not the last chunk so get the text up to the next tag
# and remove the text from line
text = line[:line.find("{{")]
line = line[line.find("{{"):]
chunks.append((color, text))
return chunks
for line in text.splitlines():
# We need to check for line lengths here and split as necessary
line_length = get_line_length(line)
if line_length >= (self.cols - 1):
s = ""
# The length of the text without the color tags
s_len = 0
# We need to split this over multiple lines
for chunk in get_line_chunks(line):
if (len(chunk[1]) + s_len) < (self.cols - 1):
# This chunk plus the current string in 's' isn't over
# the maximum width, so just append the color tag and text
s += chunk[0] + chunk[1]
s_len += len(chunk[1])
else:
# The chunk plus the current string in 's' is too long.
# We need to take as much of the chunk and put it into 's'
# with the color tag.
remain = (self.cols - 1) - s_len
s += chunk[0] + chunk[1][:remain]
# We append the line since it's full
self.lines.append(s)
# Start a new 's' with the remainder chunk
s = chunk[0] + chunk[1][remain:]
s_len = len(chunk[1][remain:])
# Append the final string which may or may not be the full width
if s:
self.lines.append(s)
else:
self.lines.append(line)
while len(self.lines) > LINES_BUFFER_SIZE: while len(self.lines) > LINES_BUFFER_SIZE:
# Remove the oldest line if the max buffer size has been reached # Remove the oldest line if the max buffer size has been reached
del self.lines[0] del self.lines[0]