bpo-28660: Make TextWrapper break long words on hyphens (GH-22721)
This commit is contained in:
parent
67f04878de
commit
b81c833ab5
|
@ -640,6 +640,78 @@ How *do* you spell that odd word, anyways?
|
||||||
max_lines=4)
|
max_lines=4)
|
||||||
|
|
||||||
|
|
||||||
|
class LongWordWithHyphensTestCase(BaseTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.wrapper = TextWrapper()
|
||||||
|
self.text1 = '''\
|
||||||
|
We used enyzme 2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate synthase.
|
||||||
|
'''
|
||||||
|
self.text2 = '''\
|
||||||
|
1234567890-1234567890--this_is_a_very_long_option_indeed-good-bye"
|
||||||
|
'''
|
||||||
|
|
||||||
|
def test_break_long_words_on_hyphen(self):
|
||||||
|
expected = ['We used enyzme 2-succinyl-6-hydroxy-2,4-',
|
||||||
|
'cyclohexadiene-1-carboxylate synthase.']
|
||||||
|
self.check_wrap(self.text1, 50, expected)
|
||||||
|
|
||||||
|
expected = ['We used', 'enyzme 2-', 'succinyl-', '6-hydroxy-', '2,4-',
|
||||||
|
'cyclohexad', 'iene-1-', 'carboxylat', 'e', 'synthase.']
|
||||||
|
self.check_wrap(self.text1, 10, expected)
|
||||||
|
|
||||||
|
expected = ['1234567890', '-123456789', '0--this_is', '_a_very_lo',
|
||||||
|
'ng_option_', 'indeed-', 'good-bye"']
|
||||||
|
self.check_wrap(self.text2, 10, expected)
|
||||||
|
|
||||||
|
def test_break_long_words_not_on_hyphen(self):
|
||||||
|
expected = ['We used enyzme 2-succinyl-6-hydroxy-2,4-cyclohexad',
|
||||||
|
'iene-1-carboxylate synthase.']
|
||||||
|
self.check_wrap(self.text1, 50, expected, break_on_hyphens=False)
|
||||||
|
|
||||||
|
expected = ['We used', 'enyzme 2-s', 'uccinyl-6-', 'hydroxy-2,',
|
||||||
|
'4-cyclohex', 'adiene-1-c', 'arboxylate', 'synthase.']
|
||||||
|
self.check_wrap(self.text1, 10, expected, break_on_hyphens=False)
|
||||||
|
|
||||||
|
expected = ['1234567890', '-123456789', '0--this_is', '_a_very_lo',
|
||||||
|
'ng_option_', 'indeed-', 'good-bye"']
|
||||||
|
self.check_wrap(self.text2, 10, expected)
|
||||||
|
|
||||||
|
def test_break_on_hyphen_but_not_long_words(self):
|
||||||
|
expected = ['We used enyzme',
|
||||||
|
'2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate',
|
||||||
|
'synthase.']
|
||||||
|
|
||||||
|
self.check_wrap(self.text1, 50, expected, break_long_words=False)
|
||||||
|
|
||||||
|
expected = ['We used', 'enyzme',
|
||||||
|
'2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate',
|
||||||
|
'synthase.']
|
||||||
|
self.check_wrap(self.text1, 10, expected, break_long_words=False)
|
||||||
|
|
||||||
|
expected = ['1234567890', '-123456789', '0--this_is', '_a_very_lo',
|
||||||
|
'ng_option_', 'indeed-', 'good-bye"']
|
||||||
|
self.check_wrap(self.text2, 10, expected)
|
||||||
|
|
||||||
|
|
||||||
|
def test_do_not_break_long_words_or_on_hyphens(self):
|
||||||
|
expected = ['We used enyzme',
|
||||||
|
'2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate',
|
||||||
|
'synthase.']
|
||||||
|
self.check_wrap(self.text1, 50, expected,
|
||||||
|
break_long_words=False,
|
||||||
|
break_on_hyphens=False)
|
||||||
|
|
||||||
|
expected = ['We used', 'enyzme',
|
||||||
|
'2-succinyl-6-hydroxy-2,4-cyclohexadiene-1-carboxylate',
|
||||||
|
'synthase.']
|
||||||
|
self.check_wrap(self.text1, 10, expected,
|
||||||
|
break_long_words=False,
|
||||||
|
break_on_hyphens=False)
|
||||||
|
|
||||||
|
expected = ['1234567890', '-123456789', '0--this_is', '_a_very_lo',
|
||||||
|
'ng_option_', 'indeed-', 'good-bye"']
|
||||||
|
self.check_wrap(self.text2, 10, expected)
|
||||||
|
|
||||||
class IndentTestCases(BaseTestCase):
|
class IndentTestCases(BaseTestCase):
|
||||||
|
|
||||||
# called before each test method
|
# called before each test method
|
||||||
|
|
|
@ -215,8 +215,16 @@ class TextWrapper:
|
||||||
# If we're allowed to break long words, then do so: put as much
|
# If we're allowed to break long words, then do so: put as much
|
||||||
# of the next chunk onto the current line as will fit.
|
# of the next chunk onto the current line as will fit.
|
||||||
if self.break_long_words:
|
if self.break_long_words:
|
||||||
cur_line.append(reversed_chunks[-1][:space_left])
|
end = space_left
|
||||||
reversed_chunks[-1] = reversed_chunks[-1][space_left:]
|
chunk = reversed_chunks[-1]
|
||||||
|
if self.break_on_hyphens and len(chunk) > space_left:
|
||||||
|
# break after last hyphen, but only if there are
|
||||||
|
# non-hyphens before it
|
||||||
|
hyphen = chunk.rfind('-', 0, space_left)
|
||||||
|
if hyphen > 0 and any(c != '-' for c in chunk[:hyphen]):
|
||||||
|
end = hyphen + 1
|
||||||
|
cur_line.append(chunk[:end])
|
||||||
|
reversed_chunks[-1] = chunk[end:]
|
||||||
|
|
||||||
# Otherwise, we have to preserve the long word intact. Only add
|
# Otherwise, we have to preserve the long word intact. Only add
|
||||||
# it to the current line if there's nothing already there --
|
# it to the current line if there's nothing already there --
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
:func:`textwrap.wrap` now attempts to break long words after hyphens when ``break_long_words=True`` and ``break_on_hyphens=True``.
|
Loading…
Reference in New Issue