> Yep, spotted that too! :-) BTW, your fix also a bug: the last word on a
> line won't be followed by a space (off-by-one). The easiest fix for that
> is to add 1 to line_length initially, another little trick.
> Or, equivalently, to reset current_line_length to -1, which is an elegant
> hack.
I'm actually going to stand my ground on this one. The incrementing of the line
length happens _after_ you've added that word to the line, and the check for
length is checking against the length of the new word. So adding the 1 for "the
space at the end" won't come into effect until the next word, where you're
asking "if I add this new word..." at which point you'll want to have included
that space.
So copy and paste wrap to wrap2 and make your changes to wrap2, then run
something like this, playing with the line length to check. The pipes show the
last allowed position of a character.
def wrap(text, line_length):
"""Wrap a string to a specified line length
Original Version"""
words = text.split()
lines_of_words = []
current_line_length = line_length
for word in words:
if current_line_length + len(word) > line_length:
lines_of_words.append([]) # new line
current_line_length = 0
lines_of_words[-1].append(word)
current_line_length += len(word)
lines = [' '.join(line_of_words) for line_of_words in lines_of_words]
return '\n'.join(lines)
def wrap2(text, line_length):
"""Wrap a string to a specified line length
Altered Version"""
words = text.split()
lines_of_words = []
current_line_length = line_length
for word in words:
if current_line_length + len(word) > line_length:
lines_of_words.append([]) # new line
current_line_length = 0
lines_of_words[-1].append(word)
current_line_length += len(word) + 1
lines = [' '.join(line_of_words) for line_of_words in lines_of_words]
return '\n'.join(lines)
foo = "a b antidisestablishmentarianism c d e f g h i j k l m n o p queue are
ess tee you vee doubleyou ecks why zee"
for wrapWidth in range(12, 19):
print(f"Width = {wrapWidth:d}")
showWidth = " " * (wrapWidth - 1) + "|"
print(showWidth)
print(wrap(foo, wrapWidth))
print(showWidth)
print(wrap2(foo, wrapWidth))
print(showWidth)
print("\n")
--
https://mail.python.org/mailman/listinfo/python-list