1"""
2    sphinx.environment.collectors.indexentries
3    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5    Index entries collector for sphinx.environment.
6
7    :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
8    :license: BSD, see LICENSE for details.
9"""
10
11import warnings
12from typing import Any, Dict, Set
13
14from docutils import nodes
15
16from sphinx import addnodes
17from sphinx.application import Sphinx
18from sphinx.deprecation import RemovedInSphinx40Warning
19from sphinx.environment import BuildEnvironment
20from sphinx.environment.collectors import EnvironmentCollector
21from sphinx.util import logging, split_index_msg
22
23logger = logging.getLogger(__name__)
24
25
26class IndexEntriesCollector(EnvironmentCollector):
27    name = 'indices'
28
29    def __init__(self) -> None:
30        warnings.warn('IndexEntriesCollector is deprecated.',
31                      RemovedInSphinx40Warning, stacklevel=2)
32
33    def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
34        env.indexentries.pop(docname, None)
35
36    def merge_other(self, app: Sphinx, env: BuildEnvironment,
37                    docnames: Set[str], other: BuildEnvironment) -> None:
38        for docname in docnames:
39            env.indexentries[docname] = other.indexentries[docname]
40
41    def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
42        docname = app.env.docname
43        entries = app.env.indexentries[docname] = []
44        for node in doctree.traverse(addnodes.index):
45            try:
46                for entry in node['entries']:
47                    split_index_msg(entry[0], entry[1])
48            except ValueError as exc:
49                logger.warning(str(exc), location=node)
50                node.parent.remove(node)
51            else:
52                for entry in node['entries']:
53                    entries.append(entry)
54
55
56def setup(app: Sphinx) -> Dict[str, Any]:
57    app.add_env_collector(IndexEntriesCollector)
58
59    return {
60        'version': 'builtin',
61        'parallel_read_safe': True,
62        'parallel_write_safe': True,
63    }
64