a
    ¥Q•hL±  ã                   @   sN  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rVd|_|jdkrfd|_| jdkr²|r²|jp||}|r²|jd dkr˜d|_n|jd dkr²| j	s²d|_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_linesZcollapse_with_pageÚcollapsed_marginZtop_border_edge© r0   úP/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/layout/block.pyÚblock_level_layout   s<    


þ


ýr2   c                 C   sÔ   t |tjƒr$t| |||||||ƒ}n¢t |tjƒrLt| |||||||||	|
ƒS t |tjƒrft| ||ƒ}n`t |tjƒrŒt	| ||||||||	ƒ	}n:t |tj
ƒr°t| |||||||ƒ}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.   Úresultr0   r0   r1   r$   A   s2    
þ
ý
þ
þr$   c                 C   s>  |j d dks|j d dkr t| ||||||||ƒ	}|d }|du r’|d }|j|j |j }|r’t| |g||ƒ ||7 }t| ||||||||ƒ	}g |¢d‘R S |jrºt| ||j|j	fƒ t
||ƒ t| ||||||||	|
ƒ
}|d  }rö|jsö|jrú|S |j�s| ¡ �r:t| ||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_boxZcolumns_bottom_spacerK   r#   Ú_r0   r0   r1   r4   ^   sX    ÿ
þ
ÿÿ
ÿýÿ


þÿÿr4   c                 C   sØ  t |tjƒr|j}|jd }n|d }d}| j}| j}| j}| j}| j	}| j
}	| j}
|| | |	 }| jdkrÂ||
 }|dkr†||7 }|dkr–||7 }||krÂ|dkr°d }| _|dkrÂd }| _|
dk�r|dk�r|dk�r|dk�r| j�s|  j|| |
 | | 7  _|
dk�rX|dk�r.d }| _|dk�rBd }| _||| |   }
| _|| |
 }||  k�r|dk�r–n n|d | _|d | _n>|dk�r¶|dk�r¶|| | _n|dk�rÔ|dk�rÔ|| | _dS )zSet the ``box`` width.Ú	directionr   Últrr   Úrtlr   N)r   r   ÚBoxrC   r   Úmargin_leftÚmargin_rightÚpadding_leftÚpadding_rightÚborder_left_widthÚborder_right_widthrG   rK   )r&   r)   Úcb_widthrO   Zmargin_lZmargin_rZ	padding_lZ	padding_rZborder_lZborder_rrC   Zpaddings_plus_bordersÚtotalZ
margin_sumr0   r0   r1   rE   �   sZ    


ÿ





ÿ

rE   c                 C   sØ   | j d dkr¬t| |ƒ | jdkrL| jdkrL| j d dkrB| j}qv| j }n*| jdkr^| j}n| jdkrr| j }nd}| jdkrˆ| j}n| jdkrœ| j }nd}|  ||¡ t| tj	tj
fƒrÔ| jD ]}t||ƒ qÄdS )z5Translate the ``box`` if it is relatively positioned.ÚpositionÚrelativer   rO   rP   r   N)r   r   ÚleftÚrightÚtopÚbottomrJ   r   r   Ú	InlineBoxÚLineBoxÚchildrenÚrelative_positioning)r&   r)   Útranslate_xÚtranslate_yÚchildr0   r0   r1   rd   Ì   s(    








rd   c
              	   C   sn  d}
d }d }d }| j t|ƒ7  _ | ¡ rlt|ƒ }}||_| |¡ |jd dkr`| |¡ n
| |¡ nö| ¡ �r0t| |||||	d d�\}}|  	|	|j |j
 ¡}|r®| pº| pº| ¡ }|rÒ||_| |¡ n\t|ƒ}t||ƒ}|d i}d }d}
|�rbt|| ƒ�rbt| |||ƒ}|�rb|\|d d …< }d }n2| ¡ �rb|jd d }| j}| j| |  |¡ |
|||fS )NFr[   Úabsolute©r(   Tr   )r#   r!   Úis_absolutely_positionedr   ÚindexÚappendr   Ú
is_floatedr   Úoverflows_pagerD   Úis_monolithicÚfind_last_in_flow_childÚblock_level_page_breakÚavoid_page_breakÚfind_earlier_page_breakÚ
is_runningr   Úrunning_elements)r%   r&   rk   rg   Únew_childrenr*   r+   r,   r-   r'   ÚstoprL   Ú	new_childÚout_of_flow_resume_atÚplaceholderZpage_overflowZ	add_childÚlast_in_flow_childÚ
page_breakr;   Zrunning_nameÚpager0   r0   r1   Ú_out_of_flow_layoutë   sZ    

þ
ÿ
ÿý
ÿ
r~   c                 C   sè   t |ƒ|jd  }|dk r8|s8t| |j|	|
ƒ dd|fS |jd d }|rh|D ]}|d8 }|dkrN qhqN||krŽ|sŽt| |j|	|
ƒ dd|fS |rÊ||krÊ|| d … D ]}t| |j|	|
ƒ q¨|| d …= t| |j|	|
ƒ dd||ifS )NÚorphansr   TFÚwidowsr   )Úlenr   rA   rc   )r%   r&   Úlinerv   Úlines_iteratorr*   rk   r(   rL   r+   r,   Zover_orphansÚneededrN   rg   r0   r0   r1   Ú_break_line-  s*    


ÿr…   c                    sd  d }}d }g }t |jƒdks&J dƒ‚|r6|
t|ƒ7 }
|}tˆ ||
|	|||||ƒ	}t|ƒD �]â\}\}}|d ur–|dkrŽ|jd |d _ �q@|d8 }||_|j|j	 }||d u O }|rÆ|j
|j }nd}|sÔ| oâˆ  |	|| ¡}|�rtˆ ||||||||||ƒ\}}} �q@n4|�rHˆ  |	|¡�rH||j8 }| d|j ¡ d|_ˆ j�r,d}‡ fdd„| ¡ D ƒ}|D ]°}ˆ  |¡}| |¡ |�p¢ˆ j�p¢ˆ  |	|| ¡}|�rnˆ  |¡ |�sÀ|�sn|jd	 d
k�rþtˆ ||||||||||ƒ\}}}d} �q n|jd	 dk�rnd }} �q �qn|�r, �q@| |¡ |}
|}qZ|�rT||d ji}||||
||fS )NFr   z$line box with siblings before layoutr   Úblock_ellipsiséÿÿÿÿc                 3   s    | ]}|j ˆ jv r|j V  qd S ©N)ÚfootnoteÚ	footnotes)Ú.0Z
descendant©r%   r0   r1   Ú	<genexpr>�  s   ÿz"_linebox_layout.<locals>.<genexpr>Úfootnote_policyr‚   TÚblock)r�   rc   r!   r   Ú	enumerater   r†   rL   r#   rD   r@   r?   rn   r…   r   rJ   rŠ   ÚdescendantsÚlayout_footnoterl   Úreported_footnotesÚreport_footnote)r%   r&   rk   rg   rv   r*   r+   r,   r-   r'   r#   r(   Úfirst_letter_styleÚdraw_bottom_decorationr.   Úabortrw   rL   Únew_footnotesÚnew_containing_blockrƒ   Úir‚   Únew_position_yÚoffset_yÚoverflowZbreak_lineboxrŠ   r‰   r0   rŒ   r1   Ú_linebox_layoutM  sš    
þ
þ

ý

ÿ

ÿ

ÿÿý
ü


rž   c           ,      C   s|  d }}t |ƒ}|d urrt||ƒ}t||ƒ}|s:t|| ƒrv| ¡ d }||dœ}|d i}d}||||
||||fS nd}|}|j�szt||ƒ |d u �rz|�rzt|ƒ}|j}|dkr¸d}n:| j	dkrò|rò|j
d dkrÚd}n|j
d dkrò| jsòd}tg |¢|‘ƒ}|| }|D ]}|j|d	� �qt| ||ƒ}|d u�rz|D ]}|j| d	� �q<t|ƒ}| j||j 7  _g }| ¡ }
|�r|j�r¬t|ƒ}| j|7  _|
|7 }
g }nft|tjƒ�s|j
d
 dk�rÐd} nt|j
d
 |jƒ} | | ¡ t|ƒ|  }!| j|!7  _|
|!7 }
g }|�o*tdd„ |D ƒƒ }"t|dd ƒ�s@||_t| ||	|||"|||||ƒ\}#}}}$}%}|#d u�r„|%�sP|# ¡ |#j }&|# ¡ |# ¡  }'|  |	|&¡}(|  |	|'¡})|"�pº| ¡  }*|*�rà|(�ràt| |#g||ƒ d }#np|*�rL|)�rLt| |#g||ƒ |	|#j |#j! 7 }	t| ||	|||"|||||ƒ\}#}}}$}%}|#�rP|# ¡ |# ¡  }
n|'}
|$}|#�rf| |#j"¡ |#�r„|#j#�r„|# ¡ |# ¡  }
d }|#d u �rBt$|| ƒ�rðt%| |||ƒ}+|+�rÒ|+\}}d}||||
||||fS |�sðd}||||
||||fS t&dd„ |D ƒƒ�rt| |||ƒ g }|�r*|d i}d}nd}||||
||||fS ||#_'| |#¡ |d u�rh||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‹   rg   r0   r0   r1   r�     s   
ÿz"_in_flow_layout.<locals>.<genexpr>r•   c                 s   s   | ]}|  ¡ V  qd S rˆ   )rj   r¢   r0   r0   r1   r�   Y  ó    )(rp   rq   Úblock_level_page_nameÚforce_page_breakÚpage_valuesrB   r   r!   r   r   r   r    rJ   r   r#   Úcontent_box_yr   r   r3   r   rC   rl   ÚanyÚgetattrr•   r2   rD   Úborder_box_yÚborder_heightrn   ro   rA   r?   r@   r   r"   rr   rs   Úallrk   ),r%   r&   rk   rg   rv   r*   r+   r,   r-   r'   r#   r(   r•   r–   Úcollapsing_with_childrenr   Ú	next_pager.   r—   rw   r{   r|   Z	page_namerL   r™   Zold_collapsed_marginZchild_margin_topZnew_collapsed_marginZcollapsed_margin_differenceZprevious_new_childr"   r/   r   rœ   Zpage_is_empty_with_no_childrenrx   Znext_adjoining_marginsÚcollapsing_throughZnew_content_position_yr›   Zcontent_page_overflowZborder_page_overflowÚ	can_breakr;   r0   r0   r1   Ú_in_flow_layout·  s0   



þ

ÿÿ
ÿ

ÿ
ýÿ

ÿÿÿÿÿ
ÿ
ÿ
ÿüÿ
ÿ
ÿ
þ
þÿþ

þr±   c
           -      C   sÌ  t |tjƒsJ ‚| ¡ r |  ¡  |du }
|j|
 dd� ||jd dkO }|pZ|jd dk}|du rhg }|r‚||j|j |j	 7 }| 
|j¡ |}|jp¶|jp¶|jp¶|jp¶| ¡ p¶|j }|rÆ|j}n$| jt|ƒ|j 7  _g }| ¡ }| ¡ }|jd d	k�rg }g }d
ddœ}g }i }d}|jd dk�rFt|jd |	�pBtƒ}	|
�r^d}t|ddƒ}n| ¡ \\}}d}t|j|d… |�p†dd�D �]\}}||_||_g }| ¡ �sîd}t| |||||||||ƒ
\}}}}|�r|||f||< �nt |tjƒ�rFt| ||||||||||||||	ƒ\}}}}}}	||du O }g }||7 }nÀt | |||||||||||||||||	ƒ\}}}}}}}}d}d||	fv�r|}	|	dk�rd}||jd k} | �s|}!|!�r|!d } t | tjƒ�ræ|jd | _!nt | tj"ƒ�r| j}!�q¼�q�q¼|�r`| #¡ d }"t$| |j|d… ||ƒ |D ]}#|  %|#¡ �q4ddd
|"dœg d|	f  S |�rŒ|j&dk�rŽ|  '|j| (¡  |¡�rŽd}g } �q �qŒd}|du}$|jd dk�r¼d}|$�rt)|jd | ƒ�r|�st$| g |¢|j|d… ¢||ƒ ddd
ddœg d|	fS | ¡ D ]\}%}&|&| j*|%< �q|�rL| jt|ƒ|j 7  _t+|ƒ}d}'|du �rÄt|ƒ}(|j&dv �r¶t,| ||(ƒdu �r¶t-dd„ |j.|j|j|j|jfD ƒƒ�r¶d}'n||(7 }g }n|j&dk�rÔg }|j�sþ|j�sþ| ¡ �sþ|j�sþ|j/�r|t|ƒ7 }g }|$�r<|�r<|d } t | tjƒ�r<|jd | _!| 0|¡})|)j|
 |$�oX| d� |)j&dk�r®| j1�r |)jd dk�r t2dd„ | j1D ƒƒ}*t2|*|ƒ}||) ¡  |)_&|)jd d	k�rÞ|D ]}+t3| |+|)||dd� �qÂ|)jD ]}t4||)j5|)j&fƒ �qä|) ¡ �r|  6|)¡ |�s|$�s8t2t|)j&|)j7ƒ|)j.ƒ|)_&nf|t k�rž|)j8�sž| j9| |)j |) :¡ |)j&  },|,|)j&k�rž|,|)_&|�rž|) j&|j|j |j	 7  _&|d du �r¼|) #¡ d |d< |)||||'|	fS )zSet the ``box`` height.NF)ÚstartÚendÚcontinuer   Úbox_decoration_breakÚcloner[   r\   r¨   rŸ   r.   Únoner   r•   )r²   Tr‡   r†   r   Úbreak_inside)r   r   c                 s   s   | ]}|d kV  qdS ©r   Nr0   )r‹   Úvaluer0   r0   r1   r�     r£   z)block_container_layout.<locals>.<genexpr>r�   Úvisiblec                 s   s   | ]}|j | ¡  V  qd S rˆ   )r#   Úmargin_height)r‹   Z	float_boxr0   r0   r1   r�   >  s   ÿri   r}   r   );r   r   ÚBlockContainerBoxrI   Úcreate_block_formatting_contextÚremove_decorationr   r?   r@   r   rl   r   Úborder_top_widthÚpadding_toprH   Úis_grid_itemr   r#   r!   r§   Úcontent_box_xÚminr   r©   Úitemsr�   rc   rK   Úis_in_normal_flowr~   rb   rž   r±   r†   Ú	ParentBoxr¦   rA   Úunlayout_footnoterD   Ú	overflowsr«   rr   Úbroken_out_of_flowrp   r   r¬   Ú
min_heightrB   Úcopy_with_childrenÚexcluded_shapesÚmaxr   rd   rC   Úfinish_block_formatting_contextÚ
max_heightrG   Úpage_bottomr¼   )-r%   r&   r'   r(   r*   r+   r,   r-   r   r.   Úis_startr–   Zthis_box_adjoining_marginsr­   r#   rK   rv   r®   Zall_footnotesrÊ   r{   Úskipr•   rk   rg   r˜   r—   rw   rL   rx   ry   Znew_max_linesÚ
last_childrc   r}   r‰   Zbox_is_fragmentedÚkeyrº   r¯   r/   rM   Zmax_float_position_yÚabsolute_boxZnew_box_heightr0   r0   r1   rF   x  sœ   ÿÿÿÿý
&
ýÿ
ÿüÿ

ûÿ
ÿÿþ
ÿþÿÿ
ÿþþÿþýü
ÿþ

þ



ÿÿÿ
ÿÿ
þrF   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¹   r0   ©r‹   Úmr0   r0   r1   r�   o  r£   z"collapse_margin.<locals>.<genexpr>c                 s   s   | ]}|d kr|V  qdS r¹   r0   r×   r0   r0   r1   r�   p  r£   )ÚextendrÎ   rÄ   )r-   ÚmarginsZ	positivesZ	negativesr0   r0   r1   r!   k  s
    
r!   c                 C   sª   g }t jt jt jf}| }t||ƒrF| |jd ¡ |js:qF|jd }q| ¡  |}t||ƒr€| |jd ¡ |jstq€|jd }qRd}|D ]}|dv s ||fdv rˆ|}qˆ|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   )r]   r^   Ú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   rl   r   rc   Úreverse)Úsibling_beforeÚsibling_afterÚvaluesZblock_parallel_box_typesr&   r;   rº   r0   r0   r1   rq   t  s*    ÿ

rq   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è   Zbefore_pageZ
after_pager0   r0   r1   r¤   ¬  s    r¤   c                 C   sì  |r€t |d tjƒr€|d jd }|d jd }t|ƒ| }||k rHdS |d|… }d|d ji}t| ||d… ||ƒ ||fS d}	t|ƒD �]:\}}
t |
tjƒr²|
j	sŒ|
j
r²qŒn|
jrºqŒ|
 ¡ �rt|
|	ƒ}|	du�rt|| ƒ�s|d7 }|d|… }|| jdi} �qÎ|
}	|
 ¡ rŒt|
jd | ƒsŒtjtjtjf}t |
|ƒrŒt| |
j||ƒ}|rŒ|\}}|
 |¡}g |d|… ¢|‘}t |
tjƒ�r°||d… D ]}|j
�r–| |¡ �q–|j|i}|d7 } �qÎqŒd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   rb   r   r�   rL   rA   Úreversed_enumeraterä   Ú	is_headerÚ	is_footerrG   rÆ   rq   rr   rk   r3   r   rs   rc   rÌ   rl   )r%   rc   r+   r,   r   r€   rk   rv   rL   Zprevious_in_flowrg   r|   Zbreakable_box_typesr;   Znew_grand_childrenrx   Ú
next_childr0   r0   r1   rs   ´  sn    ÿÿÿ


ÿÿÿ

ÿ

rs   c                 C   s"   t | ƒD ]}| ¡ r|  S qdS )z=Find and return the last in-flow child of given ``children``.N)ÚreversedrÆ   )rc   rg   r0   r0   r1   rp     s    rp   c                 C   s   t ttt| ƒƒƒt| ƒƒS )zBLike reversed(list(enumerate(seq))) without copying the whole seq.)Úziprî   Úranger�   )Úseqr0   r0   r1   rê   	  s    rê   c                 C   s”   |D ]Š}t |tjƒr$t| |j||ƒ |jd dkrF||v rF| |¡ n |jd dkrf||v rf| |¡ |jrx|  |j¡ || j	v r| j	 
|¡ qdS )zúRemove 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.

    r[   rh   ÚfixedN)r   r   rÇ   rA   rc   r   Úremover‰   rÈ   rÊ   Úpop)r%   Úbox_listr+   r,   r&   r0   r0   r1   rA     s    	
ÿ

rA   c                 C   s   |j r| dv S | dv S )z$Test whether we should avoid breaks.)rß   rà   rá   )rß   rà   ©Ú	in_column©r|   r%   r0   r0   r1   rr   %  s    rr   c                 C   s   |j r| dv S | dv S )z$Test whether we should force breaks.)r}   r]   r^   rÝ   rÞ   râ   )r}   r]   r^   rÝ   rÞ   rö   rø   r0   r0   r1   r¥   ,  s    r¥   )TNNNFN)2Ú__doc__Úmathr   Úformatting_structurer   rh   r   r   râ   r   Úflexr	   Úfloatr
   r   r   Úgridr   Úinliner   Úmin_maxr   Úpercentr   r   r   Úreplacedr   Útabler   r   r2   r$   r4   rE   rd   r~   r…   rž   r±   rF   r!   rq   r¤   rs   rp   rê   rA   rr   r¥   r0   r0   r0   r1   Ú<module>   sJ      ý
//
>B j B t	8N