B
    dG                 @   s  d dl Z d dlZd dlmZ d dlmZ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 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" erd dl#m$Z$ e%e&Z'G dd de Z(d"ee) e	e* e	e
e)e*f  ee) dddZ+e ee)ej,dddZ-G dd de Z.G dd dZ/G dd de Z0dee)ef dd d!Z1dS )#    N)unified_diff)TYPE_CHECKINGAnyDictListOptionalTuple)nodes)ElementNode)
directives)
StringList)addnodes)Config)optional_int)__)loggingparselinenos)SphinxDirective)
OptionSpec)Sphinxc               @   sJ   e Zd ZU dZdZdZdZdZej	ej
dZeed< ee ddd	Zd
S )	Highlightzt
    Directive to set the highlighting language for code blocks, as well
    as the threshold for line numbers.
    F   r   )forcelinenothresholdoption_spec)returnc             C   sF   | j d  }| jdtj}d| jk}|| jjd< tj	|||dgS )Nr   r   r   highlight_language)langr   r   )
	argumentsstripoptionsgetsysmaxsizeenv	temp_datar   Zhighlightlang)selflanguager   r    r)   c/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/directives/code.pyrun(   s    
zHighlight.runN)__name__
__module____qualname____doc__has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   flagZpositive_intr   r   __annotations__r   r   r+   r)   r)   r)   r*   r      s   
r   )linesdedentlocationr   c                s    d krt d| dS t fdd| D rFtjtd|d g }x4| D ],}| d  }|drr|srd}|	| qPW |S )N Tc             3   s   | ]}|d     V  qd S )N)r    ).0s)r7   r)   r*   	<genexpr>9   s    zdedent_lines.<locals>.<genexpr>z!non-whitespace stripped by dedent)r8   
)
textwrapr7   join
splitlinesanyloggerwarningr   endswithappend)r6   r7   r8   	new_lineslinenew_liner)   )r7   r*   dedent_lines3   s    
rI   )	directiveliteral_nodecaptionr   c             C   s   t jdddgd}t  }| jt|gdd| j| t|d t jrdt	d|d 
  }t|nVt|d t jrt j|d jdf|d j }|j|_|j|_||7 }||7 }|S td S )Nr9   Tzliteral-block-wrapper)literal_blockclasses)sourcer   zInvalid caption: %s)r	   	containerr
   stateZnested_parser   Zcontent_offset
isinstanceZsystem_messager   Zastext
ValueErrorrL   Z	rawsourcechildrenrO   rG   RuntimeError)rJ   rK   rL   Zcontainer_nodeparsedmsgZcaption_noder)   r)   r*   container_wrapperF   s"    


rX   c            	   @   s^   e Zd ZU dZdZdZdZdZej	ej	e
eejejejejdZeed< ee dd	d
ZdS )	CodeBlockz^
    Directive for a code block with special highlighting or line numbering
    settings.
    Tr   r   F)r   linenosr7   zlineno-startzemphasize-linesrL   classnamer   )r   c          
      s<  | j j}d| j}| j| j}| jd}|ry`t	| j t
| }t fdd|D r~tjtd | jd f |d  fdd|D }W q tk
r } z|jj|| jd	gS d }~X Y qX nd }d
| jkr| j| j}|d}t|| jd
 |d}d|}t||}d| jks2d| jkr:d|d< |d  | jdg 7  < d| jk|d< | jrz| jd |d< n| jjd| jj|d< i  }	|d< |d k	r||	d< d| jkr| jd |	d< | | | jd}
|
r,yt| ||
}W n4 tk
r* } z|jj|| jd	gS d }~X Y nX | | |gS )Nr=   zemphasize-linesc             3   s   | ]}| kV  qd S )Nr)   )r:   i)nlinesr)   r*   r<   z   s    z CodeBlock.run.<locals>.<genexpr>z*line number spec is out of range(1-%d): %r)r8   c                s   g | ]}| k r|d  qS )r   r)   )r:   x)r^   r)   r*   
<listcomp>   s    z!CodeBlock.run.<locals>.<listcomp>)rG   r7   Tr9   rZ   zlineno-startrN   r[   r   r   r(   r   highlight_argshl_lineslinenostartrL   )rQ   documentr?   contentstate_machineget_source_and_linelinenor!   r"   lenr   rA   rB   rC   r   rS   reporterr@   rI   r	   rM   r   r%   r&   configr   set_source_inforX   add_name)r'   rd   coder8   linespecrb   errr6   literal
extra_argsrL   excr)   )r^   r*   r+   p   sX    


$




"
zCodeBlock.runN)r,   r-   r.   r/   r0   r1   r2   r3   r   r4   r   intunchanged_requiredclass_option	unchangedr   r   r5   r   r   r+   r)   r)   r)   r*   rY   [   s   
rY   c               @   s  e Zd Zddddddddd	d
dddgZeeeef eddddZddddZ	d,ee
eeef  ee dddZd-e
eeef  eeef dddZd.e
eeef  ee dddZd/ee e
eeef  ee dddZd0ee e
eeef  ee dd d!Zd1ee e
eeef  ee dd"d#Zd2ee e
eeef  ee dd$d%Zd3ee e
eeef  ee dd&d'Zd4ee e
eeef  ee dd(d)Zd5ee e
eeef  ee dd*d+ZdS )6LiteralIncludeReader)zlineno-matchzlineno-start)zlineno-matchrE   )zlineno-matchprepend)zstart-afterzstart-at)z
end-beforezend-at)diffpyobject)rz   zlineno-start)rz   zlineno-match)rz   r6   )rz   zstart-after)rz   z
end-before)rz   zstart-at)rz   zend-atN)filenamer!   rk   r   c             C   s8   || _ || _|d|j| _| jdd| _|   d S )Nencodingzlineno-startr   )r|   r!   r"   Zsource_encodingr}   lineno_startparse_options)r'   r|   r!   rk   r)   r)   r*   __init__   s
    zLiteralIncludeReader.__init__)r   c             C   s@   x:| j D ]0\}}|| jkr|| jkrttd||f qW d S )Nz%Cannot use both "%s" and "%s" options)INVALID_OPTIONS_PAIRr!   rS   r   )r'   Zoption1Zoption2r)   r)   r*   r      s    z"LiteralIncludeReader.parse_options)r|   r8   r   c          
   C   s   yHt || jdd.}| }d| jkr6|| jd }|dS Q R X W nl tk
r| } zttd| |W d d }~X Y n: tk
r } zttd| j|f |W d d }~X Y nX d S )Nstrict)r}   errorsz	tab-widthTz.Include file %r not found or reading it failedz`Encoding %r used for reading included file %r seems to be wrong, try giving an :encoding: option)	openr}   readr!   
expandtabsr@   OSErrorr   UnicodeError)r'   r|   r8   ftextrs   r)   r)   r*   	read_file   s    
zLiteralIncludeReader.read_file)r8   r   c             C   sp   d| j kr|  }nJ| j| j| j| j| j| j| jg}| j	| j
|d}x|D ]}|||d}qJW d|t|fS )Nrz   )r8   r9   )r!   	show_diffpyobject_filterstart_filter
end_filterlines_filterdedent_filterprepend_filterappend_filterr   r|   r?   ri   )r'   r8   r6   filtersfuncr)   r)   r*   r      s    


zLiteralIncludeReader.readc             C   s8   |  | j}| jd }|  |}t|||| j}t|S )Nrz   )r   r|   r!   r   list)r'   r8   rF   Zold_filenameZ	old_linesrz   r)   r)   r*   r      s
    

zLiteralIncludeReader.show_diff)r6   r8   r   c       	      C   s   | j d}|rddlm} || jd}| }||krRttd|| jf n8|| d }|| d }||d | }d| j kr|| _	|S )	Nr{   r   )ModuleAnalyzerr9   z,Object named %r not found in include file %rr      zlineno-match)
r!   r"   Zsphinx.pycoder   Zfor_filer|   Z	find_tagsrS   r   r~   )	r'   r6   r8   r{   r   Zanalyzertagsstartendr)   r)   r*   r      s    
z$LiteralIncludeReader.pyobject_filterc                s   | j d}|rt|t}tfdd|D rRtjtdt|f |d d| j kr|d  t fddt	|D r|  j
|d 7  _
nttd	fd
d|D g krttd|| jf S )Nr6   c             3   s   | ]}|t  kV  qd S )N)ri   )r:   r]   )r6   r)   r*   r<     s    z4LiteralIncludeReader.lines_filter.<locals>.<genexpr>z*line number spec is out of range(1-%d): %r)r8   zlineno-matchr   c             3   s   | ]\}} | |kV  qd S )Nr)   )r:   r]   n)firstr)   r*   r<     s    z8Cannot use "lineno-match" with a disjoint set of "lines"c                s    g | ]}|t  k r | qS r)   )ri   )r:   r   )r6   r)   r*   r`     s    z5LiteralIncludeReader.lines_filter.<locals>.<listcomp>z2Line spec %r: no lines pulled from include file %r)r!   r"   r   ri   rA   rB   rC   r   all	enumerater~   rS   r|   )r'   r6   r8   ro   Zlinelistr)   )r   r6   r*   r     s     

z!LiteralIncludeReader.lines_filterc             C   s   d| j kr| j d}d}n d| j kr8| j d}d}nd }|rxpt|D ]d\}}||krJ|rd| j krz|  j|d 7  _||d d  S d| j kr|  j|7  _||d  S qJW |dkrtd| ntd| |S )	Nzstart-atFzstart-afterTzlineno-matchr   z!start-after pattern not found: %szstart-at pattern not found: %s)r!   r"   r   r~   rS   )r'   r6   r8   r   	inclusiverh   rG   r)   r)   r*   r   %  s*    



z!LiteralIncludeReader.start_filterc             C   s   d| j kr| j d}d}n d| j kr8| j d}d}nd }|rxFt|D ]:\}}||krJ|rn|d |d  S |dkrxqJ|d | S qJW |dkrtd| ntd| |S )	Nzend-atTz
end-beforeFr   r   zend-at pattern not found: %sz end-before pattern not found: %s)r!   r"   r   rS   )r'   r6   r8   r   r   rh   rG   r)   r)   r*   r   F  s&    

zLiteralIncludeReader.end_filterc             C   s$   | j d}|r |d|d  |S )Nry   r   r=   )r!   r"   insert)r'   r6   r8   ry   r)   r)   r*   r   c  s    z#LiteralIncludeReader.prepend_filterc             C   s"   | j d}|r||d  |S )NrE   r=   )r!   r"   rE   )r'   r6   r8   rE   r)   r)   r*   r   l  s    z"LiteralIncludeReader.append_filterc             C   s(   d| j kr t|| j d|dS |S d S )Nr7   )r8   )r!   rI   r"   )r'   r6   r8   r)   r)   r*   r   u  s    
z"LiteralIncludeReader.dedent_filter)N)N)N)N)N)N)N)N)N)N)r,   r-   r.   r   strr   r   r   r   r   r   r   rt   r   r   r   r   r   r   r   r   r   r   r   r)   r)   r)   r*   rx      sB   &" rx   c               @   s   e Zd ZU dZdZdZdZdZee	j
ee	j
ee	je	j
e	je	je	je	je	je	je	je	je	je	je	je	je	je	jdZeed< ee dd	d
ZdS )LiteralIncludez
    Like ``.. include:: :literal:``, but only warns if the include file is
    not found, and does not raise errors.  Also has several options for
    selecting what to include.
    Fr   r   T)r7   rZ   zlineno-startzlineno-matchz	tab-widthr(   r   r}   r{   r6   zstart-afterz
end-beforezstart-atzend-atry   rE   zemphasize-linesrL   r[   r\   rz   r   )r   c          
      s4  | j j}|jjs$|jjd| jdgS d| jkrN| j	| jd \}}|| jd< y| j
| j}| j	| jd \}}| j| t|| j| j}|j|d\} tj|||d}	d| jk|	d< | |	 | jdrd|	d	< nd	| jkr| jd	 |	d	< d
| jksd| jksd| jkr$d|	d
< |	d  | jdg 7  < i  }
|	d< d| jkrt| jd  }t fdd|D rtjtd | jd f |d  fdd|D |
d< |j|
d< d| jkr| jd p| jd }t| |	|}	| |	 |	gS  tk
r. } z|jj|| jdgS d }~X Y nX d S )NzFile insertion disabled)rG   rz   r   )r8   )rO   r   udiffr(   rZ   zlineno-startzlineno-matchTrN   r[   ra   zemphasize-linesc             3   s   | ]}| kV  qd S )Nr)   )r:   r]   )r6   r)   r*   r<     s    z%LiteralInclude.run.<locals>.<genexpr>z*line number spec is out of range(1-%d): %rc                s   g | ]}| k r|d  qS )r   r)   )r:   r_   )r6   r)   r*   r`     s    z&LiteralInclude.run.<locals>.<listcomp>rb   rc   rL   )rQ   rd   settingsZfile_insertion_enabledrj   rC   rh   r!   r%   Z
relfn2pathrf   rg   r   Znote_dependencyrx   rk   r   r	   rM   rl   r"   r   rA   rB   r   r~   rX   rm   	Exception)r'   rd   _pathr8   Zrel_filenamer|   readerr   Zretnoderr   rb   rL   rs   r)   )r6   r*   r+     sP    







zLiteralInclude.runN)r,   r-   r.   r/   r0   r1   r2   r3   r   r   r4   rt   ru   r}   rw   rv   r   r   r5   r   r   r+   r)   r)   r)   r*   r   ~  s6   
r   r   )appr   c             C   s<   t dt t dt t dt t dt ddddS )N	highlightz
code-blockZ
sourcecodeZliteralincludebuiltinT)versionZparallel_read_safeZparallel_write_safe)r   Zregister_directiver   rY   r   )r   r)   r)   r*   setup  s    r   )N)2r#   r>   difflibr   typingr   r   r   r   r   r   Zdocutilsr	   Zdocutils.nodesr
   r   Zdocutils.parsers.rstr   Zdocutils.statemachiner   Zsphinxr   Zsphinx.configr   Zsphinx.directivesr   Zsphinx.localer   Zsphinx.utilr   r   Zsphinx.util.docutilsr   Zsphinx.util.typingr   Zsphinx.applicationr   	getLoggerr,   rB   r   r   rt   rI   rP   rX   rY   rx   r   r   r)   r)   r)   r*   <module>   s4    
S QW