buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.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.ifconfig
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
    Provides the ``ifconfig`` directive that allows to write documentation
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     7
    that is included depending on configuration variables.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     8
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
     9
    Usage::
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    10
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    11
        .. ifconfig:: releaselevel in ('alpha', 'beta', 'rc')
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    12
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    13
           This stuff is only included in the built docs for unstable versions.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    14
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    15
    The argument for ``ifconfig`` is a plain Python expression, evaluated in the
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    16
    namespace of the project configuration (that is, all variables from ``conf.py``
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    17
    are available.)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    18
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    19
    :copyright: 2008 by Georg Brandl.
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    20
    :license: BSD.
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
from docutils import nodes
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    24
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    25
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    26
class ifconfig(nodes.Element): pass
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    27
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    28
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    29
def ifconfig_directive(name, arguments, options, content, lineno,
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    30
                       content_offset, block_text, state, state_machine):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    31
    node = ifconfig()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    32
    node.line = lineno
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    33
    node['expr'] = arguments[0]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    34
    state.nested_parse(content, content_offset, node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    35
    return [node]
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    36
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    37
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    38
def process_ifconfig_nodes(app, doctree, docname):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    39
    ns = app.config.__dict__.copy()
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    40
    ns['builder'] = app.builder.name
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    41
    for node in doctree.traverse(ifconfig):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    42
        try:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    43
            res = eval(node['expr'], ns)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    44
        except Exception, err:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    45
            # handle exceptions in a clean fashion
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    46
            from traceback import format_exception_only
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    47
            msg = ''.join(format_exception_only(err.__class__, err))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    48
            newnode = doctree.reporter.error('Exception occured in '
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    49
                                             'ifconfig expression: \n%s' %
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    50
                                             msg, base_node=node)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    51
            node.replace_self(newnode)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    52
        else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    53
            if not res:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    54
                node.replace_self([])
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    55
            else:
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    56
                node.replace_self(node.children)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    57
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    58
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    59
def setup(app):
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    60
    app.add_node(ifconfig)
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    61
    app.add_directive('ifconfig', ifconfig_directive, 1, (1, 0, 1))
d8ac696cc51f helium_7.0-r14027
wbernard
parents:
diff changeset
    62
    app.connect('doctree-resolved', process_ifconfig_nodes)