3
PO[2                 @   s  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 yd dlmZ W n  ek
r   d dlmZ Y nX dd	lmZ dd
lmZ ddlmZ G dd deZejdjdjZejdjdejjZG dd deZdS )    )absolute_importN)datetime)partial)defaultdict)escape)StringIO   )Version)CCodeWriter   )Utilsc               @   s   e Zd Zd"ddZdd Zdd Zd#d	d
Zdd Zdd Ze	j
dZdjdj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 )(AnnotationCCodeWriterNTc             C   s   t j| |||d |d krZt | _d | _tttt| _tttt	| _
tttt| _n(|j| _|j| _|j
| _
|j| _|j| _d S )N)copy_formatting)r
   __init__r   annotation_bufferlast_annotated_posr   r   listannotationsstrcodesetscopes)selfcreate_frombufferr    r   h/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/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   t j| | | jj| d S )N)r
   writer   )r   sr   r   r   r   0   s    zAnnotationCCodeWriter.writec             C   s   |d k	rFt j| || | jrF| jjrF| j|d j |d  j| jj | jrz| j\}}}| j|j }||  | j	j
 7  < t | _	|| _d S )Nr   r   )r
   mark_pos	funcstatescoper   filenameaddr   r   r   getvaluer   )r   postracesource_descline_pos_coder   r   r   r    4   s    "zAnnotationCCodeWriter.mark_posc             C   s*   | j |d j |d  j|d |f d S )Nr   r   r   )r   r#   append)r   r&   itemr   r   r   annotateA   s    zAnnotationCCodeWriter.annotatec             C   s   | j g}x:tdD ].}dtdd|d    }|jd||f  qW yddlm} W n tk
rh   Y nX |j| jd d	j|S )
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intr,   pygments.formattersr0   ImportErrorget_style_defsjoin)r   cssicolorr0   r   r   r   _cssD   s    zAnnotationCCodeWriter._cssa  
        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       
      C   s   t j|}|j }W d Q R X | jj|i }t jtjj|}tjj	|d d }t
j|ddd}	|	j| j||||| W d Q R X 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_bufferr   r   r   save_annotationu   s    z%AnnotationCCodeWriter.save_annotationc             C   sl   d}|r"dj tjt|d d}tjdj | j tj|rFt	j
j|nd|dg}|rh|j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>
            )r9   	watermarkr#   	more_infoz'<p>Raw output: <a href="%s">%s</a></p>
)formatr   fromtimestampr4   textwrapdedentr<   r	   rV   rE   rF   rG   r,   )r   rQ   rL   coverage_timestampcoverage_infooutlistr   r   r   _save_annotation_header   s    
z-AnnotationCCodeWriter._save_annotation_headerc             C   s   dS )N</body></html>
)r`   r   )r   r   r   r   _save_annotation_footer   s    z-AnnotationCCodeWriter._save_annotation_footerc             C   s   |dk	r*|r*|j ddj }| j||}nd }}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
        NrU   r>   )rC   strip_get_line_coveragedictr   r   extendr_   _save_annotation_bodyra   r8   )r   r   rP   rQ   rL   rN   r\   covered_linesannotation_itemsr   r^   r   r   r   rK      s    z&AnnotationCCodeWriter._save_annotationc             C   s   d }x^|j dD ]P}|jds q|jd|ksDtjj|jd|krL|}P q|j|jdr|}qW |d krpd S tdd |j dD S )Nz.//classr#   c             s   s*   | ]"}t |jd t |jdfV  qdS )numberhitsN)r4   rC   ).0r)   r   r   r   	<genexpr>   s   z;AnnotationCCodeWriter._get_line_coverage.<locals>.<genexpr>z
lines/line)iterfindrC   rE   rF   abspathendswithrd   )r   rN   rL   coverage_dataentryr   r   r   rc      s    
z(AnnotationCCodeWriter._get_line_coveragec             C   s`   y(ddl m} ddlm} ddlm} W n tk
r@   t|S X |||ddd|dd}|S )	Nr   )	highlight)CythonLexer)r0   F)stripnlstripallT)nowrap)pygmentsrr   pygments.lexersrs   r5   r0   r6   html_escape)r   r   rr   rs   r0   	html_coder   r   r   _htmlify_code   s    
z#AnnotationCCodeWriter._htmlify_codec                s  dg}d}t dd dj D j}| jd   fdd}	| j|j }
ttt|
}|s^d }x0t|
dD ] \}}y|| }W n t	k
r   d	}Y n.X t
||}|j|r|t|d  }t|}|  t|	|}d
 d  d d    d   d  }|r| j}d}nd	}d}d	}|d k	rR||krR|| }|d k	rR|rNdnd}|jdj||||||j |d |rl|jdj|||d qlW |jd |S )Nz<div class="cython">u
   /* … */
c             s   s   | ]}|d fV  qdS )r   Nr   )rk   namer   r   r   rl      s    z>AnnotationCCodeWriter._save_annotation_body.<locals>.<genexpr>zGrefnanny trace py_macro_api py_c_api pyx_macro_api pyx_c_api error_gotoc                s(   | j } |  d7  < d|| j|f S )Nr   z<span class='%s'>%s</span>)	lastgroupgroup)match
group_name)callsr   r   r.      s    z=AnnotationCCodeWriter._save_annotation_body.<locals>.annotater   r>      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_widthr)   r   onclickz=<pre class='cython code score-{score} {covered}'>{code}</pre>)r   r   r   z</div>)rd   splitcopyr    r{   
splitlineslenr   	enumerateKeyError_replace_pos_comment
startswithry   _parse_code_onclick_attrr,   rX   rstrip)r   cython_coderP   rh   r   rg   r^   pos_comment_markernew_calls_mapr.   linesr   kr)   c_coder   r   r   r   rj   r   )r   r   rf      s^    




(


z+AnnotationCCodeWriter._save_annotation_body)NNT)T)N)N)NNN)N)__name__
__module____qualname__r   r   r   r    r.   r<   rZ   r[   r2   rX   replacer   rT   r_   ra   rK   rc   r{   rf   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 )N)styletexttagsize)r   r   r   r   r   r   r   r   r   3  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   )r   r   r   r   start9  s    zAnnotationItem.startc             C   s
   | j dfS )Nz</span>)r   )r   r   r   r   end<  s    zAnnotationItem.endN)r>   r   )r   r   r   r   r   r   r   r   r   r   r   1  s   
r   ) 
__future__r   rE   os.pathrerI   rZ   r   	functoolsr   collectionsr   xml.sax.saxutilsr   ry   r   r6   ior>   r	   Coder
   r   r   compiledecodesubr   Mr   objectr   r   r   r   r   <module>   s4     	

