Ë
    ^ãjË4  ã                  ó  — d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddgZdd	lmZ dd
lmZmZmZmZmZmZmZmZmZmZmZmZmZmZ erddlmZ dZ G d„ de«      Z  ed¬«      d d„«       Z! ed¬«      d!d„«       Z" ed¬«      d!d„«       Z# ed¬«      d!d„«       Z$ ed¬«      d!d„«       Z% G d„ de
«      Z& ed¬«      d"d„«       Z'ddœ	 	 	 	 	 	 	 	 	 	 	 	 	 d#d„Z(	 	 d$	 	 	 	 	 	 	 d%d„Z)d&d„Z*d'd„Z+	 	 d$	 	 	 	 	 	 	 d(d„Z,e)Z-y))zú
Grapheme cluster segmentation following Unicode Standard Annex #29.

This module provides pure-Python implementation of the grapheme cluster boundary algorithm as
defined in UAX #29: Unicode Text Segmentation.

https://www.unicode.org/reports/tr29/
é    )Úannotations)ÚIntEnum)Ú	lru_cache)ÚTYPE_CHECKINGÚOptionalÚ
NamedTuplezwcwidth.bisearchzwcwidth.table_graphemeé   )Úbisearch)Ú
GRAPHEME_LÚ
GRAPHEME_TÚ
GRAPHEME_VÚGRAPHEME_LVÚINCB_EXTENDÚINCB_LINKERÚGRAPHEME_LVTÚINCB_CONSONANTÚGRAPHEME_EXTENDÚGRAPHEME_CONTROLÚGRAPHEME_PREPENDÚGRAPHEME_SPACINGMARKÚEXTENDED_PICTOGRAPHICÚGRAPHEME_REGIONAL_INDICATOR)ÚIteratoré   c                  óH   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZy)ÚGCBz'Grapheme Cluster Break property values.r   r	   é   é   é   é   é   é   é   é	   é
   é   é   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚOTHERÚCRÚLFÚCONTROLÚEXTENDÚZWJÚREGIONAL_INDICATORÚPREPENDÚSPACING_MARKÚLÚVÚTÚLVÚLVT© ó    úR/var/www/html/metafoliadorv2/venv/lib/python3.12/site-packages/wcwidth/grapheme.pyr   r   0   sL   „ Ù1à€EØ	
€BØ	
€BØ€GØ€FØ
€CØÐØ€GØ€LØ	€AØ
€AØ
€AØ	€BØ
�Cr<   r   i   )Úmaxsizec                ó   — | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S t	        | t
        «      rt         j                  S t	        | t        «      rt         j                  S t	        | t        «      rt         j                  S t	        | t        «      rt         j                  S t	        | t        «      rt         j                  S t	        | t        «      rt         j                   S t	        | t"        «      rt         j$                  S t	        | t&        «      rt         j(                  S t	        | t*        «      rt         j,                  S t	        | t.        «      rt         j0                  S t         j2                  S )z;Return the Grapheme_Cluster_Break property for a codepoint.r(   r%   i   )r   r.   r/   r2   Ú	_bisearchr   r0   r   r1   r   r3   r   r4   r   r5   r   r6   r   r7   r   r8   r   r9   r   r:   r-   ©Úucss    r=   Ú_grapheme_cluster_breakrC   F   s	  € ð
 ˆf‚}Ü�v‰vˆØ
ˆf‚}Ü�v‰vˆØ
ˆf‚}Ü�w‰wˆä�Ô&Ô'Ü�{‰{ÐÜ�”oÔ&Ü�z‰zÐÜ�Ô1Ô2Ü×%Ñ%Ð%Ü�Ô&Ô'Ü�{‰{ÐÜ�Ô*Ô+Ü×ÑÐÜ�”jÔ!Ü�u‰uˆÜ�”jÔ!Ü�u‰uˆÜ�”jÔ!Ü�u‰uˆÜ�”kÔ"Ü�v‰vˆÜ�”lÔ#Ü�w‰wˆÜ�9‰9Ðr<   c                ó4   — t        t        | t        «      «      S )z6Check if codepoint has Extended_Pictographic property.)Úboolr@   r   rA   s    r=   Ú_is_extended_pictographicrF   i   s   € ô ”	˜#Ô4Ó5Ó6Ð6r<   c                ó4   — t        t        | t        «      «      S )z,Check if codepoint has InCB=Linker property.)rE   r@   r   rA   s    r=   Ú_is_incb_linkerrH   o   ó   € ô ”	˜#œ{Ó+Ó,Ð,r<   c                ó4   — t        t        | t        «      «      S )z/Check if codepoint has InCB=Consonant property.)rE   r@   r   rA   s    r=   Ú_is_incb_consonantrK   u   s   € ô ”	˜#œ~Ó.Ó/Ð/r<   c                ó4   — t        t        | t        «      «      S )z,Check if codepoint has InCB=Extend property.)rE   r@   r   rA   s    r=   Ú_is_incb_extendrM   {   rI   r<   c                  ó&   — e Zd ZU dZded<   ded<   y)ÚBreakResultz*Result of grapheme cluster break decision.rE   Úshould_breakÚintÚri_countN)r)   r*   r+   r,   Ú__annotations__r;   r<   r=   rO   rO   �   s   … Ù4àÓØ„Mr<   rO   c                óp  — | t         j                  k(  r |t         j                  k(  rt        dd¬«      S | t         j                  t         j                  t         j                  fv r't        d|t         j
                  k(  rd¬«      S d¬«      S |t         j                  t         j                  t         j                  fv rt        dd¬«      S | t         j                  k(  rM|t         j                  t         j                  t         j                  t         j                  fv rt        dd¬«      S | t         j                  t         j                  fv r/|t         j                  t         j                  fv rt        dd¬«      S | t         j                  t         j                  fv r |t         j                  k(  rt        dd¬«      S |t         j                  k(  rt        dd¬«      S |t         j                  k(  rt        dd¬«      S | t         j                  k(  r't        d|t         j
                  k(  rd¬«      S d¬«      S y)zÚ
    Check simple GCB-pair-based break rules (cacheable).

    Returns BreakResult for rules that can be determined from GCB properties alone, or None if
    complex lookback rules (GB9c, GB11) need to be checked.
    Fr   ©rP   rR   Tr	   N)r   r.   r/   rO   r0   r3   r6   r7   r9   r:   r8   r1   r5   r4   )Úprev_gcbÚcurr_gcbs     r=   Ú_simple_break_checkrX   ˆ   sº  € ð ”3—6‘6Ò˜h¬#¯&©&Ò0Ü¨¸Ô:Ð:ð ”C—K‘K¤§¡¬¯©Ð0Ñ0Ü¨Ø)1´S×5KÑ5KÒ)K AôTð 	TØQRôTð 	Tð ”C—K‘K¤§¡¬¯©Ð0Ñ0Ü¨°qÔ9Ð9ð ”3—5‘5Ò˜X¬#¯%©%´·±¼¿¹ÄÇÁÐ)HÑHÜ¨¸Ô:Ð:ð ”C—F‘FœCŸE™E�?Ñ" x´C·E±E¼3¿5¹5°>Ñ'AÜ¨¸Ô:Ð:ð ”C—G‘GœSŸU™UÐ#Ñ#¨´C·E±EÒ(9Ü¨¸Ô:Ð:ð ”3—:‘:ÒÜ¨¸Ô:Ð:ð ”3×#Ñ#Ò#Ü¨¸Ô:Ð:ð ”3—;‘;ÒÜ¨Ø)1´S×5KÑ5KÒ)K AôTð 	TØQRôTð 	Tð
 r<   ©Ústartc               ó<  — t        | |«      }|�|S |t        j                  k(  rt        dd¬«      S t	        ||   «      }t        |«      rl|dz
  }||k\  r9t        t	        ||   «      «      r"|dz  }||k\  rt        t	        ||   «      «      rŒ"||k\  r$t        t	        ||   «      «      rt        dd¬«      S | t        j                  k(  rft        |«      r[|dz
  }||k\  rQt	        ||   «      }	t        |	«      }
|
t        j                  k(  r|dz  }nt        |	«      rt        dd¬«      S n||k\  rŒQ| t        j                  k(  r8|t        j                  k(  r%|dz  dk(  rt        d|dz   ¬«      S t        dd¬«      S |t        j                  k(  rdnd}t        d|¬«      S )z�
    Determine if there should be a grapheme cluster break between prev and curr.

    Implements UAX #29 grapheme cluster boundary rules.
    Fr   rU   r	   r   T)rX   r   r2   rO   ÚordrK   rM   rH   rF   rC   r1   r3   )rV   rW   ÚtextÚcurr_idxrR   rZ   ÚresultÚcurr_ucsÚiÚprev_ucsÚ	prev_props              r=   Ú_should_breakrd   »   sŽ  € ô  ! ¨8Ó4€FØÐØˆð ”3—7‘7ÒÜ¨¸Ô:Ð:ô �4˜‘>Ó"€HÜ˜(Ô#Ø�q‰LˆØ�5Šjœ_¬S°°a±«\Ô:Ø�‰FˆAð �5Šjœ_¬S°°a±«\Õ:à�Š:œ/¬#¨d°1©g«,Ô7Ü¨E¸AÔ>Ð>ð ”3—7‘7ÒÔ8¸ÔBØ�q‰LˆØ�5ŠjÜ˜4 ™7“|ˆHÜ/°Ó9ˆIØœCŸJ™JÒ&Ø�Q‘‘Ü*¨8Ô4Ü"°ÀÔBÐBàð �5‹jð ”3×)Ñ)Ò)¨h¼#×:PÑ:PÒ.PØ�a‰<˜1ÒÜ¨E¸HÀq¹LÔIÐIÜ¨°qÔ9Ð9ð ¤× 6Ñ 6Ò6‰q¸A€HÜ D°8Ô<Ð<r<   Nc           	   #  ó¢  K  — | syt        | «      }t        |d«      }|€|}||k\  s||k\  ryt        ||«      }|}d}t        t	        | |   «      «      }|t
        j                  k(  rd}t        |dz   |«      D ]M  }t        t	        | |   «      «      }t        ||| |||¬«      }	|	j                  }|	j                  r	| || –— |}|}ŒO | || –— y­w)uI  
    Iterate over grapheme clusters by UAX #29 extended grapheme cluster rules.

    Grapheme clusters are "user-perceived characters" - what a user would
    consider a single character, which may consist of multiple Unicode
    codepoints (e.g., a base character with combining marks, emoji sequences).

    :param unistr: The Unicode string to segment.
    :param start: Starting index (default 0).
    :param end: Ending index (default len(unistr)).
    :yields: Grapheme cluster substrings.

    Example::

        >>> list(iter_graphemes('cafe\u0301'))
        ['c', 'a', 'f', 'eÌ�']
        >>> list(iter_graphemes('ok\U0001F468\u200D\U0001F469\u200D\U0001F467'))
        ['o', 'k', 'ðŸ‘¨\u200dðŸ‘©\u200dðŸ‘§']
        >>> list(iter_graphemes('ok\U0001F1FA\U0001F1F8'))
        ['o', 'k', 'ðŸ‡ºðŸ‡¸']

    .. versionadded:: 0.3.0
    Nr   r	   rY   )ÚlenÚmaxÚminrC   r\   r   r3   Úrangerd   rR   rP   )
ÚunistrrZ   ÚendÚlengthÚcluster_startrR   rV   ÚidxrW   r_   s
             r=   Ú_iter_graphemes_pythonro   õ   sø   è ø€ ñ8 Øä�‹[€Fä��q‹M€Eà
€{Øˆà�‚|�u ’Øä
ˆc�6Ó
€Cð €MØ€Hô '¤s¨6°%©=Ó'9Ó:€Hð ”3×)Ñ)Ò)Øˆä�U˜Q‘Y Ó$ò 
ˆÜ*¬3¨v°c©{Ó+;Ó<ˆä˜x¨°6¸3ÀÐPUÔVˆØ—?‘?ˆà×ÒØ˜ sÐ+Ò+ØˆMà‰ð
ð �˜sÐ
#Ó#ùs   ‚CCc                óÎ  — t        | |dz
     «      }|dk(  r|dk\  r| |dz
     dk(  r|dz
  S |dk  rP|dk\  rF|dk\  rAt        | |dz
     «      }|dk\  r+t        |«      t        j                  k(  rt	        | |dz
  «      S |dz
  S |dz
  }|dkD  rTt        | |   «      }d|cxk  rdk  rn nn7t        |«      t        j
                  k(  rn||z
  t        k\  rd}n|dz  }|dkD  rŒT|}t        t        | |   «      «      }|t        j                  k(  rdnd}t        |dz   |«      D ]D  }	t        t        | |	   «      «      }
t        ||
| |	|«      }|j                  }|j                  r|	}|
}ŒF |S )a  
    Find the start of the grapheme cluster containing the character before pos.

    Scans backwards from pos to find a safe starting point, then iterates forward using standard
    break rules to find the actual cluster boundary.

    :param text: The Unicode string.
    :param pos: Position to search before (exclusive).
    :returns: Start position of the grapheme cluster.
    r	   r%   r   úé€   é    r   )r\   rC   r   r4   Ú_find_cluster_startr0   ÚMAX_GRAPHEME_SCANr3   ri   rd   rR   rP   )r]   ÚposÚ	target_cpÚprev_cpÚ
safe_startÚcprm   Úleft_gcbrR   ra   Ú	right_gcbr_   s               r=   rt   rt   ;  s˜  € ô �D˜˜q™‘MÓ"€Ið �DÒ˜S AšX¨$¨s°Q©w©-¸4Ò*?Ø�Q‰wˆð �4Òà�!Š8˜	 TÒ)Ü˜$˜s Q™w™-Ó(ˆGØ˜$ŠÔ#:¸7Ó#CÄsÇ{Á{Ò#RÜ*¨4°°q±Ó9Ð9Ø�Q‰wˆð �q‘€JØ
�qŠ.Ü��jÑ!Ó"ˆØ�2Ô˜ÕØÜ" 2Ó&¬#¯+©+Ò5ØØ�ÑÔ0Ò0ØˆJØØ�a‰ˆ
ð �q‹.ð €MÜ&¤s¨4°
Ñ+;Ó'<Ó=€HØ¤× 6Ñ 6Ò6‰q¸A€Hä�: ‘> 3Ó'ò ˆÜ+¬C°°Q±«LÓ9ˆ	Ü˜x¨°D¸!¸XÓFˆØ—?‘?ˆØ×ÒØˆMØ‰ðð Ðr<   c           	     óP   — |dk  s| syt        | t        |t        | «      «      «      S )aÌ  
    Find the grapheme cluster boundary immediately before a position.

    :param unistr: The Unicode string to search.
    :param pos: Position in the string (0 < pos <= len(unistr)).
    :returns: Start index of the grapheme cluster containing the character at pos-1.

    Example::

        >>> grapheme_boundary_before('Hello \U0001F44B\U0001F3FB', 8)
        6
        >>> grapheme_boundary_before('a\r\nb', 3)
        1

    .. versionadded:: 0.3.6
    r   )rt   rh   rf   )rj   rv   s     r=   Úgrapheme_boundary_beforer~   r  s(   € ð" ˆa‚x‘vØÜ˜v¤s¨3´°F³Ó'<Ó=Ð=r<   c              #  óÈ   K  — | syt        | «      }|€|nt        ||«      }t        |d«      }||k\  s||k\  ry|}||kD  r"t        | |«      }||k  ry| || –— |}||kD  rŒ!yy­w)a¡  
    Iterate over grapheme clusters in reverse order (last to first).

    :param unistr: The Unicode string to segment.
    :param start: Starting index (default 0).
    :param end: Ending index (default len(unistr)).
    :yields: Grapheme cluster substrings in reverse order.

    Example::

        >>> list(iter_graphemes_reverse('cafe\u0301'))
        ['e\u0301', 'f', 'a', 'c']

    .. versionadded:: 0.3.6
    Nr   )rf   rh   rg   rt   )rj   rZ   rk   rl   rv   rm   s         r=   Úiter_graphemes_reverser€   ˆ  s‚   è ø€ ñ( Øä�‹[€Fà�K‰&¤S¨¨fÓ%5€CÜ��q‹M€Eà�‚|�u ’Øà
€CØ
�Š+Ü+¨F°CÓ8ˆà˜5Ò ØØ�] 3Ð'Ò'Øˆð ��+ùs   ‚AA"Á A")rB   rQ   Úreturnr   )rB   rQ   r�   rE   )rV   r   rW   r   r�   zOptional[BreakResult])rV   r   rW   r   r]   Ústrr^   rQ   rR   rQ   rZ   rQ   r�   rO   )r   N)rj   r‚   rZ   rQ   rk   z
int | Noner�   úIterator[str])r]   r‚   rv   rQ   r�   rQ   )rj   r‚   rv   rQ   r�   rQ   )rj   r‚   rZ   rQ   rk   zOptional[int]r�   rƒ   ).r,   Ú
__future__r   Úenumr   Ú	functoolsr   Útypingr   r   r   Ú__lazy_modules__r
   r@   Útable_graphemer   r   r   r   r   r   r   r   r   r   r   r   r   r   Úcollections.abcr   ru   r   rC   rF   rH   rK   rM   rO   rX   rd   ro   rt   r~   r€   Úiter_graphemesr;   r<   r=   ú<module>rŒ      sÎ  ðñõ #õ Ý ç 6Ñ 6ð ØðÐ õ
 ,÷:÷ :÷ :÷ :ñ å(ð Ð ôˆ'ô ñ, �4Ôòó ðñD �4Ôò7ó ð7ñ
 �4Ôò-ó ð-ñ
 �4Ôò0ó ð0ñ
 �4Ôò-ó ð-ô
�*ô ñ �4Ôò/ó ð/ðr ñ7=Øð7=àð7=ð ð7=ð ð	7=ð
 ð7=ð ð7=ð ó7=ðx ØðC$ØðC$àðC$ð 
ðC$ð ó	C$óL4ón>ð0 Øð&Øð&àð&ð 
ð&ð ó	&ðT (�r<   