B
    .ÛKcQ  ã               @   sÆ  d 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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mZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( e )e*¡Z+G dd„ dej,ej
ƒZ-G dd„ dej.ej
ƒZ/G dd„ dee!ƒZ0G dd„ deƒZ1G dd„ de!ƒZ2G dd„ dƒZ3e&e-ddœd d!„Z4e&e-ddœd"d#„Z5e(e-ddœd$d%„Z6e(e-ddœd&d'„Z7eee8ef d(œd)d*„Z9dS )+zñAllow todos to be inserted into your documentation.

Inclusion of todos can be switched of by a configuration variable.
The todolist directive collects all todos of your project and lists them along
with a backlink to the original location.
é    )ÚAnyÚDictÚListÚTupleÚcast)Únodes)ÚElementÚNode)Ú
directives)ÚBaseAdmonitionN)Úaddnodes)ÚSphinx)ÚDomain)ÚBuildEnvironment)ÚNoUri)Ú_Ú__)ÚloggingÚ	texescape)ÚSphinxDirectiveÚnew_document)Ú
OptionSpec)ÚHTMLTranslator)ÚLaTeXTranslatorc               @   s   e Zd ZdS )Ú	todo_nodeN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú.lib/python3.7/site-packages/sphinx/ext/todo.pyr      s   r   c               @   s   e Zd ZdS )ÚtodolistN)r   r   r   r   r   r   r   r    #   s   r    c                   sV   e Zd ZU dZeZdZdZdZdZ	e
je
jdœZeed< ee dœ‡ fdd	„Z‡  ZS )
ÚTodozO
    A todo entry, displayed (if configured) in the form of an admonition.
    Tr   F)ÚclassÚnameÚoption_spec)Úreturnc                s”   | j  d¡sdg| j d< tƒ  ¡ \}t|tjƒr6|gS t|tƒrŒ| dtj	t
dƒd¡ | jj|d< |  |¡ |  |¡ | jj |¡ |gS t‚d S )Nr"   zadmonition-todor   r!   )ÚtextÚdocname)ÚoptionsÚgetÚsuperÚrunÚ
isinstancer   Zsystem_messager   ÚinsertÚtitler   Úenvr'   Zadd_nameZset_source_infoÚstateÚdocumentZnote_explicit_targetÚRuntimeError)ÚselfÚtodo)Ú	__class__r   r   r+   6   s    


zTodo.run)r   r   r   Ú__doc__r   Z
node_classÚhas_contentÚrequired_argumentsÚoptional_argumentsÚfinal_argument_whitespacer
   Zclass_optionZ	unchangedr$   r   Ú__annotations__r   r	   r+   Ú__classcell__r   r   )r5   r   r!   '   s   
r!   c               @   sn   e Zd ZdZdZeeeee	 f dœdd„ƒZ
eddœdd„Zee edd	œd
d„Zeeejddœdd„ZdS )Ú
TodoDomainr4   )r%   c             C   s   | j  di ¡S )NÚtodos)ÚdataÚ
setdefault)r3   r   r   r   r>   L   s    zTodoDomain.todosN)r'   r%   c             C   s   | j  |d ¡ d S )N)r>   Úpop)r3   r'   r   r   r   Ú	clear_docP   s    zTodoDomain.clear_doc)ÚdocnamesÚ	otherdatar%   c             C   s$   x|D ]}|d | | j |< qW d S )Nr>   )r>   )r3   rC   rD   r'   r   r   r   Úmerge_domaindataS   s    
zTodoDomain.merge_domaindata)r/   r'   r1   r%   c             C   sb   | j  |g ¡}xN| t¡D ]@}|j d|¡ | |¡ |jjrt	j
tdƒ|d  ¡ |d qW d S )Nztodo-definedzTODO entry found: %sé   )Úlocation)r>   r@   Úfindallr   ÚappÚemitÚappendÚconfigÚtodo_emit_warningsÚloggerZwarningr   Úastext)r3   r/   r'   r1   r>   r4   r   r   r   Úprocess_docW   s    
zTodoDomain.process_doc)r   r   r   r#   ZlabelÚpropertyr   Ústrr   r   r>   rB   rE   r   r   r1   rP   r   r   r   r   r=   H   s   r=   c               @   s@   e Zd ZU dZdZdZdZdZi Ze	e
d< ee dœdd„ZdS )	ÚTodoListz%
    A list of all todo entries.
    Fr   r$   )r%   c             C   s
   t dƒgS )NÚ )r    )r3   r   r   r   r+   n   s    zTodoList.runN)r   r   r   r6   r7   r8   r9   r:   r$   r   r;   r   r	   r+   r   r   r   r   rS   c   s   
rS   c               @   s\   e Zd Zeejeddœdd„Zejeddœdd„Ze	eej
dœd	d
„Ze	eddœdd„ZdS )ÚTodoListProcessorN)rI   Údoctreer'   r%   c             C   sF   |j | _ |j| _|j| _tt|j d¡ƒ| _tdƒ| _|  	||¡ d S )Nr4   rT   )
ÚbuilderrL   r/   r   r=   Z
get_domainÚdomainr   r1   Úprocess)r3   rI   rV   r'   r   r   r   Ú__init__u   s    
zTodoListProcessor.__init__)rV   r'   r%   c       	      C   s¶   t | jj ¡ g ƒ}xžt| t¡ƒD ]Œ}| jjs<|j	 
|¡ q"| d¡rRt ¡ g}ng }xL|D ]D}| ¡ }|d  ¡  |  ||¡ | |¡ |  ||¡}| |¡ q\W | |¡ q"W d S )NÚids)ÚsumrX   r>   ÚvaluesÚlistrH   r    rL   Útodo_include_todosÚparentÚremover)   r   ÚtargetÚdeepcopyÚclearÚresolve_referencerK   Úcreate_todo_referenceZreplace_self)	r3   rV   r'   r>   ÚnodeZcontentr4   Znew_todoZtodo_refr   r   r   rY   ~   s     


zTodoListProcessor.process)r4   r'   r%   c       	      C   sö   | j jrtdƒ}ntdƒ|j|jf }|d | d¡… }|| d¡d d … }tjdgd}|t |¡7 }t 	tdƒtdƒ¡}tj
d	d	|d
d}y6| j ||d ¡|d< |d  d|d d  7  < W n tk
rÚ   Y nX ||7 }|t |¡7 }|S )Nz<<original entry>>z3(The <<original entry>> is located in %s, line %d.)z<<z>>é   ztodo-source)Úclasseszoriginal entryrT   T)Zinternalr'   Zrefuriú#r[   r   )rL   Útodo_link_onlyr   ÚsourceÚlineÚfindr   Ú	paragraphZTextZemphasisÚ	referencerW   Zget_relative_urir   )	r3   r4   r'   ÚdescriptionÚprefixÚsuffixZparaZlinktextrp   r   r   r   rf   —   s$    
 z'TodoListProcessor.create_todo_referencec             C   sX   x$|  tj¡D ]}d|kr||d< qW |  j|7  _| j | j|| j¡ | j |¡ dS )z'Resolve references in the todo content.ZrefdocN)rH   r   Zpending_xrefr1   r/   Zresolve_referencesrW   ra   )r3   r4   r'   rg   r   r   r   re   ³   s    z#TodoListProcessor.resolve_reference)r   r   r   r   r   r1   rR   rZ   rY   r   ro   rf   re   r   r   r   r   rU   t   s   	rU   )r3   rg   r%   c             C   s   | j jr|  |¡ ntj‚d S )N)rL   r_   Zvisit_admonitionr   ÚSkipNode)r3   rg   r   r   r   Úvisit_todo_node¿   s    ru   c             C   s   |   |¡ d S )N)Zdepart_admonition)r3   rg   r   r   r   Údepart_todo_nodeÆ   s    rv   c             C   sp   | j jrf| j d¡ | j |  |¡¡ ttj|d ƒ}t 	| 
¡ | j j¡}| j d| ¡ | d¡ ntj‚d S )Nz 
\begin{sphinxadmonition}{note}{r   z%s:})rL   r_   ÚbodyrK   Zhypertarget_tor   r   r.   r   ÚescaperO   Zlatex_enginerA   rt   )r3   rg   Z
title_noder.   r   r   r   Úlatex_visit_todo_nodeÊ   s    ry   c             C   s   | j  d¡ d S )Nz\end{sphinxadmonition}
)rw   rK   )r3   rg   r   r   r   Úlatex_depart_todo_node×   s    rz   )rI   r%   c             C   s¤   |   d¡ |  ddd¡ |  ddd¡ |  ddd¡ |  t¡ | jtttfttfttfttfttfd |  	dt
¡ |  	d	t¡ |  t¡ |  d
t¡ tjdddœS )Nztodo-definedr_   FÚhtmlrk   rM   )r{   Zlatexr&   ZmanZtexinfor4   r    zdoctree-resolvedrh   T)ÚversionZenv_versionZparallel_read_safe)Z	add_eventZadd_config_valueZadd_noder    r   ru   rv   ry   rz   Zadd_directiver!   rS   Z
add_domainr=   ZconnectrU   ÚsphinxZ__display_version__)rI   r   r   r   ÚsetupÛ   s$    


r~   ):r6   Útypingr   r   r   r   r   Zdocutilsr   Zdocutils.nodesr   r	   Zdocutils.parsers.rstr
   Z+docutils.parsers.rst.directives.admonitionsr   r}   r   Zsphinx.applicationr   Zsphinx.domainsr   Zsphinx.environmentr   Zsphinx.errorsr   Zsphinx.localer   r   Zsphinx.utilr   r   Zsphinx.util.docutilsr   r   Zsphinx.util.typingr   Zsphinx.writers.htmlr   Zsphinx.writers.latexr   Z	getLoggerr   rN   Z
Admonitionr   ZGeneralr    r!   r=   rS   rU   ru   rv   ry   rz   rR   r~   r   r   r   r   Ú<module>   s:   
!K