o
    Ni6                     @  s  d Z ddlmZ ddlZddlZddl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 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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% erddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 e1e2Z3dZ4G dd deZ5dCdd Z6dDd$d%Z7dEd+d,Z8dFd2d3Z9dGd5d6Z:G d7d8 d8eZ;dHd9d:Z<dId;d<Z=dJd>d?Z>dKdAdBZ?dS )Lz7Add links to module code in Python object descriptions.    )annotationsN)import_module)path)TYPE_CHECKINGAnycast)nodes)ElementNode)addnodes)StandaloneHTMLBuilder)___)ModuleAnalyzer)SphinxPostTransform)logging)status_iterator)make_refnode)_last_modified_time)IterableIterator)Sphinx)Builder)BuildEnvironment)ExtensionMetadata_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!   G/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/ext/viewcode.pyr   (   s    r   modnamestr	attributereturn
str | Nonec              
   C  s   z#| d u rW d S t | }|}|dD ]	}|rt||}qt|dd W S  ty4   td||  Y d S  tyV } ztt 	  td| | W Y d }~d S d }~ww )N.r   zDidn't find %s in %sz0viewcode can't import %s, failed with error "%s")
r   splitgetattrAttributeErrorloggerverbose	Exception	traceback
format_excrstrip)r#   r%   modulevalueattrer!   r!   r"   _get_full_modname1   s&   
r6   builderr   boolc                 C  s4   | j dkrdS | jdkrdS | jdo| jj  S )NhtmlF
singlehtmlepub)formatname
startswithconfigviewcode_enable_epub)r7   r!   r!   r"   is_supported_builderP   s
   

rA   appr   doctreer
   Nonec              	     s   j jtdsi _d fd	d
}t|tjD ]h}|ddkr&qt	 }|D ]X}t
|tjs4q+|d}|d}|}jjrT d||}	|	sRt||}	|	}|sWq+|d}|||j|seq+||v rjq+|| tt|dd}
|t|
|jd7 }q+qd S )N_viewcode_modulesr#   r$   fullnamedocnamerefnamer&   r8   c                   s   j | d }|du rdS  d| }|d u r9zt| }|  W n ty1   dj | < Y dS w |j}|j}n|\}}|d u sG|d |krR||i |f}|j | < |\}	}}
}	||v rb||
|< dS dS )NFviewcode-find-sourcer   T)	rE   getemit_firstresultr   
for_module	find_tagsr.   codetags)r#   rF   rG   rH   entry	code_tagsanalyzerrN   rO   r   usedrB   envr!   r"   has_tag]   s.   


zdoctree_read.<locals>.has_tagdomainpyr2   viewcode-follow-importedr(   /)	reftargetrefidrefdoc)
r#   r$   rF   r$   rG   r$   rH   r$   r&   r8   )r7   rU   hasattrrE   listfindallr   descrJ   set
isinstancedesc_signaturer?    viewcode_follow_imported_membersrK   r6   rG   add	posixpathjoinOUTPUT_DIRNAMEreplacer   )rB   rC   rV   objnodenamessignoder#   rF   rH   new_modnamepagenamer!   rT   r"   doctree_readX   sB   





rp   rU   r   docnamesIterable[str]otherc           	      C  s   t |dsd S t |dsi |_|j D ].\}}||jvr#||j|< q|j| rB|j| d }|d  D ]\}}||vrA|||< q5qd S )NrE      )r^   rE   items)	rB   rU   rq   rs   r#   rP   rS   rF   rG   r!   r!   r"   env_merge_info   s   



rv   rG   c                 C  sv   t |di }t| D ],\}}|du rq|\}}}}	t|D ]}
||
 |kr,||
 qt|dkr8|| qd S )NrE   Fr   )r*   r_   ru   poplen)rB   rU   rG   modulesr#   rP   rN   rO   rS   rH   rF   r!   r!   r"   env_purge_doc   s   

rz   c                   @  s2   e Zd ZdZdZdddZdd	d
ZdddZdS )ViewcodeAnchorTransformz;Convert or remove viewcode_anchor nodes depends on builder.d   kwargsr   r&   rD   c                 K  s$   t | jjr|   d S |   d S N)rA   rB   r7   convert_viewcode_anchorsremove_viewcode_anchors)selfr}   r!   r!   r"   run   s   zViewcodeAnchorTransform.runc                 C  sV   | j tD ]"}tjdtddgd}t| jj|d |d |d |}|	| qd S )N z[source]zviewcode-link)classesr]   r[   r\   )
documentr`   r   r   inliner   r   rB   r7   replace_self)r   nodeanchorrefnoder!   r!   r"   r      s   z0ViewcodeAnchorTransform.convert_viewcode_anchorsc                 C  s&   t | jtD ]}|j| qd S r~   )r_   r   r`   r   parentremove)r   r   r!   r!   r"   r      s   z/ViewcodeAnchorTransform.remove_viewcode_anchorsN)r}   r   r&   rD   )r&   rD   )r   r   r   r    default_priorityr   r   r   r!   r!   r!   r"   r{      s    

r{   c                 C  s>   |  d|}|r
dS z
t|\}}|W S  ty   Y dS w )z"Get module filename for *modname*.rI   N)rK   r   get_module_sourcer.   )rB   r#   source_infofilenamesourcer!   r!   r"   get_module_filename   s   r   c                 C  sv   t | |}|du rdS tt| j}|dd|j }t| jd|}zt	|t	|kr.W dS W dS  t
y:   Y dS w )z*Check generation of module page is needed.NTr(   rZ   z	_modules/F)r   r   r   r7   rj   
out_suffixr   rh   outdirr   OSError)rB   r#   module_filenamer7   basenamepage_filenamer!   r!   r"   should_generate_module_page   s   
r   )Iterator[tuple[str, dict[str, Any], str]]c                  c  s\   | j j}t|dsd S t| j sd S | j j}| j j}t|j}tt	|j
 tddt|j| jtdD ]\}}|s>q7t| |sDq7|\}}}	}
tt|dd}|jjdv r_|jj}nd}d	|jj }|j|||d
}| }|d d\}}|d |g|dd< t|d }td}|	
 D ]5\}}|| \}}}|||d |
 d | }d| d| d| d||  ||< |t||  d7  < qg }|}d|v r|ddd }||v r|||tt|dd|d d|v s|||ttdtdd |  ||td| d| d}||dfV  q7|s%d S dg}dg}t	|D ]Y}| |d rF||d  |d n$|!  | |d sc|!  |d | |d rR||d  |ttdtt|dd}|d| d| d  q/|dt|d   td!td"d| d#}ttd|dfV  d S )$NrE   zhighlighting module code... bluer   r(   rZ   >   nonedefaultpythonr   )linenosz<pre>   z[docs]#z <div class="viewcode-block" id="z"">
<a class="viewcode-back" href="z">z</a>
z</div>
)linktitleindexzModule codez<h1>Source code for %s</h1>
)parentsr   bodyz	page.htmlr   z<ul>z</ul>z<li><a href="z
</a></li>
zOverview: module codez0<h1>All modules for which code is available</h1>)r   r   )"r7   rU   r^   rA   highlighterget_relative_urirb   rE   r   sortedru   r   rx   	verbosityoperator
itemgetterr   rg   rh   ri   rj   r?   highlight_languageviewcode_line_numbershighlight_block
splitlinesr)   r   minrsplitappendreverser>   rw   ) rB   rU   r   uritomodnamesr#   rP   rN   rO   rS   rH   ro   lexerr   highlightedlinesbeforeafter	max_index	link_textr=   rG   typestartendbacklinkr   r   contextr9   stackrelative_urir!   r!   r"   collect_pages   s   






r   r   c                 C  s   |  dd d |  ddd |  ddd |  dddt | d	t | d
t | dt | dt | d | d | t	 t
jdddS )Nviewcode_importr   r@   Fre   Tr   rU   zdoctree-readzenv-merge-infozenv-purge-doczhtml-collect-pagesrI   rY   r   )versionenv_versionparallel_read_safe)add_config_valuer8   connectrp   rv   rz   r   	add_eventadd_post_transformr{   sphinx__display_version__)rB   r!   r!   r"   setupY  s   


r   )r#   r$   r%   r$   r&   r'   )r7   r   r&   r8   )rB   r   rC   r
   r&   rD   )
rB   r   rU   r   rq   rr   rs   r   r&   rD   )rB   r   rU   r   rG   r$   r&   rD   )rB   r   r#   r$   r&   r'   )rB   r   r#   r$   r&   r8   )rB   r   r&   r   )rB   r   r&   r   )@r    
__future__r   r   rg   r/   	importlibr   osr   typingr   r   r   docutilsr   docutils.nodesr	   r
   r   r   sphinx.builders.htmlr   sphinx.localer   r   sphinx.pycoder   !sphinx.transforms.post_transformsr   sphinx.utilr   sphinx.util.displayr   sphinx.util.nodesr   sphinx.util.osutilr   collections.abcr   r   sphinx.applicationr   sphinx.buildersr   sphinx.environmentr   sphinx.util.typingr   	getLoggerr   r,   ri   r   r6   rA   rp   rv   rz   r{   r   r   r   r   r!   r!   r!   r"   <module>   sN    

	


@



e