"""Sphinx extension to handle the signal directive in the method.""" __version__ = '2024.10' import inspect import ast import sys import types import re from typing import get_type_hints from typing import get_overloads from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple, cast from sphinx.util.inspect import signature, stringify_signature from sphinx import addnodes from docutils import nodes from docutils.parsers.rst import directives from sphinx.domains.python import PyMethod, PyObject import sphinx.domains.python as sphinxPythonDomain if True or TYPE_CHECKING: from collections.abc import Sequence from docutils.nodes import Node, system_message from sphinx.application import Sphinx from sphinx.extension import Extension from sphinx.util.typing import ExtensionMetadata, OptionSpec from sphinx.writers.html5 import HTML5Translator import sphinx.ext.autosummary as seauto import sphinx.ext.autosummary.generate as seautogenerate import TermTk as ttk import ast import inspect def setup(app: Sphinx) -> ExtensionMetadata: '''Initialise the extension.''' # Collect all pyTermTk roles and domains modules = {} def _parseModules(_mod): if _file:=getattr(_mod,'__file__',None): if '__init__.py' in _file and '/TermTk/' in _file: print(_file) for _name, _obj in inspect.getmembers(_mod): if inspect.isclass(_obj): if _name not in modules: modules[_name] = _mod.__name__ modules[_name] = _mod.__name__ if len(_mod.__name__)>len(modules[_name]) else modules[_name] print(f" * {_name=} = {_obj}") for _module in sys.modules: _parseModules(sys.modules[_module]) # for x in modules.items(): # print(x) def _resolve(txt) -> str: oldTxt = txt if txt in modules: txt = f"~{modules[txt]}.{txt}" # print(f"-----------> {oldTxt=} -> {txt=}") else: txts = txt.split('.') if txts[0] in modules: txts[0] = f"~{modules[txts[0]]}.{txts[0]}" txt = '.'.join(txts) # print(f"-----------> {oldTxt=} -> {txt=}") return txt _process_link_bk = sphinxPythonDomain.PyXRefRole.process_link def _hacked_process_link(self, env, refnode, has_explicit_title, title: str, target, _process_link_bk=_process_link_bk) -> tuple[str, str]: print(f"-----------> HACKED !!! {title=} {target=}") # title = _resolve(title) target = _resolve(target) return _process_link_bk(self, env, refnode, has_explicit_title, title, target) sphinxPythonDomain.PyXRefRole.process_link = _hacked_process_link