:mod:`textwrap` --- Text wrapping and filling
=============================================

.. module:: textwrap
   :synopsis: Text wrapping and filling

.. moduleauthor:: Greg Ward <gward@python.net>
.. sectionauthor:: Greg Ward <gward@python.net>

**Source code:** :source:`Lib/textwrap.py`

--------------

The :mod:`textwrap` module provides some convenience functions,
as well as :class:`TextWrapper`, the class that does all the work.
If you're just wrapping or filling one or two text strings, the convenience
functions should be good enough; otherwise, you should use an instance of
:class:`TextWrapper` for efficiency.

.. function:: wrap(text, width=70, **kwargs)

   Wraps the single paragraph in *text* (a string) so every line is at most
   *width* characters long.  Returns a list of output lines, without final
   newlines.

   Optional keyword arguments correspond to the instance attributes of
   :class:`TextWrapper`, documented below.  *width* defaults to ``70``.

   See the :meth:`TextWrapper.wrap` method for additional details on how
   :func:`wrap` behaves.


.. function:: fill(text, width=70, **kwargs)

   Wraps the single paragraph in *text*, and returns a single string containing the
   wrapped paragraph.  :func:`fill` is shorthand for  ::

      "\n".join(wrap(text, ...))

   In particular, :func:`fill` accepts exactly the same keyword arguments as
   :func:`wrap`.


.. function:: shorten(text, width, **kwargs)

   Collapse and truncate the given *text* to fit in the given *width*.

   First the whitespace in *text* is collapsed (all whitespace is replaced by
   single spaces).  If the result fits in the *width*, it is returned.
   Otherwise, enough words are dropped from the end so that the remaining words
   plus the :attr:`placeholder` fit within :attr:`width`::

      >>> textwrap.shorten("Hello  world!", width=12)
      'Hello world!'
      >>> textwrap.shorten("Hello  world!", width=11)
      'Hello [...]'
      >>> textwrap.shorten("Hello world", width=10, placeholder="...")
      'Hello...'

   Optional keyword arguments correspond to the instance attributes of
   :class:`TextWrapper`, documented below.  Note that the whitespace is
   collapsed before the text is passed to the :class:`TextWrapper` :meth:`fill`
   function, so changing the value of :attr:`.tabsize`, :attr:`.expand_tabs`,
   :attr:`.drop_whitespace`, and :attr:`.replace_whitespace` will have no effect.

   .. versionadded:: 3.4


.. function:: dedent(text)

   Remove any common leading whitespace from every line in *text*.

   This can be used to make triple-quoted strings line up with the left edge of the
   display, while still presenting them in the source code in indented form.

   Note that tabs and spaces are both treated as whitespace, but they are not
   equal: the lines ``"  hello"`` and ``"\thello"`` are considered to have no
   common leading whitespace.

   For example::

      def test():
          # end first line with \ to avoid the empty line!
          s = '''\
          hello
            world
          '''
          print(repr(s))          # prints '    hello\n      world\n    '
          print(repr(dedent(s)))  # prints 'hello\n  world\n'


.. function:: indent(text, prefix, predicate=None)

   Add *prefix* to the beginning of selected lines in *text*.

   Lines are separated by calling ``text.splitlines(True)``.

   By default, *prefix* is added to all lines that do not consist
   solely of whitespace (including any line endings).

   For example::

      >>> s = 'hello\n\n \nworld'
      >>> indent(s, '  ')
      '  hello\n\n \n  world'

   The optional *predicate* argument can be used to control which lines
   are indented. For example, it is easy to add *prefix* to even empty
   and whitespace-only lines::

      >>> print(indent(s, '+ ', lambda line: True))
      + hello
      +
      +
      + world

   .. versionadded:: 3.3


:func:`wrap`, :func:`fill` and :func:`shorten` work by creating a
:class:`TextWrapper` instance and calling a single method on it.  That
instance is not reused, so for applications that process many text
strings using :func:`wrap` and/or :func:`fill`, it may be more efficient to
create your own :class:`TextWrapper` object.

Text is preferably wrapped on whitespaces and right after the hyphens in
hyphenated words; only then will long words be broken if necessary, unless
:attr:`TextWrapper.break_long_words` is set to false.

.. class:: TextWrapper(**kwargs)

   The :class:`TextWrapper` constructor accepts a number of optional keyword
   arguments.  Each keyword argument corresponds to an instance attribute, so
   for example ::

      wrapper = TextWrapper(initial_indent="* ")

   is the same as  ::

      wrapper = TextWrapper()
      wrapper.initial_indent = "* "

   You can re-use the same :class:`TextWrapper` object many times, and you can
   change any of its options through direct assignment to instance attributes
   between uses.

   The :class:`TextWrapper` instance attributes (and keyword arguments to the
   constructor) are as follows:


   .. attribute:: width

      (default: ``70``) The maximum length of wrapped lines.  As long as there
      are no individual words in the input text longer than :attr:`width`,
      :class:`TextWrapper` guarantees that no output line will be longer than
      :attr:`width` characters.


   .. attribute:: expand_tabs

      (default: ``True``) If true, then all tab characters in *text* will be
      expanded to spaces using the :meth:`expandtabs` method of *text*.


   .. attribute:: tabsize

      (default: ``8``) If :attr:`expand_tabs` is true, then all tab characters
      in *text* will be expanded to zero or more spaces, depending on the
      current column and the given tab size.

      .. versionadded:: 3.3


   .. attribute:: replace_whitespace

      (default: ``True``) If true, after tab expansion but before wrapping,
      the :meth:`wrap` method will replace each whitespace character
      with a single space.  The whitespace characters replaced are
      as follows: tab, newline, vertical tab, formfeed, and carriage
      return (``'\t\n\v\f\r'``).

      .. note::

         If :attr:`expand_tabs` is false and :attr:`replace_whitespace` is true,
         each tab character will be replaced by a single space, which is *not*
         the same as tab expansion.

      .. note::

         If :attr:`replace_whitespace` is false, newlines may appear in the
         middle of a line and cause strange output. For this reason, text should
         be split into paragraphs (using :meth:`str.splitlines` or similar)
         which are wrapped separately.


   .. attribute:: drop_whitespace

      (default: ``True``) If true, whitespace at the beginning and ending of
      every line (after wrapping but before indenting) is dropped.
      Whitespace at the beginning of the paragraph, however, is not dropped
      if non-whitespace follows it.  If whitespace being dropped takes up an
      entire line, the whole line is dropped.


   .. attribute:: initial_indent

      (default: ``''``) String that will be prepended to the first line of
      wrapped output.  Counts towards the length of the first line.  The empty
      string is not indented.


   .. attribute:: subsequent_indent

      (default: ``''``) String that will be prepended to all lines of wrapped
      output except the first.  Counts towards the length of each line except
      the first.


   .. attribute:: fix_sentence_endings

      (default: ``False``) If true, :class:`TextWrapper` attempts to detect
      sentence endings and ensure that sentences are always separated by exactly
      two spaces.  This is generally desired for text in a monospaced font.
      However, the sentence detection algorithm is imperfect: it assumes that a
      sentence ending consists of a lowercase letter followed by one of ``'.'``,
      ``'!'``, or ``'?'``, possibly followed by one of ``'"'`` or ``"'"``,
      followed by a space.  One problem with this is algorithm is that it is
      unable to detect the difference between "Dr." in ::

         [...] Dr. Frankenstein's monster [...]

      and "Spot." in ::

         [...] See Spot. See Spot run [...]

      :attr:`fix_sentence_endings` is false by default.

      Since the sentence detection algorithm relies on ``string.lowercase`` for
      the definition of "lowercase letter," and a convention of using two spaces
      after a period to separate sentences on the same line, it is specific to
      English-language texts.


   .. attribute:: break_long_words

      (default: ``True``) If true, then words longer than :attr:`width` will be
      broken in order to ensure that no lines are longer than :attr:`width`.  If
      it is false, long words will not be broken, and some lines may be longer
      than :attr:`width`.  (Long words will be put on a line by themselves, in
      order to minimize the amount by which :attr:`width` is exceeded.)


   .. attribute:: break_on_hyphens

      (default: ``True``) If true, wrapping will occur preferably on whitespaces
      and right after hyphens in compound words, as it is customary in English.
      If false, only whitespaces will be considered as potentially good places
      for line breaks, but you need to set :attr:`break_long_words` to false if
      you want truly insecable words.  Default behaviour in previous versions
      was to always allow breaking hyphenated words.


   .. attribute:: max_lines

      (default: ``None``) If not ``None``, then the output will contain at most
      *max_lines* lines, with *placeholder* appearing at the end of the output.

      .. versionadded:: 3.4


   .. attribute:: placeholder

      (default: ``' [...]'``) String that will appear at the end of the output
      text if it has been truncated.

      .. versionadded:: 3.4


   :class:`TextWrapper` also provides some public methods, analogous to the
   module-level convenience functions:

   .. method:: wrap(text)

      Wraps the single paragraph in *text* (a string) so every line is at most
      :attr:`width` characters long.  All wrapping options are taken from
      instance attributes of the :class:`TextWrapper` instance.  Returns a list
      of output lines, without final newlines.  If the wrapped output has no
      content, the returned list is empty.


   .. method:: fill(text)

      Wraps the single paragraph in *text*, and returns a single string
      containing the wrapped paragraph.
