U
    \ShG                     @  sZ  d dl mZ d dlZd dl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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+dddddddZ'dddddddZ(G d d! d!eZ)G d"d# d#Z*G d$d% d%eZ+d&d'd(d)d*Z,dS ),    )annotationsN)unified_diff)TYPE_CHECKINGAny)nodes)ElementNode)
directives)
StringList)addnodes)Config)optional_int)__)loggingparselinenos)SphinxDirective)
OptionSpec)Sphinxc                   @  sF   e Zd ZU dZdZdZdZdZej	ej
dZded< d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linenothresholdr   option_spec
list[Node]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(   I/root/rtd-docs/venv/lib/python3.8/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   __annotations__r*   r(   r(   r(   r)   r      s   
r   	list[str]z
int | Nonetuple[str, int] | None)linesdedentlocationr   c                   s    d krt d| dS t fdd| D rFtjtd|d g }| D ],}| d  }|drp|spd}|	| qN|S )N Tc                 3  s   | ]}|d     V  qd S N)r   ).0sr8   r(   r)   	<genexpr>;   s     zdedent_lines.<locals>.<genexpr>z!non-whitespace stripped by dedentr9   
)
textwrapr8   join
splitlinesanyloggerwarningr   endswithappend)r7   r8   r9   	new_lineslinenew_liner(   r>   r)   dedent_lines5   s    rM   r   r   strznodes.container)	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rbt	d|d 
  }t|t|d t jrt j|d jdf|d j }|j|_|j|_||7 }||7 }|S td S )Nr:   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
ValueErrorrQ   Z	rawsourcechildrenrU   rK   RuntimeError)rO   rP   rQ   Zcontainer_nodeparsedmsgZcaption_noder(   r(   r)   container_wrapperH   s*     r^   c                	   @  sZ   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ded< d	d
ddZdS )	CodeBlockz^
    Directive for a code block with special highlighting or line numbering
    settings.
    Tr   r   F)r   linenosr8   lineno-startemphasize-linesrQ   classnamer   r   r   r   c              
     sL  | j j}d| j}| j| j}| jd}|rz`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 W Y S d }~X Y qX nd }d
| jkr| j| j}|d}t|| jd
 |d}d|}t||}d| jks:d| jkrBd|d< |d  | jdg 7  < d| jk|d< | jr| 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<zt| ||
}W n< tk
r: } z|jj|| jd	g W Y S d }~X Y nX | | |gS )NrA   rb   c                 3  s   | ]}| kV  qd S r;   r(   r<   inlinesr(   r)   r?   }   s     z CodeBlock.run.<locals>.<genexpr>*line number spec is out of range(1-%d): %rr@   c                   s   g | ]}| k r|d  qS r   r(   r<   xrg   r(   r)   
<listcomp>   s      z!CodeBlock.run.<locals>.<listcomp>rK   r8   Tr:   r`   ra   rS   rc   r   r   r'   r   highlight_argshl_lineslinenostartrQ   )rW   documentrC   contentstate_machineget_source_and_linelinenor    r!   lenr   rE   rF   rG   r   rY   reporterrD   rM   r   rR   r   r$   r%   configr   set_source_infor^   add_name)r&   rr   coder9   linespecrp   errr7   literal
extra_argsrQ   excr(   rg   r)   r*   s   s^    


,




*
zCodeBlock.runN)r+   r,   r-   r.   r/   r0   r1   r2   r	   r3   r   intunchanged_requiredclass_option	unchangedr   r4   r*   r(   r(   r(   r)   r_   ^   s   
r_   c                   @  s  e Zd Zddddddddd	d
dddgZdddddddZddddZd3ddddddZd4dddd d!Zd5dddd"d#Zd6dddd$d%d&Z	d7dddd$d'd(Z
d8dddd$d)d*Zd9dddd$d+d,Zd:dddd$d-d.Zd;dddd$d/d0Zd<dddd$d1d2ZdS )=LiteralIncludeReader)lineno-matchra   )r   rI   )r   prepend)start-afterstart-at)
end-beforeend-at)diffpyobject)r   ra   )r   r   )r   r7   )r   r   )r   r   )r   r   )r   r   rN   dict[str, Any]r   None)filenamer    ry   r   c                 C  s8   || _ || _|d|j| _| jdd| _|   d S )Nencodingra   r   )r   r    r!   Zsource_encodingr   lineno_startparse_options)r&   r   r    ry   r(   r(   r)   __init__   s
    zLiteralIncludeReader.__init__r   c                 C  s<   | j D ]0\}}|| jkr|| jkrttd||f qd S )Nz%Cannot use both "%s" and "%s" options)INVALID_OPTIONS_PAIRr    rY   r   )r&   Zoption1Zoption2r(   r(   r)   r      s
    z"LiteralIncludeReader.parse_optionsNr6   r5   )r   r9   r   c              
   C  s   zVt || jdd<}| }d| jkr6|| jd }|dW  5 Q R  W S Q R X W nl tk
r } zttd| |W 5 d }~X Y n: tk
r } zttd| j|f |W 5 d }~X Y nX d S )Nstrict)r   errors	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    
expandtabsrD   OSErrorr   UnicodeError)r&   r   r9   ftextr   r(   r(   r)   	read_file   s$    
"zLiteralIncludeReader.read_fileztuple[str, int])r9   r   c                 C  sl   d| j kr|  }nF| j| j| j| j| j| j| jg}| j	| j
|d}|D ]}|||d}qHd|t|fS )Nr   r@   r:   )r    	show_diffpyobject_filterstart_filter
end_filterlines_filterdedent_filterprepend_filterappend_filterr   r   rC   rw   )r&   r9   r7   filtersfuncr(   r(   r)   r      s    

zLiteralIncludeReader.readc                 C  s8   |  | j}| jd }|  |}t|||| j}t|S )Nr   )r   r   r    r   list)r&   r9   rJ   Zold_filenameZ	old_linesr   r(   r(   r)   r      s
    

zLiteralIncludeReader.show_diff)r7   r9   r   c           	      C  s   | j d}|rddlm} || jd}| }||krPttd|| jf || d }|| d }||d | }d| j kr|| _	|S )	Nr   r   )ModuleAnalyzerr:   z,Object named %r not found in include file %rr      r   )
r    r!   Zsphinx.pycoder   Zfor_filer   Z	find_tagsrY   r   r   )	r&   r7   r9   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 )Nr7   c                 3  s   | ]}|t  kV  qd S r;   rw   re   r7   r(   r)   r?     s     z4LiteralIncludeReader.lines_filter.<locals>.<genexpr>ri   r@   r   r   c                 3  s   | ]\}} | |kV  qd S r;   r(   )r<   rf   n)firstr(   r)   r?     s     z8Cannot use "lineno-match" with a disjoint set of "lines"c                   s    g | ]}|t  k r | qS r(   r   )r<   r   r   r(   r)   rm      s      z5LiteralIncludeReader.lines_filter.<locals>.<listcomp>z2Line spec %r: no lines pulled from include file %r)r    r!   r   rw   rE   rF   rG   r   all	enumerater   rY   r   )r&   r7   r9   r}   Zlinelistr(   )r   r7   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 }|rt|D ]l\}}||krH|rd| j krx|  j|d 7  _||d d    S d| j kr|  j|7  _||d    S qH|dkrtd| ntd| |S )	Nr   Fr   Tr   r   z!start-after pattern not found: %szstart-at pattern not found: %s)r    r!   r   r   rY   )r&   r7   r9   r   	inclusiverv   rK   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 }|rt|D ]B\}}||krH|rp|d |d    S |dkrzqH|d |   S qH|dkrtd| ntd| |S )	Nr   Tr   Fr   r   zend-at pattern not found: %sz end-before pattern not found: %s)r    r!   r   rY   )r&   r7   r9   r   r   rv   rK   r(   r(   r)   r   H  s&    

zLiteralIncludeReader.end_filterc                 C  s$   | j d}|r |d|d  |S )Nr   r   rA   )r    r!   insert)r&   r7   r9   r   r(   r(   r)   r   e  s    z#LiteralIncludeReader.prepend_filterc                 C  s"   | j d}|r||d  |S )NrI   rA   )r    r!   rI   )r&   r7   r9   rI   r(   r(   r)   r   n  s    z"LiteralIncludeReader.append_filterc                 C  s(   d| j kr t|| j d|dS |S d S )Nr8   r@   )r    rM   r!   )r&   r7   r9   r(   r(   r)   r   w  s    
z"LiteralIncludeReader.dedent_filter)N)N)N)N)N)N)N)N)N)N)r+   r,   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r(   r(   r)   r      sD       "  
 
 r   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ded< d	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)r8   r`   ra   r   r   r'   r   r   r   r7   r   r   r   r   r   rI   rb   rQ   rc   rd   r   r   r   r   r   c              
     s>  | j j}|jjs$|jjd| jdgS d| jkrN| j	| jd \}}|| jd< z| 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W S  tk
r8 } z|jj|| jdg W Y S d }~X Y nX d S )NzFile insertion disabledrn   r   r   r@   rT   r   udiffr'   r`   ra   r   TrS   rc   ro   rb   c                 3  s   | ]}| kV  qd S r;   r(   re   r   r(   r)   r?     s     z%LiteralInclude.run.<locals>.<genexpr>ri   c                   s   g | ]}| k r|d  qS rj   r(   rk   r   r(   r)   rm     s      z&LiteralInclude.run.<locals>.<listcomp>rp   rq   rQ   )rW   rr   settingsZfile_insertion_enabledrx   rG   rv   r    r$   Z
relfn2pathrt   ru   r   Znote_dependencyr   ry   r   r   rR   rz   r!   r   rE   rF   r   r   r^   r{   	Exception)r&   rr   _pathr9   Zrel_filenamer   readerr   Zretnoder   rp   rQ   r   r(   r   r)   r*     sX    







zLiteralInclude.runN)r+   r,   r-   r.   r/   r0   r1   r2   r   r	   r3   r   r   r   r   r   r   r4   r*   r(   r(   r(   r)   r     s8   
r   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   r_   r   )r   r(   r(   r)   setup  s    r   )N)-
__future__r   r"   rB   difflibr   typingr   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+   rF   r   rM   r^   r_   r   r   r   r(   r(   r(   r)   <module>   s6   
 S PW