buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.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
# -*- coding: utf-8 -*-
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     2
"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     3
    sphinx.ext.todo
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
    Allow todos to be inserted into your documentation.  Inclusion of todos can
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     7
    be switched of by a configuration variable.  The todolist directive collects
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     8
    all todos of your project and lists them along with a backlink to the
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     9
    original location.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    10
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    11
    :copyright: 2008 Daniel Bültmann.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    12
    :license: BSD.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    13
"""
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    14
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    15
from docutils import nodes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    16
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    17
from sphinx.util.compat import make_admonition
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    18
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    19
class todo_node(nodes.Admonition, nodes.Element): pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    20
class todolist(nodes.General, nodes.Element): pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    21
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    22
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    23
def todo_directive(name, arguments, options, content, lineno,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    24
                   content_offset, block_text, state, state_machine):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    25
    env = state.document.settings.env
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    26
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    27
    targetid = "todo-%s" % env.index_num
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    28
    env.index_num += 1
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    29
    targetnode = nodes.target('', '', ids=[targetid])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    30
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    31
    ad = make_admonition(todo_node, name, [_('Todo')], options, content, lineno,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    32
                         content_offset, block_text, state, state_machine)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    33
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    34
    # Attach a list of all todos to the environment,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    35
    # the todolist works with the collected todo nodes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    36
    if not hasattr(env, 'todo_all_todos'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    37
        env.todo_all_todos = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    38
    env.todo_all_todos.append({
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    39
        'docname': env.docname,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    40
        'lineno': lineno,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    41
        'todo': ad[0].deepcopy(),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    42
        'target': targetnode,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    43
    })
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    44
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    45
    return [targetnode] + ad
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    46
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    47
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    48
def todolist_directive(name, arguments, options, content, lineno,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    49
                       content_offset, block_text, state, state_machine):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    50
    # Simply insert an empty todolist node which will be replaced later
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    51
    # when process_todo_nodes is called
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    52
    return [todolist('')]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    53
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    54
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    55
def process_todo_nodes(app, doctree, fromdocname):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    56
    if not app.config['todo_include_todos']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    57
        for node in doctree.traverse(todo_node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    58
            node.parent.remove(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    59
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    60
    # Replace all todolist nodes with a list of the collected todos.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    61
    # Augment each todo with a backlink to the original location.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    62
    env = app.builder.env
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    63
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    64
    for node in doctree.traverse(todolist):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    65
        if not app.config['todo_include_todos']:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    66
            node.replace_self([])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    67
            continue
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    68
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    69
        content = []
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    70
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    71
        for todo_info in env.todo_all_todos:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    72
            para = nodes.paragraph()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    73
            filename = env.doc2path(todo_info['docname'], base=None)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    74
            description = (
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    75
                _('(The original entry is located in %s, line %d and can be found ') %
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    76
                (filename, todo_info['lineno']))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    77
            para += nodes.Text(description, description)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    78
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    79
            # Create a reference
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    80
            newnode = nodes.reference('', '')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    81
            innernode = nodes.emphasis(_('here'), _('here'))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    82
            newnode['refdocname'] = todo_info['docname']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    83
            newnode['refuri'] = app.builder.get_relative_uri(
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    84
                fromdocname, todo_info['docname'])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    85
            newnode['refuri'] += '#' + todo_info['target']['refid']
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    86
            newnode.append(innernode)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    87
            para += newnode
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    88
            para += nodes.Text('.)', '.)')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    89
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    90
            # Insert into the todolist
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    91
            content.append(todo_info['todo'])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    92
            content.append(para)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    93
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    94
        node.replace_self(content)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    95
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    96
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    97
def purge_todos(app, env, docname):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    98
    if not hasattr(env, 'todo_all_todos'):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    99
        return
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   100
    env.todo_all_todos = [todo for todo in env.todo_all_todos
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   101
                          if todo['docname'] != docname]
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
def visit_todo_node(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   105
    self.visit_admonition(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   106
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   107
def depart_todo_node(self, node):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   108
    self.depart_admonition(node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   109
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   110
def setup(app):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   111
    app.add_config_value('todo_include_todos', False, False)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   112
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   113
    app.add_node(todolist)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   114
    app.add_node(todo_node,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   115
                 html=(visit_todo_node, depart_todo_node),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   116
                 latex=(visit_todo_node, depart_todo_node),
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   117
                 text=(visit_todo_node, depart_todo_node))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   118
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   119
    app.add_directive('todo', todo_directive, 1, (0, 0, 1))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   120
    app.add_directive('todolist', todolist_directive, 0, (0, 0, 0))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   121
    app.connect('doctree-resolved', process_todo_nodes)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   122
    app.connect('env-purge-doc', purge_todos)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
   123