B
    d2                 @   s  d Z ddlZddl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 ddlmZmZ ddl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 ddl m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z' ddl(m)Z) e&*e+Z,dZ-G dd deZ.ee/e/e
e/ dddZ0ee1dddZ2eeddddZ3eee	e/ eddddZ4eee/dd d!d"Z5G d#d$ d$e#Z6ee/e
e/ d%d&d'Z7ee/e1d%d(d)Z8eeee/ee/ef e/f ddf d*d+d,Z9eee/ef d*d-d.Z:dS )/z7Add links to module code in Python object descriptions.    N)path)AnyDict	GeneratorIterableOptionalSetTuplecast)nodes)ElementNode)addnodes)Sphinx)Builder)StandaloneHTMLBuilder)BuildEnvironment)___)ModuleAnalyzer)SphinxPostTransform)get_full_modnameloggingstatus_iterator)make_refnodeZ_modulesc               @   s   e Zd ZdZdS )viewcode_anchorzNode for viewcode anchors.

    This node will be processed in the resolving phase.
    For viewcode supported builders, they will be all converted to the anchors.
    For not supported builders, they will be removed.
    N)__name__
__module____qualname____doc__ r    r    `/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/ext/viewcode.pyr      s   r   )appmodname	attributereturnc          
   C   sr   y
t ||S  tk
r,   td|| d S  tk
rl } z$tt   td|| d S d }~X Y nX d S )NzDidn't find %s in %sz0viewcode can't import %s, failed with error "%s")r   AttributeErrorloggerverbose	Exception	traceback
format_excrstrip)r"   r#   r$   er    r    r!   _get_full_modname&   s    
r.   )builderr%   c             C   s<   | j dkrdS | jdkrdS | jdr4| jjs4dS dS d S )NhtmlFZ
singlehtmlZepubT)formatname
startswithconfigviewcode_enable_epub)r/   r    r    r!   is_supported_builder8   s    

r6   )r"   doctreer%   c          	      s$   j jtdsi _tttttd fdd}xt|tj	D ]}|
ddkrZqFt }x|D ]}t|tjsxqf|
d}|
d}|}jjr d	||}	|	st ||}	|	}|sqf|
d}|||j|sqf||krqf|| tt|d
d}
|t|
|jd7 }qfW qFW d S )N_viewcode_modules)r#   fullnamedocnamerefnamer%   c                s   j | d }|dkrdS  d| }|d krryt| }|  W n tk
rb   dj | < dS X |j}|j}n|\}}|d ks|d |kr||i |f}|j | < |\}	}}
}	||kr||
|< dS dS )NFzviewcode-find-sourcer   T)	r8   getemit_firstresultr   Z
for_moduleZ	find_tagsr)   codetags)r#   r9   r:   r;   entryZ	code_tagsZanalyzerr>   r?   r   used)r"   envr    r!   has_tagH   s,    


zdoctree_read.<locals>.has_tagdomainpymoduler9   zviewcode-follow-imported./)	reftargetrefidrefdoc)r/   rB   hasattrr8   strboollistfindallr   descr<   set
isinstanceZdesc_signaturer4    viewcode_follow_imported_membersr=   r.   r:   add	posixpathjoinOUTPUT_DIRNAMEreplacer   )r"   r7   rC   ZobjnodenamesZsignoder#   r9   r;   Znew_modnamepagenamer    )r"   rB   r!   doctree_readC   s<    






r\   )r"   rB   docnamesotherr%   c       	      C   s   t |dsd S t |dsi |_xn|j D ]`\}}||jkrH||j|< q*|j| r*|j| d }x(|d  D ]\}}||krn|||< qnW q*W d S )Nr8      )rL   r8   items)	r"   rB   r]   r^   r#   r@   rA   r9   r:   r    r    r!   env_merge_info   s    



ra   )r"   rB   r:   r%   c             C   s~   t |di }xlt| D ]\\}}|dkr,q|\}}}}	x&t|D ]}
||
 |krB||
 qBW t|dkr|| qW d S )Nr8   Fr   )getattrrO   r`   poplen)r"   rB   r:   modulesr#   r@   r>   r?   rA   r;   r9   r    r    r!   env_purge_doc   s    rf   c               @   s@   e Zd ZdZdZeddddZdddd	Zddd
dZdS )ViewcodeAnchorTransformz;Convert or remove viewcode_anchor nodes depends on builder.d   N)kwargsr%   c             K   s"   t | jjr|   n|   d S )N)r6   r"   r/   convert_viewcode_anchorsremove_viewcode_anchors)selfri   r    r    r!   run   s    
zViewcodeAnchorTransform.run)r%   c             C   sZ   xT| j tD ]D}tjdtddgd}t| jj|d |d |d |}|	| qW d S )N z[source]zviewcode-link)classesrK   rI   rJ   )
documentrP   r   r   inliner   r   r"   r/   Zreplace_self)rl   nodeanchorZrefnoder    r    r!   rj      s
    z0ViewcodeAnchorTransform.convert_viewcode_anchorsc             C   s*   x$t | jtD ]}|j| qW d S )N)rO   rp   rP   r   parentremove)rl   rr   r    r    r!   rk      s    z/ViewcodeAnchorTransform.remove_viewcode_anchors)	r   r   r   r   Zdefault_priorityr   rm   rj   rk   r    r    r    r!   rg      s
   rg   )r"   r#   r%   c             C   s@   |  d|}|rdS yt|\}}|S  tk
r:   dS X dS )z"Get module filename for *modname*.zviewcode-find-sourceN)r=   r   Zget_module_sourcer)   )r"   r#   Zsource_infofilenamesourcer    r    r!   get_module_filename   s    rx   c             C   sz   t | |}|dkrdS tt| j}|dd|j }t| jd|}yt	|t	|kr^dS W n t
k
rt   Y nX dS )z*Check generation of module page is needed.NTrG   rH   z	_modules/F)rx   r
   r   r/   rY   Z
out_suffixr   rW   ZoutdirgetmtimeIOError)r"   r#   Zmodule_filenamer/   basenameZpage_filenamer    r    r!   should_generate_module_page   s    
r|   )r"   r%   c             c   sB  | j j}t|dsd S t| j s$d S | j j}| j j}t|j}xtt	|j
 tddt|j| jdd D ]\}}|s~qnt| |sqn|\}}}	}
tt|dd}|jjdkr|jj}nd	}|j||d
d}| }|d d\}}|d |g|dd< t|d }xr|	
 D ]f\}}|| \}}}|||d |
 d | }d||tdf ||  ||< |t||  d7  < qW g }|}xPd|kr|ddd }||kr|||tt|dd|d qW |||ttdtdd |  ||td| d| d}||dfV  qnW |s>d S dg}dg}xt	|D ]}||d r||d  |d n@|  x(||d s|  |d qW ||d  |d|ttdtt|dd|f  qTW |dt|d   tdtd d| d!}ttd|dfV  d S )"Nr8   zhighlighting module code... bluec             S   s   | d S )Nr   r    )xr    r    r!   <lambda>       zcollect_pages.<locals>.<lambda>rG   rH   >   defaultnonepythonF)Zlinenosr   z<pre>   #zM<div class="viewcode-block" id="%s"><a class="viewcode-back" href="%s">%s</a>z[docs]z</div>)linktitleindexzModule codez<h1>Source code for %s</h1>
)parentsr   bodyz	page.htmlrn   z<ul>z</ul>z<li><a href="%s">%s</a></li>
zOverview: module codez0<h1>All modules for which code is available</h1>)r   r   )r/   rB   rL   r6   highlighterZget_relative_urirR   r8   r   sortedr`   r   rd   	verbosityr|   rV   rW   rX   rY   r4   Zhighlight_languageZhighlight_block
splitlinessplitr   minrsplitappendreverser3   rc   )r"   rB   r   Zuritomodnamesr#   r@   r>   r?   rA   r;   r[   lexerZhighlightedlinesbeforeafterZmaxindexr2   r:   typestartendZbacklinkr   rt   contextr0   stackr    r    r!   collect_pages   s    






r   c             C   s   |  dd d |  ddd |  ddd | dt | dt | dt | d	t | d
 | d | t t	j
dddS )NZviewcode_importFr5   rT   Tzdoctree-readzenv-merge-infozenv-purge-doczhtml-collect-pageszviewcode-find-sourcezviewcode-follow-importedr   )versionZenv_versionZparallel_read_safe)Zadd_config_valueconnectr\   ra   rf   r   Z	add_eventZadd_post_transformrg   sphinxZ__display_version__)r"   r    r    r!   setupB  s    


r   );r   rV   r*   osr   typingr   r   r   r   r   r   r	   r
   Zdocutilsr   Zdocutils.nodesr   r   r   r   Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.builders.htmlr   Zsphinx.environmentr   Zsphinx.localer   r   Zsphinx.pycoder   Z!sphinx.transforms.post_transformsr   Zsphinx.utilr   r   r   Zsphinx.util.nodesr   	getLoggerr   r'   rX   r   rM   r.   rN   r6   r\   ra   rf   rg   rx   r|   r   r   r    r    r    r!   <module>   s>   (
	@
,d