o
    -˜ŽjB#  ã                   @   s”   d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
 d dlmZ ddlmZ e e¡ZG d	d
„ d
eƒZG dd„ dƒZdS )é    N)Ú
HTMLParser)ÚOptional)Úraw)ÚMessageEntityType)ÚPeerIdInvalidé   )Úutilsc                       sH   e Zd Ze d¡Zd‡ fdd„Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
‡  ZS )ÚParserztg://user\?id=(\d+)Úclientúpyrogram.Clientc                    s&   t ƒ  ¡  || _d| _g | _i | _d S )NÚ )ÚsuperÚ__init__r
   ÚtextÚentitiesÚtag_entities©Úselfr
   ©Ú	__class__© úQ/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/pyrogram/parser/html.pyr   &   s
   

zParser.__init__c                 C   s|  t |ƒ}i }|dv rtjj}n�|dv rtjj}n‡|dkr!tjj}n~|dv r*tjj}nu|dkr=tjj}td| 	¡ v ƒ|d< nb|dkrFtjj
}nY|d	krWtjj}| d
d¡|d
< nH|dkr`tjj}n?|dkr‰| dd¡}tj |¡}|r€tjj}t| d¡ƒ|d< ntjj}||d< n|dkr�tjj}t| d¡ƒ}||d< nd S || jvr©g | j|< | j|  |dt| jƒddœ|¤Ž¡ d S )N)ÚbÚstrong)ÚiÚemÚu)ÚsÚdelÚstrikeÚ
blockquoteÚ
expandableÚ	collapsedÚcodeÚpreÚlanguager   ÚspoilerÚaÚhrefr   Úuser_idÚurlÚemojiÚidÚdocument_idr   ©ÚoffsetÚlengthr   )Údictr   ÚtypesÚMessageEntityBoldÚMessageEntityItalicÚMessageEntityUnderlineÚMessageEntityStrikeÚMessageEntityBlockquoteÚboolÚkeysÚMessageEntityCodeÚMessageEntityPreÚgetÚMessageEntitySpoilerr	   Ú
MENTION_REÚmatchÚInputMessageEntityMentionNameÚintÚgroupÚMessageEntityTextUrlÚMessageEntityCustomEmojir   ÚappendÚlenr   )r   ÚtagÚattrsÚextraÚentityr*   ÚmentionÚcustom_emoji_idr   r   r   Úhandle_starttag/   sH   









*zParser.handle_starttagc                 C   sH   t  |¡}| j ¡ D ]}|D ]}| jt|ƒ7  _qq
|  j|7  _d S ©N)ÚhtmlÚunescaper   Úvaluesr0   rF   r   )r   Údatar   rJ   r   r   r   Úhandle_data\   s   
ÿzParser.handle_datac              	   C   sv   z| j  | j|  ¡ ¡ W n ttfy+   |  ¡ \}}|d7 }t d|||¡ Y d S w | j| s9| j |¡ d S d S )Nr   z)Unmatched closing tag </%s> at line %s:%s)	r   rE   r   ÚpopÚKeyErrorÚ
IndexErrorÚgetposÚlogÚdebug)r   rG   Úliner/   r   r   r   Úhandle_endtage   s   ü
ÿzParser.handle_endtagc                 C   s   d S rN   r   )r   Úmessager   r   r   Úerrorq   s   zParser.error)r
   r   )Ú__name__Ú
__module__Ú__qualname__ÚreÚcompiler>   r   rM   rS   r[   r]   Ú__classcell__r   r   r   r   r	   #   s    
	-	r	   c                   @   sB   e Zd Zded fdd„Zdefdd„Zededefd	d
„ƒZ	dS )ÚHTMLr
   r   c                 C   s
   || _ d S rN   )r
   r   r   r   r   r   v   s   
zHTML.__init__r   c              	   Ã   s   �t  dd|¡}t  dd|¡}t| jƒ}| t |¡¡ | ¡  |jrFg }|j 	¡ D ]\}}| 
d|› dt|ƒ› d�¡ q*t dd |¡¡ g }|jD ]*}t|tjjƒrpz| jd ure| j |j¡I d H |_W n	 tyo   Y qKw | 
|¡ qKttd	d
„ |ƒƒ}t |j¡t|dd
„ d�p�d dœS )Nz^\s*(<[\w<>=\s\"]*>)\s*z\1z\s*(</[\w</>]*>)\s*$ú<z> (xú)zUnclosed tags: %sz, c                 S   s
   | j dkS )Nr   )r0   )Úxr   r   r   Ú<lambda>—   s   
 zHTML.parse.<locals>.<lambda>c                 S   s   | j S rN   )r/   ©Úer   r   r   rh   ›   s    ©Úkey)r\   r   )ra   Úsubr	   r
   Úfeedr   Úadd_surrogatesÚcloser   ÚitemsrE   rF   rX   ÚinfoÚjoinr   Ú
isinstancer   r2   r@   Úresolve_peerr)   r   ÚlistÚfilterÚremove_surrogatesr   Úsorted)r   r   ÚparserÚunclosed_tagsrG   r   rJ   r   r   r   Úparsey   s4   €


€ÿ
þz
HTML.parser   c                    sÈ   dd„ ‰dt dt f‡ ‡‡‡fdd„‰t | ¡} g ‰ˆ jdd„ d	� d
}|tˆ ƒk r5|ˆ|ƒ7 }|tˆ ƒk s)ˆr_ˆd d }tˆƒD ]\}}| d |… | t | ||… ¡ | |d …  } |}qAt | ¡S )Nc                 S   s†  | j }| j}|| j }|tjtjtjtjfv r+|jd  	¡ }d|› d�}d|› d�}n�|tj
krU|j 	¡ }t| ddƒp<d}|rHd|› d|› d�nd|› d�}d|› d�}nf|tjkrid	}d|› d
�}d|› d�}nR|tjtjtjfv r…|j 	¡ }d|› d�}d|› d�}n6|tjkr–| j}d|› d�}d}n%|tjkr¨| j}	d|	j› d�}d}n|tjkr¹| j}
d|
› d�}d}ndS ||f||ffS )z_
            Parses a single entity and returns (start_tag, start), (end_tag, end)
            r   re   ú>z</r%   r   z language="z">r    z expandable>z	<a href="z</a>z<a href="tg://user?id=z<emoji id="z</emoji>N)Útyper/   r0   r   ÚBOLDÚITALICÚ	UNDERLINEÚSTRIKETHROUGHÚnameÚlowerÚPREÚgetattrÚEXPANDABLE_BLOCKQUOTEÚCODEÚ
BLOCKQUOTEÚSPOILERÚ	TEXT_LINKr*   ÚTEXT_MENTIONÚuserr,   ÚCUSTOM_EMOJIrL   )rJ   Úentity_typeÚstartÚendrƒ   Ú	start_tagÚend_tagr%   r*   r�   rL   r   r   r   Ú	parse_one    sV   
ü

"
ý



zHTML.unparse.<locals>.parse_oneÚentity_iÚreturnc                    s”   ˆˆ |  ƒ}|du rdS |\\}}\}}ˆ  ||f¡ | d }|tˆ ƒk r?ˆ | j|k r?|ˆ|ƒ7 }|tˆ ƒk r?ˆ | j|k s,ˆ  ||f¡ ||  S )aR  
            Takes the index of the entity to start parsing from, returns the number of parsed entities inside it.
            Uses entities_offsets as a stack, pushing (start_tag, start) first, then parsing nested entities,
            and finally pushing (end_tag, end) to the stack.
            No need to sort at the end.
            Nr   )rE   rF   r/   )r•   Úthisr’   r�   r“   r‘   Ú
internal_i©r   Úentities_offsetsr”   Ú	recursiver   r   r›   Ó   s   ÿzHTML.unparse.<locals>.recursivec                 S   s   | j | j fS rN   r.   ri   r   r   r   rh   ë   s    zHTML.unparse.<locals>.<lambda>rk   r   éÿÿÿÿr   )	rA   r   ro   ÚsortrF   ÚreversedrO   Úescaperx   )r   r   r   Úlast_offsetrJ   r/   r   r™   r   Úunparsež   s   3
ÿ.
zHTML.unparseN)
r^   r_   r`   r   r   Ústrr|   Ústaticmethodrv   r¡   r   r   r   r   rd   u   s
    %rd   )rO   Úloggingra   Úhtml.parserr   Útypingr   Úpyrogramr   Úpyrogram.enumsr   Úpyrogram.errorsr   r   r   Ú	getLoggerr^   rX   r	   rd   r   r   r   r   Ú<module>   s   
R