B
    \<                 @   s~   d 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mZ eeZG d	d
 d
eZdS )z
    sphinx.environment.adapters.toctree
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Toctree adapter for sphinx.environment.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    )nodes)	iteritems)addnodes)__)url_relogging)Matcher)clean_astextprocess_only_nodesc               @   sH   e Zd Zdd Zdd Zddd	Zd
d ZdddZdd Zdd Z	dS )TocTreec             C   s
   || _ d S )N)env)selfr    r   Blib/python3.7/site-packages/sphinx/environment/adapters/toctree.py__init__   s    zTocTree.__init__c             C   sv   |d r| j j| |dr.| j j| |d }x$|D ]}| j j|t | q<W | j j|g 	| dS )zmNote a TOC tree directive in a document and gather information about
        file relations from it.
        ZglobZnumberedincludefilesN)
r   Zglob_toctreesaddgetZnumbered_toctreesZfiles_to_rebuild
setdefaultsettoctree_includesextend)r   docnametoctreenoder   Zincludefiler   r   r   note#   s    

zTocTree.noteTr   Fc	          
      s  | ddrsdS 
tjjjfddd 	
f	dd	 |pf| dd	}	s|| d
dr|d	s| ddrd |g dd}	|	sdS tdd}
|j d}|rt	j
|dft	|g }|j|_|j|_|d |_t|dr|j|_|`|
|7 }
|
|	 d|
d< |
d |
drH|pJd t|
d	 dkrfdS xB|
t	jD ]2}t|d st|d |d  |d< qtW |
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.
        hiddenFNc                s   x| 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|}x|r|d d |j	}qW |j	j	
drdS x|rd	|d< |j	}qW qW dS )
z7Add 'toctree-l%d' and 'current' classes to the toctree.classesztoctree-l%d   refuri
anchornameZcurrent	iscurrentNT)children
isinstancer   compact_paragraphr   	list_itemappendbullet_list	referenceparentr   )nodedepthsubnodeZ
branchnode)_toctree_add_classesr   r   r   r,   Y   s&    

z-TocTree.resolve.<locals>._toctree_add_classesc          	      sn  dd | d D }g }x.|D ]$\}}yd}t |r|dkrF|}tjdt|gd|dd}	tdd|	}
td|
}td|}nZ|dk r| d	 }|st	j
j| }tjdt|gd
|dd}	tdd|	}
td|
}td|}n||kr&tjtd|d||d w|}j
j|  }j
j| dd}|kshrx|dkrx|d| t|j |r|jrt|jdkr|jd }x<|tjD ],}|d |kr|d st|g|_qW |jstjtd|| d W nL tk
rT   j
|dr8td}ntd}tj||| d Y qX rxJ|D ]B}t|dkrb|tj}|r||d dd< n
|d qbW x||tjD ]l}|ddrΈr|j|d }x4 ||g| d
dD ]}|j || |d7 }qW |j!| qW |r8|"| q|#|j qW |sj|sjt }||7 }|gS |S )z&Return TOC entries for a toctree node.c             S   s   g | ]}|d  |d fqS )r   r   r   ).0er   r   r   
<listcomp>{   s    zBTocTree.resolve.<locals>._entries_from_toctree.<locals>.<listcomp>entriesN F)Zinternalr   r   r   r(   Tz8circular toctree references detected, ignoring: %s <- %sz <- )locationtocdepthr      r   r   r   z^toctree contains reference to document %r that doesn't have a title: no link will be generatedz2toctree contains reference to excluded document %rz5toctree contains reference to nonexisting document %rr   )subtree)r1   r1   )r1   r1   )$r   matchr   r'   Textr   r#   r$   r&   r	   r   ZtitlesloggerZwarningr   jointocsdeepcopymetadatar   _toctree_pruner
   tagsr!   lentraverseKeyErrorZdoc2pathtoctreepopr(   indexinsertremover%   r   )r   parentsseparater5   Zrefsr0   titlerefZrefdocr'   ZparaitemtocmaxdepthchildrefnodemessageZtoplevelZsubtreesZ
subtocnodeiZret)	_entries_from_toctreebuildercollapseexcludedincludehiddenpruner   titles_onlytoctree_ancestorsr   r   rR   x   s    










z.TocTree.resolve.<locals>._entries_from_toctreerM   Z
titlesonlyTrV   )rH   r1   captionZ
rawcaptionuidrB   r   r   r   r   )FF)r   get_toctree_ancestorsr   r   configZexclude_patternsr   r#   Z
attributesr   r[   r7   linesourceZ	rawsourcehasattrr\   r   r=   r?   r@   r'   r   r6   Zget_relative_uri)r   r   rS   rB   rW   rM   rX   rT   rV   Z
tocentriesZnewnoder[   Zcaption_noderO   r   )rR   r,   rS   rT   r   rU   rV   rW   r   rX   rY   r   resolve3   sH    
b


zTocTree.resolvec             C   sh   i }x.t | jjD ]\}}x|D ]}|||< q W qW g }|}x&||krb||krb|| || }q>W |S )N)r   r   r   r%   )r   r   r(   pr!   rN   Z	ancestorsdr   r   r   r]     s    

zTocTree.get_toctree_ancestorsc             C   s   x|j dd D ]}t|tjtjfr8| |||| qt|tjr|dkrd||krd|j	|g  q|r|dkrd|jkr|j
| q| ||d || qW dS )z(Utility: Cut a TOC at a specified depth.Nr   r   r    )r!   r"   r   r#   r   r$   r=   r&   r(   replacerF   )r   r)   r*   rM   rT   r+   r   r   r   r=     s    

zTocTree._toctree_prunec             C   s   | j j| dd}y"| j j|  }| |d| W n tk
rN   t S X t	||j
 x$|tjD ]}|d pxd|d< qjW |S )z7Return a TOC nodetree -- for use on the same page only!r3   r   r4   r   #r   )r   r<   r   r:   r;   r=   rA   r   Z	paragraphr
   r>   r@   r'   )r   r   rS   r3   rL   r)   r   r   r   get_toc_for(  s    
zTocTree.get_toc_forc       
      K   s   | j | j jj}g }d|kr&d|d< d|kr6d|d< ||d< x<|tjD ],}| j|||fddi|}|rL|| qLW |sdS |d }	x |dd D ]}|		|j
 qW |	S )	zReturn the global TOC nodetree.rV   TrM   r   rT   rW   Nr   )r   Zget_doctreer^   Z
master_docr@   r   rB   rb   r%   r   r!   )
r   r   rS   rT   kwdsZdoctreeZtoctreesr   rB   resultr   r   r   get_toctree_for8  s"    zTocTree.get_toctree_forN)Tr   FFF)F)
__name__
__module____qualname__r   r   rb   r]   r=   rg   rj   r   r   r   r   r      s    
 R
r   N)__doc__Zdocutilsr   Zsixr   Zsphinxr   Zsphinx.localer   Zsphinx.utilr   r   Zsphinx.util.matchingr   Zsphinx.util.nodesr	   r
   Z	getLoggerrk   r8   objectr   r   r   r   r   <module>
   s   
