summaryrefslogtreecommitdiff
path: root/sphinx/writers/html5.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/writers/html5.py')
-rw-r--r--sphinx/writers/html5.py324
1 files changed, 160 insertions, 164 deletions
diff --git a/sphinx/writers/html5.py b/sphinx/writers/html5.py
index cec5faeac..03eccb28f 100644
--- a/sphinx/writers/html5.py
+++ b/sphinx/writers/html5.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
sphinx.writers.html5
~~~~~~~~~~~~~~~~~~~~
@@ -13,15 +12,17 @@ import os
import posixpath
import sys
import warnings
+from typing import Iterable, cast
from docutils import nodes
from docutils.writers.html5_polyglot import HTMLTranslator as BaseTranslator
-from six import string_types
from sphinx import addnodes
-from sphinx.deprecation import RemovedInSphinx30Warning
+from sphinx.builders import Builder
+from sphinx.deprecation import RemovedInSphinx30Warning, RemovedInSphinx40Warning
from sphinx.locale import admonitionlabels, _, __
from sphinx.util import logging
+from sphinx.util.docutils import SphinxTranslator
from sphinx.util.images import get_image_size
if False:
@@ -36,50 +37,59 @@ logger = logging.getLogger(__name__)
# http://www.arnebrodowski.de/blog/write-your-own-restructuredtext-writer.html
-class HTML5Translator(BaseTranslator):
+class HTML5Translator(SphinxTranslator, BaseTranslator):
"""
Our custom HTML translator.
"""
- def __init__(self, builder, *args, **kwds):
- # type: (StandaloneHTMLBuilder, Any, Any) -> None
- BaseTranslator.__init__(self, *args, **kwds)
- self.highlighter = builder.highlighter
- self.builder = builder
- self.docnames = [builder.current_docname] # for singlehtml builder
- self.manpages_url = builder.config.manpages_url
+ builder = None # type: StandaloneHTMLBuilder
+
+ def __init__(self, *args):
+ # type: (Any) -> None
+ if isinstance(args[0], nodes.document) and isinstance(args[1], Builder):
+ document, builder = args
+ else:
+ warnings.warn('The order of arguments for HTML5Translator has been changed. '
+ 'Please give "document" as 1st and "builder" as 2nd.',
+ RemovedInSphinx40Warning, stacklevel=2)
+ builder, document = args
+ super().__init__(document, builder)
+
+ self.highlighter = self.builder.highlighter
+ self.docnames = [self.builder.current_docname] # for singlehtml builder
+ self.manpages_url = self.config.manpages_url
self.protect_literal_text = 0
- self.permalink_text = builder.config.html_add_permalinks
+ self.permalink_text = self.config.html_add_permalinks
# support backwards-compatible setting to a bool
- if not isinstance(self.permalink_text, string_types):
- self.permalink_text = self.permalink_text and u'\u00B6' or ''
+ if not isinstance(self.permalink_text, str):
+ self.permalink_text = self.permalink_text and 'ΒΆ' or ''
self.permalink_text = self.encode(self.permalink_text)
- self.secnumber_suffix = builder.config.html_secnumber_suffix
+ self.secnumber_suffix = self.config.html_secnumber_suffix
self.param_separator = ''
self.optional_param_level = 0
self._table_row_index = 0
self.required_params_left = 0
def visit_start_of_file(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
# only occurs in the single-file builder
self.docnames.append(node['docname'])
self.body.append('<span id="document-%s"></span>' % node['docname'])
def depart_start_of_file(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.docnames.pop()
def visit_desc(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'dl', CLASS=node['objtype']))
def depart_desc(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</dl>\n\n')
def visit_desc_signature(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
# the id is set automatically
self.body.append(self.starttag(node, 'dt'))
# anchor for per-desc interactive data
@@ -88,56 +98,56 @@ class HTML5Translator(BaseTranslator):
self.body.append('<!--[%s]-->' % node['ids'][0])
def depart_desc_signature(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if not node.get('is_multiline'):
self.add_permalink_ref(node, _('Permalink to this definition'))
self.body.append('</dt>\n')
def visit_desc_signature_line(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def depart_desc_signature_line(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.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('<br />')
def visit_desc_addname(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'code', '', CLASS='descclassname'))
def depart_desc_addname(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</code>')
def visit_desc_type(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def depart_desc_type(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def visit_desc_returns(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(' &#x2192; ')
def depart_desc_returns(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def visit_desc_name(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'code', '', CLASS='descname'))
def depart_desc_name(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</code>')
def visit_desc_parameterlist(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('<span class="sig-paren">(</span>')
self.first_param = 1
self.optional_param_level = 0
@@ -147,7 +157,7 @@ class HTML5Translator(BaseTranslator):
self.param_separator = node.child_text_separator
def depart_desc_parameterlist(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('<span class="sig-paren">)</span>')
# If required parameters are still to come, then put the comma after
@@ -157,7 +167,7 @@ class HTML5Translator(BaseTranslator):
# foo([a, ]b, c[, d])
#
def visit_desc_parameter(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if self.first_param:
self.first_param = 0
elif not self.required_params_left:
@@ -168,49 +178,49 @@ class HTML5Translator(BaseTranslator):
self.body.append('<em>')
def depart_desc_parameter(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if not node.hasattr('noemph'):
self.body.append('</em>')
if self.required_params_left:
self.body.append(self.param_separator)
def visit_desc_optional(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.optional_param_level += 1
self.body.append('<span class="optional">[</span>')
def depart_desc_optional(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.optional_param_level -= 1
self.body.append('<span class="optional">]</span>')
def visit_desc_annotation(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'em', '', CLASS='property'))
def depart_desc_annotation(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</em>')
def visit_desc_content(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'dd', ''))
def depart_desc_content(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</dd>')
def visit_versionmodified(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'div', CLASS=node['type']))
def depart_versionmodified(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</div>\n')
# overwritten
def visit_reference(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
atts = {'class': 'reference'}
if node.get('internal') or 'refuri' not in node:
atts['class'] += ' internal'
@@ -218,10 +228,9 @@ class HTML5Translator(BaseTranslator):
atts['class'] += ' external'
if 'refuri' in node:
atts['href'] = node['refuri'] or '#'
- if self.settings.cloak_email_addresses and \
- atts['href'].startswith('mailto:'):
+ if self.settings.cloak_email_addresses and atts['href'].startswith('mailto:'):
atts['href'] = self.cloak_mailto(atts['href'])
- self.in_mailto = 1
+ self.in_mailto = True
else:
assert 'refid' in node, \
'References must have "refuri" or "refid" attribute.'
@@ -240,36 +249,36 @@ class HTML5Translator(BaseTranslator):
'.'.join(map(str, node['secnumber'])))
def visit_number_reference(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_reference(node)
def depart_number_reference(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.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: (nodes.Node) -> None
+ def visit_comment(self, node): # type: ignore
+ # type: (nodes.Element) -> None
raise nodes.SkipNode
# overwritten
def visit_admonition(self, node, name=''):
- # type: (nodes.Node, unicode) -> None
+ # type: (nodes.Element, str) -> None
self.body.append(self.starttag(
node, 'div', CLASS=('admonition ' + name)))
if name:
node.insert(0, nodes.title(name, admonitionlabels[name]))
def visit_seealso(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'seealso')
def depart_seealso(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def add_secnumber(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if node.get('secnumber'):
self.body.append('.'.join(map(str, node['secnumber'])) +
self.secnumber_suffix)
@@ -289,11 +298,11 @@ class HTML5Translator(BaseTranslator):
self.secnumber_suffix)
def add_fignumber(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
def append_fignumber(figtype, figure_id):
- # type: (unicode, unicode) -> None
+ # type: (str, str) -> None
if self.builder.name == 'singlehtml':
- key = u"%s/%s" % (self.docnames[-1], figtype)
+ key = "%s/%s" % (self.docnames[-1], figtype)
else:
key = figtype
@@ -317,30 +326,30 @@ class HTML5Translator(BaseTranslator):
append_fignumber(figtype, node['ids'][0])
def add_permalink_ref(self, node, title):
- # type: (nodes.Node, unicode) -> None
+ # type: (nodes.Element, str) -> None
if node['ids'] and self.permalink_text and self.builder.add_permalinks:
- format = u'<a class="headerlink" href="#%s" title="%s">%s</a>'
+ format = '<a class="headerlink" href="#%s" title="%s">%s</a>'
self.body.append(format % (node['ids'][0], title, self.permalink_text))
# overwritten
def visit_bullet_list(self, node):
- # type: (nodes.Node) -> None
- if len(node) == 1 and node[0].tagname == 'toctree':
+ # type: (nodes.Element) -> None
+ if len(node) == 1 and isinstance(node[0], addnodes.toctree):
# avoid emitting empty <ul></ul>
raise nodes.SkipNode
- BaseTranslator.visit_bullet_list(self, node)
+ super().visit_bullet_list(node)
# overwritten
def visit_title(self, node):
- # type: (nodes.Node) -> None
- BaseTranslator.visit_title(self, node)
+ # type: (nodes.Element) -> None
+ super().visit_title(node)
self.add_secnumber(node)
self.add_fignumber(node.parent)
if isinstance(node.parent, nodes.table):
self.body.append('<span class="caption-text">')
def depart_title(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
close_tag = self.context[-1]
if (self.permalink_text and self.builder.add_permalinks and
node.parent.hasattr('ids') and node.parent['ids']):
@@ -348,9 +357,9 @@ class HTML5Translator(BaseTranslator):
if close_tag.startswith('</h'):
self.add_permalink_ref(node.parent, _('Permalink to this headline'))
elif close_tag.startswith('</a></h'):
- self.body.append(u'</a><a class="headerlink" href="#%s" ' %
+ self.body.append('</a><a class="headerlink" href="#%s" ' %
node.parent['ids'][0] +
- u'title="%s">%s' % (
+ 'title="%s">%s' % (
_('Permalink to this headline'),
self.permalink_text))
elif isinstance(node.parent, nodes.table):
@@ -359,14 +368,14 @@ class HTML5Translator(BaseTranslator):
elif isinstance(node.parent, nodes.table):
self.body.append('</span>')
- BaseTranslator.depart_title(self, node)
+ super().depart_title(node)
# overwritten
def visit_literal_block(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if node.rawsource != node.astext():
# most probably a parsed-literal block -- don't highlight
- return BaseTranslator.visit_literal_block(self, node)
+ return super().visit_literal_block(node)
lang = node.get('language', 'default')
linenos = node.get('linenos', False)
@@ -388,16 +397,16 @@ class HTML5Translator(BaseTranslator):
raise nodes.SkipNode
def visit_caption(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
self.body.append('<div class="code-block-caption">')
else:
- BaseTranslator.visit_caption(self, node)
+ super().visit_caption(node)
self.add_fignumber(node.parent)
self.body.append(self.starttag(node, 'span', '', CLASS='caption-text'))
def depart_caption(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</span>')
# append permalink if available
@@ -413,24 +422,24 @@ class HTML5Translator(BaseTranslator):
if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
self.body.append('</div>\n')
else:
- BaseTranslator.depart_caption(self, node)
+ super().depart_caption(node)
def visit_doctest_block(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_literal_block(node)
# overwritten to add the <div> (for XHTML compliance)
def visit_block_quote(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'blockquote') + '<div>')
def depart_block_quote(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</div></blockquote>\n')
# overwritten
def visit_literal(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if 'kbd' in node['classes']:
self.body.append(self.starttag(node, 'kbd', '',
CLASS='docutils literal notranslate'))
@@ -440,7 +449,7 @@ class HTML5Translator(BaseTranslator):
self.protect_literal_text += 1
def depart_literal(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if 'kbd' in node['classes']:
self.body.append('</kbd>')
else:
@@ -448,14 +457,15 @@ class HTML5Translator(BaseTranslator):
self.body.append('</code>')
def visit_productionlist(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'pre'))
names = []
- for production in node:
+ productionlist = cast(Iterable[addnodes.production], node)
+ for production in productionlist:
names.append(production['tokenname'])
maxlen = max(len(name) for name in names)
lastname = None
- for production in node:
+ for production in productionlist:
if production['tokenname']:
lastname = production['tokenname'].ljust(maxlen)
self.body.append(self.starttag(production, 'strong', ''))
@@ -468,48 +478,36 @@ class HTML5Translator(BaseTranslator):
raise nodes.SkipNode
def depart_productionlist(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def visit_production(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def depart_production(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def visit_centered(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'p', CLASS="centered") +
'<strong>')
def depart_centered(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</strong></p>')
- # overwritten
- def should_be_compact_paragraph(self, node):
- # type: (nodes.Node) -> bool
- """Determine if the <p> tags around paragraph can be omitted."""
- if isinstance(node.parent, addnodes.desc_content):
- # Never compact desc_content items.
- return False
- if isinstance(node.parent, addnodes.versionmodified):
- # Never compact versionmodified nodes.
- return False
- return BaseTranslator.should_be_compact_paragraph(self, node)
-
def visit_compact_paragraph(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def depart_compact_paragraph(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def visit_download_reference(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
atts = {'class': 'reference download',
'download': ''}
@@ -529,12 +527,12 @@ class HTML5Translator(BaseTranslator):
self.context.append('')
def depart_download_reference(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append(self.context.pop())
# overwritten
def visit_image(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
olduri = node['uri']
# rewrite the URI if the environment knows about it
if olduri in self.builder.images:
@@ -572,65 +570,65 @@ class HTML5Translator(BaseTranslator):
node['width'] = str(size[0])
if 'height' not in node:
node['height'] = str(size[1])
- BaseTranslator.visit_image(self, node)
+ super().visit_image(node)
# overwritten
def depart_image(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if node['uri'].lower().endswith(('svg', 'svgz')):
self.body.append(self.context.pop())
else:
- BaseTranslator.depart_image(self, node)
+ super().depart_image(node)
def visit_toctree(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.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.Node) -> None
+ # type: (nodes.Element) -> None
raise nodes.SkipNode
def visit_tabular_col_spec(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
raise nodes.SkipNode
def visit_glossary(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def depart_glossary(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def visit_acks(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def depart_acks(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
pass
def visit_hlist(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('<table class="hlist"><tr>')
def depart_hlist(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</tr></table>\n')
def visit_hlistcol(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('<td>')
def depart_hlistcol(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</td>')
# overwritten
def visit_Text(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Text) -> None
text = node.astext()
encoded = self.encode(text)
if self.protect_literal_text:
@@ -652,113 +650,113 @@ class HTML5Translator(BaseTranslator):
self.body.append(encoded)
def visit_note(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'note')
def depart_note(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_warning(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'warning')
def depart_warning(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_attention(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'attention')
def depart_attention(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_caution(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'caution')
def depart_caution(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_danger(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'danger')
def depart_danger(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_error(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'error')
def depart_error(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_hint(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'hint')
def depart_hint(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_important(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'important')
def depart_important(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_tip(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_admonition(node, 'tip')
def depart_tip(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.depart_admonition(node)
def visit_literal_emphasis(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
return self.visit_emphasis(node)
def depart_literal_emphasis(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
return self.depart_emphasis(node)
def visit_literal_strong(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
return self.visit_strong(node)
def depart_literal_strong(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
return self.depart_strong(node)
def visit_abbreviation(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
attrs = {}
if node.hasattr('explanation'):
attrs['title'] = node['explanation']
self.body.append(self.starttag(node, 'abbr', '', **attrs))
def depart_abbreviation(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.body.append('</abbr>')
def visit_manpage(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.visit_literal_emphasis(node)
if self.manpages_url:
- node['refuri'] = self.manpages_url.format(**dict(node))
+ node['refuri'] = self.manpages_url.format(**node.attributes)
self.visit_reference(node)
def depart_manpage(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
if self.manpages_url:
self.depart_reference(node)
self.depart_literal_emphasis(node)
@@ -766,7 +764,7 @@ class HTML5Translator(BaseTranslator):
# overwritten to add even/odd classes
def generate_targets_for_table(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
"""Generate hyperlink targets for tables.
Original visit_table() generates hyperlink targets inside table tags
@@ -780,13 +778,12 @@ class HTML5Translator(BaseTranslator):
node['ids'].remove(id)
def visit_table(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self.generate_targets_for_table(node)
self._table_row_index = 0
- classes = [cls.strip(u' \t\n')
- for cls in self.settings.table_style.split(',')]
+ classes = [cls.strip(' \t\n') for cls in self.settings.table_style.split(',')]
classes.insert(0, "docutils") # compat
if 'align' in node:
classes.append('align-%s' % node['align'])
@@ -794,50 +791,49 @@ class HTML5Translator(BaseTranslator):
self.body.append(tag)
def visit_row(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self._table_row_index += 1
if self._table_row_index % 2 == 0:
node['classes'].append('row-even')
else:
node['classes'].append('row-odd')
self.body.append(self.starttag(node, 'tr', ''))
- node.column = 0
+ node.column = 0 # type: ignore
def visit_field_list(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self._fieldlist_row_index = 0
- return BaseTranslator.visit_field_list(self, node)
+ return super().visit_field_list(node)
def visit_field(self, node):
- # type: (nodes.Node) -> None
+ # type: (nodes.Element) -> None
self._fieldlist_row_index += 1
if self._fieldlist_row_index % 2 == 0:
node['classes'].append('field-even')
else:
node['classes'].append('field-odd')
- return node
def visit_math(self, node, math_env=''):
- # type: (nodes.Node, unicode) -> None
+ # type: (nodes.Element, str) -> None
name = self.builder.math_renderer_name
visit, _ = self.builder.app.registry.html_inline_math_renderers[name]
visit(self, node)
def depart_math(self, node, math_env=''):
- # type: (nodes.Node, unicode) -> None
+ # type: (nodes.Element, str) -> None
name = self.builder.math_renderer_name
_, depart = self.builder.app.registry.html_inline_math_renderers[name]
if depart:
depart(self, node)
def visit_math_block(self, node, math_env=''):
- # type: (nodes.Node, unicode) -> None
+ # type: (nodes.Element, str) -> None
name = self.builder.math_renderer_name
visit, _ = self.builder.app.registry.html_block_math_renderers[name]
visit(self, node)
def depart_math_block(self, node, math_env=''):
- # type: (nodes.Node, unicode) -> None
+ # type: (nodes.Element, str) -> None
name = self.builder.math_renderer_name
_, depart = self.builder.app.registry.html_block_math_renderers[name]
if depart:
@@ -851,21 +847,21 @@ class HTML5Translator(BaseTranslator):
@property
def highlightlang(self):
- # type: () -> unicode
+ # type: () -> str
warnings.warn('HTMLTranslator.highlightlang is deprecated.',
RemovedInSphinx30Warning, stacklevel=2)
return self.builder.config.highlight_language
@property
def highlightlang_base(self):
- # type: () -> unicode
+ # type: () -> str
warnings.warn('HTMLTranslator.highlightlang_base is deprecated.',
RemovedInSphinx30Warning, stacklevel=2)
return self.builder.config.highlight_language
@property
def highlightopts(self):
- # type: () -> unicode
+ # type: () -> str
warnings.warn('HTMLTranslator.highlightopts is deprecated.',
RemovedInSphinx30Warning, stacklevel=2)
return self.builder.config.highlight_options