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)
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)
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)