3
3
import sphinx
4
4
import inspect
5
5
import subprocess
6
- import pkg_resources
7
6
from pathlib import Path
8
7
from sphinx .application import Sphinx
9
8
from sphinx .errors import ExtensionError
20
19
def setup (app : Sphinx ) -> Dict [str , Any ]:
21
20
app .connect ("builder-inited" , add_static_path )
22
21
app .add_config_value ('linkcode_blob' , 'head' , True )
23
- app .add_config_value ('top_level' , '' , True )
22
+ app .add_config_value ('top_level' , None , True )
24
23
25
24
linkcode_blob = get_conf_val (app , "linkcode_blob" )
26
25
linkcode_url = get_linkcode_url (
@@ -31,9 +30,8 @@ def setup(app: Sphinx) -> Dict[str, Any]:
31
30
linkcode_func = get_conf_val (app , "linkcode_resolve" )
32
31
repo_dir = get_repo_dir ()
33
32
34
- if not (top_level := get_conf_val (app , 'top_level' )):
35
- top_level = get_top_level (repo_dir )
36
- set_conf_val (app , 'top_level' , top_level )
33
+ top_level = get_conf_val (app , 'top_level' )
34
+ TDKMethLexer .TOP_LEVEL = top_level
37
35
38
36
if not callable (linkcode_func ):
39
37
print (
@@ -45,9 +43,11 @@ def setup(app: Sphinx) -> Dict[str, Any]:
45
43
46
44
app .setup_extension ('sphinx_github_style.add_linkcode_class' )
47
45
app .setup_extension ('sphinx_github_style.github_style' )
48
- app .setup_extension ('sphinx_github_style.meth_lexer' )
49
46
app .setup_extension ('sphinx.ext.linkcode' )
50
47
48
+ # Add lexer after linkcode sets the top level
49
+ app .connect ('env-updated' , add_lexer )
50
+
51
51
return {'version' : sphinx .__display_version__ , 'parallel_read_safe' : True }
52
52
53
53
@@ -58,6 +58,11 @@ def add_static_path(app) -> None:
58
58
)
59
59
60
60
61
+ def add_lexer (app : Sphinx , env ) -> None :
62
+ """Registers the :class:`~.TDKMethLexer` to add GitHub dark syntax highlighting"""
63
+ app .add_lexer ('python' , TDKMethLexer .get_pkg_lexer ())
64
+
65
+
61
66
def get_linkcode_revision (blob : str ) -> str :
62
67
"""Get the blob to link to on GitHub
63
68
@@ -157,9 +162,6 @@ def get_linkcode_resolve(linkcode_url: str, repo_dir: Optional[Path] = None, top
157
162
if repo_dir is None :
158
163
repo_dir = get_repo_dir ()
159
164
160
- if top_level is None :
161
- top_level = get_top_level (repo_dir )
162
-
163
165
def linkcode_resolve (domain , info ):
164
166
"""Returns a link to the source code on GitHub, with appropriate lines highlighted
165
167
@@ -174,6 +176,10 @@ def linkcode_resolve(domain, info):
174
176
modname = info ['module' ]
175
177
fullname = info ['fullname' ]
176
178
179
+ if TDKMethLexer .TOP_LEVEL is None :
180
+ pkg_name = modname .split ('.' )[0 ]
181
+ TDKMethLexer .TOP_LEVEL = pkg_name
182
+
177
183
submod = sys .modules .get (modname )
178
184
if submod is None :
179
185
return None
@@ -212,19 +218,6 @@ def linkcode_resolve(domain, info):
212
218
return linkcode_resolve
213
219
214
220
215
- def get_top_level (repo_dir : Optional [Path ] = None ) -> str :
216
- """Retrieve the top-level module name of a package from its metadata.
217
-
218
- :param repo_dir: The root directory of the Git repository.
219
- :return: The top-level module name of the package.
220
- """
221
- if repo_dir is None :
222
- repo_dir = get_repo_dir ()
223
-
224
- pkg = pkg_resources .require (Path (repo_dir ).stem )[0 ]
225
- return pkg .get_metadata ('top_level.txt' ).strip ()
226
-
227
-
228
221
def get_repo_dir () -> Path :
229
222
"""Returns the root directory of the repository
230
223
0 commit comments