@@ -114,6 +114,26 @@ def setup_render(self, options: Dict[str, Any], env: Dict[str, Any]):
114114 )
115115 self ._level_to_elem : Dict [int , nodes .Element ] = {0 : self .document }
116116
117+ def create_warning (
118+ self ,
119+ message : str ,
120+ * ,
121+ line : Optional [int ] = None ,
122+ append_to : Optional [nodes .Element ] = None ,
123+ wtype : str = "myst" ,
124+ subtype : str = "other" ,
125+ ) -> Optional [nodes .system_message ]:
126+ """Generate a warning, logging if it is necessary.
127+
128+ Note this is overridden in the ``SphinxRenderer``,
129+ to handle suppressed warning types.
130+ """
131+ kwargs = {"line" : line } if line is not None else {}
132+ msg_node = self .reporter .warning (message , ** kwargs )
133+ if append_to is not None :
134+ append_to .append (msg_node )
135+ return msg_node
136+
117137 def render (self , tokens : List [Token ], options , env : AttrDict ):
118138 """Run the render on a token stream.
119139
@@ -153,21 +173,21 @@ def render(self, tokens: List[Token], options, env: AttrDict):
153173 if f"render_{ nest_token .type } " in self .rules :
154174 self .rules [f"render_{ nest_token .type } " ](nest_token )
155175 else :
156- self .current_node . append (
157- self . reporter . warning (
158- f"No render method for: { nest_token . type } " ,
159- line = token_line ( nest_token , default = 0 ) ,
160- )
176+ self .create_warning (
177+ f"No render method for: { nest_token . type } " ,
178+ line = token_line ( nest_token , default = 0 ) ,
179+ subtype = "render" ,
180+ append_to = self . current_node ,
161181 )
162182
163183 # log warnings for duplicate reference definitions
164184 # "duplicate_refs": [{"href": "ijk", "label": "B", "map": [4, 5], "title": ""}],
165185 for dup_ref in self .env .get ("duplicate_refs" , []):
166- self .document . append (
167- self . reporter . warning (
168- f"Duplicate reference definition: { dup_ref ['label' ] } " ,
169- line = dup_ref [ "map" ][ 0 ] + 1 ,
170- )
186+ self .create_warning (
187+ f"Duplicate reference definition: { dup_ref [ 'label' ] } " ,
188+ line = dup_ref ["map" ][ 0 ] + 1 ,
189+ subtype = "ref" ,
190+ append_to = self . document ,
171191 )
172192
173193 if not self .config .get ("output_footnotes" , True ):
@@ -187,16 +207,17 @@ def render(self, tokens: List[Token], options, env: AttrDict):
187207 for footref in foot_refs :
188208 foot_ref_tokens = self .env ["foot_refs" ].get (footref , [])
189209 if len (foot_ref_tokens ) > 1 :
190- self .current_node . append (
191- self . reporter . warning (
192- f"Multiple footnote definitions found for label: ' { footref } ' " ,
193- )
210+ self .create_warning (
211+ f"Multiple footnote definitions found for label: ' { footref } '" ,
212+ subtype = " footnote" ,
213+ append_to = self . current_node ,
194214 )
215+
195216 if len (foot_ref_tokens ) < 1 :
196- self .current_node . append (
197- self . reporter . warning (
198- f"No footnote definitions found for label: ' { footref } ' " ,
199- )
217+ self .create_warning (
218+ f"No footnote definitions found for label: ' { footref } '" ,
219+ subtype = " footnote" ,
220+ append_to = self . current_node ,
200221 )
201222 else :
202223 self .render_footnote_reference_open (foot_ref_tokens [0 ])
@@ -237,11 +258,11 @@ def nested_render_text(self, text: str, lineno: int):
237258 if f"render_{ nest_token .type } " in self .rules :
238259 self .rules [f"render_{ nest_token .type } " ](nest_token )
239260 else :
240- self .current_node . append (
241- self . reporter . warning (
242- f"No render method for: { nest_token . type } " ,
243- line = token_line ( nest_token , default = 0 ) ,
244- )
261+ self .create_warning (
262+ f"No render method for: { nest_token . type } " ,
263+ line = token_line ( nest_token , default = 0 ) ,
264+ subtype = "render" ,
265+ append_to = self . current_node ,
245266 )
246267
247268 @contextmanager
@@ -259,11 +280,11 @@ def render_children(self, token: Union[Token, NestedTokens]):
259280 if f"render_{ child .type } " in self .rules :
260281 self .rules [f"render_{ child .type } " ](child )
261282 else :
262- self .current_node . append (
263- self . reporter . warning (
264- f"No render method for: { child . type } " ,
265- line = token_line ( child , default = 0 ) ,
266- )
283+ self .create_warning (
284+ f"No render method for: { child . type } " ,
285+ line = token_line ( child , default = 0 ) ,
286+ subtype = "render" ,
287+ append_to = self . current_node ,
267288 )
268289
269290 def add_line_and_source_path (self , node , token : Union [Token , NestedTokens ]):
@@ -285,13 +306,13 @@ def add_section(self, section, level):
285306 )
286307
287308 if (level > parent_level ) and (parent_level + 1 != level ):
288- self .current_node . append (
289- self . reporter . warning (
290- "Non-consecutive header level increase; {} to {}" . format (
291- parent_level , level
292- ) ,
293- line = section . line ,
294- )
309+ self .create_warning (
310+ "Non-consecutive header level increase; {} to {}" . format (
311+ parent_level , level
312+ ),
313+ line = section . line ,
314+ subtype = "header" ,
315+ append_to = self . current_node ,
295316 )
296317
297318 parent = self ._level_to_elem [parent_level ]
@@ -511,10 +532,11 @@ def render_link_open(self, token: NestedTokens):
511532
512533 def handle_cross_reference (self , token , destination ):
513534 if not self .config .get ("ignore_missing_refs" , False ):
514- self .current_node .append (
515- self .reporter .warning (
516- f"Reference not found: { destination } " , line = token_line (token )
517- )
535+ self .create_warning (
536+ f"Reference not found: { destination } " ,
537+ line = token_line (token ),
538+ subtype = "ref" ,
539+ append_to = self .current_node ,
518540 )
519541
520542 def render_autolink (self , token : NestedTokens ):
@@ -829,21 +851,21 @@ def render_colon_fence(self, token: Token):
829851 classes = match .groupdict ()["classes" ][1 :].split ("," )
830852 name = match .groupdict ()["name" ]
831853 if classes and classes [0 ]:
832- self .current_node . append (
833- self . reporter . warning (
834- "comma-separated classes are deprecated, "
835- "use `:class:` option instead" ,
836- line = token_line ( token ) ,
837- )
854+ self .create_warning (
855+ "comma-separated classes are deprecated, "
856+ "use `:class:` option instead" ,
857+ line = token_line ( token ) ,
858+ subtype = "deprecation" ,
859+ append_to = self . current_node ,
838860 )
839861 # we assume that no other options have been used
840862 token .content = f":class: { ' ' .join (classes )} \n \n " + token .content
841863 if name == "figure" :
842- self .current_node . append (
843- self . reporter . warning (
844- ":::{figure} is deprecated, " "use :::{figure-md} instead" ,
845- line = token_line ( token ) ,
846- )
864+ self .create_warning (
865+ ":::{figure} is deprecated, " "use :::{figure-md} instead" ,
866+ line = token_line ( token ) ,
867+ subtype = "deprecation" ,
868+ append_to = self . current_node ,
847869 )
848870 name = "figure-md"
849871
0 commit comments