B
    \)                 @   s   d Z ddlZddl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mZmZ dd
lmZ eeZdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )z
    sphinx.ext.viewcode
    ~~~~~~~~~~~~~~~~~~~

    Add links to module code in Python object descriptions.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)nodes)	iteritems	text_type)addnodes)RemovedInSphinx30Warning)_)ModuleAnalyzer)get_full_modnameloggingstatus_iterator)make_refnodec          
   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)appmodnameZ	attributee r   2lib/python3.7/site-packages/sphinx/ext/viewcode.py_get_full_modname$   s    
r   c                s~   j jtdsi _ j jdkr(d S  j jdrBjjsBd S  fdd}x&|t	j
D ]}|ddkrvq`t }x|D ]}t|t	jsq|d}|d	}|}jjrֈ d
||}	|	st ||}	|	}|sq|d	}|||j|sq||krq|| d|dd }
t	jdd}|t	jdddd|
|jd7 }|d  tjdtddgd7  < ||7 }qW q`W d S )N_viewcode_modulesZ
singlehtmlZepubc                s   j | d }|dkrd S  d| }|d kryt| }W n tk
rZ   dj | < d S X t|jtsx|j	|j
}n|j}|  |j}n|\}}|d ks|d |kr||i |f}|j | < |\}	}}
}	||kr||
|< dS d S )NFzviewcode-find-sourcer   T)r   getemit_firstresultr   Z
for_moduler   
isinstancecoder   decodeencodingZ	find_tagstags)r   fullnamedocnamerefnameentryZ	code_tagsZanalyzerr   r!   r   used)r   envr   r   has_tagA   s.    

zdoctree_read.<locals>.has_tagZdomainpymoduler"   zviewcode-follow-importedz	_modules/./html)expr viewcodeZstdF)reftypeZ	refdomainZrefexplicit	reftargetrefidrefdocr   z[source]zviewcode-link)classes)builderr'   hasattrr   name
startswithconfigviewcode_enable_epubZtraverser   Zdescr   setr   Zdesc_signature viewcode_follow_imported_membersr   r   r#   addreplaceZonlyZpending_xrefr   Zinliner   )r   Zdoctreer(   ZobjnodenamesZsignoder   r"   r$   Znew_modnamepagenameZonlynoder   )r   r'   r   doctree_read7   sR    







rB   c             C   s0   t |dsd S t |dsi |_|j|j d S )Nr   )r7   r   update)r   r'   Zdocnamesotherr   r   r   env_merge_info   s
    

rE   c             C   s.   |d dkr*t | j|d |d |d |S d S )Nr1   r0   r4   r2   r3   )r   r6   )r   r'   ZnodeZcontnoder   r   r   missing_reference   s    rF   c             c   s  | j j}t|dsd S | j j}| j j}t|j}xttt	|jddt
|j| jdd D ]\}}|slq\|\}}}	}
d|dd }|jjd	kr|jj}nd
}|j||dd}| }|d d\}}|d |g|dd< t
|d }xpt	|	D ]d\}}|| \}}}|||d |
 d | }d||tdf ||  ||< |t||  d7  < qW g }|}xLd|kr|ddd }||krh|||d|dd |d qhW |||dtdd |  ||td| d| d}||dfV  q\W |sd S dg}dg}xt|D ]}||d rR||d  |d n@|  x(||d s|  |d q\W ||d  |d|dd|dd |f  q$W |dt
|d   td td!d| d"}d|dfV  d S )#Nr   zhighlighting module code... Zbluec             S   s   | d S )Nr   r   )xr   r   r   <lambda>   s    zcollect_pages.<locals>.<lambda>z	_modules/r+   r,   )Zpython3defaultZnoneZ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titlez_modules/indexzModule codez<h1>Source code for %s</h1>
)parentsrM   bodyz	page.htmlr/   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>)rM   rP   )r6   r'   r7   highlighterZget_relative_urir<   r   r   sortedr   len	verbosityr?   r:   Zhighlight_languageZhighlight_block
splitlinessplitr   minrsplitappendreversejoinr9   pop)r   r'   rR   Zuritomodnamesr   r%   r   r!   r&   r$   rA   ZlexerZhighlightedlinesZbeforeZafterZmaxindexr8   r#   typestartendZbacklinkrO   parentcontextr-   stackr   r   r   collect_pages   s    




rf   c             C   s   |j d k	rtjdtdd d S )Nzbviewcode_import was renamed to viewcode_follow_imported_members. Please update your configuration.   )
stacklevel)viewcode_importwarningswarnr   )r   r:   r   r   r   migrate_viewcode_import   s    
rl   c             C   s|   |  dd d |  ddd |  ddd | dt | dt | dt | d	t | d
 | d tjdddS )Nri   Fr;   r=   Tzdoctree-readzenv-merge-infozhtml-collect-pageszmissing-referencezviewcode-find-sourcezviewcode-follow-importedrJ   )versionZenv_versionZparallel_read_safe)	Zadd_config_valueZconnectrB   rE   rf   rF   Z	add_eventsphinxZ__display_version__)r   r   r   r   setup  s    

ro   ) __doc__r   rj   Zdocutilsr   Zsixr   r   rn   r   Zsphinx.deprecationr   Zsphinx.localer   Zsphinx.pycoder   Zsphinx.utilr	   r
   r   Zsphinx.util.nodesr   Z	getLogger__name__r   r   rB   rE   rF   rf   rl   ro   r   r   r   r   <module>
   s&   	
Nb