
    Ae2                        d dl mZ d dlZd dlZd dlZd dlZd dl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  G d de      Z ej0                  dj3                  d            j4                  Z ej0                  dj3                  d      ej8                        j4                  Z G d de      Zy# e$ r	 d dlmZ Y w xY w)    )absolute_importN)datetime)partial)defaultdict)escape)StringIO   )Version)CCodeWriter   )Utilsc                       e Zd ZddZd Zd ZddZd Zd Z e	j                  d      Zd	j                  d
j                  dd            ZddZddZd ZddZd Zd ZddZy)AnnotationCCodeWriterNc                    t        j                  | |||       |}t               | _        d | _        t        t        t
        t                    | _        t        t        t
        t                    | _
        t        t        t
        t                    | _        y |j                  | _        |j                  | _        |j                  | _
        |j                  | _        |j                  | _        y )N)copy_formatting)r   __init__r   annotation_bufferlast_annotated_posr   r   listannotationsstrcodesetscopesselfcreate_frombufferr   s       8lib/python3.12/site-packages/Cython/Compiler/Annotate.pyr   zAnnotationCCodeWriter.__init__   s    T;X%-ZD"&*D#*7;+EFD#GK$=>DI%gk3&?@DK &1%B%BD"*66D#((DI%,,DK&1&D&DD#    c                     t        |||      S N)r   r   s       r   
create_newz AnnotationCCodeWriter.create_new-   s    $[&/JJr    c                 f    t        j                  | |       | j                  j                  |       y r"   )r   writer   )r   ss     r   r%   zAnnotationCCodeWriter.write0   s&    $"$$Q'r    c                    |~t        j                  | ||       | j                  r[| j                  j                  rE| j                  |d   j
                     |d      j                  | j                  j                         | j                  rN| j                  \  }}}| j                  |j
                     }||xx   | j                  j                         z  cc<   t               | _	        || _        y )Nr   r	   )r   mark_pos	funcstatescoper   filenameaddr   r   r   getvaluer   )r   postracesource_descline_pos_codes          r   r(   zAnnotationCCodeWriter.mark_pos4   s    ?  sE2~~$.."6"6CFOO,SV4889M9MN""#'#:#: Kqyy!5!56HTNd44==??N!)"%r    c                 p    | j                   |d   j                     |d      j                  |d   |f       y )Nr   r	   r   )r   r+   append)r   r.   items      r   annotatezAnnotationCCodeWriter.annotateA   s4    Q)#a&188#a&$Hr    c                 .   | j                   g}t        d      D ]/  }dt        dd|dz  z   z        z  }|j                  d||fz         1 	 ddlm} |j                   |       j                  d             d	j                  |      S # t        $ r Y w xY w)
z2css template will later allow to choose a colormap   zFFFF%02xr	   g      $@z).cython.score-%d {background-color: #%s;}r   HtmlFormatterz.cython
)	_css_templaterangeintr5   pygments.formattersr;   get_style_defsImportErrorjoin)r   cssicolorr;   s        r   _csszAnnotationCCodeWriter._cssD   s    !!"s 	QA#c1QtV8n"55EJJBaZOP	Q	B9 JJ}55i@Ayy~	  		s   B 	BBa  
        body.cython { font-family: courier; font-size: 12; }

        .cython.tag  {  }
        .cython.line { margin: 0em }
        .cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }

        .cython.line .run { background-color: #B0FFB0; }
        .cython.line .mis { background-color: #FFB0B0; }
        .cython.code.run  { border-left: 8px solid #B0FFB0; }
        .cython.code.mis  { border-left: 8px solid #FFB0B0; }

        .cython.code .py_c_api  { color: red; }
        .cython.code .py_macro_api  { color: #FF7000; }
        .cython.code .pyx_c_api  { color: #FF3000; }
        .cython.code .pyx_macro_api  { color: #FF7000; }
        .cython.code .refnanny  { color: #FFA000; }
        .cython.code .trace  { color: #FFA000; }
        .cython.code .error_goto  { color: #FFA000; }

        .cython.code .coerce  { color: #008000; border: 1px dotted #008000 }
        .cython.code .py_attr { color: #FF0000; font-weight: bold; }
        .cython.code .c_attr  { color: #0000FF; }
        .cython.code .py_call { color: #FF0000; font-weight: bold; }
        .cython.code .c_call  { color: #0000FF; }
    z onclick="{0}"zg(function(s){    s.display =  s.display === 'block' ? 'none' : 'block'})(this.nextElementSibling.style)  c           
          t        j                  |      5 }|j                         }d d d        | j                  j	                  |i       }t        j
                  t        j                  j                  |            }t        j                  j                  |      d   dz   }t        j                  |dd      5 }	|	j                  | j                  ||||             d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   z.htmlwzUTF-8)encoding)r   open_source_filereadr   getdecode_filenameospathbasenamesplitextcodecsopenr%   _save_annotation)
r   source_filenametarget_filenamecoverage_xmlfr   generated_codec_filehtml_filename
out_buffers
             r   save_annotationz%AnnotationCCodeWriter.save_annotationu   s    ##O4 	668D	;&&rww'7'7'HI((9!<wF[[g> 	q*T224Q`bnop	q 	q	 		q 	qs   C(:%C4(C14C=c                 p   d}|r1dj                  t        j                  t        |      dz              }t	        j
                  d      j                  | j                         t        j                  |rt        j                  j                  |      nd|      g}|r|j                  d|d|d	       |S )
NrI   z$ with coverage data from {timestamp}i  )	timestampa              <!DOCTYPE html>
            <!-- Generated by Cython {watermark} -->
            <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <title>Cython: {filename}</title>
                <style type="text/css">
                {css}
                </style>
            </head>
            <body class="cython">
            <p><span style="border-bottom: solid 1px grey;">Generated by Cython {watermark}</span>{more_info}</p>
            <p>
                <span style="background-color: #FFFF00">Yellow lines</span> hint at Python interaction.<br />
                Click on a line that starts with a "<code>+</code>" to see the C code that Cython generated for it.
            </p>
            )rD   	watermarkr+   	more_infoz<p>Raw output: <a href="z">z	</a></p>
)formatr   fromtimestampr?   textwrapdedentrG   r
   rc   rQ   rR   rS   r5   )r   r]   rX   coverage_timestampcoverage_infooutlists         r   _save_annotation_headerz-AnnotationCCodeWriter._save_annotation_header   s    CJJ"005G1HD1PQ K SM OO  " DIIK73D3DFU!1!1/!B[]"/  1%
, NN&RXYZr    c                      y)N)z</body></html>
 r   s    r   _save_annotation_footerz-AnnotationCCodeWriter._save_annotation_footer   s    %r    c           	         |5|r3|j                  dd      j                         }| j                  ||      }ndx}}t        | j                  |         }t        | j
                  |         }	g }
|
j                  | j                  |||             |
j                  | j                  ||||	|             |
j                  | j                                dj                  |
      S )a#  
        lines : original cython source code split by lines
        generated_code : generated c code keyed by line number in original file
        target filename : name of the file in which to store the generated html
        c_file : filename in which the c_code has been written
        Nrb   rI   )rO   strip_get_line_coveragedictr   r   extendrl   _save_annotation_bodyrp   rC   )r   r   r\   r]   rX   rZ   ri   covered_linesannotation_itemsr   rk   s              r   rW   z&AnnotationCCodeWriter._save_annotation   s     #!-!1!1+r!B!H!H!J 33L/RM155 0 0 ABdkk/23t33FOM_`at11$HXZ`bopqt3356wwwr    c                 v   d }|j                  d      D ]  }|j                  d      s|j                  d      |k(  s1t        j                  j	                  |j                  d            |k(  r|} n%|j                  |j                  d            s|} |y t        d |j                  d      D              S )Nz.//classr+   c              3      K   | ]8  }t        |j                  d             t        |j                  d            f : yw)numberhitsN)r?   rO   ).0r1   s     r   	<genexpr>z;AnnotationCCodeWriter._get_line_coverage.<locals>.<genexpr>   s9      
 (#$c$((6*:&;<
s   >A z
lines/line)iterfindrO   rQ   rR   abspathendswithrt   )r   rZ   rX   coverage_dataentrys        r   rs   z(AnnotationCCodeWriter._get_line_coverage   s    !**:6 	&E99Z(		*%8GGOOEIIj$9:oM % ))%))J*?@ %	&   
%..|<
 
 	
r    c                     	 ddl m} ddlm} ddlm}  || |dd       |d            }|S # t        $ r t        |      cY S w xY w)	Nr   )	highlight)CythonLexerr:   F)stripnlstripallT)nowrap)pygmentsr   pygments.lexersr   r@   r;   rB   html_escape)r   r   r   r   r;   	html_codes         r   _htmlify_codez#AnnotationCCodeWriter._htmlify_code   sT    	%*39
 +ee<&(	   	%t$$	%s   / AAc                 `   dg}d}t        d dj                         D              j                  }| j                  d        fd}	| j	                  |      j                         }
t        t        t        |
                  }|sd }t        |
d      D ]  \  }}	 ||   }t        ||      }|j                  |      r|t        |      d  }t        |      } |       t        |	|      }dd	   z  d
d   z  z   d   z   d   z   }|r| j                  }d}nd}d}d}|||v r||   }||rdnd}|j                  dj!                  ||||||j#                         |             |s|j                  dj!                  |||              |j                  d       |S # t        $ r d}Y w xY w)Nz<div class="cython">u
   /* … */
c              3   $   K   | ]  }|d f 
 yw)r   Nrn   )r}   names     r   r~   z>AnnotationCCodeWriter._save_annotation_body.<locals>.<genexpr>   s      
T1I
s   zGrefnanny trace py_macro_api py_c_api pyx_macro_api pyx_c_api error_gotoc                 f    | j                   }|xx   dz  cc<   d|d| j                  |      dS )Nr	   z<span class=''></span>)	lastgroupgroup)match
group_namecallss     r   r7   z=AnnotationCCodeWriter._save_annotation_body.<locals>.annotate   s4    J*"EKK
35 5r    r	   rI      py_c_apir   	pyx_c_apipy_macro_apipyx_macro_api+z&#xA0;runmisz<pre class="cython line score-{score}"{onclick}>{expandsymbol}<span class="{covered}">{line:0{lineno_width}d}</span>: {code}</pre>
)scoreexpandsymbolcoveredlineno_widthr1   r   onclickz=<pre class='cython code score-{score} {covered}'>{code}</pre>)r   r   r   z</div>)rt   splitcopyr(   r   
splitlineslenr   	enumerate_replace_pos_comment
startswithr   KeyError_parse_code_onclick_attrr5   re   rstrip)r   cython_coder\   rx   r   rw   rk   pos_comment_markernew_calls_mapr7   linesr   kr1   c_coder   r   r   r   r|   r   s                       @r   rv   z+AnnotationCCodeWriter._save_annotation_body   s   *+? 
U[[]
 
 $ 	
 	d	5 "";/::<3s5z?+ M * ,	@GAt-'* ..@&I$$%78#C(:$;$<=F$V,!OE 62Fz**Q{1C-CC>*+-2?-CDE ,,"'G(Q--?$Q'#'+eGNNh iohn!-#!-# io i	 _ffv  g  ? @W,	@Z 	y!W  s   FF-,F-)NNT)Tr"   )NNN)__name__
__module____qualname__r   r#   r%   r(   r7   rG   rg   rh   r=   re   replacer   r`   rl   rp   rW   rs   r   rv   rn   r    r   r   r      s    E&K(&I $HOO % 	M8 %++	, '#r
	Mq@& *
$Cr    r   sm  (?P<refnanny>__Pyx_X?(?:GOT|GIVE)REF|__Pyx_RefNanny[A-Za-z]+)|(?P<trace>__Pyx_Trace[A-Za-z]+)|(?:(?P<pyx_macro_api>__Pyx_[A-Z][A-Z_]+)|(?P<pyx_c_api>(?:__Pyx_[A-Z][a-z_][A-Za-z_]*)|__pyx_convert_[A-Za-z_]*)|(?P<py_macro_api>Py[A-Z][a-z]+_[A-Z][A-Z_]+)|(?P<py_c_api>Py[A-Z][a-z]+_[A-Z][a-z][A-Za-z_]*))(?=\()|(?P<error_goto>(?:(?<=;) *if [^;]* +)?__PYX_ERR\([^)]+\))asciis)   ^\s*/\*(?:(?:[^*]|\*[^/])*\n)+\s*\*/\s*\nc                        e Zd ZddZd Zd Zy)AnnotationItemc                 <    || _         || _        || _        || _        y r"   )styletexttagsize)r   r   r   r   r   s        r   r   zAnnotationItem.__init__3  s    
		r    c                 T    d| j                   d| j                  d| j                  S )Nz<span class='cython tag z	' title='r   )r   r   r   ro   s    r   startzAnnotationItem.start9  s    ?Czz499VZV^V^__r    c                     | j                   dfS )Nr   )r   ro   s    r   endzAnnotationItem.end<  s    yy*$$r    N)rI   r   )r   r   r   r   r   r   rn   r    r   r   r   1  s    `%r    r   ) 
__future__r   rQ   os.pathrerU   rg   r   	functoolsr   collectionsr   xml.sax.saxutilsr   r   r   rB   iorI   r
   Coder   r   r   compiledecodesubr   Mr   objectr   rn   r    r   <module>r      s    ' 	  	     # 2!   BK BJ bjjB 	&/
 3  "rzz188ADD #	 %V %C	  s   C CC