This snippet of code will convert a string of text into a list containing the lines it would break down into for a certain font and width.
from itertools import chain
def truncline(text, font, maxwidth):
real=len(text)
stext=text
l=font.size(text)[0]
cut=0
a=0
done=1
old = None
while l > maxwidth:
a=a+1
n=text.rsplit(None, a)[0]
if stext == n:
cut += 1
stext= n[:-cut]
else:
stext = n
l=font.size(stext)[0]
real=len(stext)
done=0
return real, done, stext
def wrapline(text, font, maxwidth):
done=0
wrapped=[]
while not done:
nl, done, stext=truncline(text, font, maxwidth)
wrapped.append(stext.strip())
text=text[nl:]
return wrapped
def wrap_multi_line(text, font, maxwidth):
""" returns text taking new lines into account.
"""
lines = chain(*(wrapline(line, font, maxwidth) for line in text.splitlines()))
return list(lines)
So:
pygame.init()
font=pygame.font.Font(None, 17)
print wrapline("Now is the time for all good men to come to the aid of their country", font, 120)
outputs: ['Now is the time for all', 'good men to come to', 'the aid of their', 'country']
Now actually displaying that text (which you will have to do line by line) is another matter.
But it was easier for me to display the text than to write this code to wrap a line, it really stumped me for a while.
(Update: An obnoxiously long word that rsplit can't break up would previously cause an infinite loop. Added a cutoff to start splitting the word once 'stext' stops changing). What this means from the point of view ? Is necessary to make modifications ?