From 107c20a11f1753a23496a57ea8f04178e59f6810 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Mon, 6 May 2019 19:44:36 +0900 Subject: [PATCH] Fix #4550: html: Centering tables by default using CSS --- CHANGES | 1 + sphinx/templates/latex/longtable.tex_t | 2 +- sphinx/templates/latex/tabular.tex_t | 2 +- sphinx/templates/latex/tabulary.tex_t | 2 +- sphinx/themes/basic/static/basic.css_t | 15 ++++ sphinx/transforms/__init__.py | 2 +- sphinx/writers/latex.py | 1 + tests/test_build_html.py | 114 ++++++++++++------------- tests/test_ext_graphviz.py | 4 +- tests/test_ext_inheritance_diagram.py | 6 +- 10 files changed, 83 insertions(+), 66 deletions(-) diff --git a/CHANGES b/CHANGES index 8a7c6647be9..dd9b8f81eed 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,7 @@ Incompatible changes API directly * #6230: The anchor of term in glossary directive is changed if it is consisted by non-ASCII characters +* #4550: html: Centering tables by default using CSS Deprecated ---------- diff --git a/sphinx/templates/latex/longtable.tex_t b/sphinx/templates/latex/longtable.tex_t index ade1a54aff9..8fe5369df63 100644 --- a/sphinx/templates/latex/longtable.tex_t +++ b/sphinx/templates/latex/longtable.tex_t @@ -1,5 +1,5 @@ \begin{savenotes}\sphinxatlongtablestart\begin{longtable} -<%- if table.align == 'center' -%> +<%- if table.align in ('center', 'default') -%> [c] <%- elif table.align == 'left' -%> [l] diff --git a/sphinx/templates/latex/tabular.tex_t b/sphinx/templates/latex/tabular.tex_t index a4f56feb37b..a0db7faff1f 100644 --- a/sphinx/templates/latex/tabular.tex_t +++ b/sphinx/templates/latex/tabular.tex_t @@ -1,6 +1,6 @@ \begin{savenotes}\sphinxattablestart <% if table.align -%> - <%- if table.align == 'center' -%> + <%- if table.align in ('center', 'default') -%> \centering <%- elif table.align == 'left' -%> \raggedright diff --git a/sphinx/templates/latex/tabulary.tex_t b/sphinx/templates/latex/tabulary.tex_t index e3534725b37..3236b798a52 100644 --- a/sphinx/templates/latex/tabulary.tex_t +++ b/sphinx/templates/latex/tabulary.tex_t @@ -1,6 +1,6 @@ \begin{savenotes}\sphinxattablestart <% if table.align -%> - <%- if table.align == 'center' -%> + <%- if table.align in ('center', 'default') -%> \centering <%- elif table.align == 'left' -%> \raggedright diff --git a/sphinx/themes/basic/static/basic.css_t b/sphinx/themes/basic/static/basic.css_t index 90a14286f3a..91fd35755cc 100644 --- a/sphinx/themes/basic/static/basic.css_t +++ b/sphinx/themes/basic/static/basic.css_t @@ -289,6 +289,12 @@ img.align-center, .figure.align-center, object.align-center { margin-right: auto; } +img.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + .align-left { text-align: left; } @@ -297,6 +303,10 @@ img.align-center, .figure.align-center, object.align-center { text-align: center; } +.align-default { + text-align: center; +} + .align-right { text-align: right; } @@ -368,6 +378,11 @@ table.align-center { margin-right: auto; } +table.align-default { + margin-left: auto; + margin-right: auto; +} + table caption span.caption-number { font-style: italic; } diff --git a/sphinx/transforms/__init__.py b/sphinx/transforms/__init__.py index 16849c46c1f..a4e6e52bf55 100644 --- a/sphinx/transforms/__init__.py +++ b/sphinx/transforms/__init__.py @@ -293,7 +293,7 @@ def apply(self, **kwargs): # type: (Any) -> None matcher = NodeMatcher(nodes.table, nodes.figure) for node in self.document.traverse(matcher): # type: nodes.Element - node.setdefault('align', 'center') + node.setdefault('align', 'default') class FilterSystemMessages(SphinxTransform): diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index c5be44b18bd..820d41b9f89 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1565,6 +1565,7 @@ def visit_image(self, node): (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'), (1, 'bottom'): ('\\raisebox{-\\height}{', '}'), (0, 'center'): ('{\\hspace*{\\fill}', '\\hspace*{\\fill}}'), + (0, 'default'): ('{\\hspace*{\\fill}', '\\hspace*{\\fill}}'), # These 2 don't exactly do the right thing. The image should # be floated alongside the paragraph. See # https://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 1dbf05a4afc..1fd04cfdb71 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -565,7 +565,7 @@ def test_numfig_disabled_warn(app, warning): @pytest.mark.parametrize("fname,expect", flat_dict({ 'index.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", None, True), (".//table/caption/span[@class='caption-number']", None, True), (".//div[@class='code-block-caption']/" @@ -582,21 +582,21 @@ def test_numfig_disabled_warn(app, warning): (".//li/p/a/span", '^Sect.1 Foo$', True), ], 'foo.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", None, True), (".//table/caption/span[@class='caption-number']", None, True), (".//div[@class='code-block-caption']/" "span[@class='caption-number']", None, True), ], 'bar.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", None, True), (".//table/caption/span[@class='caption-number']", None, True), (".//div[@class='code-block-caption']/" "span[@class='caption-number']", None, True), ], 'baz.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", None, True), (".//table/caption/span[@class='caption-number']", None, True), (".//div[@class='code-block-caption']/" @@ -633,9 +633,9 @@ def test_numfig_without_numbered_toctree_warn(app, warning): @pytest.mark.parametrize("fname,expect", flat_dict({ 'index.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 9 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 10 $', True), (".//table/caption/span[@class='caption-number']", '^Table 9 $', True), @@ -657,13 +657,13 @@ def test_numfig_without_numbered_toctree_warn(app, warning): (".//li/p/code/span", '^Sect.{number}$', True), ], 'foo.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 3 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 4 $', True), (".//table/caption/span[@class='caption-number']", '^Table 1 $', True), @@ -683,11 +683,11 @@ def test_numfig_without_numbered_toctree_warn(app, warning): "span[@class='caption-number']", '^Listing 4 $', True), ], 'bar.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 5 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 7 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 8 $', True), (".//table/caption/span[@class='caption-number']", '^Table 5 $', True), @@ -703,7 +703,7 @@ def test_numfig_without_numbered_toctree_warn(app, warning): "span[@class='caption-number']", '^Listing 8 $', True), ], 'baz.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 6 $', True), (".//table/caption/span[@class='caption-number']", '^Table 6 $', True), @@ -741,9 +741,9 @@ def test_numfig_with_numbered_toctree_warn(app, warning): @pytest.mark.parametrize("fname,expect", flat_dict({ 'index.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2 $', True), (".//table/caption/span[@class='caption-number']", '^Table 1 $', True), @@ -765,13 +765,13 @@ def test_numfig_with_numbered_toctree_warn(app, warning): (".//li/p/a/span", '^Sect.1 Foo$', True), ], 'foo.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.2 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.3 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.4 $', True), (".//table/caption/span[@class='caption-number']", '^Table 1.1 $', True), @@ -791,11 +791,11 @@ def test_numfig_with_numbered_toctree_warn(app, warning): "span[@class='caption-number']", '^Listing 1.4 $', True), ], 'bar.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.3 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.4 $', True), (".//table/caption/span[@class='caption-number']", '^Table 2.1 $', True), @@ -811,7 +811,7 @@ def test_numfig_with_numbered_toctree_warn(app, warning): "span[@class='caption-number']", '^Listing 2.4 $', True), ], 'baz.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.2 $', True), (".//table/caption/span[@class='caption-number']", '^Table 2.2 $', True), @@ -846,9 +846,9 @@ def test_numfig_with_prefix_warn(app, warning): @pytest.mark.parametrize("fname,expect", flat_dict({ 'index.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:2 $', True), (".//table/caption/span[@class='caption-number']", '^Tab_1 $', True), @@ -870,13 +870,13 @@ def test_numfig_with_prefix_warn(app, warning): (".//li/p/a/span", '^Sect.1 Foo$', True), ], 'foo.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:1.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:1.2 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:1.3 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:1.4 $', True), (".//table/caption/span[@class='caption-number']", '^Tab_1.1 $', True), @@ -896,11 +896,11 @@ def test_numfig_with_prefix_warn(app, warning): "span[@class='caption-number']", '^Code-1.4 $', True), ], 'bar.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:2.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:2.3 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:2.4 $', True), (".//table/caption/span[@class='caption-number']", '^Tab_2.1 $', True), @@ -916,7 +916,7 @@ def test_numfig_with_prefix_warn(app, warning): "span[@class='caption-number']", '^Code-2.4 $', True), ], 'baz.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Figure:2.2 $', True), (".//table/caption/span[@class='caption-number']", '^Tab_2.2 $', True), @@ -952,9 +952,9 @@ def test_numfig_with_secnum_depth_warn(app, warning): @pytest.mark.parametrize("fname,expect", flat_dict({ 'index.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2 $', True), (".//table/caption/span[@class='caption-number']", '^Table 1 $', True), @@ -976,13 +976,13 @@ def test_numfig_with_secnum_depth_warn(app, warning): (".//li/p/a/span", '^Sect.1 Foo$', True), ], 'foo.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.1.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.1.2 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.2.1 $', True), (".//table/caption/span[@class='caption-number']", '^Table 1.1 $', True), @@ -1002,11 +1002,11 @@ def test_numfig_with_secnum_depth_warn(app, warning): "span[@class='caption-number']", '^Listing 1.2.1 $', True), ], 'bar.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.1.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.1.3 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.2.1 $', True), (".//table/caption/span[@class='caption-number']", '^Table 2.1.1 $', True), @@ -1022,7 +1022,7 @@ def test_numfig_with_secnum_depth_warn(app, warning): "span[@class='caption-number']", '^Listing 2.2.1 $', True), ], 'baz.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.1.2 $', True), (".//table/caption/span[@class='caption-number']", '^Table 2.1.2 $', True), @@ -1043,9 +1043,9 @@ def test_numfig_with_secnum_depth(app, cached_etree_parse, fname, expect): @pytest.mark.parametrize("fname,expect", flat_dict({ 'index.html': [ - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2 $', True), (".//table/caption/span[@class='caption-number']", '^Table 1 $', True), @@ -1065,13 +1065,13 @@ def test_numfig_with_secnum_depth(app, cached_etree_parse, fname, expect): (".//li/p/a/span", '^Section.2.1$', True), (".//li/p/a/span", '^Fig.1 should be Fig.1$', True), (".//li/p/a/span", '^Sect.1 Foo$', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.2 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.3 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 1.4 $', True), (".//table/caption/span[@class='caption-number']", '^Table 1.1 $', True), @@ -1089,11 +1089,11 @@ def test_numfig_with_secnum_depth(app, cached_etree_parse, fname, expect): "span[@class='caption-number']", '^Listing 1.3 $', True), (".//div[@class='code-block-caption']/" "span[@class='caption-number']", '^Listing 1.4 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.1 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.3 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.4 $', True), (".//table/caption/span[@class='caption-number']", '^Table 2.1 $', True), @@ -1107,7 +1107,7 @@ def test_numfig_with_secnum_depth(app, cached_etree_parse, fname, expect): "span[@class='caption-number']", '^Listing 2.3 $', True), (".//div[@class='code-block-caption']/" "span[@class='caption-number']", '^Listing 2.4 $', True), - (".//div[@class='figure align-center']/p[@class='caption']/" + (".//div[@class='figure align-default']/p[@class='caption']/" "span[@class='caption-number']", '^Fig. 2.2 $', True), (".//table/caption/span[@class='caption-number']", '^Table 2.2 $', True), @@ -1126,11 +1126,11 @@ def test_numfig_with_singlehtml(app, cached_etree_parse, fname, expect): @pytest.mark.parametrize("fname,expect", flat_dict({ 'index.html': [ - (".//div[@class='figure align-center']/p[@class='caption']" + (".//div[@class='figure align-default']/p[@class='caption']" "/span[@class='caption-number']", "Fig. 1", True), - (".//div[@class='figure align-center']/p[@class='caption']" + (".//div[@class='figure align-default']/p[@class='caption']" "/span[@class='caption-number']", "Fig. 2", True), - (".//div[@class='figure align-center']/p[@class='caption']" + (".//div[@class='figure align-default']/p[@class='caption']" "/span[@class='caption-number']", "Fig. 3", True), (".//div//span[@class='caption-number']", "No.1 ", True), (".//div//span[@class='caption-number']", "No.2 ", True), diff --git a/tests/test_ext_graphviz.py b/tests/test_ext_graphviz.py index 6a3096c234e..ec905aa5fd4 100644 --- a/tests/test_ext_graphviz.py +++ b/tests/test_ext_graphviz.py @@ -21,7 +21,7 @@ def test_graphviz_png_html(app, status, warning): app.builder.build_all() content = (app.outdir / 'index.html').text() - html = (r'
\s*' + html = (r'
\s*' r'
\s*

' r'caption of graph.*

\s*
') assert re.search(html, content, re.S) @@ -52,7 +52,7 @@ def test_graphviz_svg_html(app, status, warning): content = (app.outdir / 'index.html').text() - html = (r'
\n' + html = (r'
\n' r'
\n' r'\s*

digraph foo {\n' r'bar -> baz\n' diff --git a/tests/test_ext_inheritance_diagram.py b/tests/test_ext_inheritance_diagram.py index 30ad625aac0..71ff5a1392f 100644 --- a/tests/test_ext_inheritance_diagram.py +++ b/tests/test_ext_inheritance_diagram.py @@ -23,7 +23,7 @@ def test_inheritance_diagram_png_html(app, status, warning): content = (app.outdir / 'index.html').text() - pattern = ('

\n' + pattern = ('
\n' '
' 'Inheritance diagram of test.Foo
\n

' @@ -40,7 +40,7 @@ def test_inheritance_diagram_svg_html(app, status, warning): content = (app.outdir / 'index.html').text() - pattern = ('

\n' + pattern = ('
\n' '
' '\n' @@ -80,7 +80,7 @@ def test_inheritance_diagram_latex_alias(app, status, warning): content = (app.outdir / 'index.html').text() - pattern = ('
\n' + pattern = ('
\n' '
' 'Inheritance diagram of test.Foo
\n

'