Merge pull request #6923 from tk0miya/6632

Add get_secnumber to simplify add_secnumber
This commit is contained in:
Takeshi KOMIYA 2019-12-14 23:25:33 +09:00 committed by GitHub
commit 344f9dcc70
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 73 additions and 41 deletions

View File

@ -14,7 +14,7 @@ import posixpath
import sys import sys
import warnings import warnings
from typing import cast from typing import cast
from typing import Iterable from typing import Iterable, Tuple
from docutils import nodes from docutils import nodes
from docutils.nodes import Element, Node, Text from docutils.nodes import Element, Node, Text
@ -272,10 +272,9 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
def depart_seealso(self, node: Element) -> None: def depart_seealso(self, node: Element) -> None:
self.depart_admonition(node) self.depart_admonition(node)
def add_secnumber(self, node: Element) -> None: def get_secnumber(self, node: Element) -> Tuple[int, ...]:
if node.get('secnumber'): if node.get('secnumber'):
self.body.append('.'.join(map(str, node['secnumber'])) + return node['secnumber']
self.secnumber_suffix)
elif isinstance(node.parent, nodes.section): elif isinstance(node.parent, nodes.section):
if self.builder.name == 'singlehtml': if self.builder.name == 'singlehtml':
docname = self.docnames[-1] docname = self.docnames[-1]
@ -286,10 +285,17 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
anchorname = '#' + node.parent['ids'][0] anchorname = '#' + node.parent['ids'][0]
if anchorname not in self.builder.secnumbers: if anchorname not in self.builder.secnumbers:
anchorname = '' # try first heading which has no anchor anchorname = '' # try first heading which has no anchor
if self.builder.secnumbers.get(anchorname): if self.builder.secnumbers.get(anchorname):
numbers = self.builder.secnumbers[anchorname] return self.builder.secnumbers[anchorname]
self.body.append('.'.join(map(str, numbers)) +
self.secnumber_suffix) return None
def add_secnumber(self, node: Element) -> None:
secnumber = self.get_secnumber(node)
if secnumber:
self.body.append('<span class="section-number">%s</span>' %
('.'.join(map(str, secnumber)) + self.secnumber_suffix))
def add_fignumber(self, node: Element) -> None: def add_fignumber(self, node: Element) -> None:
def append_fignumber(figtype: str, figure_id: str) -> None: def append_fignumber(figtype: str, figure_id: str) -> None:

View File

@ -13,7 +13,7 @@ import posixpath
import sys import sys
import warnings import warnings
from typing import cast from typing import cast
from typing import Iterable from typing import Iterable, Tuple
from docutils import nodes from docutils import nodes
from docutils.nodes import Element, Node, Text from docutils.nodes import Element, Node, Text
@ -243,11 +243,11 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
def depart_seealso(self, node: Element) -> None: def depart_seealso(self, node: Element) -> None:
self.depart_admonition(node) self.depart_admonition(node)
def add_secnumber(self, node: Element) -> None: def get_secnumber(self, node: Element) -> Tuple[int, ...]:
if node.get('secnumber'): if node.get('secnumber'):
self.body.append('.'.join(map(str, node['secnumber'])) + return node['secnumber']
self.secnumber_suffix)
elif isinstance(node.parent, nodes.section): if isinstance(node.parent, nodes.section):
if self.builder.name == 'singlehtml': if self.builder.name == 'singlehtml':
docname = self.docnames[-1] docname = self.docnames[-1]
anchorname = "%s/#%s" % (docname, node.parent['ids'][0]) anchorname = "%s/#%s" % (docname, node.parent['ids'][0])
@ -257,10 +257,17 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
anchorname = '#' + node.parent['ids'][0] anchorname = '#' + node.parent['ids'][0]
if anchorname not in self.builder.secnumbers: if anchorname not in self.builder.secnumbers:
anchorname = '' # try first heading which has no anchor anchorname = '' # try first heading which has no anchor
if self.builder.secnumbers.get(anchorname): if self.builder.secnumbers.get(anchorname):
numbers = self.builder.secnumbers[anchorname] return self.builder.secnumbers[anchorname]
self.body.append('.'.join(map(str, numbers)) +
self.secnumber_suffix) return None
def add_secnumber(self, node: Element) -> None:
secnumber = self.get_secnumber(node)
if secnumber:
self.body.append('<span class="section-number">%s</span>' %
('.'.join(map(str, secnumber)) + self.secnumber_suffix))
def add_fignumber(self, node: Element) -> None: def add_fignumber(self, node: Element) -> None:
def append_fignumber(figtype: str, figure_id: str) -> None: def append_fignumber(figtype: str, figure_id: str) -> None:

View File

@ -97,14 +97,11 @@ def check_xpath(etree, fname, path, check, be_found=True):
else: else:
def get_text(node): def get_text(node):
if node.text is not None: if node.text is not None:
# the node has only one text
return node.text return node.text
else: else:
# Since pygments-2.1.1, empty <span> tag is inserted at top of # the node has tags and text; gather texts just under the node
# highlighting block return ''.join(n.tail or '' for n in node)
if len(node) == 1 and node[0].tag == 'span' and node[0].text is None:
if node[0].tail is not None:
return node[0].tail
return ''
rex = re.compile(check) rex = re.compile(check)
if be_found: if be_found:
@ -491,28 +488,40 @@ def test_html_translator(app):
(".//li[@class='toctree-l3']/a", '2.2.1. Bar B1', False), (".//li[@class='toctree-l3']/a", '2.2.1. Bar B1', False),
], ],
'foo.html': [ 'foo.html': [
(".//h1", '1. Foo', True), (".//h1", 'Foo', True),
(".//h2", '1.1. Foo A', True), (".//h2", 'Foo A', True),
(".//h3", '1.1.1. Foo A1', True), (".//h3", 'Foo A1', True),
(".//h2", '1.2. Foo B', True), (".//h2", 'Foo B', True),
(".//h3", '1.2.1. Foo B1', True), (".//h3", 'Foo B1', True),
(".//h1//span[@class='section-number']", '1. ', True),
(".//h2//span[@class='section-number']", '1.1. ', True),
(".//h3//span[@class='section-number']", '1.1.1. ', True),
(".//h2//span[@class='section-number']", '1.2. ', True),
(".//h3//span[@class='section-number']", '1.2.1. ', True),
(".//div[@class='sphinxsidebarwrapper']//li/a", '1.1. Foo A', True), (".//div[@class='sphinxsidebarwrapper']//li/a", '1.1. Foo A', True),
(".//div[@class='sphinxsidebarwrapper']//li/a", '1.1.1. Foo A1', True), (".//div[@class='sphinxsidebarwrapper']//li/a", '1.1.1. Foo A1', True),
(".//div[@class='sphinxsidebarwrapper']//li/a", '1.2. Foo B', True), (".//div[@class='sphinxsidebarwrapper']//li/a", '1.2. Foo B', True),
(".//div[@class='sphinxsidebarwrapper']//li/a", '1.2.1. Foo B1', True), (".//div[@class='sphinxsidebarwrapper']//li/a", '1.2.1. Foo B1', True),
], ],
'bar.html': [ 'bar.html': [
(".//h1", '2. Bar', True), (".//h1", 'Bar', True),
(".//h2", '2.1. Bar A', True), (".//h2", 'Bar A', True),
(".//h2", '2.2. Bar B', True), (".//h2", 'Bar B', True),
(".//h3", '2.2.1. Bar B1', True), (".//h3", 'Bar B1', True),
(".//h1//span[@class='section-number']", '2. ', True),
(".//h2//span[@class='section-number']", '2.1. ', True),
(".//h2//span[@class='section-number']", '2.2. ', True),
(".//h3//span[@class='section-number']", '2.2.1. ', True),
(".//div[@class='sphinxsidebarwrapper']//li/a", '2. Bar', True), (".//div[@class='sphinxsidebarwrapper']//li/a", '2. Bar', True),
(".//div[@class='sphinxsidebarwrapper']//li/a", '2.1. Bar A', True), (".//div[@class='sphinxsidebarwrapper']//li/a", '2.1. Bar A', True),
(".//div[@class='sphinxsidebarwrapper']//li/a", '2.2. Bar B', True), (".//div[@class='sphinxsidebarwrapper']//li/a", '2.2. Bar B', True),
(".//div[@class='sphinxsidebarwrapper']//li/a", '2.2.1. Bar B1', False), (".//div[@class='sphinxsidebarwrapper']//li/a", '2.2.1. Bar B1', False),
], ],
'baz.html': [ 'baz.html': [
(".//h1", '2.1.1. Baz A', True), (".//h1", 'Baz A', True),
(".//h1//span[@class='section-number']", '2.1.1. ', True),
], ],
})) }))
@pytest.mark.skipif(docutils.__version_info__ < (0, 13), @pytest.mark.skipif(docutils.__version_info__ < (0, 13),
@ -536,20 +545,30 @@ def test_tocdepth(app, cached_etree_parse, fname, expect):
(".//h1", 'test-tocdepth', True), (".//h1", 'test-tocdepth', True),
# foo.rst # foo.rst
(".//h2", '1. Foo', True), (".//h2", 'Foo', True),
(".//h3", '1.1. Foo A', True), (".//h3", 'Foo A', True),
(".//h4", '1.1.1. Foo A1', True), (".//h4", 'Foo A1', True),
(".//h3", '1.2. Foo B', True), (".//h3", 'Foo B', True),
(".//h4", '1.2.1. Foo B1', True), (".//h4", 'Foo B1', True),
(".//h2//span[@class='section-number']", '1. ', True),
(".//h3//span[@class='section-number']", '1.1. ', True),
(".//h4//span[@class='section-number']", '1.1.1. ', True),
(".//h3//span[@class='section-number']", '1.2. ', True),
(".//h4//span[@class='section-number']", '1.2.1. ', True),
# bar.rst # bar.rst
(".//h2", '2. Bar', True), (".//h2", 'Bar', True),
(".//h3", '2.1. Bar A', True), (".//h3", 'Bar A', True),
(".//h3", '2.2. Bar B', True), (".//h3", 'Bar B', True),
(".//h4", '2.2.1. Bar B1', True), (".//h4", 'Bar B1', True),
(".//h2//span[@class='section-number']", '2. ', True),
(".//h3//span[@class='section-number']", '2.1. ', True),
(".//h3//span[@class='section-number']", '2.2. ', True),
(".//h4//span[@class='section-number']", '2.2.1. ', True),
# baz.rst # baz.rst
(".//h4", '2.1.1. Baz A', True), (".//h4", 'Baz A', True),
(".//h4//span[@class='section-number']", '2.1.1. ', True),
], ],
})) }))
@pytest.mark.skipif(docutils.__version_info__ < (0, 13), @pytest.mark.skipif(docutils.__version_info__ < (0, 13),