mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
#2575: Now `sphinx.ext.graphviz allows :align:` option
This commit is contained in:
1
CHANGES
1
CHANGES
@@ -16,6 +16,7 @@ Features added
|
|||||||
* Convert linkcheck builder to requests for better encoding handling
|
* Convert linkcheck builder to requests for better encoding handling
|
||||||
* #2463, #2516: Add keywords of "meta" directive to search index
|
* #2463, #2516: Add keywords of "meta" directive to search index
|
||||||
* ``:maxdepth:`` option of toctree affects ``secnumdepth`` (ref: #2547)
|
* ``:maxdepth:`` option of toctree affects ``secnumdepth`` (ref: #2547)
|
||||||
|
* #2575: Now ``sphinx.ext.graphviz`` allows ``:align:`` option
|
||||||
|
|
||||||
Bugs fixed
|
Bugs fixed
|
||||||
----------
|
----------
|
||||||
|
|||||||
@@ -96,6 +96,10 @@ It adds these directives:
|
|||||||
All three directives support a ``graphviz_dot`` option that can be switch the
|
All three directives support a ``graphviz_dot`` option that can be switch the
|
||||||
``dot`` command within the directive.
|
``dot`` command within the directive.
|
||||||
|
|
||||||
|
.. versionadded:: 1.5
|
||||||
|
All three directives support a ``align`` option to align the graph horizontal.
|
||||||
|
The values "left", "center", "right" are allowed.
|
||||||
|
|
||||||
There are also these new config values:
|
There are also these new config values:
|
||||||
|
|
||||||
.. confval:: graphviz_dot
|
.. confval:: graphviz_dot
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ class graphviz(nodes.General, nodes.Inline, nodes.Element):
|
|||||||
|
|
||||||
def figure_wrapper(directive, node, caption):
|
def figure_wrapper(directive, node, caption):
|
||||||
figure_node = nodes.figure('', node)
|
figure_node = nodes.figure('', node)
|
||||||
|
if 'align' in node:
|
||||||
|
figure_node['align'] = node.attributes.pop('align')
|
||||||
|
|
||||||
parsed = nodes.Element()
|
parsed = nodes.Element()
|
||||||
directive.state.nested_parse(ViewList([caption], source=''),
|
directive.state.nested_parse(ViewList([caption], source=''),
|
||||||
@@ -55,6 +57,10 @@ def figure_wrapper(directive, node, caption):
|
|||||||
return figure_node
|
return figure_node
|
||||||
|
|
||||||
|
|
||||||
|
def align_spec(argument):
|
||||||
|
return directives.choice(argument, ('left', 'center', 'right'))
|
||||||
|
|
||||||
|
|
||||||
class Graphviz(Directive):
|
class Graphviz(Directive):
|
||||||
"""
|
"""
|
||||||
Directive to insert arbitrary dot markup.
|
Directive to insert arbitrary dot markup.
|
||||||
@@ -65,6 +71,7 @@ class Graphviz(Directive):
|
|||||||
final_argument_whitespace = False
|
final_argument_whitespace = False
|
||||||
option_spec = {
|
option_spec = {
|
||||||
'alt': directives.unchanged,
|
'alt': directives.unchanged,
|
||||||
|
'align': align_spec,
|
||||||
'inline': directives.flag,
|
'inline': directives.flag,
|
||||||
'caption': directives.unchanged,
|
'caption': directives.unchanged,
|
||||||
'graphviz_dot': directives.unchanged,
|
'graphviz_dot': directives.unchanged,
|
||||||
@@ -101,6 +108,8 @@ class Graphviz(Directive):
|
|||||||
node['options']['graphviz_dot'] = self.options['graphviz_dot']
|
node['options']['graphviz_dot'] = self.options['graphviz_dot']
|
||||||
if 'alt' in self.options:
|
if 'alt' in self.options:
|
||||||
node['alt'] = self.options['alt']
|
node['alt'] = self.options['alt']
|
||||||
|
if 'align' in self.options:
|
||||||
|
node['align'] = self.options['align']
|
||||||
if 'inline' in self.options:
|
if 'inline' in self.options:
|
||||||
node['inline'] = True
|
node['inline'] = True
|
||||||
|
|
||||||
@@ -121,6 +130,7 @@ class GraphvizSimple(Directive):
|
|||||||
final_argument_whitespace = False
|
final_argument_whitespace = False
|
||||||
option_spec = {
|
option_spec = {
|
||||||
'alt': directives.unchanged,
|
'alt': directives.unchanged,
|
||||||
|
'align': align_spec,
|
||||||
'inline': directives.flag,
|
'inline': directives.flag,
|
||||||
'caption': directives.unchanged,
|
'caption': directives.unchanged,
|
||||||
'graphviz_dot': directives.unchanged,
|
'graphviz_dot': directives.unchanged,
|
||||||
@@ -135,6 +145,8 @@ class GraphvizSimple(Directive):
|
|||||||
node['options']['graphviz_dot'] = self.options['graphviz_dot']
|
node['options']['graphviz_dot'] = self.options['graphviz_dot']
|
||||||
if 'alt' in self.options:
|
if 'alt' in self.options:
|
||||||
node['alt'] = self.options['alt']
|
node['alt'] = self.options['alt']
|
||||||
|
if 'align' in self.options:
|
||||||
|
node['align'] = self.options['align']
|
||||||
if 'inline' in self.options:
|
if 'inline' in self.options:
|
||||||
node['inline'] = True
|
node['inline'] = True
|
||||||
|
|
||||||
@@ -236,6 +248,9 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
|
|||||||
<p class="warning">%s</p></object>\n''' % (fname, alt)
|
<p class="warning">%s</p></object>\n''' % (fname, alt)
|
||||||
self.body.append(svgtag)
|
self.body.append(svgtag)
|
||||||
else:
|
else:
|
||||||
|
if 'align' in node:
|
||||||
|
self.body.append('<div align="%s" class="align-%s">' %
|
||||||
|
(node['align'], node['align']))
|
||||||
with open(outfn + '.map', 'rb') as mapfile:
|
with open(outfn + '.map', 'rb') as mapfile:
|
||||||
imgmap = mapfile.readlines()
|
imgmap = mapfile.readlines()
|
||||||
if len(imgmap) == 2:
|
if len(imgmap) == 2:
|
||||||
@@ -248,6 +263,8 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
|
|||||||
self.body.append('<img src="%s" alt="%s" usemap="#%s" %s/>\n' %
|
self.body.append('<img src="%s" alt="%s" usemap="#%s" %s/>\n' %
|
||||||
(fname, alt, mapname, imgcss))
|
(fname, alt, mapname, imgcss))
|
||||||
self.body.extend([item.decode('utf-8') for item in imgmap])
|
self.body.extend([item.decode('utf-8') for item in imgmap])
|
||||||
|
if 'align' in node:
|
||||||
|
self.body.append('</div>\n')
|
||||||
|
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode
|
||||||
|
|
||||||
@@ -271,8 +288,19 @@ def render_dot_latex(self, node, code, options, prefix='graphviz'):
|
|||||||
para_separator = '\n'
|
para_separator = '\n'
|
||||||
|
|
||||||
if fname is not None:
|
if fname is not None:
|
||||||
|
post = None
|
||||||
|
if not is_inline and 'align' in node:
|
||||||
|
if node['align'] == 'left':
|
||||||
|
self.body.append('{')
|
||||||
|
post = '\\hspace*{\\fill}}'
|
||||||
|
elif node['align'] == 'right':
|
||||||
|
self.body.append('{\\hspace*{\\fill}')
|
||||||
|
post = '}'
|
||||||
self.body.append('%s\\includegraphics{%s}%s' %
|
self.body.append('%s\\includegraphics{%s}%s' %
|
||||||
(para_separator, fname, para_separator))
|
(para_separator, fname, para_separator))
|
||||||
|
if post:
|
||||||
|
self.body.append(post)
|
||||||
|
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,3 +19,9 @@ Hello |graph| graphviz world
|
|||||||
|
|
||||||
|
|
||||||
.. graphviz:: graph.dot
|
.. graphviz:: graph.dot
|
||||||
|
|
||||||
|
.. digraph:: bar
|
||||||
|
:align: right
|
||||||
|
:caption: on right
|
||||||
|
|
||||||
|
foo -> bar
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ def test_graphviz_html(app, status, warning):
|
|||||||
html = '<img src=".*?" alt="digraph {\n bar -> baz\n}" />'
|
html = '<img src=".*?" alt="digraph {\n bar -> baz\n}" />'
|
||||||
assert re.search(html, content, re.M)
|
assert re.search(html, content, re.M)
|
||||||
|
|
||||||
|
html = ('<div class="figure align-right" .*?>\s*<img .*?/>\s*<p class="caption">'
|
||||||
|
'<span class="caption-text">on right</span>.*</p>\s*</div>')
|
||||||
|
assert re.search(html, content, re.S)
|
||||||
|
|
||||||
|
|
||||||
@with_app('latex', testroot='ext-graphviz')
|
@with_app('latex', testroot='ext-graphviz')
|
||||||
@skip_if_graphviz_not_found
|
@skip_if_graphviz_not_found
|
||||||
@@ -70,6 +74,11 @@ def test_graphviz_latex(app, status, warning):
|
|||||||
macro = 'Hello \\\\includegraphics{graphviz-\w+.pdf} graphviz world'
|
macro = 'Hello \\\\includegraphics{graphviz-\w+.pdf} graphviz world'
|
||||||
assert re.search(macro, content, re.S)
|
assert re.search(macro, content, re.S)
|
||||||
|
|
||||||
|
macro = ('\\\\begin{wrapfigure}{r}{0pt}\n\\\\centering\n'
|
||||||
|
'\\\\includegraphics{graphviz-\w+.pdf}\n'
|
||||||
|
'\\\\caption{on right}\\\\label{.*}\\\\end{wrapfigure}')
|
||||||
|
assert re.search(macro, content, re.S)
|
||||||
|
|
||||||
|
|
||||||
@with_app('html', testroot='ext-graphviz', confoverrides={'language': 'xx'})
|
@with_app('html', testroot='ext-graphviz', confoverrides={'language': 'xx'})
|
||||||
@skip_if_graphviz_not_found
|
@skip_if_graphviz_not_found
|
||||||
|
|||||||
Reference in New Issue
Block a user