U
    \ªShQ  ã                   @  s¾  d 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
 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 ƒZ/G dd„ deƒZ0G dd„ de ƒZ1G dd„ dƒZ2d dd!d"œd#d$„Z3d dd!d"œd%d&„Z4d'dd!d"œd(d)„Z5d'dd!d"œd*d+„Z6d,d-d.œd/d0„Z7dS )1zñ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.
é    )Úannotations)ÚAnyÚcast)Únodes)ÚElementÚNode)Ú
directives)ÚBaseAdmonitionN)Úaddnodes)ÚSphinx)ÚDomain)ÚBuildEnvironment)ÚNoUri)Ú_Ú__)ÚloggingÚ	texescape)ÚSphinxDirectiveÚnew_document)Ú
OptionSpec)ÚHTML5Translator)ÚLaTeXTranslatorc                   @  s   e Zd ZdS )Ú	todo_nodeN©Ú__name__Ú
__module__Ú__qualname__© r   r   úB/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/ext/todo.pyr   !   s   r   c                   @  s   e Zd ZdS )ÚtodolistNr   r   r   r   r   r   %   s   r   c                      sR   e Zd ZU dZeZdZdZdZdZ	e
je
jdœZded< dd	œ‡ fd
d„Z‡  ZS )ÚTodozO
    A todo entry, displayed (if configured) in the form of an admonition.
    Tr   F)ÚclassÚnamer   Úoption_specú
list[Node]©Ú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,   8   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#   Ú__annotations__r,   Ú__classcell__r   r   r6   r   r    )   s   
þr    c                   @  s\   e Zd ZdZdZeddœdd„ƒZdddœd	d
„Zddddœdd„Zdddddœdd„Z	dS )Ú
TodoDomainr5   zdict[str, list[todo_node]]r%   c                 C  s   | j  di ¡S ©NÚtodos)ÚdataÚ
setdefault©r4   r   r   r   rA   N   s    zTodoDomain.todosÚstrÚNone)r(   r&   c                 C  s   | j  |d ¡ d S ©N)rA   Úpop)r4   r(   r   r   r   Ú	clear_docR   s    zTodoDomain.clear_docz	list[str]Údict)ÚdocnamesÚ	otherdatar&   c                 C  s    |D ]}|d | | j |< qd S r@   )rA   )r4   rK   rL   r(   r   r   r   Úmerge_domaindataU   s    zTodoDomain.merge_domaindatar   únodes.document)r0   r(   r2   r&   c                 C  s^   | j  |g ¡}| t¡D ]@}|j d|¡ | |¡ |jjrt	j
tdƒ|d  ¡ |d qd S )Nútodo-definedzTODO entry found: %sé   )Úlocation)rA   rC   Úfindallr   ÚappÚemitÚappendÚconfigÚtodo_emit_warningsÚloggerÚwarningr   Úastext)r4   r0   r(   r2   rA   r5   r   r   r   Úprocess_docY   s    
ÿzTodoDomain.process_docN)
r   r   r   r"   ÚlabelÚpropertyrA   rI   rM   r[   r   r   r   r   r?   J   s   r?   c                   @  s<   e Zd ZU dZdZdZdZdZi Zde	d< ddœdd	„Z
d
S )ÚTodoListz%
    A list of all todo entries.
    Fr   r   r#   r$   r%   c                 C  s
   t dƒgS )NÚ )r   rD   r   r   r   r,   p   s    zTodoList.runN)r   r   r   r8   r9   r:   r;   r<   r#   r=   r,   r   r   r   r   r^   e   s   
r^   c                   @  sV   e Zd Zdddddœdd„Zddddœd	d
„Zddddœdd„Zddddœdd„ZdS )ÚTodoListProcessorr   rN   rE   rF   )rS   Údoctreer(   r&   c                 C  sF   |j | _ |j| _|j| _tt|j d¡ƒ| _tdƒ| _|  	||¡ d S )Nr5   r_   )
ÚbuilderrV   r0   r   r?   Z
get_domainÚdomainr   r2   Úprocess)r4   rS   ra   r(   r   r   r   Ú__init__w   s    
zTodoListProcessor.__init__)ra   r(   r&   c           	      C  s®   t | jj ¡ g ƒ}t| t¡ƒD ]ˆ}| jjs:|j	 
|¡ q | d¡rPt ¡ g}ng }|D ]D}| ¡ }|d  ¡  |  ||¡ | |¡ |  ||¡}| |¡ qX| |¡ q d S )NÚids)Úsumrc   rA   ÚvaluesÚlistrR   r   rV   Útodo_include_todosÚparentÚremover*   r   ÚtargetÚdeepcopyÚclearÚresolve_referencerU   Úcreate_todo_referenceZreplace_self)	r4   ra   r(   rA   ÚnodeÚcontentr5   Znew_todoZtodo_refr   r   r   rd   €   s     

zTodoListProcessor.processr   znodes.paragraph)r5   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}z6| 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 entryr_   T)Zinternalr(   Zrefuriú#rf   r   )rV   Útodo_link_onlyr   ÚsourceÚlineÚfindr   Z	paragraphÚTextZemphasisÚ	referencerb   Zget_relative_urir   )	r4   r5   r(   ÚdescriptionÚprefixÚsuffixÚparaZlinktextr|   r   r   r   rq   ™   s&    

ÿ z'TodoListProcessor.create_todo_referencec                 C  sT   |  tj¡D ]}d|kr||d< q|  j|7  _| j | j|| j¡ | j |¡ dS )z'Resolve references in the todo content.ZrefdocN)rR   r
   Zpending_xrefr2   r0   Zresolve_referencesrb   rl   )r4   r5   r(   rr   r   r   r   rp   µ   s    
z#TodoListProcessor.resolve_referenceN)r   r   r   re   rd   rq   rp   r   r   r   r   r`   v   s   	r`   r   rF   )r4   rr   r&   c                 C  s   | j jr|  |¡ ntj‚d S rG   )rV   rj   Zvisit_admonitionr   ÚSkipNode©r4   rr   r   r   r   Úvisit_todo_nodeÁ   s    rƒ   c                 C  s   |   |¡ d S rG   )Zdepart_admonitionr‚   r   r   r   Údepart_todo_nodeÈ   s    r„   r   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:})rV   rj   ÚbodyrU   Zhypertarget_tor   r   r/   r   ÚescaperZ   Zlatex_enginerH   r   )r4   rr   Z
title_noder/   r   r   r   Úlatex_visit_todo_nodeÌ   s    r‡   c                 C  s   | j  d¡ d S )Nz\end{sphinxadmonition}
)r…   rU   r‚   r   r   r   Úlatex_depart_todo_nodeÙ   s    rˆ   r   zdict[str, Any])rS   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 )NrO   rj   FÚhtmlrw   rW   )r‰   Úlatexr'   ÚmanZtexinfor5   r   zdoctree-resolvedrt   T)ÚversionZenv_versionZparallel_read_safe)Z	add_eventZadd_config_valueÚadd_noder   r   rƒ   r„   r‡   rˆ   Zadd_directiver    r^   Z
add_domainr?   Úconnectr`   ÚsphinxZ__display_version__)rS   r   r   r   ÚsetupÝ   s(    

û
ýr   )8r8   Ú
__future__r   Útypingr   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   Ú	getLoggerr   rX   Z
Admonitionr   ZGeneralr   r    r?   r^   r`   rƒ   r„   r‡   rˆ   r   r   r   r   r   Ú<module>   s<   
!K