U
    \ShG@                     @  s   d Z ddlmZ ddl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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 erddlmZ ddlmZ eeZ G dd dZ!dS )z'Toctree adapter for sphinx.environment.    )annotations)TYPE_CHECKINGAnyIterableTypeVarcast)nodes)ElementNode)addnodes)__)loggingurl_re)Matcher)clean_astextprocess_only_nodes)Builder)BuildEnvironmentc                   @  s   e Zd ZdddddZddddd	d
Zd'dddddddddd	ddZdddddZededZ	ddddddddZ
ddddd d!Zdddd"dd#d$d%Zd&S )(TocTreer   None)envreturnc                 C  s
   || _ d S N)r   )selfr    r   V/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/environment/adapters/toctree.py__init__   s    zTocTree.__init__straddnodes.toctree)docnametoctreenoder   c                 C  sr   |d r| j j| |dr.| j j| |d }|D ]}| j j|t | q:| j j|g 	| dS )zmNote a TOC tree directive in a document and gather information about
        file relations from it.
        globZnumberedincludefilesN)
r   Zglob_toctreesaddgetZnumbered_toctreesZfiles_to_rebuild
setdefaultsettoctree_includesextend)r   r   r    r"   Zincludefiler   r   r   note   s    
zTocTree.noteTr   Fr   boolintzElement | None)	r   buildertoctreeprunemaxdepthtitles_onlycollapseincludehiddenr   c	                   s  | ddrsdS 
jjd j 
t
jjjt
jjj	ddddfd	d
d ddddd 	
fdd |p| dd}s| ddrds| ddrd |g }	|	sdS t
dd}
|j d}|rNtj|dft|g }|j|_|j|_|d |_t|drF|j|_|`|
|7 }
|
|	 d|
d< |
d 
|
d	r||nd}
t|
d tjrt|
d dkrdS |
tjD ]2}t|d s|d |d  |d< q|
S )!a   Resolve a *toctree* node into individual bullet lists with titles
        as items, returning None (if no containing titles are found) or
        a new node.

        If *prune* is True, the tree is pruned to *maxdepth*, or if that is 0,
        to the value of the *maxdepth* option on the *toctree* node.
        If *titles_only* is True, only toplevel document titles will be in the
        resulting tree.
        If *collapse* is True, all branches not containing docname will
        be collapsed.
        hiddenFNZstdr	   r+   r   )nodedepthr   c                   s   | j D ]}t|tjtjfr@|d d|d    || qt|tjr\ ||d  qt|tjr|d kr|d s|}|r|d d |j	}q|j	j	
dr dS |rd	|d< |j	}qqdS )
z7Add 'toctree-l%d' and 'current' classes to the toctree.classesz	toctree-l   refuri
anchornamecurrent	iscurrentNT)children
isinstancer   compact_paragraphr   	list_itemappendbullet_list	referenceparentr$   )r4   r5   subnodeZ
branchnode)_toctree_add_classesr   r   r   rE   S   s(    
z-TocTree.resolve.<locals>._toctree_add_classesr   	list[str]r*   zlist[Element])r    parentssubtreer   c              	     s  dd | d D }g }|D ]\}}zDd}t |r|dkrB|}tjdt|gd|dd}tdd|}	td|	}
td|
}n|dk r| d	 }|st	j
j| }tjdt|gd
|dd}tdd|}	td|	}
td|
}nP|krX| \}}|s|}tjd|d
|dd}tdd|}	td|	}
td|
}n||krtjtd|d||ddd W q|}j
j| dd}j
j| }|
ksĈr|dkrֈ|d|}n| }t|j |rL|jrLt|jdkrL|jd }|tjD ],}|d |kr|d st|g|_q|jshtjtd|| d W nj tk
r   j
|drtd}n&j
|dstd}ntd}tj||| d Y qX tttj |}	r8|D ]F}t|dkrt|tj }|r*||d dd< n
|!d qt|tj D ]r}|ddrdsdqHt" ||prdg| d
d|j#$|d dD ]\}}|j#%|| q|j#&| qH|'| q|st }||7 }|gS |S ) z&Return TOC entries for a toctree node.c                 S  s   g | ]}|d  |d fqS )r   r7   r   ).0er   r   r   
<listcomp>t   s     zBTocTree.resolve.<locals>._entries_from_toctree.<locals>.<listcomp>entriesN F)Zinternalr8   r9   r   rC   Tz8circular toctree references detected, ignoring: %s <- %sz <- tocZcircular)locationtypesubtypetocdepthr      r7   r8   r9   z^toctree contains reference to document %r that doesn't have a title: no link will be generated)rO   z2toctree contains reference to excluded document %rz6toctree contains reference to non-included document %rz5toctree contains reference to nonexisting document %rr3   )rH   )start)rM   rM   )rM   rM   )(r   matchr   rB   Textr   r>   r?   rA   r   r   titlesloggerwarningr   joinmetadatar$   tocs_toctree_copydeepcopyr   tagsr<   lenfindallKeyErrorZdoc2pathr   r   r	   listr-   pop	enumeraterC   indexinsertremover(   )r    rG   rH   refsrL   titlerefZrefdocrB   paraitemrN   r   Zsectionnamer/   childrefnodemessager<   toplevelZsubtreesZsub_toc_nodeientryret)_entries_from_toctreer,   r1   excludedgenerated_docnamesincludedr2   r.   r   r0   toctree_ancestorsr   r   ru   q   s    

 



 

   

 


z.TocTree.resolve.<locals>._entries_from_toctreer/   Z
titlesonlyTr2   rM   captionZ
rawcaptionuidr-   r7   r   r8   r9   )F)r$   r   domainsZ_virtual_doc_namescopyget_toctree_ancestorsr   configZinclude_patternsZexclude_patternsr   r>   
attributesr   rj   rV   linesourceZ	rawsourcehasattrr|   r(   r]   r=   r	   r`   ra   rB   r   rU   Zget_relative_uri)r   r   r,   r-   r.   r/   r0   r1   r2   Z
tocentriesZnewnoder{   Zcaption_nodero   r   )ru   rE   r,   r1   r   rv   rw   rx   r2   r.   r   r0   ry   r   resolve+   sV    
 .t



$ zTocTree.resolverF   )r   r   c                 C  s\   i }| j j D ]\}}|D ]}|||< qqg }|}||krX||krX|| || }q4|S r   )r   r'   itemsr@   )r   r   rC   pr<   rn   Z	ancestorsdr   r   r   r     s    

zTocTree.get_toctree_ancestorsET)bound)r4   r5   r/   r1   r   c              	   C  s   |dkp$||ks|dko$| p$d|k}|  }|jD ]h}t|tjtjfrb|| |||| q4t|tj	r|r|| ||d || q4||
  q4|S )z6Utility: Cut and deep-copy a TOC at a specified depth.r7   r   r;   )r~   r<   r=   r   r>   r   r?   r@   r]   rA   r^   )r   r4   r5   r/   r1   Zkeep_bullet_list_sub_nodesr~   rD   r   r   r   r]     s    
zTocTree._toctree_copyr
   )r   r,   r   c                 C  s   | j j| dd}z| | j j| d|d}W n tk
rL   t  Y S X t||j	 |
tjD ]}|d ptd|d< qf|S )z7Return a TOC nodetree -- for use on the same page only!rR   r   rS   Fr9   #r8   )r   r[   r$   r]   r\   rb   r   Z	paragraphr   r_   ra   rB   )r   r   r,   rR   rN   r4   r   r   r   get_toc_for1  s    zTocTree.get_toc_forr   )r   r,   r1   kwargsr   c           
      K  s   | j j}g }d|krd|d< d|ks,|d s6d|d< nt|d |d< ||d< |tjD ],}| j|||fddi|}|rZ|| qZ|sdS |d }	|dd D ]}|	|j	 q|	S )	zReturn the global TOC nodetree.r2   Tr/   r   r1   r.   Nr7   )
r   Zmaster_doctreer+   ra   r   r-   r   r@   r(   r<   )
r   r   r,   r1   r   ZdoctreeZtoctreesr    r-   resultr   r   r   get_toctree_for?  s$    
zTocTree.get_toctree_forN)Tr   FFF)__name__
__module____qualname__r   r)   r   r   r   r	   r   r]   r   r   r   r   r   r   r      s             cr   N)"__doc__
__future__r   typingr   r   r   r   r   Zdocutilsr   Zdocutils.nodesr	   r
   Zsphinxr   Zsphinx.localer   Zsphinx.utilr   r   Zsphinx.util.matchingr   Zsphinx.util.nodesr   r   Zsphinx.buildersr   Zsphinx.environmentr   	getLoggerr   rX   r   r   r   r   r   <module>   s   
