コード例 #1
0
    def resolve_xref(self, env, fromdocname, builder,
                     typ, target, node, contnode):
        if typ == 'ref':
            if node['refexplicit']:
                # reference to anonymous label; the reference uses
                # the supplied link caption
                docname, labelid = self.data['anonlabels'].get(target, ('', ''))
                sectname = node.astext()
            else:
                # reference to named label; the final node will
                # contain the section name after the label
                docname, labelid, sectname = self.data['labels'].get(target,
                                                                     ('', '', ''))
            if not docname:
                return None

            return self.build_reference_node(fromdocname, builder,
                                             docname, labelid, sectname, 'ref')
        elif typ == 'numref':
            docname, labelid = self.data['anonlabels'].get(target, ('', ''))
            if not docname:
                return None

            if env.config.numfig is False:
                env.warn(fromdocname, 'numfig is disabled. :numref: is ignored.')
                return contnode

            try:
                target_node = env.get_doctree(docname).ids[labelid]
                figtype = get_figtype(target_node)
                figure_id = target_node['ids'][0]
                fignumber = env.toc_fignumbers[docname][figtype][figure_id]
            except (KeyError, IndexError):
                return None

            title = contnode.astext()
            if target == fully_normalize_name(title):
                title = env.config.numfig_format.get(figtype, '')

            try:
                newtitle = title % '.'.join(map(str, fignumber))
            except TypeError:
                env.warn(fromdocname, 'invalid numfig_format: %s' % title)
                return None

            return self.build_reference_node(fromdocname, builder,
                                             docname, labelid, newtitle, 'numref',
                                             nodeclass=addnodes.number_reference,
                                             title=title)
        elif typ == 'keyword':
            # keywords are oddballs: they are referenced by named labels
            docname, labelid, _ = self.data['labels'].get(target, ('', '', ''))
            if not docname:
                return None
            return make_refnode(builder, fromdocname, docname,
                                labelid, contnode)
        elif typ == 'option':
            progname = node.get('std:program')
            target = target.strip()
            docname, labelid = self.data['progoptions'].get((progname, target), ('', ''))
            if not docname:
                commands = []
                while ws_re.search(target):
                    subcommand, target = ws_re.split(target, 1)
                    commands.append(subcommand)
                    progname = "-".join(commands)

                    docname, labelid = self.data['progoptions'].get((progname, target),
                                                                    ('', ''))
                    if docname:
                        break
                else:
                    return None

            return make_refnode(builder, fromdocname, docname,
                                labelid, contnode)
        else:
            objtypes = self.objtypes_for_role(typ) or []
            for objtype in objtypes:
                if (objtype, target) in self.data['objects']:
                    docname, labelid = self.data['objects'][objtype, target]
                    break
            else:
                docname, labelid = '', ''
            if not docname:
                return None
            return make_refnode(builder, fromdocname, docname,
                                labelid, contnode)
コード例 #2
0
ファイル: std.py プロジェクト: th0/test2
    def resolve_xref(self, env, fromdocname, builder,
                     typ, target, node, contnode):
        if typ == 'ref':
            if node['refexplicit']:
                # reference to anonymous label; the reference uses
                # the supplied link caption
                docname, labelid = self.data['anonlabels'].get(target, ('', ''))
                sectname = node.astext()
            else:
                # reference to named label; the final node will
                # contain the section name after the label
                docname, labelid, sectname = self.data['labels'].get(target,
                                                                     ('', '', ''))
            if not docname:
                return None

            return self.build_reference_node(fromdocname, builder,
                                             docname, labelid, sectname)
        elif typ == 'numref':
            docname, labelid = self.data['anonlabels'].get(target, ('', ''))
            if not docname:
                return None

            if env.config.numfig is False:
                env.warn(fromdocname, 'numfig is disabled. :numref: is ignored.')
                return contnode

            try:
                target_node = env.get_doctree(docname).ids[labelid]
                figtype = get_figtype(target_node)
                figure_id = target_node['ids'][0]
                fignumber = env.toc_fignumbers[docname][figtype][figure_id]
            except (KeyError, IndexError):
                return None

            title = contnode.astext()
            if target == fully_normalize_name(title):
                title = env.config.numfig_format.get(figtype, '')

            newtitle = title % '.'.join(map(str, fignumber))
            return self.build_reference_node(fromdocname, builder,
                                             docname, labelid, newtitle,
                                             nodeclass=addnodes.number_reference,
                                             title=title)
        elif typ == 'keyword':
            # keywords are oddballs: they are referenced by named labels
            docname, labelid, _ = self.data['labels'].get(target, ('', '', ''))
            if not docname:
                return None
            return make_refnode(builder, fromdocname, docname,
                                labelid, contnode)
        elif typ == 'option':
            target = target.strip()
            # most obvious thing: we are a flag option without program
            if target.startswith(('-', '/', '+')):
                progname = node.get('std:program')
            elif re.search(r'[-/+]', target):
                try:
                    progname, target = re.split(r' (?=-|--|/|\+)', target, 1)
                except ValueError:
                    return None
                progname = ws_re.sub('-', progname.strip())
            else:
                progname = None
            docname, labelid = self.data['progoptions'].get((progname, target),
                                                            ('', ''))
            if not docname:
                return None
            return make_refnode(builder, fromdocname, docname,
                                labelid, contnode)
        else:
            objtypes = self.objtypes_for_role(typ) or []
            for objtype in objtypes:
                if (objtype, target) in self.data['objects']:
                    docname, labelid = self.data['objects'][objtype, target]
                    break
            else:
                docname, labelid = '', ''
            if not docname:
                return None
            return make_refnode(builder, fromdocname, docname,
                                labelid, contnode)
コード例 #3
0
ファイル: std.py プロジェクト: Lyoness/sphinx
    def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
        if typ == "ref":
            if node["refexplicit"]:
                # reference to anonymous label; the reference uses
                # the supplied link caption
                docname, labelid = self.data["anonlabels"].get(target, ("", ""))
                sectname = node.astext()
            else:
                # reference to named label; the final node will
                # contain the section name after the label
                docname, labelid, sectname = self.data["labels"].get(target, ("", "", ""))
            if not docname:
                return None

            return self.build_reference_node(fromdocname, builder, docname, labelid, sectname, "ref")
        elif typ == "numref":
            docname, labelid = self.data["anonlabels"].get(target, ("", ""))
            if not docname:
                return None

            if env.config.numfig is False:
                env.warn(fromdocname, "numfig is disabled. :numref: is ignored.")
                return contnode

            try:
                target_node = env.get_doctree(docname).ids[labelid]
                figtype = get_figtype(target_node)
                figure_id = target_node["ids"][0]
                fignumber = env.toc_fignumbers[docname][figtype][figure_id]
            except (KeyError, IndexError):
                return None

            title = contnode.astext()
            if target == fully_normalize_name(title):
                title = env.config.numfig_format.get(figtype, "")

            try:
                newtitle = title % ".".join(map(str, fignumber))
            except TypeError:
                env.warn(fromdocname, "invalid numfig_format: %s" % title)
                return None

            return self.build_reference_node(
                fromdocname,
                builder,
                docname,
                labelid,
                newtitle,
                "numref",
                nodeclass=addnodes.number_reference,
                title=title,
            )
        elif typ == "keyword":
            # keywords are oddballs: they are referenced by named labels
            docname, labelid, _ = self.data["labels"].get(target, ("", "", ""))
            if not docname:
                return None
            return make_refnode(builder, fromdocname, docname, labelid, contnode)
        elif typ == "option":
            target = target.strip()
            # most obvious thing: we are a flag option without program
            if target.startswith(("-", "/", "+")):
                progname = node.get("std:program")
            elif re.search(r"[-/+]", target):
                try:
                    progname, target = re.split(r" (?=-|--|/|\+)", target, 1)
                except ValueError:
                    return None
                progname = ws_re.sub("-", progname.strip())
            else:
                progname = None
            docname, labelid = self.data["progoptions"].get((progname, target), ("", ""))
            if not docname:
                return None
            return make_refnode(builder, fromdocname, docname, labelid, contnode)
        else:
            objtypes = self.objtypes_for_role(typ) or []
            for objtype in objtypes:
                if (objtype, target) in self.data["objects"]:
                    docname, labelid = self.data["objects"][objtype, target]
                    break
            else:
                docname, labelid = "", ""
            if not docname:
                return None
            return make_refnode(builder, fromdocname, docname, labelid, contnode)