@@ -298,9 +298,20 @@ class desc_annotation(nodes.Part, nodes.Inline, nodes.FixedTextElement):
298298# Leaf nodes for markup of text fragments
299299#########################################
300300
301+ #: A set of classes inheriting :class:`desc_sig_element`. Each node class
302+ #: is expected to be handled by the builder's translator class if the latter
303+ #: does not inherit from SphinxTranslator.
304+ #:
305+ #: This set can be extended manually by third-party extensions or
306+ #: by subclassing :class:`desc_sig_element` and using the class
307+ #: keyword argument `_sig_element=True`.
308+ SIG_ELEMENTS : set [type [desc_sig_element ]] = set ()
309+
310+
301311# Signature text elements, generally translated to node.inline
302312# in SigElementFallbackTransform.
303- # When adding a new one, add it to SIG_ELEMENTS.
313+ # When adding a new one, add it to SIG_ELEMENTS via the class
314+ # keyword argument `_sig_element=True` (e.g., see `desc_sig_space`).
304315
305316class desc_sig_element (nodes .inline , _desc_classes_injector ):
306317 """Common parent class of nodes for inline text of a signature."""
@@ -311,11 +322,17 @@ def __init__(self, rawsource: str = '', text: str = '',
311322 super ().__init__ (rawsource , text , * children , ** attributes )
312323 self ['classes' ].extend (self .classes )
313324
325+ def __init_subclass__ (cls , * , _sig_element = False , ** kwargs ):
326+ super ().__init_subclass__ (** kwargs )
327+ if _sig_element :
328+ # add the class to the SIG_ELEMENTS set if asked
329+ SIG_ELEMENTS .add (cls )
330+
314331
315332# to not reinvent the wheel, the classes in the following desc_sig classes
316333# are based on those used in Pygments
317334
318- class desc_sig_space (desc_sig_element ):
335+ class desc_sig_space (desc_sig_element , _sig_element = True ):
319336 """Node for a space in a signature."""
320337 classes = ["w" ]
321338
@@ -324,54 +341,46 @@ def __init__(self, rawsource: str = '', text: str = ' ',
324341 super ().__init__ (rawsource , text , * children , ** attributes )
325342
326343
327- class desc_sig_name (desc_sig_element ):
344+ class desc_sig_name (desc_sig_element , _sig_element = True ):
328345 """Node for an identifier in a signature."""
329346 classes = ["n" ]
330347
331348
332- class desc_sig_operator (desc_sig_element ):
349+ class desc_sig_operator (desc_sig_element , _sig_element = True ):
333350 """Node for an operator in a signature."""
334351 classes = ["o" ]
335352
336353
337- class desc_sig_punctuation (desc_sig_element ):
354+ class desc_sig_punctuation (desc_sig_element , _sig_element = True ):
338355 """Node for punctuation in a signature."""
339356 classes = ["p" ]
340357
341358
342- class desc_sig_keyword (desc_sig_element ):
359+ class desc_sig_keyword (desc_sig_element , _sig_element = True ):
343360 """Node for a general keyword in a signature."""
344361 classes = ["k" ]
345362
346363
347- class desc_sig_keyword_type (desc_sig_element ):
364+ class desc_sig_keyword_type (desc_sig_element , _sig_element = True ):
348365 """Node for a keyword which is a built-in type in a signature."""
349366 classes = ["kt" ]
350367
351368
352- class desc_sig_literal_number (desc_sig_element ):
369+ class desc_sig_literal_number (desc_sig_element , _sig_element = True ):
353370 """Node for a numeric literal in a signature."""
354371 classes = ["m" ]
355372
356373
357- class desc_sig_literal_string (desc_sig_element ):
374+ class desc_sig_literal_string (desc_sig_element , _sig_element = True ):
358375 """Node for a string literal in a signature."""
359376 classes = ["s" ]
360377
361378
362- class desc_sig_literal_char (desc_sig_element ):
379+ class desc_sig_literal_char (desc_sig_element , _sig_element = True ):
363380 """Node for a character literal in a signature."""
364381 classes = ["sc" ]
365382
366383
367- SIG_ELEMENTS = [desc_sig_space ,
368- desc_sig_name ,
369- desc_sig_operator ,
370- desc_sig_punctuation ,
371- desc_sig_keyword , desc_sig_keyword_type ,
372- desc_sig_literal_number , desc_sig_literal_string , desc_sig_literal_char ]
373-
374-
375384###############################################################
376385# new admonition-like constructs
377386
0 commit comments