Fix #9710: html: Wrong styles for even/odd rows in nested tables

This commit is contained in:
Takeshi KOMIYA 2021-10-09 16:27:43 +09:00
parent 3aabcd2f80
commit dd2ff3e911
4 changed files with 83 additions and 17 deletions

View File

@ -28,6 +28,11 @@ Incompatible changes
Deprecated Deprecated
---------- ----------
* ``sphinx.writers.html.HTMLTranslator._fieldlist_row_index``
* ``sphinx.writers.html.HTMLTranslator._table_row_index``
* ``sphinx.writers.html5.HTML5Translator._fieldlist_row_index``
* ``sphinx.writers.html5.HTML5Translator._table_row_index``
Features added Features added
-------------- --------------
@ -58,6 +63,7 @@ Bugs fixed
* #9630: autosummary: Failed to build summary table if :confval:`primary_domain` * #9630: autosummary: Failed to build summary table if :confval:`primary_domain`
is not 'py' is not 'py'
* #9670: html: Fix download file with special characters * #9670: html: Fix download file with special characters
* #9710: html: Wrong styles for even/odd rows in nested tables
* #9649: HTML search: when objects have the same name but in different domains, * #9649: HTML search: when objects have the same name but in different domains,
return all of them as result instead of just one. return all of them as result instead of just one.
* #9678: linkcheck: file extension was shown twice in warnings * #9678: linkcheck: file extension was shown twice in warnings

View File

@ -22,6 +22,26 @@ The following is a list of deprecated interfaces.
- (will be) Removed - (will be) Removed
- Alternatives - Alternatives
* - ``sphinx.writers.html.HTMLTranslator._fieldlist_row_index``
- 4.3
- 6.0
- ``sphinx.writers.html.HTMLTranslator._fieldlist_row_indices``
* - ``sphinx.writers.html.HTMLTranslator._table_row_index``
- 4.3
- 6.0
- ``sphinx.writers.html.HTMLTranslator._table_row_indices``
* - ``sphinx.writers.html5.HTML5Translator._fieldlist_row_index``
- 4.3
- 6.0
- ``sphinx.writers.html5.HTML5Translator._fieldlist_row_indices``
* - ``sphinx.writers.html5.HTML5Translator._table_row_index``
- 4.3
- 6.0
- ``sphinx.writers.html5.HTML5Translator._table_row_indices``
* - The optional argument ``app`` for ``sphinx.environment.BuildEnvironment`` * - The optional argument ``app`` for ``sphinx.environment.BuildEnvironment``
- 4.1 - 4.1
- 6.0 - 6.0

View File

@ -23,7 +23,7 @@ from docutils.writers.html4css1 import Writer
from sphinx import addnodes from sphinx import addnodes
from sphinx.builders import Builder from sphinx.builders import Builder
from sphinx.deprecation import RemovedInSphinx50Warning from sphinx.deprecation import RemovedInSphinx50Warning, RemovedInSphinx60Warning
from sphinx.locale import _, __, admonitionlabels from sphinx.locale import _, __, admonitionlabels
from sphinx.util import logging from sphinx.util import logging
from sphinx.util.docutils import SphinxTranslator from sphinx.util.docutils import SphinxTranslator
@ -96,8 +96,8 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
self.secnumber_suffix = self.config.html_secnumber_suffix self.secnumber_suffix = self.config.html_secnumber_suffix
self.param_separator = '' self.param_separator = ''
self.optional_param_level = 0 self.optional_param_level = 0
self._table_row_index = 0 self._table_row_indices = [0]
self._fieldlist_row_index = 0 self._fieldlist_row_indices = [0]
self.required_params_left = 0 self.required_params_left = 0
def visit_start_of_file(self, node: Element) -> None: def visit_start_of_file(self, node: Element) -> None:
@ -807,16 +807,20 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
# overwritten to add even/odd classes # overwritten to add even/odd classes
def visit_table(self, node: Element) -> None: def visit_table(self, node: Element) -> None:
self._table_row_index = 0 self._table_row_indices.append(0)
# set align=default if align not specified to give a default style # set align=default if align not specified to give a default style
node.setdefault('align', 'default') node.setdefault('align', 'default')
return super().visit_table(node) return super().visit_table(node)
def depart_table(self, node: Element) -> None:
self._table_row_indices.pop()
super().depart_table(node)
def visit_row(self, node: Element) -> None: def visit_row(self, node: Element) -> None:
self._table_row_index += 1 self._table_row_indices[-1] += 1
if self._table_row_index % 2 == 0: if self._table_row_indices[-1] % 2 == 0:
node['classes'].append('row-even') node['classes'].append('row-even')
else: else:
node['classes'].append('row-odd') node['classes'].append('row-odd')
@ -829,12 +833,16 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
self.body[-1] = ' ' self.body[-1] = ' '
def visit_field_list(self, node: Element) -> None: def visit_field_list(self, node: Element) -> None:
self._fieldlist_row_index = 0 self._fieldlist_row_indices.append(0)
return super().visit_field_list(node) return super().visit_field_list(node)
def depart_field_list(self, node: Element) -> None:
self._fieldlist_row_indices.pop()
return super().depart_field_list(node)
def visit_field(self, node: Element) -> None: def visit_field(self, node: Element) -> None:
self._fieldlist_row_index += 1 self._fieldlist_row_indices[-1] += 1
if self._fieldlist_row_index % 2 == 0: if self._fieldlist_row_indices[-1] % 2 == 0:
node['classes'].append('field-even') node['classes'].append('field-even')
else: else:
node['classes'].append('field-odd') node['classes'].append('field-odd')
@ -876,3 +884,15 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
warnings.warn('HTMLTranslator.permalink_text is deprecated.', warnings.warn('HTMLTranslator.permalink_text is deprecated.',
RemovedInSphinx50Warning, stacklevel=2) RemovedInSphinx50Warning, stacklevel=2)
return self.config.html_permalinks_icon return self.config.html_permalinks_icon
@property
def _fieldlist_row_index(self):
warnings.warn('_fieldlist_row_index is deprecated',
RemovedInSphinx60Warning, stacklevel=2)
return self._fieldlist_row_indices[-1]
@property
def _table_row_index(self):
warnings.warn('_table_row_index is deprecated',
RemovedInSphinx60Warning, stacklevel=2)
return self._table_row_indices[-1]

View File

@ -67,8 +67,8 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
self.secnumber_suffix = self.config.html_secnumber_suffix self.secnumber_suffix = self.config.html_secnumber_suffix
self.param_separator = '' self.param_separator = ''
self.optional_param_level = 0 self.optional_param_level = 0
self._table_row_index = 0 self._table_row_indices = [0]
self._fieldlist_row_index = 0 self._fieldlist_row_indices = [0]
self.required_params_left = 0 self.required_params_left = 0
def visit_start_of_file(self, node: Element) -> None: def visit_start_of_file(self, node: Element) -> None:
@ -743,7 +743,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
# overwritten to add even/odd classes # overwritten to add even/odd classes
def visit_table(self, node: Element) -> None: def visit_table(self, node: Element) -> None:
self._table_row_index = 0 self._table_row_indices.append(0)
atts = {} atts = {}
classes = [cls.strip(' \t\n') for cls in self.settings.table_style.split(',')] classes = [cls.strip(' \t\n') for cls in self.settings.table_style.split(',')]
@ -757,9 +757,13 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
tag = self.starttag(node, 'table', CLASS=' '.join(classes), **atts) tag = self.starttag(node, 'table', CLASS=' '.join(classes), **atts)
self.body.append(tag) self.body.append(tag)
def depart_table(self, node: Element) -> None:
self._table_row_indices.pop()
super().depart_table(node)
def visit_row(self, node: Element) -> None: def visit_row(self, node: Element) -> None:
self._table_row_index += 1 self._table_row_indices[-1] += 1
if self._table_row_index % 2 == 0: if self._table_row_indices[-1] % 2 == 0:
node['classes'].append('row-even') node['classes'].append('row-even')
else: else:
node['classes'].append('row-odd') node['classes'].append('row-odd')
@ -767,12 +771,16 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
node.column = 0 # type: ignore node.column = 0 # type: ignore
def visit_field_list(self, node: Element) -> None: def visit_field_list(self, node: Element) -> None:
self._fieldlist_row_index = 0 self._fieldlist_row_indices.append(0)
return super().visit_field_list(node) return super().visit_field_list(node)
def depart_field_list(self, node: Element) -> None:
self._fieldlist_row_indices.pop()
return super().depart_field_list(node)
def visit_field(self, node: Element) -> None: def visit_field(self, node: Element) -> None:
self._fieldlist_row_index += 1 self._fieldlist_row_indices[-1] += 1
if self._fieldlist_row_index % 2 == 0: if self._fieldlist_row_indices[-1] % 2 == 0:
node['classes'].append('field-even') node['classes'].append('field-even')
else: else:
node['classes'].append('field-odd') node['classes'].append('field-odd')
@ -822,3 +830,15 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
for id in node['ids'][1:]: for id in node['ids'][1:]:
self.body.append('<span id="%s"></span>' % id) self.body.append('<span id="%s"></span>' % id)
node['ids'].remove(id) node['ids'].remove(id)
@property
def _fieldlist_row_index(self):
warnings.warn('_fieldlist_row_index is deprecated',
RemovedInSphinx60Warning, stacklevel=2)
return self._fieldlist_row_indices[-1]
@property
def _table_row_index(self):
warnings.warn('_table_row_index is deprecated',
RemovedInSphinx60Warning, stacklevel=2)
return self._table_row_indices[-1]