
    -Phl4                     p   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j        d                    d                    j        Z ej        d                    d          ej                  j        Z G d d          ZdS )    N)datetime)partial)defaultdict)escape)StringIO   )Version)CCodeWriter   )Utilsc                       e Zd ZdZddZd Zd ZddZd	 Zd
 Z	 e
j        d          Zd                    d                    dd                    ZddZddZd ZddZd Zd ZddZdS )AnnotationCCodeWriterzComplete cythonized codeNTFc                     t          j        | |||           || _        |t                      | _        d | _        t          t          t          t                              | _	        t          t          t          t                              | _        t          t          t          t                              | _        d S |j        | _        |j	        | _	        |j        | _        |j        | _        |j        | _        d S )N)copy_formatting)r
   __init__show_entire_c_coder   annotation_bufferlast_annotated_posr   r   listannotationsstrcodesetscopes)selfcreate_frombufferr   r   source_descs         X/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/Cython/Compiler/Annotate.pyr   zAnnotationCCodeWriter.__init__   s    T;XXXX"4%-ZZD"&*D#*7;+E+EFFD#GK$=$=>>DI%gk3&?&?@@DKKK &1%BD"*6D#(DI%,DK&1&DD###    c                 $    t          |||          S N)r   )r   r   r   r   s       r   
create_newz AnnotationCCodeWriter.create_new-   s    $[&/JJJr    c                 n    | j                             |           | j                            |           d S r"   )r   writer   )r   ss     r   _write_to_bufferz&AnnotationCCodeWriter._write_to_buffer0   s5    !$$Q'''''r    c                    |jt          j        | ||           | j        rM| j        j        rA| j        |d         j                 |d                                      | j        j                   | j        rD| j        \  }}}| j        |j                 }||xx         | j	        
                                z  cc<   t                      | _	        || _        d S )Nr   r   )r
   mark_pos	funcstatescoper   filenameaddr   r   r   getvaluer   )r   postracer   line_pos_codes          r   r)   zAnnotationCCodeWriter.mark_pos4   s    ? sE222~ O$."6 OCFO,SV4889MNNN" 	@#'#: Kqy!56HTNNNd4==???NNN!)"%r    c                     | j         |d         j                 |d                                      |d         |f           d S )Nr   r   r   )r   r,   append)r   r/   items      r   annotatezAnnotationCCodeWriter.annotateA   s;    Q)#a&188#a&$HHHHHr    c                 \   | j         g}t          d          D ]8}t          dd|dz  z   z            }|                    d|dd|dd	           9	 d
dlm} |                     |                                d                     n# t          $ r Y nw xY wd                    |          S )z2css template will later allow to choose a colormap   g     o@g      ?g      $@z.cython.score-dz {background-color: #FFFF02xz;}r   HtmlFormatterz.cython
)	_css_templaterangeintr5   pygments.formattersr=   get_style_defsImportErrorjoin)r   cssicolor_shader=   s        r   _csszAnnotationCCodeWriter._cssD   s    !"s 	] 	]Aeaf566KJJ[[[[{[[[[\\\\	B999999 JJ}}55i@@AAAA  	 	 	D	 yy~~s   B	 	
BBa  
        body.cython { font-family: courier; font-size: 12; }

        .cython.tag  {  }
        .cython.line { color: #000000; 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="{}"zg(function(s){    s.display =  s.display === 'block' ? 'none' : 'block'})(this.nextElementSibling.style)  c           
      &   t          j        |          5 }|                                }d d d            n# 1 swxY w Y   | j                            |i           }t          j        t          j                            |                    }t          j        	                    |          d         dz   }t          j        |dd          5 }	|	                    |                     |||||                     d d d            d S # 1 swxY w Y   d S )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4 	6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	;;&rw'7'7'H'HII((99!<wF[g>>> 	q*T224Q`bnooppp	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	q 	qs   6::-DD
D
c                    d}|r8d                     t          j        t          |          dz                      }t	          j        d                               |                                 t          j        |rt          j
                            |          nd|          g}|r|                    d|d|d	           |S )
NrK   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>
            )rF   	watermarkr,   	more_infoz<p>Raw output: <a href="">z	</a></p>
)formatr   fromtimestamprA   textwrapdedentrI   r	   re   rS   rT   rU   r5   )r   r_   rZ   coverage_timestampcoverage_infooutlists         r   _save_annotation_headerz-AnnotationCCodeWriter._save_annotation_header   s     	SBII"05G1H1HD1PQQ J S SM O   " DIIKK73DFU!]!1!1/!B!B!B[]"/  1 1%
,  	ZNNNQWQWQWXYYYr    c                     dS )N)z</body></html>
 r   s    r   _save_annotation_footerz-AnnotationCCodeWriter._save_annotation_footer   s    $$r    c           	          |A|r?|                     dd                                          }|                     ||          }ndx}}t          | j        |                   }t          | j        |                   }	g }
|
                    |                     |||                     |
                    |                     ||||	|                     |
                    | 	                                           d
                    |
          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
        Nrd   rK   )rQ   strip_get_line_coveragedictr   r   extendro   _save_annotation_bodyrs   rE   )r   r   r^   r_   rZ   r\   rl   covered_linesannotation_itemsr   rn   s              r   rY   z&AnnotationCCodeWriter._save_annotation   s    ##!-!1!1+r!B!B!H!H!J!J 33L/RRMM155 0 ABBdk/233t33FOM_``aaat11$HXZ`boppqqqt3355666wwwr    c                    d }|                     d          D ]}|                    d          s|                    d          |k    s6t          j                            |                    d                    |k    r|} n+|                    |                    d                    r|}|d S d |                     d          D             S )Nz.//classr,   c                     i | ]E}t          |                    d                     t          |                    d                    FS )numberhits)rA   rQ   ).0r1   s     r   
<dictcomp>z<AnnotationCCodeWriter._get_line_coverage.<locals>.<dictcomp>   sR     
 
 
 ""##S&)9)9%:%:
 
 
r    z
lines/line)iterfindrQ   rS   rT   abspathendswith)r   r\   rZ   coverage_dataentrys        r   rv   z(AnnotationCCodeWriter._get_line_coverage   s    !**:66 	& 	&E99Z(( 		*%%88GOOEIIj$9$9::oMM % ))%))J*?*?@@ & % 4
 
%..|<<
 
 
 	
r    c                    	 ddl m} ddlm}m} ddlm} n# t          $ r t          |          cY S w xY w|dk    r |dd          }n#|dk    r |dd          }nt          |          S  ||| |d	
                    }|S )Nr   )	highlight)CythonLexerCppLexerr<   cythonF)stripnlstripallc/cppT)nowrap)	pygmentsr   pygments.lexersr   r   rB   r=   rD   html_escape)	r   r   languager   r   r   r=   lexer	html_codes	            r   _htmlify_codez#AnnotationCCodeWriter._htmlify_code   s    	%******========9999999 	% 	% 	%t$$$$$	% xK>>>EE  HUU;;;EE t$$$I%M&&&( (	 s    33c                    dg}d}d d                                 D             j        }|                     d            fd}	|                     |d                                          }
t          t          t          |
                              }|sd }t          |
d          D ]8\  }}	 ||         }t          ||          }|	                    |          r|t          |          d          }t          |          }n# t          $ r d}Y nw xY w |            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}|                    d| d| d| d| d|d| dd|                                 d           |r|                    d| d| d| d           :|                    d            | j        r[|                     | j                                        d!          }|                    d"| j         d#t&          j         d$| d%           |S )&Nz<div class="cython">u
   /* … */
c                     i | ]}|d S )r   rq   )r   names     r   r   z?AnnotationCCodeWriter._save_annotation_body.<locals>.<dictcomp>   s'     
 
 
D!
 
 
r    zGrefnanny trace py_macro_api py_c_api pyx_macro_api pyx_c_api error_gotoc                 j    | j         }|xx         dz  cc<   d| d|                     |           dS )Nr   z<span class=''></span>)	lastgroupgroup)match
group_namecallss     r   r7   z=AnnotationCCodeWriter._save_annotation_body.<locals>.annotate   sK    J*"Q:QQZ1H1HQQQQr    r   r   rK      py_c_apir   	pyx_c_apipy_macro_apipyx_macro_api+z&#xA0;runmisz<pre class="cython line score-">z<span class="rg   0r:   z	</span>: z</pre>
z<pre class='cython code score-rJ   r   z</pre>z</div>r   z/<p><div class="cython"><pre class='cython line'z>+ z </pre>
<pre class='cython code'>z</pre></div></p>)splitcopyr)   r   
splitlineslenr   	enumerate_replace_pos_comment
startswithr   KeyError_parse_code_onclick_attrr5   rstripr   r   r.   r   COMPLETE_CODE_TITLE)r   cython_coder^   r{   r   rz   rn   pos_comment_markernew_calls_mapr7   lineslineno_widthkr1   c_codescoreonclickexpandsymbolcoveredr   complete_code_as_htmlr   s                        @r   ry   z+AnnotationCCodeWriter._save_annotation_body   s   )*>
 
U[[]]
 
 
  	
 	d	R 	R 	R 	R 	R
 "";99DDFF3s5zz??++ 	! M ** $	c $	cGAt-'* ..@&II$$%788 >#C(:$;$;$<$<=F$V,,     "MOOE 622Fz**Q{1C-CC>*+-2?-CDE  (,"'G(Q--?-?$Q'#'+6eeGNNn n n n n  n n /6n n :;n >Jn nmn n W[VaVaVcVcn n n    caaaaaSYaaabbbx    " 	$($6$6t{7K7K7M7Mw$W$W!NN+/+= BWBk ,A     s   0DDD)NNTFN)Tr"   )NNN)__name__
__module____qualname__r   r   r#   r'   r)   r7   rI   rj   rk   r?   rh   replacer   rb   ro   rs   rY   rv   r   ry   rq   r    r   r   r      sY        5E E E E(K K K( ( (& & & &I I I   $HO % 	 	M8 $**	, '#r

	 Mq q q q   @% % %       *
 
 
$  *E E E E E E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dS )AnnotationItemrK   r   c                 >    || _         || _        || _        || _        d S r"   )styletexttagsize)r   r   r   r   r   s        r   r   zAnnotationItem.__init__<  s"    
				r    c                 6    d| j         d| j        d| j        S )Nz<span class='cython tag z	' title='r   )r   r   r   rr   s    r   startzAnnotationItem.startB  s$     >Bjjj$)))UYU]U]^^r    c                     | j         dfS )Nr   )r   rr   s    r   endzAnnotationItem.endE  s    y)##r    N)rK   r   )r   r   r   r   r   r   rq   r    r   r   r   :  sI           _ _ _$ $ $ $ $r    r   )rS   os.pathrerW   rj   r   	functoolsr   collectionsr   xml.sax.saxutilsr   r   ior   rK   r	   Coder
   r   r   compiledecodesubr   Mr   r   rq   r    r   <module>r      s   
			  				               # # # # # # 2 2 2 2 2 2                        O O O O OK O O Od bjB 	&//
 
   "rz188AAD  	 $ $ $ $ $ $ $ $ $ $r    