diff --git a/CHANGES b/CHANGES index f21c9c762..933abe2f7 100644 --- a/CHANGES +++ b/CHANGES @@ -28,6 +28,11 @@ Incompatible changes 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 -------------- @@ -58,6 +63,7 @@ Bugs fixed * #9630: autosummary: Failed to build summary table if :confval:`primary_domain` is not 'py' * #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, return all of them as result instead of just one. * #9678: linkcheck: file extension was shown twice in warnings diff --git a/doc/extdev/deprecated.rst b/doc/extdev/deprecated.rst index 0a4830e79..611a79076 100644 --- a/doc/extdev/deprecated.rst +++ b/doc/extdev/deprecated.rst @@ -22,6 +22,26 @@ The following is a list of deprecated interfaces. - (will be) Removed - 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`` - 4.1 - 6.0 diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index 544ac184b..fead4c61d 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -23,7 +23,7 @@ from docutils.writers.html4css1 import Writer from sphinx import addnodes from sphinx.builders import Builder -from sphinx.deprecation import RemovedInSphinx50Warning +from sphinx.deprecation import RemovedInSphinx50Warning, RemovedInSphinx60Warning from sphinx.locale import _, __, admonitionlabels from sphinx.util import logging from sphinx.util.docutils import SphinxTranslator @@ -96,8 +96,8 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator): self.secnumber_suffix = self.config.html_secnumber_suffix self.param_separator = '' self.optional_param_level = 0 - self._table_row_index = 0 - self._fieldlist_row_index = 0 + self._table_row_indices = [0] + self._fieldlist_row_indices = [0] self.required_params_left = 0 def visit_start_of_file(self, node: Element) -> None: @@ -807,16 +807,20 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator): # overwritten to add even/odd classes 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 node.setdefault('align', 'default') 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: - self._table_row_index += 1 - if self._table_row_index % 2 == 0: + self._table_row_indices[-1] += 1 + if self._table_row_indices[-1] % 2 == 0: node['classes'].append('row-even') else: node['classes'].append('row-odd') @@ -829,12 +833,16 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator): self.body[-1] = ' ' 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) + 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: - self._fieldlist_row_index += 1 - if self._fieldlist_row_index % 2 == 0: + self._fieldlist_row_indices[-1] += 1 + if self._fieldlist_row_indices[-1] % 2 == 0: node['classes'].append('field-even') else: node['classes'].append('field-odd') @@ -876,3 +884,15 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator): warnings.warn('HTMLTranslator.permalink_text is deprecated.', RemovedInSphinx50Warning, stacklevel=2) 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] diff --git a/sphinx/writers/html5.py b/sphinx/writers/html5.py index 27139f066..15fd15449 100644 --- a/sphinx/writers/html5.py +++ b/sphinx/writers/html5.py @@ -67,8 +67,8 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): self.secnumber_suffix = self.config.html_secnumber_suffix self.param_separator = '' self.optional_param_level = 0 - self._table_row_index = 0 - self._fieldlist_row_index = 0 + self._table_row_indices = [0] + self._fieldlist_row_indices = [0] self.required_params_left = 0 def visit_start_of_file(self, node: Element) -> None: @@ -743,7 +743,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # overwritten to add even/odd classes def visit_table(self, node: Element) -> None: - self._table_row_index = 0 + self._table_row_indices.append(0) atts = {} 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) 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: - self._table_row_index += 1 - if self._table_row_index % 2 == 0: + self._table_row_indices[-1] += 1 + if self._table_row_indices[-1] % 2 == 0: node['classes'].append('row-even') else: node['classes'].append('row-odd') @@ -767,12 +771,16 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): node.column = 0 # type: ignore 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) + 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: - self._fieldlist_row_index += 1 - if self._fieldlist_row_index % 2 == 0: + self._fieldlist_row_indices[-1] += 1 + if self._fieldlist_row_indices[-1] % 2 == 0: node['classes'].append('field-even') else: node['classes'].append('field-odd') @@ -822,3 +830,15 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): for id in node['ids'][1:]: self.body.append('' % 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]