B
    dN*                 @   s  d Z ddlZddl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mZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ ddlmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z&m'Z' ddl(m)Z) e$*e+Z,e-dZ.G dd dee/ Z0e/ee/e/f dddZ1G dd de0Z2G dd de0Z3G dd de0Z4G dd deZ5eee/ef d d!d"Z6dS )#zThe reStructuredText domain.    N)AnyDictIteratorListOptionalTuplecast)Element)
directives)addnodes)desc_signaturepending_xref)Sphinx)Builder)ObjectDescription)DomainObjType)BuildEnvironment)___)XRefRole)logging)make_idmake_refnode)
OptionSpecz\.\. (.+?)::(.*)$c               @   s   e Zd ZU dZejejejdZeed< e	e	e
ddddZe	e	e	dd	d
Ze	e	dddZe
ee	df dddZe
e	dddZdS )
ReSTMarkupz-
    Description of generic reST markup.
    )ZnoindexnoindexentryZnocontentsentryoption_specN)namesigsignodereturnc             C   s   t | j| jj| j|}|d | | jj| tt| j	d}|j
| j|||d d| jkr| | j|}|r| jd d||dd f d S )Nidsrst)locationr   entriessingle )r   envstatedocumentobjtypeappendnote_explicit_targetr   
ReSTDomain
get_domainnote_objectoptionsget_index_text	indexnode)selfr   r   r    node_iddomainZ	indextext r7   _/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/domains/rst.pyadd_target_and_index%   s    
zReSTMarkup.add_target_and_index)
objectnamer   r!   c             C   s   dS )Nr'   r7   )r4   r:   r   r7   r7   r8   r2   2   s    zReSTMarkup.get_index_text)r   r!   c             C   s   | j d | S )zGenerate old styled node_id for reST markups.

        .. note:: Old Styled node_id was used until Sphinx-3.0.
                  This will be removed in Sphinx-5.0.
        -)r+   )r4   r   r7   r7   r8   make_old_id5   s    zReSTMarkup.make_old_id.)sig_noder!   c             C   sR   d|krdS g }x&| j jddD ]}||d7 }q"W |d }t||d S )Nfullnamer7   zrst:directives:)r(   ref_contextgetsplittuple)r4   r=   Zdirective_namesparentr   r7   r7   r8   _object_hierarchy_parts=   s    z"ReSTMarkup._object_hierarchy_partsc             C   s   | dsdS | jjj}|j d}|d ^ }}|dkrFd| dS |jdkr^d|d }|dkrrd| dS |dkrd	| d
S dS )NZ
_toc_partsr'   r+   zdirective:optionr?   >   r6   allrole	directivez.. z::)rA   r(   appconfigrD   Ztoc_object_entries_show_parentsjoin)r4   r=   rJ   r+   parentsr   r7   r7   r8   _toc_entry_nameF   s    


zReSTMarkup._toc_entry_name)__name__
__module____qualname____doc__r
   flagr   r   __annotations__strr   r9   r2   r<   r   rE   rM   r7   r7   r7   r8   r      s   
	r   )dr!   c             C   sh   |   }|ds|dfS t|}|s0|dfS | \}}|  rX|  d|   fS |  dfS dS )zParse a directive signature.

    Returns (directive, arguments) string tuple.  If no arguments are given,
    returns (directive, '').
    .r'    N)strip
startswith
dir_sig_rematchgroups)rU   dirmZ
parsed_dirZparsed_argsr7   r7   r8   parse_directiveX   s    

r_   c               @   sP   e Zd ZdZeeedddZeeedddZdd	d
dZdd	ddZ	dS )ReSTDirectivez*
    Description of a reST directive.
    )r   r    r!   c             C   sT   t |\}}d| d}| |d< |t||7 }t|dkrP|t||7 }|S )Nz.. z::r>   r   )r_   rX   r   	desc_namelenZdesc_addname)r4   r   r    r   argsra   r7   r7   r8   handle_signaturep   s    zReSTDirective.handle_signature)r:   r   r!   c             C   s   t d| S )Nz%s (directive))r   )r4   r:   r   r7   r7   r8   r2   y   s    zReSTDirective.get_index_textN)r!   c             C   s*   | j r&| jjdg }|| j d  d S )Nzrst:directivesr   )namesr(   r@   
setdefaultr,   )r4   r
   r7   r7   r8   before_content|   s    zReSTDirective.before_contentc             C   s    | j jdg }|r|  d S )Nzrst:directives)r(   r@   rf   pop)r4   r
   r7   r7   r8   after_content   s    zReSTDirective.after_content)
rN   rO   rP   rQ   rT   r   rd   r2   rg   ri   r7   r7   r7   r8   r`   l   s
   	r`   c               @   s|   e Zd ZU dZej Zeed< e	de
ji eeedddZeeeddd	d
ZeedddZeedddZdS )ReSTDirectiveOptionz6
    Description of an option for reST directive.
    r   type)r   r    r!   c             C   s   yt d| d\}}W n tk
r8   |d  }}Y nX d| d}| |d< |t||7 }|r~|td| d| 7 }| jdrd| jd  }|t||7 }|S )Nz\s*:\s+   r?   r>   rW   rk   z (%s))	rerB   rX   
ValueErrorr   ra   Zdesc_annotationr1   rA   )r4   r   r    r   argumentra   textr7   r7   r8   rd      s    z$ReSTDirectiveOption.handle_signatureN)r   r   r    r!   c             C   s
  t t| jd}| j}|r<d| j|g}d||g}n
| j}|}t| j| jj	||}|d 
| | jj	| |j| j|||d |r|d  }	td| td| g}
| jd	 
d
d|
|d|	f n2|d  }	td| }| jd	 
d||d|	f d S )Nr#   r;   r?   r"   )r$   r   z%s (directive)z:%s: (directive option)r%   pairz; r'   r&   )r   r.   r(   r/   current_directiverK   r+   r   r)   r*   r,   r-   r0   upperr   r3   )r4   r   r   r    r6   Zdirective_nameprefixZobjnamer5   keyrq   rp   r7   r7   r8   r9      s&    
"z(ReSTDirectiveOption.add_target_and_index)r!   c             C   s"   | j jd}|r|d S dS d S )Nzrst:directivesr'   )r(   r@   rA   )r4   r
   r7   r7   r8   rr      s    z%ReSTDirectiveOption.current_directive)r   r!   c             C   s   d | j| j|gS )zGenerate old styled node_id for directive options.

        .. note:: Old Styled node_id was used until Sphinx-3.0.
                  This will be removed in Sphinx-5.0.
        r;   )rK   r+   rr   )r4   r   r7   r7   r8   r<      s    zReSTDirectiveOption.make_old_id)rN   rO   rP   rQ   r   r   copyr   rS   updater
   Z	unchangedrT   r   rd   r9   propertyrr   r<   r7   r7   r7   r8   rj      s   
rj   c               @   s4   e Zd ZdZeeedddZeeedddZdS )	ReSTRolez%
    Description of a reST role.
    )r   r    r!   c             C   s,   d| d}|  |d< |t||7 }|S )Nr?   r>   )rX   r   ra   )r4   r   r    ra   r7   r7   r8   rd      s    zReSTRole.handle_signature)r:   r   r!   c             C   s   t d| S )Nz	%s (role))r   )r4   r:   r   r7   r7   r8   r2      s    zReSTRole.get_index_textN)rN   rO   rP   rQ   rT   r   rd   r2   r7   r7   r7   r8   rz      s   rz   c            
   @   sV  e Zd ZU dZdZdZeeddeeddeedddZe	e
edZe e d	Zd
i iZeeeeeef ef f ed< eeeeef eeef f dddZd!eeeeddddZeddddZee eddddZeeeeeeeee dddZ eeeeeeeeeef  dddZ!e"eeeeeee#f  ddd Z$dS )"r.   zReStructuredText domain.r#   reStructuredTextrH   r]   zdirective-optionrG   )rH   zdirective:optionrG   )r]   rG   objectsinitial_data)r!   c             C   s   | j di S )Nr|   )datarf   )r4   r7   r7   r8   r|      s    zReSTDomain.objectsN)r+   r   r5   r$   r!   c             C   sV   ||f| j kr<| j ||f \}}tjtd|||f |d | jj|f| j ||f< d S )Nz4duplicate description of %s %s, other instance in %s)r$   )r|   loggerwarningr   r(   docname)r4   r+   r   r5   r$   r   r7   r7   r8   r0      s
    
zReSTDomain.note_object)r   r!   c             C   s<   x6t | j D ]$\\}}\}}||kr| j||f= qW d S )N)listr|   items)r4   r   typr   docZ_node_idr7   r7   r8   	clear_doc   s     zReSTDomain.clear_doc)docnames	otherdatar!   c             C   s@   x:|d   D ]*\\}}\}}||kr||f| j||f< qW d S )Nr|   )r   r|   )r4   r   r   r   r   r   r5   r7   r7   r8   merge_domaindata  s    zReSTDomain.merge_domaindata)r(   fromdocnamebuilderr   targetnodecontnoder!   c          	   C   sP   |  |}x@|D ]8}	| j|	|fd\}
}|
rt|||
|||d |	 S qW d S )N)NNrW   )Zobjtypes_for_roler|   rA   r   )r4   r(   r   r   r   r   r   r   Zobjtypesr+   	todocnamer5   r7   r7   r8   resolve_xref  s    


zReSTDomain.resolve_xref)r(   r   r   r   r   r   r!   c             C   s`   g }xV| j D ]L}| j||fd\}	}
|	r|d| | t|||	|
||d | f qW |S )N)NNzrst:rW   )object_typesr|   rA   r,   Zrole_for_objtyper   )r4   r(   r   r   r   r   r   resultsr+   r   r5   r7   r7   r8   resolve_any_xref  s    
zReSTDomain.resolve_any_xrefc             c   s:   x4| j d  D ]"\\}}\}}|||||dfV  qW d S )Nr|   rl   )r~   r   )r4   r   r   r   r5   r7   r7   r8   get_objects  s     zReSTDomain.get_objects)N)%rN   rO   rP   rQ   r   labelr   r   r   r`   rj   rz   r
   r   Zrolesr}   r   rT   r   rS   ry   r|   r   r0   r   r   r   r   r   r   r	   r   r   r   r   intr   r7   r7   r7   r8   r.      s0   

((	
r.   )rI   r!   c             C   s   |  t dddddS )Nbuiltin   T)versionZenv_versionZparallel_read_safeZparallel_write_safe)Z
add_domainr.   )rI   r7   r7   r8   setup#  s
    
r   )7rQ   rm   typingr   r   r   r   r   r   r   Zdocutils.nodesr	   Zdocutils.parsers.rstr
   Zsphinxr   Zsphinx.addnodesr   r   Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.directivesr   Zsphinx.domainsr   r   Zsphinx.environmentr   Zsphinx.localer   r   Zsphinx.rolesr   Zsphinx.utilr   Zsphinx.util.nodesr   r   Zsphinx.util.typingr   	getLoggerrN   r   compilerZ   rT   r   r_   r`   rj   rz   r.   r   r7   r7   r7   r8   <module>   s2   $

=DJ