a
    Qh`                     @   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rP||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   S/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/text/line_break.py	line_size   s    



r   Fc                 C   s   | j }|r|t| 8 }n\|rxt|jd | d |  }	|rP|	d}	||	 |	 \} }
| d urt| 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   Zpango_layout_get_baseliner   
deactivate)
first_linetextr$   	resume_atspace_collapser   
hyphenatedZhyphenation_characterr    first_line_text_r   r   baseliner   r   r   first_line_metrics   s    

r2   c                   @   sL   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   r5   r7   r   r   r   __init__;   s    zLayout.__init__c              
   C   sV  || _ || _d| _|d u r.tt tj}n|j	j
}tt|tj}t|d t|t|d   |d dkrtt|d  |d \}}n(|d rt|d \}}nd }t | _|rt|| _t|| j t|d trJ 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 }
|
rR|rRd-dd |
. D / }
|j,0|
t1|
}t2 }t3|| t4| j| 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>)5r9   r   first_line_directionr	   gcr   Zpango_ft2_font_map_newr
   Zg_object_unreffont_configfont_mapr   Zpango_font_map_create_contextZ'pango_context_set_round_glyph_positionsZpango_context_set_base_dirr   r   r   getlowerpango_language_get_defaultlanguagepango_language_from_stringZpango_context_set_language
isinstancestrr   Zpango_layout_newr$   Zpango_layout_set_auto_dirZ!pango_layout_set_font_descriptionZpango_context_get_metricsZpango_font_metrics_unrefr   Zpango_font_metrics_get_ascentascentZ)pango_font_metrics_get_underline_positionZunderline_positionZ-pango_font_metrics_get_strikethrough_positionZstrikethrough_positionZ*pango_font_metrics_get_underline_thicknessZunderline_thicknessZ.pango_font_metrics_get_strikethrough_thicknessZstrikethrough_thicknessr   joinitemsr"   
setdefaultZpango_attr_font_features_newpango_attr_list_newZpango_attr_list_insertpango_layout_set_attributes)r8   r9   r   rQ   Zpango_contextlang_pr=   Zfont_descriptiontext_decorationZmetricsfeaturesattr	attr_listr   r   r   r6   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   Zpango_layout_get_line_readonlyr$   r	   r   start_indexZresolved_dirrN   )r8   r*   Z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rrd}| jd d	v }| jr|s|s|rt| j  t	j
krt	t tj  fd
d}|rt|t }|dt|| |r~|dkrd| _t| j\}}t| j|d t|t | }	dt|d f}
td |D ].}d| |
v  }|| | ||	  qN|rtd}dt| |_|_t | t| j  d|v r|   d S )N
r      word_spacingr   r   r   overflow_wrap)anywhere
break-wordc                    s(   t |}| | |_|_t  | d S r4   )r   Zpango_attr_letter_spacing_newrd   	end_indexpango_attr_list_change)startendspacingrb   rc   r   r   add_attr   s    
z!Layout.set_text.<locals>.add_attr    u    ​r   u    | F   	)findr+   r   r   Zpango_layout_set_textr$   r   r5   Zpango_layout_get_attributesr	   r   rO   r]   Zpango_attr_list_unrefintr   r!   refinditerr"   rn   ro   Zpango_attr_insert_hyphens_newrd   rl   rm   r^   set_tabs)r8   r+   justifyre   
bytestringrh   r   Zword_breakingrr   Zspace_spacingZboundary_positionsmatchfactorrb   r   rq   r   r'      sT    







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|pdtj}t| j| d S )Ntab_sizer   r   T)rW   r   rv   r3   r9   r5   r'   r(   r   roundrL   r	   rO   r   Z"pango_tab_array_new_with_positionsZPANGO_TAB_LEFTZpango_tab_array_freeZpango_layout_set_tabsr$   )r8   r$   r   r0   r   arrayr   r   r   ry      s     
zLayout.set_tabsc                 C   s   | ` | `| `d S r4   )r$   rU   r   )r8   r   r   r   r)      s    zLayout.deactivatec                 C   s"   |  | j| | j| jdd d S )NT)rz   )r6   r9   r'   r+   )r8   r   r   r   r   
reactivate   s    zLayout.reactivate)r   N)F)__name__
__module____qualname____doc__r:   r6   r(   r'   ry   r)   r   r   r   r   r   r3   9   s     
K
?r3   c                 C   sX   t ||||}|d dv }|durJ|rJ|dk rJt|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   )r3   r   r#   r$   rv   maxr   r'   )r+   r   r9   r7   r5   r$   	text_wrapr   r   r   create_layout   s    
r   Tc           7   
      s  |d dv }|d dv }|}	|s$d}d}
| }|durB|t krB|d rB|d |
 |kr~| d}|dkr| d|d	  }n| dt||d  |
  }t|||||}| \}}|du r|| kr| }||  | \}}n^| d|  }||kr^t|d
 t| }}t	
|jtj|| }t|dur^|} nt| |||	|}| \}}|du rzt|| ||||S t||\}}|du r||krt|| ||||S ||kr|  }|d|  }||d   nd}|  ||krd}nTt	
|jtj}t|d
 t| }}||| }t|}|durN|t|d
 8 } d| d}|r|r
 |pvd dkr
|| }|| | \}}|du r
|rt| d
 }t|| ||||S |jd
 }|t|  kr
d}n|r
t|| ||||S |d }|d o(t|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}#|$rN||"rd| } dd t|" D }*|*   fdd|*D }+d}&n\|#r||| |f},|j|,}-|-du rtj||| d}-|-|j|,< dd |-|D }+ng }+|+r|+D ]}.| d|&  |. }||d  }/t|/||||}0|0 \}1}2t|1|\}3}||3 }4|2du o(|4dkp(|.|+d k}!|!r|0}|1}t| } qNq|!s|sd}!||/ t	 |jd | \}}t| }| t| |"kr|t|" 7 }|!s||"rd}!||d  }/||/ t	 |jd | \}}t| }|d }5t||\}}|| }(|d d kpL|oL|5d!kpL|5d"koL| }6|(dk r|6rd}!||  t	 |jt|t!  t	"|jt#d#  | \}}2|2p|j}|t|  krd}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   rg   r    hyphensr=   hyphenate_limit_charsF   ­r@   autohyphenate_limit_zone%d   r   Tc                 S   s   g | ]}|  qS r   )rn   )rJ   r|   r   r   r   
<listcomp>  s   z$split_first_line.<locals>.<listcomp>c                    s   g | ]} d |d  qS )Nr   r   )rJ   iZsecond_line_textr   r   r         )r=   leftrightc                 S   s   g | ]\}}|qS r   r   )rJ   rn   ro   r   r   r   r     s   hyphenate_characterri   
word_breakz	break-allrj   rk   Z	WRAP_CHAR)$r   ru   rv   r   r(   r'   r"   r%   r!   r   Z#pango_layout_get_log_attrs_readonlyr$   r	   r   get_next_break_pointr2   r   r&   r    pyphenlanguage_fallbackget_next_word_boundariesunitrL   endswithrw   rx   reversedictionariesrR   Pypheniterater#   r   Zpango_layout_set_wrapr   )7r+   r   r9   r7   r5   Zis_line_startminimumr   r-   Zoriginal_max_widthratioZ
short_textZspace_indexr$   r*   Zresume_indexr/   rn   ro   Ztext_end_log_attrsfirst_line_widthr0   Zencoded_textZbreak_point	log_attrsZsecond_line_log_attrsZ	next_wordZnew_first_line_textr   r=   totalr   r   r.   Zsoft_hyphenZauto_hyphenationZmanual_hyphenationZnext_word_boundariesZ
start_wordZ	stop_wordspaceZ
limit_zoneZsoft_hyphen_indexesZdictionary_iterationsZdictionary_key
dictionaryZfirst_word_partZhyphenated_first_line_textZ
new_layoutZnew_first_linere   Znew_first_line_widthZ	new_spaceri   Z	can_breakr   r   r   split_first_line   sh   



























r   c           	      C   s   |rt |\}}nd }t }|r,t|}dD ]}| |d} q0t | \}}t| d }td|}t|t|d||| |S )N)u   ‪u   ‫u   ‬u   ‭u   ‮u   ​r   zPangoLogAttr[]r   )	r   r   rT   rV   replacer!   r	   r   Zpango_get_log_attrs)	r+   r=   r_   rU   charZtext_pr{   r    r   r   r   r   get_log_attrs  s    
r   c                 C   s$   t | D ]\}}|jr|  S qd S r4   )	enumerateZis_line_break)r   r   rb   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 )Nrg   r   )r!   r   r   )r+   r=   r   r    r   r   r   can_break_text  s
    
r   c                 C   sT   | rt | dk rd S t| |}t|D ] \}}|jr<|} qL|jr&|}q&d S ||fS )Nrg   )r!   r   r   is_word_endZis_word_boundary)r+   r=   r   r   rb   Zword_endZ
word_startr   r   r   r     s    
r   c                 C   s\   | rt | dk rd S t| |}tt|d d d D ]"\}}|r4|jr4t | |   S q4d S )Nrg   r   )r!   r   r   listr   )r+   r=   r   r   rb   r   r   r   get_last_word_end(  s    

r   )FN)TF)r   rw   mathr   r   	constantsr   r   r   r	   r   r   r
   r   r   r   fontsr   r   r   r2   r3   r   r   r   r   r   r   r   r   r   r   r   <module>   s*   $ 
 3 
  