Refactor PythonDomain

Miscellaneous style changes.
This commit is contained in:
Adam Turner 2024-10-25 17:55:13 +01:00
parent f43951e3ff
commit 342b597827

View File

@ -558,26 +558,32 @@ class PythonModuleIndex(Index):
name = 'modindex' name = 'modindex'
localname = _('Python Module Index') localname = _('Python Module Index')
shortname = _('modules') shortname = _('modules')
domain: PythonDomain
def generate(self, docnames: Iterable[str] | None = None, def generate(self, docnames: Iterable[str] | None = None,
) -> tuple[list[tuple[str, list[IndexEntry]]], bool]: ) -> tuple[list[tuple[str, list[IndexEntry]]], bool]:
doc_names = frozenset(docnames) if docnames is not None else None
content: dict[str, list[IndexEntry]] = {} content: dict[str, list[IndexEntry]] = {}
# list of prefixes to ignore # list of prefixes to ignore
ignores: list[str] = self.domain.env.config['modindex_common_prefix'] ignores: list[str] = sorted(
ignores = sorted(ignores, key=len, reverse=True) self.domain.env.config['modindex_common_prefix'], key=len, reverse=True
)
# list of all modules, sorted by module name # list of all modules, sorted by module name
modules = sorted(self.domain.data['modules'].items(), modules = sorted(self.domain.modules.items(), key=lambda t: t[0].lower())
key=lambda x: x[0].lower())
# sort out collapsible modules # sort out collapsible modules
prev_modname = '' prev_modname = ''
num_toplevels = 0
for modname, (docname, node_id, synopsis, platforms, deprecated) in modules: num_top_levels = 0
if docnames and docname not in docnames: for modname, module in modules:
if doc_names and module.docname not in doc_names:
continue continue
for ignore in ignores: for ignore in ignores:
if modname.startswith(ignore): if modname.startswith(ignore):
modname = modname[len(ignore):] modname = modname.removeprefix(ignore)
stripped = ignore stripped = ignore
break break
else: else:
@ -589,7 +595,7 @@ class PythonModuleIndex(Index):
entries = content.setdefault(modname[0].lower(), []) entries = content.setdefault(modname[0].lower(), [])
package = modname.split('.')[0] package = modname.split('.', maxsplit=1)[0]
if package != modname: if package != modname:
# it's a submodule # it's a submodule
if prev_modname == package: if prev_modname == package:
@ -619,7 +625,7 @@ class PythonModuleIndex(Index):
entries.append(dummy_entry) entries.append(dummy_entry)
subtype = 2 subtype = 2
else: else:
num_toplevels += 1 num_top_levels += 1
subtype = 0 subtype = 0
entry = IndexEntry( entry = IndexEntry(
@ -637,7 +643,7 @@ class PythonModuleIndex(Index):
# apply heuristics when to collapse modindex at page load: # apply heuristics when to collapse modindex at page load:
# only collapse if number of toplevel modules is larger than # only collapse if number of toplevel modules is larger than
# number of submodules # number of submodules
collapse = len(modules) - num_toplevels < num_toplevels collapse = len(modules) - num_top_levels < num_top_levels
# sort by first letter # sort by first letter
sorted_content = sorted(content.items()) sorted_content = sorted(content.items())
@ -885,9 +891,10 @@ class PythonDomain(Domain):
continue continue
if obj[2] == 'module': if obj[2] == 'module':
results.append(('py:mod', results.append((
self._make_module_refnode(builder, fromdocname, 'py:mod',
name, contnode))) self._make_module_refnode(builder, fromdocname, name, contnode)
))
else: else:
# determine the content of the reference by conditions # determine the content of the reference by conditions
content = find_pending_xref_condition(node, 'resolved') content = find_pending_xref_condition(node, 'resolved')
@ -905,16 +912,18 @@ class PythonDomain(Domain):
def _make_module_refnode(self, builder: Builder, fromdocname: str, name: str, def _make_module_refnode(self, builder: Builder, fromdocname: str, name: str,
contnode: Node) -> Element: contnode: Node) -> Element:
# get additional info for modules # get additional info for modules
module = self.modules[name] module: ModuleEntry = self.modules[name]
title = name title_parts = [name]
if module.synopsis: if module.synopsis:
title += ': ' + module.synopsis title_parts.append(f': {module.synopsis}')
if module.deprecated: if module.deprecated:
title += _(' (deprecated)') title_parts.append(_(' (deprecated)'))
if module.platform: if module.platform:
title += ' (' + module.platform + ')' title_parts.append(f' ({module.platform})')
return make_refnode(builder, fromdocname, module.docname, module.node_id, title = ''.join(title_parts)
contnode, title) return make_refnode(
builder, fromdocname, module.docname, module.node_id, contnode, title
)
def get_objects(self) -> Iterator[tuple[str, str, str, str, str, int]]: def get_objects(self) -> Iterator[tuple[str, str, str, str, str, int]]:
for modname, mod in self.modules.items(): for modname, mod in self.modules.items():