o
    FhjM                     @   s  U d dl Z d dlmZmZmZmZmZmZmZ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dedefd	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+d, d,eZ,G d-d. d.eZ-G d/d0 d0e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Z0ee	e ee f e1d1< d2ed3edefd4d5Z2		d^d6e3d7ee d8e	e d9e	e deeddf f
d:d;Z4d<d=d>d?ed@edAedefdBdCZ5d<dDd?edAedefdEdFZ6dGdHd?edIedefdJdKZ7dLdMdNd?edOedPedefdQdRZ8dSedTedefdUdVZ9dGdHdSedTedIedefdWdXZ:dLdMdNdSedTedOedPedef
dYdZZ;d[ededefd\d]Z<dS )_    N)
AnyClassVarDict	GeneratorIterableIteratorListOptionalTupleType)Self)MessageEntityType)MessageEntityUser)add_surrogateshtml_decorationmarkdown_decorationremove_surrogatesvaluereturnc                 C   s   t | dd S )Nz	utf-16-le   )lenencode)r    r   K/var/www/html/venv/lib/python3.10/site-packages/aiogram/utils/formatting.pysizeof   s   r   c                   @   s  e Zd ZU dZdZeee  ed< dZ	de
deddfdd	Zed
edee dd fddZdddddedededeeee f fddZdededefddZd
dddddededededeeef f
d d!Zdd"dedeeef fd#d$Zdd"dedeeef fd%d&Zdd"dedeeef fd'd(Zdd"dedeeef fd)d*Zdefd+d,Zdefd-d.Zd/ed0ed1edefd2d3ZdBd5edefd6d7Z d8e
dd fd9d:Z!de"e
 fd;d<Z#defd=d>Z$d?e%dd fd@dAZ&dS )CTextz
    Simple text element
    Ntype_body_paramsbodyparamsr   c                 O   s   || _ || _d S Nr   selfr!   r"   r   r   r   __init__*   s   
zText.__init__textentitiesc                 C   s.   | t t||rt|dd dd S g d S )Nc                 S      | j S r#   offset)itemr   r   r   <lambda>7       z$Text.from_entities.<locals>.<lambda>key)r'   r(   )_unparse_entitiesr   sorted)clsr'   r(   r   r   r   from_entities2   s   zText.from_entitiesr   T_offset_sort_collect_entitiesr6   r7   r8   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:
         Fr5   r+   lengthc                 S   r)   r#   r*   )entityr   r   r   r-   `   r.   zText.render.<locals>.<lambda>r/   )r   
isinstancer   strr   renderextendr   append_render_entitysort)
r%   r6   r7   r8   r'   r(   r+   node	node_textnode_entitiesr   r   r   r?   ;   s.   




zText.renderr+   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   rB   d   s   zText._render_entity
parse_mode)text_keyentities_keyreplace_parse_modeparse_mode_keyrH   rI   rJ   rK   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)r?   )r%   rH   rI   rJ   rK   
text_valueentities_valueresultr   r   r   	as_kwargsh   s   zText.as_kwargs)rJ   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)rH   rI   rJ   rO   r%   rJ   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rH   rI   rK   rJ   rR   rS   r   r   r   as_poll_question_kwargs      zText.as_poll_question_kwargsc                C   rU   )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_moderY   rR   rS   r   r   r   as_poll_explanation_kwargs   s   zText.as_poll_explanation_kwargsc                C   rU   )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_moderY   rR   rS   r   r   r   as_gift_text_kwargs   r[   zText.as_gift_text_kwargsc                 C      |   \}}t||S )z5
        Render elements tree as HTML markup
        )r?   r   unparser%   r'   r(   r   r   r   as_html      zText.as_htmlc                 C   rc   )z;
        Render elements tree as MarkdownV2 markup
        )r?   r   rd   re   r   r   r   as_markdown   rg   zText.as_markdownr%   argskwargsc                 O   s   t | |i i | j|S r#   )r   r    )r%   ri   rj   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 )rl   N)r=   r   as_pretty_stringrepr.0r,   rm   r   r   	<genexpr>   s
    
z(Text.as_pretty_string.<locals>.<genexpr>c                 s   s*    | ]\}}|d ur| d|V  qd S )N=r   )rq   kvr   r   r   rr      s   ( 
z    ())	joinr   r    itemsrA   textwraprl   r   __name__)r%   rl   sepr!   r"   ri   args_strr   rm   r   rn      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__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)r8   )r?   r   )r%   r'   _r   r   r   __len__	  s   zText.__len__r,   c                 C   s   t |ts	td|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 r1t| n|j}||kr<|  S g }d}| jD ]5}t|}|}||7 }||k rTqC||krZ ntd|| f}	t	||| f}
||	|
 }|ssqC|
| qC| j| S )NzCan only be slicedr   )r=   slice	TypeErrorstartstoprk   r   r   maxminrA   )r%   r,   r   r   nodespositionrD   	node_sizecurrent_positionabnew_noder   r   r   __getitem__  s2   


zText.__getitem__)F)'r|   
__module____qualname____doc__r   r   r	   r>   __annotations__	__slots__NodeTyper   r&   classmethodr   r   r4   intboolr
   r?   rB   r   rO   rT   rZ   r_   rb   rf   rh   r   rk   rn   r   r   r   r   r   r   r   r   r   r   r   !   sj   
 

)

    r   c                       4   e Zd ZdZejZdededdf 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   Nc                    \   t |dkr
tdt|d tstd|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$   	__class__r   r   r&   :     zHashTag.__init__)r|   r   r   r   r   HASHTAGr   r   r   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   Nc                    r   )Nr   z$Cashtag can contain only one elementr   zCashtag can contain only string$r   r$   r   r   r   r&   R  r   zCashTag.__init__)r|   r   r   r   r   CASHTAGr   r   r   r&   r   r   r   r   r   r   D  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   \  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   k      
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   v  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                	       sB   e Zd ZdZejZdddedee	 de
ddf 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"   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   PREr   r   r	   r>   r   r&   r   r   r   r   r   r     s    0r   c                       8   e Zd ZdZejZdedede	ddf 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!   urlr"   r   Nc                   r   )Nr   r   )r%   r   r!   r"   r   r   r   r&     r   zTextLink.__init__)r|   r   r   r   r   	TEXT_LINKr   r   r>   r   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!   userr"   r   Nc                   r   )Nr   r   )r%   r   r!   r"   r   r   r   r&     r   zTextMention.__init__)r|   r   r   r   r   TEXT_MENTIONr   r   r   r   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!   custom_emoji_idr"   r   Nc                   r   )Nr   r   )r%   r   r!   r"   r   r   r   r&     r   zCustomEmoji.__init__)r|   r   r   r   r   CUSTOM_EMOJIr   r   r>   r   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   
NODE_TYPESr<   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_entity3  s   r   r'   r(   r+   r;   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-   S  s    z#_unparse_entities.<locals>.<lambda>r   r:   )	r   	enumerater+   r   r;   listfilterr   r1   )r'   r(   r+   r;   indexr<   r   sub_entitiesr   r*   r   r1   A  s(   
"r1   rv   r9   )endr}   rz   r   r}   c                 G   s\   |r$g }|dd D ]	}| ||g q
||d  ||  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r@   rA   r   )r   r}   rz   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   r   )r}   rz   r   r,   r   r   r   as_listq  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   rp   r   r   r   rr     s    z!as_marked_list.<locals>.<genexpr>)r   )r   rz   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)rq   r   r,   r   r   r   rr     s   " z#as_numbered_list.<locals>.<genexpr>)r   r   )r   r   rz   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
    rv   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   r0   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   )r0   r   r   r   r   as_key_value  r   r   )NN)=r{   typingr   r   r   r   r   r   r   r	   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   r   r   bytesr1   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   
 0  	

""

