o
    LDiM                     @  s  U 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
 d dlmZ d dlmZ d dlmZmZ d dlmZmZmZmZ e	ZdiddZG dd dee ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZ G dd  d eZ!G d!d" d"eZ"G d#d$ d$eZ#G d%d& d&eZ$G d'd( d(eZ%G d)d* d*eZ&G d+d, d,eZ'G d-d. d.eZ(G d/d0 d0eZ)G d1d2 d2eZ*G d3d4 d4eZ+i ej,eej,eej,eej,eej,eej,eej,ee j,e e!j,e!e"j,e"e#j,e#e$j,e$e%j,e%e&j,e&e'j,e'e(j,e(e)j,e)e*j,e*e+j,e+iZ-d5e.d6< djd;d<Z/		dkdldEdFZ0dGdHdIdmdMdNZ1dGdOdndPdQZ2dRdSdodUdVZ3dWdXdYdpd\d]Z4dqd`daZ5dRdSdrdbdcZ6dWdXdYdsdddeZ7dtdgdhZ8dS )u    )annotationsN)	GeneratorIterableIterator)TYPE_CHECKINGAnyClassVar)Self)MessageEntityType)MessageEntityUser)add_surrogateshtml_decorationmarkdown_decorationremove_surrogatesvaluestrreturnintc                 C  s   t | dd S )Nz	utf-16-le   )lenencode)r    r   d/var/www/www-root/data/www/77.83.87.30/venv/lib/python3.10/site-packages/aiogram/utils/formatting.pysizeof   s   r   c                   @  s   e Zd ZU dZdZded< dZdPddZedQddZ	dddddRddZ
dSd"d#Zdddd$d%dTd+d,Zdd-dUd.d/Zdd-dUd0d1Zdd-dUd2d3Zdd-dUd4d5ZdVd6d7ZdVd8d9ZdWd>d?ZdXdYdBdCZdZdEdFZd[dHdIZd\dJdKZd]dNdOZdS )^Textz
    Simple text element
    NzClassVar[str | None]type_body_paramsbodyNodeTypeparamsr   r   Nonec                 O  s   || _ || _d S Nr   )selfr    r"   r   r   r   __init__"   s   
zText.__init__textr   entitieslist[MessageEntity]c                 C  s.   | t t||rt|dd dd S g d S )Nc                 S     | j S r$   offset)itemr   r   r   <lambda>/       z$Text.from_entities.<locals>.<lambda>key)r'   r(   )_unparse_entitiesr   sorted)clsr'   r(   r   r   r   from_entities*   s   zText.from_entitiesr   T_offset_sort_collect_entitiesr7   r   r8   boolr9   tuple[str, list[MessageEntity]]c          
      C  s   d}g }|}| j D ]1}t|tst|}||7 }|t|7 }q	|j|d|d\}}	||7 }|t|7 }|r:||	 q	|rL| jrL|| j	||| d |rX|rX|j
dd d ||fS )zS
        Render elements tree as text with entities list

        :return:
         Fr6   r,   lengthc                 S  r*   r$   r+   )entityr   r   r   r.   X   r/   zText.render.<locals>.<lambda>r0   )r   
isinstancer   r   r   renderextendr   append_render_entitysort)
r%   r7   r8   r9   r'   r(   r,   node	node_textnode_entitiesr   r   r   rA   3   s.   




zText.renderr,   r>   r   c                C  s,   | j d us	J dtd| j ||d| jS )Nz-Node without type can't be rendered as entity)r   r,   r>   r   )r   r   r   )r%   r,   r>   r   r   r   rD   \   s   zText._render_entity
parse_mode)text_keyentities_keyreplace_parse_modeparse_mode_keyrJ   rK   rL   rM   dict[str, Any]c                C  s(   |   \}}||||i}|rd||< |S )af  
        Render element tree as keyword arguments for usage in an API call, for example:

        .. code-block:: python

            entities = Text(...)
            await message.answer(**entities.as_kwargs())

        :param text_key:
        :param entities_key:
        :param replace_parse_mode:
        :param parse_mode_key:
        :return:
        N)rA   )r%   rJ   rK   rL   rM   
text_valueentities_valueresultr   r   r   	as_kwargs`   s   zText.as_kwargs)rL   c                C  s   | j dd|dS )af  
        Shortcut for :meth:`as_kwargs` for usage with API calls that take
        ``caption`` as a parameter.

        .. code-block:: python

            entities = Text(...)
            await message.answer_photo(**entities.as_caption_kwargs(), photo=phot)

        :param replace_parse_mode: Will be passed to :meth:`as_kwargs`.
        :return:
        captioncaption_entities)rJ   rK   rL   rR   r%   rL   r   r   r   as_caption_kwargs   s
   zText.as_caption_kwargsc                C     | j ddd|dS )at  
        Shortcut for :meth:`as_kwargs` for usage with
        method :class:`aiogram.methods.send_poll.SendPoll`.

        .. code-block:: python

            entities = Text(...)
            await message.answer_poll(**entities.as_poll_question_kwargs(), options=options)

        :param replace_parse_mode: Will be passed to :meth:`as_kwargs`.
        :return:
        questionquestion_entitiesquestion_parse_moderJ   rK   rM   rL   rU   rV   r   r   r   as_poll_question_kwargs      zText.as_poll_question_kwargsc                C  rX   )a'  
        Shortcut for :meth:`as_kwargs` for usage with
        method :class:`aiogram.methods.send_poll.SendPoll`.

        .. code-block:: python

            question_entities = Text(...)
            explanation_entities = Text(...)
            await message.answer_poll(
                **question_entities.as_poll_question_kwargs(),
                options=options,
                **explanation_entities.as_poll_explanation_kwargs(),
            )

        :param replace_parse_mode: Will be passed to :meth:`as_kwargs`.
        :return:
        explanationexplanation_entitiesexplanation_parse_moder\   rU   rV   r   r   r   as_poll_explanation_kwargs   s   zText.as_poll_explanation_kwargsc                C  rX   )a{  
        Shortcut for :meth:`as_kwargs` for usage with
        method :class:`aiogram.methods.send_gift.SendGift`.

        .. code-block:: python

            entities = Text(...)
            await bot.send_gift(gift_id=gift_id, user_id=user_id, **entities.as_gift_text_kwargs())

        :param replace_parse_mode: Will be passed to :meth:`as_kwargs`.
        :return:
        r'   text_entitiestext_parse_moder\   rU   rV   r   r   r   as_gift_text_kwargs   r^   zText.as_gift_text_kwargsc                 C     |   \}}t||S )z5
        Render elements tree as HTML markup
        )rA   r   unparser%   r'   r(   r   r   r   as_html      zText.as_htmlc                 C  rf   )z;
        Render elements tree as MarkdownV2 markup
        )rA   r   rg   rh   r   r   r   as_markdown   rj   zText.as_markdownr%   r	   argskwargsc                 O  s   t | |i i | j|S r$   )r   r   )r%   rl   rm   r   r   r   replace   s   zText.replaceFindentc                   s    rdnd}|  fdd| jD }| dd | j D }g }|r)|| |r0|| | |} rAtd| d d}t| j d| d	S )
Nz,
z, c                 3  s.    | ]}t |tr|j d nt|V  qdS )ro   N)r@   r   as_pretty_stringrepr.0r-   rp   r   r   	<genexpr>   s
    
z(Text.as_pretty_string.<locals>.<genexpr>c                 s  s*    | ]\}}|d ur| d|V  qd S )N=r   )rt   kvr   r   r   ru      s   ( 
z    ())	joinr   r   itemsrC   textwrapro   r   __name__)r%   ro   sepr    r"   rl   args_strr   rp   r   rq      s   


zText.as_pretty_stringotherc                 C  s~   t |tr |j| jkr | j|jkr t| g | |R i | jS t| tu r:t |tr:t| g | |R i | jS t| |S r$   )r@   r   r   r   r   )r%   r   r   r   r   __add__   s
   "
zText.__add__Iterator[NodeType]c                 c  s    | j E d H  d S r$   )r   )r%   r   r   r   __iter__   s   zText.__iter__c                 C  s   | j dd\}}t|S )NF)r9   )rA   r   )r%   r'   _r   r   r   __len__  s   zText.__len__r-   slicec                 C  s   t |tsd}t||jd u s|jdkr |jd u r | j| j S |jd u r'dn|j}|jd u r3t| n|j}||kr>|  S g }d}| jD ]5}t|}|}	||7 }||k rVqE|	|kr\ ntd||	 f}
t	|||	 f}||
| }|suqE|
| qE| j| S )NzCan only be slicedr   )r@   r   	TypeErrorstartstoprn   r   r   maxminrC   )r%   r-   msgr   r   nodespositionrF   	node_sizecurrent_positionabnew_noder   r   r   __getitem__  s4   


zText.__getitem__r    r!   r"   r   r   r#   )r'   r   r(   r)   r   r   )r7   r   r8   r:   r9   r:   r   r;   )r,   r   r>   r   r   r   )
rJ   r   rK   r   rL   r:   rM   r   r   rN   )rL   r:   r   rN   )r   r   )r%   r	   rl   r   rm   r   r   r	   )F)ro   r:   r   r   )r   r!   r   r   )r   r   )r   r   )r-   r   r   r   )r   
__module____qualname____doc__r   __annotations__	__slots__r&   classmethodr5   rA   rD   rR   rW   r]   rb   re   ri   rk   rn   rq   r   r   r   r   r   r   r   r   r      s:   
 

)





r   c                      (   e Zd ZdZejZd
 fdd	Z  ZS )HashTaga   
    Hashtag element.

    .. warning::

        The value should always start with '#' symbol

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.HASHTAG`
    r    r!   r"   r   r   r#   c                   d   t |dkrd}t|t|d tsd}t||d ds'd|d  f}t j|i | d S )N   z$Hashtag can contain only one elementr   zHashtag can contain only string#r   
ValueErrorr@   r   
startswithsuperr&   r%   r    r"   r   	__class__r   r   r&   3     zHashTag.__init__r   )	r   r   r   r   r
   HASHTAGr   r&   __classcell__r   r   r   r   r   %      r   c                      r   )CashTaga   
    Cashtag element.

    .. warning::

        The value should always start with '$' symbol

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CASHTAG`
    r    r!   r"   r   r   r#   c                   r   )Nr   z$Cashtag can contain only one elementr   zCashtag can contain only string$r   r   r   r   r   r&   M  r   zCashTag.__init__r   )	r   r   r   r   r
   CASHTAGr   r&   r   r   r   r   r   r   ?  r   r   c                   @     e Zd ZdZejZdS )
BotCommanda  
    Bot command element.

    .. warning::

        The value should always start with '/' symbol

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BOT_COMMAND`
    N)r   r   r   r   r
   BOT_COMMANDr   r   r   r   r   r   Y  s    
r   c                   @  r   )Urlz
    Url element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.URL`
    N)r   r   r   r   r
   URLr   r   r   r   r   r   h      
r   c                   @  r   )Emailz
    Email element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.EMAIL`
    N)r   r   r   r   r
   EMAILr   r   r   r   r   r   s  r   r   c                   @  r   )PhoneNumberz
    Phone number element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.PHONE_NUMBER`
    N)r   r   r   r   r
   PHONE_NUMBERr   r   r   r   r   r   ~  r   r   c                   @  r   )Boldz
    Bold element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BOLD`
    N)r   r   r   r   r
   BOLDr   r   r   r   r   r     r   r   c                   @  r   )Italicz
    Italic element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.ITALIC`
    N)r   r   r   r   r
   ITALICr   r   r   r   r   r     r   r   c                   @  r   )	Underlinez
    Underline element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.UNDERLINE`
    N)r   r   r   r   r
   	UNDERLINEr   r   r   r   r   r     r   r   c                   @  r   )Strikethroughz
    Strikethrough element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.STRIKETHROUGH`
    N)r   r   r   r   r
   STRIKETHROUGHr   r   r   r   r   r     r   r   c                   @  r   )Spoilerz
    Spoiler element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.SPOILER`
    N)r   r   r   r   r
   SPOILERr   r   r   r   r   r     r   r   c                   @  r   )Codez
    Code element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CODE`
    N)r   r   r   r   r
   CODEr   r   r   r   r   r     r   r   c                      s.   e Zd ZdZejZddd fddZ  ZS )Prez
    Pre element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.PRE`
    N)languager    r!   r   
str | Noner"   r   r   r#   c                     t  j|d|i| d S )Nr   r   r&   )r%   r   r    r"   r   r   r   r&        zPre.__init__)r    r!   r   r   r"   r   r   r#   )	r   r   r   r   r
   PREr   r&   r   r   r   r   r   r     s    r   c                      (   e Zd ZdZejZd fd
dZ  ZS )TextLinkz
    Text link element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.TEXT_LINK`
    r    r!   urlr   r"   r   r   r#   c                  r   )Nr   r   )r%   r   r    r"   r   r   r   r&     r   zTextLink.__init__)r    r!   r   r   r"   r   r   r#   )	r   r   r   r   r
   	TEXT_LINKr   r&   r   r   r   r   r   r         r   c                      r   )TextMentionz
    Text mention element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.TEXT_MENTION`
    r    r!   userr   r"   r   r   r#   c                  r   )Nr   r   )r%   r   r    r"   r   r   r   r&     r   zTextMention.__init__)r    r!   r   r   r"   r   r   r#   )	r   r   r   r   r
   TEXT_MENTIONr   r&   r   r   r   r   r   r     r   r   c                      r   )CustomEmojiz
    Custom emoji element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CUSTOM_EMOJI`
    r    r!   custom_emoji_idr   r"   r   r   r#   c                  r   )Nr   r   )r%   r   r    r"   r   r   r   r&     r   zCustomEmoji.__init__)r    r!   r   r   r"   r   r   r#   )	r   r   r   r   r
   CUSTOM_EMOJIr   r&   r   r   r   r   r   r     r   r   c                   @  r   )
BlockQuotez
    Block quote element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BLOCKQUOTE`
    N)r   r   r   r   r
   
BLOCKQUOTEr   r   r   r   r   r     r   r   c                   @  r   )ExpandableBlockQuotez
    Expandable block quote element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.EXPANDABLE_BLOCKQUOTE`
    N)r   r   r   r   r
   EXPANDABLE_BLOCKQUOTEr   r   r   r   r   r     r   r   zdict[str | None, type[Text]]
NODE_TYPESr?   r   r   r!   c                 G  s*   t | jt}||i | jh dddS )zW
    Apply single entity to text

    :param entity:
    :param text:
    :return:
    >   r   r>   r,   F)excludewarnings)r   getr   r   
model_dump)r?   r   	node_typer   r   r   _apply_entity0  s   r   r'   bytesr(   r)   r,   
int | Noner>   Generator[NodeType, None, None]c              	   #  s     d u rd |pt | }t|D ]N\}}|jd  k rq|jd  kr0t|  |jd  V  |jd }|jd |jd   tt fdd||d d  }t|gt| || dR  V  q |k rot|  | V  d S d S )Nr   r   c                   s   | j d  pdk S )Nr   r   r+   )er+   r   r   r.   Q  s    z#_unparse_entities.<locals>.<lambda>r   r=   )	r   	enumerater,   r   r>   listfilterr   r2   )r'   r(   r,   r>   indexr?   r   sub_entitiesr   r+   r   r2   ?  s(   
"r2   ry   r<   )endr   r}   r   r   c                 G  sV   |r!g }|dd D ]	}| ||g q
| |d | g t| S g || }t| S )z
    Wrap multiple nodes into line with :code:`\\n` at the end of line.

    :param items: Text or Any
    :param end: ending of the line, by default is :code:`\\n`
    :param sep: separator between items, by default is empty string
    :return: Text
    N)rB   r   )r   r   r}   r   r-   r   r   r   as_line[  s   	r   )r   c                 G  s:   g }|dd D ]	}| || g q||d  t| S )z^
    Wrap each element to separated lines

    :param items:
    :param sep:
    :return:
    Nr   )rB   rC   r   )r   r}   r   r-   r   r   r   as_listn  s
   r   z- markerr   c                   s   t  fdd|D  S )z~
    Wrap elements as marked list

    :param items:
    :param marker: line marker, by default is '- '
    :return: Text
    c                 3  s    | ]}t  |V  qd S r$   r   rs   r   r   r   ru     s    z!as_marked_list.<locals>.<genexpr>)r   )r   r}   r   r   r   as_marked_list}  s   r   r   z{}. r   fmtr   r   c                   s   t  fddt|| D  S )z
    Wrap elements as numbered list

    :param items:
    :param start: initial number, by default 1
    :param fmt: number format, by default '{}. '
    :return: Text
    c                 3  s$    | ]\}}t  ||V  qd S r$   )r   format)rt   r   r-   r   r   r   ru     s   " z#as_numbered_list.<locals>.<genexpr>)r   r   )r   r   r}   r   r   r   as_numbered_list  s   	r   titler    c                 G  s   t | dg|R  S )z{
    Wrap elements as simple section, section has title and body

    :param title:
    :param body:
    :return: Text
    ry   r   )r   r    r   r   r   
as_section     r   c                G  s   t | t|d|iS )zw
    Wrap elements as section with marked list

    :param title:
    :param body:
    :param marker:
    :return:
    r   )r   r   )r   r   r    r   r   r   as_marked_section  s   r   c                G  s   t | t|||dS )z
    Wrap elements as section with numbered list

    :param title:
    :param body:
    :param start:
    :param fmt:
    :return:
    r   )r   r   )r   r   r   r    r   r   r   as_numbered_section  s   r   r1   c                 C  s   t t| dd|S )z
    Wrap elements pair as key-value line. (:code:`<b>{key}:</b> {value}`)

    :param key:
    :param value:
    :return: Text
    : )r   r   )r1   r   r   r   r   as_key_value  r   r  )r   r   r   r   )r?   r   r   r!   r   r!   )NN)
r'   r   r(   r)   r,   r   r>   r   r   r   )r}   r!   r   r   r   r   r   r   )r}   r!   r   r   r   r   )r}   r!   r   r   r   r   )r}   r!   r   r   r   r   r   r   )r   r!   r    r!   r   r   )r   r!   r    r!   r   r   r   r   )
r   r!   r    r!   r   r   r   r   r   r   )r1   r!   r   r!   r   r   )9
__future__r   r~   collections.abcr   r   r   typingr   r   r   typing_extensionsr	   aiogram.enumsr
   aiogram.typesr   r   aiogram.utils.text_decorationsr   r   r   r   r!   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r   r   r   r   r   r   r   r  r   r   r   r   <module>   s    
  	


