summaryrefslogtreecommitdiff
path: root/sphinx/ext/graphviz.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/ext/graphviz.py')
-rw-r--r--sphinx/ext/graphviz.py64
1 files changed, 35 insertions, 29 deletions
diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py
index f08636354..0b1b00d85 100644
--- a/sphinx/ext/graphviz.py
+++ b/sphinx/ext/graphviz.py
@@ -18,16 +18,24 @@ from subprocess import Popen, PIPE
from hashlib import sha1
from six import text_type
+
from docutils import nodes
-from docutils.parsers.rst import directives
+from docutils.parsers.rst import Directive, directives
from docutils.statemachine import ViewList
import sphinx
from sphinx.errors import SphinxError
from sphinx.locale import _
+from sphinx.util import logging
from sphinx.util.i18n import search_image_for_language
from sphinx.util.osutil import ensuredir, ENOENT, EPIPE, EINVAL
-from sphinx.util.compat import Directive
+
+if False:
+ # For type annotation
+ from typing import Any, Dict, List, Tuple # NOQA
+ from sphinx.application import Sphinx # NOQA
+
+logger = logging.getLogger(__name__)
mapname_re = re.compile(r'<map id="(.*?)"')
@@ -42,6 +50,7 @@ class graphviz(nodes.General, nodes.Inline, nodes.Element):
def figure_wrapper(directive, node, caption):
+ # type: (Directive, nodes.Node, unicode) -> nodes.figure
figure_node = nodes.figure('', node)
if 'align' in node:
figure_node['align'] = node.attributes.pop('align')
@@ -58,6 +67,7 @@ def figure_wrapper(directive, node, caption):
def align_spec(argument):
+ # type: (Any) -> bool
return directives.choice(argument, ('left', 'center', 'right'))
@@ -72,12 +82,13 @@ class Graphviz(Directive):
option_spec = {
'alt': directives.unchanged,
'align': align_spec,
- 'inline': directives.flag,
'caption': directives.unchanged,
'graphviz_dot': directives.unchanged,
+ 'name': directives.unchanged,
}
def run(self):
+ # type: () -> List[nodes.Node]
if self.arguments:
document = self.state.document
if self.content:
@@ -110,13 +121,12 @@ class Graphviz(Directive):
node['alt'] = self.options['alt']
if 'align' in self.options:
node['align'] = self.options['align']
- if 'inline' in self.options:
- node['inline'] = True
caption = self.options.get('caption')
if caption:
node = figure_wrapper(self, node, caption)
+ self.add_name(node)
return [node]
@@ -131,12 +141,13 @@ class GraphvizSimple(Directive):
option_spec = {
'alt': directives.unchanged,
'align': align_spec,
- 'inline': directives.flag,
'caption': directives.unchanged,
'graphviz_dot': directives.unchanged,
+ 'name': directives.unchanged,
}
def run(self):
+ # type: () -> List[nodes.Node]
node = graphviz()
node['code'] = '%s %s {\n%s\n}\n' % \
(self.name, self.arguments[0], '\n'.join(self.content))
@@ -147,17 +158,17 @@ class GraphvizSimple(Directive):
node['alt'] = self.options['alt']
if 'align' in self.options:
node['align'] = self.options['align']
- if 'inline' in self.options:
- node['inline'] = True
caption = self.options.get('caption')
if caption:
node = figure_wrapper(self, node, caption)
+ self.add_name(node)
return [node]
def render_dot(self, code, options, format, prefix='graphviz'):
+ # type: (nodes.NodeVisitor, unicode, Dict, unicode, unicode) -> Tuple[unicode, unicode]
"""Render graphviz code into a PNG or PDF output file."""
graphviz_dot = options.get('graphviz_dot', self.builder.config.graphviz_dot)
hashkey = (code + str(options) + str(graphviz_dot) +
@@ -190,8 +201,8 @@ def render_dot(self, code, options, format, prefix='graphviz'):
except OSError as err:
if err.errno != ENOENT: # No such file or directory
raise
- self.builder.warn('dot command %r cannot be run (needed for graphviz '
- 'output), check the graphviz_dot setting' % graphviz_dot)
+ logger.warning('dot command %r cannot be run (needed for graphviz '
+ 'output), check the graphviz_dot setting', graphviz_dot)
if not hasattr(self.builder, '_graphviz_warned_dot'):
self.builder._graphviz_warned_dot = {}
self.builder._graphviz_warned_dot[graphviz_dot] = True
@@ -216,17 +227,9 @@ def render_dot(self, code, options, format, prefix='graphviz'):
return relfn, outfn
-def warn_for_deprecated_option(self, node):
- if hasattr(self.builder, '_graphviz_warned_inline'):
- return
-
- if 'inline' in node:
- self.builder.warn(':inline: option for graphviz is deprecated since version 1.4.0.')
- self.builder._graphviz_warned_inline = True
-
-
def render_dot_html(self, node, code, options, prefix='graphviz',
imgcls=None, alt=None):
+ # type: (nodes.NodeVisitor, graphviz, unicode, Dict, unicode, unicode, unicode) -> Tuple[unicode, unicode] # NOQA
format = self.builder.config.graphviz_output_format
try:
if format not in ('png', 'svg'):
@@ -234,7 +237,7 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
"'svg', but is %r" % format)
fname, outfn = render_dot(self, code, options, format, prefix)
except GraphvizError as exc:
- self.builder.warn('dot code %r: ' % code + str(exc))
+ logger.warning('dot code %r: ' % code + str(exc))
raise nodes.SkipNode
if fname is None:
@@ -259,7 +262,7 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
(fname, alt, imgcss))
else:
# has a map: get the name of the map and connect the parts
- mapname = mapname_re.match(imgmap[0].decode('utf-8')).group(1)
+ mapname = mapname_re.match(imgmap[0].decode('utf-8')).group(1) # type: ignore
self.body.append('<img src="%s" alt="%s" usemap="#%s" %s/>\n' %
(fname, alt, mapname, imgcss))
self.body.extend([item.decode('utf-8') for item in imgmap])
@@ -270,15 +273,16 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
def html_visit_graphviz(self, node):
- warn_for_deprecated_option(self, node)
+ # type: (nodes.NodeVisitor, graphviz) -> None
render_dot_html(self, node, node['code'], node['options'])
def render_dot_latex(self, node, code, options, prefix='graphviz'):
+ # type: (nodes.NodeVisitor, graphviz, unicode, Dict, unicode) -> None
try:
fname, outfn = render_dot(self, code, options, 'pdf', prefix)
except GraphvizError as exc:
- self.builder.warn('dot code %r: ' % code + str(exc))
+ logger.warning('dot code %r: ' % code + str(exc))
raise nodes.SkipNode
is_inline = self.is_inline(node)
@@ -288,7 +292,7 @@ def render_dot_latex(self, node, code, options, prefix='graphviz'):
para_separator = '\n'
if fname is not None:
- post = None
+ post = None # type: unicode
if not is_inline and 'align' in node:
if node['align'] == 'left':
self.body.append('{')
@@ -305,15 +309,16 @@ def render_dot_latex(self, node, code, options, prefix='graphviz'):
def latex_visit_graphviz(self, node):
- warn_for_deprecated_option(self, node)
+ # type: (nodes.NodeVisitor, graphviz) -> None
render_dot_latex(self, node, node['code'], node['options'])
def render_dot_texinfo(self, node, code, options, prefix='graphviz'):
+ # type: (nodes.NodeVisitor, graphviz, unicode, Dict, unicode) -> None
try:
fname, outfn = render_dot(self, code, options, 'png', prefix)
except GraphvizError as exc:
- self.builder.warn('dot code %r: ' % code + str(exc))
+ logger.warning('dot code %r: ' % code + str(exc))
raise nodes.SkipNode
if fname is not None:
self.body.append('@image{%s,,,[graphviz],png}\n' % fname[:-4])
@@ -321,12 +326,12 @@ def render_dot_texinfo(self, node, code, options, prefix='graphviz'):
def texinfo_visit_graphviz(self, node):
- warn_for_deprecated_option(self, node)
+ # type: (nodes.NodeVisitor, graphviz) -> None
render_dot_texinfo(self, node, node['code'], node['options'])
def text_visit_graphviz(self, node):
- warn_for_deprecated_option(self, node)
+ # type: (nodes.NodeVisitor, graphviz) -> None
if 'alt' in node.attributes:
self.add_text(_('[graph: %s]') % node['alt'])
else:
@@ -335,7 +340,7 @@ def text_visit_graphviz(self, node):
def man_visit_graphviz(self, node):
- warn_for_deprecated_option(self, node)
+ # type: (nodes.NodeVisitor, graphviz) -> None
if 'alt' in node.attributes:
self.body.append(_('[graph: %s]') % node['alt'])
else:
@@ -344,6 +349,7 @@ def man_visit_graphviz(self, node):
def setup(app):
+ # type: (Sphinx) -> Dict[unicode, Any]
app.add_node(graphviz,
html=(html_visit_graphviz, None),
latex=(latex_visit_graphviz, None),