def make_glossary_term(env: "BuildEnvironment", textnodes: Iterable[Node], index_key: str, source: str, lineno: int, node_id: str = None, document: nodes.document = None) -> nodes.term: # get a text-only representation of the term and register it # as a cross-reference target term = nodes.term('', '', *textnodes) term.source = source term.line = lineno termtext = term.astext() if node_id: # node_id is given from outside (mainly i18n module), use it forcedly term['ids'].append(node_id) elif document: node_id = make_id(env, document, 'term', termtext) term['ids'].append(node_id) document.note_explicit_target(term) else: warnings.warn('make_glossary_term() expects document is passed as an argument.', RemovedInSphinx40Warning) gloss_entries = env.temp_data.setdefault('gloss_entries', set()) node_id = nodes.make_id('term-' + termtext) if node_id == 'term': # "term" is not good for node_id. Generate it by sequence number instead. node_id = 'term-%d' % env.new_serialno('glossary') while node_id in gloss_entries: node_id = 'term-%d' % env.new_serialno('glossary') gloss_entries.add(node_id) term['ids'].append(node_id) std = cast(StandardDomain, env.get_domain('std')) std.note_object('term', termtext.lower(), node_id, location=term) # add an index entry too indexnode = addnodes.index() indexnode['entries'] = [('single', termtext, node_id, 'main', index_key)] indexnode.source, indexnode.line = term.source, term.line term.append(indexnode) return term
def add_target_and_index(self, name_obj: Tuple[str, str], sig: str, signode: desc_signature) -> None: mod_name = self.env.ref_context.get('js:module') fullname = (mod_name + '.' if mod_name else '') + name_obj[0] node_id = make_id(self.env, self.state.document, '', fullname) 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(fullname) if old_node_id not in self.state.document.ids and old_node_id not in signode['ids']: signode['ids'].append(old_node_id) self.state.document.note_explicit_target(signode) domain = cast(JavaScriptDomain, self.env.get_domain('js')) domain.note_object(fullname, self.objtype, node_id, location=signode) indextext = self.get_index_text(mod_name, name_obj) if indextext: self.indexnode['entries'].append(('single', indextext, node_id, '', None))
def add_target_and_index( self, name: str, sig: str, signode: addnodes.desc_signature ) -> None: node_id = make_id(self.env, self.state.document, "", name) signode["ids"].append(node_id) # Assign old styled node_id(name) not to break old hyperlinks (if # possible) Note: Will removed in Sphinx-5.0 (RemovedInSphinx50Warning) if node_id != name and name not in self.state.document.ids: signode["ids"].append(name) self.state.document.note_explicit_target(signode) domain = cast(AdaDomain, self.env.get_domain("ada")) domain.note_object(name, self.objtype, node_id, location=signode) indextext = self.get_index_text(name) if indextext: self.indexnode["entries"].append( ("single", indextext, node_id, "", None) )
def add_target_and_index(self, name: str, sig: str, signode: desc_signature) -> None: node_id = make_id(self.env, self.state.document, self.objtype, name) 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(name) if old_node_id not in self.state.document.ids and old_node_id not in signode[ 'ids']: signode['ids'].append(old_node_id) self.state.document.note_explicit_target(signode) domain = cast(ReSTDomain, self.env.get_domain('rst')) domain.note_object(self.objtype, name, node_id, location=signode) indextext = self.get_index_text(self.objtype, name) if indextext: self.indexnode['entries'].append( ('single', indextext, node_id, '', None))
def run(self) -> List[Node]: mod_name = self.arguments[0].strip() self.env.ref_context['js:module'] = mod_name noindex = 'noindex' in self.options ret: List[Node] = [] if not noindex: domain = cast(JavaScriptDomain, self.env.get_domain('js')) node_id = make_id(self.env, self.state.document, 'module', mod_name) domain.note_module(mod_name, node_id) # Make a duplicate entry in 'objects' to facilitate searching for # the module in JavaScriptDomain.find_obj() domain.note_object(mod_name, 'module', node_id, location=(self.env.docname, self.lineno)) target = nodes.target('', '', ids=[node_id], ismod=True) self.state.document.note_explicit_target(target) ret.append(target) indextext = _('%s (module)') % mod_name inode = addnodes.index(entries=[('single', indextext, node_id, '', None)]) ret.append(inode) return ret
def add_target_and_index(self, name_cls: Tuple[str, str], sig: str, signode: desc_signature) -> None: modname = self.options.get('module', self.env.ref_context.get('py:module')) fullname = (modname + '.' if modname else '') + name_cls[0] node_id = make_id(self.env, self.state.document, '', fullname) signode['ids'].append(node_id) # Assign old styled node_id(fullname) not to break old hyperlinks (if possible) # Note: Will removed in Sphinx-5.0 (RemovedInSphinx50Warning) if node_id != fullname and fullname not in self.state.document.ids: signode['ids'].append(fullname) self.state.document.note_explicit_target(signode) domain = cast(PythonDomain, self.env.get_domain('py')) domain.note_object(fullname, self.objtype, node_id, location=signode) indextext = self.get_index_text(modname, name_cls) if indextext: self.indexnode['entries'].append( ('single', indextext, node_id, '', None))
def add_target_and_index(self, name: str, sig: str, signode: desc_signature) -> None: domain = cast(ReSTDomain, self.env.get_domain('rst')) directive_name = self.current_directive if directive_name: prefix = '-'.join([self.objtype, directive_name]) objname = ':'.join([directive_name, name]) else: prefix = self.objtype objname = name node_id = make_id(self.env, self.state.document, prefix, name) 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(name) if old_node_id not in self.state.document.ids and old_node_id not in signode[ 'ids']: signode['ids'].append(old_node_id) self.state.document.note_explicit_target(signode) domain.note_object(self.objtype, objname, node_id, location=signode) if directive_name: key = name[0].upper() pair = [ _('%s (directive)') % directive_name, _(':%s: (directive option)') % name ] self.indexnode['entries'].append( ('pair', '; '.join(pair), node_id, '', key)) else: key = name[0].upper() text = _(':%s: (directive option)') % name self.indexnode['entries'].append( ('single', text, node_id, '', key))
def add_target_and_index(self, name: str, sig: str, signode: desc_signature) -> None: node_id = make_id(self.env, self.state.document, self.objtype, name) 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(name) if old_node_id not in self.state.document.ids and old_node_id not in signode['ids']: signode['ids'].append(old_node_id) self.state.document.note_explicit_target(signode) if self.indextemplate: colon = self.indextemplate.find(':') if colon != -1: indextype = self.indextemplate[:colon].strip() indexentry = self.indextemplate[colon + 1:].strip() % (name,) else: indextype = 'single' indexentry = self.indextemplate % (name,) self.indexnode['entries'].append((indextype, indexentry, node_id, '', None)) std = cast(StandardDomain, self.env.get_domain('std')) std.note_object(self.objtype, name, node_id, location=signode)
def run(self) -> List[Node]: domain = cast(StandardDomain, self.env.get_domain('std')) node: Element = addnodes.productionlist() self.set_source_info(node) # The backslash handling is from ObjectDescription.get_signatures nl_escape_re = re.compile(r'\\\n') lines = nl_escape_re.sub('', self.arguments[0]).split('\n') productionGroup = "" i = 0 for rule in lines: if i == 0 and ':' not in rule: productionGroup = rule.strip() continue i += 1 try: name, tokens = rule.split(':', 1) except ValueError: break subnode = addnodes.production(rule) name = name.strip() subnode['tokenname'] = name if subnode['tokenname']: prefix = 'grammar-token-%s' % productionGroup node_id = make_id(self.env, self.state.document, prefix, name) subnode['ids'].append(node_id) self.state.document.note_implicit_target(subnode, subnode) if len(productionGroup) != 0: objName = "%s:%s" % (productionGroup, name) else: objName = name domain.note_object('token', objName, node_id, location=node) subnode.extend(token_xrefs(tokens, productionGroup)) node.append(subnode) return [node]
def test_make_id_sequential(app): document = create_new_document() document.ids['term-0'] = True assert make_id(app.env, document, 'term') == 'term-1'
def test_make_id_already_registered(app): document = create_new_document() document.ids['term-Sphinx'] = True # register "term-Sphinx" manually assert make_id(app.env, document, 'term', 'Sphinx') == 'term-0'
def test_make_id(app, prefix, term, expected): document = create_new_document() assert make_id(app.env, document, prefix, term) == expected