
    ,g@y                         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
 Zd dZd dZd Zd Zd!dZd!dZd dZd dZ	 	 d"dZd#dZd Zd Zd dZ	 	 d$dZd Zd dZd dZd dZd dZ d dZ!d Z"y)%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           	      ^    t        t        t        | |d      |      t        | |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_widths      s/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/weasyprint/layout/preferred.pyshrink_to_fitr      s6     gs%8#	% 	'3e4	6 6    c                    |j                   rt        | ||      d   S t        |t        j                        rt        | ||      S t        |t        j                  t        j                  f      rt        | ||      S t        |t        j                        rt        | |      S t        |t        j                  t        j                  f      rt        | ||d      S t        |t        j                        rt        ||      S t        |t        j                         rt#        | ||      S t        |t        j$                        rt        | ||      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   s      r   r   r   $   s+    1'3FqII	C++	,+GS%@@	C%1153G3GH	I&wU;;	C22	3)'377	C%//5==9	:'e4PP	C**	+)#u55	C//	0%gsE::	C//	0&wU;;0c1C1C0DDTUVVr   c                    |j                   rt        | ||      d   S t        |t        j                        rt        | ||      d   S t        |t        j                  t        j                  f      rt        | ||      S t        |t        j                        rt        | |      S t        |t        j                  t        j                  f      rt        | ||d      S t        |t        j                        rt        ||      S t        |t        j                         rt#        | ||      S t        |t        j$                        rt        | ||      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/   r0   r1   s      r   r   r   ?   s0    1'3FqII	C++	,/eDQGG	C%1153G3GH	I&wU;;	C22	3)'377	C%//5==9	:'e4PP	C**	+)#u55	C//	0%gsE::	C//	0&wU;;0c1C1C0DDTUVVr   c                 *   |j                   d   }|dk(  s|j                  dk(  rB|j                  D cg c]  }|j                         s || |d       }}|rt	        |      nd}n|j                  dk(  sJ |j
                  }t        |||      S c c}w )z+Helper to create ``block_*_content_width.``widthauto%Tr   r   px)styleunitchildrenis_absolutely_positionedr   valueadjust)r   r   functionr   r9   childchildren_widthss          r   _block_content_widthrF   Z   s    IIgE%**+
 ?Bll55:113 We405 5 )8O$QzzT!!!#ue$$5s   "Bc                    | 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                        r| j                  j                  d| j                   d         \  }}}|x| j                   d   }|dk7  r(|j                  dk7  rt        ||j                  |z        }| j                   d	   }|dk7  r(|j                  dk7  rt        ||j                  |z        }t        |t        ||            S )
z;Get box width from given width and box min- and max-widths.	min_width	max_widthr:   r;   r   r	   	font_size
min_height
max_height)r=   r>   rA   r   r   r   r)   replacementget_intrinsic_sizer   r   )r   r9   rH   rI   _ratiorK   rL   s           r   min_maxrQ   l   s"   		+&I		+&IFinn3	OO	Finn3	OO	#u(()oo88syy%'1e<0JV#
3(>	:+;+;e+CD	<0JV#
3(>	:+;+;e+CD	y#eY/00r   c                    d}|rddgng |rddgng z   D ]V  }| j                   |   }|dk7  s|j                  dk(  r||j                  z  }7|j                  dk(  sJ ||j                  z  }X | j                   d	   d
k(  }|r0|rt        | d      r|| j                  z  }n|| j                   d   z  }|r0|rt        | d      r|| j
                  z  }n|| j                   d   z  }|dk  r|d|dz  z
  z  S y)z3Add box paddings, borders and margins to ``width``.r   margin_leftpadding_leftmargin_rightpadding_rightr:   r<   r;   border_collapsecollapseborder_left_widthborder_right_widthd   r	   )r=   r>   rA   hasattrrY   rZ   )r   r9   leftrightpercentagesrA   style_valuerX   s           r   margin_widthra      s2   K -1-	(b.3./	*	=
1 ii&& 4'***"''3...{000
1 yy*+z9H%89 S***E SYY233E%9:S+++E SYY344ESK#--.. r   c                 >    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.

    )rQ   ra   )r   r   r9   r]   r^   fixeds         r   rB   rB      s)     CECe44r   c                 &    t        | |t        |      S )z0Return the min-content width for a ``BlockBox``.)rF   r   r1   s      r   r#   r#      s    '0 0r   c                 &    t        | |t        |      S )z0Return the max-content width for a ``BlockBox``.)rF   r   r1   s      r   r4   r4      s    .?GGr   c           	      p    t        | |||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   rh   ri   r   widthsr9   s           r   r(   r(      s@      e]D*6F 'DLCKE#ue$$r   c           	          t        t        | |||d            }|dxx   t        | |      z  cc<   t        ||t	        |            S )z2Return the max-content width for an ``InlineBox``.F)rg   )listrj   trailing_whitespace_sizerB   r   )r   r   r   r   rl   s        r   r5   r5      sH    7CuMOF 2J*7C88J#uc&k**r   c                     |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``.r9   r:   r;   r   r<   F)r=   r>   rA   rB   )r   r   r9   s      r   r%   r%      sQ    IIgE%**+zzT!!!#ue$$r   c                     |j                   D cg c]  }|j                         st        | |        }}t        |||rt	        |            }|S d      }|S c c}w )z4Return the min-content width for a ``TableCellBox``.r   )r?   r@   r   rB   r   )r   r   r   rD   rE   children_min_widths         r   r    r       sw     \\1--/ 	'5)1O 1   /O8
  678
 1s   #Ac                 R    t        | ||      }t        |t        | ||            }||fS )z=Return the min- and max-content width for a ``TableCellBox``.)r    r   r4   )r   r   r   rH   rI   s        r   r3   r3     s3     -Wc5AII6wUKLIir   c           
   #     K   t        |t        j                        r6|j                  d   j                  dk7  r|j                  d   j
                  }nd}d}|d}	n|j                         \  \  }	}|j                  |	d  D ]]  }
|
j                         rt        |
t        j                        rzt        | |
|||||      }|rt        |      g}nt        |      }t        |      dk(  rt        |
||d         |d<   nt        |
||d   d      |d<   t        |
||d   d      |d<   nkt        |
t        j                        r1|
j                  d	   d
v }|
j                  d	   dv }|d}	n|j                         \  \  }	}|J |
j                   j#                         |	xs dd  }|r|r|j%                  d      }|rdnd }g }dx}}|Z||z  }t'        ||d  j)                         |
j                  | ||
j*                  |d      \  }}}}}}|j-                  |       |rn|Z|r|r
||d   z  } nt/        |j)                         dd  dz   |
j                  d         }|r5|r3|r1|j-                  d       n|rdt1        | |
      dg}nt3        | |
      g}||d   z  }t        |      dkD  r*||z    d}t        |      dkD  r|dd D ]  }|  |d   }|d   dk(  }d }` ||z    y w)Ntext_indentr;   r   r	   F)r^   rn   )r]   white_spacenormalnowrappre-line)ry   zpre-wrapr{       T)r   rg   alangr   )r   r   r'   r=   r>   rA   itemsr?   r@   r&   rj   rk   ro   lenrB   TextBoxtextencodelstripr   decodejustification_spacingappendr   r   r   )r   r   r   r   rg   rh   ri   rv   current_lineskiprD   linesspace_collapse	text_wrap
child_textrI   resume_indexnew_resume_indexrO   r9   	can_breaklines                         r   rj   rj     sA    #u}}%#))M*B*G*G3*Nii.44L(..0zde$ H))+eU__-&}gzE eU5zQ!%a9a!%aFa"5%rGb	u}}-"[[7 <0 0NM26XXI!&0&6&6&8#"z!)))**,dia\:J'..t4
$$IE.//L+". 006F|}-446Wi//} 7"31&q! U# #. .a(&!!#BC(3.F0CEI9Q -gu=qA*7E:;a u:>,,K5zA~!!BK DJ 9Lb	Q
QHR 
$$s   HK)"CK)c                    | j                   d   dk7  r5| j                   d   j                  dk(  r| j                   d   j                  nd}| j                   d   dk7  r5| j                   d   j                  dk(  r| j                   d   j                  nt        }| j                   d   dk7  r5| 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

    rH   r:   r;   r   rI   r9   )r=   r>   rA   r   r   r   )r   rH   rI   r9   s       r   _percentage_contributionr   g  s     ),		+(>&(H		+##s* 			+$$01  ),		+(>&(H		+##s* 			+$$03  %(IIg$6&$@		'3& 			'  ,- 
 y#eY/00r   c                 >  <= ddl m} |j                         }| j                  j	                  |      }|r||   S d\  }}d}|j
                  D ]e  }	|	j
                  D ]T  }
|
j
                  D ]>  }t        |j                  |j                  z   |      }t        ||j                  z   |      }@ |dz  }V g t        |      D cg c]  }dg|z  
 }}d}|j
                  D ];  }	|	j
                  D ]*  }
|
j
                  D ]  }|||   |j                  <    |dz  }, = t        t        |       }|j                  d   dk(  rA|dkD  r<|j                  d   d   dt        |D cg c]  }t        |      s| c}      z   z  }nd}|dk(  s|dk(  r~g |_        t!        | |d	
      }t#        | |d	
      }t%        |dt!        | |            }t%        |dt#        | |            }g g g g |g f}||g|||g|dx| j                  |<   }||   S dg|z  }dg|z  }d}|j&                  D ]+  }|j
                  D ]  }|||<   |||<   |dz  }||k(  s n + n g }t)               }dg|z  }dg|z  =dg|z  <t        |      D ]  }||fD ]]  }||   x}st        ||   t+        | |            ||<   t        =|   t-        | |            =|<   t        <|   t/        |            <|<   _ ||   D ]  }|s|j                  dk(  rOt1        | |      \  }}t        ||   |      ||<   t        =|   |      =|<   t        <|   t/        |            <|<   d|j3                  |       |j5                  |j                  dz
           g }t7        |      D ]B  \  }}
d} |j3                  g x}!       t7        |
      D ]  \  }"}|r|"} |!j3                  |         D t8        <=fd       }#t;        |      D ]  }$g }%t        |      D ]y  }<|   x}&r|%j3                  |&       t        ||      D ]>  \  }
}!|!|   x} |
|    }'|'j                  dz
  |$k7  r& |#|'| =|         }(t        |&|(      }&@ |%j3                  |&       { |%< t        |      D cg c]  }d	 })}t        |      D ]  }||   r:||   j                  d   dk7  r%||   j                  d   j<                  dk7  rd|)|<   B||   r:||   j                  d   dk7  r%||   j                  d   j<                  dk7  rd|)|<   ||   D ]K  }|s|j                  dk(  s|j                  d   dk7  s)|j                  d   j<                  dk7  sFd|)|<      t7        <      D *cg c]   \  }}*t?        |*dtA        <d|       z
        " c}*}<|D ]  }t+        | |      }+t-        | |      },tC        |j                  |j                  |j                  z         }-tA        ||-         }.tA        =|-         }/|j                  d   dk(  r#|j                  dz
  |j                  d   d   z  }0nd}0|+|.|0z   kD  r|+|.|0z   z
  }1 || ||1||)<=|-       |,|/|0z   kD  s|,|/|0z   z
  }1 || ||1=|)<=|-        t        |      D cg c]  }<|   r=|   <|   dz  z   }2}tA        <=fdt        |      D              }3dtA        <      z
  dz  }4|4dk(  r|3dk(  rd}5ntD        jF                  }5n|3|4z  }5|tA        |      z   }6|t        tA        =      |5g|2      z   }7|j                  d   dk7  r8|j                  d   j<                  dk(  r|j                  d   jH                  x}8}9n|6}8|7}9t        |6t%        |d	|8            }6t        |7t%        |d	|9            }7tK        |tK        ||6            }:tK        |tK        ||7            };|=<|)||f}|6|7g||:|;g|dx| j                  |<   }||   S c c}w c c}w c c}w c c}*}w c c}w )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   NrW   separateborder_spacingFr   T)r   r9   )FTc                 T   t        ||| j                  z         }t        |         }t        |       }t	        d||z
        }t        ||| j                  z         D cg c]  }|   dk(  r|    }}t        |      }	|	dk(  rdt        |      xs dz  }
||
z  S ||	z  }
||
z  S c c}w )Nr   r	   )slicecolspansumr   r   ranger   )origin_celloriginr   
cell_slicebaseline_percentagecell_percentage_contributiondiffjother_columns_contributionsother_columns_contributions_sumrP   intrinsic_percentagesmax_content_widthss              r   get_percentage_contributionzGtable_and_columns_preferred_widths.<locals>.get_percentage_contribution  s     66K,?,?#?@
!"7
"CD'?'L$125HHI 66K,?,?#?@'.$Q'1, q!'.# '. +..I*J'*a/89>Q?E e| &(GGEe|'.s   B%r9   r:   r;   r[   c              3   8   K   | ]  }|   d k(  r|     yw)r   N ).0ir   r   s     r   	<genexpr>z5table_and_columns_preferred_widths.<locals>.<genexpr>N  s+      2*"# #q( 	12*s   r<   )&tabler   get_wrapped_tabletablesgetr?   r   grid_xr   rowspanr   ro   zipr=   r   anyr#   r4   rB   column_groupssetr   r   r   r3   r   add	enumerater   sortedr>   r   r   r   sysmaxsizerA   ra   )>r   r   r   r   r   result
grid_widthgrid_height
row_number	row_grouprowcellr   gridzipped_gridcolumntotal_horizontal_border_spacingrH   rI   outer_min_widthouter_max_widthr   columnscolumn_numbercolumn_groupcolspan_cellscolspansmin_content_widthsgroupsgrouprows_originsyr   row_originsxr   spanpercentage_contributionspercentage_contributionr   r   constrainedness
percentage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   s>                                                               @@r   r   r   y  sN
    /!!#E^^&Fe} #JJ^^ 	%% 	C J t||!;ZH
!*t||";[IJ !OJ		 */{);<ATFZ<D<J^^ 	%% 	C 504Z -5!OJ	 sDz"K {{$%3
QKK()!,;F#f+fFGGI 	( +,'Q+*+GU%H	+GU%H	 t#:7E#JL t#:7E#JLb"b"A2Fy262"O=f=*
 	
u e}FZ'Mfz!GM++ 	"++ 	F+7M-(%+GM"QM
*	 	 MuH z)z)C*, : /$g. 	OFq	!u!(+&q)+<We+L)N"1%(+&q)+<We+L)N"1%+.)!,.Fu.M,O%a(	O  N 	/D||q 'GQU'V$	9(+,>q,A9(M"1%(+,>q,A9(M"1%+.)!,.Ft.L,N%a( $$T*T\\A-.	//8 LD/ '32-K. ~ 	'GAtv&	''  " x  9#% z" 	EA*?*BB&B(//0GH$'l$; 	K [)!n,F5!&k&&*d2/J);A)>0@,*-+-I+K'	K %++,CD	E" !9'9, ',J&78u8O8: !q!1!7!7!@F!Ja &&w/44;!%OAAJ71:++G4>
  )..#5!%OAN 	D*JJw'61JJw',,3%)"	$ ''<=?Az 	Jc"7";<<=?
  '6'6T[[$++*DE!"4\"BC!"4\"BC;;()Z7||a'5;;7G+H+KKGG,w66&*=*GHL#l4F!68J
 ,w66&*=*GHL#l4F!68J)8 z"&% # 	1!6q!9C!?@&%" &% /2 2*',Z'82* /*+ 
s()	)S0 .0A52a7,-) -0KK) 456 	&
 	(#.@*AA  	(#"#%B/-+/- +. 	. 
 {{7v%%++g*>*C*Ct*K -2KK,@,F,FF/11!o"78 "o"78 %1|C!89%;!$0|C!89%;! 	.0E8+GF ()@J6J,.KUfU& GNN5F %=g = Gn 9"?>&%s$   `!`
2`
	`%``c           	      Z   | 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k7  r| j                   d   j                  dk(  rd}n| j                  }|j	                  | j                   d   | j                   d	         \  }}}|r|s|sd}nRt        |||d|d
d      \  }}n<| j                   d   j                  dk(  rd}n|j                  dk(  sJ |j                  }t        | ||      S )z:Return the min-content width for an ``InlineReplacedBox``.r9   r:   heightr;   r<   rI   r   image_resolutionrJ   ,     default_widthdefault_heightr=   r>   rA   rM   rN   r
   rB   	r   r   r9   r   imageintrinsic_widthintrinsic_heightintrinsic_ratiorO   s	            r   r*   r*     s8   IIgE8$Vv{{c1F;;$&&&\\FIIk"f,		+&++s2EOOE((II01399[3IK ?O- ?O/#%5#cCq 
7		 	 C	'zzT!!!#ue$$r   c           	         | j                   d   }|dk(  r| j                   d   }|dk(  s|j                  dk(  rd}n|j                  dk(  sJ |j                  }| j                  }|j	                  | j                   d   | j                   d         \  }}}t        |||d|dd	
      \  }}n<| j                   d   j                  dk(  rd}n|j                  dk(  sJ |j                  }t        | ||      S )z:Return the max-content width for an ``InlineReplacedBox``.r9   r:   r   r;   r<   r   rJ   r   r   r   r   r   r   s	            r   r6   r6     s    IIgE8$Vv{{c1F;;$&&&\\F$$		,-syy/EG 	;)? (-c3q 
7		 	 C	'zzT!!!#ue$$r   c                 @   |j                   D cg c]  }|j                  rt        | |       }}|st        ||d      S |j                  d   j                  d      r(|j                  d   dk(  rt        ||t        |            S t        ||t        |            S c c}w )z9Return the min-content width for an ``FlexContainerBox``.r   flex_directionr   	flex_wraprz   )r?   is_flex_itemr   rB   r=   
startswithr   r   )r   r   r   rD   min_contentss        r   r,   r,     s     \\9U%7%7 	'5)9L 9 c5!$$		"#..u5IIk"h.c5#l"344c5#l"3449s   Bc                    |j                   D cg c]  }|j                  rt        | |       }}|st        ||d      S |j                  d   j                  d      rt        ||t        |            S t        ||t        |            S c c}w )z9Return the max-content width for an ``FlexContainerBox``.r   r   r   )r?   r   r   rB   r=   r   r   r   )r   r   r   rD   max_contentss        r   r7   r7     s     \\9U%7%7 	'5)9L 9 c5!$$
yy!"--e4c5#l"344c5#l"3449s   B	c                 :   ddl m}m} t        |t        j
                  t        j                  f      rG|j                  sy|j                  d   }t        |t        j
                  t        j                  f      rGt        |t        j                        r|j                  r|j                  d   dv sy|j                  j                  d      }|j                  d   dk(  s!t        |      t        |j                        k(  ry|rgd}||} || |d	|      \  }}}|sJ |j                  |      }	 || |	d	      \  }	}}|	|j                  S |J |j                  |	j                  z
  S  ||j                  |j                  | d	|j                        \  }}}}
}}|
S )
z6Return the size of the trailing whitespace of ``box``.r	   )r   split_text_boxr   rn   rw   rx    rJ   N)inliner   r  r   r   r&   r'   r?   r   r   r=   rstripr   copy_with_textr9   r   )r   r   r   r  stripped_textresume
old_resumeold_boxrO   stripped_boxr9   s              r   rp   rp     s|   8
S5??EMM:
;||ll2 S5??EMM:
; sEMM*sxxIIm$(HHHHOOC(M
yy"c-&8CM&I J!/dF!KGVQ   w))-8"0\4#5fa== >!>==<#5#555/HHcii$0I0I K1a1r   )T)TT)TNFF)TF)NF)#__doc__r   	functoolsr   mathr   formatting_structurer   text.line_breakr   r   replacedr
   r   r   r   rF   rQ   ra   rB   r#   r4   r(   r5   r%   r    r3   rj   r   r   r*   r6   r,   r7   rp   r   r   r   <module>r     s       ( > *6 W6W6%$16+\0H
 CG=B% +	%$  PT"'U%p1$Od%D%45 5 r   