| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | """Sphinx plugins for Django documentation."""import docutils.nodesimport docutils.transformsimport sphinximport sphinx.addnodesimport sphinx.directivesimport sphinx.environmentimport sphinx.rolesfrom docutils import nodesdef setup(app):    app.add_crossref_type(        directivename = "setting",        rolename = "setting",        indextemplate = "pair: %s; setting",    )    app.add_crossref_type(        directivename = "templatetag",        rolename = "ttag",        indextemplate = "pair: %s; template tag",    )    app.add_crossref_type(        directivename = "templatefilter",        rolename = "tfilter",        indextemplate = "pair: %s; template filter",    )    app.add_crossref_type(        directivename = "fieldlookup",        rolename = "lookup",        indextemplate = "pair: %s, field lookup type",    )    app.add_description_unit(        directivename = "django-admin",        rolename = "djadmin",        indextemplate = "pair: %s; django-admin command",        parse_node = parse_django_admin_node,    )    app.add_description_unit(        directivename = "django-admin-option",        rolename = "djadminopt",        indextemplate = "pair: %s; django-admin command-line option",        parse_node = lambda env, sig, signode: \                sphinx.directives.parse_option_desc(signode, sig),    )    app.add_config_value('django_next_version', '0.0', True)    app.add_directive('versionadded', parse_version_directive, 1, (1, 1, 1))    app.add_directive('versionchanged', parse_version_directive, 1, (1, 1, 1))    app.add_transform(SuppressBlockquotes)def parse_version_directive(name, arguments, options, content, lineno,                      content_offset, block_text, state, state_machine):    env = state.document.settings.env    is_nextversion = env.config.django_next_version == arguments[0]    ret = []    node = sphinx.addnodes.versionmodified()    ret.append(node)    if not is_nextversion:        if len(arguments) == 1:            linktext = 'Please, see the release notes <releases-%s>' % (                    arguments[0])            xrefs = sphinx.roles.xfileref_role('ref', linktext, linktext,                                               lineno, state)            node.extend(xrefs[0])        node['version'] = arguments[0]    else:        node['version'] = "Development version"    node['type'] = name    if len(arguments) == 2:        inodes, messages = state.inline_text(arguments[1], lineno+1)        node.extend(inodes)        if content:            state.nested_parse(content, content_offset, node)        ret = ret + messages    env.note_versionchange(node['type'], node['version'], node, lineno)    return retclass SuppressBlockquotes(docutils.transforms.Transform):    """    Remove the default blockquotes that encase indented list, tables, etc.    """    default_priority = 300    suppress_blockquote_child_nodes = (        docutils.nodes.bullet_list,        docutils.nodes.enumerated_list,        docutils.nodes.definition_list,        docutils.nodes.literal_block,        docutils.nodes.doctest_block,        docutils.nodes.line_block,        docutils.nodes.table,    )    def apply(self):        for node in self.document.traverse(docutils.nodes.block_quote):            if len(node.children) == 1 and \                    isinstance(node.children[0],                               self.suppress_blockquote_child_nodes):                node.replace_self(node.children[0])def parse_django_admin_node(env, sig, signode):    command = sig.split(' ')[0]    env._django_curr_admin_command = command    title = "django-admin.py %s" % sig    signode += sphinx.addnodes.desc_name(title, title)    return sig
 |