]> granicus.if.org Git - python/commitdiff
Patch #1581073: add a flag to textwrap that prevents the dropping of
authorGeorg Brandl <georg@python.org>
Tue, 13 Mar 2007 18:15:41 +0000 (18:15 +0000)
committerGeorg Brandl <georg@python.org>
Tue, 13 Mar 2007 18:15:41 +0000 (18:15 +0000)
whitespace while wrapping.

Doc/lib/libtextwrap.tex
Lib/test/test_textwrap.py
Lib/textwrap.py
Misc/NEWS

index 38f9b03f9e463351465c606a30583a84098fed5a..fcf339dae121d3c92dbba22e5d4114c2585892c8 100644 (file)
@@ -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.
index 500eceb183820c4d1d873ddec096bc34d6816def..5f0b51b4e7f69752684938a09da08d00e4bbd102 100644 (file)
@@ -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
index ccff2aba1287b61ca96918c8be631f6f0305ddbf..e49644d22141ebd5e6fce1d31750ca60b0a17d66 100644 (file)
@@ -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
index d29fe4e78ba96ac94c82e4ae6a24b05e28036475..52c3c81dee75edadfb77ec3ee3b3abc38c815439 100644 (file)
--- 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.