o
    Xzjp  ã                   @   s8  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lmZmZmZm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 G d
d„ deƒZ de!de	e!e
e f fdd„Z"ededededededd„ edd„ edd„ edd„ edd„ edd„ edd„ iZ#de!dee de!fdd „Z$d!S )"z(
Simple HTML -> Telegram entity parser.
é    )Údeque)Úescape)Ú
HTMLParser)ÚIterableÚTupleÚListé   )Úadd_surrogateÚdel_surrogateÚwithin_surrogateÚ
strip_text)ÚTLObject)ÚMessageEntityBoldÚMessageEntityItalicÚMessageEntityCodeÚMessageEntityPreÚMessageEntityEmailÚMessageEntityUrlÚMessageEntityTextUrlÚMessageEntityMentionNameÚMessageEntityUnderlineÚMessageEntityStrikeÚMessageEntityBlockquoteÚMessageEntityCustomEmojiÚTypeMessageEntityc                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚHTMLToTelegramParserc                    s0   t ƒ  ¡  d| _g | _i | _tƒ | _tƒ | _d S )NÚ )ÚsuperÚ__init__ÚtextÚentitiesÚ_building_entitiesr   Ú
_open_tagsÚ_open_tags_meta)Úself©Ú	__class__© úS/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telethon/extensions/html.pyr      s   
zHTMLToTelegramParser.__init__c              	   C   s  | j  |¡ | j d ¡ t|ƒ}d }i }|dks|dkrt}nÈ|dks'|dkr*t}n½|dkr1t}n¶|dks9|dkr<t}n«|dkrKt}d	|v rJd
|d< nœ|dkryz| j	d }z|d t
dƒd … |_W n	 tyk   Y nw W ny tyx   t}Y now |dkr„t}d|d< nc|dkrÈz|d }W n
 ty˜   Y d S w | d¡r©|t
dƒd … }t}n|  ¡ |kr²t}n
t}t|ƒ|d< d }| j ¡  | j |¡ n|dkrçzt|d ƒ}W n ttfyà   Y d S w t}||d< |�r|| j	v�r|dt
| jƒddœ|¤Ž| j	|< d S d S d S )NÚstrongÚbÚemÚiÚuÚdelÚsÚ
blockquoteÚ
expandableTÚ	collapsedÚcodeÚpreÚclassz	language-r   ÚlanguageÚaÚhrefzmailto:Úurlztg-emojizemoji-idÚdocument_idr   )ÚoffsetÚlengthr'   )r"   Ú
appendleftr#   Údictr   r   r   r   r   r!   Úlenr6   ÚKeyErrorr   r   Ú
startswithr   Úget_starttag_textr   r   r
   ÚpopleftÚintÚ
ValueErrorr   r   )r$   ÚtagÚattrsÚ
EntityTypeÚargsr4   r9   Úemoji_idr'   r'   r(   Úhandle_starttag   s‚   €
ÿ€ÿ
ÿ

ÿýüÿz$HTMLToTelegramParser.handle_starttagc                 C   sn   t | jƒdkr| jd nd}|dkr| jd }|r|}| j ¡ D ]\}}| jt |ƒ7  _q |  j|7  _d S )Nr   r   r7   )r?   r"   r#   r!   Úitemsr<   r   )r$   r   Úprevious_tagr9   rF   Úentityr'   r'   r(   Úhandle_datac   s   
z HTMLToTelegramParser.handle_datac                 C   sR   z| j  ¡  | j ¡  W n	 ty   Y nw | j |d ¡}|r'| j |¡ d S d S ©N)r"   rC   r#   Ú
IndexErrorr!   Úpopr    Úappend)r$   rF   rN   r'   r'   r(   Úhandle_endtago   s   
ÿÿz"HTMLToTelegramParser.handle_endtag)Ú__name__Ú
__module__Ú__qualname__r   rK   rO   rT   Ú__classcell__r'   r'   r%   r(   r      s
    Fr   ÚhtmlÚreturnc                 C   sX   | s| g fS t ƒ }| t| ƒ¡ t|j|jƒ}|j ¡  |jjdd„ d� t|ƒ|jfS )a  
    Parses the given HTML message and returns its stripped representation
    plus a list of the MessageEntity's that were found.

    :param html: the message with HTML to be parsed.
    :return: a tuple consisting of (clean message, [message entities]).
    c                 S   s   | j S rP   )r;   )rN   r'   r'   r(   Ú<lambda>‰   s    zparse.<locals>.<lambda>©Úkey)	r   Úfeedr	   r   r   r    ÚreverseÚsortr
   )rY   Úparserr   r'   r'   r(   Úparsez   s   
rb   )z<strong>z	</strong>)z<em>z</em>)z<code>z</code>)z<u>z</u>)z<del>z</del>c                 C   s   | j rddfS ddfS )Nz<blockquote expandable>z<blockquote>z</blockquote>)r2   ©ÚeÚ_r'   r'   r(   r[   “   s   þþr[   c                 C   ó   d  | j¡dfS )Nz-<pre>
    <code class='language-{}'>
        z{}
    </code>
</pre>)Úformatr6   rc   r'   r'   r(   r[   —   s   
ýc                 C   ó   d  |¡dfS )Nz<a href="mailto:{}">ú</a>©rg   ©re   Útr'   r'   r(   r[   ž   ó    c                 C   rh   ©Nz<a href="{}">ri   rj   rk   r'   r'   r(   r[   Ÿ   rm   c                 C   s   d  t| jƒ¡dfS rn   )rg   r   r9   rc   r'   r'   r(   r[       s    c                 C   rf   )Nz<a href="tg://user?id={}">ri   )rg   Úuser_idrc   r'   r'   r(   r[   ¡   ó    c                 C   rf   )Nz<tg-emoji emoji-id="{}">z</tg-emoji>)rg   r:   rc   r'   r'   r(   r[   ¢   rp   r   r    c                 C   sJ  | s| S |s
t | ƒS t|tƒr|f}t| ƒ} g }t|ƒD ]9\}}|j}|j|j }t t	|ƒd¡}|rUt
|ƒr@||| ||… ƒ}| |||d f¡ | || |d f¡ q|jdd„ d� t| ƒ}|r“| ¡ \}	}
}t| |	ƒry|	d7 }	t| |	ƒsp| d|	… | t | |	|… ƒ | |d…  } |	}|sdt | d|… ƒ| |d…  } t| ƒS )a=  
    Performs the reverse operation to .parse(), effectively returning HTML
    given a normal text and its MessageEntity's.

    :param text: the text to be reconverted into HTML.
    :param entities: the MessageEntity's applied to the text.
    :return: a HTML representation of the combination of both inputs.
    Nr   é   c                 S   s   | d | d fS )Nr   rq   r'   )rl   r'   r'   r(   r[   Ã   rp   zunparse.<locals>.<lambda>r\   )r   Ú
isinstancer   r	   Ú	enumerater;   r<   ÚENTITY_TO_FORMATTERÚgetÚtypeÚcallablerS   r`   r?   rR   r   r
   )r   r    Ú	insert_atr,   rN   r/   rd   Ú	delimiterÚnext_escape_boundÚatre   Úwhatr'   r'   r(   Úunparse¦   s<   	
€

ÿ,ù	r}   N)%Ú__doc__Úcollectionsr   rY   r   Úhtml.parserr   Útypingr   r   r   Úhelpersr	   r
   r   r   Útlr   Útl.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   Ústrrb   rt   r}   r'   r'   r'   r(   Ú<module>   s0    <	fë