disnake
53 строки · 1.4 Кб
1# SPDX-License-Identifier: MIT
2from __future__ import annotations
3
4import json
5from pathlib import Path
6from typing import TYPE_CHECKING, Dict
7
8from sphinx.application import Sphinx
9from sphinx.util.fileutil import copy_asset_file
10
11if TYPE_CHECKING:
12from ._types import SphinxExtensionMeta
13
14SCRIPT_PATH = "_templates/api_redirect.js_t"
15
16
17def collect_redirects(app: Sphinx):
18# mapping of html node id (i.e., thing after "#" in URLs) to the correct page name
19# e.g, api.html#disnake.Thread => api/channels.html
20mapping: Dict[str, str] = {}
21
22# see https://www.sphinx-doc.org/en/master/extdev/domainapi.html#sphinx.domains.Domain.get_objects
23domain = app.env.domains["py"]
24for _, _, _, document, html_node_id, _ in domain.get_objects():
25mapping[html_node_id] = document + ".html"
26
27return mapping
28
29
30def copy_redirect_script(app: Sphinx, exception: Exception) -> None:
31if app.builder.format != "html" or exception:
32return
33
34redirect_mapping = collect_redirects(app)
35context = {"redirect_data": json.dumps(redirect_mapping)}
36
37# sanity check
38assert Path(SCRIPT_PATH).exists() # noqa: S101
39
40copy_asset_file(
41SCRIPT_PATH,
42str(Path(app.outdir, "_static", "api_redirect.js")),
43context=context,
44)
45
46
47def setup(app: Sphinx) -> SphinxExtensionMeta:
48app.connect("build-finished", copy_redirect_script)
49
50return {
51"parallel_read_safe": True,
52"parallel_write_safe": True,
53}
54