a
    ¥Q•hY¼  ã                   @   s²  d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZmZmZ d	d
lmZ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 d	dlmZm Z  d	dl!m"Z"m#Z#m$Z$ d	dl%m&Z& d	dl'm(Z(m)Z) dd„ Z*dd„ Z+dd„ Z,dd„ Z-dd„ Z.dd„ Z/d d!„ Z0d"d#„ Z1ed$d%„ ƒZ2d&d'„ Z3d(d)„ Z4d*d+„ Z5d,d-„ Z6dEd/d0„Z7d1d2„ Z8d3d4„ Z9d5d6„ Z:d7d8„ Z;d9d:„ Z<d;d<„ Z=d=d>„ Z>d?d@„ Z?dAdB„ Z@dCdD„ ZAdS )FzLayout for inline-level boxes.é    N)Úinfé   )Úcomputed_from_cascaded)Úcharacter_ratioÚstrut_layout)ÚboxesÚbuild)Úcan_break_textÚcreate_layoutÚsplit_first_lineé   )ÚAbsolutePlaceholderÚabsolute_layout)Úflex_layout)Úavoid_collisionsÚfloat_layout)Úgrid_layout)Úhandle_leader)Úhandle_min_max_width)Úresolve_one_percentageÚresolve_percentages)Úinline_min_content_widthÚshrink_to_fitÚtrailing_whitespace_size)Úinline_replaced_box_layout)Úfind_in_flow_baselineÚtable_wrapper_widthc	              
   c   s–   t ||ƒ |du r"t|d|jƒ nd|_t| ||||||||ƒ	\}	}
|	r`t| |	|ƒ |	j|	j }|	du rldS |	|
fV  |
du r‚dS |
}d|_d}q(dS )z�Return an iterator of ``(line, resume_at)``.

    ``line`` is a laid-out LineBox with as much content as possible that
    fits in the available width.

    NÚtext_indentr   )r   r   Úwidthr   Úget_next_lineboxr   Ú
position_yÚheight)ÚcontextÚboxr    Úbottom_spaceÚ
skip_stackÚcontaining_blockÚabsolute_boxesÚfixed_boxesÚfirst_letter_styleÚlineÚ	resume_at© r,   úQ/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/layout/inline.pyÚiter_line_boxes   s&    	

þ
r.   c	           +      C   sD  t ||ƒ}|dkrdS t|||ƒ}||_| jrTt| ||dd�|_t|j| ƒ\|_}	nd |_|_t	| ||dd�\}
}}|j}| j 
¡ }|
 }|_| }|_|j}|
| }|
|j7 }
g }g }g }g }g }t| ||
|||||||||ƒ\}}}}}}|j|j |_|_t|ƒ�r|�sd|_�qbt| |ƒ t	| ||dd�\}}	}t| |||du �pP|d	�}|jd
 dk�rx|d9 }||j8 }t|ƒ\} }!|!du�s’J ‚| du�s J ‚|! |_|!|_| |! |_||! }"d|_d|_| ||"¡ ||_|j|k�rî�qb|j}| j}#|| _t	| ||dd�\}
}}|jd
 dk�r8|
|f||fk}$n|
|j |f|| |fk}$|$r†|#| _�qbq†| |¡ | |¡ |D ]L}%d|%jjd v �r¤|% d||%j ¡ n |% |j|%j ||j |%j ¡ �qzg }&|j|j }'|D ]F}(|'|(_t| |(||||dd�\})}*|& |)¡ |*�rÜ|(||*f| j|)< �qÜ|&�r<| jt|&ƒ7  _||fS )zReturn ``(line, resume_at)``.Úcontinue©NNT)r%   Ú
first_liner   F)ÚouterN©ÚlastÚ	directionÚrtléÿÿÿÿÚltrÚinlineÚdisplay©r%   )Úskip_first_whitespaceÚfirst_letter_to_boxr    Úexcluded_shapesr   r   r   Ústyler!   r   ÚcopyÚ
position_xr   Úsplit_inline_boxÚis_phantom_lineboxÚremove_last_whitespaceÚ
text_alignÚline_box_verticalityÚbaselineÚ
margin_topÚmargin_bottomÚ	translateÚextendÚ	specifiedr   ÚappendÚbroken_out_of_flowÚchildrenÚtuple)+r"   Úlineboxr    r$   r%   r&   r'   r(   r)   Ú_rA   Úavailable_widthZcandidate_heightr>   Zoriginal_position_xZoriginal_position_yZoriginal_widthÚmax_xÚline_placeholdersZline_absolutesZ
line_fixedÚwaiting_floatsÚline_childrenr*   r+   Úpreserved_line_breakÚfirst_letterÚlast_letterÚfloat_widthÚnew_position_xZnew_available_widthZoffset_xÚbottomÚtopÚoffset_yZnew_excluded_shapesÚ	conditionÚplaceholderZfloat_childrenZwaiting_floats_yZwaiting_floatZnew_waiting_floatZwaiting_float_resume_atr,   r,   r-   r   6   sÊ    
ÿÿ



ýÿ

ÿþ

ÿÿÿ


þþ

ÿr   c                 C   sB  |du rd}d}n|  ¡ \\}}t| tjƒr¤|du s8J ‚| jd }| j ¡ }|t|ƒkr\dS |dv r”||d… }|r”| d¡r”|d7 }|dd… }qp|r |diS dS t| tj	tj
fƒ�r&|dkrÊ| jsÊdS t| j| |ƒ}|dk�r|d7 }|t| jƒkrþdS t| j| dƒ}|�s|�r"||iS dS |du �s>J d| › �ƒ‚dS )	zŠReturn ``skip_stack`` to start just after removable leading spaces.

    See https://www.w3.org/TR/CSS21/text.html#white-space-model

    Nr   Úwhite_spacer/   ©ÚnormalÚnowrapúpre-lineó    r   zunexpected skip inside )ÚitemsÚ
isinstancer   ÚTextBoxr?   ÚtextÚencodeÚlenÚ
startswithÚLineBoxÚ	InlineBoxrO   r<   )r#   r%   ÚindexZnext_skip_stackrb   rk   Úresultr,   r,   r-   r<   ´   s8    


r<   c                 C   s   g }|}t |tjtjfƒr:| |¡ |js.dS |jd }qt |tjƒrT|jd dv sXdS |j 	d¡}|rÆt
|ƒt
|jƒkr~dS ||_t| |ddƒ\}}}|dus¤J ‚|du s°J ‚|j|j }|j|_n|j}d|_d|_|jjd �r|jD ]}	|	j| d	d
� qì|D ]}
|
 j|8  _�qdS )zšRemove in place space characters at the end of a line.

    This also reduces the width and position of the inline parents of the
    modified text.

    Nr7   rb   rc   ú r   Ú r   T©ÚdxÚignore_floats)ri   r   ro   rp   rM   rO   rj   r?   rk   Úrstriprm   Úsplit_text_boxr   Úpango_layoutÚfirst_line_directionrJ   )r"   r*   Ú	ancestorsr#   Znew_textÚnew_boxÚresumerR   Zspace_widthÚchildÚancestorr,   r,   r-   rD   Ý   s:    
ÿ

rD   c                 C   sf  |�rb| j �rbd|d< d}| j d }t|tjƒ�rti |dd�}|j d¡r„t | j› d�|| j|g¡}|g| j dd… ¢R | _ �qb|j	�rbd	}|r¼| 
¡ \}|r¼|\}	|j	|	d… |_	d}|j	�r|j	d }
t |
¡}|d
vrì|rè�qd}||
7 }|j	dd… |_	q¼| d¡�rb|d dk�rnt | j› d�|| jg ¡}t | j› d�|| j|¡}|f|_ |g| j ¢R | _ ntt | j› d�|| jg ¡}d|_t | j› d�|| jg ¡}|f|_ t | j› d�|| j|¡}|f|_ |g| j ¢R | _ t |¡ |�rb|�rb|\}	| ¡ \\}}|	|d |ii}nDt|tjƒ�rb|�r>| 
¡ \}nd}t|||ƒ}|�rb|\}	|	|i}|S )z-Create a box for the ::first-letter selector.ÚstaticÚpositionrt   r   N)ÚcascadedÚparent_styleÚelementz::first-letterr   F)ÚPsÚPeÚPiÚPfÚPoTÚ
ÚfloatÚnone)rO   ri   r   rj   r   Úelement_tagÚendswithrp   r…   rk   ÚvaluesÚunicodedataÚcategoryÚlstripÚBlockBoxr)   ro   r   Úprocess_text_transformrh   Ú	ParentBoxr=   )r#   r%   r)   rY   r   Zletter_styleZ
letter_boxÚcharacter_foundÚchild_skip_stackrq   Znext_letterr’   Útext_boxÚline_boxÚchild_indexZgrandchild_skip_stackr,   r,   r-   r=     sš    
ÿþ



þþ
þþþ
ÿÿÿr=   c                 C   s¶   t |tjƒr*| ¡ }t||ƒ | ¡ |_nˆt |tjƒrœ|jrj|j	|j
f}t| ||ƒ |j	|j|j  }}	}
t| ||||||ƒ}|jr²||	|
  |_	|_|_ntdt|ƒj› d�ƒ‚|S )z7Compute the width and the height of the atomic ``box``.úLayout for ú not handled yet)ri   r   ÚReplacedBoxr@   r   Úmargin_heightrG   ÚInlineBlockBoxÚis_table_wrapperr   r!   r   Ú	min_widthÚ	max_widthÚinline_block_box_layoutÚ	TypeErrorÚtypeÚ__name__)r"   r#   rA   r%   r&   r'   r(   Zcontaining_sizer   r¢   r£   r,   r,   r-   Ú
atomic_boxb  s"    

þr¨   c           	      C   s¦   ddl m} t||ƒ |jdkr&d|_|jdkr6d|_|jdkrFd|_|jdkrVd|_t|| |ƒ ||_d|_	|| |t
 |d||d dd d�
\}}}}}}t|ƒ|_|S )Nr   )Úblock_container_layoutÚautor   TF)r$   r%   Úpage_is_emptyr'   r(   Úadjoining_marginsÚdiscardÚ	max_lines)Úblockr©   r   Úmargin_leftÚmargin_rightrH   rI   Úinline_block_widthrA   r    r   Úinline_block_baselinerG   )	r"   r#   rA   r%   r&   r'   r(   r©   rR   r,   r,   r-   r¤   x  s*    





ü
r¤   c                 C   s|   | j rL| jD ]<}t|tjƒr|jr|jd jr|jd jd }|j  S qn"| jd dkrnt| dd�}|rn|S | j|  	¡  S )z¼Return the y position of the baseline for an inline block.

    Position is taken from the top of its margin box.

    https://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align

    r   ÚoverflowÚvisibleTr3   )
r¡   rO   ri   r   ÚTableBoxrG   r?   r   r    rŸ   )r#   r   Z	first_rowrr   r,   r,   r-   r³   –  s    
r³   c                 C   sF   |j | j| j | j | j | j | j  }| j dkrBt|| |ƒ| _ d S )Nrª   )r   r°   r±   Úborder_left_widthÚborder_right_widthÚpadding_leftÚpadding_rightr   )r#   r"   r&   Úavailable_content_widthr,   r,   r-   r²   ¬  s    
ÿÿþþÿ
r²   c                 C   sž  t ||ƒ dddœ}t|tjƒrà||_|du r4d}n"| ¡ \\}}|pHd}|du sVJ ‚t|ƒdk}t| ||| ||d�\}}}|du rŒd}n|di}|jrÔ|jd }|du r¸|jd }qÜ|j 	¡ d|…  
¡ d }nd }}�n®t|tjƒ�r>|jdkrþd|_|jdk�rd|_t| |||||||||	|
|ƒ\}}}}}}�nPt|tjƒ�rzt| ||||||ƒ}||_d}d}d}d}�nt|tjƒ�rú||_d|_d	D ].}t|d
|› �ƒdk�r˜t|d
|› �dƒ �q˜t| |t ||d||dƒ	\}}}}}d}d}d}n”t|tjƒ�rx||_d|_d	D ].}t|d
|› �ƒdk�rt|d
|› �dƒ �qt| |t ||d||ƒ\}}}}}d}d}d}ntdt|ƒj› d�ƒ‚||||||fS )aó  Fit as much content as possible from an inline-level box in a width.

    Return ``(new_box, resume_at, preserved_line_break, first_letter,
    last_letter)``. ``resume_at`` is ``None`` if all of the content
    fits. Otherwise it can be passed as a ``skip_stack`` parameter to resume
    where we left off.

    ``new_box`` is non-empty (unless the box is empty) and as big as possible
    while being narrower than ``available_width``, if possible (may overflow
    is no split is possible.)

    r   ©ÚleftÚrightN©Úis_line_startr7   rª   Fu   âº€©r^   r¾   r]   r½   Úmargin_rœ   r�   )r   ri   r   rj   rA   rh   rm   ry   rk   rl   Údecoderp   r°   r±   rB   ÚAtomicInlineLevelBoxr¨   ÚInlineFlexBoxr    ÚgetattrÚsetattrr   r   ÚInlineGridBoxr   r¥   r¦   r§   )r"   r#   rA   rT   r$   r%   r&   r'   r(   rU   rV   rW   Úfloat_widthsÚskiprÀ   r}   rX   r+   rY   rZ   ÚsiderR   r,   r,   r-   Úsplit_inline_level¶  s˜    

þ

ýÿ
ÿ
þþþ
þrÌ   c              	   C   s  |  ¡ rX||_t|ƒ}| |¡ | |||f¡ |jd dkrJ|	 |¡ n
|
 |¡ �n¨| ¡ �rÎ||_t| ||jƒ}dd„ || D ƒ}|rž|t| |d ƒ8 }||| ks®|r¼| |¡ �q t	| |||	|
|d d�\}}|rê|||f| j
|< | |||f¡ |}t| ¡ dƒ}||jd   |7  < |jd d	k�rJt|tjƒ�rb||7 }n|jd d
k�rb||8 }|D ]d\}}| ¡ �s|�qf|jd d	k�rœ|jd dk�s¼|jd d
k�rf|jd dk�rf|j|d� �qfn2| ¡ �r |jd d }| j}| j| |  |¡ d S )Nr‚   Úabsolutec                 S   s   g | ]\}}}|  ¡ s|‘qS r,   ©Ú
is_floated)Ú.0rR   Zchild_r,   r,   r-   Ú
<listcomp>+  s   ÿz'_out_of_flow_layout.<locals>.<listcomp>r7   r;   r   rŒ   r½   r¾   r5   r8   r6   ©rv   r   )Úis_absolutely_positionedrA   r   rM   r?   rÏ   r   r   r   r   rN   ÚmaxÚmargin_widthri   r   ro   Úis_in_normal_flowrJ   Ú
is_runningÚcurrent_pageÚrunning_elements)r"   r#   r&   rq   r   rO   rW   Úwaiting_childrenrV   r'   r(   rU   rÉ   rT   rA   r$   ra   r[   Znon_floating_childrenÚ	new_childZfloat_resume_atrv   rR   Z	old_childÚrunning_nameÚpager,   r,   r-   Ú_out_of_flow_layout  sf    

ÿÿ
þ
ÿ


ÿþý
rÞ   c                 C   sü   |rà|  ¡ }|rà| ¡ \}}}| ¡ rt|ƒs0q|rF||v rF|| }nd }|j| ¡  d }||jkrt| ||j|||||||||	ƒ\}}}}}}|r˜q¤|d8 }q\q|
 |¡ |d u rÈt|t	j
ƒsØJ ‚n|
 |||f¡ ||iS |
rø|
d d d d iS d S )Nr   r7   r   )r@   ÚpoprÖ   Úcan_break_insiderA   rÕ   rÌ   rK   ri   r   rj   rM   )r"   r#   rT   r$   Úinitial_skip_stackr'   r(   rU   rV   rW   rO   rÚ   Zwaiting_children_copyr›   r   Zoriginal_childr˜   rÛ   Úchild_resume_atrR   r,   r,   r-   Ú_break_waiting_children]  s8    


ü

rã   c           2      C   sÚ  |d9 }|du }|}|}t |tjtjfƒs.J ‚|j|j |j }|j|j |j	 }|}g }g }d}d }}dddœ}d}|j
d dkrŠg }|r”d}n| ¡ \\}}t|j|d… ƒD �]Ö\}}|| }|j|_| ¡ �s$t| ||||||||
|||	||||ƒ | ¡ r´|d }||
vr´|| ¡ 8 }q´|t|jƒd k}|}g }t| |||||||||	||ƒ\} }!}"}#}$}%|j
d	 d
k�rŠ|}&||%d 8 }n|}&||%d 8 }|�râ|&�râ|!du �râ||&8 }t| |||||||||	||ƒ\} }!}"}#}$}%d}|"�rðd}d}'|du �rd}n$|du �rd}n|j
d dv �r(d}'|'du �rjd||#fv �rFd}'n$|#dv �rV|#}'nt||# |j
d ƒ}'|'�r~| |¡ g }|du �rŒ|#}|j�ršd}n|$}| du �r¼t |tjƒ�sbJ ‚n¦t |tjƒ�rØ| || f¡ t | tjƒ�o | j�o t | jd ¡dk}(| j|  ¡  })|)|k�rN|(�sNt| |||||||	|
|||ƒ}*|*�rN|*}! �qœ|)}| || |f¡ |
 |¡ |!dur´| |¡ ||!i}! �qœq´| |¡ d}!|j
d	 d
k�rt|ƒdk�rdd„ |D ƒ}+|+d j}|+ddd… D ]&}|j||j dd� || ¡ 7 }�qà|!du },|  dd„ |D ƒ¡}-|-j!| |, d� t |tjƒ�r¢d|-_"|-j}|-j
d	 dk�rn|ddd… }|D ],}| ¡ �rr|j| ¡  |-j |-_" �q�qrnp||-_|j
d dk�r¾d}.n|j
d	 dk�rÒ|n|,}.|.�rö|-jD ]}|j|d� �qâ|| |-_"|-j|d dd� t#|j
| ƒ\}/|-_$|j
d |-_%|/|-j% d  }0|0|-j& |-j' |-_(|0|-j) |-j* |-_+|-j
d dk�r’|D ]}1t,| |1|-||dd!� �qv|!du�rºt-t.|!ƒƒ}||k �rº|di}!|j/�rÊd}d}|-|!||||fS )"z$Same behavior as split_inline_level.g0¸D   ð?NFr   r¼   r‚   Úrelativer   r5   r6   r½   r¾   Trs   õ   Â rb   )Úprere   )TFÚlangr7   ÚZsc                 S   s   g | ]\}}}|  ¡ r|‘qS r,   )rÖ   )rÐ   rR   Ú	box_childr,   r,   r-   rÑ   !  s   ÿz$split_inline_box.<locals>.<listcomp>ru   c                 S   s   g | ]\}}}|‘qS r,   r,   )rÐ   rq   ré   rR   r,   r,   r-   rÑ   ,  ó    )ÚstartÚendr8   Úbox_decoration_breakÚclonerÒ   Ú	font_sizer   r;   )0ri   r   ro   rp   r¹   r°   r·   rº   r±   r¸   r?   rh   Ú	enumeraterO   r    rÖ   rÞ   rÏ   rÕ   rm   rÌ   r	   rK   Útrailing_collapsible_spacerj   rM   rk   r‘   r’   rA   rã   rJ   Úcopy_with_childrenÚremove_decorationr   r   rG   r!   Úborder_top_widthÚpadding_toprH   Úborder_bottom_widthÚpadding_bottomrI   r   ÚnextÚiterÚ	is_leader)2r"   r#   rA   rT   r$   r%   r&   r'   r(   rU   rV   rW   Úis_startZinitial_position_xrá   Zleft_spacingZright_spacingZcontent_box_leftrO   rÚ   rX   rY   rZ   rÉ   Zfloat_resume_indexrÊ   Úir   rq   Zis_last_childrS   Zchild_waiting_floatsrÛ   r+   Z	preservedÚfirstr4   Znew_float_widthsZend_spacingÚ	can_breakZtrailing_whitespacer\   Zprevious_resume_atÚin_flow_childrenZis_endr}   Ztranslation_neededÚline_heightÚhalf_leadingÚabsolute_boxr,   r,   r-   rB   ‘  sX   ÿÿ

ü
ýÿ
ýÿ



ÿ


ÿý
ý


ÿ

ÿÿ
ÿÿÿ

ÿÿ
þ



þrB   Tc                 C   s@  t |tjƒsJ ‚|jd }|j ¡ |d… }|dks8|s<dS t| ¡ |j| ||j|d�\}}}	}
}}|	dkspJ ‚|dkrÖ| 	|j¡}|
|_
||_||_t|j| ƒ\}}|| d }||_||_||_| j|j7  _nd}|	du rèd}nN|||	…  ¡ }||	k�o
| d¡}|�r.d	}||v �s.J d
|f ƒ‚|	|7 }	||	|fS )av  Keep as much text as possible from a TextBox in a limited width.

    Try not to overflow but always have some text in ``new_box``.

    Return ``(new_box, skip, preserved_line_break)``. ``skip`` is the number of
    UTF-8 bytes to skip form the start of the TextBox for the next line, or
    ``None`` if all of the text fits.

    Also break on preserved line breaks.

    rï   Nr   )NNFr¿   r   Frs   )r‹   ú	úõ   Â…u   â€¨u   â€©zDGot %r between two lines. Expected nothing or a preserved line break)ri   r   rj   r?   rk   rl   r   rÃ   Újustification_spacingÚcopy_with_textr   rz   r!   r   rH   rI   rG   Ústrip)r"   r#   rS   rÊ   rÀ   rï   rk   ÚlayoutÚlengthÚresume_indexr   r!   rG   r   rR   r  rX   ÚbetweenZline_breaksr,   r,   r-   ry   e  sH    
þÿÿÿry   c           
         s¼   g ‰ t | ˆ dd�\}}‡ fdd„ˆ D ƒ}|rTdd„ |D ƒ}|rTt|ƒ}t||| ƒ}|D ]Z\}}}| ¡ rv||j }	n2|jd dkrŽ|| }	n|jd dks J ‚|| }	t||	ƒ qX||fS )	zòHandle ``vertical-align`` within a :class:`LineBox`.

    Place all boxes vertically assuming that the baseline of ``box``
    is at `y = 0`.

    Return ``(max_y, min_y)``, the maximum and minimum vertical position
    of margin boxes.

    r   ©Ú
baseline_yc                    s4   g | ],}|  ¡ rd nt|ˆ dd�\}}|||f‘qS )r0   r   r  )rÏ   Úaligned_subtree_verticality©rÐ   ÚsubtreeÚ	sub_max_yÚ	sub_min_y©Útop_bottom_subtreesr,   r-   rÑ   ±  s   ÿþþz(line_box_verticality.<locals>.<listcomp>c                 S   s"   g | ]\}}}|  ¡ s|| ‘qS r,   rÎ   r  r,   r,   r-   rÑ   º  s   þÚvertical_alignr^   r]   )r  rÔ   rÏ   r    r?   Útranslate_subtree)
r#   Úmax_yÚmin_yZsubtrees_with_min_maxZsub_positionsZhighest_subr  r  r  Údyr,   r  r-   rF   ¤  s.    
ÿ

þþ
rF   c                 C   sP   t | tjƒr@|  j|7  _| jd dv rL| jD ]}t||ƒ q.n| j|d� d S )Nr  ©r^   r]   ©r  )ri   r   rp   r    r?   rO   r  rJ   )r#   r  r   r,   r,   r-   r  Î  s    
r  c                 C   sV   t | ||ƒ\}}|| j }||  ¡  }|d u s6||k r:|}|d u sJ||krN|}||fS ©N)Úinline_box_verticalityrG   rŸ   )r#   r  r  r  r  r^   r]   r,   r,   r-   r  Ù  s    
r  c                 C   s  d}d}t | tjtjfƒs"||fS | jD �]Ø}| ¡ sJ| ¡ r(| |¡ q(|jd }|dkrb|}nÆ|dkr | jd t	| jdƒ }||| 
¡  d  }	|	|j }nˆ|dkrÐ|| j | j | j | j }	|	|j }nX|d	k�r|| j | j | j | j | j }
|
| 
¡  |j }n|d
v �r d}n|| }||j }	tjtjtjf}t ||ƒ�rb|j|	|j d� n|	|_|d
v �r~| |¡ q(|	| 
¡  }
|du �sž|	|k �r¢|	}|du �s¶|
|k�rº|
}t |tjƒr(t|||ƒ\}}|du�rî||k �rî|}|dur(||kr(|}q(||fS )zþHandle ``vertical-align`` within an :class:`InlineBox`.

    Place all boxes vertically assuming that the baseline of ``box``
    is at `y = baseline_y`.

    Return ``(max_y, min_y)``, the maximum and minimum vertical position
    of margin boxes.

    Nr  rG   Úmiddlerï   Úxr   ztext-topztext-bottomr  r   r  )ri   r   ro   rp   rO   rÖ   rÏ   rM   r?   r   rŸ   rG   rH   rô   rõ   r!   r    rÅ   rÈ   rJ   r    r  )r#   r  r  r  r  r   r  Zchild_baseline_yZone_exr^   r]   Z	box_typesZchildren_max_yZchildren_min_yr,   r,   r-   r  æ  sr    


ÿÿ
ÿÿÿ



ÿr  c                 C   sÂ   |j |krdS |jd }|r6|jd }|dkr2|n|}|jd dv }|dv rl|dk|jd	 d
kA rhd}nd}|dkrxdS ||j  }|dkrž|ršt| ||ƒ dS |dkr®|d S |dksºJ ‚|S dS )z>Return the line horizontal offset according to ``text-align``.r   Útext_align_allÚtext_align_lastrª   rb   rc   r¼   r½   r5   r6   rë   rì   ÚjustifyÚcenterr   N)r   r?   Újustify_line)r"   r*   rS   r4   ÚalignÚ
align_lastÚspace_collapseÚoffsetr,   r,   r-   rE   4  s,    



rE   c                 C   s"   t |ƒ }rt| ||| dƒ d S )Nr   )Úcount_expandable_spacesÚadd_word_spacing)r"   r*   Úextra_widthÚ	nb_spacesr,   r,   r-   r%  Y  s    r%  c                 C   sR   t | tjƒr$| j d¡| j d¡ S t | tjtjfƒrJtdd„ | jD ƒƒS dS dS )z;Count expandable spaces (space and nbsp) for justification.rs   rå   c                 s   s   | ]}t |ƒV  qd S r  )r*  ©rÐ   r   r,   r,   r-   Ú	<genexpr>f  rê   z*count_expandable_spaces.<locals>.<genexpr>r   N)	ri   r   rj   rk   Úcountro   rp   ÚsumrO   )r#   r,   r,   r-   r*  `  s
    r*  c           
      C   s   t |tjƒrv||_| j|7  _t|ƒ}|dkrüt|j|j| d |jd�}| 	¡  || }||7 }| j
|7  _
||_n†t |tjtjfƒrð| j|7  _|}|j}|jd dkr¼|d d d… }|D ]}	|	 ¡ rÀt| |	||ƒ}qÀ| j
|| 7  _
n| |d¡ |S )Nr   )r£   r  r5   r6   r7   )ri   r   rj   r  rA   r*  r
   rk   r?   Ú
deactivater   rz   ro   rp   rO   rÖ   r+  rJ   )
r"   r#   r  Z	x_advancer-  r	  Zextra_spaceZprevious_x_advancerO   r   r,   r,   r-   r+  k  s8    þÿr+  c                 C   sˆ   | j D ]|}t|tjƒrtt|ƒs$ dS dD ]H}t|jd|› � dd ƒsh|jd|› d� sh|jd|› � jr(  dS q(q| ¡ r dS qdS )	NFrÁ   rÂ   ÚvalueÚborder_Ú_widthÚpadding_T)	rO   ri   r   rp   rC   rÆ   r?   r3  rÖ   )rQ   r   rË   r,   r,   r-   rC   Š  s    
ÿþrC   c                 C   sh   | j d dv }t| tjƒrdS |r@t| tjƒr@t| j| j d ƒS |rdt| tjƒrdtdd„ | j	D ƒƒS dS )Nrb   )rd   zpre-wraprf   Frç   c                 s   s   | ]}t |ƒV  qd S r  )rà   r.  r,   r,   r-   r/  ¢  rê   z#can_break_inside.<locals>.<genexpr>)
r?   ri   r   rÄ   rj   r	   rk   r–   ÚanyrO   )r#   Ú	text_wrapr,   r,   r-   rà   š  s    rà   )T)BÚ__doc__r‘   Úmathr   Úcssr   Zcss.computed_valuesr   r   Úformatting_structurer   r   Ztext.line_breakr	   r
   r   rÍ   r   r   Úflexr   rŒ   r   r   Úgridr   Úleaderr   Úmin_maxr   Úpercentr   r   Ú	preferredr   r   r   Úreplacedr   Útabler   r   r.   r   r<   rD   r=   r¨   r¤   r³   r²   rÌ   rÞ   rã   rB   ry   rF   r  r  r  rE   r%  r*  r+  rC   rà   r,   r,   r,   r-   Ú<module>   sT    ~)3R
	`G4 U
?*N%