
    FeG                       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 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 erd dlmZmZ d dlmZ d dlm Z  d dl!m"Z"  ejF                  e$      Z% G d de      Z&	 d	 	 	 	 	 	 	 ddZ'	 	 	 	 	 	 	 	 ddZ( G d de      Z) G d d      Z* G d de      Z+ddZ,y)     )annotationsN)unified_diff)TYPE_CHECKINGAny)nodes)
directives)
StringList)addnodes)optional_int)__)loggingparselinenos)SphinxDirective)ElementNode)Sphinx)Config)
OptionSpecc                  f    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Zy	)	Highlightzt
    Directive to set the highlighting language for code blocks, as well
    as the threshold for line numbers.
    F   r   )forcelinenothresholdr   option_specc                   | j                   d   j                         }| j                  j                  dt        j
                        }d| j                  v }|| j                  j                  d<   t        j                  |||      gS )Nr   r   r   highlight_language)langr   r   )
	argumentsstripoptionsgetsysmaxsizeenv	temp_datar
   highlightlang)selflanguager   r   s       8/usr/lib/python3/dist-packages/sphinx/directives/code.pyrunzHighlight.run+   sz    >>!$**,,,**+<ckkJ4<<'3;/0&&H-27FH I 	I    Nreturnz
list[Node])__name__
__module____qualname____doc__has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   flagpositive_intr   __annotations__r*    r+   r)   r   r      sD    
 K %%22K 
Ir+   r   c                B   3t        j                  dj                  |             j                  d      S t	        fd| D              r t
        j                  t        d      |       g }| D ]-  }|d  }|j                  d      r|sd}|j                  |       / |S )N Tc              3  D   K   | ]  }|d  j                           y wN)r   ).0sdedents     r)   	<genexpr>zdedent_lines.<locals>.<genexpr><   s      
-!1Wf:
-s    z!non-whitespace stripped by dedentlocation
)
textwrapr@   join
splitlinesanyloggerwarningr   endswithappend)linesr@   rC   	new_lineslinenew_lines    `    r)   dedent_linesrQ   6   s     ~rwwu~.99$??

-u
--r=>RI #===xH"	# r+   c                T   t        j                  dddg      }t        j                         }| j                  j	                  t        |gd      | j                  |       t        |d   t         j                        r*t        d|d   j                         z        }t        |      t        |d   t         j                        r_t        j                  |d   j                  dg|d   j                   }|j                  |_        |j                   |_        ||z  }||z  }|S t"        )Nr;   Tzliteral-block-wrapper)literal_blockclassessourcer   zInvalid caption: %s)r   	containerr   statenested_parser	   content_offset
isinstancesystem_messager   astext
ValueErrorcaption	rawsourcechildrenrV   rO   RuntimeError)	directiveliteral_noder_   container_nodeparsedmsgcaption_nodes          r)   container_wrapperri   I   s    __Rt.E-FHN]]_FOO  WIb!A!*!9!96C&)U112&)9)9);;<o&)U]]+}}VAY%8%8" :&,Qi&8&8:*11(--,&,&
r+   c            	          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	Zy
)	CodeBlockz^
    Directive for a code block with special highlighting or line numbering
    settings.
    Tr   r   F)r   linenosr@   lineno-startemphasize-linesr_   classnamer   r   c                d   | j                   j                  }dj                  | j                        }| j                  j                  | j                        }| j                  j                  d      }|r	 t        | j                        t        |      }t        fd|D              r2t        j                  t        d      | j                  d   fz  |       |D cg c]  }|k  s	|dz    }}nd }d| j                  v rb| j                  j                  | j                        }|j#                  d	      }t%        || j                  d   |      }d
j                  |      }t'        j(                  ||      }	d| j                  v sd| j                  v rd	|	d<   |	dxx   | j                  j                  dg       z  cc<   d| j                  v |	d<   | j*                  r| j*                  d   |	d<   n=| j,                  j.                  j                  d| j0                  j2                        |	d<   i x}
|	d<   |||
d<   d| j                  v r| j                  d   |
d<   | j5                  |	       | j                  j                  d      }|r	 t7        | |	|      }	| j9                  |	       |	gS c c}w # t        $ r2}|j                   j                  || j                        gcY d }~S d }~ww xY w# t        $ r2}|j                   j                  || j                        gcY d }~S d }~ww xY w)NrD   rn   c              3  (   K   | ]	  }|k\    y wr=   r9   )r>   inliness     r)   rA   z CodeBlock.run.<locals>.<genexpr>~   s     5qqF{5   *line number spec is out of range(1-%d): %rrB   r   rO   r@   Tr;   rl   rm   rT   ro   r   r   r(   r   highlight_argshl_lineslinenostartr_   )rX   documentrF   contentstate_machineget_source_and_linelinenor    r!   lenr   rH   rI   rJ   r   r^   reporterrG   rQ   r   rS   r   r$   r%   configr   set_source_infori   add_name)r'   r{   coderC   linespecry   xerrrM   literal
extra_argsr_   excrt   s                @r)   r*   zCodeBlock.runt   s   ::&&yy&%%99$++F<<##$56
JT\\*'&95H55NN2&R#S$*DLL9J,K#L$M,4 # 6 ,4Baq6zAEBB Ht||#))==dkkJHOOD)E X(>RE775>D ..tT:$$,,(F!%GI	dll..w;;"dll2>>"&.."3GJ
 #'(("4"4"8"89M9=9W9W#YGJ133
W-.%-Jz"T\\)(,^(DJ}%W%,,""9-J+D'7C 	gyY C J ))11#DKK1HIIJH  J ))11#DKK1HIIJsU   6A+J6 !
J1,J13J6 K4 1J6 6	K1?'K,&K1,K14	L/='L*$L/*L/Nr,   )r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r   intunchanged_requiredclass_option	unchangedr   r8   r*   r9   r+   r)   rk   rk   _   sk    
 K %??%8800(($$	K 	;r+   rk   c                      e Zd Zg dZddZddZ	 d	 	 	 	 	 ddZdddZdddZ	 d	 	 	 	 	 ddZ		 d	 	 	 	 	 dd	Z
	 d	 	 	 	 	 dd
Z	 d	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZy)LiteralIncludeReader))lineno-matchrm   )r   rL   )r   prepend)start-afterstart-at)
end-beforeend-at)diffpyobject)r   rm   )r   r   )r   rM   )r   r   )r   r   )r   r   )r   r   c                    || _         || _        |j                  d|j                        | _        | j                  j                  dd      | _        | j                          y )Nencodingrm   r   )filenamer    r!   source_encodingr   lineno_startparse_options)r'   r   r    r   s       r)   __init__zLiteralIncludeReader.__init__   sM     J0F0FG LL,,^Q?r+   c                    | j                   D ];  \  }}|| j                  v s|| j                  v s$t        t        d      ||fz         y )Nz%Cannot use both "%s" and "%s" options)INVALID_OPTIONS_PAIRr    r^   r   )r'   option1option2s      r)   r   z"LiteralIncludeReader.parse_options   sU     $ 9 9 	5GW$,,&7dll+B $K!L")7!3"4 5 5	5r+   Nc                   	 t        || j                  d      5 }|j                         }d| j                  v r|j	                  | j                  d         }|j                  d      cd d d        S # 1 sw Y   y xY w# t        $ r}t        t        d      |z        |d }~wt        $ r)}t        t        d      | j                  |fz        |d }~ww xY 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    
expandtabsrG   OSErrorr   UnicodeError)r'   r   rC   ftextr   s         r)   	read_filezLiteralIncludeReader.read_file   s    	ChxH -Avvx$,,.??4<<+DEDt,- - -  	-"MN"# $),- 	Cr #N  O $x8 9 :?BC	CsA   A= AA1'	A= 1A:6A= :A= =	CBC*$CCc                r   d| j                   v r| j                         }n}| j                  | j                  | j                  | j
                  | j                  | j                  | j                  g}| j                  | j                  |      }|D ]  } |||      } dj                  |      t        |      fS )Nr   rB   r;   )r    	show_diffpyobject_filterstart_filter
end_filterlines_filterdedent_filterprepend_filterappend_filterr   r   rF   r   )r'   rC   rM   filtersfuncs        r)   r   zLiteralIncludeReader.read   s    T\\!NN$E++(((())**))+G NN4==8NDE 7UX67 wwu~s5z))r+   c                    | j                  | j                        }| j                  d   }| j                  |      }t        ||t	        |      t	        | j                              }t        |      S )Nr   )r   r   r    r   strlist)r'   rC   rN   old_filename	old_linesr   s         r)   r   zLiteralIncludeReader.show_diff   sX    NN4==1	||F+NN<0	Iy#l2CSEWXDzr+   c                L   | j                   j                  d      }|rddlm} |j	                  | j
                  d      }|j                         }||vr#t        t        d      || j
                  fz        ||   d   }||   d   }||dz
  | }d| j                   v r|| _	        |S )	Nr   r   )ModuleAnalyzerr;   z,Object named %r not found in include file %rr      r   )
r    r!   sphinx.pycoder   for_filer   	find_tagsr^   r   r   )	r'   rM   rC   r   r   analyzertagsstartends	            r)   r   z$LiteralIncludeReader.pyobject_filter   s     <<##J/4%..t}}bAH%%'Dt# $R!S"*DMM!:"; < <N1%Ex.#C%!)C(E-$)!r+   c                J   | j                   j                  d      }|rt        |t                    }t	        fd|D              r.t
        j                  t        d      t              |fz  |       d| j                   v rO|d   t        fdt        |      D              r| xj                  |d   z  c_
        nt        t        d            |D cg c]  }|t              k  s|    c}g k(  r#t        t        d	      || j                  fz        S c c}w )
NrM   c              3  :   K   | ]  }|t              k\    y wr=   )r   r>   rs   rM   s     r)   rA   z4LiteralIncludeReader.lines_filter.<locals>.<genexpr>  s     5q1E
?5s   rv   rB   r   r   c              3  4   K   | ]  \  }}|z   |k(    y wr=   r9   )r>   rs   nfirsts      r)   rA   z4LiteralIncludeReader.lines_filter.<locals>.<genexpr>  s     F$!QuqyA~Fs   z8Cannot use "lineno-match" with a disjoint set of "lines"z2Line spec %r: no lines pulled from include file %r)r    r!   r   r   rH   rI   rJ   r   all	enumerater   r^   r   )r'   rM   rC   r   linelistr   r   s    `    @r)   r   z!LiteralIncludeReader.lines_filter  s    <<##G,#Hc%j9H5H55r"NO #E
H5 6@H  J - F)H2EFF%%!4%$R )9 &: ; ; (0B!1s5z>U1XBE{ $X!Y"*DMM!:"; < <  Cs   D ,D c                   d| j                   v r| j                   j                  d      }d}n.d| j                   v r| j                   j                  d      }d}nd }|rt        |      D ]e  \  }}||v sr0d| j                   v r| xj                  |dz   z  c_        ||dz   d  c S d| j                   v r| xj                  |z  c_        ||d  c S  du rt	        d|z        t	        d|z        |S )	Nr   Fr   Tr   r   z!start-after pattern not found: %szstart-at pattern not found: %s)r    r!   r   r   r^   )r'   rM   rC   r   	inclusiver   rO   s          r)   r   z!LiteralIncludeReader.start_filter(  s    %LL$$Z0EIdll*LL$$]3EIE )% 0 .D= )T\\9 --!;-$VaZ[11)T\\9 --7-$VW~-. D  !Du!LMM !AE!IJJr+   c                ^   d| j                   v r| j                   j                  d      }d}n.d| j                   v r| j                   j                  d      }d}nd }|rPt        |      D ]"  \  }}||v sr
|d |dz    c S |dk(  r|d | c S  du rt        d|z        t        d|z        |S )	Nr   Tr   Fr   r   zend-at pattern not found: %sz end-before pattern not found: %s)r    r!   r   r^   )r'   rM   rC   r   r   r   rO   s          r)   r   zLiteralIncludeReader.end_filterI  s     t||#,,""8,CIT\\),,""<0CIC )% 0 2$; $[fqj11!Q; #(&>12 D  !?#!EFF !Cc!IJJr+   c                j    | j                   j                  d      }|r|j                  d|dz          |S )Nr   r   rD   )r    r!   insert)r'   rM   rC   r   s       r)   r   z#LiteralIncludeReader.prepend_filterf  s2     ,,""9-LLGdN+r+   c                h    | j                   j                  d      }|r|j                  |dz          |S )NrL   rD   )r    r!   rL   )r'   rM   rC   rL   s       r)   r   z"LiteralIncludeReader.append_filtero  s0     !!(+LL$'r+   c                p    d| j                   v r't        || j                   j                  d      |      S |S )Nr@   rB   )r    rQ   r!   )r'   rM   rC   s      r)   r   z"LiteralIncludeReader.dedent_filterx  s3     t||#t||'7'7'AHUULr+   )r   r   r    dict[str, Any]r   r   r-   None)r-   r   r=   )r   r   rC   tuple[str, int] | Noner-   	list[str])rC   r   r-   ztuple[str, int])rC   r   r-   r   )rM   r   rC   r   r-   r   )r.   r/   r0   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   r+   r)   r   r      sC    5 AECC'=C	C$*" DH*@	( DH*@	6 DH*@	D DH*@	< DH*@	 DH*@	 DH*@	r+   r   c                     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Zy)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@   rl   rm   r   r   r(   r   r   r   rM   r   r   r   r   r   rL   rn   )r_   ro   rp   r   r   r   c                   | j                   j                  }|j                  j                  s(|j                  j                  d| j                        gS d| j                  v r:| j                  j                  | j                  d         \  }}|| j                  d<   	 | j                  j                  | j                        }| j                  j                  | j                  d         \  }}| j                  j                  |       t        || j                  | j                        }|j!                  |      \  }t#        j$                  |||      }	d| j                  v |	d<   | j'                  |	       | j                  j)                  d      rd|	d	<   n d	| j                  v r| j                  d	   |	d	<   d
| j                  v sd| j                  v sd| j                  v rd|	d
<   |	dxx   | j                  j)                  dg       z  cc<   i x}
|	d<   d| j                  v r{t+        | j                  d         }t-        fd|D              r2t.        j                  t1        d      | j                  d   fz  |       |D cg c]  }|k  s	|dz    c}|
d<   |j2                  |
d<   d| j                  v r-| j                  d   xs | j                  d   }t5        | |	|      }	| j7                  |	       |	gS c c}w # t8        $ r2}|j                  j                  || j                        gcY d }~S d }~ww xY w)NzFile insertion disabledrw   r   r   rB   rU   r   udiffr(   rl   rm   r   TrT   ro   rx   rn   c              3  (   K   | ]	  }|k\    y wr=   r9   r   s     r)   rA   z%LiteralInclude.run.<locals>.<genexpr>  s     4aqEz4ru   rv   r   ry   rz   r_   )rX   r{   settingsfile_insertion_enabledr   rJ   r   r    r$   
relfn2pathr}   r~   r   note_dependencyr   r   r   r   rS   r   r!   r   rH   rI   r   r   ri   r   	Exception)r'   r{   _pathrC   rel_filenamer   readerr   retnoder   ry   r   r_   r   rM   s                  @r)   r*   zLiteralInclude.run  s   ::&&  77%%--.G37;; . @ A A T\\!hh))$,,v*>?GAt#'DLL '	F))==dkkJH%)XX%8%89J%K"L(HH$$\2)(DLL$++NF ++x+8KD%$224hOG&$,,6GG  )||'&-
#t||+&*ll:&>
#T\\)^t||-K"dll2%)	"I$,,"2"27B"??577J!12 DLL0'5F(GO4844NN2&R#S$)4<<8I+J#K$L,4 # 6 :B)OAQY!a%)O
:&(.(;(;J}%DLL(,,y1FT^^A5F+D'7C MM'"9 *P  	F%%--c-DEE	Fs8   G*L 	
K?K?A#L ?L 	L?'L:4L?:L?Nr,   )r.   r/   r0   r1   r2   r3   r4   r5   r   r   r6   r   r   r   r   r   r   r8   r*   r9   r+   r)   r   r     su    K $,:?? 	 	
	
 	S 	J11 	 	J'' 	J11 	.. 	z44 	j33 	J11 	*// 	:00  	*//!" 	:88#$ ''(($$--+K 01Fr+   r   c                    t        j                  dt               t        j                  dt               t        j                  dt               t        j                  dt               ddddS )N	highlightz
code-block
sourcecodeliteralincludebuiltinT)versionparallel_read_safeparallel_write_safe)r   register_directiver   rk   r   )apps    r)   setupr     sX    !!+y9!!,	:!!,	:!!"2NC "# r+   r=   )rM   r   r@   z
int | NonerC   r   r-   r   )rc   r   rd   r   r_   r   r-   znodes.container)r   r   r-   r   )-
__future__r   r"   rE   difflibr   typingr   r   docutilsr   docutils.parsers.rstr   docutils.statemachiner	   sphinxr
   sphinx.directivesr   sphinx.localer   sphinx.utilr   r   sphinx.util.docutilsr   docutils.nodesr   r   sphinx.applicationr   sphinx.configr   sphinx.util.typingr   	getLoggerr.   rI   r   rQ   ri   rk   r   r   r   r9   r+   r)   <module>r	     s    " 
    %  + ,  *  - 0,)$-			8	$I I6 NR(4J&.2=@,P PfL L^TF_ TFn
r+   