Path: blob/main/Doc/tools/extensions/glossary_search.py
12 views
# -*- coding: utf-8 -*-1"""2glossary_search.py3~~~~~~~~~~~~~~~~45Feature search results for glossary items prominently.67:license: Python license.8"""9import json10import os.path11from docutils.nodes import definition_list_item12from sphinx.addnodes import glossary13from sphinx.util import logging141516logger = logging.getLogger(__name__)17STATIC_DIR = '_static'18JSON = 'glossary.json'192021def process_glossary_nodes(app, doctree, fromdocname):22if app.builder.format != 'html':23return2425terms = {}2627for node in doctree.traverse(glossary):28for glossary_item in node.traverse(definition_list_item):29term = glossary_item[0].astext().lower()30definition = glossary_item[1]3132rendered = app.builder.render_partial(definition)33terms[term] = {34'title': glossary_item[0].astext(),35'body': rendered['html_body']36}3738if hasattr(app.env, 'glossary_terms'):39app.env.glossary_terms.update(terms)40else:41app.env.glossary_terms = terms4243def on_build_finish(app, exc):44if not hasattr(app.env, 'glossary_terms'):45return46if not app.env.glossary_terms:47return4849logger.info(f'Writing {JSON}', color='green')5051dest_dir = os.path.join(app.outdir, STATIC_DIR)52os.makedirs(dest_dir, exist_ok=True)5354with open(os.path.join(dest_dir, JSON), 'w') as f:55json.dump(app.env.glossary_terms, f)565758def setup(app):59app.connect('doctree-resolved', process_glossary_nodes)60app.connect('build-finished', on_build_finish)6162return {'version': '0.1', 'parallel_read_safe': True}636465