U
    \Sh,                     @  s   d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ erddlmZ ddlmZ ddlmZ eeZ G dd deZ!G dd deZ"G dd deZ#dddddZ$dS )zThe citation domain.    )annotations)TYPE_CHECKINGAnycast)nodes)Element)pending_xref)Domain)__)SphinxTransform)logging)copy_source_infomake_refnode)Sphinx)Builder)BuildEnvironmentc                	   @  s   e Zd ZdZdZdZddiZeddddZed	dd
dZ	dddddZ
ddddddZdddddZdddddZddddZddd dddd!d"d#d$d%Zddd ddd!d&d'd(d)Zd*S )+CitationDomainzDomain for citations.citationrefzcitation not found: %(target)szdict[str, tuple[str, str, int]])returnc                 C  s   | j di S )N	citationsdata
setdefaultself r   J/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/domains/citation.pyr   $   s    zCitationDomain.citationszdict[str, set[str]]c                 C  s   | j di S )Ncitation_refsr   r   r   r   r   r   (   s    zCitationDomain.citation_refsstrNone)docnamer   c                 C  sp   t | j D ]\}\}}}||kr| j|= qt | j D ].\}}||hkrX| j|= q<||kr<|| q<d S )N)listr   itemsr   remove)r   r!   keyfnZ_lZ_linenodocnamesr   r   r   	clear_doc,   s    


zCitationDomain.clear_docz	list[str]dict[str, Any])r'   	otherdatar   c                 C  sr   |d   D ]\}}|d |kr|| j|< q|d   D ]4\}}| j|t }|D ]}||krT|| qTq8d S )Nr   r   r   )r#   r   r   r   setadd)r   r'   r*   r%   r   r   r!   r   r   r   merge_domaindata6   s    zCitationDomain.merge_domaindataznodes.citation)noder   c                 C  sh   |d   }|| jkrF| j| j| d }tjtd|||ddd |d |d d |jf| j|< d S )Nr   z+duplicate citation %s, other instance in %sr   r   )locationtypesubtyper!   ids)astextr   envZdoc2pathloggerwarningr
   line)r   r.   labelpathr   r   r   note_citationA   s    
  zCitationDomain.note_citationr   c                 C  s&   | j |d t }|| jj d S )N	reftarget)r   r   r+   r,   r4   r!   )r   r.   r'   r   r   r   note_citation_referenceI   s    z&CitationDomain.note_citation_referencec                 C  sD   | j  D ]4\}\}}}|| jkr
tjtd|dd||fd q
d S )Nz Citation [%s] is not referenced.r   r   )r0   r1   r/   )r   r#   r   r5   r6   r
   )r   namer!   Z_labelidlinenor   r   r   check_consistencyM   s    
  z CitationDomain.check_consistencyr   r   r   zElement | None)r4   fromdocnamebuildertyptargetr.   contnoder   c                 C  s,   | j |d\}}	}
|sd S t||||	|S )N) rE   r   )r   getr   )r   r4   r@   rA   rB   rC   r.   rD   r!   Zlabelidr>   r   r   r   resolve_xrefS   s     zCitationDomain.resolve_xrefzlist[tuple[str, Element]])r4   r@   rA   rC   r.   rD   r   c              	   C  s0   |  |||d|||}|d kr"g S d|fgS d S )Nr   )rG   )r   r4   r@   rA   rC   r.   rD   Zrefnoder   r   r   resolve_any_xref]   s    zCitationDomain.resolve_any_xrefN)__name__
__module____qualname____doc__r=   r8   Zdangling_warningspropertyr   r   r(   r-   r:   r<   r?   rG   rH   r   r   r   r   r      s"    

r   c                   @  s$   e Zd ZdZdZdddddZdS )	CitationDefinitionTransformz3Mark citation definition labels as not smartquoted.k  r   r    kwargsr   c                 K  sX   t t| jd}| jtjD ]2}| jj|d< |	| t tj
|d }d|d< q d S )Nr   r!   r   Fsupport_smartquotes)r   r   r4   
get_domaindocumentfindallr   r   r!   r:   r8   )r   rQ   domainr.   r8   r   r   r   applyk   s    
z!CitationDefinitionTransform.applyNrI   rJ   rK   rL   Zdefault_priorityrW   r   r   r   r   rN   g   s   rN   c                   @  s$   e Zd ZdZdZdddddZdS )	CitationReferenceTransformz|
    Replace citation references by pending_xref nodes before the default
    docutils transform tries to resolve them.
    rO   r   r    rP   c                 K  s   t t| jd}| jtjD ]b}| }t	|dd|dd|d |
dg d}|t|d| 7 }t|| || || q d S )	Nr   r   TFr2   classes)Z	refdomainZreftyper;   ZrefwarnrR   r2   rZ   z[%s])r   r   r4   rS   rT   rU   r   Zcitation_referencer3   r   rF   inliner   Zreplace_selfr<   )r   rQ   rV   r.   rC   r   r   r   r   rW   ~   s     


z CitationReferenceTransform.applyNrX   r   r   r   r   rY   w   s   rY   r   r)   )appr   c                 C  s,   |  t | t | t dddddS )Nbuiltin   T)versionZenv_versionZparallel_read_safeZparallel_write_safe)Z
add_domainr   Zadd_transformrN   rY   )r\   r   r   r   setup   s    


r`   N)%rL   
__future__r   typingr   r   r   Zdocutilsr   Zdocutils.nodesr   Zsphinx.addnodesr   Zsphinx.domainsr	   Zsphinx.localer
   Zsphinx.transformsr   Zsphinx.utilr   Zsphinx.util.nodesr   r   Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.environmentr   	getLoggerrI   r5   r   rN   rY   r`   r   r   r   r   <module>   s&   
M