Source code for sphinx.domains._index

"""Domain indices."""

from __future__ import annotations

from abc import ABC, abstractmethod
from typing import TYPE_CHECKING, NamedTuple

from sphinx.errors import SphinxError

if TYPE_CHECKING:
    from collections.abc import Iterable
    from typing import ClassVar

    from sphinx.domains import Domain


[docs] class IndexEntry(NamedTuple): """An index entry. .. note:: The *qualifier* and *description* are not rendered for some output formats, such as LaTeX. """ #: The name of the index entry to be displayed. name: str #: The sub-entry related type. One of: #: #: ``0`` #: A normal entry. #: ``1`` #: An entry with sub-entries. #: ``2`` #: A sub-entry. subtype: int #: *docname* where the entry is located. docname: str #: Anchor for the entry within `docname` anchor: str #: Extra info for the entry. extra: str #: Qualifier for the description. qualifier: str #: Description for the entry. descr: str
[docs] class Index(ABC): """An Index is the description for a domain-specific index. To add an index to a domain, subclass Index, overriding the three name attributes: * `name` is an identifier used for generating file names. It is also used for a hyperlink target for the index. Therefore, users can refer the index page using ``ref`` role and a string which is combined domain name and ``name`` attribute (ex. ``:ref:`py-modindex```). * `localname` is the section title for the index. * `shortname` is a short name for the index, for use in the relation bar in HTML output. Can be empty to disable entries in the relation bar. and providing a :meth:`generate` method. Then, add the index class to your domain's `indices` list. Extensions can add indices to existing domains using :meth:`~sphinx.application.Sphinx.add_index_to_domain`. .. versionchanged:: 3.0 Index pages can be referred by domain name and index name via :rst:role:`ref` role. """ name: ClassVar[str] localname: ClassVar[str] shortname: ClassVar[str | None] = None def __init__(self, domain: Domain) -> None: if not self.name or self.localname is None: msg = f'Index subclass {self.__class__.__name__} has no valid name or localname' raise SphinxError(msg) self.domain = domain
[docs] @abstractmethod def generate( self, docnames: Iterable[str] | None = None ) -> tuple[list[tuple[str, list[IndexEntry]]], bool]: """Get entries for the index. If ``docnames`` is given, restrict to entries referring to these docnames. The return value is a tuple of ``(content, collapse)``: ``collapse`` A boolean that determines if sub-entries should start collapsed (for output formats that support collapsing sub-entries). ``content``: A sequence of ``(letter, entries)`` tuples, where ``letter`` is the "heading" for the given ``entries``, usually the starting letter, and ``entries`` is a sequence of single entries. Each entry is an :py:class:`IndexEntry`. """ raise NotImplementedError