summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2008-12-25 22:06:10 +0100
committerGeorg Brandl <georg@python.org>2008-12-25 22:06:10 +0100
commitf0cc764b6073a0e82264d155099023fd010e313a (patch)
treeb0df83f56b6f248430131ff682e1fc66552a0603
parentfca6a2e59767a66110e1c66b67e29cc268f062ad (diff)
downloadsphinx-f0cc764b6073a0e82264d155099023fd010e313a.tar.gz
Change the way to handle return annotations a bit.
-rw-r--r--sphinx/addnodes.py9
-rw-r--r--sphinx/directives/desc.py12
-rw-r--r--sphinx/ext/autodoc.py7
-rw-r--r--sphinx/writers/html.py5
-rw-r--r--sphinx/writers/latex.py11
-rw-r--r--sphinx/writers/text.py5
6 files changed, 36 insertions, 13 deletions
diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py
index 8b20f7ac..ad4909e0 100644
--- a/sphinx/addnodes.py
+++ b/sphinx/addnodes.py
@@ -23,8 +23,12 @@ class desc(nodes.Admonition, nodes.Element): pass
class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): pass
# compatibility alias
desc_classname = desc_addname
-# return type (C); object type, e.g. -> annotation (Python)
+# return type (C); object type
class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass
+# -> annotation (Python)
+class desc_returns(desc_type):
+ def astext(self):
+ return ' -> ' + nodes.TextElement.astext(self)
# main name of object
class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
# argument list
@@ -90,7 +94,8 @@ class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): pass
# make them known to docutils. this is needed, because the HTML writer
# will choke at some point if these are not added
-nodes._add_node_class_names("""index desc desc_content desc_signature desc_type
+nodes._add_node_class_names("""index desc desc_content desc_signature
+ desc_type desc_returns
desc_addname desc_name desc_parameterlist desc_parameter desc_optional
centered versionmodified seealso productionlist production toctree
pending_xref compact_paragraph highlightlang literal_emphasis
diff --git a/sphinx/directives/desc.py b/sphinx/directives/desc.py
index 68706acf..09d19c9f 100644
--- a/sphinx/directives/desc.py
+++ b/sphinx/directives/desc.py
@@ -209,8 +209,9 @@ def handle_doc_fields(node, env):
py_sig_re = re.compile(
r'''^ ([\w.]*\.)? # class name(s)
(\w+) \s* # thing name
- (?: \((.*)\) # optional arguments
- (\s* -> \s* .*)? )? $ # optional return annotation
+ (?: \((.*)\) # optional: arguments
+ (?:\s* -> \s* (.*))? # return annotation
+ )? $ # and nothing more
''', re.VERBOSE)
py_paramlist_re = re.compile(r'([\[\],])') # split at '[', ']' and ','
@@ -229,9 +230,6 @@ def parse_py_signature(signode, sig, desctype, module, env):
raise ValueError
classname, name, arglist, retann = m.groups()
- if retann:
- retann = u' \N{RIGHTWARDS ARROW} ' + retann.strip()[2:]
-
if env.currclass:
add_module = False
if classname and classname.startswith(env.currclass):
@@ -267,7 +265,7 @@ def parse_py_signature(signode, sig, desctype, module, env):
# for callables, add an empty parameter list
signode += addnodes.desc_parameterlist()
if retann:
- signode += addnodes.desc_type(retann, retann)
+ signode += addnodes.desc_returns(retann, retann)
return fullname, classname
signode += addnodes.desc_parameterlist()
@@ -290,7 +288,7 @@ def parse_py_signature(signode, sig, desctype, module, env):
if len(stack) != 1:
raise ValueError
if retann:
- signode += addnodes.desc_type(retann, retann)
+ signode += addnodes.desc_returns(retann, retann)
return fullname, classname
diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py
index 45bad2a5..1a46ac8a 100644
--- a/sphinx/ext/autodoc.py
+++ b/sphinx/ext/autodoc.py
@@ -36,8 +36,9 @@ py_ext_sig_re = re.compile(
r'''^ ([\w.]+::)? # explicit module name
([\w.]+\.)? # module and/or class name(s)
(\w+) \s* # thing name
- (?: \((.*)\) # optional arguments
- (\s* -> \s* .*)? )? $ # optional return annotation
+ (?: \((.*)\) # optional: arguments
+ (?:\s* -> \s* (.*))? # return annotation
+ )? $ # and nothing more
''', re.VERBOSE)
@@ -391,7 +392,7 @@ class RstGenerator(object):
args, retann = result
if args is not None:
- return '%s%s' % (args, retann or '')
+ return '%s%s' % (args, retann and (' -> %s' % retann) or '')
elif err:
# re-raise the error for perusal of the handler in generate()
raise RuntimeError(err)
diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py
index 1b9205ce..529a8a3f 100644
--- a/sphinx/writers/html.py
+++ b/sphinx/writers/html.py
@@ -90,6 +90,11 @@ class HTMLTranslator(BaseTranslator):
def depart_desc_type(self, node):
pass
+ def visit_desc_returns(self, node):
+ self.body.append(' &rarr; ')
+ def depart_desc_returns(self, node):
+ pass
+
def visit_desc_name(self, node):
self.body.append(self.starttag(node, 'tt', '', CLASS='descname'))
def depart_desc_name(self, node):
diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py
index 952042d8..3b847bd2 100644
--- a/sphinx/writers/latex.py
+++ b/sphinx/writers/latex.py
@@ -112,7 +112,8 @@ class Table(object):
class Desc(object):
def __init__(self, node):
self.env = LaTeXTranslator.desc_map.get(node['desctype'], 'describe')
- self.type = self.cls = self.name = self.params = self.annotation = ''
+ self.type = self.cls = self.name = self.params = \
+ self.annotation = self.returns = ''
self.count = 0
@@ -477,6 +478,14 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.descstack[-1].type = self.encode(node.astext().strip())
raise nodes.SkipNode
+ def visit_desc_returns(self, node):
+ d = self.descstack[-1]
+ if d.env == 'describe':
+ d.name += ' $\\rightarrow$ ' + self.encode(node.astext())
+ else:
+ self.descstack[-1].returns = self.encode(node.astext().strip())
+ raise nodes.SkipNode
+
def visit_desc_name(self, node):
d = self.descstack[-1]
if d.env == 'describe':
diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py
index 74c637ca..a557e250 100644
--- a/sphinx/writers/text.py
+++ b/sphinx/writers/text.py
@@ -195,6 +195,11 @@ class TextTranslator(nodes.NodeVisitor):
def depart_desc_type(self, node):
pass
+ def visit_desc_returns(self, node):
+ self.add_text(' -> ')
+ def depart_desc_returns(self, node):
+ pass
+
def visit_desc_parameterlist(self, node):
self.add_text('(')
self.first_param = 1