U
    +ifZ                     @  s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ G dd dZG dd deZdS )z,
Module for formatting output data in HTML.
    )annotations)dedent)AnyIterableMappingcast)
get_option)lib)
MultiIndexoption_context)is_url)DataFrameFormatterget_level_lengths)pprint_thingc                
   @  s  e Zd ZdZdZdLddddd	d
dddZddddZddddZedd Z	ed	dddZ
ed	dddZeddddZdddd Zed	dd!d"Zeddd#d$ZdMd&dd
d'd(d)ZdNd&d	ddd
d*d+d,ZdOd&ddd
d-d.d/ZdPd&dddd
d1d2d3ZdQdddd	dd4dd
d5d6d7ZdRdd
d8d9d:Zdd
d8d;d<Zdd
d8d=d>Zdd
d8d?d@ZdAddBdCZdd
d8dDdEZdFdd
dGdHdIZdFdd
dGdJdKZdS )SHTMLFormatterac  
    Internal class for formatting output data in html.
    This class is intended for shared functionality between
    DataFrame.to_html() and DataFrame._repr_html_().
    Any logic in common with other output formatting methods
    should ideally be inherited from classes in format.py
    and this class responsible for only producing html markup.
       NFr   z(str | list[str] | tuple[str, ...] | Nonez
int | Nonez
str | NoneboolNone)	formatterclassesbordertable_idrender_linksreturnc                 C  s   || _ || _| j j| _| j jj| _g | _| j j| _| j j| _| j j| _|d kr\t	t
td}|| _|| _|| _dd | j j D | _d S )Nzdisplay.html.borderc                 S  s*   i | ]"\}}|t |tr"| d n|qS )Zpx)
isinstanceint).0columnvalue r   I/home/mars/bis/venv/lib/python3.8/site-packages/pandas/io/formats/html.py
<dictcomp>B   s    z*HTMLFormatter.__init__.<locals>.<dictcomp>)fmtr   frametr_framecolumnselements	bold_rowsescapeZshow_dimensionsr   r   r   r   r   r   	col_spaceitems)selfr   r   r   r   r   r   r   r    __init__+   s     




zHTMLFormatter.__init__strr   c                 C  s2   |   }tdd |D r(dd |D }d|S )Nc                 s  s   | ]}t |tV  qd S N)r   r-   r   xr   r   r    	<genexpr>I   s     z*HTMLFormatter.to_string.<locals>.<genexpr>c                 S  s   g | ]}t |qS r   )r-   r0   r   r   r    
<listcomp>J   s     z+HTMLFormatter.to_string.<locals>.<listcomp>
)renderanyjoin)r+   linesr   r   r    	to_stringG   s    zHTMLFormatter.to_string	list[str]c              	   C  sH   |    | jrBtd}| dt| j d| dt| jj d | jS )N   z<p>z rows  z columns</p>)_write_tableshould_show_dimensionschrwritelenr#   r%   r&   )r+   Zbyr   r   r    r5   M   s    $zHTMLFormatter.renderc                 C  s   | j jS r/   )r"   r>   r+   r   r   r    r>   X   s    z$HTMLFormatter.should_show_dimensionsc                 C  s   | j jS r/   )r"   show_row_idx_namesrB   r   r   r    rC   \   s    z HTMLFormatter.show_row_idx_namesc                 C  s   | j jS r/   )r"   show_col_idx_namesrB   r   r   r    rD   `   s    z HTMLFormatter.show_col_idx_namesr   c                 C  s    | j jr| jjjS | jrdS dS )N   r   )r"   indexr#   nlevelsrD   rB   r   r   r    
row_levelsd   s
    
zHTMLFormatter.row_levelsr   c                 C  s   | j S r/   )r%   rB   r   r   r    _get_columns_formatted_valuess   s    z+HTMLFormatter._get_columns_formatted_valuesc                 C  s   | j jS r/   )r"   is_truncatedrB   r   r   r    rJ   v   s    zHTMLFormatter.is_truncatedc                 C  s   t | jjjS r/   )rA   r"   r$   r%   rB   r   r   r    ncolsz   s    zHTMLFormatter.ncolsr   r   )sindentr   c                 C  s    t |}| jd| |  d S )Nr<   )r   r&   append)r+   rL   rM   rsr   r   r    r@   ~   s    zHTMLFormatter.write)rL   headerrM   tagsr   c                 C  sH   | j |d}|r2|dk	r2|p d}|d| d7 }| j|d||d dS )a  
        Method for writing a formatted <th> cell.

        If col_space is set on the formatter then that is used for
        the value of min-width.

        Parameters
        ----------
        s : object
            The data to be written inside the cell.
        header : bool, default False
            Set to True if the <th> is for use inside <thead>.  This will
            cause min-width to be set if there is one.
        indent : int, default 0
            The indentation level of the cell.
        tags : str, default None
            Tags to include in the cell.

        Returns
        -------
        A written <th> cell.
        N zstyle="min-width: z;"thkindrM   rQ   )r)   get_write_cell)r+   rL   rP   rM   rQ   r)   r   r   r    write_th   s
    zHTMLFormatter.write_th)rL   rM   rQ   r   c                 C  s   | j |d||d d S )NtdrT   )rW   )r+   rL   rM   rQ   r   r   r    write_td   s    zHTMLFormatter.write_tdrY   )rL   rU   rM   rQ   r   c           
      C  s   |d k	rd| d| d}nd| d}| j r<dddd}ni }t||d }| jrt|rt|i d }|d	| d
7 }d}	nd}	| | | |	 d| d| d S )N<r<   >z&amp;z&lt;z&gt;)&r[   r\   )Zescape_charsz	<a href="z" target="_blank">z</a>rR   z</)r(   r   stripr   r   r@   )
r+   rL   rU   rM   rQ   Z	start_tagescrO   Zrs_unescapedZend_ar   r   r    rW      s    zHTMLFormatter._write_cellzdict[int, str] | None)linerM   indent_deltarP   alignrQ   nindex_levelsr   c                 C  s   |d kri }|d kr"|  d| n|  d| d| ||7 }t|D ]J\}}	||d }
|sl| jr||k r| j|	|||
d qF| j|	||
d qF||8 }|  d| d S )Nz<tr>z<tr style="text-align: z;">)rM   rP   rQ   )rQ   z</tr>)r@   	enumeraterV   r'   rX   rZ   )r+   r`   rM   ra   rP   rb   rQ   rc   irL   Zval_tagr   r   r    write_tr   s    
zHTMLFormatter.write_tr)rM   r   c              	   C  s   dg}t d}|s|d | jd k	rnt| jtr>| j | _t| jttfsbtdt	| j |
| j | jd kr~d}nd| j d}| d| j d	d
| d| d| | jjs| jr| || j  | || j  | d| d S )NZ	dataframezdisplay.html.use_mathjaxZtex2jax_ignorez.classes must be a string, list, or tuple, not rR   z id=""z<table border="z	" class="r<   r\   z</table>)r   rN   r   r   r-   splitlisttuple	TypeErrortypeextendr   r@   r   r7   r"   rP   rC   _write_headerra   _write_body)r+   rM   Z_classesZuse_mathjaxZ
id_sectionr   r   r    r=      s.    


zHTMLFormatter._write_tablec                 C  sV  | j j}t| jtrd}| j jr*tj}nd}| jj|ddd}t	||}t
|d }tt||D ]P\}\}	}
|r| j j}| j jr~i }t|	 D ]\}}||kr|||d < np|| |kr |d ||< ||kr|
d | d |
|d   }
n&|
d | |
|d  f |
|d   }
n|||< || |krd||< |
d | d |
|d   }
q|}	t
|d }||krd|	|< nfi }t|	 D ]*\}}||kr|||d < n|||< qd||< |}	|
d | dg |
|d   }
dg| jd  }| j js| jr<| j jr2| jj| }|t|p*d n
|d i }t
|}t|
D ]N\}}||	krP|	| dkr|j|	| d||< nqP|d7 }|| qP| j||| j|d	d
 qdndg| jd  }| j js| jr| j jr|| jjpd n
|d ||   | j j}|r<| j| j j }||d | j||| jd	|d d S )Nz colspan="{span:d}" halign="left"FsparsifyZadjoinnamesrE   )...rs   rR   spanT)rQ   rP   )rP   rb   )r"   is_truncated_horizontallyr   r%   r
   rq   r	   
no_defaultformatr   rA   rd   zip
tr_col_numri   r*   rH   rF   rD   Zshow_index_namesrr   rN   r   rf   ra   namerm   rI   justifyinsert)r+   rM   rv   templatesentinellevelslevel_lengths	inner_lvllnumrecordsvaluesZins_colZrecs_newtagru   rowr{   rQ   jre   vrb   r   r   r    _write_col_header   s    











zHTMLFormatter._write_col_headerc                 C  sL   | j j}dd | jjjD dg| j|r*dnd   }| j||| jdd d S )Nc                 S  s   g | ]}|d k	r|ndqS )NrR   r   r0   r   r   r    r3   t  s     z3HTMLFormatter._write_row_header.<locals>.<listcomp>rR   rE   r   T)rP   )r"   rv   r#   rF   rr   rK   rf   ra   )r+   rM   rv   r   r   r   r    _write_row_headerr  s
    zHTMLFormatter._write_row_headerc                 C  sJ   |  d| | jjr$| || j  | jr:| || j  |  d| d S )Nz<thead>z</thead>)r@   r"   rP   r   ra   rC   r   )r+   rM   r   r   r    rn   y  s    zHTMLFormatter._write_headerdict[int, list[str]]c              	     s2   t dd   fddt jD }W 5 Q R X |S )Nzdisplay.max_colwidthc                   s   i | ]}| j |qS r   r"   Z
format_colr   re   rB   r   r    r!     s      z7HTMLFormatter._get_formatted_values.<locals>.<dictcomp>)r   rangerK   )r+   
fmt_valuesr   rB   r    _get_formatted_values  s    "z#HTMLFormatter._get_formatted_valuesc                 C  s`   |  d| |  }| jjr>t| jjtr>| ||| j  n| 	||| j  |  d| d S )Nz<tbody>z</tbody>)
r@   r   r"   rF   r   r#   r
   _write_hierarchical_rowsra   _write_regular_rows)r+   rM   r   r   r   r    ro     s    zHTMLFormatter._write_bodyzMapping[int, list[str]])r   rM   r   c                   s(  | j j}| j j}t| j j}| j jrX| j d}|d k	rJ| j jj|}n| j jj }g }t	|D ]|r| j j
krdgt| }	| j|	|| jd | jd g }| j jr||  n| jr|d | fddt	| jD  |r
| j j| j }
||
d | j||| jd | jd qdd S )N	__index__rs   rQ   rc   rR   c                 3  s   | ]} |  V  qd S r/   r   r   r   r   re   r   r    r2     s     z4HTMLFormatter._write_regular_rows.<locals>.<genexpr>)r"   rv   is_truncated_verticallyrA   r$   rF   _get_formattermaprx   r   
tr_row_numrf   ra   rH   rN   rD   rm   rK   rz   r}   )r+   r   rM   rv   r   nrowsr"   Zindex_valuesr   str_sep_rowZ
dot_col_ixr   r   r    r     sF    
     z!HTMLFormatter._write_regular_rowsc              	     s  d}| j j}| j j}| j j}t|}t|jts4t|jj	dddd}t
t| }| j jrtj}	|jj	|	ddd}
t|
|	}t|d }|r | j j}d}t|D ] \}}i }t
| D  ]\}}||kr|||d < n||| |krR|d ||< |s,t
||d  }d|d< ||t| d}n$t
|| }d||| < t|||< n|||< || |krd||< |dkr||tdgt|  q|rt
|| }d||| < t|||< q|||< qd|| |< tt D ]} | |d q|d7 }t|D ]ډg }i }d}d}t|| D ]V\}}|kr`| dkrl|j	| d	||< n|d7 }q*|d7 }|| q*| fd
dt| jD  |r|| j| | j j d | j||| j|t|
| d qng }tt|D ]|r4| j jkr4dgt| }| j||| jd | jd t
t|jj	dddd }g }||  | fddt| jD  |r|| j| j j d | j||| jd |jjd qd S )Nzrowspan="{span}" valign="top"Frp   rE   rs   Tr   rt   c                 3  s   | ]} |  V  qd S r/   r   r   r   r   r    r2     s     z9HTMLFormatter._write_hierarchical_rows.<locals>.<genexpr>r   c                 3  s   | ]} |  V  qd S r/   r   r   r   r   r    r2   5  s     )r"   rv   r   r$   rA   r   rF   r
   AssertionErrorrx   ri   ry   rq   r	   rw   r   r   rd   r*   r}   rj   r   rN   rm   rK   rH   rz   rf   ra   rG   )r+   r   rM   r~   rv   r   r#   r   Z
idx_valuesr   r   r   r   Zins_rowZinsertedr   r   Zrec_newr   ru   Zdot_rowZix_colr   rQ   Zsparse_offsetr   r   r   r   r   r    r     s    


 

  
 z&HTMLFormatter._write_hierarchical_rows)NNNF)r   )Fr   N)r   N)rY   r   N)r   r   FNNr   )r   )__name__
__module____qualname____doc__ra   r,   r9   r5   propertyr>   rC   rD   rH   rI   rJ   rK   r@   rX   rZ   rW   rf   r=   r   r   rn   r   ro   r   r   r   r   r   r    r      s^   	    
     !            v.r   c                      sP   e Zd ZdZddddZddddZd	dd
dZdd fddZ  ZS )NotebookFormatterz
    Internal class for formatting output data in html for display in Jupyter
    Notebooks. This class is intended for functionality specific to
    DataFrame._repr_html_() and DataFrame.to_html(notebook=True)
    r   r.   c                   s    fddt  jD S )Nc                   s   i | ]}| j |qS r   r   r   rB   r   r    r!   I  s      z;NotebookFormatter._get_formatted_values.<locals>.<dictcomp>)r   rK   rB   r   rB   r    r   H  s    z'NotebookFormatter._get_formatted_valuesr:   c                 C  s
   | j  S r/   )r%   rx   rB   r   r   r    rI   K  s    z/NotebookFormatter._get_columns_formatted_valuesr   c                   s   d}d}d ddg}t | jtr<|d | jrF|d n
|d d	t fd
d|}td|||f}| | d S )Nz            <style scoped>z            </style>zM                .dataframe %s {
                    %s: %s;
                })ztbody tr th:only-of-typevertical-alignmiddle)ztbody tr thr   top)zthead tr th
text-alignleft)zthead tr:last-of-type thr   right)zthead thr   r   z

c                   s    |  S r/   r   )tZtemplate_selectr   r    <lambda>f      z/NotebookFormatter.write_style.<locals>.<lambda>r4   )	r   r%   r
   rN   rC   r7   r   r   r@   )r+   Ztemplate_firstZtemplate_lastZelement_propsZtemplate_midr~   r   r   r    write_styleN  s     

zNotebookFormatter.write_stylec                   s,   |  d |   t   |  d | jS )Nz<div>z</div>)r@   r   superr5   r&   rB   	__class__r   r    r5   j  s
    


zNotebookFormatter.render)	r   r   r   r   r   rI   r   r5   __classcell__r   r   r   r    r   A  s
   r   N)r   
__future__r   textwrapr   typingr   r   r   r   Zpandas._configr   Zpandas._libsr	   Zpandasr
   r   Zpandas.io.commonr   Zpandas.io.formats.formatr   r   Zpandas.io.formats.printingr   r   r   r   r   r   r    <module>   s       &