
    Qjf                    B   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ e	rddlmZ  ej0                  e      Z G d de      Zi dddddddddddddddddddd d!d"d#d$d%d&d'd(d)dd*d+Z G d, d-      Zy).zLSphinx core events.

Gracefully adapted from the TextPress system by Armin.
    )annotationsN)defaultdict)
attrgetter)TYPE_CHECKINGAnyCallable
NamedTuple)ExtensionErrorSphinxError)__)logging)safe_getattr)Sphinxc                  ,    e Zd ZU ded<   ded<   ded<   y)EventListenerintidr   handlerpriorityN)__name__
__module____qualname____annotations__     -lib/python3.12/site-packages/sphinx/events.pyr   r      s    GMr   r   zbuilder-inited zconfig-initedconfigzenv-get-outdatedzenv, added, changed, removedzenv-get-updatedenvzenv-purge-doczenv, docnamezenv-before-read-docszenv, docnameszenv-check-consistencyzsource-readzdocname, source textzinclude-readz*relative path, parent docname, source textzdoctree-readz the doctree before being pickledzenv-merge-infoz&env, read docnames, other env instancezmissing-referencezenv, node, contnodezwarn-missing-referencezdomain, nodezdoctree-resolvedzdoctree, docnamezenv-updatedzbuild-finished	exceptionc                  h    e Zd ZdZddZddZddZddZdd	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 dd	Z	y
)EventManagerzEvent manager for Sphinx.c                z    || _         t        j                         | _        t	        t
              | _        d| _        y )Nr   )appcore_eventscopyeventsr   list	listenersnext_listener_id)selfr$   s     r   __init__zEventManager.__init__7   s-    !&&(9DT9J !r   c                l    || j                   v rt        t        d      |z        d| j                   |<   y)zRegister a custom Sphinx event.zEvent %r already presentr   N)r'   r
   r   )r+   names     r   addzEventManager.add=   s2    4;; $>!?$!FGGDr   c                    || j                   vrt        t        d      |z        | j                  }| xj                  dz  c_        | j                  |   j                  t        |||             |S )z$Connect a handler to specific event.zUnknown event name: %s   )r'   r
   r   r*   r)   appendr   )r+   r.   callbackr   listener_ids        r   connectzEventManager.connectC   sf    t{{" $<!=!DEE++"t##M+x$RSr   c                    | j                   j                         D ]8  }|j                         D ]#  }|j                  |k(  s|j	                  |       % : y)zDisconnect a handler.N)r)   valuesr&   r   remove)r+   r4   r)   listeners       r   
disconnectzEventManager.disconnectM   sN    ..0 	/I%NN, /;;+-$$X./	/r   r   )allowed_exceptionsc               B   t        j                  t              5  t        j	                  d|t        |      dd        ddd       g }t        | j                  |   t        d            }|D ]/  }	 |j                   |j                  | j                  g|        1 |S # 1 sw Y   dxY w# |$ r  t        $ r  t        $ rZ}| j                  j                  r t        |j                  dd      }t        t!        d      |j                  |fz  ||      |d}~ww xY w)	zEmit a Sphinx event.z[app] emitting event: %r%sNd   r   )keyr   z*Handler %r for event %r threw an exception)modname)
contextlibsuppress	Exceptionloggerdebugreprsortedr)   r   r2   r   r$   r   pdbr   r
   r   )	r+   r.   r;   argsresultsr)   r9   excr?   s	            r   emitzEventManager.emitT   s#      + 	OLL5tT$Z=MN	O 4>>$/Z
5KL	! 	H/x//@4@A	& 1	O 	O &   
88<<&x'7'7tL$CD''./#	
 
s$   $B!1,B-!B*-DADDc               F     | j                   |g|d|iD ]  }||c S  y)zEmit a Sphinx event and returns first result.

        This returns the result of the first handler that doesn't return ``None``.
        r;   N)rK   )r+   r.   r;   rH   results        r   emit_firstresultzEventManager.emit_firstresultt   s9      diiStS@RS 	F!	 r   N)r$   r   returnNone)r.   strrO   rP   )r.   rQ   r3   r   r   r   rO   r   )r4   r   rO   rP   )r.   rQ   rH   r   r;   tuple[type[Exception], ...]rO   r(   )r.   rQ   rH   r   r;   rR   rO   r   )
r   r   r   __doc__r,   r/   r5   r:   rK   rN   r   r   r   r"   r"   4   sr    #"/ XZ #9T	B XZ

 #
9T
	
r   r"   )rS   
__future__r   r@   collectionsr   operatorr   typingr   r   r   r	   sphinx.errorsr
   r   sphinx.localer   sphinx.utilr   sphinx.util.inspectr   sphinx.applicationr   	getLoggerr   rC   r   r%   r"   r   r   r   <module>r^      s&  
 #  #  ; ; 5   ,) 
		8	$J bX 6 u	
 ^ O U ) @ 6 > . n * 5  k!(J Jr   