B
    .Kc}                 @   s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	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rdd	lmZ eeZG d
d deZddddddddddddddddZG dd dZdS )zLSphinx core events.

Gracefully adapted from the TextPress system by Armin.
    )defaultdict)
attrgetter)TYPE_CHECKINGAnyCallableDictList
NamedTupleTupleType)ExtensionErrorSphinxError)__)logging)safe_getattr)Sphinxc               @   s&   e Zd ZU eed< eed< eed< dS )EventListeneridhandlerpriorityN)__name__
__module____qualname__int__annotations__r    r   r   ,lib/python3.7/site-packages/sphinx/events.pyr      s   
r    Zconfigzenv, added, changed, removedenvzenv, docnamezenv, docnameszdocname, source textz the doctree before being pickledz&env, read docnames, other env instancezenv, node, contnodezdomain, nodezdoctree, docnameZ	exception)zbuilder-initedzconfig-initedzenv-get-outdatedzenv-get-updatedzenv-purge-doczenv-before-read-docszenv-check-consistencyzsource-readzdoctree-readzenv-merge-infozmissing-referencezwarn-missing-referencezdoctree-resolvedzenv-updatedzbuild-finishedc               @   s   e Zd ZdZdddddZedddd	Zeeeed
ddZ	eddddZ
ddeeeee df edddZddeeeee df edddZdS )EventManagerzEvent manager for Sphinx.r   N)appreturnc             C   s$   || _ t | _tt| _d| _d S )Nr   )r    core_eventscopyeventsr   list	listenersnext_listener_id)selfr    r   r   r   __init__3   s    

zEventManager.__init__)namer!   c             C   s(   || j krttd| d| j |< dS )zRegister a custom Sphinx event.zEvent %r already presentr   N)r$   r   r   )r(   r*   r   r   r   add9   s    
zEventManager.add)r*   callbackr   r!   c             C   sJ   || j krttd| | j}|  jd7  _| j| t||| |S )z$Connect a handler to specific event.zUnknown event name: %s   )r$   r   r   r'   r&   appendr   )r(   r*   r,   r   listener_idr   r   r   connect?   s    
zEventManager.connect)r/   r!   c             C   sB   x<| j  D ].}x(|dd D ]}|j|kr|| qW qW dS )zDisconnect a handler.N)r&   valuesr   remove)r(   r/   r&   listenerr   r   r   
disconnectI   s    
zEventManager.disconnectr   )allowed_exceptions.)r*   argsr5   r!   c      	      G   s   yt d|t|dd  W n tk
r2   Y nX g }t| j| tdd}x|D ]}y||j| j	f|  W qT |k
r    Y qT t
k
r    Y qT tk
r } z:| j	jr t|jdd}ttd|j|f ||d|W dd}~X Y qTX qTW |S )	zEmit a Sphinx event.z[app] emitting event: %r%sNd   r   )keyr   z*Handler %r for event %r threw an exception)modname)loggerdebugrepr	Exceptionsortedr&   r   r.   r   r    r   Zpdbr   r   r   )	r(   r*   r5   r6   resultsr&   r3   excr9   r   r   r   emitP   s(    
,zEventManager.emitc            G   s0   x*| j |f|d|iD ]}|dk	r|S qW dS )zEmit a Sphinx event and returns first result.

        This returns the result of the first handler that doesn't return ``None``.
        r5   N)rA   )r(   r*   r5   r6   resultr   r   r   emit_firstresultm   s    zEventManager.emit_firstresult)r   r   r   __doc__r)   strr+   r   r   r0   r4   r   r
   r   r=   r   rA   rC   r   r   r   r   r   0   s   
&r   N)rD   collectionsr   operatorr   typingr   r   r   r   r   r	   r
   r   Zsphinx.errorsr   r   Zsphinx.localer   Zsphinx.utilr   Zsphinx.util.inspectr   Zsphinx.applicationr   Z	getLoggerr   r:   r   r"   r   r   r   r   r   <module>   s6   (
