o
    Zh0h`                     @   s   d Z ddlZddlmZ ddlZddlmZmZmZ ddl	m
Z
mZm	Z	mZmZmZmZ ddlmZmZ dd	 Z	dddZG dd dZdd Z	
dddZdd Zdd Zdd Zdd Zdd ZdS ) z!Decide where to break text lines.    N)inf   )
LST_TO_ISOPANGO_DIRECTIONPANGO_WRAP_MODE)
FROM_UNITSTO_UNITSffigobjectpangopangoft2unicode_to_char_p)font_featuresget_font_descriptionc                 C   sX   t d}t| t j| |jt }|jt }t | |d dkr(||d 7 }||fS )zsGet logical width and height of the given ``line``.

    ``style`` is used to add letter spacing (if needed).

    zPangoRectangle *letter_spacingnormal)	r	   newr   pango_layout_line_get_extentsNULLwidthr   heightrelease)linestylelogical_extentsr   r    r   P/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/text/line_break.py	line_size   s   



r   Fc                 C   s   | j }|r|t| 8 }n.|r<t|jd | d |  }	|r(|	d}	||	 |	 \} }
| d ur:| j nd}t
| |\}}t|jt }|  ||||||fS )N r   )lengthlenencoder   pango_layout_set_widthlayoutdecoderstripset_textget_first_liner   pango_layout_get_baseliner   
deactivate)
first_linetextr$   	resume_atspace_collapser   
hyphenatedhyphenation_characterr    first_line_text_r   r   baseliner   r   r   first_line_metrics   s   

r4   c                   @   sP   e Zd ZdZ		dddZdd Zdd	 ZdddZdd Zdd Z	dd Z
dS )Layoutz2Object holding PangoLayout-related cdata pointers.r   Nc                 C   s   || _ | || || _d S N)justification_spacingsetup	max_width)selfcontextr   r7   r9   r   r   r   __init__;   s   
zLayout.__init__c              
   C   s\  || _ || _d| _|d u rtt tj}n|j	j
}tt|tj}t|d t|t|d   |d dkrLtt|d  |d \}}n|d rYt|d \}}nd }t | _|rot|| _t|| j t|d trzJ dt|}tt|tj| _t| jd t| j| |d	 }|d
krtt||| jtj }	t!t"|	 | _#t!t$|	 | _%t!t&|	 | _'t!t(|	 | _)t!t*|	 | _+n	d | _#d | _%d | _'t,|d |d |d |d |d |d |d |d }
|
r*|r,d-dd |
. D / }
|j,0|
t1|
}t2 }t3|| t4| j| d S d S d S )Nr   F	directionfont_language_overrider   langfont_familyzfont_family should be a listtext_decoration_linenonefont_kerningfont_variant_ligaturesfont_variant_positionfont_variant_capsfont_variant_numericfont_variant_alternatesfont_variant_east_asianfont_feature_settings,c                 s   s"    | ]\}}| d | V  qdS )r   Nr   ).0keyvaluer   r   r   	<genexpr>   s    
zLayout.setup.<locals>.<genexpr>)5r;   r   first_line_directionr	   gcr   pango_ft2_font_map_newr
   g_object_unreffont_configfont_mapr   pango_font_map_create_context'pango_context_set_round_glyph_positionspango_context_set_base_dirr   r   r   getlowerpango_language_get_defaultlanguagepango_language_from_stringpango_context_set_language
isinstancestrr   pango_layout_newr$   pango_layout_set_auto_dir!pango_layout_set_font_descriptionpango_context_get_metricspango_font_metrics_unrefr   pango_font_metrics_get_ascentascent)pango_font_metrics_get_underline_positionunderline_position-pango_font_metrics_get_strikethrough_positionstrikethrough_position*pango_font_metrics_get_underline_thicknessunderline_thickness.pango_font_metrics_get_strikethrough_thicknessstrikethrough_thicknessr   joinitemsr"   
setdefaultpango_attr_font_features_newpango_attr_list_newpango_attr_list_insertpango_layout_set_attributes)r:   r;   r   rU   pango_contextlang_pr?   font_descriptiontext_decorationmetricsfeaturesattr	attr_listr   r   r   r8   A   s   




zLayout.setupc                 C   s@   t | jd}t | jd}|tjkrd n|j}|j| _||fS )Nr   r   )r   pango_layout_get_line_readonlyr$   r	   r   start_indexresolved_dirrP   )r:   r+   second_lineindexr   r   r   r(      s
   zLayout.get_first_lineFc                    s  | d}|dkr|d |d  }|| _t|\}}t| j|d | jd }|r.|| j7 }| jd }|dkr9d}| jd d	v }| jr|sI|sI|rt| j  t	j
kr]t	t tj  fd
d}|rst|t }|dt|| |r|dkrd| _t| j\}}t| j|d t|t | }	dt|d f}
td |D ]}d| |
v  }|| | ||	  q|rtd}dt||_|_t | t| j  d|v r|   d S d S )N
r      word_spacingr   r   r   overflow_wrap)anywhere
break-wordc                    s(   t |}| ||_|_t  | d S r6   )r   pango_attr_letter_spacing_newr   	end_indexpango_attr_list_change)startendspacingr}   r~   r   r   add_attr   s   
z!Layout.set_text.<locals>.add_attr    u    ​r   u    | F   	)findr,   r   r   pango_layout_set_textr$   r   r7   pango_layout_get_attributesr	   r   rQ   rt   pango_attr_list_unrefintr   r!   refinditerr"   r   r   pango_attr_insert_hyphens_newr   r   r   rv   set_tabs)r:   r,   justifyr   
bytestringr   r   word_breakingr   space_spacingboundary_positionsmatchfactorr}   r   r   r   r'      sV   





zLayout.set_textc                 C   s   t | jd tr.t| j| j| j}|d| jd   | \}}t|| j\}}t	|}nt| jd j
}ttddtj|pAdtj}t| j| d S )Ntab_sizer   r   T)r_   r   r   r5   r;   r7   r'   r(   r   roundrN   r	   rQ   r   "pango_tab_array_new_with_positionsPANGO_TAB_LEFTpango_tab_array_freepango_layout_set_tabsr$   )r:   r$   r   r2   r   arrayr   r   r   r      s    
zLayout.set_tabsc                 C   s   | ` | `| `d S r6   )r$   r\   r   )r:   r   r   r   r*      s   zLayout.deactivatec                 C   s"   |  | j| | j| jdd d S )NT)r   )r8   r;   r'   r,   )r:   r   r   r   r   
reactivate   s   zLayout.reactivate)r   N)F)__name__
__module____qualname____doc__r<   r8   r(   r'   r   r*   r   r   r   r   r   r5   9   s    
K
?r5   c                 C   sX   t ||||}|d dv }|dur%|r%|dk r%t|jttd|t  ||  |S )z=Return an opaque Pango layout with default Pango line-breaks.white_spacer   zpre-wrappre-lineNi    r   )r5   r   r#   r$   r   maxr   r'   )r,   r   r;   r9   r7   r$   	text_wrapr   r   r   create_layout   s   
r   Tc           7   
      s  |d dv }|d dv }|}	|sd}d}
| }|dur|t kr|d r|d |
 |kr<| d}|dkr;| d|d	  }n| dt||d  |
  }t|||||}| \}}|du rn|| krn| }||  | \}}n<| d|  }||krt|d
 t|}}t	
|jtj|| }t|dur|} nt| |||	|}| \}}|du rt|| ||||S t||\}}|du r||krt|| ||||S ||kr|  }|d|  }||d   nd}|  ||krd}n*t	
|jtj}t|d
 t|}}||| }t|}|dur|t|d
 8 } d| d}|ro|rn |p1d dkrn|| }|| | \}}|du rn|r^t| d
 }t|| ||||S |jd
 }|t|  krnd}n|r{t|| ||||S |d }|d ot|d }|d \}}} d}!d}"d }#}$|dkr|"|  v }$|dkr|rt |}%|%r|%\}&}' |&|' }|'|& |krt||\}}|| }(|d jdkr||d j d })n|d j})|(|)ks|(dk rd}#|$r||"rd|} dd t|" D }*|*   fdd|*D }+d}&n.|#rI||| |f},|j|,}-|-du r>tj||| d}-|-|j|,< dd |-|D }+ng }+|+r|+D ]K}.| d|&  |. }||d  }/t|/||||}0|0 \}1}2t|1|\}3}||3 }4|2du o|4dkp|.|+d k}!|!r|0}|1}t| } nqP|!s|sd}!||/ t	 |jd | \}}t| }| t| |"kr|t|" 7 }|!s||"rd}!||d  }/||/ t	 |jd | \}}t| }|d }5t||\}}|| }(|d d kp|o|5d!kp|5d"ko| }6|(dk rV|6rVd}!||  t	 |jt|t!  t	"|jt#d#  | \}}2|2pJ|j}|t|  krVd}t|| |||||!|d S )$a  Fit as much as possible in the available width for one line of text.

    Return ``(layout, length, resume_index, width, height, baseline)``.

    ``layout``: a pango Layout with the first line
    ``length``: length in UTF-8 bytes of the first line
    ``resume_index``: The number of UTF-8 bytes to skip for the next line.
                      May be ``None`` if the whole text fits in one line.
                      This may be greater than ``length`` in case of preserved
                      newline characters.
    ``width``: width in pixels of the first line
    ``height``: height in pixels of the first line
    ``baseline``: baseline in pixels of the first line

    r   r   )r   nowrapr   N   	font_sizer   r   r   r    hyphensr?   hyphenate_limit_charsF   ­rB   autohyphenate_limit_zone%d   r   Tc                 S   s   g | ]}|  qS r   )r   )rL   r   r   r   r   
<listcomp>      z$split_first_line.<locals>.<listcomp>c                    s   g | ]
} d |d  qS )Nr   r   )rL   isecond_line_textr   r   r     s    )r?   leftrightc                 S   s   g | ]\}}|qS r   r   )rL   r   r   r   r   r   r     r   hyphenate_characterr   
word_breakz	break-allr   r   	WRAP_CHAR)$r   r   r   r   r(   r'   r"   r%   r!   r   #pango_layout_get_log_attrs_readonlyr$   r	   r   get_next_break_pointr4   r   r&   r    pyphenlanguage_fallbackget_next_word_boundariesunitrN   endswithr   r   reversedictionariesrY   Pypheniterater#   r   pango_layout_set_wrapr   )7r,   r   r;   r9   r7   is_line_startminimumr   r.   original_max_widthratio
short_textspace_indexr$   r+   resume_indexr1   r   r   text_end_log_attrsfirst_line_widthr2   encoded_textbreak_point	log_attrssecond_line_log_attrs	next_wordnew_first_line_textr   r?   totalr   r   r/   soft_hyphenauto_hyphenationmanual_hyphenationnext_word_boundaries
start_word	stop_wordspace
limit_zonesoft_hyphen_indexesdictionary_iterationsdictionary_key
dictionaryfirst_word_parthyphenated_first_line_text
new_layoutnew_first_liner   new_first_line_width	new_spacer   	can_breakr   r   r   split_first_line   sp  






















r   c           	      C   s   |r	t |\}}nd }t }|rt|}dD ]}| |d} qt | \}}t| d }td|}t|t|d||| |S )N)u   ‪u   ‫u   ‬u   ‭u   ‮u   ​r   zPangoLogAttr[]r   )	r   r   r[   r]   replacer!   r	   r   pango_get_log_attrs)	r,   r?   rx   r\   chartext_pr   r    r   r   r   r   get_log_attrs  s   
r   c                 C   s$   t | D ]\}}|jr|  S qd S r6   )	enumerateis_line_break)r   r   r}   r   r   r   r     s
   r   c                 C   sB   | rt | dk r
d S t| |}t | d }t|d|d  d uS )Nr   r   )r!   r   r   )r,   r?   r   r    r   r   r   can_break_text  s
   
r  c                 C   sR   | rt | dk r
d S t| |}t|D ]\}}|jr!|} ||fS |jr&|}qd S )Nr   )r!   r   r   is_word_endis_word_boundary)r,   r?   r   r   r}   word_end
word_startr   r   r   r     s   
r   c                 C   s\   | rt | dk r
d S t| |}tt|d d d D ]\}}|r+|jr+t | |   S qd S )Nr   r   )r!   r   r   listr  )r,   r?   r   r   r}   r   r   r   get_last_word_end(  s   

r  )FN)TF)r   r   mathr   r   	constantsr   r   r   r	   r   r   r
   r   r   r   fontsr   r   r   r4   r5   r   r   r   r   r  r   r  r   r   r   r   <module>   s,    $
 3
  