:mod:`formatter` --- Generic output formatting
==============================================

.. module:: formatter
   :synopsis: Generic output formatter and device interface.
   :deprecated:

.. deprecated:: 3.4
   Due to lack of usage, the formatter module has been deprecated.

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

This module supports two interface definitions, each with multiple
implementations: The *formatter* interface, and the *writer* interface which is
required by the formatter interface.

Formatter objects transform an abstract flow of formatting events into specific
output events on writer objects.  Formatters manage several stack structures to
allow various properties of a writer object to be changed and restored; writers
need not be able to handle relative changes nor any sort of "change back"
operation.  Specific writer properties which may be controlled via formatter
objects are horizontal alignment, font, and left margin indentations.  A
mechanism is provided which supports providing arbitrary, non-exclusive style
settings to a writer as well.  Additional interfaces facilitate formatting
events which are not reversible, such as paragraph separation.

Writer objects encapsulate device interfaces.  Abstract devices, such as file
formats, are supported as well as physical devices.  The provided
implementations all work with abstract devices.  The interface makes available
mechanisms for setting the properties which formatter objects manage and
inserting data into the output.


.. _formatter-interface:

The Formatter Interface
-----------------------

Interfaces to create formatters are dependent on the specific formatter class
being instantiated.  The interfaces described below are the required interfaces
which all formatters must support once initialized.

One data element is defined at the module level:


.. data:: AS_IS

   Value which can be used in the font specification passed to the ``push_font()``
   method described below, or as the new value to any other ``push_property()``
   method.  Pushing the ``AS_IS`` value allows the corresponding ``pop_property()``
   method to be called without having to track whether the property was changed.

The following attributes are defined for formatter instance objects:


.. attribute:: formatter.writer

   The writer instance with which the formatter interacts.


.. method:: formatter.end_paragraph(blanklines)

   Close any open paragraphs and insert at least *blanklines* before the next
   paragraph.


.. method:: formatter.add_line_break()

   Add a hard line break if one does not already exist.  This does not break the
   logical paragraph.


.. method:: formatter.add_hor_rule(*args, **kw)

   Insert a horizontal rule in the output.  A hard break is inserted if there is
   data in the current paragraph, but the logical paragraph is not broken.  The
   arguments and keywords are passed on to the writer's :meth:`send_line_break`
   method.


.. method:: formatter.add_flowing_data(data)

   Provide data which should be formatted with collapsed whitespace. Whitespace
   from preceding and successive calls to :meth:`add_flowing_data` is considered as
   well when the whitespace collapse is performed.  The data which is passed to
   this method is expected to be word-wrapped by the output device.  Note that any
   word-wrapping still must be performed by the writer object due to the need to
   rely on device and font information.


.. method:: formatter.add_literal_data(data)

   Provide data which should be passed to the writer unchanged. Whitespace,
   including newline and tab characters, are considered legal in the value of
   *data*.


.. method:: formatter.add_label_data(format, counter)

   Insert a label which should be placed to the left of the current left margin.
   This should be used for constructing bulleted or numbered lists.  If the
   *format* value is a string, it is interpreted as a format specification for
   *counter*, which should be an integer. The result of this formatting becomes the
   value of the label; if *format* is not a string it is used as the label value
   directly. The label value is passed as the only argument to the writer's
   :meth:`send_label_data` method.  Interpretation of non-string label values is
   dependent on the associated writer.

   Format specifications are strings which, in combination with a counter value,
   are used to compute label values.  Each character in the format string is copied
   to the label value, with some characters recognized to indicate a transform on
   the counter value.  Specifically, the character ``'1'`` represents the counter
   value formatter as an Arabic number, the characters ``'A'`` and ``'a'``
   represent alphabetic representations of the counter value in upper and lower
   case, respectively, and ``'I'`` and ``'i'`` represent the counter value in Roman
   numerals, in upper and lower case.  Note that the alphabetic and roman
   transforms require that the counter value be greater than zero.


.. method:: formatter.flush_softspace()

   Send any pending whitespace buffered from a previous call to
   :meth:`add_flowing_data` to the associated writer object.  This should be called
   before any direct manipulation of the writer object.


.. method:: formatter.push_alignment(align)

   Push a new alignment setting onto the alignment stack.  This may be
   :const:`AS_IS` if no change is desired.  If the alignment value is changed from
   the previous setting, the writer's :meth:`new_alignment` method is called with
   the *align* value.


.. method:: formatter.pop_alignment()

   Restore the previous alignment.


.. method:: formatter.push_font((size, italic, bold, teletype))

   Change some or all font properties of the writer object.  Properties which are
   not set to :const:`AS_IS` are set to the values passed in while others are
   maintained at their current settings.  The writer's :meth:`new_font` method is
   called with the fully resolved font specification.


.. method:: formatter.pop_font()

   Restore the previous font.


.. method:: formatter.push_margin(margin)

   Increase the number of left margin indentations by one, associating the logical
   tag *margin* with the new indentation.  The initial margin level is ``0``.
   Changed values of the logical tag must be true values; false values other than
   :const:`AS_IS` are not sufficient to change the margin.


.. method:: formatter.pop_margin()

   Restore the previous margin.


.. method:: formatter.push_style(*styles)

   Push any number of arbitrary style specifications.  All styles are pushed onto
   the styles stack in order.  A tuple representing the entire stack, including
   :const:`AS_IS` values, is passed to the writer's :meth:`new_styles` method.


.. method:: formatter.pop_style(n=1)

   Pop the last *n* style specifications passed to :meth:`push_style`.  A tuple
   representing the revised stack, including :const:`AS_IS` values, is passed to
   the writer's :meth:`new_styles` method.


.. method:: formatter.set_spacing(spacing)

   Set the spacing style for the writer.


.. method:: formatter.assert_line_data(flag=1)

   Inform the formatter that data has been added to the current paragraph
   out-of-band.  This should be used when the writer has been manipulated
   directly.  The optional *flag* argument can be set to false if the writer
   manipulations produced a hard line break at the end of the output.


.. _formatter-impls:

Formatter Implementations
-------------------------

Two implementations of formatter objects are provided by this module. Most
applications may use one of these classes without modification or subclassing.


.. class:: NullFormatter(writer=None)

   A formatter which does nothing.  If *writer* is omitted, a :class:`NullWriter`
   instance is created.  No methods of the writer are called by
   :class:`NullFormatter` instances.  Implementations should inherit from this
   class if implementing a writer interface but don't need to inherit any
   implementation.


.. class:: AbstractFormatter(writer)

   The standard formatter.  This implementation has demonstrated wide applicability
   to many writers, and may be used directly in most circumstances.  It has been
   used to implement a full-featured World Wide Web browser.


.. _writer-interface:

The Writer Interface
--------------------

Interfaces to create writers are dependent on the specific writer class being
instantiated.  The interfaces described below are the required interfaces which
all writers must support once initialized. Note that while most applications can
use the :class:`AbstractFormatter` class as a formatter, the writer must
typically be provided by the application.


.. method:: writer.flush()

   Flush any buffered output or device control events.


.. method:: writer.new_alignment(align)

   Set the alignment style.  The *align* value can be any object, but by convention
   is a string or ``None``, where ``None`` indicates that the writer's "preferred"
   alignment should be used. Conventional *align* values are ``'left'``,
   ``'center'``, ``'right'``, and ``'justify'``.


.. method:: writer.new_font(font)

   Set the font style.  The value of *font* will be ``None``, indicating that the
   device's default font should be used, or a tuple of the form ``(size,
   italic, bold, teletype)``.  Size will be a string indicating the size of
   font that should be used; specific strings and their interpretation must be
   defined by the application.  The *italic*, *bold*, and *teletype* values are
   Boolean values specifying which of those font attributes should be used.


.. method:: writer.new_margin(margin, level)

   Set the margin level to the integer *level* and the logical tag to *margin*.
   Interpretation of the logical tag is at the writer's discretion; the only
   restriction on the value of the logical tag is that it not be a false value for
   non-zero values of *level*.


.. method:: writer.new_spacing(spacing)

   Set the spacing style to *spacing*.


.. method:: writer.new_styles(styles)

   Set additional styles.  The *styles* value is a tuple of arbitrary values; the
   value :const:`AS_IS` should be ignored.  The *styles* tuple may be interpreted
   either as a set or as a stack depending on the requirements of the application
   and writer implementation.


.. method:: writer.send_line_break()

   Break the current line.


.. method:: writer.send_paragraph(blankline)

   Produce a paragraph separation of at least *blankline* blank lines, or the
   equivalent.  The *blankline* value will be an integer.  Note that the
   implementation will receive a call to :meth:`send_line_break` before this call
   if a line break is needed;  this method should not include ending the last line
   of the paragraph. It is only responsible for vertical spacing between
   paragraphs.


.. method:: writer.send_hor_rule(*args, **kw)

   Display a horizontal rule on the output device.  The arguments to this method
   are entirely application- and writer-specific, and should be interpreted with
   care.  The method implementation may assume that a line break has already been
   issued via :meth:`send_line_break`.


.. method:: writer.send_flowing_data(data)

   Output character data which may be word-wrapped and re-flowed as needed.  Within
   any sequence of calls to this method, the writer may assume that spans of
   multiple whitespace characters have been collapsed to single space characters.


.. method:: writer.send_literal_data(data)

   Output character data which has already been formatted for display.  Generally,
   this should be interpreted to mean that line breaks indicated by newline
   characters should be preserved and no new line breaks should be introduced.  The
   data may contain embedded newline and tab characters, unlike data provided to
   the :meth:`send_formatted_data` interface.


.. method:: writer.send_label_data(data)

   Set *data* to the left of the current left margin, if possible. The value of
   *data* is not restricted; treatment of non-string values is entirely
   application- and writer-dependent.  This method will only be called at the
   beginning of a line.


.. _writer-impls:

Writer Implementations
----------------------

Three implementations of the writer object interface are provided as examples by
this module.  Most applications will need to derive new writer classes from the
:class:`NullWriter` class.


.. class:: NullWriter()

   A writer which only provides the interface definition; no actions are taken on
   any methods.  This should be the base class for all writers which do not need to
   inherit any implementation methods.


.. class:: AbstractWriter()

   A writer which can be used in debugging formatters, but not much else.  Each
   method simply announces itself by printing its name and arguments on standard
   output.


.. class:: DumbWriter(file=None, maxcol=72)

   Simple writer class which writes output on the :term:`file object` passed
   in as *file* or, if *file* is omitted, on standard output.  The output is
   simply word-wrapped to the number of columns specified by *maxcol*.  This
   class is suitable for reflowing a sequence of paragraphs.

