Kaydet (Commit) 9e6b4700 authored tarafından Georg Brandl's avatar Georg Brandl

Patch #1581073: add a flag to textwrap that prevents the dropping of

whitespace while wrapping.
üst 92a6baed
...@@ -115,6 +115,13 @@ replaced by a single space, which is \emph{not} the same as tab ...@@ -115,6 +115,13 @@ replaced by a single space, which is \emph{not} the same as tab
expansion.} expansion.}
\end{memberdesc} \end{memberdesc}
\begin{memberdesc}{drop_whitespace}
(default: \code{True}) If true, whitespace that, after wrapping, happens
to end up at the beginning or end of a line is dropped (leading whitespace
in the first line is always preserved, though).
\versionadded[Whitespace was always dropped in earlier versions]{2.6}
\end{memberdesc}
\begin{memberdesc}{initial_indent} \begin{memberdesc}{initial_indent}
(default: \code{''}) String that will be prepended to the first line (default: \code{''}) String that will be prepended to the first line
of wrapped output. Counts towards the length of the first line. of wrapped output. Counts towards the length of the first line.
......
...@@ -328,6 +328,14 @@ What a mess! ...@@ -328,6 +328,14 @@ What a mess!
self.check_wrap(text, 30, self.check_wrap(text, 30,
[" This is a sentence with", "leading whitespace."]) [" This is a sentence with", "leading whitespace."])
def test_no_drop_whitespace(self):
# SF patch #1581073
text = " This is a sentence with much whitespace."
self.check_wrap(text, 10,
[" This is a", " ", "sentence ",
"with ", "much white", "space."],
drop_whitespace=False)
if test_support.have_unicode: if test_support.have_unicode:
def test_unicode(self): def test_unicode(self):
# *Very* simple test of wrapping Unicode strings. I'm sure # *Very* simple test of wrapping Unicode strings. I'm sure
......
...@@ -63,6 +63,8 @@ class TextWrapper: ...@@ -63,6 +63,8 @@ class TextWrapper:
break_long_words (default: true) break_long_words (default: true)
Break words longer than 'width'. If false, those words will not Break words longer than 'width'. If false, those words will not
be broken, and some lines might be longer than 'width'. be broken, and some lines might be longer than 'width'.
drop_whitespace (default: true)
Drop leading and trailing whitespace from lines.
""" """
whitespace_trans = string.maketrans(_whitespace, ' ' * len(_whitespace)) whitespace_trans = string.maketrans(_whitespace, ' ' * len(_whitespace))
...@@ -98,7 +100,8 @@ class TextWrapper: ...@@ -98,7 +100,8 @@ class TextWrapper:
expand_tabs=True, expand_tabs=True,
replace_whitespace=True, replace_whitespace=True,
fix_sentence_endings=False, fix_sentence_endings=False,
break_long_words=True): break_long_words=True,
drop_whitespace=True):
self.width = width self.width = width
self.initial_indent = initial_indent self.initial_indent = initial_indent
self.subsequent_indent = subsequent_indent self.subsequent_indent = subsequent_indent
...@@ -106,6 +109,7 @@ class TextWrapper: ...@@ -106,6 +109,7 @@ class TextWrapper:
self.replace_whitespace = replace_whitespace self.replace_whitespace = replace_whitespace
self.fix_sentence_endings = fix_sentence_endings self.fix_sentence_endings = fix_sentence_endings
self.break_long_words = break_long_words self.break_long_words = break_long_words
self.drop_whitespace = drop_whitespace
# -- Private methods ----------------------------------------------- # -- Private methods -----------------------------------------------
...@@ -140,7 +144,7 @@ class TextWrapper: ...@@ -140,7 +144,7 @@ class TextWrapper:
'use', ' ', 'the', ' ', '-b', ' ', 'option!' 'use', ' ', 'the', ' ', '-b', ' ', 'option!'
""" """
chunks = self.wordsep_re.split(text) chunks = self.wordsep_re.split(text)
chunks = filter(None, chunks) chunks = filter(None, chunks) # remove empty chunks
return chunks return chunks
def _fix_sentence_endings(self, chunks): def _fix_sentence_endings(self, chunks):
...@@ -228,7 +232,7 @@ class TextWrapper: ...@@ -228,7 +232,7 @@ class TextWrapper:
# First chunk on line is whitespace -- drop it, unless this # First chunk on line is whitespace -- drop it, unless this
# is the very beginning of the text (ie. no lines started yet). # is the very beginning of the text (ie. no lines started yet).
if chunks[-1].strip() == '' and lines: if self.drop_whitespace and chunks[-1].strip() == '' and lines:
del chunks[-1] del chunks[-1]
while chunks: while chunks:
...@@ -249,7 +253,7 @@ class TextWrapper: ...@@ -249,7 +253,7 @@ class TextWrapper:
self._handle_long_word(chunks, cur_line, cur_len, width) self._handle_long_word(chunks, cur_line, cur_len, width)
# If the last chunk on this line is all whitespace, drop it. # If the last chunk on this line is all whitespace, drop it.
if cur_line and cur_line[-1].strip() == '': if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':
del cur_line[-1] del cur_line[-1]
# Convert current line back to a string and store it in list # Convert current line back to a string and store it in list
......
...@@ -168,6 +168,9 @@ Core and builtins ...@@ -168,6 +168,9 @@ Core and builtins
Library Library
------- -------
- Patch #1581073: add a flag to textwrap that prevents the dropping of
whitespace while wrapping.
- Patch #1603688: ConfigParser.SafeConfigParser now checks values that - Patch #1603688: ConfigParser.SafeConfigParser now checks values that
are set for invalid interpolation sequences that would lead to errors are set for invalid interpolation sequences that would lead to errors
on reading back those values. on reading back those values.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment