]> granicus.if.org Git - python/commitdiff
Add fix_sentence_endings option to control whether we ensure that
authorGreg Ward <gward@python.net>
Fri, 7 Jun 2002 21:56:16 +0000 (21:56 +0000)
committerGreg Ward <gward@python.net>
Fri, 7 Jun 2002 21:56:16 +0000 (21:56 +0000)
sentences are separated by two spaces.

Improve _fix_sentence_endings() a bit -- look for ".!?" instead of just
".", and factor out the list of sentence-ending punctuation characters
to a class attribute.

Lib/textwrap.py

index 355c4698f9bd38d9453f196b07f648b4ece5cb28..ef6c372ce51301518282de14c62a0070173ac33d 100644 (file)
@@ -22,20 +22,23 @@ class TextWrapper:
 
     Several instance attributes control various aspects of
     wrapping:
-      expand_tabs
-        if true (default), tabs in input text will be expanded
-        to spaces before further processing.  Each tab will
-        become 1 .. 8 spaces, depending on its position in its line.
-        If false, each tab is treated as a single character.
-      replace_whitespace
-        if true (default), all whitespace characters in the input
-        text are replaced by spaces after tab expansion.  Note
-        that expand_tabs is false and replace_whitespace is true,
-        every tab will be converted to a single space!
-      break_long_words
-        if true (default), words longer than the line width constraint
-        will be broken.  If false, those words will not be broken,
-        and some lines might be longer than the width constraint.
+      expand_tabs (default: true)
+        Expand tabs in input text to spaces before further processing.
+        Each tab will become 1 .. 8 spaces, depending on its position in
+        its line.  If false, each tab is treated as a single character.
+      replace_whitespace (default: true)
+        Replace all whitespace characters in the input text by spaces
+        after tab expansion.  Note that if expand_tabs is false and
+        replace_whitespace is true, every tab will be converted to a
+        single space!
+      fix_sentence_endings (default: false)
+        Ensure that sentence-ending punctuation is always followed
+        by two spaces.  Off by default becaus the algorithm is
+        (unavoidably) imperfect.
+      break_long_words (default: true)
+        Break words longer than the line width constraint.  If false,
+        those words will not be broken, and some lines might be longer
+        than the width constraint.
     """
 
     whitespace_trans = string.maketrans(string.whitespace,
@@ -51,10 +54,14 @@ class TextWrapper:
                             r'\w{2,}-(?=\w{2,})|'     # hyphenated words
                             r'(?<=\w)-{2,}(?=\w))')   # em-dash
 
+    # Punctuation characters found at the end of a sentence.
+    sentence_end = ".?!"
+
 
     def __init__ (self):
         self.expand_tabs = 1
         self.replace_whitespace = 1
+        self.fix_sentence_endings = 0
         self.break_long_words = 1
         
 
@@ -100,10 +107,11 @@ class TextWrapper:
         space to two.
         """
         i = 0
+        punct = self.sentence_end
         while i < len(chunks)-1:
             # chunks[i] looks like the last word of a sentence,
             # and it's followed by a single space.
-            if (chunks[i][-1] == "." and
+            if (chunks[i][-1] in punct and
                   chunks[i+1] == " " and
                   islower(chunks[i][-2])):
                 chunks[i+1] = "  "
@@ -207,7 +215,8 @@ class TextWrapper:
         if len(text) <= width:
             return [text]
         chunks = self._split(text)
-        self._fix_sentence_endings(chunks)
+        if self.fix_sentence_endings:
+            self._fix_sentence_endings(chunks)
         return self._wrap_chunks(chunks, width)
 
     def fill (self, text, width, initial_tab="", subsequent_tab=""):