a
    [Xh`                     @   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   Zpango_layout_line_get_extentsNULLwidthr   heightrelease)linestyleZlogical_extentsr   r    r   _/var/www/viveiro_mudafortebrasil/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"   Z	resume_atspace_collapser   
hyphenatedZhyphenation_characterr   first_line_text_r   r   Zbaseliner   r   r   first_line_metrics   s    

r.   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   r1   r3   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	directionZfont_language_overrider   langZfont_familyzfont_family should be a listZtext_decoration_linenoneZfont_kerningZfont_variant_ligaturesZfont_variant_positionZfont_variant_capsZfont_variant_numericZfont_variant_alternatesZfont_variant_east_asianZ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>)5r5   r   first_line_directionr	   gcr   Zpango_ft2_font_map_newr
   Zg_object_unrefZ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_ascentZ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)r4   r5   r   rA   Zpango_contextlang_pr8   Zfont_descriptionZtext_decorationZmetricsfeaturesattr	attr_listr   r   r   r2   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_dirr?   )r4   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 r0   )r   Zpango_attr_letter_spacing_newrR   	end_indexpango_attr_list_change)startendspacingrP   rQ   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   r1   Zpango_layout_get_attributesr	   r   r@   rL   Zpango_attr_list_unrefintr   r   refinditerr    r\   r]   Zpango_attr_insert_hyphens_newrR   rZ   r[   rM   set_tabs)r4   r)   justifyrS   
bytestringrV   r   Zword_breakingr`   Zspace_spacingZboundary_positionsmatchZfactorrP   r   r_   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 )NZtab_sizer   r   T)rG   r   rd   r/   r5   r1   r%   r&   r   roundr=   r	   r@   r   Z"pango_tab_array_new_with_positionsZPANGO_TAB_LEFTZpango_tab_array_freeZpango_layout_set_tabsr"   )r4   r"   r   r-   r   arrayr   r   r   rg      s     
zLayout.set_tabsc                 C   s   | ` | `| `d S r0   )r"   rE   r   )r4   r   r   r   r'      s    zLayout.deactivatec                 C   s"   |  | j| | j| jdd d S )NT)rh   )r2   r5   r%   r)   )r4   r   r   r   r   
reactivate   s    zLayout.reactivate)r   N)F)__name__
__module____qualname____doc__r6   r2   r&   r%   rg   r'   rm   r   r   r   r   r/   9   s     
K
?r/   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   )r/   r   r!   r"   rd   maxr   r%   )r)   r   r5   r3   r1   r"   	text_wrapr   r   r   create_layout   s    
rw   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

    rr   rs   )r   Znowraprt   N   Z	font_sizer   r   rU   r    hyphensr8   Zhyphenate_limit_charsF   ­r9   autoZhyphenate_limit_zone%d   r   Tc                 S   s   g | ]}|  qS r   )r\   )r;   rj   r   r   r   
<listcomp>  s   z$split_first_line.<locals>.<listcomp>c                    s   g | ]} d |d  qS )Nr   r   )r;   iZsecond_line_textr   r   r         )r8   leftrightc                 S   s   g | ]\}}|qS r   r   )r;   r\   r]   r   r   r   r     s   Zhyphenate_characterrW   Z
word_breakz	break-allrX   rY   Z	WRAP_CHAR)$r   rc   rd   rw   r&   r%   r    r#   r   r   Z#pango_layout_get_log_attrs_readonlyr"   r	   r   get_next_break_pointr.   r   r$   r   pyphenZlanguage_fallbackget_next_word_boundariesunitr=   endswithre   rf   reverseZdictionariesrB   ZPyphenZiterater!   r   Zpango_layout_set_wrapr   )7r)   r   r5   r3   r1   Zis_line_startZminimumrv   r*   Zoriginal_max_widthZratioZ
short_textZspace_indexr"   r(   Zresume_indexr,   r\   r]   Ztext_end_log_attrsZfirst_line_widthr-   Zencoded_textZbreak_point	log_attrsZsecond_line_log_attrsZ	next_wordZnew_first_line_textrz   r8   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_linerS   Znew_first_line_widthZ	new_spacerW   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   rD   rF   replacer   r	   r   Zpango_get_log_attrs)	r)   r8   rN   rE   charZtext_pri   r   r   r   r   r   get_log_attrs  s    
r   c                 C   s$   t | D ]\}}|jr|  S qd S r0   )	enumerateZis_line_break)r   r   rP   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 )NrU   r   )r   r   r   )r)   r8   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 )NrU   )r   r   r   is_word_endZis_word_boundary)r)   r8   r   r   rP   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 )NrU   r   )r   r   r   listr   )r)   r8   r   r   rP   r   r   r   get_last_word_end(  s    

r   )FN)TF)rq   re   mathr   r   	constantsr   r   r   r	   r   r   r
   r   r   r   Zfontsr   r   r   r.   r/   rw   r   r   r   r   r   r   r   r   r   r   <module>   s*   $ 
 3 
  