mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
std domain: Generate node_id for productionlists in the right way
This commit is contained in:
parent
4d279fc5ad
commit
c0535d700e
@ -489,28 +489,36 @@ class ProductionList(SphinxDirective):
|
|||||||
subnode = addnodes.production(rule)
|
subnode = addnodes.production(rule)
|
||||||
subnode['tokenname'] = name.strip()
|
subnode['tokenname'] = name.strip()
|
||||||
if subnode['tokenname']:
|
if subnode['tokenname']:
|
||||||
# nodes.make_id converts '_' to '-',
|
prefix = 'grammar-token-%s' % productionGroup
|
||||||
# so we can use '_' to delimit group from name,
|
node_id = make_id(self.env, self.state.document, prefix, name)
|
||||||
# and make sure we don't clash with other IDs.
|
subnode['ids'].append(node_id)
|
||||||
idname = 'grammar-token-%s_%s' \
|
|
||||||
% (nodes.make_id(productionGroup), nodes.make_id(name))
|
# Assign old styled node_id not to break old hyperlinks (if possible)
|
||||||
if idname not in self.state.document.ids:
|
# Note: Will be removed in Sphinx-5.0 (RemovedInSphinx50Warning)
|
||||||
subnode['ids'].append(idname)
|
old_node_id = self.make_old_id(name)
|
||||||
|
if (old_node_id not in self.state.document.ids and
|
||||||
|
old_node_id not in subnode['ids']):
|
||||||
|
subnode['ids'].append(old_node_id)
|
||||||
|
|
||||||
idnameOld = nodes.make_id('grammar-token-' + name)
|
|
||||||
if idnameOld not in self.state.document.ids:
|
|
||||||
subnode['ids'].append(idnameOld)
|
|
||||||
self.state.document.note_implicit_target(subnode, subnode)
|
self.state.document.note_implicit_target(subnode, subnode)
|
||||||
|
|
||||||
if len(productionGroup) != 0:
|
if len(productionGroup) != 0:
|
||||||
objName = "%s:%s" % (productionGroup, name)
|
objName = "%s:%s" % (productionGroup, name)
|
||||||
else:
|
else:
|
||||||
objName = name
|
objName = name
|
||||||
domain.note_object(objtype='token', name=objName, labelid=idname,
|
domain.note_object('token', objName, node_id, location=node)
|
||||||
location=node)
|
|
||||||
subnode.extend(token_xrefs(tokens, productionGroup))
|
subnode.extend(token_xrefs(tokens, productionGroup))
|
||||||
node.append(subnode)
|
node.append(subnode)
|
||||||
return [node]
|
return [node]
|
||||||
|
|
||||||
|
def make_old_id(self, token: str) -> str:
|
||||||
|
"""Generate old styled node_id for tokens.
|
||||||
|
|
||||||
|
.. note:: Old Styled node_id was used until Sphinx-3.0.
|
||||||
|
This will be removed in Sphinx-5.0.
|
||||||
|
"""
|
||||||
|
return nodes.make_id('grammar-token-' + token)
|
||||||
|
|
||||||
|
|
||||||
class TokenXRefRole(XRefRole):
|
class TokenXRefRole(XRefRole):
|
||||||
def process_link(self, env: "BuildEnvironment", refnode: Element, has_explicit_title: bool,
|
def process_link(self, env: "BuildEnvironment", refnode: Element, has_explicit_title: bool,
|
||||||
|
@ -222,7 +222,7 @@ def test_html4_output(app, status, warning):
|
|||||||
"[@class='reference internal']/code/span[@class='pre']", 'HOME'),
|
"[@class='reference internal']/code/span[@class='pre']", 'HOME'),
|
||||||
(".//a[@href='#with']"
|
(".//a[@href='#with']"
|
||||||
"[@class='reference internal']/code/span[@class='pre']", '^with$'),
|
"[@class='reference internal']/code/span[@class='pre']", '^with$'),
|
||||||
(".//a[@href='#grammar-token-_try-stmt']"
|
(".//a[@href='#grammar-token-try-stmt']"
|
||||||
"[@class='reference internal']/code/span", '^statement$'),
|
"[@class='reference internal']/code/span", '^statement$'),
|
||||||
(".//a[@href='#some-label'][@class='reference internal']/span", '^here$'),
|
(".//a[@href='#some-label'][@class='reference internal']/span", '^here$'),
|
||||||
(".//a[@href='#some-label'][@class='reference internal']/span", '^there$'),
|
(".//a[@href='#some-label'][@class='reference internal']/span", '^there$'),
|
||||||
@ -254,7 +254,7 @@ def test_html4_output(app, status, warning):
|
|||||||
(".//dl/dt[@id='term-boson']", 'boson'),
|
(".//dl/dt[@id='term-boson']", 'boson'),
|
||||||
# a production list
|
# a production list
|
||||||
(".//pre/strong", 'try_stmt'),
|
(".//pre/strong", 'try_stmt'),
|
||||||
(".//pre/a[@href='#grammar-token-_try1-stmt']/code/span", 'try1_stmt'),
|
(".//pre/a[@href='#grammar-token-try1-stmt']/code/span", 'try1_stmt'),
|
||||||
# tests for ``only`` directive
|
# tests for ``only`` directive
|
||||||
(".//p", 'A global substitution.'),
|
(".//p", 'A global substitution.'),
|
||||||
(".//p", 'In HTML.'),
|
(".//p", 'In HTML.'),
|
||||||
|
@ -352,23 +352,23 @@ def test_productionlist(app, status, warning):
|
|||||||
linkText = span.text.strip()
|
linkText = span.text.strip()
|
||||||
cases.append((text, link, linkText))
|
cases.append((text, link, linkText))
|
||||||
assert cases == [
|
assert cases == [
|
||||||
('A', 'Bare.html#grammar-token-_a', 'A'),
|
('A', 'Bare.html#grammar-token-a', 'A'),
|
||||||
('B', 'Bare.html#grammar-token-_b', 'B'),
|
('B', 'Bare.html#grammar-token-b', 'B'),
|
||||||
('P1:A', 'P1.html#grammar-token-p1_a', 'P1:A'),
|
('P1:A', 'P1.html#grammar-token-p1-a', 'P1:A'),
|
||||||
('P1:B', 'P1.html#grammar-token-p1_b', 'P1:B'),
|
('P1:B', 'P1.html#grammar-token-p1-b', 'P1:B'),
|
||||||
('P2:A', 'P1.html#grammar-token-p1_a', 'P1:A'),
|
('P2:A', 'P1.html#grammar-token-p1-a', 'P1:A'),
|
||||||
('P2:B', 'P2.html#grammar-token-p2_b', 'P2:B'),
|
('P2:B', 'P2.html#grammar-token-p2-b', 'P2:B'),
|
||||||
('Explicit title A, plain', 'Bare.html#grammar-token-_a', 'MyTitle'),
|
('Explicit title A, plain', 'Bare.html#grammar-token-a', 'MyTitle'),
|
||||||
('Explicit title A, colon', 'Bare.html#grammar-token-_a', 'My:Title'),
|
('Explicit title A, colon', 'Bare.html#grammar-token-a', 'My:Title'),
|
||||||
('Explicit title P1:A, plain', 'P1.html#grammar-token-p1_a', 'MyTitle'),
|
('Explicit title P1:A, plain', 'P1.html#grammar-token-p1-a', 'MyTitle'),
|
||||||
('Explicit title P1:A, colon', 'P1.html#grammar-token-p1_a', 'My:Title'),
|
('Explicit title P1:A, colon', 'P1.html#grammar-token-p1-a', 'My:Title'),
|
||||||
('Tilde A', 'Bare.html#grammar-token-_a', 'A'),
|
('Tilde A', 'Bare.html#grammar-token-a', 'A'),
|
||||||
('Tilde P1:A', 'P1.html#grammar-token-p1_a', 'A'),
|
('Tilde P1:A', 'P1.html#grammar-token-p1-a', 'A'),
|
||||||
('Tilde explicit title P1:A', 'P1.html#grammar-token-p1_a', '~MyTitle'),
|
('Tilde explicit title P1:A', 'P1.html#grammar-token-p1-a', '~MyTitle'),
|
||||||
('Tilde, explicit title P1:A', 'P1.html#grammar-token-p1_a', 'MyTitle'),
|
('Tilde, explicit title P1:A', 'P1.html#grammar-token-p1-a', 'MyTitle'),
|
||||||
('Dup', 'Dup2.html#grammar-token-_dup', 'Dup'),
|
('Dup', 'Dup2.html#grammar-token-dup', 'Dup'),
|
||||||
('FirstLine', 'firstLineRule.html#grammar-token-_firstline', 'FirstLine'),
|
('FirstLine', 'firstLineRule.html#grammar-token-firstline', 'FirstLine'),
|
||||||
('SecondLine', 'firstLineRule.html#grammar-token-_secondline', 'SecondLine'),
|
('SecondLine', 'firstLineRule.html#grammar-token-secondline', 'SecondLine'),
|
||||||
]
|
]
|
||||||
|
|
||||||
text = (app.outdir / 'LineContinuation.html').read_text()
|
text = (app.outdir / 'LineContinuation.html').read_text()
|
||||||
|
Loading…
Reference in New Issue
Block a user