o
    Ehe^                     @  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 erNddlmZmZ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)TYPE_CHECKINGAnyFinalcast)
get_option)lib)
MultiIndexoption_context)is_url)DataFrameFormatterget_level_lengths)pprint_thing)HashableIterableMappingc                   @  sB  e Zd ZU dZdZded< 				dTdUddZdVddZdWddZe	dXddZ
e	dXddZe	dXdd Ze	dYd"d#ZdZd%d&Ze	dXd'd(Ze	dYd)d*Zd[d\d/d0Z	d]d^d3d4Zd_d`d5d6Z	dadbd9d:Z	+	+				+dcddd?d@Zd[dedAdBZdedCdDZdedEdFZdedGdHZdfdJdKZdedLdMZdgdPdQZdgdRdSZdS )h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.
       r   indent_deltaNF	formatterr   classes(str | list[str] | tuple[str, ...] | Noneborderint | bool | Nonetable_id
str | Nonerender_linksboolreturnNonec                 C  s   || _ || _| j j| _| j jj| _g | _| j j| _| j j| _| j j| _|d u s+|du r3t	t
td}n|s7d }|| _|| _|| _i | _t| jt}| j j D ](\}}t|t
r]| dn|}	|	| j|< |rwt|trw|D ]	}
|	| jt|
< qmqOd S )NTzdisplay.html.borderZpx)fmtr   frametr_framecolumnselements	bold_rowsescapeZshow_dimensionsr   intr   r   r   r   	col_space
isinstancer
   itemstuplestr)selfr   r   r   r   r   Zis_multi_indexcolumnvalueZcol_space_valueZcolumn_index r1   6lib/python3.10/site-packages/pandas/io/formats/html.py__init__2   s2   




zHTMLFormatter.__init__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-   .0xr1   r1   r2   	<genexpr>Y   s    z*HTMLFormatter.to_string.<locals>.<genexpr>c                 S  s   g | ]}t |qS r1   )r-   r5   r1   r1   r2   
<listcomp>Z   s    z+HTMLFormatter.to_string.<locals>.<listcomp>
)renderanyjoin)r.   linesr1   r1   r2   	to_stringW   s   
zHTMLFormatter.to_string	list[str]c              	   C  sH   |    | jr!t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byr1   r1   r2   r;   ]   s   $zHTMLFormatter.renderc                 C     | j jS r4   )r!   rD   r.   r1   r1   r2   rD   h      z$HTMLFormatter.should_show_dimensionsc                 C  rH   r4   )r!   show_row_idx_namesrI   r1   r1   r2   rK   l   rJ   z HTMLFormatter.show_row_idx_namesc                 C  rH   r4   )r!   show_col_idx_namesrI   r1   r1   r2   rL   p   rJ   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"   nlevelsrL   rI   r1   r1   r2   
row_levelst   s
   
zHTMLFormatter.row_levelsr   c                 C  s   | j S r4   )r$   rI   r1   r1   r2   _get_columns_formatted_values   s   z+HTMLFormatter._get_columns_formatted_valuesc                 C  rH   r4   )r!   is_truncatedrI   r1   r1   r2   rR      rJ   zHTMLFormatter.is_truncatedc                 C  s   t | jjjS r4   )rG   r!   r#   r$   rI   r1   r1   r2   ncols      zHTMLFormatter.ncolsr   sr   indentc                 C  s    t |}| jd| |  d S )NrB   )r   r%   append)r.   rU   rV   rsr1   r1   r2   rF      s   zHTMLFormatter.writeheadertagsc                 C  sH   | j |d}|r|dur|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kindrV   rZ   )r)   get_write_cell)r.   rU   rY   rV   rZ   r)   r1   r1   r2   write_th   s
   zHTMLFormatter.write_thc                 C  s   | j |d||d d S )Ntdr]   )r`   )r.   rU   rV   rZ   r1   r1   r2   write_td   s   zHTMLFormatter.write_tdrb   r^   c           
      C  s   |d urd| d| d}nd| d}| j rdddd}ni }t||d }| jrBt|rBt|i d }|d	| d
7 }d}	nd}	| | | |	 d| d| d S )N<rB   >z&amp;z&lt;z&gt;)&rd   re   )Zescape_charsz	<a href="z" target="_blank">z</a>r[   z</)r'   r   stripr   r   rF   )
r.   rU   r^   rV   rZ   Z	start_tagZescrX   Zrs_unescapedZend_ar1   r1   r2   r`      s   $zHTMLFormatter._write_celllinealigndict[int, str] | Nonenindex_levelsc                 C  s   |d u ri }|d u r|  d| n
|  d| d| ||7 }t|D ]%\}}	||d }
|s6| jr@||k r@| j|	|||
d q#| j|	||
d q#||8 }|  d| d S )Nz<tr>z<tr style="text-align: z;">)rV   rY   rZ   )rZ   z</tr>)rF   	enumerater_   r&   ra   rc   )r.   rh   rV   r   rY   ri   rZ   rk   irU   Zval_tagr1   r1   r2   write_tr   s   
zHTMLFormatter.write_trc              	   C  s  dg}t d}|s|d | jd ur7t| jtr| j | _t| jttfs1tdt	| j |
| j | jd u r?d}nd| j d}| jd u rNd}nd| j d}| d	| d
d| d| d| | jjso| jrw| || j  | || j  | d| d S )NZ	dataframezdisplay.html.use_mathjaxZtex2jax_ignorez.classes must be a string, list, or tuple, not r[   z id=""z	 border="z<tablez class="rB   re   z</table>)r   rW   r   r*   r-   splitlistr,   	TypeErrortypeextendr   r   rF   r=   r!   rY   rK   _write_headerr   _write_body)r.   rV   Z_classesZuse_mathjaxZ
id_sectionZborder_attrr1   r1   r2   rC      s8   



zHTMLFormatter._write_tablec                 C  sH  | j j}t| jtrVd}| j jrtj}nd}| jj|dd}t	||}t
|d }tt||D ]!\}\}	}
|r| j j}| j jri }t|	 D ]^\}}||krY|||d < n7|| |kr|d ||< ||krx|
d | d |
|d   }
n|
d | |
|d  f |
|d   }
n|||< || |krd||< |
d | d |
|d   }
qJ|}	t
|d }||krd|	|< n1i }t|	 D ]\}}||kr|||d < q|||< qd||< |}	|
d | dg |
|d   }
dg| jd  }| j js| jr| j jr| jj| }|t|pd n|d i }t
|}t|
D ]'\}}||	v r;|	| dkr:|j|	| d||< nq |d7 }|| q | j||| j|d	d
 q1d S dg| jd  }| j jsg| jr|| j jrw|| jjptd n|d ||   | j j}|r| j| j j }||d | j||| jd	|d d S )Nz colspan="{span:d}" halign="left"FsparsifyZinclude_namesrM   )...ry   r[   spanT)rZ   rY   )rY   ri   )r!   is_truncated_horizontallyr*   r$   r
   rx   r	   
no_default_format_multir   rG   rl   zip
tr_col_numrq   r+   rP   rN   rL   Zshow_index_namesnamesrW   r   formatrn   r   namert   rQ   Zjustifyinsert)r.   rV   r|   templatesentinellevelslevel_lengths	inner_lvllnumrecordsvaluesZins_colZrecs_newtagr{   rowr   rZ   jrm   vri   r1   r1   r2   _write_col_header  s   






T

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 ur
|ndqS )Nr[   r1   r5   r1   r1   r2   r9     s    z3HTMLFormatter._write_row_header.<locals>.<listcomp>r[   rM   r   T)rY   )r!   r|   r"   rN   r   rS   rn   r   )r.   rV   r|   r   r1   r1   r2   _write_row_header  s
   zHTMLFormatter._write_row_headerc                 C  sJ   |  d| | jjr| || j  | jr| || j  |  d| d S )Nz<thead>z</thead>)rF   r!   rY   r   r   rK   r   )r.   rV   r1   r1   r2   ru     s   zHTMLFormatter._write_headerdict[int, list[str]]c                   sH   t dd   fddt jD }W d    |S 1 sw   Y  |S )Nzdisplay.max_colwidthc                      i | ]	}| j |qS r1   r!   Z
format_colr6   rm   rI   r1   r2   
<dictcomp>      z7HTMLFormatter._get_formatted_values.<locals>.<dictcomp>)r   rangerS   )r.   
fmt_valuesr1   rI   r2   _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>)
rF   r   r!   rN   r*   r"   r
   _write_hierarchical_rowsr   _write_regular_rows)r.   rV   r   r1   r1   r2   rv     s   zHTMLFormatter._write_bodyr   Mapping[int, list[str]]c                   s*  | j j}| j j}t| j j}| j jr.| j d}|d ur%| j jj|}n	| j jjjdd}g }t	|D ]^|rQ| j j
krQdgt| }	| j|	|| jd | jd g }| j jr_||  n| jrg|d | fddt	| jD  |r| j j| j }
||
d | j||| jd | jd q4d S )	N	__index__FZinclude_namery   rZ   rk   r[   c                 3      | ]	} |  V  qd S r4   r1   r6   r   r   rm   r1   r2   r8         z4HTMLFormatter._write_regular_rows.<locals>.<genexpr>)r!   r|   is_truncated_verticallyrG   r#   rN   _get_formattermap_format_flatr   
tr_row_numrn   r   rP   rW   rL   rt   rS   r   r   )r.   r   rV   r|   r   nrowsr!   Zindex_valuesr   str_sep_rowZ
dot_col_ixr1   r   r2   r     s@   
 z!HTMLFormatter._write_regular_rowsc              	     s  d}| j j}| j j}| j j}t|}t|jtsJ |jjddd}t	t
| }| j jrftj}	|jj|	dd}
t|
|	}t|d }|r| j j}d}t|D ]\}}i }t	| D ]{\}}||krj|||d < n<|| |kr|d ||< |st	||d  }d|d< ||t| d}nt	|| }d||| < t|||< n|||< || |krd||< |dkr||tdgt|  q[|rt	|| }d||| < t|||< q[|||< qOd|| |<  D ]
} | |d q|d7 }t|D ]lg }i }d}d}t
|| D ]+\}}|v r#| dkr"|j| d	||< n|d7 }q|d7 }|| q| fd
dt| jD  |rT|| j| | j j d | j||| j|t|
| d qd S g }tt|D ]`|r| j jkrdgt| }| j||| jd | jd t	t
|jjddd }g }||  | fddt| jD  |r|| j| j j d | j||| jd |jjd qnd S )Nzrowspan="{span}" valign="top"Frw   rM   ry   Tr   rz   c                 3  r   r4   r1   r   r   r1   r2   r8   -  r   z9HTMLFormatter._write_hierarchical_rows.<locals>.<genexpr>r   c                 3  r   r4   r1   r   r   r1   r2   r8   K  r   )r!   r|   r   r#   rG   r*   rN   r
   r~   rq   r   rx   r	   r}   r   r   rl   r+   r   r,   r   r   rW   rt   rS   rP   r   rn   r   rO   )r.   r   rV   r   r|   r   r"   r   Z
idx_valuesr   r   r   r   Zins_rowZinsertedr   r   Zrec_newr   r{   Zdot_rowZix_colr   rZ   Zsparse_offsetr   r   r   r1   r   r2   r     s   



 
 
z&HTMLFormatter._write_hierarchical_rows)NNNF)r   r   r   r   r   r   r   r   r   r   r   r    )r   r-   r   r@   )r   r   )r   r(   )r   r   )r   )rU   r   rV   r(   r   r    )Fr   N)
rU   r   rY   r   rV   r(   rZ   r   r   r    )r   N)rU   r   rV   r(   rZ   r   r   r    )rb   r   N)
rU   r   r^   r-   rV   r(   rZ   r   r   r    )r   r   FNNr   )rh   r   rV   r(   r   r(   rY   r   ri   r   rZ   rj   rk   r(   r   r    )rV   r(   r   r    r   r   )r   r   rV   r(   r   r    )__name__
__module____qualname____doc__r   __annotations__r3   r?   r;   propertyrD   rK   rL   rP   rQ   rR   rS   rF   ra   rc   r`   rn   rC   r   r   ru   r   rv   r   r   r1   r1   r1   r2   r   &   sX   
 	
%

!
%
w



.r   c                      s@   e Zd ZdZdddZdddZdd
dZ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                   r   r1   r   r   rI   r1   r2   r   _  r   z;NotebookFormatter._get_formatted_values.<locals>.<dictcomp>)r   rS   rI   r1   rI   r2   r   ^  s   z'NotebookFormatter._get_formatted_valuesr@   c                 C  s   | j jddS )NFr   )r$   r   rI   r1   r1   r2   rQ   a  rT   z/NotebookFormatter._get_columns_formatted_valuesr    c                   s   d}d}d ddg}t | jtr|d | jr|d n|d d	 fd
d|D }t| d| d| }| | d S )Nz            <style scoped>z            </style>zM                .dataframe %s {
                    %s: %s;
                })ztbody tr th:only-of-typevertical-alignZ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                 3  s    | ]} | V  qd S r4   r1   )r6   tZtemplate_selectr1   r2   r8   }  s    z0NotebookFormatter.write_style.<locals>.<genexpr>r:   )r*   r$   r
   rW   rK   r=   r   rF   )r.   Ztemplate_firstZtemplate_lastZelement_propsZtemplate_midr   r1   r   r2   write_stylee  s"   

zNotebookFormatter.write_stylec                   s,   |  d |   t   |  d | jS )Nz<div>z</div>)rF   r   superr;   r%   rI   	__class__r1   r2   r;     s
   


zNotebookFormatter.renderr   r   )r   r    )	r   r   r   r   r   rQ   r   r;   __classcell__r1   r1   r   r2   r   W  s    


r   N)r   Z
__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   Zcollections.abcr   r   r   r   r   r1   r1   r1   r2   <module>   s$        5