Fix HTML: Invalid HTML5 file is generated for glossary (refs: #4611)

Note: It was caused by a glossary having multiple terms for one
description.
This commit is contained in:
Takeshi KOMIYA 2019-01-03 12:37:59 +09:00
parent b04bfcfab7
commit 7459d8771a
4 changed files with 109 additions and 0 deletions

View File

@ -155,6 +155,8 @@ Bugs fixed
if passed as language option?
* #5179: LaTeX: (lualatex only) escaping of ``>`` by ``\textgreater{}`` is not
enough as ``\textgreater{}\textgreater{}`` applies TeX-ligature
* HTML: Invalid HTML5 file is generated for a glossary having multiple terms for
one description (refs: #4611)
Testing
--------

View File

@ -393,6 +393,48 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
self.generate_targets_for_listing(node)
super().visit_enumerated_list(node)
# overwritten
def visit_definition(self, node):
# type: (nodes.Element) -> None
# don't insert </dt> here.
self.body.append(self.starttag(node, 'dd', ''))
# overwritten
def depart_definition(self, node):
# type: (nodes.Element) -> None
self.body.append('</dd>\n')
# overwritten
def visit_classifier(self, node):
# type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
# overwritten
def depart_classifier(self, node):
# type: (nodes.Element) -> None
self.body.append('</span>')
next_node = node.next_node(descend=False, siblings=True) # type: nodes.Node
if not isinstance(next_node, nodes.classifier):
# close `<dt>` tag at the tail of classifiers
self.body.append('</dt>')
# overwritten
def visit_term(self, node):
# type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'dt', ''))
# overwritten
def depart_term(self, node):
# type: (nodes.Element) -> None
next_node = node.next_node(descend=False, siblings=True) # type: nodes.Node
if isinstance(next_node, nodes.classifier):
# Leave the end tag to `self.depart_classifier()`, in case
# there's a classifier.
pass
else:
self.body.append('</dt>')
# overwritten
def visit_title(self, node):
# type: (nodes.Element) -> None

View File

@ -339,6 +339,48 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
raise nodes.SkipNode
super().visit_bullet_list(node)
# overwritten
def visit_definition(self, node):
# type: (nodes.Element) -> None
# don't insert </dt> here.
self.body.append(self.starttag(node, 'dd', ''))
# overwritten
def depart_definition(self, node):
# type: (nodes.Element) -> None
self.body.append('</dd>\n')
# overwritten
def visit_classifier(self, node):
# type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
# overwritten
def depart_classifier(self, node):
# type: (nodes.Element) -> None
self.body.append('</span>')
next_node = node.next_node(descend=False, siblings=True) # type: nodes.Node
if not isinstance(next_node, nodes.classifier):
# close `<dt>` tag at the tail of classifiers
self.body.append('</dt>')
# overwritten
def visit_term(self, node):
# type: (nodes.Element) -> None
self.body.append(self.starttag(node, 'dt', ''))
# overwritten
def depart_term(self, node):
# type: (nodes.Element) -> None
next_node = node.next_node(descend=False, siblings=True) # type: nodes.Node
if isinstance(next_node, nodes.classifier):
# Leave the end tag to `self.depart_classifier()`, in case
# there's a classifier.
pass
else:
self.body.append('</dt>')
# overwritten
def visit_title(self, node):
# type: (nodes.Element) -> None

View File

@ -234,6 +234,29 @@ def get_verifier(verify, verify_re):
None,
r'\\sphinxhref{http://example.com/~me/}{test}.*',
),
(
# description list: simple
'verify',
'term\n description',
'<dl class="docutils">\n<dt>term</dt><dd>description</dd>\n</dl>',
None,
),
(
# description list: with classifiers
'verify',
'term : class1 : class2\n description',
('<dl class="docutils">\n<dt>term<span class="classifier">class1</span>'
'<span class="classifier">class2</span></dt><dd>description</dd>\n</dl>'),
None,
),
(
# glossary (description list): multiple terms
'verify',
'.. glossary::\n\n term1\n term2\n description',
('<dl class="glossary docutils">\n<dt id="term-term1">term1</dt>'
'<dt id="term-term2">term2</dt><dd>description</dd>\n</dl>'),
None,
),
])
def test_inline(get_verifier, type, rst, html_expected, latex_expected):
verifier = get_verifier(type)