o
    Zh0hY                     @   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| ||||||||	\}	}
|	r2t| |	| |	j|	j }|	du r8dS |	|
fV  |
du rCdS |
}d|_d}q)zReturn 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,   N/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/layout/inline.pyiter_line_boxes   s,   
	

r.   c	           +      C   s6  t ||}|dkrdS t|||}||_| jr*t| ||dd|_t|j| \|_}	nd |_|_t	| ||dd\}
}}|j}| j
 }	 |
 }|_| }|_|j}|
| }|
|j7 }
g }g }g }g }g }t| ||
|||||||||\}}}}}}|j|j|_|_t|r|sd|_nt| | t	| ||dd\}}	}t| |||du p|d	}|jd
 dkr|d9 }||j8 }t|\} }!|!dusJ | dusJ |! |_|!|_| |! |_||! }"d|_d|_|||" ||_|j|krn:|j}| j}#|| _t	| ||dd\}
}}|jd
 dkr|
|f||fk}$n|
|j |f|| |fk}$|$r(|#| _nqD|| || |D ]'}%d|%jjd v rK|%d||%j  q5|%|j|%j ||j |%j  q5g }&|j|j }'|D ]#}(|'|(_t| |(||||dd\})}*|&|) |*r|(||*f| j|)< qg|&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_widthcandidate_heightr>   original_position_xoriginal_position_yoriginal_widthmax_xline_placeholdersline_absolutes
line_fixedwaiting_floatsline_childrenr*   r+   preserved_line_breakfirst_letterlast_letterfloat_widthnew_position_xnew_available_widthoffset_xbottomtopoffset_ynew_excluded_shapes	conditionplaceholderfloat_childrenwaiting_floats_ywaiting_floatnew_waiting_floatwaiting_float_resume_atr,   r,   r-   r   6   s   











E




r   c                 C   sD  |du r	d}d}n|  \\}}t| tjrX|du sJ | jd }| j }|t|kr.dS |dv rP||d }|rP|drP|d7 }|dd }|rP|ds?|rV|diS dS t| tj	tj
fr|dkrj| jsjdS t| j| |}|dkr|d7 }|t| jkrdS t| j| d}|s|r||iS dS |du sJ d|  dS )	zReturn ``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%   indexnext_skip_stackrp   ry   resultr,   r,   r-   r<      s:   

r<   c                 C   s,  g }|}t |tjtjfr%|| |jsdS |jd }t |tjtjfst |tjr2|jd dv s4dS |j	d}|rkt
|t
|jkrGdS ||_t| |dd\}}}|dusZJ |du s`J |j|j }|j|_n	|j}d|_d|_|jjd r|jD ]
}	|	j| d	d
 q}|D ]	}
|
 j|8  _qdS )zRemove 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   rp   rq    r    r   Tdxignore_floats)rw   r   r}   r~   rM   rO   rx   r?   ry   rstripr{   split_text_boxr   pango_layoutfirst_line_directionrJ   )r"   r*   	ancestorsr#   new_textnew_boxresumerR   space_widthchildancestorr,   r,   r-   rD      s<   



rD   c                 C   sf  |r1| j r1d|d< d}| j d }t|tjrti |dd}|jdrBt| j d|| j|g}|g| j dd R | _ |S |j	rd	}|r^|
 \}|r^|\}	|j	|	d |_	d}|j	r|j	d }
t|
}|d
vrt|rrnd}||
7 }|j	dd |_	|j	sa|dr|d dkrt| j d|| jg }t| j d|| j|}|f|_ |g| j R | _ n:t| j d|| jg }d|_t| j d|| jg }|f|_ t| j d|| j|}|f|_ |g| j R | _ t| |r|r|\}	| \\}}|	|d |ii}|S t|tjr1|r|
 \}nd}t|||}|r1|\}	|	|i}|S )z-Create a box for the ::first-letter selector.staticpositionr   r   N)cascadedparent_styleelementz::first-letterr   F)PsPePiPfPoT
floatnone)rO   rw   r   rx   r   element_tagendswithr~   r   ry   valuesunicodedatacategorylstripBlockBoxr)   r}   r   process_text_transformrv   	ParentBoxr=   )r#   r%   r)   r_   r   letter_style
letter_boxcharacter_foundchild_skip_stackr   next_letterr   text_boxline_boxchild_indexgrandchild_skip_stackr,   r,   r-   r=     s   
>


	


r=   c                 C   s   t |tjr| }t|| | |_|S t |tjrP|jr6|j	|j
f}t| || |j	|j|j}}	}
t| ||||||}|jrN||	|
|_	|_|_|S tdt|j d)z7Compute the width and the height of the atomic ``box``.Layout for  not handled yet)rw   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(   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rd|_|jdkr#d|_|jdkr+d|_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 r&| jD ]}t|tjr$|jr$|jd jr$|jd jd }|j  S qn| jd dkr7t| dd}|r7|S | j| 	  S )zReturn 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   rw   r   TableBoxrG   r?   r   r    r   )r#   r   	first_rowr   r,   r,   r-   r     s   

r   c                 C   sJ   |j | j| j | j | j | j | j  }| j dkr#t|| || _ d S 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ro||_|du rd}n| \\}}|p$d}|du s+J t|dk}t| ||| ||d\}}}|du rFd}n|di}|jrj|jd }|du r\|jd }n|j	 d| 
 d }nd }}nt|tjr|jdkr}d|_|jdkrd|_t| |||||||||	|
|\}}}}}}nt|tjrt| ||||||}||_d}d}d}d}nt|tjr||_d|_d	D ]}t|d
| dkrt|d
| d qt| |t ||d||d	\}}}}}d}d}d}nJt|tjr3||_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   ⺀rf   r   re   r   margin_r   r   )r   rw   r   rx   rA   rv   r{   r   ry   rz   decoder~   r   r   rB   AtomicInlineLevelBoxr   InlineFlexBoxr    getattrsetattrr   r   InlineGridBoxr   r   r   r   )r"   r#   rA   rX   r$   r%   r&   r'   r(   rY   r\   r]   float_widthsskipr   r   r^   r+   r_   r`   siderR   r,   r,   r-   split_inline_level  s   








r   c              	   C   s  |  r-||_t|}|| ||||f |jd dkr&|	| d S |
| d S | r||_t| ||j}dd || D }|rO|t| |d 8 }||| ksW|r^|| d S t	| |||	|
|d d\}}|ru|||f| j
|< ||||f |}t| d}||jd   |7  < |jd d	krt|tjr||7 }n|jd d
kr||8 }|D ]+\}}| sq|jd d	kr|jd dks|jd d
kr|jd dkr|j|d qd S | r|jd d }| j}| j| | | d S d S )Nr   absolutec                 S   s   g | ]\}}}|  s|qS r,   
is_floated).0rR   child_r,   r,   r-   
<listcomp>+      z'_out_of_flow_layout.<locals>.<listcomp>r7   r;   r   r   r   r   r5   r8   r6   r   r   )is_absolutely_positionedrA   r   rM   r?   r   r   r   r   r   rN   maxmargin_widthrw   r   r}   is_in_normal_flowrJ   
is_runningcurrent_pagerunning_elements)r"   r#   r&   r   r   rO   r]   waiting_childrenr\   r'   r(   rY   r   rX   rA   r$   rj   ra   non_floating_children	new_childfloat_resume_atr   rR   	old_childrunning_namepager,   r,   r-   _out_of_flow_layout  sh   



	r   c                 C   s
  |rw|  }|rw| \}}}| rt|sq|r#||v r#|| }nd }|j|  d }||jkrUt| ||j|||||||||	\}}}}}}|rLn
|d8 }||jks3q|
| |d u rkt|t	j
sgJ ||iS |
|||f ||iS |
r|
d d d d iS d S )Nr   r7   r   )r@   popr   can_break_insiderA   r   r   rK   rw   r   rx   rM   )r"   r#   rX   r$   initial_skip_stackr'   r(   rY   r\   r]   rO   r   waiting_children_copyr   r   original_childr   r   child_resume_atrR   r,   r,   r-   _break_waiting_children]  s>   




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rEg }|rJd}n| \\}}t|j|d D ]c\}}|| }|j|_| st| ||||||||
|||	|||| | r|d }||
vr|| 8 }qZ|t|jd k}|}g }t| |||||||||	||\} }!}"}#}$}%|j
d	 d
kr|}&||%d 8 }n|}&||%d 8 }|r|&r|!du r||&8 }t| |||||||||	||\} }!}"}#}$}%d}|"rd}d}'|du rd}n|du rd}n
|j
d dv rd}'|'du r.d||#fv rd}'n|#dv r$|#}'n
t||# |j
d }'|'r8|| g }|du r?|#}|jrFd}n|$}| du rWt |tjsVJ nRt |tjre||| f t | tjoy| joyt| jd dk}(| j|   })|)|kr|(st| |||||||	|
|||}*|*r|*}! n'|)}||| |f |
| |!dur|| ||!i}! nqZ|| d}!|j
d	 d
krt|dkrdd |D }+|+d j}|+ddd D ]}|j||j dd || 7 }q|!du },| dd |D }-|-j!| |, d t |tjrHd|-_"|-j}|-j
d	 dkr/|ddd }|D ]}| rE|j|  |-j |-_" nq1n8||-_|j
d dkrVd}.n|j
d	 dkr`|n|,}.|.rr|-jD ]	}|j|d qh|| |-_"|-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! q|!durt-t.|!}||k r|di}!|j/rd}d}|-|!||||fS )"z$Same behavior as split_inline_level.g0D   ?NFr   r   r   relativer   r5   r6   r   r   Tr       rp   )prers   )TFlangr7   Zsc                 S   s   g | ]\}}}|  r|qS r,   )r   )r   rR   	box_childr,   r,   r-   r   !  r   z$split_inline_box.<locals>.<listcomp>r   c                 S   s   g | ]\}}}|qS r,   r,   )r   r   r  rR   r,   r,   r-   r   ,  s    )startendr8   box_decoration_breakcloner   	font_sizer   r;   )0rw   r   r}   r~   r   r   r   r   r   r   r?   rv   	enumeraterO   r    r   r   r   r   r{   r   r	   rK   trailing_collapsible_spacerx   rM   ry   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   rX   r$   r%   r&   r'   r(   rY   r\   r]   is_startinitial_position_xr   left_spacingright_spacingcontent_box_leftrO   r   r^   r_   r`   r   float_resume_indexr   ir   r   is_last_childrS   child_waiting_floatsr   r+   	preservedfirstr4   new_float_widthsend_spacing	can_breaktrailing_whitespacerb   previous_resume_atin_flow_childrenis_endr   translation_neededline_heighthalf_leadingabsolute_boxr,   r,   r-   rB     s^  























rB   Tc                 C   s:  t |tjsJ |jd }|j |d }|dks|sdS t| |j| ||j|d\}}}	}
}}|	dks8J |dkrk|	|j}|
|_
||_||_t|j| \}}|| d }||_||_||_| j|j7  _nd}|	du rtd}n$|||	  }||	ko|d}|rd	}||v sJ 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   Fr   )r   	   u    u    zDGot %r between two lines. Expected nothing or a preserved line break)rw   r   rx   r?   ry   rz   r   r   justification_spacingcopy_with_textr   r   r!   r   rH   rI   rG   strip)r"   r#   rS   r   r   r  ry   layoutlengthresume_indexr   r!   rG   r+  rR   r,  r^   betweenline_breaksr,   r,   r-   r   e  sH   


r   c           
         s   g  t |  dd\}} fdd D }|r*dd |D }|r*t|}t||| }|D ]-\}}}| r;||j }	n|jd dkrG|| }	n|jd dksPJ || }	t||	 q,||fS )	zHandle ``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   r9  )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_alignrf   re   )r;  r   r   r    r?   translate_subtree)
r#   max_ymin_ysubtrees_with_min_maxsub_positionshighest_subr=  r>  r?  dyr,   r@  r-   rF     s.   



rF   c                 C   sV   t | tjr#|  j|7  _| jd dv r| jD ]	}t|| qd S d S | j|d d S )NrB  rf   re   rI  )rw   r   r~   r    r?   rO   rC  rJ   )r#   rI  r   r,   r,   r-   rC    s   
rC  c                 C   sV   t | ||\}}|| j }||   }|d u s||k r|}|d u s%||kr'|}||fS N)inline_box_verticalityrG   r   )r#   rA  r:  rD  rE  rf   re   r,   r,   r-   r;    s   
r;  c                 C   s  d}d}t | tjtjfs||fS | jD ]}| s$| r#|| q|jd }|dkr0|}na|dkrO| jd t	| jd }|||
  d  }	|	|j }nB|dkrg|| j | j | j | j }	|	|j }n*|d	kr|| j | j | j | j | j }
|
|
  |j }n|d
v rd}n|| }||j }	tjtjtjf}t ||r|j|	|j d n|	|_|d
v r|| q|	|
  }
|du s|	|k r|	}|du s|
|kr|
}t |tjrt|||\}}|dur||k r|}|dur||kr|}q||fS )zHandle ``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.

    NrB  rG   middler  xr   ztext-topztext-bottomrJ  r   rK  )rw   r   r}   r~   rO   r   r   rM   r?   r   r   rG   rH   r  r  r!   r   r   r   rJ   r    rM  )r#   rA  r:  rD  rE  r   rB  child_baseline_yone_exrf   re   	box_typeschildren_max_ychildren_min_yr,   r,   r-   rM    st   






rM  c                 C   s   |j |krdS |jd }|r|jd }|dkr|n|}|jd dv }|dv r6|dk|jd	 d
kA r4d}nd}|dkr<dS ||j  }|dkrO|rMt| || dS |dkrW|d S |dks]J |S )z>Return the line horizontal offset according to ``text-align``.r   text_align_alltext_align_lastr   rp   rq   r   r   r5   r6   r  r	  justifycenterr   )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 d S )Nr   )count_expandable_spacesadd_word_spacing)r"   r*   extra_width	nb_spacesr,   r,   r-   rY  Y  s   rY  c                 C   sN   t | tjr| jd| jd S t | tjtjfr%tdd | jD S dS )z;Count expandable spaces (space and nbsp) for justification.r   r  c                 s       | ]}t |V  qd S rL  )r^  r   r   r,   r,   r-   	<genexpr>f      z*count_expandable_spaces.<locals>.<genexpr>r   )	rw   r   rx   ry   countr}   r~   sumrO   )r#   r,   r,   r-   r^  `  s
   r^  c           
      C   s  t |tjr<||_| j|7  _t|}|dkr:t|j|j| d |jd}|	  || }||7 }| j
|7  _
||_|S t |tjtjfrz| j|7  _|}|j}|jd dkr_|d d d }|D ]}	|	 rnt| |	||}qa| j
|| 7  _
|S ||d |S )Nr   )r   r1  r5   r6   r7   )rw   r   rx   r1  rA   r^  r
   ry   r?   
deactivater   r   r}   r~   rO   r   r_  rJ   )
r"   r#   r1  	x_advancera  r4  extra_spaceprevious_x_advancerO   r   r,   r,   r-   r_  k  s>   r_  c                 C   s   | j D ]>}t|tjr:t|s dS dD ]$}t|jd|  dd s4|jd| d s4|jd|  jr8  dS qq| rA dS qdS )	NFr   r   valueborder__widthpadding_T)	rO   rw   r   r~   rC   r   r?   rl  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 |r2t| tjr2tdd | j	D S dS )Nrp   )rr   zpre-wraprt   Fr  c                 s   rb  rL  )r   rc  r,   r,   r-   rd    re  z#can_break_inside.<locals>.<genexpr>)
r?   rw   r   r   rx   r	   ry   r   anyrO   )r#   	text_wrapr,   r,   r-   r     s   r   )T)B__doc__r   mathr   cssr   css.computed_valuesr   r   formatting_structurer   r   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   r   rF   rC  r;  rM  rE   rY  r^  r_  rC   r   r,   r,   r,   r-   <module>   sV     ~)3R
	`G4 
U?*N%