Skip to content

Commit

Permalink
std domain: Generate node_id for cmdoptions in the right way
Browse files Browse the repository at this point in the history
  • Loading branch information
tk0miya committed Mar 5, 2020
1 parent 09623a9 commit abca1e9
Showing 1 changed file with 30 additions and 7 deletions.
37 changes: 30 additions & 7 deletions sphinx/domains/std.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,16 +214,25 @@ def handle_signature(self, sig: str, signode: desc_signature) -> str:
def add_target_and_index(self, firstname: str, sig: str, signode: desc_signature) -> None:
currprogram = self.env.ref_context.get('std:program')
for optname in signode.get('allnames', []):
targetname = optname.replace('/', '-')
if not targetname.startswith('-'):
targetname = '-arg-' + targetname
prefixes = ['cmdoption']
if currprogram:
targetname = '-' + currprogram + targetname
targetname = 'cmdoption' + targetname
signode['names'].append(targetname)
prefixes.append(currprogram)
if not optname.startswith(('-', '/')):
prefixes.append('arg')
prefix = '-'.join(prefixes)
node_id = make_id(self.env, self.state.document, prefix, optname)
signode['ids'].append(node_id)

# Assign old styled node_id not to break old hyperlinks (if possible)
# Note: Will be removed in Sphinx-5.0 (RemovedInSphinx50Warning)
old_node_id = self.make_old_id(optname)
if (old_node_id not in self.state.document.ids and
old_node_id not in signode['ids']):
signode['ids'].append(old_node_id)

domain = cast(StandardDomain, self.env.get_domain('std'))
self.state.document.note_explicit_target(signode)

domain = cast(StandardDomain, self.env.get_domain('std'))
for optname in signode.get('allnames', []):
domain.add_program_option(currprogram, optname,
self.env.docname, signode['ids'][0])
Expand All @@ -237,6 +246,20 @@ def add_target_and_index(self, firstname: str, sig: str, signode: desc_signature
entry = '; '.join([descr, option])
self.indexnode['entries'].append(('pair', entry, signode['ids'][0], '', None))

def make_old_id(self, optname: str) -> str:
"""Generate old styled node_id for cmdoptions.
.. note:: Old Styled node_id was used until Sphinx-3.0.
This will be removed in Sphinx-5.0.
"""
currprogram = self.env.ref_context.get('std:program')
targetname = optname.replace('/', '-')
if not targetname.startswith('-'):
targetname = '-arg-' + targetname
if currprogram:
targetname = '-' + currprogram + targetname
return 'cmdoption' + targetname


class Program(SphinxDirective):
"""
Expand Down

0 comments on commit abca1e9

Please sign in to comment.