o
    NiIH                     @  sF  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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 d dlmZ erld dlmZmZ d dlmZ d dlm Z  d dl!m"Z"m#Z# e$e%Z&G dd deZ'	d0d1ddZ(d2d#d$Z)G d%d& d&eZ*G d'd( d(Z+G d)d* d*eZ,d3d.d/Z-dS )4    )annotationsN)unified_diff)TYPE_CHECKINGAnyClassVar)nodes)
directives)addnodes)optional_int)__)logging)parse_line_num_spec)SphinxDirective)ElementNode)Sphinx)Config)ExtensionMetadata
OptionSpecc                   @  sB   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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ClassVar[OptionSpec]option_specreturn
list[Node]c                 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	   highlightlang)selflanguager   r    r*   J/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/directives/code.pyrun+   s   
zHighlight.runNr   r   )__name__
__module____qualname____doc__has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   flagpositive_intr   __annotations__r,   r*   r*   r*   r+   r      s   
 r   lines	list[str]dedent
int | Nonelocationtuple[str, int] | Noner   c                   s    d u rt d| dS t fdd| D r#tjtd|d g }| D ]}| d  }|dr8|s8d}|	| q'|S )N Tc                 3  s     | ]}|d     V  qd S N)r    ).0sr;   r*   r+   	<genexpr>>       zdedent_lines.<locals>.<genexpr>z!non-whitespace stripped by dedentr=   
)
textwrapr;   join
splitlinesanyloggerwarningr   endswithappend)r9   r;   r=   	new_lineslinenew_liner*   rC   r+   dedent_lines8   s   rS   	directiver   literal_noder   captionstrnodes.containerc                 C  s   t jdddgd}| j|| jd}|d }t|t jr'td|  }t|t|t j	rKt j
|jdg|jR  }|j|_|j|_||7 }||7 }|S t)Nr?   Tzliteral-block-wrapper)literal_blockclasses)offsetr   zInvalid caption: %s)r   	containerparse_text_to_nodescontent_offset
isinstancesystem_messager   astext
ValueErrorr   rV   	rawsourcechildrensourcerQ   RuntimeError)rT   rU   rV   container_nodeparsednodemsgcaption_noder*   r*   r+   container_wrapperK   s    rl   c                	   @  sV   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ZdS )	CodeBlockz^
    Directive for a code block with special highlighting or line numbering
    settings.
    Tr   r   F)r   linenosr;   lineno-startemphasize-linesrV   classnamer   r   r   r   c              
     s6  | j j}d| j}| j| j}| jd}|rdz.t	| j t
| }t fdd|D r=tjtd | jd |d  fdd|D }W n tyc } z|jj|| jd	gW  Y d }~S d }~ww d }d
| jv r| j| j}|d}t|| jd
 |d}d|}t||}d| jv sd| jv rd|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}
|
rzt| ||
}W n ty } z|jj|| jd	gW  Y d }~S d }~ww | | |gS )NrG   rp   c                 3      | ]}| kV  qd S r@   r*   rA   inlinesr*   r+   rD          z CodeBlock.run.<locals>.<genexpr>*line number spec is out of range(1-%d): %rrF   c                      g | ]
}| k r|d  qS r   r*   rA   xrv   r*   r+   
<listcomp>       z!CodeBlock.run.<locals>.<listcomp>rQ   r;   Tr?   rn   ro   rZ   rq   r   r   r)   r   highlight_argshl_lineslinenostartrV   )statedocumentrI   contentstate_machineget_source_and_linelinenor!   r"   lenr   rK   rL   rM   r   rb   reporterrJ   rS   r   rY   r   r%   r&   configr   set_source_inforl   add_name)r(   r   coder=   linespecr   errr9   literal
extra_argsrV   excr*   rv   r+   r,   u   sh   

 




 
zCodeBlock.runNr-   )r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r
   intunchanged_requiredclass_option	unchangedr   r8   r,   r*   r*   r*   r+   rm   `   s    
 rm   c                   @  s   e Zd Zg dZd(d
dZd)ddZ	d*d+ddZd*d,ddZd*d-ddZ	d*d.ddZ		d*d.ddZ
	d*d.ddZ	d*d.d d!Z	d*d.d"d#Z	d*d.d$d%Z	d*d.d&d'ZdS )/LiteralIncludeReader))lineno-matchro   )r   rO   )r   prepend)start-afterstart-at)
end-beforeend-at)diffpyobject)r   ro   )r   r   )r   r9   )r   r   )r   r   )r   r   )r   r   filenamerW   r!   dict[str, Any]r   r   r   Nonec                 C  s8   || _ || _|d|j| _| jdd| _|   d S )Nencodingro   r   )r   r!   r"   source_encodingr   lineno_startparse_options)r(   r   r!   r   r*   r*   r+   __init__   s
   zLiteralIncludeReader.__init__c                 C  s@   | j D ]\}}|| jv r|| jv rtd||f }t|qd S )Nz%Cannot use both "%s" and "%s" options)INVALID_OPTIONS_PAIRr!   r   rb   )r(   option1option2rj   r*   r*   r+   r      s   z"LiteralIncludeReader.parse_optionsNr=   r>   r:   c              
   C  s   z2t || jdd}| }d| jv r|| jd }|dW  d    W S 1 s+w   Y  W d S  tyI } ztd| }t||d }~w tyb } ztd| j|f }t||d }~ww )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!   
expandtabsrJ   OSErrorr   UnicodeError)r(   r   r=   ftextr   rj   r*   r*   r+   	read_file   s(   
(

zLiteralIncludeReader.read_filetuple[str, int]c                 C  sl   d| j v r
|  }n#| j| j| j| j| j| j| jg}| j	| j
|d}|D ]}|||d}q$d|t|fS )Nr   rF   r?   )r!   	show_diffpyobject_filterstart_filter
end_filterlines_filterdedent_filterprepend_filterappend_filterr   r   rI   r   )r(   r=   r9   filtersfuncr*   r*   r+   r      s   

	zLiteralIncludeReader.readc                 C  s@   |  | j}| jd }|  |}t||t|t| j}t|S )Nr   )r   r   r!   r   rW   list)r(   r=   rP   old_filename	old_linesr   r*   r*   r+   r      s
   

zLiteralIncludeReader.show_diffr9   c           
      C  s   | j d}|rFddlm} || jd}| }||vr*td|| jf }t||| d }|| d }	||d |	 }d| j v rF|| _	|S )	Nr   r   )ModuleAnalyzerr?   z,Object named %r not found in include file %rr      r   )
r!   r"   sphinx.pycoder   for_filer   	find_tagsr   rb   r   )
r(   r9   r=   r   r   analyzertagsrj   startendr*   r*   r+   r     s"   
z$LiteralIncludeReader.pyobject_filterc                   s   | j d}|rgt|t}tfdd|D r'tjtdt||d d| j v rO|d  t fddt	|D rG|  j
|d 7  _
ntd	}t|fd
d|D sgtd|| jf }t|S )Nr9   c                 3  s    | ]	}|t  kV  qd S r@   r   rt   r9   r*   r+   rD   !  s    z4LiteralIncludeReader.lines_filter.<locals>.<genexpr>ry   rF   r   r   c                 3  s     | ]\}} | |kV  qd S r@   r*   )rA   ru   n)firstr*   r+   rD   ,  rE   z8Cannot use "lineno-match" with a disjoint set of "lines"c                   s    g | ]}|t  k r | qS r*   r   )rA   r   r   r*   r+   r~   2  s     z5LiteralIncludeReader.lines_filter.<locals>.<listcomp>z2Line spec %r: no lines pulled from include file %r)r!   r"   r   r   rK   rL   rM   r   all	enumerater   rb   r   )r(   r9   r=   r   linelistrj   r*   )r   r9   r+   r     s0   
z!LiteralIncludeReader.lines_filterc                 C  s   d| j v r| j d}d}nd| j v r| j d}d}nd }|rkt|D ]6\}}||v rZ|rFd| j v r<|  j|d 7  _||d d    S d| j v rR|  j|7  _||d    S q$|du retd| td| |S )	Nr   Fr   Tr   r   z!start-after pattern not found: %szstart-at pattern not found: %s)r!   r"   r   r   rb   )r(   r9   r=   r   	inclusiver   rQ   r*   r*   r+   r   <  s,   



z!LiteralIncludeReader.start_filterc                 C  s   d| j v r| j d}d}nd| j v r| j d}d}nd }|rVt|D ]!\}}||v rE|r8|d |d    S |dkr=q$|d |   S q$|du rPtd| td| |S )	Nr   Tr   Fr   r   zend-at pattern not found: %sz end-before pattern not found: %s)r!   r"   r   rb   )r(   r9   r=   r   r   r   rQ   r*   r*   r+   r   ]  s(   

zLiteralIncludeReader.end_filterc                 C  s$   | j d}|r|d|d  |S )Nr   r   rG   )r!   r"   insert)r(   r9   r=   r   r*   r*   r+   r   z  s   z#LiteralIncludeReader.prepend_filterc                 C  s"   | j d}|r||d  |S )NrO   rG   )r!   r"   rO   )r(   r9   r=   rO   r*   r*   r+   r     s   z"LiteralIncludeReader.append_filterc                 C  s$   d| j v rt|| j d|dS |S )Nr;   rF   )r!   rS   r"   )r(   r9   r=   r*   r*   r+   r     s   
z"LiteralIncludeReader.dedent_filter)r   rW   r!   r   r   r   r   r   )r   r   r@   )r   rW   r=   r>   r   r:   )r=   r>   r   r   )r=   r>   r   r:   )r9   r:   r=   r>   r   r:   )r.   r/   r0   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i dede	j
ded	e	j
d
ede	jde	j
de	jde	jde	jde	jde	jde	jde	jde	jde	jde	je	je	je	je	jdZde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   Tr;   rn   ro   r   r   r)   r   r   r   r9   r   r   r   r   r   rO   rp   )rV   rq   rr   r   r   r   r   r   c              
     s$  | j j}|jjs|jjd| jdgS d| jv r'| 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rod|	d	< nd	| jv r{| jd	 |	d	< d
| jv sd| jv sd| jv rd|	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 |d  fdd|D |
d< |j|
d< d| jv r| jd p| jd }t| |	|}	| |	 |	gW S  ty } z|jj|| jdgW  Y d }~S d }~ww )NzFile insertion disabledr   r   r   rF   )re   r   udiffr)   rn   ro   r   TrZ   rq   r   rp   c                 3  rs   r@   r*   rt   r   r*   r+   rD     rx   z%LiteralInclude.run.<locals>.<genexpr>ry   c                   rz   r{   r*   r|   r   r*   r+   r~     r   z&LiteralInclude.run.<locals>.<listcomp>r   r   rV   )r   r   settingsfile_insertion_enabledr   rM   r   r!   r%   
relfn2pathr   r   r   note_dependencyr   r   r   r   rY   r   r"   r   rK   rL   r   r   rl   r   	Exception)r(   r   _pathr=   rel_filenamer   readerr   retnoder   r   rV   r   r*   r   r+   r,     s\   











 zLiteralInclude.runNr-   )r.   r/   r0   r1   r2   r3   r4   r5   r
   r   r6   r   r   r   r   r   r   r8   r,   r*   r*   r*   r+   r     s^   
 	
r   appr   r   c                 C  s<   t dt t dt t dt t dt ddddS )N	highlightz
code-block
sourcecodeliteralincludebuiltinT)versionparallel_read_safeparallel_write_safe)r   register_directiver   rm   r   )r   r*   r*   r+   setup  s   r   r@   )r9   r:   r;   r<   r=   r>   r   r:   )rT   r   rU   r   rV   rW   r   rX   )r   r   r   r   ).
__future__r   r#   rH   difflibr   typingr   r   r   docutilsr   docutils.parsers.rstr   sphinxr	   sphinx.directivesr
   sphinx.localer   sphinx.utilr   sphinx.util._linesr   sphinx.util.docutilsr   docutils.nodesr   r   sphinx.applicationr   sphinx.configr   sphinx.util.typingr   r   	getLoggerr.   rL   r   rS   rl   rm   r   r   r   r*   r*   r*   r+   <module>   s8    

W _^