U
    ;g!                     @   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                       sL   e Zd ZedZdd fddZdd Zdd	 Zd
d Z	dd Z
  ZS )Parserztg://user\?id=(\d+)pyrogram.Clientclientc                    s&   t    || _d| _g | _i | _d S )N )super__init__r   textentitiestag_entitiesselfr   	__class__ T/opt/bot/vods_filmes/script/venv/lib/python3.8/site-packages/pyrogram/parser/html.pyr   %   s
    
zParser.__init__c                 C   sp  t |}i }|dkr tjj}n|dkr2tjj}n|dkrDtjj}n|dkrVtjj}n|dkrhtjj}n|dkrztjj}n|dkrtjj	}|
dd	|d< n|d
krtjj}n|dkr|
dd	}tj|}|rtjj}t|d|d< ntjj}||d< n.|dkr,tjj}t|
d}||d< nd S || jkrFg | j|< | j| |f t| jdd| d S )N)bstrong)iZemu)sdelstrikeZ
blockquotecodeprelanguager   Zspoilerahrefr   user_idurlemojiidZdocument_idr   offsetlength)dictr   typesZMessageEntityBoldZMessageEntityItalicZMessageEntityUnderlineZMessageEntityStrikeZMessageEntityBlockquoteZMessageEntityCodeZMessageEntityPregetZMessageEntitySpoilerr	   
MENTION_REmatchInputMessageEntityMentionNameintgroupZMessageEntityTextUrlZMessageEntityCustomEmojir   appendlenr   )r   tagattrsextraentityr&   Zmentioncustom_emoji_idr   r   r   handle_starttag.   sF    










zParser.handle_starttagc                 C   sH   t |}| j D ] }|D ]}| jt|7  _qq|  j|7  _d S N)htmlunescaper   valuesr+   r5   r   )r   datar   r9   r   r   r   handle_dataZ   s
    
zParser.handle_datac              	   C   sr   z| j | j|   W n< ttfk
rV   |  \}}|d7 }td||| Y nX | j| sn| j| d S )Nr   z)Unmatched closing tag </%s> at line %s:%s)	r   r4   r   popKeyError
IndexErrorgetposlogdebug)r   r6   liner*   r   r   r   handle_endtagc   s    
zParser.handle_endtagc                 C   s   d S r<   r   )r   messager   r   r   erroro   s    zParser.error)__name__
__module____qualname__recompiler/   r   r;   rA   rI   rK   __classcell__r   r   r   r   r	   "   s   
	,	r	   c                   @   s@   e Zd Zed dddZedddZeeedd	d
Z	dS )HTMLr
   r   c                 C   s
   || _ d S r<   r   r   r   r   r   r   t   s    zHTML.__init__)r   c              	      s&  t dd|}t dd|}t| j}|t| |  |jrg }|j	 D ]$\}}|
d| dt| d qRtdd| g }|jD ]Z}t|tjjrz$| jd k	r| j|jI d H |_W n tk
r   Y qY nX |
| qt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   )r+   )xr   r   r   <lambda>       zHTML.parse.<locals>.<lambda>c                 S   s   | j S r<   )r*   er   r   r   rV      rW   key)rJ   r   )rO   subr	   r   feedr   add_surrogatescloser   itemsr4   r5   rF   infojoinr   
isinstancer   r-   r1   Zresolve_peerr%   r   listfilterremove_surrogatesr   sorted)r   r   parserZunclosed_tagsr6   r   r9   r   r   r   parsew   s.    




z
HTML.parse)r   r   c                    s   dd t t d fddt| } g  jdd d d	}|t k r^||7 }qDrd
 d }tD ]:\}}| d | | t| ||  | |d   } |}qvt| S )Nc                 S   sd  | j }| j}|| j }|tjtjtjtjfkrV|jd 	 }d| d}d| d}n|tj
kr|j	 }t| ddpxd}|rd| d| dn
d| d}d| d}n|tjtjtjfkr|j	 }d| d}d| d}nr|tjkr| j}d	| d}d
}nN|tjkr,| j}	d|	j d}d
}n(|tjkrP| 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   rS   >z</r"   r   z language="z">z	<a href="z</a>z<a href="tg://user?id=z<emoji id="z</emoji>N)typer*   r+   r   ZBOLDZITALICZ	UNDERLINEZSTRIKETHROUGHnamelowerZPREgetattrZCODEZ
BLOCKQUOTEZSPOILERZ	TEXT_LINKr&   ZTEXT_MENTIONuserr(   ZCUSTOM_EMOJIr:   )r9   Zentity_typestartendrl   	start_tagend_tagr"   r&   ro   r:   r   r   r   	parse_one   sN    


"
zHTML.unparse.<locals>.parse_one)entity_ireturnc                    s|    |  }|dkrdS |\\}}\}} ||f | d }|t k rf | j|k rf||7 }q> ||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   )r4   r5   r*   )ru   thisrr   rp   rs   rq   Z
internal_ir   Zentities_offsetsrt   	recursiver   r   ry      s    zHTML.unparse.<locals>.recursivec                 S   s   | j | j fS r<   r)   rX   r   r   r   rV      rW   zHTML.unparse.<locals>.<lambda>rZ   r   r   )	r2   r   r^   sortr5   reversedr=   escaperf   )r   r   r   Zlast_offsetr9   r*   r   rx   r   unparse   s    /
.zHTML.unparseN)
rL   rM   rN   r   r   strri   staticmethodrd   r~   r   r   r   r   rR   s   s   %rR   )r=   loggingrO   html.parserr   typingr   Zpyrogramr   Zpyrogram.enumsr   Zpyrogram.errorsr   r   r   	getLoggerrL   rF   r	   rR   r   r   r   r   <module>   s   
Q