B
    d+                 @   s  d 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 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ee'ef dddZ(dS )zThe citation domain.    )TYPE_CHECKINGAnyDictListOptionalSetTuple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ee	e
e	e	ef f dddZeee	ee	 f ddd	Ze	d
dddZee	 ed
dddZejd
dddZed
dddZd
dddZde	de	e	eeee dddZde	de	eeee
e	ef  dddZd
S ) CitationDomainzDomain for citations.citationrefzcitation not found: %(target)s)returnc             C   s   | j di S )N	citations)data
setdefault)self r   d/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/domains/citation.pyr   "   s    zCitationDomain.citationsc             C   s   | j di S )Ncitation_refs)r   r   )r   r   r   r   r    &   s    zCitationDomain.citation_refsN)docnamer   c             C   sx   x0t | j D ]\}\}}}||kr| j|= qW x@t | j D ].\}}||hkr^| j|= qB||krB|| qBW d S )N)listr   itemsr    remove)r   r!   keyfnZ_lZ_linenodocnamesr   r   r   	clear_doc*   s    

zCitationDomain.clear_doc)r'   	otherdatar   c             C   s~   x.|d   D ]\}}|d |kr|| j|< qW xH|d   D ]8\}}| j|t }x|D ]}||kr\|| q\W q>W d S )Nr   r   r    )r#   r   r    r   setadd)r   r'   r)   r%   r   r    r!   r   r   r   merge_domaindata4   s    
zCitationDomain.merge_domaindata)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_citation?   s    
zCitationDomain.note_citationc             C   s&   | j |d t }|| jj d S )N	reftarget)r    r   r*   r+   r3   r!   )r   r-   r'   r   r   r   note_citation_referenceG   s    z&CitationDomain.note_citation_referencec             C   sH   xB| j  D ]4\}\}}}|| jkrtjtd|dd||fd qW d S )Nz Citation [%s] is not referenced.r   r   )r/   r0   r.   )r   r#   r    r4   r5   r   )r   namer!   Z_labelidlinenor   r   r   check_consistencyK   s    
z CitationDomain.check_consistencyr   r   )r3   fromdocnamebuildertyptargetr-   contnoder   c             C   s,   | j |d\}}	}
|sd S t||||	|S )N) rD   r   )r   getr   )r   r3   r?   r@   rA   rB   r-   rC   r!   Zlabelidr=   r   r   r   resolve_xrefQ   s
    zCitationDomain.resolve_xref)r3   r?   r@   rB   r-   rC   r   c          	   C   s0   |  |||d|||}|d kr"g S d|fgS d S )Nr   )rF   )r   r3   r?   r@   rB   r-   rC   Zrefnoder   r   r   resolve_any_xref[   s    zCitationDomain.resolve_any_xref)__name__
__module____qualname____doc__r<   r7   Zdangling_warningspropertyr   strr   intr   r   r    r(   r   r,   r
   r   r9   r   r;   r>   r   r   rF   rG   r   r   r   r   r      s&   "
r   c               @   s$   e Zd ZdZdZeddddZdS )CitationDefinitionTransformz3Mark citation definition labels as not smartquoted.ik  N)kwargsr   c             K   s\   t t| jd}xD| jtjD ]2}| jj|d< |	| t tj
|d }d|d< q"W d S )Nr   r!   r   Fsupport_smartquotes)r	   r   r3   
get_domaindocumentfindallr
   r   r!   r9   r7   )r   rP   domainr-   r7   r   r   r   applyi   s    
z!CitationDefinitionTransform.apply)rH   rI   rJ   rK   default_priorityr   rV   r   r   r   r   rO   e   s   rO   c               @   s$   e Zd ZdZdZeddddZdS )CitationReferenceTransformz|
    Replace citation references by pending_xref nodes before the default
    docutils transform tries to resolve them.
    ik  N)rP   r   c             K   s   t t| jd}xt| jtjD ]b}| }t	|dd|dd|d |
dg d}|t|d| 7 }t|| || || q"W d S )	Nr   r   TFr1   classes)Z	refdomainZreftyper:   ZrefwarnrQ   r1   rY   z[%s])r	   r   r3   rR   rS   rT   r
   Zcitation_referencer2   r   rE   inliner   Zreplace_selfr;   )r   rP   rU   r-   rB   r   r   r   r   rV   |   s    

z CitationReferenceTransform.apply)rH   rI   rJ   rK   rW   r   rV   r   r   r   r   rX   u   s   rX   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_transformrO   rX   )r[   r   r   r   setup   s    


r_   N))rK   typingr   r   r   r   r   r   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   	getLoggerrH   r4   r   rO   rX   rM   r_   r   r   r   r   <module>   s$   (
M