a
    ¥Q•hŸ`  ã                   @   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r˜tt |d  ¡ |d ¡ƒ\}}n(|d r²t|d ƒ\}}nd }t ¡ | _|rÞt |¡| _t || j¡ t|d tƒrôJ dƒ‚t|ƒ}t t |¡tj¡| _t | jd¡ t | j|¡ |d	 }|d
k�r¬t 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–|�rºt | j¡‰ ˆ t	j
kr¾t	 t ¡ tj¡‰ ‡ fd
d„}|rêt|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|�r¬t 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|p‚d¡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�r®t|| ||||ƒS ||k�râ|  ¡ }|d|…  ¡ }||d…  ¡ ‰ nd}| ‰ ||k�rúd}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
|�rÐt| ¡ ƒ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ü|�rütˆ |ƒ}%|%�rü|%\}&}'ˆ |&|'… }|'|& |k�rüt||ƒ\}}|| }(|d jdk�rÚ||d j d })n
|d j})|(|)k�sø|(dk �rüd}#|$�rN| |"¡�rd| }‰ dd„ t |"ˆ ¡D ƒ}*|* ¡  ‡ fdd„|*D ƒ}+d}&n\|#�r¦||| |f},|j |,¡}-|-du �r�t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°|�s°d}!| |/¡ 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�rÂd}!| | ¡ t	  |jt|t! ƒ¡ t	 "|jt#d# ¡ | ¡ \}}2|2�pª|j}|t|  ¡ ƒk�rÂd}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 ÿ
  