def handle_signature(self, sig: str, signode: desc_signature) -> Tuple[str, str]: """Transform a DML signature into RST nodes. Return (fully qualified name of the thing, classname if any). """ #relevant info: (typ, name, arglist, annotations) = self.split_signature(sig) # determine class name as well as full name classname = self.env.ref_context.get('dml:class') if classname: # class name is not given in the signature fullname = classname + '.' + name else: # It is a class itself, so fullname = name classname = "" fullname = name signode['class'] = classname signode['fullname'] = fullname signode += addnodes.desc_annotation(str(typ), str(typ)) signode += addnodes.desc_sig_space() signode += addnodes.desc_name(name, name) if arglist is not None: # diff between None (no arguments) and [] (empty argument list, but brackets will be drawn) paramlist = addnodes.desc_parameterlist() for arg in arglist: if isinstance(arg, addnodes.pending_xref): print("add pending xref") paramlist += addnodes.desc_parameter('', '', arg) else: paramlist += addnodes.desc_parameter(arg, arg) signode += paramlist if annotations: signode += addnodes.desc_sig_space() signode += addnodes.desc_sig_operator('', '[') addsepertor = False for anno in annotations: if addsepertor: signode += addnodes.desc_sig_operator('', ',') signode += addnodes.desc_sig_space() signode += addnodes.desc_annotation(anno, anno) aaddseperator = True signode += addnodes.desc_sig_operator('', ']') return fullname, classname
def _parse_arglist(arglist: str) -> addnodes.desc_parameterlist: """Parse a list of arguments using AST parser""" params = addnodes.desc_parameterlist(arglist) sig = signature_from_str('(%s)' % arglist) last_kind = None for param in sig.parameters.values(): if param.kind != param.POSITIONAL_ONLY and last_kind == param.POSITIONAL_ONLY: # PEP-570: Separator for Positional Only Parameter: / params += addnodes.desc_parameter( '', '', addnodes.desc_sig_operator('', '/')) if param.kind == param.KEYWORD_ONLY and last_kind in ( param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY, None): # PEP-3102: Separator for Keyword Only Parameter: * params += addnodes.desc_parameter( '', '', addnodes.desc_sig_operator('', '*')) node = addnodes.desc_parameter() if param.kind == param.VAR_POSITIONAL: node += addnodes.desc_sig_operator('', '*') node += addnodes.desc_sig_name('', param.name) elif param.kind == param.VAR_KEYWORD: node += addnodes.desc_sig_operator('', '**') node += addnodes.desc_sig_name('', param.name) else: node += addnodes.desc_sig_name('', param.name) if param.annotation is not param.empty: children = _parse_annotation(param.annotation) node += addnodes.desc_sig_punctuation('', ':') node += nodes.Text(' ') node += addnodes.desc_sig_name('', '', *children) # type: ignore if param.default is not param.empty: if param.annotation is not param.empty: node += nodes.Text(' ') node += addnodes.desc_sig_operator('', '=') node += nodes.Text(' ') else: node += addnodes.desc_sig_operator('', '=') node += nodes.inline('', param.default, classes=['default_value'], support_smartquotes=False) params += node last_kind = param.kind if last_kind == Parameter.POSITIONAL_ONLY: # PEP-570: Separator for Positional Only Parameter: / params += addnodes.desc_parameter('', '', addnodes.desc_sig_operator('', '/')) return params
def parse_frrfmt(env, text, node): from sphinx import addnodes m = frrfmt_re.match(text) if not m: logger.warning('could not parse frrfmt:: %r' % (text), location=node) node += addnodes.desc_name(text, text) return text spec, types = m.group('spec'), m.group('types') node += addnodes.desc_sig_operator('%', '%') node += addnodes.desc_name(spec + ' ', spec + ' ') plist = addnodes.desc_parameterlist() for typ in types.split(','): typ = typ.strip() plist += addnodes.desc_parameter(typ, typ) node += plist return '%' + spec