diff options
Diffstat (limited to 'sphinx/domains')
| -rw-r--r-- | sphinx/domains/c.py | 7 | ||||
| -rw-r--r-- | sphinx/domains/python.py | 23 | ||||
| -rw-r--r-- | sphinx/domains/std.py | 38 |
3 files changed, 56 insertions, 12 deletions
diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py index f9f2e664..aed5b47e 100644 --- a/sphinx/domains/c.py +++ b/sphinx/domains/c.py @@ -59,7 +59,12 @@ class CObject(ObjectDescription): # These C types aren't described anywhere, so don't try to create # a cross-reference to them - stopwords = set(('const', 'void', 'char', 'int', 'long', 'FILE', 'struct')) + stopwords = set(( + 'const', 'void', 'char', 'wchar_t', 'int', 'short', + 'long', 'float', 'double', 'unsigned', 'signed', 'FILE', + 'clock_t', 'time_t', 'ptrdiff_t', 'size_t', 'ssize_t', + 'struct', '_Bool', + )) def _parse_type(self, node, ctype): # add cross-ref nodes for all words diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index 0c08b60b..6714e838 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -81,6 +81,23 @@ def _pseudo_parse_arglist(signode, arglist): signode += paramlist +# This override allows our inline type specifiers to behave like :class: link +# when it comes to handling "." and "~" prefixes. +class PyTypedField(TypedField): + def make_xref(self, rolename, domain, target, innernode=nodes.emphasis): + result = super(PyTypedField, self).make_xref(rolename, domain, target, + innernode) + if target.startswith('.'): + result['reftarget'] = target[1:] + result['refspecific'] = True + result[0][0] = nodes.Text(target[1:]) + if target.startswith('~'): + result['reftarget'] = target[1:] + title = target.split('.')[-1] + result[0][0] = nodes.Text(title) + return result + + class PyObject(ObjectDescription): """ Description of a general Python object. @@ -92,7 +109,7 @@ class PyObject(ObjectDescription): } doc_field_types = [ - TypedField('parameter', label=l_('Parameters'), + PyTypedField('parameter', label=l_('Parameters'), names=('param', 'parameter', 'arg', 'argument', 'keyword', 'kwarg', 'kwparam'), typerolename='obj', typenames=('paramtype', 'type'), @@ -559,8 +576,8 @@ class PythonDomain(Domain): object_types = { 'function': ObjType(l_('function'), 'func', 'obj'), 'data': ObjType(l_('data'), 'data', 'obj'), - 'class': ObjType(l_('class'), 'class', 'obj'), - 'exception': ObjType(l_('exception'), 'exc', 'obj'), + 'class': ObjType(l_('class'), 'class', 'exc', 'obj'), + 'exception': ObjType(l_('exception'), 'exc', 'class', 'obj'), 'method': ObjType(l_('method'), 'meth', 'obj'), 'classmethod': ObjType(l_('class method'), 'meth', 'obj'), 'staticmethod': ObjType(l_('static method'), 'meth', 'obj'), diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index ae67bf0e..895e35e5 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -27,8 +27,7 @@ from sphinx.util.compat import Directive # RE for option descriptions -option_desc_re = re.compile( - r'((?:/|-|--)[-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)') +option_desc_re = re.compile(r'((?:/|-|--)[-_a-zA-Z0-9]+)(\s*.*)') class GenericObject(ObjectDescription): @@ -130,14 +129,23 @@ class Target(Directive): class Cmdoption(ObjectDescription): """ - Description of a command-line option (.. cmdoption). + Description of a command-line option (.. option). """ def handle_signature(self, sig, signode): """Transform an option description into RST nodes.""" count = 0 firstname = '' - for m in option_desc_re.finditer(sig): + for potential_option in sig.split(', '): + potential_option = potential_option.strip() + m = option_desc_re.match(potential_option) + if not m: + self.env.warn( + self.env.docname, + 'Malformed option description %r, should ' + 'look like "-opt args", "--opt args" or ' + '"/opt args"' % potential_option, self.lineno) + continue optname, args = m.groups() if count: signode += addnodes.desc_addname(', ', ', ') @@ -190,17 +198,26 @@ class Program(Directive): class OptionXRefRole(XRefRole): innernodeclass = addnodes.literal_emphasis + def _split(self, text, refnode, env): + try: + program, target = re.split(' (?=-|--|/)', text, 1) + except ValueError: + env.warn_node('Malformed :option: %r, does not contain option ' + 'marker - or -- or /' % text, refnode) + return None, text + else: + program = ws_re.sub('-', program) + return program, target + def process_link(self, env, refnode, has_explicit_title, title, target): program = env.temp_data.get('std:program') if not has_explicit_title: if ' ' in title and not (title.startswith('/') or title.startswith('-')): - program, target = re.split(' (?=-|--|/)', title, 1) - program = ws_re.sub('-', program) + program, target = self._split(title, refnode, env) target = target.strip() elif ' ' in target: - program, target = re.split(' (?=-|--|/)', target, 1) - program = ws_re.sub('-', program) + program, target = self._split(target, refnode, env) refnode['refprogram'] = program return title, target @@ -603,6 +620,11 @@ class StandardDomain(Domain): self.object_types[type].attrs['searchprio']) for name, info in self.data['labels'].iteritems(): yield (name, info[2], 'label', info[0], info[1], -1) + # add anonymous-only labels as well + non_anon_labels = set(self.data['labels']) + for name, info in self.data['anonlabels'].iteritems(): + if name not in non_anon_labels: + yield (name, name, 'label', info[0], info[1], -1) def get_type_name(self, type, primary=False): # never prepend "Default" |
