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