o
    j4                     @   s   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 deZeddjZeddejjZG dd dZdS )    N)datetime)partial)defaultdict)escape)StringIO   )Version)CCodeWriter   )Utilsc                   @   s   e Zd ZdZd$ddZdd Zd	d
 Zd%ddZdd Zdd Z	e
dZddddZd&ddZd&ddZdd Zd'ddZdd Zd d! Zd&d"d#ZdS )(AnnotationCCodeWriterzComplete cythonized codeNTFc                 C   s   t j| |||d || _|d u r1t | _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_desc r   Y/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/Cython/Compiler/Annotate.pyr      s   zAnnotationCCodeWriter.__init__c                 C   s   t |||S N)r   )r   r   r   r   r   r   r   
create_new,   s   z AnnotationCCodeWriter.create_newc                 C   s   | j | | j| d S r   )r   writer   )r   sr   r   r   _write_to_buffer/   s   z&AnnotationCCodeWriter._write_to_bufferc                 C   s   |d ur#t | || | jr#| jjr#| j|d j |d  | jj | jr=| j\}}}| j|j }||  | j	
 7  < t | _	|| _d S )Nr   r   )r	   mark_posZ	funcstatescoper   filenameaddr   r   r   getvaluer   )r   postracer   line_Zpos_coder   r   r   r#   3   s   "
zAnnotationCCodeWriter.mark_posc                 C   s*   | j |d j |d  |d |f d S )Nr   r   r
   )r   r%   append)r   r(   itemr   r   r   annotate@   s   *zAnnotationCCodeWriter.annotatec                 C   s   | j g}tdD ]}tdd|d   }|d|dd|dd	 qzd
dlm} W n	 ty4   Y n
w || d 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intr,   pygments.formattersr3   ImportErrorZget_style_defsjoin)r   cssiZcolor_shader3   r   r   r   _cssC   s   
zAnnotationCCodeWriter._cssa  
        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="{}"u   (function(f, s, c) {    c = f.nodeValue == '+';    s.display = c ? 'block' : 'none';    f.nodeValue = c ? '−' : '+'})(this.firstChild, this.nextElementSibling.style)  c           
   
   C   s   t |}| }W d    n1 sw   Y  | j|i }t tj|}tj	|d d }t
|ddd}	|	| ||||| W d    d S 1 sRw   Y  d S )Nr   z.htmlwzUTF-8)encoding)r   Zopen_source_filereadr   getZdecode_filenameospathbasenamesplitextopenr    _save_annotation)
r   source_filenameZtarget_filenamecoverage_xmlfr   generated_codec_fileZhtml_filenameZ
out_bufferr   r   r   save_annotationw   s   
"z%AnnotationCCodeWriter.save_annotationc                 C   sl   d}|rdj tt|d d}tdj |  tj|r#t	j
|nd|dg}|r4|d||f  |S )Nr?   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>
            )r;   	watermarkr%   Z	more_infoz'<p>Raw output: <a href="%s">%s</a></p>
)formatr   fromtimestampr7   textwrapdedentr=   r   rQ   rD   rE   rF   r,   )r   rN   rJ   coverage_timestampZcoverage_infooutlistr   r   r   _save_annotation_header   s   z-AnnotationCCodeWriter._save_annotation_headerc                 C   s   dS )N)z</body></html>
r   r   r   r   r   _save_annotation_footer   s   z-AnnotationCCodeWriter._save_annotation_footerc              	   C   s   |dur|r| dd }| ||}nd }}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
        NrP   r?   )rC   strip_get_line_coveragedictr   r   extendrX   _save_annotation_bodyrZ   r:   )r   r   rM   rN   rJ   rK   rV   covered_linesannotation_itemsr   rW   r   r   r   rI      s   
z&AnnotationCCodeWriter._save_annotationc                 C   s   d }| dD ](}|dsq|d|ks!tj|d|kr%|} n||dr/|}q|d u r6d S dd | dD S )Nz.//classr%   c                 S   s&   i | ]}t |d t |dqS )numberhits)r7   rC   ).0r*   r   r   r   
<dictcomp>   s    z<AnnotationCCodeWriter._get_line_coverage.<locals>.<dictcomp>z
lines/line)ZiterfindrC   rD   rE   abspathendswith)r   rK   rJ   Zcoverage_dataentryr   r   r   r\      s    
z(AnnotationCCodeWriter._get_line_coveragec           	      C   s   zddl m} ddlm}m} ddlm} W n ty#   t| Y S w |dkr/|ddd}n|dkr:|ddd}nt|S ||||d	d
}|S )Nr   )	highlight)CythonLexerCppLexerr2   cythonF)stripnlstripallc/cppT)Znowrap)	pygmentsri   Zpygments.lexersrj   rk   r8   r3   r9   html_escape)	r   r   languageri   rj   rk   r3   lexerZ	html_coder   r   r   _htmlify_code   s"   z#AnnotationCCodeWriter._htmlify_codec                    s  dg}d}dd d  D j}| d   fdd}	| |d }
ttt|
}|s.d }t|
d	D ]\}}z|| }W n tyH   d
}Y nw t	||}|
|r[|t|d  }t|}|  t|	|}d d  d d    d   d  }|r| j}d}nd
}d}d
}|d ur||v r|| }|d ur|rdnd}|d| d| d| d| d|d| dd|  d |r|d| d| d | d! q3|d" | jr| | j d#}|d$| j d%tj d&| d' |S )(Nz<div class="cython">u
   /* … */
c                 S   s   i | ]}|d qS )r   r   )rd   namer   r   r   re      s    z?AnnotationCCodeWriter._save_annotation_body.<locals>.<dictcomp>zGrefnanny trace py_macro_api py_c_api pyx_macro_api pyx_c_api error_gotoc                    s.   | j } |  d7  < d| d| | dS )Nr   z<span class=''></span>)	lastgroupgroup)match
group_nameZcallsr   r   r.      s   z=AnnotationCCodeWriter._save_annotation_body.<locals>.annotaterl   r   r?      Zpy_c_apir
   Z	pyx_c_apiZpy_macro_apiZpyx_macro_api+z&#xA0;runZmisz<pre class="cython line score-">z<span class="z">0r0   z	</span>: z</pre>
z<pre class='cython code score-r>   rv   z</pre>z</div>ro   z/<p><div class="cython"><pre class='cython line'z>+ z </pre>
<pre class='cython code'>z</pre></div></p>)splitcopyr#   rt   
splitlineslenr   	enumerateKeyError_replace_pos_comment
startswithrq   _parse_code_onclick_attrr,   rstripr   r   r'   r   COMPLETE_CODE_TITLE)r   Zcython_coderM   ra   r   r`   rW   Zpos_comment_markerZnew_calls_mapr.   lineslineno_widthkr*   Zc_codeZscoreZonclickZexpandsymbolZcoveredrc   Zcomplete_code_as_htmlr   r|   r   r_      s   




z+AnnotationCCodeWriter._save_annotation_body)NNTFN)Tr   )NNN)__name__
__module____qualname__r   r   r   r"   r#   r.   r=   rT   rU   r5   rR   replacer   rO   rX   rZ   rI   r\   rt   r_   r   r   r   r   r      s(    






 
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                   @   s&   e Zd Zd
ddZdd Zdd Zd	S )AnnotationItemr?   r   c                 C   s   || _ || _|| _|| _d S r   )styletexttagsize)r   r   r   r   r   r   r   r   r   >  s   
zAnnotationItem.__init__c                 C   s   d| j | j| jf S )Nz)<span class='cython tag %s' title='%s'>%s)r   r   r   rY   r   r   r   startD  s   zAnnotationItem.startc                 C   s
   | j dfS )Nrw   )r   rY   r   r   r   endG  s   
zAnnotationItem.endN)r?   r   )r   r   r   r   r   r   r   r   r   r   r   <  s    
r   )rD   Zos.pathrerT   r   	functoolsr   collectionsr   Zxml.sax.saxutilsr   rq   ior   r?   r   ZCoder	   r   r   compiledecodesubr   Mr   r   r   r   r   r   <module>   s8     	
