Skip to content

Commit dfb458e

Browse files
committed
Re-write text wrapping logic
1 parent 0f54425 commit dfb458e

File tree

1 file changed

+30
-20
lines changed

1 file changed

+30
-20
lines changed

lib/matplotlib/text.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -632,27 +632,37 @@ def _get_wrapped_text(self):
632632
# Build the line incrementally, for a more accurate measure of length
633633
line_width = self._get_wrap_line_width()
634634
wrapped_str = ""
635-
line = ""
636-
637-
for word in self.get_text().split(' '):
638-
# New lines in the user's test need to force a split, so that it's
639-
# not using the longest current line width in the line being built
640-
sub_words = word.split('\n')
641-
for i in range(len(sub_words)):
642-
current_width = self._get_rendered_text_width(
643-
line + ' ' + sub_words[i])
644-
645-
# Split long lines, and each newline found in the current word
646-
if current_width > line_width or i > 0:
647-
wrapped_str += line + '\n'
648-
line = ""
649-
650-
if line == "":
651-
line = sub_words[i]
652-
else:
653-
line += ' ' + sub_words[i]
654635

655-
return wrapped_str + line
636+
# New lines in the user's text force a split
637+
unwrapped_lines = self.get_text().split('\n')
638+
639+
# Now wrap each individual unwrapped line
640+
for unwrapped_line in unwrapped_lines:
641+
642+
sub_words = unwrapped_line.split(' ')
643+
# Remove items from sub_words as we go, so stop when empty
644+
while len(sub_words) > 0:
645+
if len(sub_words) == 1:
646+
# Only one word, so just add it to the end
647+
wrapped_str += sub_words.pop(0)
648+
continue
649+
650+
for i in range(2, len(sub_words) + 1):
651+
# Get width of all words up to and including here
652+
line = ' '.join(sub_words[:i])
653+
current_width = self._get_rendered_text_width(line)
654+
655+
# If all these words are too wide, append all not including
656+
# last word
657+
if current_width > line_width:
658+
wrapped_str += ' '.join(sub_words[:i - 1]) + '\n'
659+
sub_words = sub_words[i - 1:]
660+
# Otherwise if all words fit in the width, append them all
661+
elif i == len(sub_words):
662+
wrapped_str += ' '.join(sub_words[:i])
663+
sub_words = []
664+
665+
return wrapped_str
656666

657667
@artist.allow_rasterization
658668
def draw(self, renderer):

0 commit comments

Comments
 (0)