o
    Zh0hG                     @   s   d Z ddlmZ ddl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 Zdd Zdd Zdd Zdd Zdd ZdejffddZeddfddZejdZdd ZdS )z+Layout for tables and internal table boxes.    )infN   )boxes)LOGGER   )resolve_one_percentageresolve_percentages)"table_and_columns_preferred_widthsc           $         s  ddl mmmmmm jojd jjo!jd j	j
d dkduo/ }j|dd	 r>d nj
d
 \j
g  	_  j
d dkry }	|	 }

D ]}|	7 }		|	 |	|7 }	qd|	|
 n! j }	|	 }

D ]}|	8 }	|	|8 }		|	 q|
|	 rd_d_d}rψ \\}}|r| \\}}|rd}nd}jd| D ]	}|t|j7 }qnd}|ssj\}}|rtdd || D d _ 	
fdd f
dd du r7 }dd jD fdd}dd }| \}}}}}|du r`|du sSJ dg }d}||||fS |durj|gng | |duru|gng  tdd jD _|duo }|| r|_tjdkrjnd  _| }jr|8 }jD ]a}|jD ]<} t| d | jt	k r	| j | _ || _!
| j | _|| _nd| _ d| _!d| _d| _t|d || | _"q|jd }!|jd }"|!j |_ ||_!|"j |"j |!j  |_||_qj
d dkr,
#  	#  j
d }#|rIsI|#rIg  dd}g }d}||||fS ) zLayout for a table box.r   )avoid_page_breakblock_container_layoutblock_level_page_breakfind_earlier_page_breakforce_page_breakremove_placeholdersr   border_collapsecollapseNF)endborder_spacing	directionltrTc                 s       | ]
\}\}}}|V  qd S N .0_widthr   r   M/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/layout/table.py	<genexpr>J   s    
ztable_layout.<locals>.<genexpr>r   c           ,         s6  d }dd d}|}t | d | _|| _| _g }dd | jD }	|d u }
|
r+d}n| \\}}t| j|d  |dD ]q\}}||_|r^|d |}|	r^||d	< |d i} nRt |d |_||_|_g }t|jD ]O\}}|jd  d |j	 }t
||_	|j	dkr|j|}|j|d  }td
t
| d|   nt |d jd dkr|j |_n|j|j	 d  |_|j|_d|_d|_d|_| }t||j	d   | |_|r||v r|| }n
t
|jd i}nd }|r,r,r)jd j}|r(|d jr(| jtdd |d jD 7  _nd_|j|_d|_|j}|jd dkrJ|j }d|d< ||_	|||| d dd d
\}}}}}}||_|d u r|g }	|||dg g d dd d
\}}}}}}dd i}n|}|j|d udd |r|d u r|i i}||| |< tdd |jD  |_|j|_|jdkrt|j|j|_|| qt|r|s|jd 	pt	fdd|jD }|r|i i}	|   n|r|D ]
}|jddd q||}g }|jD ]}|jd }|dv r||_qd|_t||_|| q|rTtdd |D |_|D ]}|j|j } |j|jkrR| rRt ||  q;|jD ]}|	|j!d  | qW|	"d}!|!r|jdkrtdd |!D }"t|"|j d|_nt|jtdd |!D |_|j|j }"n|j}"d|_|s|"|_|!D ]p}|j|#  }#|"|# } | r|jd krt ||  n|jd!kr| d" } t ||  | j$| 7  _$n| j$| 7  _$|jdkrd}$|jd!kr|j|j d" }$n|jd kr|j|j }$|$dkr|jD ]	}%|%j%|$d# qq|j|j }&|d u r)|&7 }&d}'|rBt&d$d |jD r@t'}&d}d }nd}'	(||&}(|s|(r	|j  |r|d })|)|}|	ry
	| }*|*rx|*\}} n8n|d i} n1|r|d i}nd d |f  S  n || |&}d}d }|'rrsd_)|'s|r nq=|o| o| jd 	p| }+|+r҈	|  d d |fS | |} | j|
 |d ud | jD ] }|jd u r|jr td%d |jD |j |_qd|_q|| j | _| jr|  j8  _| ||fS )&Nanybreakpagecontaining_blockc                 S   s   g | ]}g qS r   r   )r   rowr   r   r   
<listcomp>Z   s    z6table_layout.<locals>.group_layout.<locals>.<listcomp>r   startr   r"   z8This table row has more columns than the table, ignored z cells: r   r   r   c                 s       | ]}|j V  qd S r   )border_bottom_width)r   headerr   r   r   r      s
    
z5table_layout.<locals>.group_layout.<locals>.<genexpr>TautoheightF)page_is_emptyabsolute_boxesfixed_boxesadjoining_marginsdiscard	max_lines)r)   r   c                 s   s     | ]}|  p| V  qd S r   )
is_floatedis_in_normal_flowr   childr   r   r   r      
    
break_insidec                 3   s     | ]} |j d  V  qdS )r:   N)styler   cell)r
   contextr   r   r      r9   vertical_align)topmiddlebottombaselinec                 s   r*   r   )rC   r<   r   r   r   r          c                 s   s    | ]
}|j |  V  qd S r   )
position_yborder_heightr<   r   r   r   r     
    
c                 s       | ]}|  V  qd S r   )rF   )r   row_cellr   r   r   r         
rB   rA   r   dyc                 s   r*   r   )emptyr7   r   r   r   r   3  rD   c                 s   s    | ]
}|  |j V  qd S r   )content_box_yr.   r<   r   r   r   r   q  rG   )*r   
position_xrE   r   childrenitems	enumerateindexgrid_xcolspanlenr   warningr;   
margin_topmargin_leftborder_widthsummaxskip_cell_border_topr.   computed_heightcopycopy_with_childrenremove_decorationr    rM   content_heightappendr?   cell_baselinerC   add_top_paddingrowspanpoprF   padding_bottom	translateallr   overflows_pageskip_cell_border_bottom),grouprE   bottom_spacer/   
skip_stack	resume_at	next_pageoriginal_page_is_emptynew_group_childrenending_cells_by_rowis_group_startskip	index_rowr&   
page_breaknew_row_children
index_cellr=   spanned_widths
cell_indexignored_cellsborders_plus_paddingcell_skip_stackheader_rowsoriginal_style
style_copynew_cellcell_resume_atr   avoid_breakbaseline_cellsr?   extraending_cellsrow_bottom_ycell_bottom_yvertical_align_shiftr8   next_position_y
break_celloverflowprevious_rowearlier_page_breakabort)r0   r
   r   r   border_spacing_xborder_spacing_yr   column_positionscolumn_widthsr>   r   r1   r   
has_footer
has_headerr   rows_left_x
rows_widthtabler   r   group_layoutP   s  
 








 





















z"table_layout.<locals>.group_layoutc                    sP  | d u rd}n|   \\}} g }d }dd d}t	j|d  D ]\}}	|	js*|	jr+q || }
|
|	_|rJ|d |	}|rJ||d< |
d i} nX|	|||| \}}}d } |d u r|r|d }||	}|r|| }|d ur||\}} n&|
d i}nd d ||f  S  n|| ||j 7 }d}|r|
|i} nq ||||fS )Nr   r    r!   r   r"   F)rQ   rR   rP   	is_header	is_footerrS   rc   r.   )ro   rE   rn   r/   rv   new_table_childrenrp   rq   irm   index_grouprx   	new_groupprevious_groupr   )
r0   r
   r   r   r>   r   r1   r   r   r   r   r   body_groups_layout}  sV   







z(table_layout.<locals>.body_groups_layoutc                 S   s   g | ]
}|j s|js|qS r   )r   r   r7   r   r   r   r'     s    z table_layout.<locals>.<listcomp>c                     s  r} nt  } r(jd }|	| d dd\}}}|r%|s%|j }nd }nd }rJjd }|	| d dd\}}}|rG|sG|j }nd }nd }
rR
\}nd}d}j|d  D ]}	|	jso|	jso |	jd } nq]|r|r
	| | |d\}
}}}|
srs|j||j d ||7 }||
||||fS d }|r|sÈ
	| |d\}
}}}|
srs||
||||fS d }|r|s
	| |d\}
}}}|
sۈrۈs|j||j d ||7 }||
||||fS d }|s|rJ 
	\}
}}}||
||||fS )Nr   F)ro   r/   r   r:   )r/   rK   )r   rP   r.   r   r   r;   ri   rE   )header_footer_bottom_spacer,   rp   rq   header_heightfooterfooter_heightrv   avoid_breaksrm   r   end_position_y)r
   r   r   rn   r>   r   r   r   r/   rE   ro   r   
table_rowsr   r   all_groups_layout  s   	










z'table_layout.<locals>.all_groups_layoutc                    s    fddS )z(Return closure getting the column cells.c                      s    fddj D S )Nc                    s4   g | ]}|j D ]}|j D ]
}|j jkr|qqqS r   )rP   rT   )r   	row_groupr&   r=   )columnr   r   r'   $  s    
zLtable_layout.<locals>.get_column_cells.<locals>.<lambda>.<locals>.<listcomp>rP   r   r   r   r   r   <lambda>$  s   
 z8table_layout.<locals>.get_column_cells.<locals>.<lambda>r   )r   r   r   r   r   get_column_cells"  s   z&table_layout.<locals>.get_column_cellsc                 s   rH   r   )deepcopy)r   column_groupr   r   r   r   9  rJ   r-   r$   rtlr:   )$blockr
   r   r   r   r   r   rP   r   r   r;   ra   r   r   content_box_xrc   r   r]   rl   rQ   rV   collapsed_border_gridr\   border_top_widthrN   r`   tuplecolumn_groupsskipped_rowsr.   r   rT   rO   rE   	get_cellsreverse)$r>   r   rn   ro   r%   r/   r0   r1   remove_start_decorationrO   rows_xr   split_cellsskipped_groupsgroup_skip_stackr   cells_skip_stackrm   r   horizontal_bordersinitial_position_yr   r   r,   r   r   rp   rq   r2   collapsing_throughremove_end_decorationcolumns_heightr   firstlastr   r   )r0   r
   r   r   r   r   r   rn   r   r   r   r>   r   r1   r   r   r   r   r/   rE   r   r   r   ro   r   r   r   table_layout   s    





0  /7
$f








r   c                 C   s*   |  j |7  _ | jD ]}|j|d q
dS )zPIncrease the top padding of a box.

    This also translates the children.

    rK   N)padding_toprP   ri   )boxextra_paddingr8   r   r   r   re   r  s   
re   c                    sJ  |   }|jdksJ dd |jD }|jr(|jd jr(|jd }|jd j}ng }tt|tdd |D }dg| }t|D ]\}}t|d|j |jdkrV|j||< qA|j	d	 d
krf|j	d \}	}
nd}	d}|D ]N}t
|| |jdkr| }||	|jd  8 }g }t|||j D ]}|| du r|| q||| 8 }q|r|t| }|D ]}|||< q||j7 }ql|	|d  }tdd |D | }dd t|D }|r|j|kr|j| }|t| }|D ]}|||< qn	|D ]}d||< q|jt| | }|dkr| j|8  _n|r ||   fdd|D }||_dS )zRun the fixed table layout and return a list of column widths.

    https://www.w3.org/TR/CSS21/tables.html#fixed-table-layout

    r-   c                 S   s   g | ]
}|j D ]}|qqS r   r   )r   r   r   r   r   r   r'     s    z&fixed_table_layout.<locals>.<listcomp>r   c                 s   r*   r   )rU   r<   r   r   r   r     rD   z%fixed_table_layout.<locals>.<genexpr>Nr   r   separater   r   c                 s   s    | ]	}|d ur|V  qd S r   r   r   wr   r   r   r     s    c                 S   s   g | ]
\}}|d u r|qS r   r   )r   r   r   r   r   r   r'     s    c                    s   g | ]}|  qS r   r   r   extra_per_columnr   r   r'         )get_wrapped_tabler   r   rP   r\   rV   r[   rR   r   r;   r   rZ   rU   rangerc   r   )r   r   all_columnsfirst_rowgroupfirst_row_cellsnum_columnsr   r   r   r   r   r=   r   columns_without_widthjwidth_per_columnall_border_spacingmin_table_widthremaining_widthextra_widthr   r   r   fixed_table_layout}  sn   











r   c                    sx  |  }t| |dd\}}}}}}	}
}d}|jdkr||j7 }|jdkr)||j7 }|j|j }|j|j }|\}}|| | | }|jdkrZ||krN||_n||k rV||_n||_n|j|k rb||_|sig |_	dS |j|
 }|dd }|dd }|dd }|dd }||||f}t
t|D ],}|| rt|| d | || ||< || ||< || ||< q|	| r|| ||< q|t|k r&|d |d |D ]}t||d kr|q |ddd D ]}t||d	 kr|q kr|_	dS fd
dt
t|D  |t t   fddt
t|D |_	dS ||_	|t| }t| |||j	|	|| dS )zRun the auto table layout and return a list of column widths.

    https://www.w3.org/TR/CSS21/tables.html#auto-table-layout

    F)outerr   r-   Nd   r   g0D   ?gv?c                    s   g | ]
}|  |  qS r   r   r   r   )lower_guessupper_guessr   r   r'   $  s    z%auto_table_layout.<locals>.<listcomp>c                    s    g | ]}|  |   qS r   r   r   )added_widthsavailable_ratior   r   r   r'   '  s    )r   r	   rY   margin_rightpadding_leftpadding_rightborder_left_widthborder_right_widthr   r   r   rV   r\   r[   distribute_excess_width)r>   r   r%   r   table_min_content_widthtable_max_content_widthcolumn_min_content_widthscolumn_max_content_widthscolumn_intrinsic_percentagesconstrainednesstotal_horizontal_border_spacinggridmarginspaddingsborderscb_widthr   available_widthassignable_widthmin_content_guessmin_content_percentage_guessmin_content_specified_guessmax_content_guessguessesr   guessexcess_widthr   )r   r   r   r   r   auto_table_layout  s   









r  c                 C   sN   |  }t|| |jd dkr|jdkrt| nt| || | |_dS )z;Find the width of each column and derive the wrapper width.r   fixedr-   N)r   r   r;   r   r   r  rZ   )r>   wrapperr%   r   r   r   r   table_wrapper_width2  s   

r  c                 C   s<   t jt jf}t| |d}|dur|| j S | j| j | j S )zReturn the y position of a cell baseline from the top of its border box.

    See https://www.w3.org/TR/CSS21/tables.html#height-layout

    )baseline_typesN)r   LineBoxTableRowBoxfind_in_flow_baselinerE   r   r   r.   )r=   r	  resultr   r   r   rd   ?  s
   
rd   Fc                 C   sl   t | |r| j| j S t | tjrdS |rt| jn| j}|D ]}| r3t|||}|dur3|  S qdS )u   Return the absolute y position for the first (or last) in-flow baseline.

    If there’s no in-flow baseline, return None.

    N)	
isinstancerE   rC   r   TableCaptionBoxreversedrP   r6   r  )r   r   r	  rP   r8   r  r   r   r   r  N  s   
r  c                    s   fddt || |jdD }|r6tfdd|D }	||	 }
|D ]}||  | |
 7  < q%dS  fddt || |jdD }|r\|D ]}||  |t| 7  < qKdS  fddt || |jdD }|rtfd	d|D }	||	 }
|D ]}||  | |
 7  < qdS  fd
dt || |jdD }|rt fdd|D }|| }
|D ]}||   | |
 7  < qdS dd t || |jdD }|r|D ]}||  |t| 7  < qdS dd t || |jdD }|D ]}||  |t| 7  < qdS )zwDistribute available width to columns.

    See https://www.w3.org/TR/css-tables-3/#distributing-width-to-columns

    c                    s4   g | ]\}}| s | d kr| d kr|qS r   r   r   r   r   r   r   r   r   r   r'   k      z+distribute_excess_width.<locals>.<listcomp>r(   c                 3       | ]} | V  qd S r   r   r   r   r   r   r   q      z*distribute_excess_width.<locals>.<genexpr>Nc                    s(   g | ]\}}| s | d kr|qS r  r   r  )r   r   r   r   r'   x  s    c                    s4   g | ]\}}| r | d kr| d kr|qS r  r   r  r  r   r   r'     r  c                 3   r  r   r   r   r  r   r   r     r  c                    s,   g | ]\}} | d kr| d kr|qS r  r   r  )r   r   r   r   r'     s
    c                 3   r  r   r   r   )r   r   r   r     rJ   c                 S   s   g | ]\}}|r|qS r   r   )r   r   r   r   r   r   r'     s    c                 S   s   g | ]\}}|qS r   r   r  r   r   r   r'     r   )rR   r)   r[   rV   )r>   r   r  r   r   r   r   column_slicecolumnssum_max_content_widthsratior   sum_intrinsic_percentagesr   r  r   r   b  s^   	r   transparentc              	      s   r|sg g fS t g d}dd t|D dddddd fddtff fd	d
t|D  fdd
t|d D fddfdd}ddd fddtff}d}jD ]}|jD ]{}|jD ]q}	|	j|	j|	j}
}}jd dkrt|
d |
| }t|
|
| }ntd|
 d|
 | d}td|
 d|
 | d}|D ]}t||| D ]}|| |< qq|D ]}t|d || D ]}|| |< qq||	|
||| qm|d7 }qhqcd}jD ]}|jD ]}||d| d |d7 }qqd}jD ]}t	|j}||d| | ||7 }qj
D ]}|jD ]}|||jdd| q!qj
D ]}|||jd|j| q3|dd | dd fdd}fdd}fdd}d}jD ]}|| |jD ]}|| |jD ]}	|	j|}}|	j|	j}}jd dkr||||| }|||| || }||||| }||| ||| }n2|| | || pd}|| | || | pd}|d| | ||| }|d| ||| }|	d| |	d | |	d!| |	d"| qv|d7 }qmqdj
D ]}|| |jD ]}|| qq	d|dd  d |d|  d!|ddd d"| dd fS )#a  Resolve border conflicts for a table in the collapsing border model.

    Take a :class:`TableBox`; set appropriate border widths on the table,
    column group, column, row group, row, and cell boxes; and return
    a data structure for the resolved collapsed border grid.

    )
hiddendoublesoliddasheddottedridgeoutsetgrooveinsetnonec                 S   s   i | ]\}}||qS r   r   )r   scorer;   r   r   r   
<dictcomp>  s    z*collapse_table_borders.<locals>.<dictcomp>r#  r%  )r&  r$  r   r'  c                    s   g | ]	}g d   qS )r   r   r   r   
grid_widthweak_null_borderr   r   r'     s    z*collapse_table_borders.<locals>.<listcomp>c                    s   g | ]}g  qS r   r   r*  r+  r   r   r'     s    
r   c                    s   ddl m} |d| d }|d| d }||d| d}|dkr%dnd	|| f}	 ||}| | | \}
}|
|	k rK|	|||ff| | |< d S d S )
Nr   )	get_colorborder__style_width_colorr  r   r   )
draw.colorr.  get)border_grid	box_stylesiderT   grid_yr.  r;   r   colorr(  previous_scorer   )	style_mapstyle_scoresr   r   set_one_border  s   z.collapse_table_borders.<locals>.set_one_borderc                    s  | j }j d dkrDt||| D ]}|d|| |d|| | qt||| D ]} |d||  |d|||  q-d S t||| D ]}|dd| | | |dd| | qKtd| d| | dD ]} |d||  |d|||  qpd S )Nr   r   leftrightr@   rB   r   )r;   r   )r   xyr   hr;   yyxx)r   r=  r   vertical_bordersr   r   set_borders  s    z+collapse_table_borders.<locals>.set_bordersr  r   r   r   c                 S   s    d| d}t | ||d  d S )Nr/  r1  r   )setattr)r   r7  twice_widthpropr   r   r   set_border_used_width   s   z5collapse_table_borders.<locals>.set_border_used_widthc                    s4    | dd  | dd  | dd  | dd d S )Nr@   r   r?  rB   r>  r   )r   )rK  r   r   remove_borders$  s   z.collapse_table_borders.<locals>.remove_bordersc                    s   t  fdd|| D S )Nc                 3   s     | ]}|  d  d  V  qdS )r   Nr   )r   grid_rowr@  r   r   r   +  s    zEcollapse_table_borders.<locals>.max_vertical_width.<locals>.<genexpr>r\   )r@  y1y2)rE  rN  r   max_vertical_width*     z2collapse_table_borders.<locals>.max_vertical_widthc                    s   t dd  | | | D S )Nc                 s   r   r   r   r   r   r   r   r   .  s    zGcollapse_table_borders.<locals>.max_horizontal_width.<locals>.<genexpr>rO  )x1rA  x2)r   r   r   max_horizontal_width-  rS  z4collapse_table_borders.<locals>.max_horizontal_widthNr@   rB   r>  r?  )r  rR   TRANSPARENTr   rP   rT   rU   rf   r;   rV   r   span)r   r,  grid_heightstylesrF  strong_null_borderr8  r   r&   r=   rT   rU   rf   vertical_x_rangehorizontal_x_rangerD  rC  r   r   rL  rR  rV  r@  rA  r@   rB   r>  r?  r   )	r,  r   rK  r=  r;  r<  r   rE  r-  r   collapse_table_borders  s   


















r^  )__doc__mathr   tinycss2.color4tinycss2formatting_structurer   loggerr   percentr   r   	preferredr	   r   re   r   r  r  rd   r
  r  slicer   color4parse_colorrW  r^  r   r   r   r   <module>   s,        iV_
F