From 9e6b47002a563473ec966ac4d353b99df986f642 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Tue, 13 Mar 2007 18:15:41 +0000 Subject: Patch #1581073: add a flag to textwrap that prevents the dropping of whitespace while wrapping. --- Doc/lib/libtextwrap.tex | 7 +++++++ Lib/test/test_textwrap.py | 8 ++++++++ Lib/textwrap.py | 12 ++++++++---- Misc/NEWS | 3 +++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Doc/lib/libtextwrap.tex b/Doc/lib/libtextwrap.tex index 38f9b03..fcf339d 100644 --- a/Doc/lib/libtextwrap.tex +++ b/Doc/lib/libtextwrap.tex @@ -115,6 +115,13 @@ replaced by a single space, which is \emph{not} the same as tab expansion.} \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} (default: \code{''}) String that will be prepended to the first line of wrapped output. Counts towards the length of the first line. diff --git a/Lib/test/test_textwrap.py b/Lib/test/test_textwrap.py index 500eceb..5f0b51b 100644 --- a/Lib/test/test_textwrap.py +++ b/Lib/test/test_textwrap.py @@ -328,6 +328,14 @@ What a mess! self.check_wrap(text, 30, [" 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: def test_unicode(self): # *Very* simple test of wrapping Unicode strings. I'm sure diff --git a/Lib/textwrap.py b/Lib/textwrap.py index ccff2ab..e49644d 100644 --- a/Lib/textwrap.py +++ b/Lib/textwrap.py @@ -63,6 +63,8 @@ class TextWrapper: break_long_words (default: true) Break words longer than 'width'. If false, those words will not 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)) @@ -98,7 +100,8 @@ class TextWrapper: expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, - break_long_words=True): + break_long_words=True, + drop_whitespace=True): self.width = width self.initial_indent = initial_indent self.subsequent_indent = subsequent_indent @@ -106,6 +109,7 @@ class TextWrapper: self.replace_whitespace = replace_whitespace self.fix_sentence_endings = fix_sentence_endings self.break_long_words = break_long_words + self.drop_whitespace = drop_whitespace # -- Private methods ----------------------------------------------- @@ -140,7 +144,7 @@ class TextWrapper: 'use', ' ', 'the', ' ', '-b', ' ', 'option!' """ chunks = self.wordsep_re.split(text) - chunks = filter(None, chunks) + chunks = filter(None, chunks) # remove empty chunks return chunks def _fix_sentence_endings(self, chunks): @@ -228,7 +232,7 @@ class TextWrapper: # First chunk on line is whitespace -- drop it, unless this # 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] while chunks: @@ -249,7 +253,7 @@ class TextWrapper: self._handle_long_word(chunks, cur_line, cur_len, width) # 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] # Convert current line back to a string and store it in list diff --git a/Misc/NEWS b/Misc/NEWS index d29fe4e..52c3c81 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -168,6 +168,9 @@ Core and builtins Library ------- +- Patch #1581073: add a flag to textwrap that prevents the dropping of + whitespace while wrapping. + - Patch #1603688: ConfigParser.SafeConfigParser now checks values that are set for invalid interpolation sequences that would lead to errors on reading back those values. -- cgit v0.12