
    :QgX/              	          U d Z ddlmZmZmZmZmZmZ ddlm	Z	 g dZ
dZi Zeeef   ed<    G d d      Z G d	 d
e      Z G d de      Z G d de      Zdededee   fdZdee   dededee   fdZdeeef   fdZy)z]
emoji.tokenizer
~~~~~~~~~~~~~~~

Components for detecting and tokenizing emoji in strings.

    )List
NamedTupleDictUnionIteratorAny)unicode_codes)
EmojiMatchEmojiMatchZWJEmojiMatchZWJNonRGITokentokenizefilter_tokensu   ‍_SEARCH_TREEc                       e Zd ZdZdZdedededeeee	f   df   fdZ
d	eee	f   fd
Zd	efdZd	ed   fdZd	efdZy)r
   zd
    Represents a match of a "recommended for general interchange" (RGI)
    emoji in a string.
    emojistartenddatar   r   r   r   Nc                 B    || _         	 || _        	 || _        	 || _        y Nr   )selfr   r   r   r   s        L/var/www/html/answerous/venv/lib/python3.12/site-packages/emoji/tokenizer.py__init__zEmojiMatch.__init__"   s,     
!
86	b    returnc                     | j                   r:| j                   j                         }| j                  |d<   | j                  |d<   |S | j                  | j                  dS )z
        Returns a copy of the data from :data:`EMOJI_DATA` for this match
        with the additional keys ``match_start`` and ``match_end``.
        match_start	match_end)r   r    )r   copyr   r   )r   emj_datas     r   	data_copyzEmojiMatch.data_copy1   sO    
 99yy~~'H&*jjH]#$(HHH[!O#'::DHHEEr   c                 &    t         | j                  v S )zp
        Checks if this is a ZWJ-emoji.

        :returns: True if this is a ZWJ-emoji, False otherwise
        )_ZWJr   r   s    r   is_zwjzEmojiMatch.is_zwj>   s     tzz!!r   )r   r
   c                 <    | j                         rt        |       S | S )z
        Splits a ZWJ-emoji into its constituents.

        :returns: An :class:`EmojiMatchZWJ` containing the "sub-emoji" if this is a ZWJ-emoji, otherwise self
        )r'   r   r&   s    r   splitzEmojiMatch.splitG   s     ;;= &&Kr   c                     | j                   j                   d| j                   d| j                   d| j                   dS N(z, :))	__class____name__r   r   r   r&   s    r   __repr__zEmojiMatch.__repr__S   s9    ..))*!DJJ<r$**QtxxjPQRRr   )r0   
__module____qualname____doc__	__slots__strintr   r   r   r   r#   boolr'   r)   r1    r   r   r
   r
      s    
 2Icc!$c+.c6;DcND<P6QcF4S> F" "
u:; 
S# Sr   r
   c                   X     e Zd ZdZdZdef fdZdefdZde	fdZ
d
dZdefd	Z xZS )r   zr
    Represents a match of multiple emoji in a string that were joined by
    zero-width-joiners (ZWJ/``\u200D``).)emojismatchc           
         t         |   |j                  |j                  |j                  |j
                         g | _        	 |j                  }|j                  j                  t              D ]f  }t        |||t        |      z   t        j                  j                  |d             }| j                  j                  |       |t        |      dz   z  }h y )N   )superr   r   r   r   r   r;   r)   r%   r
   lenr	   
EMOJI_DATAgetappend)r   r<   iemr/   s        r   r   zEmojiMatchZWJ.__init__^   s    ekk599ejjI(*5KK""4( 	A1aSV]-E-E-I-I!T-RSAKKq!Q!OA	r   r   c                 N    t         j                  d | j                  D              S )z1
        Joins a ZWJ-emoji into a string
        c              3   4   K   | ]  }|j                     y wr   r   .0rE   s     r   	<genexpr>z%EmojiMatchZWJ.join.<locals>.<genexpr>o   s     6Q6   )r%   joinr;   r&   s    r   rN   zEmojiMatchZWJ.joinj   s    
 yy6$++666r   c                      y)NTr9   r&   s    r   r'   zEmojiMatchZWJ.is_zwjq   s    r   c                     | S r   r9   r&   s    r   r)   zEmojiMatchZWJ.splitt   s    r   c                     | j                   j                   d| j                          d| j                   d| j                   dS r+   )r/   r0   rN   r   r   r&   s    r   r1   zEmojiMatchZWJ.__repr__w   s;    ..))*!DIIK=4::,azQRSSr   )r   r   )r0   r2   r3   r4   r5   r
   r   r6   rN   r8   r'   r)   r1   __classcell__)r/   s   @r   r   r   W   sF    - I
j 
7c 7 T# Tr   r   c                   2    e Zd ZdZdedefdZd ZdefdZy)	r   a  
    Represents a match of multiple emoji in a string that were joined by
    zero-width-joiners (ZWJ/``\u200D``). This class is only used for emoji
    that are not "recommended for general interchange" (non-RGI) by Unicode.org.
    The data property of this class is always None.
    first_emoji_matchsecond_emoji_matchc                 8    ||g| _         	 | j                          y r   )r;   _update)r   rT   rU   s      r   r   zEmojiMatchZWJNonRGI.__init__   s    (*<=5r   c                     t         j                  d | j                  D              | _        | j                  d   j                  | _        | j                  d   j
                  | _        d | _        y )Nc              3   4   K   | ]  }|j                     y wr   rI   rJ   s     r   rL   z.EmojiMatchZWJNonRGI._update.<locals>.<genexpr>   s     <1qww<rM   r   )r%   rN   r;   r   r   r   r   r&   s    r   rW   zEmojiMatchZWJNonRGI._update   sM    YY<<<
[[^))
;;r?&&	r   next_emoji_matchc                 Z    | j                   j                  |       | j                          y r   )r;   rC   rW   )r   r[   s     r   _addzEmojiMatchZWJNonRGI._add   s    +,r   N)r0   r2   r3   r4   r
   r   rW   r]   r9   r   r   r   r   {   s+    * * Z r   r   c                   0    e Zd ZU dZeed<   eeef   ed<   y)r   z
    A named tuple containing the matched string and its :class:`EmojiMatch` object if it is an emoji
    or a single character that is not a unicode emoji.
    charsvalueN)r0   r2   r3   r4   r6   __annotations__r   r
   r9   r   r   r   r      s    
 Jj!!r   r   stringkeep_zwjr   c              #     K   t               }t        j                  }g }d}t        |       }g }||k  rd}| |   }	||v r,|dz  }|	t        k(  r|r|j                  t        |	|	             =|	|v ru|dz   }
||	   }|
|k  r&| |
   |v r|
|v rn|| |
      }|
dz  }
|
|k  r| |
   |v rd|v r|d   }| ||
 }t        |||
|      }|
dz
  }d}|j                  t        ||             n|	t        k(  r|r|d   j                  |v r|dkD  r| |dz
     |v r|j                  |       ||d   j                     d   t        j                  d   k(  r3|t        d	 |d
d D              z
  }| |   t        k(  r	|dz  }|d= n$|d
d= n|t        |d   j                        z
  }|d= n|r|E d{    g }|s%|	dk7  r |	dk7  r|j                  t        |	|	             |dz  }||k  r|E d{    y7 D7 w)a  
    Finds unicode emoji in a string. Yields all normal characters as a named
    tuple :class:`Token` ``(char, char)`` and all emoji as :class:`Token` ``(chars, EmojiMatch)``.

    :param string: String contains unicode characters. MUST BE UNICODE.
    :param keep_zwj: Should ZWJ-characters (``\u200D``) that join non-RGI emoji be
        skipped or should be yielded as normal characters
    :return: An iterable of tuples :class:`Token` ``(char, char)`` or :class:`Token` ``(chars, EmojiMatch)``
    r   Fr>   r   TrZ   status	componentc              3   F   K   | ]  }t        |j                          y wr   )r@   r_   )rK   ts     r   rL   ztokenize.<locals>.<genexpr>   s     >QCL>s   !Nu   ︎u   ️)get_search_treer	   rA   r@   r%   rC   r   r
   r_   STATUSsum)rb   rc   treerA   resultrD   lengthignoreconsumedcharjsub_treer"   code_points	match_objs                  r   r   r      se     D))JF	A[F 	  f*ay;FAt|eD$/0T\AADzHf*h!6;#F1I.Q	 f*h!6
 !#F+$Qqk
 '{Aq(C	EeK;< DLr
  J.Aq1u% MM!6":++,X6 ''45
 >&+>>>!9$FAr
 rs F2J,,--2JFDH,1AMM%d+,	QE f*H   s1   B!G,$C?G,#G($7G,G,"G*#G,*G,matches
emoji_only
join_emojic           
   #     K   |s|s| E d{    y|s | D ]  }|j                   t        k7  s|  yd}d}d}g }| D ]r  }|}|r|j                  t        k(  rd}t        |j                  t              r$|r
|rt        |d   j                  t
              rf|d   j                  j                  |j                         t        |d   j                   t        z   |j                   z   |d   j                        |d<   n|j                         }t        |j                  t              sJ |j                  t        |j                   t        z   |j                   z   t        |j                  |j                                     n|j                  |       d}d}]d}d}|E d{    |s| g }u |E d{    y7 7 7 
w)ap  
    Filters the output of `tokenize()`

    :param matches: An iterable of tuples of the form ``(match_str, result)``
        where ``result`` is either an EmojiMatch or a string.
    :param emoji_only: If True, only EmojiMatch are returned in the output.
        If False all characters are returned
    :param join_emoji: If True, multiple EmojiMatch are merged into
        a single :class:`EmojiMatchZWJNonRGI` if they are separated only by a ZWJ.

    :return: An iterable of tuples :class:`Token` ``(char, char)``,
        :class:`Token` ``(chars, EmojiMatch)`` or :class:`Token` ``(chars, EmojiMatchZWJNonRGI)``
    NFTrZ   )
r_   r%   r`   
isinstancer
   r   r]   r   poprC   )	rw   rx   ry   tokenprevious_is_emojiprevious_is_zwjpre_previous_is_emojiaccumulatorprevs	            r   r   r      s    " j 	E{{d"	 	 O!!K   1!4"OZ0$k"o335HIO))..u{{;&+#B--4u{{B#B--'KO
 '??,D%djj*===&& JJ-;/

EKKH ""5) $#O !&#O"""KA B a 	X # s9   
GF?GE7G$G%G9G:GGGc                      t         sft        j                  D ]S  } t         }t        |       dz
  }t	        |       D ]/  \  }}||vri ||<   ||   }||k(  st        j                  |    |d<   1 U t         S )u  
    Generate a search tree for demojize().
    Example of a search tree::

        EMOJI_DATA =
        {'a': {'en': ':Apple:'},
        'b': {'en': ':Bus:'},
        'ba': {'en': ':Bat:'},
        'band': {'en': ':Beatles:'},
        'bandit': {'en': ':Outlaw:'},
        'bank': {'en': ':BankOfEngland:'},
        'bb': {'en': ':BB-gun:'},
        'c': {'en': ':Car:'}}

        _SEARCH_TREE =
        {'a': {'data': {'en': ':Apple:'}},
        'b': {'a': {'data': {'en': ':Bat:'},
                    'n': {'d': {'data': {'en': ':Beatles:'},
                                'i': {'t': {'data': {'en': ':Outlaw:'}}}},
                        'k': {'data': {'en': ':BankOfEngland:'}}}},
            'b': {'data': {'en': ':BB-gun:'}},
            'data': {'en': ':Bus:'}},
        'c': {'data': {'en': ':Car:'}}}

                   _SEARCH_TREE
                 /     |        ⧵
               /       |          ⧵
            a          b             c
            |        / |  ⧵          |
            |       /  |    ⧵        |
        :Apple:   ba  :Bus:  bb     :Car:
                 /  ⧵         |
                /    ⧵        |
              :Bat:    ban     :BB-gun:
                     /     ⧵
                    /       ⧵
                 band       bank
                /   ⧵         |
               /     ⧵        |
            bandi :Beatles:  :BankOfEngland:
               |
            bandit
               |
           :Outlaw:


    r>   r   )r   r	   rA   r@   	enumerate)emjrt   lastidxrD   rr   s        r   rj   rj   >  s    `  ++ 	EC#H#hlG$S> E4x'%'HTN#D><'4'?'?'DHV$E	E r   N)r4   typingr   r   r   r   r   r   r   r	   __all__r%   r   r6   ra   r
   r   r   r   r8   r   r   rj   r9   r   r   <module>r      s    @ ?  !d38n !:S :Sz!TJ !TH- 2"J "XS XD XXe_ XvBe_B*.B<@Be_BJ:c3h :r   