buildframework/helium/external/python/lib/common/docutils-0.5-py2.5.egg/docutils/parsers/rst/directives/misc.py
author lorewang
Wed, 01 Dec 2010 16:05:36 +0800
changeset 715 e0739b8406dd
parent 179 d8ac696cc51f
permissions -rw-r--r--
Specify extenal tool with path
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
179
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     1
# $Id: misc.py 5015 2007-03-12 20:25:40Z wiemann $
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     2
# Authors: David Goodger <goodger@python.org>; Dethe Elza
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
"""Miscellaneous directives."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     6
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     7
__docformat__ = 'reStructuredText'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     8
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     9
import sys
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    10
import os.path
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    11
import re
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    12
import time
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    13
from docutils import io, nodes, statemachine, utils
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    14
from docutils.parsers.rst import Directive, convert_directive_function
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    15
from docutils.parsers.rst import directives, roles, states
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    16
from docutils.transforms import misc
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    17
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    18
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    19
class Include(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    20
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    21
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    22
    Include content read from a separate source file.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    23
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    24
    Content may be parsed by the parser, or included as a literal
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    25
    block.  The encoding of the included file can be specified.  Only
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    26
    a part of the given file argument may be included by specifying
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    27
    text to match before and/or after the text to be used.
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
    required_arguments = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    31
    optional_arguments = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    32
    final_argument_whitespace = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    33
    option_spec = {'literal': directives.flag,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    34
                   'encoding': directives.encoding,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    35
                   'start-after': directives.unchanged_required,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    36
                   'end-before': directives.unchanged_required}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    37
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    38
    standard_include_path = os.path.join(os.path.dirname(states.__file__),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    39
                                         'include')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    40
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    41
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    42
        """Include a reST file as part of the content of this reST file."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    43
        if not self.state.document.settings.file_insertion_enabled:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    44
            raise self.warning('"%s" directive disabled.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    45
        source = self.state_machine.input_lines.source(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    46
            self.lineno - self.state_machine.input_offset - 1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    47
        source_dir = os.path.dirname(os.path.abspath(source))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    48
        path = directives.path(self.arguments[0])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    49
        if path.startswith('<') and path.endswith('>'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    50
            path = os.path.join(self.standard_include_path, path[1:-1])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    51
        path = os.path.normpath(os.path.join(source_dir, path))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    52
        path = utils.relative_path(None, path)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    53
        encoding = self.options.get(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    54
            'encoding', self.state.document.settings.input_encoding)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    55
        try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    56
            self.state.document.settings.record_dependencies.add(path)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    57
            include_file = io.FileInput(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    58
                source_path=path, encoding=encoding,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    59
                error_handler=(self.state.document.settings.\
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    60
                               input_encoding_error_handler),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    61
                handle_io_errors=None)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    62
        except IOError, error:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    63
            raise self.severe('Problems with "%s" directive path:\n%s: %s.'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    64
                              % (self.name, error.__class__.__name__, error))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    65
        try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    66
            include_text = include_file.read()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    67
        except UnicodeError, error:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    68
            raise self.severe(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    69
                'Problem with "%s" directive:\n%s: %s'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    70
                % (self.name, error.__class__.__name__, error))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    71
        # start-after/end-before: no restrictions on newlines in match-text,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    72
        # and no restrictions on matching inside lines vs. line boundaries
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    73
        after_text = self.options.get('start-after', None)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    74
        if after_text:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    75
            # skip content in include_text before *and incl.* a matching text
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    76
            after_index = include_text.find(after_text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    77
            if after_index < 0:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    78
                raise self.severe('Problem with "start-after" option of "%s" '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    79
                                  'directive:\nText not found.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    80
            include_text = include_text[after_index + len(after_text):]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    81
        before_text = self.options.get('end-before', None)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    82
        if before_text:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    83
            # skip content in include_text after *and incl.* a matching text
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    84
            before_index = include_text.find(before_text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    85
            if before_index < 0:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    86
                raise self.severe('Problem with "end-before" option of "%s" '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    87
                                  'directive:\nText not found.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    88
            include_text = include_text[:before_index]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    89
        if self.options.has_key('literal'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    90
            literal_block = nodes.literal_block(include_text, include_text,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    91
                                                source=path)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    92
            literal_block.line = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    93
            return [literal_block]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    94
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    95
            include_lines = statemachine.string2lines(include_text,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    96
                                                      convert_whitespace=1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    97
            self.state_machine.insert_input(include_lines, path)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    98
            return []
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 Raw(Directive):
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
    Pass through content unchanged
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   105
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   106
    Content is included in output based on type argument
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   107
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   108
    Content may be included inline (content section of directive) or
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   109
    imported from a file or url.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   110
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   111
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   112
    required_arguments = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   113
    optional_arguments = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   114
    final_argument_whitespace = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   115
    option_spec = {'file': directives.path,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   116
                   'url': directives.uri,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   117
                   'encoding': directives.encoding}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   118
    has_content = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   119
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   120
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   121
        if (not self.state.document.settings.raw_enabled
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   122
            or (not self.state.document.settings.file_insertion_enabled
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   123
                and (self.options.has_key('file')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   124
                     or self.options.has_key('url')))):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   125
            raise self.warning('"%s" directive disabled.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   126
        attributes = {'format': ' '.join(self.arguments[0].lower().split())}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   127
        encoding = self.options.get(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   128
            'encoding', self.state.document.settings.input_encoding)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   129
        if self.content:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   130
            if self.options.has_key('file') or self.options.has_key('url'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   131
                raise self.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   132
                    '"%s" directive may not both specify an external file '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   133
                    'and have content.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   134
            text = '\n'.join(self.content)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   135
        elif self.options.has_key('file'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   136
            if self.options.has_key('url'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   137
                raise self.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   138
                    'The "file" and "url" options may not be simultaneously '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   139
                    'specified for the "%s" directive.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   140
            source_dir = os.path.dirname(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   141
                os.path.abspath(self.state.document.current_source))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   142
            path = os.path.normpath(os.path.join(source_dir,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   143
                                                 self.options['file']))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   144
            path = utils.relative_path(None, path)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   145
            try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   146
                self.state.document.settings.record_dependencies.add(path)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   147
                raw_file = io.FileInput(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   148
                    source_path=path, encoding=encoding,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   149
                    error_handler=(self.state.document.settings.\
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   150
                                   input_encoding_error_handler),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   151
                    handle_io_errors=None)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   152
            except IOError, error:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   153
                raise self.severe('Problems with "%s" directive path:\n%s.'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   154
                                  % (self.name, error))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   155
            try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   156
                text = raw_file.read()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   157
            except UnicodeError, error:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   158
                raise self.severe(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   159
                    'Problem with "%s" directive:\n%s: %s'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   160
                    % (self.name, error.__class__.__name__, error))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   161
            attributes['source'] = path
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   162
        elif self.options.has_key('url'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   163
            source = self.options['url']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   164
            # Do not import urllib2 at the top of the module because
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   165
            # it may fail due to broken SSL dependencies, and it takes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   166
            # about 0.15 seconds to load.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   167
            import urllib2
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   168
            try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   169
                raw_text = urllib2.urlopen(source).read()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   170
            except (urllib2.URLError, IOError, OSError), error:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   171
                raise self.severe(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   172
                    'Problems with "%s" directive URL "%s":\n%s.'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   173
                    % (self.name, self.options['url'], error))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   174
            raw_file = io.StringInput(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   175
                source=raw_text, source_path=source, encoding=encoding,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   176
                error_handler=(self.state.document.settings.\
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   177
                               input_encoding_error_handler))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   178
            try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   179
                text = raw_file.read()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   180
            except UnicodeError, error:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   181
                raise self.severe(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   182
                    'Problem with "%s" directive:\n%s: %s'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   183
                    % (self.name, error.__class__.__name__, error))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   184
            attributes['source'] = source
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   185
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   186
            # This will always fail because there is no content.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   187
            self.assert_has_content()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   188
        raw_node = nodes.raw('', text, **attributes)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   189
        return [raw_node]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   190
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   191
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   192
class Replace(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   193
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   194
    has_content = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   195
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   196
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   197
        if not isinstance(self.state, states.SubstitutionDef):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   198
            raise self.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   199
                'Invalid context: the "%s" directive can only be used within '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   200
                'a substitution definition.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   201
        self.assert_has_content()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   202
        text = '\n'.join(self.content)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   203
        element = nodes.Element(text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   204
        self.state.nested_parse(self.content, self.content_offset,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   205
                                element)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   206
        if ( len(element) != 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   207
             or not isinstance(element[0], nodes.paragraph)):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   208
            messages = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   209
            for node in element:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   210
                if isinstance(node, nodes.system_message):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   211
                    node['backrefs'] = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   212
                    messages.append(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   213
            error = self.state_machine.reporter.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   214
                'Error in "%s" directive: may contain a single paragraph '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   215
                'only.' % (self.name), line=self.lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   216
            messages.append(error)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   217
            return messages
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   218
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   219
            return element[0].children
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   220
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   221
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   222
class Unicode(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   223
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   224
    r"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   225
    Convert Unicode character codes (numbers) to characters.  Codes may be
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   226
    decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   227
    ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   228
    entities (e.g. ``&#x262E;``).  Text following ".." is a comment and is
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   229
    ignored.  Spaces are ignored, and any other text remains as-is.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   230
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   231
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   232
    required_arguments = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   233
    optional_arguments = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   234
    final_argument_whitespace = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   235
    option_spec = {'trim': directives.flag,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   236
                   'ltrim': directives.flag,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   237
                   'rtrim': directives.flag}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   238
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   239
    comment_pattern = re.compile(r'( |\n|^)\.\. ')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   240
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   241
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   242
        if not isinstance(self.state, states.SubstitutionDef):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   243
            raise self.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   244
                'Invalid context: the "%s" directive can only be used within '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   245
                'a substitution definition.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   246
        substitution_definition = self.state_machine.node
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   247
        if self.options.has_key('trim'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   248
            substitution_definition.attributes['ltrim'] = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   249
            substitution_definition.attributes['rtrim'] = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   250
        if self.options.has_key('ltrim'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   251
            substitution_definition.attributes['ltrim'] = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   252
        if self.options.has_key('rtrim'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   253
            substitution_definition.attributes['rtrim'] = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   254
        codes = self.comment_pattern.split(self.arguments[0])[0].split()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   255
        element = nodes.Element()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   256
        for code in codes:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   257
            try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   258
                decoded = directives.unicode_code(code)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   259
            except ValueError, err:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   260
                raise self.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   261
                    'Invalid character code: %s\n%s: %s'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   262
                    % (code, err.__class__.__name__, err))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   263
            element += nodes.Text(decoded)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   264
        return element.children
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   265
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   266
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   267
class Class(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   268
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   269
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   270
    Set a "class" attribute on the directive content or the next element.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   271
    When applied to the next element, a "pending" element is inserted, and a
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   272
    transform does the work later.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   273
    """
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   274
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   275
    required_arguments = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   276
    optional_arguments = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   277
    final_argument_whitespace = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   278
    has_content = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   279
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   280
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   281
        try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   282
            class_value = directives.class_option(self.arguments[0])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   283
        except ValueError:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   284
            raise self.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   285
                'Invalid class attribute value for "%s" directive: "%s".'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   286
                % (self.name, self.arguments[0]))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   287
        node_list = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   288
        if self.content:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   289
            container = nodes.Element()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   290
            self.state.nested_parse(self.content, self.content_offset,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   291
                                    container)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   292
            for node in container:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   293
                node['classes'].extend(class_value)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   294
            node_list.extend(container.children)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   295
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   296
            pending = nodes.pending(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   297
                misc.ClassAttribute,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   298
                {'class': class_value, 'directive': self.name},
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   299
                self.block_text)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   300
            self.state_machine.document.note_pending(pending)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   301
            node_list.append(pending)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   302
        return node_list
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   303
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   304
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   305
class Role(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   306
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   307
    has_content = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   308
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   309
    argument_pattern = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   310
                                  % ((states.Inliner.simplename,) * 2))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   311
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   312
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   313
        """Dynamically create and register a custom interpreted text role."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   314
        if self.content_offset > self.lineno or not self.content:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   315
            raise self.error('"%s" directive requires arguments on the first '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   316
                             'line.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   317
        args = self.content[0]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   318
        match = self.argument_pattern.match(args)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   319
        if not match:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   320
            raise self.error('"%s" directive arguments not valid role names: '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   321
                             '"%s".' % (self.name, args))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   322
        new_role_name = match.group(1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   323
        base_role_name = match.group(3)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   324
        messages = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   325
        if base_role_name:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   326
            base_role, messages = roles.role(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   327
                base_role_name, self.state_machine.language, self.lineno,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   328
                self.state.reporter)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   329
            if base_role is None:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   330
                error = self.state.reporter.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   331
                    'Unknown interpreted text role "%s".' % base_role_name,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   332
                    nodes.literal_block(self.block_text, self.block_text),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   333
                    line=self.lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   334
                return messages + [error]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   335
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   336
            base_role = roles.generic_custom_role
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   337
        assert not hasattr(base_role, 'arguments'), (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   338
            'Supplemental directive arguments for "%s" directive not '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   339
            'supported (specified by "%r" role).' % (self.name, base_role))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   340
        try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   341
            converted_role = convert_directive_function(base_role)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   342
            (arguments, options, content, content_offset) = (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   343
                self.state.parse_directive_block(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   344
                self.content[1:], self.content_offset, converted_role,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   345
                option_presets={}))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   346
        except states.MarkupError, detail:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   347
            error = self.state_machine.reporter.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   348
                'Error in "%s" directive:\n%s.' % (self.name, detail),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   349
                nodes.literal_block(self.block_text, self.block_text),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   350
                line=self.lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   351
            return messages + [error]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   352
        if not options.has_key('class'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   353
            try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   354
                options['class'] = directives.class_option(new_role_name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   355
            except ValueError, detail:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   356
                error = self.state_machine.reporter.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   357
                    'Invalid argument for "%s" directive:\n%s.'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   358
                    % (self.name, detail), nodes.literal_block(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   359
                    self.block_text, self.block_text), line=self.lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   360
                return messages + [error]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   361
        role = roles.CustomRole(new_role_name, base_role, options, content)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   362
        roles.register_local_role(new_role_name, role)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   363
        return messages
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   364
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   365
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   366
class DefaultRole(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   367
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   368
    """Set the default interpreted text role."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   369
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   370
    required_arguments = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   371
    optional_arguments = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   372
    final_argument_whitespace = False
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   373
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   374
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   375
        if not self.arguments:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   376
            if roles._roles.has_key(''):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   377
                # restore the "default" default role
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   378
                del roles._roles['']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   379
            return []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   380
        role_name = self.arguments[0]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   381
        role, messages = roles.role(role_name, self.state_machine.language,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   382
                                    self.lineno, self.state.reporter)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   383
        if role is None:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   384
            error = self.state.reporter.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   385
                'Unknown interpreted text role "%s".' % role_name,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   386
                nodes.literal_block(self.block_text, self.block_text),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   387
                line=self.lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   388
            return messages + [error]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   389
        roles._roles[''] = role
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   390
        # @@@ should this be local to the document, not the parser?
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   391
        return messages
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   392
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   393
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   394
class Title(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   395
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   396
    required_arguments = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   397
    optional_arguments = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   398
    final_argument_whitespace = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   399
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   400
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   401
        self.state_machine.document['title'] = self.arguments[0]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   402
        return []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   403
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   404
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   405
class Date(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   406
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   407
    has_content = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   408
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   409
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   410
        if not isinstance(self.state, states.SubstitutionDef):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   411
            raise self.error(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   412
                'Invalid context: the "%s" directive can only be used within '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   413
                'a substitution definition.' % self.name)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   414
        format = '\n'.join(self.content) or '%Y-%m-%d'
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   415
        text = time.strftime(format)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   416
        return [nodes.Text(text)]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   417
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   418
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   419
class TestDirective(Directive):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   420
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   421
    """This directive is useful only for testing purposes."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   422
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   423
    required_arguments = 0
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   424
    optional_arguments = 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   425
    final_argument_whitespace = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   426
    option_spec = {'option': directives.unchanged_required}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   427
    has_content = True
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   428
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   429
    def run(self):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   430
        if self.content:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   431
            text = '\n'.join(self.content)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   432
            info = self.state_machine.reporter.info(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   433
                'Directive processed. Type="%s", arguments=%r, options=%r, '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   434
                'content:' % (self.name, self.arguments, self.options),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   435
                nodes.literal_block(text, text), line=self.lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   436
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   437
            info = self.state_machine.reporter.info(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   438
                'Directive processed. Type="%s", arguments=%r, options=%r, '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   439
                'content: None' % (self.name, self.arguments, self.options),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   440
                line=self.lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   441
        return [info]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   442
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   443
# Old-style, functional definition:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   444
#
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   445
# def directive_test_function(name, arguments, options, content, lineno,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   446
#                             content_offset, block_text, state, state_machine):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   447
#     """This directive is useful only for testing purposes."""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   448
#     if content:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   449
#         text = '\n'.join(content)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   450
#         info = state_machine.reporter.info(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   451
#             'Directive processed. Type="%s", arguments=%r, options=%r, '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   452
#             'content:' % (name, arguments, options),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   453
#             nodes.literal_block(text, text), line=lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   454
#     else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   455
#         info = state_machine.reporter.info(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   456
#             'Directive processed. Type="%s", arguments=%r, options=%r, '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   457
#             'content: None' % (name, arguments, options), line=lineno)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   458
#     return [info]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   459
#
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   460
# directive_test_function.arguments = (0, 1, 1)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   461
# directive_test_function.options = {'option': directives.unchanged_required}
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   462
# directive_test_function.content = 1