o
    Zh0h@y                     @   s&  d 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	m
Z
 dd	lmZ d
d Zd8ddZd8ddZdd Zdd Zd9ddZd9ddZd8ddZd8ddZ		d:ddZd;d d!Zd"d# Zd$d% Zd8d&d'Z		d<d(d)Zd*d+ Zd8d,d-Zd8d.d/Zd8d0d1Zd8d2d3Z d8d4d5Z!d6d7 Z"dS )=a  Preferred and minimum preferred width.

Also known as max-content and min-content width, also known as the
shrink-to-fit algorithm.

Terms used (max-content width, min-content width) are defined in David
Baron's unofficial draft (https://dbaron.org/css/intrinsic/).

    N)cache)inf   )boxes)can_break_textsplit_first_line   )default_image_sizingc                 C   s$   t tt| |dd|t| |ddS )zReturn the shrink-to-fit width of ``box``.

    *Warning:* both available_content_width and the return value are
    for width of the *content area*, not margin area.

    https://www.w3.org/TR/CSS21/visudet.html#float-width

    Fouter)minmaxmin_content_widthmax_content_width)contextboxavailable_content_width r   Q/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/layout/preferred.pyshrink_to_fit   s   	r   Tc                 C   s   |j rt| ||d S t|tjrt| ||S t|tjtjfr&t| ||S t|tj	r1t
| |S t|tjtjfrBt| ||ddS t|tjrMt||S t|tjrYt| ||S t|tjret| ||S tdt|j d)zsReturn the min-content width for ``box``.

    This is the width by breaking at every line-break opportunity.

    r   Tis_line_startzmin-content width for  not handled yet)is_table_wrapper"table_and_columns_preferred_widths
isinstancer   TableCellBoxtable_cell_min_content_widthBlockContainerBoxTableColumnBoxblock_min_content_widthTableColumnGroupBoxcolumn_group_content_width	InlineBoxLineBoxinline_min_content_widthReplacedBoxreplaced_min_content_widthFlexContainerBoxflex_min_content_widthGridContainerBox	TypeErrortype__name__r   r   r   r   r   r   r   $   s"   

r   c                 C   s   |j rt| ||d S t|tjrt| ||d S t|tjtjfr(t| ||S t|tj	r3t
| |S t|tjtjfrDt| ||ddS t|tjrOt||S t|tjr[t| ||S t|tjrgt| ||S tdt|j d)znReturn the max-content width for ``box``.

    This is the width by only breaking at forced line breaks.

    r   Tr   zmax-content width for r   )r   r   r   r   r    table_cell_min_max_content_widthr   r   block_max_content_widthr!   r"   r#   r$   inline_max_content_widthr&   replaced_max_content_widthr(   flex_max_content_widthr*   r+   r,   r-   r.   r   r   r   r   ?   s"   

r   c                    sd   |j d }|dks|jdkr" fdd|jD }|rt|nd}n
|jdks)J |j}t|||S )z+Helper to create ``block_*_content_width.``widthauto%c                    s"   g | ]}|  s |d dqS )Tr
   )is_absolutely_positioned.0childr   functionr   r   
<listcomp>a   s    z(_block_content_width.<locals>.<listcomp>r   px)styleunitchildrenr   valueadjust)r   r   r<   r   r4   children_widthsr   r;   r   _block_content_widthZ   s   
rE   c                 C   s   | j d }| j d }|dks|jdkrd}n|j}|dks"|jdkr%t}n|j}t| tjrk| jd| j d \}}}|durk| j d	 }|dkrU|jdkrUt	||j| }| j d
 }|dkrk|jdkrkt
||j| }t	|t
||S )z;Get box width from given width and box min- and max-widths.	min_width	max_widthr5   r6   r   r   	font_sizeN
min_height
max_height)r?   r@   rB   r   r   r   r&   replacementget_intrinsic_sizer   r   )r   r4   rF   rG   _ratiorI   rJ   r   r   r   min_maxl   s(   





rO   c                 C   s   d}|rddgng |rddgng  D ]"}| j | }|dkr4|jdkr(||j7 }q|jdks/J ||j7 }q| j d	 d
k}|rR|rKt| drK|| j7 }n|| j d 7 }|rh|rat| dra|| j7 }n|| j d 7 }|dk rt|d|d   S dS )z3Add box paddings, borders and margins to ``width``.r   margin_leftpadding_leftmargin_rightpadding_rightr5   r>   r6   border_collapsecollapseborder_left_widthborder_right_widthd   r   )r?   r@   rB   hasattrrV   rW   )r   r4   leftrightpercentagesrB   style_valuerU   r   r   r   margin_width   s0   


r^   c                 C   s    t | |}|rt| |||S |S )zRespect min/max and adjust width depending on ``outer``.

    If ``outer`` is set to ``True``, return margin width, else return content
    width.

    )rO   r^   )r   r   r4   rZ   r[   fixedr   r   r   rC      s   
rC   c                 C      t | |t|S )z0Return the min-content width for a ``BlockBox``.)rE   r   r.   r   r   r   r       s   r    c                 C   r`   )z0Return the max-content width for a ``BlockBox``.)rE   r   r.   r   r   r   r0      s   r0   Fc              	   C   s6   t | |||d||d}|rt|nt|}t|||S )zReturn the min-content width for an ``InlineBox``.

    The width is calculated from the lines from ``skip_stack``. If
    ``first_line`` is ``True``, only the first line minimum width is
    calculated.

    T)minimum
skip_stack
first_line)inline_line_widthsnextr   rC   )r   r   r   rb   rc   r   widthsr4   r   r   r   r%      s   	
r%   c                 C   s<   t t| |||dd}|d  t| |8  < t||t|S )z2Return the max-content width for an ``InlineBox``.F)ra   )listrd   trailing_whitespace_sizerC   r   )r   r   r   r   rf   r   r   r   r1      s
   r1   c                 C   sB   |j d }|dks|jdkrd}n
|jdksJ |j}t|d|S )z9Return the *-content width for a ``TableColumnGroupBox``.r4   r5   r6   r   r>   F)r?   r@   rB   rC   )r   r   r4   r   r   r   r"      s   
r"   c                    s6    fdd|j D }t|||rt|}|S d}|S )z4Return the min-content width for a ``TableCellBox``.c                    s   g | ]}|  st |qS r   )r7   r   r8   r   r   r   r=      s    z0table_cell_min_content_width.<locals>.<listcomp>r   )rA   rC   r   )r   r   r   rD   children_min_widthr   rj   r   r      s   

r   c                 C   s&   t | ||}t|t| ||}||fS )z=Return the min- and max-content width for a ``TableCellBox``.)r   r   r0   )r   r   r   rF   rG   r   r   r   r/     s   r/   c              
   c   s   t |tjr|jd jdkr|jd j}nd}d}|d u r!d}	n| \\}	}|j|	d  D ]4}
|
 r7q/t |
tj	r}t
| |
|||||}|rOt|g}nt|}t|dkrdt|
||d |d< nt|
||d dd|d< t|
||d dd|d< nt |
tjr|
jd	 d
v }|
jd	 dv }|d u rd}	n| \\}	}|d u sJ |
j |	pdd  }|r|r|d}|rdnd }g }d }}|d ur||7 }t||d   |
j| ||
j|dd\}}}}}}|| |rn|d us|r|r||d 7 } nft| dd  d |
jd }|r|r|r|d n|r*dt| |
dg}nt| |
g}||d 7 }t|dkr\|| V  d}t|dkrX|dd D ]}|V  qQ|d }|d dk}d }q/|| V  d S )Ntext_indentr6   r   r   F)r[   rg   )rZ   white_spacenormalnowrappre-line)ro   zpre-wraprq       T)r   ra   alangr   )r   r   r$   r?   r@   rB   itemsrA   r7   r#   rd   re   rh   lenrC   TextBoxtextencodelstripr   decodejustification_spacingappendr   r   r   )r   r   r   r   ra   rb   rc   rl   current_lineskipr:   linesspace_collapse	text_wrap
child_textrG   resume_indexnew_resume_indexrM   r4   	can_breakliner   r   r   rd     s   

	
	

rd   c                 C   s   | j d dkr| j d jdkr| j d jnd}| j d dkr,| j d jdkr,| j d jnt}| j d dkrC| j d jdkrC| j d jnd}t|t||S )z~Return the percentage contribution of a cell, column or column group.

    https://dbaron.org/css/intrinsic/#pct-contrib

    rF   r5   r6   r   rG   r4   )r?   r@   rB   r   r   r   )r   rF   rG   r4   r   r   r   _percentage_contributiong  s    r   c           :   
      s  ddl m} | }| j|}|r|| S d\ }d}|jD ]#}|jD ]}	|	jD ]}
t|
j|
j   t||
j	 |}q)|d7 }q$q fddt
|D }d}|jD ]}|jD ]}	|	jD ]	}
|
|| |
j< q]|d7 }qXqStt| }|jd dkr dkr|jd	 d dtd
d |D   }nd} dks|dkrg |_t| |dd}t| |dd}t|dt| |d}t|dt| |d}g g g g |g f}||g|R ||g|R d | j|< }|| S dg  }dg  }d}|jD ]}|jD ]}|||< |||< |d7 }| kr	 nqq g }t }dg  }dg  dg  t
 D ]{}||fD ]-}||  }rVt|| t| |||< t| t| ||< t| t||< q*|| D ]A}
|
scq\|
jdkrt| |
\}}t|| |||< t| ||< t| t|
|< q\||
 ||
jd  q\q$g }t|D ]"\}}	d}|g  }  t|	D ]\}!}
|
r|!}| | qqtfdd}"t|D ]S}#g }$t
 D ]G}|  }%r|$|% qt||D ]+\}	} | |  }du rq|	| }&|&jd |#krq|"|&|| }'t|%|'}%q|$|% q|$qdd t
 D }(t
 D ]k}|| rY|| jd dkrY|| jd jdkrYd|(|< q7|| ry|| jd dkry|| jd jdkryd|(|< q7|| D ]#}
|
r|
jdkr|
jd dkr|
jd jdkrd|(|<  nq}q7fddtD |D ]j}
t| |
})t| |
}*t|
j|
j|
j }+t||+ },t|+ }-|jd dkr|
jd |jd	 d  }.nd}.|)|,|. kr|)|,|.  }/|| ||/||(|+ |*|-|. kr|*|-|.  }/|| ||/|(|+ qfddt
 D }0tfddt
 D }1dt d }2|2dkrN|1dkrJd}3nt j!}3n|1|2 }3|t| }4|tt|3g|0 }5|jd dkr~|jd jdkr~|jd j" }6}7n|4}6|5}7t|4t|d|6d}4t|5t|d|7d}5t#|t#||4}8t#|t#||5}9||(||f}|4|5g|R |8|9g|R d | j|< }|| S )ad  Return content widths for the auto layout table and its columns.

    The tuple returned is
    ``(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)``

    https://dbaron.org/css/intrinsic/

    r   )distribute_excess_width)r   r   r   c                    s   g | ]}d g  qS )Nr   r9   i)
grid_widthr   r   r=     s    z6table_and_columns_preferred_widths.<locals>.<listcomp>rT   separateborder_spacingc                 S   s   g | ]}t |r|qS r   )any)r9   columnr   r   r   r=     s    Fr
   T)r   r4   )FTNc           
         s   t ||| j }t | }t| }td|| } fddt||| j D }t|}|dkr=dt|p7d }	||	 S || }	||	 S )Nr   c                    s    g | ]} | d kr| qS )r   r   )r9   jintrinsic_percentagesmax_content_widthsr   r   r=     s
    z[table_and_columns_preferred_widths.<locals>.get_percentage_contribution.<locals>.<listcomp>r   )slicecolspansumr   r   rangerv   )
origin_celloriginr   
cell_slicebaseline_percentagecell_percentage_contributiondiffother_columns_contributionsother_columns_contributions_sumrN   r   r   r   get_percentage_contribution  s   zGtable_and_columns_preferred_widths.<locals>.get_percentage_contributionc                 S   s   g | ]}d qS )Fr   r   r   r   r   r=     s    r4   r5   r6   c              	      s*   g | ]\}}t |d t d|  qS )rX   N)r   r   )r9   r   
percentage)r   r   r   r=   +  s    c                    s(   g | ]} | r|  | d   qS )rX   r   r   r   r   r   r=   J  s    c                 3   s$    | ]} | d kr| V  qdS )r   Nr   r   r   r   r   	<genexpr>N  s    z5table_and_columns_preferred_widths.<locals>.<genexpr>rX   r>   )$tabler   get_wrapped_tabletablesgetrA   r   grid_xr   rowspanr   rh   zipr?   rv   r    r0   rC   column_groupssetr   r   r   r/   r}   add	enumerater   sortedr@   r   r   sysmaxsizerB   r^   ):r   r   r   r   r   resultgrid_height
row_number	row_grouprowcellgridzipped_gridtotal_horizontal_border_spacingrF   rG   outer_min_widthouter_max_widthr   columnscolumn_numbercolumn_groupr   colspan_cellscolspansmin_content_widthsr   groupsgrouprows_originsyr   row_originsxr   spanpercentage_contributionspercentage_contributionr   r   constrainednessmin_contentmax_contentcolumn_slicecolumns_min_contentcolumns_max_contentspacingexcess_widthsmall_percentage_contributions'large_percentage_contribution_numerator)large_percentage_contribution_denominatorlarge_percentage_contributiontable_min_content_widthtable_max_content_widthtable_min_widthtable_max_widthtable_outer_min_content_widthtable_outer_max_content_widthr   )r   r   r   r   r   y  s  
























"

r   c           	   	   C   s   | j d }|dkr_| j d }|dks|jdkrd}n
|jdks!J |j}| j d dkr6| j d jdkr6d}n>| j}|| j d | j d	 \}}}|rQ|sQ|sQd}n#t|||d|d
dd\}}n| j d jdkrjd}n
|jdksqJ |j}t| ||S )z:Return the min-content width for an ``InlineReplacedBox``.r4   r5   heightr6   r>   rG   r   image_resolutionrH   ,     default_widthdefault_heightr?   r@   rB   rK   rL   r	   rC   	r   r   r4   r   imageintrinsic_widthintrinsic_heightintrinsic_ratiorM   r   r   r   r'     s4   

r'   c           	   	   C   s   | j d }|dkrD| j d }|dks|jdkrd}n
|jdks!J |j}| j}|| j d | j d \}}}t|||d|dd	d
\}}n| j d jdkrOd}n
|jdksVJ |j}t| ||S )z:Return the max-content width for an ``InlineReplacedBox``.r4   r5   r   r6   r>   r   rH   r   r   r   r   r   r   r   r   r   r2     s*   


r2   c                    sb    fdd|j D }|st||dS |jd dr)|jd dkr)t||t|S t||t|S )z9Return the min-content width for an ``FlexContainerBox``.c                       g | ]
}|j rt |qS r   )is_flex_itemr   r8   rj   r   r   r=     
    z*flex_min_content_width.<locals>.<listcomp>r   flex_directionr   	flex_wraprp   rA   rC   r?   
startswithr   r   )r   r   r   min_contentsr   rj   r   r)     s   
r)   c                    sT    fdd|j D }|st||dS |jd dr"t||t|S t||t|S )z9Return the max-content width for an ``FlexContainerBox``.c                    r   r   )r   r   r8   rj   r   r   r=     r   z*flex_max_content_width.<locals>.<listcomp>r   r   r   r   )r   r   r   max_contentsr   rj   r   r3     s   
r3   c                 C   s>  ddl m}m} t|tjtjfr$|jsdS |jd }t|tjtjfst|tjr4|j	r4|j
d dv s6dS |j	d}|j
d dksLt|t|j	krNdS |rd}|d	urf|}|| |d	|\}}}|d	usV|sjJ ||}	|| |	d	|\}	}}|	d	u r|jS |d	u sJ |j|	j S ||j	|j
| d	|j\}}}}
}}|
S )
z6Return the size of the trailing whitespace of ``box``.r   )r   split_text_boxr   rg   rm   rn    rH   N)inliner   r   r   r   r#   r$   rA   rw   rx   r?   rstriprv   copy_with_textr4   r|   )r   r   r   r   stripped_textresume
old_resumeold_boxrM   stripped_boxr4   r   r   r   ri     s>   
 

ri   )T)TT)TNFF)TF)NF)#__doc__r   	functoolsr   mathr   formatting_structurer   text.line_breakr   r   replacedr	   r   r   r   rE   rO   r^   rC   r    r0   r%   r1   r"   r   r/   rd   r   r   r'   r2   r)   r3   ri   r   r   r   r   <module>   sF    




.






X
  

"

