diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py
index 381457926..d283398f0 100644
--- a/sphinx/writers/html.py
+++ b/sphinx/writers/html.py
@@ -13,9 +13,11 @@ import os
import posixpath
import sys
import warnings
-from typing import Iterable, cast
+from typing import cast
+from typing import Iterable
from docutils import nodes
+from docutils.nodes import Element, Node, Text
from docutils.writers.html4css1 import Writer, HTMLTranslator as BaseTranslator
from sphinx import addnodes
@@ -28,8 +30,7 @@ from sphinx.util.images import get_image_size
if False:
# For type annotation
- from typing import Any # NOQA
- from sphinx.builders.html import StandaloneHTMLBuilder # NOQA
+ from sphinx.builders.html import StandaloneHTMLBuilder
logger = logging.getLogger(__name__)
@@ -46,13 +47,11 @@ class HTMLWriter(Writer):
if '--embed-stylesheet' in _setting[1]:
_setting[2]['default'] = 0
- def __init__(self, builder):
- # type: (StandaloneHTMLBuilder) -> None
+ def __init__(self, builder: "StandaloneHTMLBuilder") -> None:
super().__init__()
self.builder = builder
- def translate(self):
- # type: () -> None
+ def translate(self) -> None:
# sadly, this is mostly copied from parent class
visitor = self.builder.create_translator(self.document, self.builder)
self.visitor = cast(HTMLTranslator, visitor)
@@ -74,8 +73,7 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
builder = None # type: StandaloneHTMLBuilder
- def __init__(self, *args):
- # type: (Any) -> None
+ def __init__(self, *args) -> None:
if isinstance(args[0], nodes.document) and isinstance(args[1], Builder):
document, builder = args
else:
@@ -101,26 +99,21 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
self._fieldlist_row_index = 0
self.required_params_left = 0
- def visit_start_of_file(self, node):
- # type: (nodes.Element) -> None
+ def visit_start_of_file(self, node: Element) -> None:
# only occurs in the single-file builder
self.docnames.append(node['docname'])
self.body.append('' % node['docname'])
- def depart_start_of_file(self, node):
- # type: (nodes.Element) -> None
+ def depart_start_of_file(self, node: Element) -> None:
self.docnames.pop()
- def visit_desc(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc(self, node: Element) -> None:
self.body.append(self.starttag(node, 'dl', CLASS=node['objtype']))
- def depart_desc(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc(self, node: Element) -> None:
self.body.append('\n\n')
- def visit_desc_signature(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_signature(self, node: Element) -> None:
# the id is set automatically
self.body.append(self.starttag(node, 'dt'))
# anchor for per-desc interactive data
@@ -128,57 +121,45 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
and node['ids'] and node['first']:
self.body.append('' % node['ids'][0])
- def depart_desc_signature(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_signature(self, node: Element) -> None:
if not node.get('is_multiline'):
self.add_permalink_ref(node, _('Permalink to this definition'))
self.body.append('\n')
- def visit_desc_signature_line(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_signature_line(self, node: Element) -> None:
pass
- def depart_desc_signature_line(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_signature_line(self, node: Element) -> None:
if node.get('add_permalink'):
# the permalink info is on the parent desc_signature node
self.add_permalink_ref(node.parent, _('Permalink to this definition'))
self.body.append('
')
- def visit_desc_addname(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_addname(self, node: Element) -> None:
self.body.append(self.starttag(node, 'code', '', CLASS='descclassname'))
- def depart_desc_addname(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_addname(self, node: Element) -> None:
self.body.append('')
- def visit_desc_type(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_type(self, node: Element) -> None:
pass
- def depart_desc_type(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_type(self, node: Element) -> None:
pass
- def visit_desc_returns(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_returns(self, node: Element) -> None:
self.body.append(' → ')
- def depart_desc_returns(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_returns(self, node: Element) -> None:
pass
- def visit_desc_name(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_name(self, node: Element) -> None:
self.body.append(self.starttag(node, 'code', '', CLASS='descname'))
- def depart_desc_name(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_name(self, node: Element) -> None:
self.body.append('')
- def visit_desc_parameterlist(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_parameterlist(self, node: Element) -> None:
self.body.append('(')
self.first_param = 1
self.optional_param_level = 0
@@ -187,8 +168,7 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
for c in node.children])
self.param_separator = node.child_text_separator
- def depart_desc_parameterlist(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_parameterlist(self, node: Element) -> None:
self.body.append(')')
# If required parameters are still to come, then put the comma after
@@ -197,8 +177,7 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
#
# foo([a, ]b, c[, d])
#
- def visit_desc_parameter(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_parameter(self, node: Element) -> None:
if self.first_param:
self.first_param = 0
elif not self.required_params_left:
@@ -208,50 +187,40 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
if not node.hasattr('noemph'):
self.body.append('')
- def depart_desc_parameter(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_parameter(self, node: Element) -> None:
if not node.hasattr('noemph'):
self.body.append('')
if self.required_params_left:
self.body.append(self.param_separator)
- def visit_desc_optional(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_optional(self, node: Element) -> None:
self.optional_param_level += 1
self.body.append('[')
- def depart_desc_optional(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_optional(self, node: Element) -> None:
self.optional_param_level -= 1
self.body.append(']')
- def visit_desc_annotation(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_annotation(self, node: Element) -> None:
self.body.append(self.starttag(node, 'em', '', CLASS='property'))
- def depart_desc_annotation(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_annotation(self, node: Element) -> None:
self.body.append('')
- def visit_desc_content(self, node):
- # type: (nodes.Element) -> None
+ def visit_desc_content(self, node: Element) -> None:
self.body.append(self.starttag(node, 'dd', ''))
- def depart_desc_content(self, node):
- # type: (nodes.Element) -> None
+ def depart_desc_content(self, node: Element) -> None:
self.body.append('')
- def visit_versionmodified(self, node):
- # type: (nodes.Element) -> None
+ def visit_versionmodified(self, node: Element) -> None:
self.body.append(self.starttag(node, 'div', CLASS=node['type']))
- def depart_versionmodified(self, node):
- # type: (nodes.Element) -> None
+ def depart_versionmodified(self, node: Element) -> None:
self.body.append('\n')
# overwritten
- def visit_reference(self, node):
- # type: (nodes.Element) -> None
+ def visit_reference(self, node: Element) -> None:
atts = {'class': 'reference'}
if node.get('internal') or 'refuri' not in node:
atts['class'] += ' internal'
@@ -279,38 +248,31 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
self.body.append(('%s' + self.secnumber_suffix) %
'.'.join(map(str, node['secnumber'])))
- def visit_number_reference(self, node):
- # type: (nodes.Element) -> None
+ def visit_number_reference(self, node: Element) -> None:
self.visit_reference(node)
- def depart_number_reference(self, node):
- # type: (nodes.Element) -> None
+ def depart_number_reference(self, node: Element) -> None:
self.depart_reference(node)
# overwritten -- we don't want source comments to show up in the HTML
- def visit_comment(self, node): # type: ignore
- # type: (nodes.Element) -> None
+ def visit_comment(self, node: Element) -> None: # type: ignore
raise nodes.SkipNode
# overwritten
- def visit_admonition(self, node, name=''):
- # type: (nodes.Element, str) -> None
+ def visit_admonition(self, node: Element, name: str = '') -> None:
self.body.append(self.starttag(
node, 'div', CLASS=('admonition ' + name)))
if name:
node.insert(0, nodes.title(name, admonitionlabels[name]))
self.set_first_last(node)
- def visit_seealso(self, node):
- # type: (nodes.Element) -> None
+ def visit_seealso(self, node: Element) -> None:
self.visit_admonition(node, 'seealso')
- def depart_seealso(self, node):
- # type: (nodes.Element) -> None
+ def depart_seealso(self, node: Element) -> None:
self.depart_admonition(node)
- def add_secnumber(self, node):
- # type: (nodes.Element) -> None
+ def add_secnumber(self, node: Element) -> None:
if node.get('secnumber'):
self.body.append('.'.join(map(str, node['secnumber'])) +
self.secnumber_suffix)
@@ -329,10 +291,8 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
self.body.append('.'.join(map(str, numbers)) +
self.secnumber_suffix)
- def add_fignumber(self, node):
- # type: (nodes.Element) -> None
- def append_fignumber(figtype, figure_id):
- # type: (str, str) -> None
+ def add_fignumber(self, node: Element) -> None:
+ def append_fignumber(figtype: str, figure_id: str) -> None:
if self.builder.name == 'singlehtml':
key = "%s/%s" % (self.docnames[-1], figtype)
else:
@@ -357,14 +317,12 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
else:
append_fignumber(figtype, node['ids'][0])
- def add_permalink_ref(self, node, title):
- # type: (nodes.Element, str) -> None
+ def add_permalink_ref(self, node: Element, title: str) -> None:
if node['ids'] and self.permalink_text and self.builder.add_permalinks:
format = '%s'
self.body.append(format % (node['ids'][0], title, self.permalink_text))
- def generate_targets_for_listing(self, node):
- # type: (nodes.Element) -> None
+ def generate_targets_for_listing(self, node: Element) -> None:
"""Generate hyperlink targets for listings.
Original visit_bullet_list(), visit_definition_list() and visit_enumerated_list()
@@ -379,8 +337,7 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
node['ids'].remove(id)
# overwritten
- def visit_bullet_list(self, node):
- # type: (nodes.Element) -> None
+ def visit_bullet_list(self, node: Element) -> None:
if len(node) == 1 and isinstance(node[0], addnodes.toctree):
# avoid emitting empty
tags around paragraph can be omitted.""" if isinstance(node.parent, addnodes.desc_content): # Never compact desc_content items. @@ -604,16 +537,13 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator): return False return super().should_be_compact_paragraph(node) - def visit_compact_paragraph(self, node): - # type: (nodes.Element) -> None + def visit_compact_paragraph(self, node: Element) -> None: pass - def depart_compact_paragraph(self, node): - # type: (nodes.Element) -> None + def depart_compact_paragraph(self, node: Element) -> None: pass - def visit_download_reference(self, node): - # type: (nodes.Element) -> None + def visit_download_reference(self, node: Element) -> None: atts = {'class': 'reference download', 'download': ''} @@ -632,13 +562,11 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator): else: self.context.append('') - def depart_download_reference(self, node): - # type: (nodes.Element) -> None + def depart_download_reference(self, node: Element) -> None: self.body.append(self.context.pop()) # overwritten - def visit_image(self, node): - # type: (nodes.Element) -> None + def visit_image(self, node: Element) -> None: olduri = node['uri'] # rewrite the URI if the environment knows about it if olduri in self.builder.images: @@ -679,67 +607,53 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator): super().visit_image(node) # overwritten - def depart_image(self, node): - # type: (nodes.Element) -> None + def depart_image(self, node: Element) -> None: if node['uri'].lower().endswith(('svg', 'svgz')): self.body.append(self.context.pop()) else: super().depart_image(node) - def visit_toctree(self, node): - # type: (nodes.Element) -> None + def visit_toctree(self, node: Element) -> None: # this only happens when formatting a toc from env.tocs -- in this # case we don't want to include the subtree raise nodes.SkipNode - def visit_index(self, node): - # type: (nodes.Element) -> None + def visit_index(self, node: Element) -> None: raise nodes.SkipNode - def visit_tabular_col_spec(self, node): - # type: (nodes.Element) -> None + def visit_tabular_col_spec(self, node: Element) -> None: raise nodes.SkipNode - def visit_glossary(self, node): - # type: (nodes.Element) -> None + def visit_glossary(self, node: Element) -> None: pass - def depart_glossary(self, node): - # type: (nodes.Element) -> None + def depart_glossary(self, node: Element) -> None: pass - def visit_acks(self, node): - # type: (nodes.Element) -> None + def visit_acks(self, node: Element) -> None: pass - def depart_acks(self, node): - # type: (nodes.Element) -> None + def depart_acks(self, node: Element) -> None: pass - def visit_hlist(self, node): - # type: (nodes.Element) -> None + def visit_hlist(self, node: Element) -> None: self.body.append('