o
    Zh0hL                     @   sT  d 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 dd	lmZmZmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZ ddlmZmZ 			d9ddZdd Z dd Z!edd Z"dd Z#dd Z$dd  Z%d!d" Z&d#d$ Z'd%d& Z(d'd( Z)d)d* Z*d+d, Z+d-d. Z,d/d0 Z-d1d2 Z.d3d4 Z/d5d6 Z0d7d8 Z1dS ):zCPage breaking and layout for block-level and block-container boxes.    )inf   )boxes   )AbsolutePlaceholderabsolute_layout)columns_layout)flex_layout)avoid_collisionsfloat_layoutget_clearance)grid_layout)iter_line_boxes)handle_min_max_width)
percentageresolve_percentagesresolve_position_percentages)block_replaced_box_layout)table_layouttable_wrapper_widthTNFc                 C   s  |du rg n|}|du rg n|}|du rg n|}t |tjs~t|| |jdkr+d|_|jdkr3d|_| jdkrY|rY|jp>|}|rY|jd dkrLd|_n|jd dkrY| j	sYd|_t
g ||j}t| |||_|jdur~|j| |j }||j |_g }t| |||||||||	|
S )z Lay out the block-level ``box``.Nautor   r   margin_breakdiscard)
isinstancer   TableBoxr   
margin_topmargin_bottomcurrent_pageis_for_root_elementstyleforced_breakcollapse_marginr   	clearance
position_yblock_level_layout_switch)contextboxbottom_space
skip_stackcontaining_blockpage_is_emptyabsolute_boxesfixed_boxesadjoining_marginsr   	max_linescollapse_with_pagecollapsed_margintop_border_edge r2   M/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/layout/block.pyblock_level_layout   s<   





r4   c                 C   s   t |tjrt| |||||||}nQt |tjr&t| |||||||||	|
S t |tjr3t| ||}n0t |tjrFt	| ||||||||		}nt |tj
rXt| |||||||}ntdt|j dg |dR S )z;Call the layout function corresponding to the ``box`` type.zLayout for z not handled yetN)r   r   r   r   BlockBoxblock_box_layoutBlockReplacedBoxr   FlexBoxr	   GridBoxr   	TypeErrortype__name__)r%   r&   r'   r(   r)   r*   r+   r,   r-   r   r.   resultr2   r2   r3   r$   A   s2   



r$   c                 C   s:  |j d dks|j d dkrPt| ||||||||	}|d }|du rI|d }|j|j |j }|rIt| |g|| ||7 }t| ||||||||	}g |dR S |jr]t| ||j|j	f t
|| t| ||||||||	|

}|d  }r{|js{|jr}|S |js| rt| ||dd\}}}|||j ||j  |S )	zLay out the block ``box``.column_widthr   column_countr   Nr   F)outer)r   r   r   padding_bottomborder_bottom_widthremove_placeholdersis_table_wrapperr   widthheightblock_level_widthblock_container_layout	is_columnis_flex_itemestablishes_formatting_contextr
   	translate
position_xr#   )r%   r&   r'   r(   r)   r*   r+   r,   r-   r   r.   r=   	resume_atnew_boxcolumns_bottom_spacerM   r#   _r2   r2   r3   r6   ^   sV   





r6   c                 C   s  t |tjr|j}|jd }n|d }d}| j}| j}| j}| j}| j	}| j
}	| j}
|| | |	 }| jdkra||
 }|dkrC||7 }|dkrK||7 }||kra|dkrXd }| _|dkrad }| _|
dkr|dkr|dkr|dkr| js|  j|| |
 | | 7  _|
dkr|dkrd }| _|dkrd }| _||| |   }
| _|| |
 }||  krdkrn n|d | _|d | _dS |dkr|dkr|| | _dS |dkr|dkr|| | _dS dS dS )zSet the ``box`` width.	directionr   ltrr   rtlr   N)r   r   BoxrE   r   margin_leftmargin_rightpadding_leftpadding_rightborder_left_widthborder_right_widthrI   rM   )r&   r)   cb_widthrR   margin_lmargin_r	padding_l	padding_rborder_lborder_rrE   paddings_plus_borderstotal
margin_sumr2   r2   r3   rG      s\   







rG   c                 C   s   | j d dkrVt| | | jdkr&| jdkr&| j d dkr!| j}n| j }n| jdkr/| j}n| jdkr9| j }nd}| jdkrD| j}n| jdkrN| j }nd}| || t| tj	tj
frj| jD ]	}t|| qbdS dS )z5Translate the ``box`` if it is relatively positioned.positionrelativer   rR   rS   r   N)r   r   leftrighttopbottomrL   r   r   	InlineBoxLineBoxchildrenrelative_positioning)r&   r)   translate_xtranslate_ychildr2   r2   r3   ro      s,   








ro   c
              	   C   sd  d}
d }d }d }| j t|7  _ | r6t| }}||_|| |jd dkr0|| n||| nv| rt| |||||	d d\}}| 	|	|j |j
 }|rV| p\| p\| }|rh||_|| nDt|}t||}|d i}d }d}
|rt|| rt| |||}|r|\|d d < }d }n| r|jd d }| j}| j| | | |
|||fS )NFrf   absoluter(   Tr   )r#   r!   is_absolutely_positionedr   indexappendr   
is_floatedr   overflows_pagerF   is_monolithicfind_last_in_flow_childblock_level_page_breakavoid_page_breakfind_earlier_page_break
is_runningr   running_elements)r%   r&   rv   rr   new_childrenr*   r+   r,   r-   r'   stoprN   	new_childout_of_flow_resume_atplaceholderpage_overflow	add_childlast_in_flow_child
page_breakr=   running_namepager2   r2   r3   _out_of_flow_layout   s\   



r   c                 C   s   t ||jd  }|dk r|st| |j|	|
 dd|fS |jd d }|r4|D ]}|d8 }|dkr3 nq'||krG|sGt| |j|	|
 dd|fS |re||kre|| d  D ]
}t| |j|	|
 qT|| d = t| |j|	|
 dd||ifS )Norphansr   TFwidowsr   )lenr   rC   rn   )r%   r&   liner   lines_iteratorr*   rv   r(   rN   r+   r,   over_orphansneededrQ   rr   r2   r2   r3   _break_line-  s,   


r   c                    s>  d }}d }g }t |jdksJ d|r|
t|7 }
|}t ||
|	|||||	}t|D ]\}\}}|d urI|dkrE|jd |d _ n|d8 }||_|j|j	 }||d u O }|ra|j
|j }nd}|sh| oo |	|| }|rt ||||||||||\}}} n|r |	|r||j8 }|d|j  d|_ jrd} fdd| D }|D ]M} |}|| |pȈ jpȈ |	|| }|r | |s|s|jd	 d
krt ||||||||||\}}}d} n|jd	 dkrd }} nq|r n
|| |}
|}q-|r||d ji}||||
||fS )NFr   z$line box with siblings before layoutr   block_ellipsisc                 3   s"    | ]}|j  jv r|j V  qd S N)footnote	footnotes).0
descendantr%   r2   r3   	<genexpr>  s    z"_linebox_layout.<locals>.<genexpr>footnote_policyr   Tblock)r   rn   r!   r   	enumerater   r   rN   r#   rF   rB   rA   ry   r   r   rL   r   descendantslayout_footnoterw   reported_footnotesreport_footnote)r%   r&   rv   rr   r   r*   r+   r,   r-   r'   r#   r(   first_letter_styledraw_bottom_decorationr.   abortr   rN   new_footnotesnew_containing_blockr   ir   new_position_yoffset_yoverflowbreak_lineboxr   r   r2   r   r3   _linebox_layoutM  s   











r   c           ,      C   sh  d }}t |}|d ur9t||}t||}|st|| r8| d }||d}|d i}d}||||
||||fS nd}|}|jst|| |d u r|rt|}|j}|dkrYd}n| j	dkrv|rv|j
d dkrjd}n|j
d dkrv| jsvd}tg ||}|| }|D ]}|j|d	 qt| ||}|d ur|D ]	}|j| d	 qt|}| j||j 7  _g }| }
|r|jrt|}| j|7  _|
|7 }
g }n1t|tjs|j
d
 dkrd} n	t|j
d
 |j} ||  t||  }!| j|!7  _|
|!7 }
g }|otdd |D  }"t|dd s||_t| ||	|||"|||||\}#}}}$}%}|#d ur|%s|# |#j }&|# |#  }'| |	|&}(| |	|'})|"pS|  }*|*rf|(rft| |#g|| d }#n8|*r|)rt| |#g|| |	|#j |#j! 7 }	t| ||	|||"|||||\}#}}}$}%}|#r|# |#  }
n|'}
|$}|#r||#j" |#r|#j#r|# |#  }
d }|#d u rt$|| rt%| |||}+|+r|+\}}d}||||
||||fS |sd}||||
||||fS t&dd |D rt| ||| g }|r|d i}d}nd}||||
||||fS ||#_'||# |d ur*||i}d}||||
||||fS )NFr   breakr   Tr   r   r   r   )dyr   c                 s   s    | ]
}t |ts|V  qd S r   )r   r   r   rr   r2   r2   r3   r     s    
z"_in_flow_layout.<locals>.<genexpr>r   c                 s   s    | ]}|  V  qd S r   )ru   r   r2   r2   r3   r   Y      )(r{   r|   block_level_page_nameforce_page_breakpage_valuesrD   r   r!   r   r   r   r    rL   r   r#   content_box_yr   r   r5   r   rE   rw   anygetattrr   r4   rF   border_box_yborder_heightry   rz   rC   rA   rB   r   r"   r}   r~   allrv   ),r%   r&   rv   rr   r   r*   r+   r,   r-   r'   r#   r(   r   r   collapsing_with_childrenr   	next_pager.   r   r   r   r   	page_namerN   r   old_collapsed_marginchild_margin_topnew_collapsed_margincollapsed_margin_differenceprevious_new_childr"   r0   r   r   page_is_empty_with_no_childrenr   next_adjoining_marginscollapsing_throughnew_content_position_yr   content_page_overflowborder_page_overflow	can_breakr=   r2   r2   r3   _in_flow_layout  s4  



	














r   c
           -      C   s  t |tjsJ | r|   |du }
|j|
 dd ||jd dkO }|p-|jd dk}|du r4g }|rA||j|j |j	 7 }|
|j |}|jp[|jp[|jp[|jp[| p[|j }|rc|j}n| jt||j 7  _g }| }| }|jd d	krg }g }d
dd}g }i }d}|jd dkrt|jd |	pt}	|
rd}t|dd}n	| \\}}d}t|j|d |pddD ]\}}||_||_g }| sd}t| |||||||||
\}}}}|r|||f||< nt |tjrt| ||||||||||||||	\}}}}}}	||du O }g }||7 }n]t | |||||||||||||||||	\}}}}}}}}d}d||	fvrw|}	|	dkrwd}||jd k} | sw|}!|!rw|!d } t | tjrj|jd | _!nt | tj"rv| j}!qU	 |r|# d }"t$| |j|d || |D ]}#| %|# qddd
|"dg d|	f  S |r|j&dkr| '|j|(  |rd}g } nqd}|du}$|jd dkrd}|$rt)|jd | r|st$| g ||j|d || ddd
ddg d|	fS | D ]
\}%}&|&| j*|%< q|r| jt||j 7  _t+|}d}'|du rTt|}(|j&dv rMt,| ||(du rMt-dd |j.|j|j|j|jfD rMd}'n||(7 }g }n|j&dkr\g }|jsq|jsq| sq|jsq|j/ry|t|7 }g }|$r|r|d } t | tjr|jd | _!|0|})|)j|
 |$o| d |)j&dkr| j1r|)jd dkrt2dd | j1D }*t2|*|}||)  |)_&|)jd d	kr|D ]}+t3| |+|)||dd q|)jD ]}t4||)j5|)j&f q|) r| 6|) |s|$st2t|)j&|)j7|)j.|)_&n3|t krA|)j8sA| j9| |)j |): |)j&  },|,|)j&krA|,|)_&|rA|) j&|j|j |j	 7  _&|d du rP|)# d |d< |)||||'|	fS )zSet the ``box`` height.NF)startendcontinuer   box_decoration_breakclonerf   rg   r   r   r.   noner   r   )r   Tr   r   r   break_inside)r   r   c                 s   s    | ]}|d kV  qdS r   Nr2   )r   valuer2   r2   r3   r     r   z)block_container_layout.<locals>.<genexpr>r   visiblec                 s   s    | ]
}|j |  V  qd S r   )r#   margin_height)r   	float_boxr2   r2   r3   r   >  s
    
rt   r   r   );r   r   BlockContainerBoxrK   create_block_formatting_contextremove_decorationr   rA   rB   r   rw   r   border_top_widthpadding_toprJ   is_grid_itemr   r#   r!   r   content_box_xminr   r   itemsr   rn   rM   is_in_normal_flowr   rm   r   r   r   	ParentBoxr   rC   unlayout_footnoterF   	overflowsr   r}   broken_out_of_flowr{   r   r   
min_heightrD   copy_with_childrenexcluded_shapesmaxr   ro   rE   finish_block_formatting_context
max_heightrI   page_bottomr   )-r%   r&   r'   r(   r*   r+   r,   r-   r   r.   is_startr   this_box_adjoining_marginsr   r#   rM   r   r   all_footnotesr   r   skipr   rv   rr   r   r   r   rN   r   r   new_max_lines
last_childrn   r   r   box_is_fragmentedkeyr   r   r0   rO   max_float_position_yabsolute_boxnew_box_heightr2   r2   r3   rH   x  s  
"














rH   c                 C   s<   dg}| |  dd |D }dd |D }t|t| S )zCGet the amount of collapsed margin for a list of adjoining margins.r   c                 s   s    | ]	}|d kr|V  qdS r   r2   r   mr2   r2   r3   r   o      z"collapse_margin.<locals>.<genexpr>c                 s   s    | ]	}|d kr|V  qdS r   r2   r   r2   r2   r3   r   p  r   )extendr   r   )r-   margins	positives	negativesr2   r2   r3   r!   k  s
   
r!   c                 C   s   g }t jt jt jf}| }t||r'||jd  |jsn
|jd }t||s|  |}t||rH||jd  |js>n
|jd }t||s2d}|D ]}|dv sX||fdv rZ|}qL|S )a  Get the correct page break value between siblings.

    Return the value of ``page-break-before`` or ``page-break-after`` that
    "wins" for boxes that meet at the margin between two sibling boxes.

    For boxes before the margin, the 'page-break-after' value is considered;
    for boxes after the margin the 'page-break-before' value is considered.

    * 'avoid' takes priority over 'auto'
    * 'page' takes priority over 'avoid' or 'auto'
    * 'left' or 'right' take priority over 'always', 'avoid' or 'auto'
    * Among 'left' and 'right', later values in the tree take priority.

    See https://drafts.csswg.org/css-page-3/#allowed-pg-brk

    break_afterr   break_beforer   r   )rh   ri   rectoverso))r   r   )r   avoid)r   
avoid-page)r   avoid-column)columnr   )r  r  )r  r  )r  r  )r  r   )r  r   )r  r   )	r   BlockLevelBoxTableRowGroupBoxTableRowBoxr   rw   r   rn   reverse)sibling_beforesibling_aftervaluesblock_parallel_box_typesr&   r=   r   r2   r2   r3   r|   t  s0   





r|   c                 C   s(   |   d }|  d }||kr|S dS )zBReturn the next page name when siblings don't have the same names.r   r   N)r   )r  r  before_page
after_pager2   r2   r3   r     s
   r   c                 C   s  |r@t |d tjr@|d jd }|d jd }t|| }||k r$dS |d| }d|d ji}t| ||d || ||fS d}	t|D ]\}}
t |
tjrW|
j	sV|
j
rWqF|
jr[qF|
 rt|
|	}|	durt|| s|d7 }|d| }|| jdi} n]|
}	|
 rt|
jd | stjtjtjf}t |
|rt| |
j||}|r|\}}|
|}g |d| |}t |
tjr||d D ]
}|j
r|| q|j|i}|d7 } nqFdS t| ||d || ||fS )aq  Find the last possible page break in ``children``.

    Because of a `page-break-before: avoid` or a `page-break-after: avoid` we
    need to find an earlier page break opportunity inside `children`.

    Absolute or fixed placeholders removed from children should also be
    removed from `absolute_boxes` or `fixed_boxes`.

    Return (new_children, resume_at).

    r   r   r   Nr   r   r   )r   r   rm   r   r   rN   rC   reversed_enumerater
  	is_header	is_footerrI   r   r|   r}   rv   r5   r   r~   rn   r   rw   )r%   rn   r+   r,   r   r   rv   r   rN   previous_in_flowrr   r   breakable_box_typesr=   new_grand_childrenr   
next_childr2   r2   r3   r~     sr   





r~   c                 C   s"   t | D ]
}| r|  S qdS )z=Find and return the last in-flow child of given ``children``.N)reversedr   )rn   rr   r2   r2   r3   r{     s
   r{   c                 C   s   t ttt| t| S )zBLike reversed(list(enumerate(seq))) without copying the whole seq.)zipr  ranger   )seqr2   r2   r3   r  	  s   r  c                 C   s   |D ]E}t |tjrt| |j|| |jd dkr#||v r#|| n|jd dkr3||v r3|| |jr<| |j || j	v rG| j	
| qdS )zRemove placeholders from absolute and fixed lists.

    For boxes that have been removed in find_earlier_page_break(), remove the
    matching placeholders in absolute_boxes and fixed_boxes.

    Also takes care of removed footnotes and floats.

    rf   rs   fixedN)r   r   r   rC   rn   r   remover   r   r   pop)r%   box_listr+   r,   r&   r2   r2   r3   rC     s   	


rC   c                 C      |j r| dv S | dv S )z$Test whether we should avoid breaks.)r  r  r  )r  r  	in_columnr   r%   r2   r2   r3   r}   %  s   r}   c                 C   r"  )z$Test whether we should force breaks.)r   rh   ri   r  r  r  )r   rh   ri   r  r  r#  r%  r2   r2   r3   r   ,  s   r   )TNNNFN)2__doc__mathr   formatting_structurer   rs   r   r   r  r   flexr	   floatr
   r   r   gridr   inliner   min_maxr   percentr   r   r   replacedr   tabler   r   r4   r$   r6   rG   ro   r   r   r   r   rH   r!   r|   r   r~   r{   r  rC   r}   r   r2   r2   r2   r3   <module>   sL    
//
>B j B t	8N