11from __future__ import annotations
22from typing import TYPE_CHECKING , override
3+ from dataclasses import dataclass
34
5+ from docutils import nodes
46from sphinx .util .docutils import SphinxDirective , SphinxRole
57from sphinx .transforms import SphinxTransform
68
7- from .utils import find_current_document , find_current_section
9+ from .utils import find_current_section
810from .utils .ctxproxy import proxy
9- from .render import EXTRACTX_REGISTRY , ParsePhaseContextGenerator , FullPhaseContextGenerator , ParseCaller , Caller , pending_node
10- from .template import Context
11+ from .renderer import Host , ParseHost
12+ from .render import (
13+ EXTRACTX_REGISTRY ,
14+ ParsePhaseContextGenerator ,
15+ RenderPhaseContextGenerator ,
16+ )
17+
18+ if TYPE_CHECKING :
19+ from typing import Any
20+
21+ @dataclass
22+ class _Host :
23+ v : Host
24+
25+ @property
26+ def doctree (self ) -> nodes .document :
27+ if isinstance (self .v , SphinxDirective ):
28+ return self .v .state .document
29+ elif isinstance (self .v , SphinxRole ):
30+ return self .v .inliner .document
31+ elif isinstance (self .v , SphinxTransform ):
32+ return self .v .document
33+ else :
34+ raise NotImplementedError
35+
36+ @property
37+ def parent (self ) -> nodes .Element | None :
38+ if isinstance (self .v , SphinxDirective ):
39+ return self .v .state .parent
40+ elif isinstance (self .v , SphinxRole ):
41+ return self .v .inliner .parent
42+ else :
43+ return None
1144
1245
1346class MarkupContextGenerator (ParsePhaseContextGenerator ):
1447 @override
15- def generate (self , caller : ParseCaller , n : pending_node ) -> Context :
48+ def generate (self , caller : ParseHost ) -> Any :
1649 isdir = isinstance (caller , SphinxDirective )
1750 return {
1851 'type' : 'directive' if isdir else 'role' ,
@@ -21,44 +54,34 @@ def generate(self, caller: ParseCaller, n: pending_node) -> Context:
2154 'rawtext' : caller .block_text if isdir else caller .rawtext ,
2255 }
2356
24- class DocContextGenerator (FullPhaseContextGenerator ):
57+
58+ class DocContextGenerator (RenderPhaseContextGenerator ):
2559 @override
26- def generate (self , caller : Caller , n : pending_node ) -> Context :
27- if isinstance (caller , SphinxDirective ):
28- return proxy (caller .state .document )
29- elif isinstance (caller , SphinxRole ):
30- return proxy (caller .inliner .document )
31- elif isinstance (caller , SphinxTransform ):
32- return proxy (caller .document )
33- else :
34- assert False
60+ def generate (self , caller : Host ) -> Any :
61+ return proxy (_Host (caller ).doctree )
3562
3663
37- class SectionContextGenerator (FullPhaseContextGenerator ):
64+ class SectionContextGenerator (ParsePhaseContextGenerator ):
3865 @override
39- def generate (self , caller : Caller , n : pending_node ) -> Context :
40- if n .parent :
41- return proxy (find_current_section (n .parent ))
42- elif isinstance (caller , SphinxDirective ):
43- return proxy (find_current_section (caller .state .parent ))
44- elif isinstance (caller , SphinxRole ):
45- return proxy (caller .inliner .parent )
46- else :
47- assert False
66+ def generate (self , caller : ParseHost ) -> Any :
67+ parent = _Host (caller ).parent
68+ return proxy (find_current_section (parent ))
4869
4970
50- class SphinxEnvContextGenerator (FullPhaseContextGenerator ):
71+ class SphinxEnvContextGenerator (RenderPhaseContextGenerator ):
5172 @override
52- def generate (self , caller : Caller , n : pending_node ) -> Context :
73+ def generate (self , caller : Host ) -> Any :
5374 return proxy (caller .env )
5475
55- class SphinxConfigContextGenerator (FullPhaseContextGenerator ):
76+
77+ class SphinxConfigContextGenerator (RenderPhaseContextGenerator ):
5678 @override
57- def generate (self , caller : Caller , n : pending_node ) -> Context :
79+ def generate (self , caller : Host ) -> Any :
5880 return proxy (caller .config )
5981
60- EXTRACTX_REGISTRY .add_parsing_phase_context ('markup' , MarkupContextGenerator ())
61- EXTRACTX_REGISTRY .add_full_phase_context ('doc' , DocContextGenerator ())
62- EXTRACTX_REGISTRY .add_full_phase_context ('section' ,SectionContextGenerator ())
63- EXTRACTX_REGISTRY .add_full_phase_context ('env' , SphinxEnvContextGenerator ())
64- EXTRACTX_REGISTRY .add_full_phase_context ('config' , SphinxConfigContextGenerator ())
82+
83+ EXTRACTX_REGISTRY .add_parsing ('markup' , MarkupContextGenerator ())
84+ EXTRACTX_REGISTRY .add_parsing ('section' , SectionContextGenerator ())
85+ EXTRACTX_REGISTRY .add_render ('doc' , DocContextGenerator ())
86+ EXTRACTX_REGISTRY .add_render ('env' , SphinxEnvContextGenerator ())
87+ EXTRACTX_REGISTRY .add_render ('config' , SphinxConfigContextGenerator ())
0 commit comments