a
    [Xh@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d9ddZdd Zdd Zd:ddZd;ddZd<ddZd=ddZd>ddZd?d d!Zd"d# Zd$d% Zd@d&d'ZdAd(d)Zd*d+ ZdBd,d-ZdCd.d/ZdDd0d1ZdEd2d3Z dFd4d5Z!d6d7 Z"dS )Ga  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boxZavailable_content_width r   `/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/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rLt| ||S t|tj	rbt
| |S t|tjtjfrt| ||ddS t|tjrt||S t|tjrt| ||S t|tjrt| ||S tdt|j ddS )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 yetN)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r2t| ||d S t|tjtjfrPt| ||S t|tj	rft
| |S t|tjtjfrt| ||ddS t|tjrt||S t|tjrt| ||S t|tjrt| ||S tdt|j ddS )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   N)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rD fdd|jD }|r>t|nd}n|jdksRJ |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   r3   children_widthsr   r:   r   _block_content_widthZ   s    
rD   c                 C   s   | j d }| j d }|dks&|jdkr,d}n|j}|dksD|jdkrJt}n|j}t| tjr| jd| j d \}}}|dur| j d	 }|dkr|jdkrt	||j| }| j d
 }|dkr|jdkrt
||j| }t	|t
||S )z;Get box width from given width and box min- and max-widths.	min_width	max_widthr4   r5   r   r   	font_sizeN
min_height
max_height)r>   r?   rA   r   r   r   r%   replacementget_intrinsic_sizer   r   )r   r3   rE   rF   _ratiorH   rI   r   r   r   min_maxl   s(    





rN   c                 C   s   d}|rddgng |rddgng  D ]D}| j | }|dkr$|jdkrP||j7 }q$|jdks^J ||j7 }q$| j d	 d
k}|r|rt| dr|| j7 }n|| j d 7 }|r|rt| dr|| j7 }n|| j d 7 }|dk r|d|d   S dS dS )z3Add box paddings, borders and margins to ``width``.r   Zmargin_leftZpadding_leftZmargin_rightZpadding_rightr4   r=   r5   border_collapsecollapseborder_left_widthborder_right_widthd   r   N)r>   r?   rA   hasattrrQ   rR   )r   r3   leftrightZpercentagesrA   Zstyle_valuerP   r   r   r   margin_width   s.    

rW   c                 C   s$   t | |}|rt| |||S |S dS )zRespect min/max and adjust width depending on ``outer``.

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

    N)rN   rW   )r   r   r3   rU   rV   fixedr   r   r   rB      s    
rB   c                 C   s   t | |t|S )z0Return the min-content width for a ``BlockBox``.)rD   r   r-   r   r   r   r      s    r   c                 C   s   t | |t|S )z0Return the max-content width for a ``BlockBox``.)rD   r   r-   r   r   r   r/      s    r/   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   rB   )r   r   r   rZ   r[   r   widthsr3   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)rY   )listr\   trailing_whitespace_sizerB   r   )r   r   r   r   r^   r   r   r   r0      s
    r0   c                 C   sB   |j d }|dks|jdkr"d}n|jdks0J |j}t|d|S )z9Return the *-content width for a ``TableColumnGroupBox``.r3   r4   r5   r   r=   F)r>   r?   rA   rB   )r   r   r3   r   r   r   r!      s    
r!   c                    s0    fdd|j D }t|||r&t|nd}|S )z4Return the min-content width for a ``TableCellBox``.c                    s   g | ]}|  st |qS r   )r6   r   r7   r   r   r   r<      s   z0table_cell_min_content_width.<locals>.<listcomp>r   )r@   rB   r   )r   r   r   rC   Zchildren_min_widthr   rb   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   r/   )r   r   r   rE   rF   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 ]~}
|
 rlq\t |
tj	rt
| |
|||||}|rt|g}nt|}t|dkrt|
||d |d< n0t|
||d dd|d< t|
||d dd|d< nzt |
tjrP|
jd	 d
v }|
jd	 dv }|d u r4d}	n| \\}	}|d u sPJ |
j |	p`dd  }|r~|r~|d}|rdnd }g }d }}|d ur||7 }t||d   |
j| ||
j|dd\}}}}}}|| |rqq|r|r||d 7 } qt| dd  d |
jd }|rt|rt|rt|d n$|rhdt| |
dg}nt| |
g}||d 7 }t|dkr|| V  d}t|dkr|dd D ]}|V  q|d }|d dk}d }q\|| V  d S )Ntext_indentr5   r   r   F)rV   r_   )rU   white_spacenormalnowrappre-line)rf   zpre-wraprh       T)r   rY   alangr   )r   r   r#   r>   r?   rA   itemsr@   r6   r"   r\   r]   r`   lenrB   TextBoxtextencodelstripr   decodejustification_spacingappendr   r   r   )r   r   r   r   rY   rZ   r[   rc   current_lineskipr9   linesZspace_collapseZ	text_wrapZ
child_textrF   Zresume_indexZnew_resume_indexrL   r3   Z	can_breakliner   r   r   r\     s    



	

r\   c                 C   s   | j d dkr*| j d jdkr*| j d jnd}| j d dkrX| j d jdkrX| j d jnt}| j d dkr| j d jdkr| 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

    rE   r4   r5   r   rF   r3   )r>   r?   rA   r   r   r   )r   rE   rF   r3   r   r   r   _percentage_contributiong  s     ry   c           :   
      s  ddl m} | }| j|}|r,|| S d\ }d}|jD ]F}|jD ]:}	|	jD ]&}
t|
j|
j   t||
j	 |}qR|d7 }qHq> fddt
|D }d}|jD ]2}|jD ]&}	|	jD ]}
|
|| |
j< q|d7 }qqt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 ]F}|jD ].}|||< |||< |d7 }| kr q$qq q.qg }t }dg  }dg  dg  t
 D ]}||fD ]Z}||  }rjt|| t| |||< t| t| ||< t| t||< qj|| D ]}
|
sܐq|
jdkr2t| |
\}}t|| |||< t| ||< t| t|
|< n||
 ||
jd  qΐq^g }t|D ]D\}}	d}|g  }  t|	D ]\}!}
|
r|!}| | qq`tfdd}"t|D ]}#g }$t
 D ]}|  }%r|$|% qt||D ]V\}	} | |  }du rq|	| }&|&jd |#kr4q|"|&|| }'t|%|'}%q|$|% q|$qdd t
 D }(t
 D ]}|| r|| jd dkr|| jd jdkrd|(|< q|| r|| jd dkr|| jd jdkrd|(|< q|| D ]H}
|
r|
jdkr|
jd dkr|
jd jdkrd|(|<  qqqfddtD |D ]}
t| |
})t| |
}*t|
j|
j|
j }+t||+ },t|+ }-|jd dkr|
jd |jd	 d  }.nd}.|)|,|. kr|)|,|.  }/|| ||/||(|+ |*|-|. krv|*|-|.  }/|| ||/|(|+ qvfddt
 D }0tfddt
 D }1dt d }2|2dkr|1dkrd}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   r8   i)
grid_widthr   r   r<         z6table_and_columns_preferred_widths.<locals>.<listcomp>rO   ZseparateZborder_spacingc                 S   s   g | ]}t |r|qS r   )any)r8   columnr   r   r   r<     r~   Fr
   T)r   r3   )FTNc           
         s   t ||| j }t | }t| }td|| } fddt||| j D }t|}|dkrtdt|pnd }	n|| }	||	 S )Nr   c                    s    g | ]} | d kr| qS )r   r   )r8   jintrinsic_percentagesmax_content_widthsr   r   r<     s   z[table_and_columns_preferred_widths.<locals>.get_percentage_contribution.<locals>.<listcomp>r   )slicecolspansumry   r   rangerm   )
origin_celloriginr   Z
cell_sliceZbaseline_percentagecell_percentage_contributiondiffZother_columns_contributionsZother_columns_contributions_sumrM   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<     r~   r3   r4   r5   c              	      s*   g | ]"\}}t |d t d|  qS )rS   N)r   r   )r8   r|   
percentage)r   r   r   r<   +  s   c                    s(   g | ] } | r|  | d   qS )rS   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>rS   r=   )$tablerz   Zget_wrapped_tableZtablesgetr@   r   Zgrid_xr   Zrowspanr   r`   zipr>   rm   r   r/   rB   column_groupssetr   r   ry   r.   rt   add	enumerater   sortedr?   r   r   sysmaxsizerA   rW   ):r   r   r   rz   r   resultZgrid_heightZ
row_numberZ	row_grouprowcellZgridZzipped_gridZtotal_horizontal_border_spacingrE   rF   Zouter_min_widthZouter_max_widthr   columnsZcolumn_numberZcolumn_groupr   Zcolspan_cellsZcolspansZmin_content_widthsr|   groupsgroupZrows_originsyr   Zrow_originsxr   spanZpercentage_contributionsZpercentage_contributionr   r   ZconstrainednessZmin_contentZmax_contentZcolumn_sliceZcolumns_min_contentZcolumns_max_contentspacingZexcess_widthZsmall_percentage_contributionsZ'large_percentage_contribution_numeratorZ)large_percentage_contribution_denominatorZlarge_percentage_contributionZtable_min_content_widthZtable_max_content_widthZtable_min_widthZtable_max_widthZtable_outer_min_content_widthZ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r4d}n|jdksBJ |j}| j d dkrl| j d jdkrld}q| j}|| j d | j d	 \}}}|r|s|sd}qt|||d|d
dd\}}n*| j d jdkrd}n|jdksJ |j}t| ||S )z:Return the min-content width for an ``InlineReplacedBox``.r3   r4   heightr5   r=   rF   r   image_resolutionrG   ,     Zdefault_widthZdefault_heightr>   r?   rA   rJ   rK   r	   rB   	r   r   r3   r   imageZintrinsic_widthZintrinsic_heightZintrinsic_ratiorL   r   r   r   r&     s6    

r&   c           	   	   C   s   | j d }|dkr| j d }|dks.|jdkr4d}n|jdksBJ |j}| j}|| j d | j d \}}}t|||d|dd	d
\}}n*| j d jdkrd}n|jdksJ |j}t| ||S )z:Return the max-content width for an ``InlineReplacedBox``.r3   r4   r   r5   r=   r   rG   r   r   r   r   r   r   r   r   r   r1     s*    


r1   c                    sf    fdd|j D }|s$t||dS |jd drR|jd dkrRt||t|S t||t|S dS )	z9Return the min-content width for an ``FlexContainerBox``.c                    s   g | ]}|j rt |qS r   )is_flex_itemr   r7   rb   r   r   r<     s   z*flex_min_content_width.<locals>.<listcomp>r   flex_directionr   Z	flex_wraprg   Nr@   rB   r>   
startswithr   r   )r   r   r   Zmin_contentsr   rb   r   r(     s    
r(   c                    sX    fdd|j D }|s$t||dS |jd drDt||t|S t||t|S dS )z9Return the max-content width for an ``FlexContainerBox``.c                    s   g | ]}|j rt |qS r   )r   r   r7   rb   r   r   r<     s   z*flex_max_content_width.<locals>.<listcomp>r   r   r   Nr   )r   r   r   Zmax_contentsr   rb   r   r2     s    
r2   c                 C   s0  ddl m}m} t|tjtjfr8|js,dS |jd }qt|tjrX|j	rX|j
d dv s\dS |j	d}|j
d dkst|t|j	krdS |rd}|d	ur|}|| |d	|\}}}q|sJ ||}	|| |	d	|\}	}}|	d	u r|jS |d	u sJ |j|	j S n&||j	|j
| d	|j\}}}}
}}|
S d	S )
z6Return the size of the trailing whitespace of ``box``.r   )r   split_text_boxr   r_   rd   re    rG   N)inliner   r   r   r   r"   r#   r@   rn   ro   r>   rstriprm   Zcopy_with_textr3   rs   )r   r   r   r   Zstripped_textresumeZ
old_resumeZold_boxrL   Zstripped_boxr3   r   r   r   ra     s<     

ra   )T)T)TT)TT)T)T)TNFF)TF)T)NF)T)T)T)T)T)#__doc__r   	functoolsr   mathr   Zformatting_structurer   Ztext.line_breakr   r   Zreplacedr	   r   r   r   rD   rN   rW   rB   r   r/   r$   r0   r!   r   r.   r\   ry   r   r&   r1   r(   r2   ra   r   r   r   r   <module>   sD   



.


  


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