a
    y{Jh@                  $   @   sB  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eed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-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/ee	e ee f e0d.< eeed/d0d1Z1dVe2ee e	e e	e eeddf d2d3d4Z3d5d6d7eeeed8d9d:Z4d5d;eeed<d=d>Z5d?d@eeedAdBdCZ6dDdEdFeeeedGdHdIZ7eeedJdKdLZ8d?d@eeeedMdNdOZ9dDdEdFeeeeedPdQdRZ:eeedSdTdUZ;dS )W    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   J/var/www/shaz/venv/lib/python3.9/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	e
eddddZeeee d dd	d
Zddddeeeeeee f dddZeeedddZdddddeeeeeeef dddZedddZedddZeeeed d!d"Zd1eed$d%d&Ze
d d'd(d)Zee
 dd*d+Zedd,d-Z e!d d.d/d0Z"dS )2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entitiesr   c                 C   s(   | t t||rt|dd dng d S )Nc                 S   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_entities)r6   r7   r8   r   c          
      C   s   d}g }|}| j D ]b}t|ts>t|}||7 }|t|7 }q|j|d|d\}}	||7 }|t|7 }|r||	 q|r| jr|| j	||| d |r|r|j
dd d ||fS )zS
        Render elements tree as text with entities list

        :return:
         Fr5   r+   lengthc                 S   s   | j S 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+   nodeZ	node_textZnode_entitiesr   r   r   r?   ;   s,    



zText.render)r+   r;   r   c                C   s,   | j d usJ dtf | 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   rB   d   s    zText._render_entityr(   r)   Z
parse_mode)text_keyentities_keyreplace_parse_modeparse_mode_key)rE   rF   rG   rH   r   c                C   s(   |   \}}||||i}|r$d||< |S )ah  
        Render elements tree as keyword arguments for usage in the 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&   rE   rF   rG   rH   Z
text_valueZentities_valueresultr   r   r   	as_kwargsh   s    zText.as_kwargs)r   c                 C   s   |   \}}t||S )z5
        Render elements tree as HTML markup
        )r?   r   unparser&   r(   r)   r   r   r   as_html   s    zText.as_htmlc                 C   s   |   \}}t||S )z;
        Render elements tree as MarkdownV2 markup
        )r?   r   rK   rL   r   r   r   as_markdown   s    zText.as_markdown)r&   argskwargsr   c                 O   s   t | |i i | j|S r$   )r   r    )r&   rO   rP   r   r   r   replace   s    zText.replaceF)indentr   c                    s    rdnd}|  fdd| jD }| dd | j D }g }|rR|| |r`|| | |} rtd| d d}t| j d| d	S )
Nz,
z, c                 3   s,   | ]$}t |tr|j d nt|V  qdS )rR   N)r=   r   as_pretty_stringrepr.0r,   rS   r   r   	<genexpr>   s   z(Text.as_pretty_string.<locals>.<genexpr>c                 s   s(   | ] \}}|d ur| d|V  qd S )N=r   )rW   kvr   r   r   rX      r.   
z    ())	joinr   r    itemsrA   textwraprR   r   __name__)r&   rR   sepr"   r#   rO   args_strr   rS   r   rT      s    


zText.as_pretty_string)otherr   c                 C   s~   t |tr@|j| jkr@| j|jkr@t| g | |R i | jS t| tkrtt |trtt| g | |R i | jS t| |S r$   )r=   r   r   r    r>   )r&   re   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,   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 rJdn|j}|jd u rbt| n|j}||krx|  S g }d}| jD ]j}t|}|}||7 }||k rq||kr qtd|| f}	t	||| f}
||	|
 }|sq|
| q| j| S )NzCan only be slicedr   )r=   slice	TypeErrorstartstoprQ   r   r   maxminrA   )r&   r,   rl   rm   nodespositionrD   Z	node_sizecurrent_positionabnew_noder   r   r   __getitem__   s2    

zText.__getitem__)F)#rb   
__module____qualname____doc__r   r   r	   r>   __annotations__	__slots__NodeTyper   r'   classmethodr   r   r4   intboolr
   r?   rB   r   rJ   rM   rN   r   rQ   rT   rf   r   rg   ri   rj   rv   r   r   r   r   r   !   sL   
)
r   c                       s0   e Zd ZdZejZeed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`
    Nr!   c                    s\   t |dkrtdt|d ts*td|d dsFd|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'      s    zHashTag.__init__)rb   rw   rx   ry   r   ZHASHTAGr   r|   r   r'   __classcell__r   r   r   r   r      s   r   c                       s0   e Zd ZdZejZeedd fddZ	  Z
S )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`
    Nr!   c                    s\   t |dkrtdt|d ts*td|d dsFd|d  f}t j|i | d S )Nr   z$Cashtag can contain only one elementr   zCashtag can contain only string$r   r%   r   r   r   r'      s    zCashTag.__init__)rb   rw   rx   ry   r   ZCASHTAGr   r|   r   r'   r   r   r   r   r   r      s   r   c                   @   s   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)rb   rw   rx   ry   r   ZBOT_COMMANDr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZejZdS )Urlz
    Url element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.URL`
    N)rb   rw   rx   ry   r   URLr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZejZdS )Emailz
    Email element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.EMAIL`
    N)rb   rw   rx   ry   r   ZEMAILr   r   r   r   r   r   "  s   r   c                   @   s   e Zd ZdZejZdS )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)rb   rw   rx   ry   r   ZPHONE_NUMBERr   r   r   r   r   r   -  s   r   c                   @   s   e Zd ZdZejZdS )Boldz
    Bold element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BOLD`
    N)rb   rw   rx   ry   r   ZBOLDr   r   r   r   r   r   8  s   r   c                   @   s   e Zd ZdZejZdS )Italicz
    Italic element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.ITALIC`
    N)rb   rw   rx   ry   r   ZITALICr   r   r   r   r   r   C  s   r   c                   @   s   e Zd ZdZejZdS )	Underlinez
    Underline element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.UNDERLINE`
    N)rb   rw   rx   ry   r   Z	UNDERLINEr   r   r   r   r   r   N  s   r   c                   @   s   e Zd ZdZejZdS )Strikethroughz
    Strikethrough element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.STRIKETHROUGH`
    N)rb   rw   rx   ry   r   ZSTRIKETHROUGHr   r   r   r   r   r   Y  s   r   c                   @   s   e Zd ZdZejZdS )Spoilerz
    Spoiler element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.SPOILER`
    N)rb   rw   rx   ry   r   ZSPOILERr   r   r   r   r   r   d  s   r   c                   @   s   e Zd ZdZejZdS )Codez
    Code element.

    Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity`
    with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CODE`
    N)rb   rw   rx   ry   r   ZCODEr   r   r   r   r   r   o  s   r   c                       s<   e Zd ZdZejZddeee	 e
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)language)r"   r   r#   r   c                   s   t  j|d|i| d S )Nr   r   r'   )r&   r   r"   r#   r   r   r   r'     s    zPre.__init__)rb   rw   rx   ry   r   ZPREr   r|   r	   r>   r   r'   r   r   r   r   r   r   z  s   r   c                       s2   e Zd ZdZejZeee	d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`
    N)r"   urlr#   r   c                   s   t  j|d|i| d S )Nr   r   )r&   r   r"   r#   r   r   r   r'     s    zTextLink.__init__)rb   rw   rx   ry   r   Z	TEXT_LINKr   r|   r>   r   r'   r   r   r   r   r   r     s   r   c                       s2   e Zd ZdZejZeee	dd fddZ
  ZS )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`
    N)r"   userr#   r   c                   s   t  j|d|i| d S )Nr   r   )r&   r   r"   r#   r   r   r   r'     s    zTextMention.__init__)rb   rw   rx   ry   r   ZTEXT_MENTIONr   r|   r   r   r'   r   r   r   r   r   r     s   r   c                       s2   e Zd ZdZejZeee	dd fddZ
  ZS )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`
    N)r"   custom_emoji_idr#   r   c                   s   t  j|d|i| d S )Nr   r   )r&   r   r"   r#   r   r   r   r'     s    zCustomEmoji.__init__)rb   rw   rx   ry   r   ZCUSTOM_EMOJIr   r|   r>   r   r'   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZejZdS )
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)rb   rw   rx   ry   r   Z
BLOCKQUOTEr   r   r   r   r   r     s   r   
NODE_TYPES)r<   rp   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   Z
model_dump)r<   rp   Z	node_typer   r   r   _apply_entity  s    r   )r(   r)   r+   r;   r   c              	   #   s    d u rd |pt | }t|D ]\}}|jd  k r8q |jd  kr^t|  |jd  V  |jd }|jd |jd   tt fdd||d d  }t|gt| || dR  V  q  |k rt|  | V  d S )Nr   r   c                    s   | j d  pdk S )Nr   r   r*   )er*   r   r   r-     r.   z#_unparse_entities.<locals>.<lambda>r   r:   )	r   	enumerater+   r   r;   listfilterr   r1   )r(   r)   r+   r;   indexr<   rl   Zsub_entitiesr   r*   r   r1     s$    
"r1   r\   r9   )endrc   )r`   r   rc   r   c                 G   sV   |rBg }|dd D ]}| ||g q||d  ||  n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   rc   r`   rp   r,   r   r   r   as_line  s    	r   )rc   )r`   rc   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   )rc   r`   rp   r,   r   r   r   as_list  s
    r   z- marker)r`   r   r   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   rV   r   r   r   rX   (  r.   z!as_marked_list.<locals>.<genexpr>)r   )r   r`   r   r   r   as_marked_list   s    r   r   z{}. rl   fmt)r`   rl   r   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)rW   r   r,   r   r   r   rX   4  r.   z#as_numbered_list.<locals>.<genexpr>)r   r   )rl   r   r`   r   r   r   as_numbered_list+  s    	r   )titler"   r   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
    r\   r   )r   r"   r   r   r   
as_section7  s    r   )r   r"   r   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_sectionB  s    r   )r   r"   rl   r   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   rl   r   r"   r   r   r   as_numbered_sectionR  s    r   )r0   r   r   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_valued  s    r   )NN)<ra   typingr   r   r   r   r   r   r   r	   r
   r   typing_extensionsr   Zaiogram.enumsr   Zaiogram.typesr   r   Z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   rz   r   bytesr1   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   
0 8  