a
    0aG                     @   sx  d Z 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
 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*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 )$z
    sphinx.directives.code
    ~~~~~~~~~~~~~~~~~~~~~~

    :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)unified_diff)TYPE_CHECKINGAnyDictList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v }|| 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)   5lib/python3.9/site-packages/sphinx/directives/code.pyrun0   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 u 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r7   r)   r*   	<genexpr>?       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lineZnew_liner)   r=   r*   dedent_lines;   s    rL   )	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|nXt|d t jrt j|d jdg|d jR  }|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
ValueErrorrO   Z	rawsourceZchildrenrS   rK   RuntimeError)rM   rN   rO   Zcontainer_nodeparsedmsgZcaption_noder)   r)   r*   container_wrapperL   s(    
r[   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   lineno-startemphasize-linesrO   classnamer   r   c              
      sH  | 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y } z |jj|| jd	gW  Y d }~S d }~0 0 nd }d
| jv r| j| j}|d}t|| jd
 |d}d|}t||}d| jv s8d| jv r@d|d< |d  | jdg 7  < d| jv |d< | jr| jd |d< n| jjd| jj|d< i  }	|d< |d ur||	d< d| jv r| jd |	d< | | | jd}
|
r8zt| ||
}W n: ty6 } z |jj|| jd	gW  Y d }~S d }~0 0 | | |gS )NrA   r_   c                 3   s   | ]}| kV  qd S r:   r)   r;   iZnlinesr)   r*   r>      r?   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;   xrd   r)   r*   
<listcomp>   r?   z!CodeBlock.run.<locals>.<listcomp>rK   r7   Tr9   r]   r^   rQ   r`   r   r   r(   r   highlight_argshl_lineslinenostartrO   )rU   documentrC   Zcontentstate_machineget_source_and_linelinenor!   r"   lenr   rE   rF   rG   r   rW   reporterrD   rL   r   rP   r   r%   r&   configr   set_source_infor[   add_name)r'   rn   coder8   linespecrl   errr6   literal
extra_argsrO   excr)   rd   r*   r+   v   s^    


,




*
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*   r\   a   s   
r\   c                   @   s  e Zd Zg dZeeeddddZddddZd ee	ee
f ee d	d
dZd!e	ee
f e	ee
f dddZd"e	ee
f ee dddZd#ee e	ee
f ee dddZd$ee e	ee
f ee dddZd%ee e	ee
f ee dddZd&ee e	ee
f ee dddZd'ee e	ee
f ee dddZd(ee e	ee
f ee dddZd)ee e	ee
f ee dddZdS )*LiteralIncludeReader))lineno-matchr^   )r   rI   )r   prepend)start-afterstart-at)
end-beforeend-at)diffpyobject)r   r^   )r   r   )r   r6   )r   r   )r   r   )r   r   )r   r   N)filenamer!   rt   r   c                 C   s8   || _ || _|d|j| _| jdd| _|   d S )Nencodingr^   r   )r   r!   r"   Zsource_encodingr   lineno_startparse_options)r'   r   r!   rt   r)   r)   r*   __init__   s
    zLiteralIncludeReader.__init__r   c                 C   s<   | j D ]0\}}|| jv r|| jv rttd||f qd S )Nz%Cannot use both "%s" and "%s" options)INVALID_OPTIONS_PAIRr!   rW   r   )r'   Zoption1Zoption2r)   r)   r*   r      s
    z"LiteralIncludeReader.parse_options)r   r8   r   c              
   C   s   zbt || jdd>}| }d| jv r6|| jd }|dW  d    W S 1 sV0    Y  W np ty } zttd| |W Y d }~nDd }~0  ty } z$ttd| j|f |W Y d }~n
d }~0 0 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   r8   ftextr|   r)   r)   r*   	read_file   s$    
.zLiteralIncludeReader.read_file)r8   r   c                 C   sl   d| j v r|  }nF| j| j| j| j| j| j| jg}| j	| j
|d}|D ]}|||d}qHd|t|fS )Nr   r@   r9   )r!   	show_diffpyobject_filterstart_filter
end_filterlines_filterprepend_filterappend_filterdedent_filterr   r   rC   rr   )r'   r8   r6   filtersfuncr)   r)   r*   r      s    

zLiteralIncludeReader.readc                 C   s:   |  | j}| jd}|  |}t|||| j}t|S )Nr   )r   r   r!   r"   r   list)r'   r8   rJ   Zold_filenameZ	old_linesr   r)   r)   r*   r      s
    
zLiteralIncludeReader.show_diff)r6   r8   r   c           	      C   s   | j d}|rddlm} || jd}| }||vrRttd|| jf n8|| d }|| d }||d | }d| j v r|| _	|S )	Nr   r   )ModuleAnalyzerr9   z,Object named %r not found in include file %rr      r   )
r!   r"   Zsphinx.pycoder   Zfor_filer   Z	find_tagsrW   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 v 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 r:   rr   rb   r6   r)   r*   r>     r?   z4LiteralIncludeReader.lines_filter.<locals>.<genexpr>re   r@   r   r   c                 3   s   | ]\}} | |kV  qd S r:   r)   )r;   rc   n)firstr)   r*   r>     r?   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*   ri     r?   z5LiteralIncludeReader.lines_filter.<locals>.<listcomp>z2Line spec %r: no lines pulled from include file %r)r!   r"   r   rr   rE   rF   rG   r   all	enumerater   rW   r   )r'   r6   r8   rx   Zlinelistr)   )r   r6   r*   r     s(    


z!LiteralIncludeReader.lines_filterc                 C   s   d| j v r| j d}d}n d| j v r8| j d}d}nd }|rt|D ]l\}}||v rH|rd| j v rx|  j|d 7  _||d d    S d| j v r|  j|7  _||d    S qH|du 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   rW   )r'   r6   r8   r   	inclusiverq   rK   r)   r)   r*   r   %  s*    



z!LiteralIncludeReader.start_filterc                 C   s   d| j v r| j d}d}n d| j v r8| j d}d}nd }|rt|D ]B\}}||v rH|rp|d |d    S |dkrzqH|d |   S qH|du 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   rW   )r'   r6   r8   r   r   rq   rK   r)   r)   r*   r   D  s&    

zLiteralIncludeReader.end_filterc                 C   s$   | j d}|r |d|d  |S )Nr   r   rA   )r!   r"   insert)r'   r6   r8   r   r)   r)   r*   r   _  s    z#LiteralIncludeReader.prepend_filterc                 C   s"   | j d}|r||d  |S )NrI   rA   )r!   r"   rI   )r'   r6   r8   rI   r)   r)   r*   r   f  s    z"LiteralIncludeReader.append_filterc                 C   s(   d| j v r t|| j d|dS |S d S )Nr7   r@   )r!   rL   r"   )r'   r6   r8   r)   r)   r*   r   m  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   r   r   r   r   r   r   r   r   r   r   r)   r)   r)   r*   r      s    "$$$$$$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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   r]   r^   r   r   r(   r   r   r   r6   r   r   r   r   r   rI   r_   rO   r`   ra   r   r   r   c              
      s<  | j j}|jjs$|jjd| jdgS d| jv rN| j	| jd \}}|| jd< z| j
| j}| j	| jd \}}| j| t|| j| j}|j|d\} tj|||d}	d| jv |	d< | |	 | jdrd|	d	< nd	| jv r| jd	 |	d	< d
| jv sd| jv sd| jv r$d|	d
< |	d  | jdg 7  < i  }
|	d< d| jv 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v r| jd p| jd }t| |	|}	| |	 |	gW S  ty6 } z |jj|| jdgW  Y d }~S d }~0 0 d S )NzFile insertion disabledrj   r   r   r@   rR   r   Zudiffr(   r]   r^   r   TrQ   r`   rk   r_   c                 3   s   | ]}| kV  qd S r:   r)   rb   r   r)   r*   r>     r?   z%LiteralInclude.run.<locals>.<genexpr>re   c                    s   g | ]}| k r|d  qS rf   r)   rg   r   r)   r*   ri     r?   z&LiteralInclude.run.<locals>.<listcomp>rl   rm   rO   )rU   rn   ZsettingsZfile_insertion_enabledrs   rG   rq   r!   r%   Z
relfn2pathro   rp   r   Znote_dependencyr   rt   r   r   rP   ru   r"   r   rE   rF   r   r   r[   rv   	Exception)r'   rn   _pathr8   Zrel_filenamer   readerr   Zretnoder{   rl   rO   r|   r)   r   r*   r+     sX    







zLiteralInclude.runN)r,   r-   r.   r/   r0   r1   r2   r3   r   r   r4   r}   r~   r   r   r   r   r   r5   r   r
   r+   r)   r)   r)   r*   r   t  s8   
r   r   )appr   c                 C   s<   t dt t dt t dt t dt ddddS )NZ	highlightz
code-blockZ
sourcecodeZliteralincludeZbuiltinT)versionZparallel_read_safeZparallel_write_safe)r   Zregister_directiver   r\   r   )r   r)   r)   r*   setup  s    r   )N)2r/   r#   rB   Zdifflibr   typingr   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   Z	getLoggerr,   rF   r   r   r}   rL   rT   r[   r\   r   r   r   r)   r)   r)   r*   <module>   s4   
&S AW