B
    dQ                 @   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 )+zAllow 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   \/work/yifan.wang/ringdown/master-ringdown-env/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loggerwarningr   astext)r3   r/   r'   r1   r>   r4   r   r   r   process_docW   s    
zTodoDomain.process_doc)r   r   r   r#   labelpropertyr   strr   r   r>   rB   rE   r   r   r1   rQ   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   rU   c   s   
rU   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   rV   )
builderrL   r/   r   r=   Z
get_domaindomainr   r1   process)r3   rI   rX   r'   r   r   r   __init__u   s    
zTodoListProcessor.__init__)rX   r'   r%   c       	      C   s   t | jj g }xt|tD ]}| jjs<|j	
| q"|drRt g}ng }xL|D ]D}| }|d   | || || | ||}|| q\W || q"W d S )Nids)sumrZ   r>   valueslistrH   r    rL   todo_include_todosparentremover)   r   targetdeepcopyclearresolve_referencerK   create_todo_referenceZreplace_self)	r3   rX   r'   r>   nodecontentr4   Znew_todoZtodo_refr   r   r   r[   ~   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 entryrV   T)Zinternalr'   Zrefuri#r]   r   )rL   todo_link_onlyr   sourcelinefindr   	paragraphTextZemphasis	referencerY   Zget_relative_urir   )	r3   r4   r'   descriptionprefixsuffixparaZlinktextrt   r   r   r   rh      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_referencesrY   rc   )r3   r4   r'   ri   r   r   r   rg      s    z#TodoListProcessor.resolve_reference)r   r   r   r   r   r1   rT   r\   r[   r   rr   rh   rg   r   r   r   r   rW   t   s   	rW   )r3   ri   r%   c             C   s   | j jr| | ntjd S )N)rL   ra   Zvisit_admonitionr   SkipNode)r3   ri   r   r   r   visit_todo_node   s    rz   c             C   s   |  | d S )N)Zdepart_admonition)r3   ri   r   r   r   depart_todo_node   s    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:})rL   ra   bodyrK   Zhypertarget_tor   r   r.   r   escaperP   Zlatex_enginerA   ry   )r3   ri   Z
title_noder.   r   r   r   latex_visit_todo_node   s    r~   c             C   s   | j d d S )Nz\end{sphinxadmonition}
)r|   rK   )r3   ri   r   r   r   latex_depart_todo_node   s    r   )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-definedra   Fhtmlrn   rM   )r   latexr&   manZtexinfor4   r    zdoctree-resolvedrk   T)versionZenv_versionZparallel_read_safe)Z	add_eventZadd_config_valueadd_noder    r   rz   r{   r~   r   Zadd_directiver!   rU   Z
add_domainr=   connectrW   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   	getLoggerr   rN   Z
Admonitionr   ZGeneralr    r!   r=   rU   rW   rz   r{   r~   r   rT   r   r   r   r   r   <module>   s:   
!K