99"""
1010
1111from __future__ import annotations
12+ from os import wait
1213from typing import TYPE_CHECKING , override , final
1314from abc import abstractmethod , ABC
1415from dataclasses import dataclass
2021from sphinx .transforms import SphinxTransform
2122from sphinx .transforms .post_transforms import ReferencesResolver
2223
23- from .data import Field , Schema , RawData , Data
24- from .template import Template , Phase
25- from . import extra_contexts
24+ from .data import Field , Schema , RawData , Data , PendingData
25+ from .template import Template , Phase , Context
26+ from . import extractx
2627from . import utils
2728
2829if TYPE_CHECKING :
30+ from typing import Any
2931 from sphinx .application import Sphinx
3032 from sphinx .environment import BuildEnvironment
3133 from .template import MarkupParser
3436
3537
3638# Possible caller of :meth:`pending_node.render`.
37- # TODO: support Any?
3839type Caller = SphinxDirective | SphinxRole | SphinxTransform
3940
4041
@@ -97,7 +98,7 @@ class BaseNode(nodes.Element): ...
9798
9899
99100class RenderedNode (BaseNode ):
100- data : Data
101+ data : Data # FIXME
101102 external_name : nodes .Node | None
102103 external_content : list [nodes .Node ]
103104
@@ -108,57 +109,53 @@ class rendered_node(RenderedNode, nodes.container): ...
108109class rendered_inline_node (RenderedNode , nodes .inline ): ...
109110
110111
111- class pending_node (BaseNode , nodes .Invisible , nodes .Element ):
112- data : RawData
112+ class pending_node (BaseNode , nodes .Invisible ):
113+ #: The context.
114+ ctx : Context
115+ #: Template for rendering the context.
113116 template : Template
114- schema : Schema
117+ #: Extra context, as a supplement to data.
118+ extra : list [dict [str , Any ]]
115119
116120 inline : bool = False
117121 need_external_name : bool = False
118122 need_external_content : bool = False
119123
124+ # extra ctx: markup(before paring) relation(just after ReferencesResolver)
125+ # all: env config doctree
126+
127+ def __init__ (self , data : Context , tmpl : Template , rawsource = '' , * children , ** attributes ):
128+ super ().__init__ (rawsource , * children , ** attributes )
129+ self .ctx = data
130+ self .template = tmpl
131+ self .extra = []
132+
133+
120134 def render (self , caller : Caller , replace : bool = False ) -> RenderedNode :
121135 rendered = rendered_inline_node () if self .inline else rendered_node ()
122136 rendered .update_all_atts (self )
123137
124138 _caller = _Caller (caller )
125- # Resolve external name and content.
126- if not self .data .name and self .need_external_name :
127- if ns := self ._resolve_external_name (_caller .parent_node ):
128- self .data .name = ns .astext ()
129- rendered .external_name = ns
130- if not self .data .content and self .need_external_content :
131- if ns := self ._resolve_external_content ():
132- self .data .content = '\n \n ' .join ([x .astext () for x in ns ])
133- rendered .external_content = ns
134-
135- try :
136- data = self .schema .parse (self .data )
137- except ValueError as e :
138- if isinstance (caller , SphinxDirective ):
139- raise caller .error (str (e ))
140- else :
141- raise e
142- # raise self._caller_exception_hanlder(caller, e)
143- else :
144- rendered .data = data
145139
146- rendered += self .template .render (
147- _caller .markup_parser ,
148- data ,
149- {
150- ** extra_contexts .sphinx (caller ),
151- ** extra_contexts .doctree (self ),
152- ** extra_contexts .markup (self ),
153- },
154- )
140+ if isinstance (self .ctx , PendingData ):
141+ self ._resolve_external (self .ctx .raw , _caller )
142+
143+ rendered += self .template .render (_caller .markup_parser , self .ctx )
155144 # TODO: check tmpl schema line no
156145
157146 if replace :
158147 self .replace_self (rendered )
159148
160149 return rendered
161150
151+ def _resolve_external (self , data : RawData , caller : _Caller ) -> None :
152+ if not data .name and self .need_external_name :
153+ if ns := self ._resolve_external_name (caller .parent_node ):
154+ data .name = ns .astext ()
155+ if not data .content and self .need_external_content :
156+ if ns := self ._resolve_external_content ():
157+ data .content = '\n \n ' .join ([x .astext () for x in ns ])
158+
162159 def _resolve_external_name (
163160 self , caller_parent : nodes .Element | None
164161 ) -> nodes .Node | None :
@@ -217,8 +214,7 @@ def build_pending_node(self) -> pending_node:
217214
218215 self .process_raw_data (data )
219216
220- pending = pending_node ()
221- pending .data , pending .template , pending .schema = data , tmpl , schema
217+ pending = pending_node (PendingData (data , schema ), tmpl )
222218 self .process_pending_node (pending )
223219
224220 return pending
@@ -368,7 +364,7 @@ def _insert_parsed_hook(app, docname, content):
368364
369365class _ResolvingHook (SphinxTransform ):
370366 # After resolving pending_xref.
371- default_priority = (ReferencesResolver .default_priority or 10 ) + 1
367+ default_priority = (ReferencesResolver .default_priority or 10 ) + 5
372368
373369 def apply (self , ** kwargs ):
374370 logger .warning (f'running resolving hook for doc { self .env .docname } ...' )
0 commit comments