buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/writers/__init__.py
author wbernard
Wed, 23 Dec 2009 19:29:07 +0200
changeset 179 d8ac696cc51f
permissions -rw-r--r--
helium_7.0-r14027
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
179
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     1
# $Id: __init__.py 4913 2007-02-12 04:05:20Z goodger $
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     2
# Author: David Goodger <goodger@python.org>
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     3
# Copyright: This module has been placed in the public domain.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     4
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     5
"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     6
This package contains Docutils Writer modules.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     7
"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     8
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     9
__docformat__ = 'reStructuredText'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    10
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    11
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    12
import os.path
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    13
import docutils
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    14
from docutils import languages, Component
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    15
from docutils.transforms import universal
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    16
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    17
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    18
class Writer(Component):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    19
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    20
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    21
    Abstract base class for docutils Writers.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    22
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    23
    Each writer module or package must export a subclass also called 'Writer'.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    24
    Each writer must support all standard node types listed in
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    25
    `docutils.nodes.node_class_names`.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    26
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    27
    The `write()` method is the main entry point.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    28
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    29
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    30
    component_type = 'writer'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    31
    config_section = 'writers'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    32
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    33
    def get_transforms(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    34
        return Component.get_transforms(self) + [
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    35
            universal.Messages,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    36
            universal.FilterMessages,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    37
            universal.StripClassesAndElements,]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    38
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    39
    document = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    40
    """The document to write (Docutils doctree); set by `write`."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    41
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    42
    output = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    43
    """Final translated form of `document` (Unicode string for text, binary
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    44
    string for other forms); set by `translate`."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    45
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    46
    language = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    47
    """Language module for the document; set by `write`."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    48
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    49
    destination = None
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    50
    """`docutils.io` Output object; where to write the document.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    51
    Set by `write`."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    52
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    53
    def __init__(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    54
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    55
        # Currently only used by HTML writer for output fragments:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    56
        self.parts = {}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    57
        """Mapping of document part names to fragments of `self.output`.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    58
        Values are Unicode strings; encoding is up to the client.  The 'whole'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    59
        key should contain the entire document output.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    60
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    61
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    62
    def write(self, document, destination):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    63
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    64
        Process a document into its final form.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    65
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    66
        Translate `document` (a Docutils document tree) into the Writer's
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    67
        native format, and write it out to its `destination` (a
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    68
        `docutils.io.Output` subclass object).
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    69
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    70
        Normally not overridden or extended in subclasses.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    71
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    72
        self.document = document
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    73
        self.language = languages.get_language(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    74
            document.settings.language_code)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    75
        self.destination = destination
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    76
        self.translate()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    77
        output = self.destination.write(self.output)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    78
        return output
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    79
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    80
    def translate(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    81
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    82
        Do final translation of `self.document` into `self.output`.  Called
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    83
        from `write`.  Override in subclasses.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    84
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    85
        Usually done with a `docutils.nodes.NodeVisitor` subclass, in
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    86
        combination with a call to `docutils.nodes.Node.walk()` or
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    87
        `docutils.nodes.Node.walkabout()`.  The ``NodeVisitor`` subclass must
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    88
        support all standard elements (listed in
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    89
        `docutils.nodes.node_class_names`) and possibly non-standard elements
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    90
        used by the current Reader as well.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    91
        """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    92
        raise NotImplementedError('subclass must override this method')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    93
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    94
    def assemble_parts(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    95
        """Assemble the `self.parts` dictionary.  Extend in subclasses."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    96
        self.parts['whole'] = self.output
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    97
        self.parts['encoding'] = self.document.settings.output_encoding
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    98
        self.parts['version'] = docutils.__version__
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    99
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   100
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   101
class UnfilteredWriter(Writer):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   102
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   103
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   104
    A writer that passes the document tree on unchanged (e.g. a
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   105
    serializer.)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   106
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   107
    Documents written by UnfilteredWriters are typically reused at a
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   108
    later date using a subclass of `readers.ReReader`.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   109
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   110
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   111
    def get_transforms(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   112
        # Do not add any transforms.  When the document is reused
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   113
        # later, the then-used writer will add the appropriate
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   114
        # transforms.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   115
        return Component.get_transforms(self)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   116
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   117
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   118
_writer_aliases = {
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   119
      'html': 'html4css1',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   120
      'latex': 'latex2e',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   121
      'pprint': 'pseudoxml',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   122
      'pformat': 'pseudoxml',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   123
      'pdf': 'rlpdf',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   124
      'xml': 'docutils_xml',
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   125
      's5': 's5_html'}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   126
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   127
def get_writer_class(writer_name):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   128
    """Return the Writer class from the `writer_name` module."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   129
    writer_name = writer_name.lower()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   130
    if _writer_aliases.has_key(writer_name):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   131
        writer_name = _writer_aliases[writer_name]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   132
    module = __import__(writer_name, globals(), locals())
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   133
    return module.Writer