
    N[i!                         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j                  e      Z G d	 d
e      Z G d d      Zy)    N)
HTMLParser)Optional)raw)MessageEntityType)PeerIdInvalid   )utilsc                   \     e Zd Z ej                  d      Zd fdZd Zd Zd Z	d Z
 xZS )Parserztg://user\?id=(\d+)c                 Z    t         |           || _        d| _        g | _        i | _        y )N )super__init__clienttextentitiestag_entities)selfr   	__class__s     G/var/www/files/kim/lib/python3.12/site-packages/pyrogram/parser/html.pyr   zParser.__init__%   s+    	    c                    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                  }ng|dk(  rt        j                  j                  }nF|dk(  rt        j                  j                  }n%|dk(  r0t        j                  j                  }|j                  dd	      |d<   n|d
k(  rt        j                  j                  }n|dk(  r|j                  dd	      }t        j                  j                  |      }|r8t        j                  j                  }t!        |j#                  d            |d<   n`t        j                  j$                  }||d<   n@|dk(  r:t        j                  j&                  }t!        |j                  d            }||d<   ny || j(                  vrg | j(                  |<   | j(                  |   j+                   |dt-        | j.                        dd|       y )N)bstrong)iemu)sdelstrike
blockquotecodeprelanguager   spoilerahrefr   user_idurlemojiiddocument_idr   offsetlength )dictr   typesMessageEntityBoldMessageEntityItalicMessageEntityUnderlineMessageEntityStrikeMessageEntityBlockquoteMessageEntityCodeMessageEntityPregetMessageEntitySpoilerr   
MENTION_REmatchInputMessageEntityMentionNameintgroupMessageEntityTextUrlMessageEntityCustomEmojir   appendlenr   )r   tagattrsextraentityr)   mentioncustom_emoji_ids           r   handle_starttagzParser.handle_starttag.   s   U/!YY00FKYY22FCZYY55F**YY22FL YY66FF]YY00FE\YY//F %		*b 9E*IYY33FCZ))FB'C''--c2G@@#&w}}Q'7#8i 77"eG^YY77F!%))D/2O#2E- d'''%'Dc"#%%f&VC		N1&VPU&VWr   c                     t        j                  |      }| j                  j                         D ]'  }|D ]   }|xj                  t        |      z  c_        " ) | xj                  |z  c_        y N)htmlunescaper   valuesr/   rD   r   )r   datar   rH   s       r   handle_datazParser.handle_dataZ   s_    }}T"))002 	+H" +T*+	+ 			T	r   c                 R   	 | j                   j                  | j                  |   j                                | j                  |   s| j                  j                  |       y y # t        t
        f$ r3 | j                         \  }}|dz  }t        j                  d|||       Y y w xY w)Nr   z)Unmatched closing tag </%s> at line %s:%s)	r   rC   r   popKeyError
IndexErrorgetposlogdebug)r   rE   liner.   s       r   handle_endtagzParser.handle_endtagc   s    		+MM  !2!23!7!;!;!=> $$S)!!%%c* * *% 	V;;=LD&aKFIIA3fU		Vs   6A$ $?B&%B&c                      y rM   r0   )r   messages     r   errorzParser.erroro   s    r   )r   pyrogram.Client)__name__
__module____qualname__recompiler<   r   rK   rR   r[   r^   __classcell__)r   s   @r   r   r   "   s/    23J*XX
+r   r   c                   D    e Zd Zded   fdZdefdZededefd       Z	y)	HTMLr   r_   c                     || _         y rM   )r   )r   r   s     r   r   zHTML.__init__t   s	    r   r   c           	        K   t        j                  dd|      }t        j                  dd|      }t        | j                        }|j	                  t        j                  |             |j                          |j                  rjg }|j                  j                         D ]&  \  }}|j                  d| dt        |       d       ( t        j                  ddj                  |             g }|j                  D ]v  }t!        |t"        j$                  j&                        r?	 | j                  2| j                  j)                  |j*                         d {   |_        |j                  |       x t/        t1        d	 |            }t        j2                  |j4                        t7        |d
       xs d dS 7 d# t,        $ r Y w xY ww)Nz^\s*(<[\w<>=\s\"]*>)\s*z\1z\s*(</[\w</>]*>)\s*$<z> (x)zUnclosed tags: %sz, c                      | j                   dkD  S )Nr   )r/   )xs    r   <lambda>zHTML.parse.<locals>.<lambda>   s    A r   c                     | j                   S rM   )r.   es    r   rn   zHTML.parse.<locals>.<lambda>   s
    qxx r   key)r]   r   )rc   subr   r   feedr	   add_surrogatescloser   itemsrC   rD   rX   infojoinr   
isinstancer   r2   r>   resolve_peerr(   r   listfilterremove_surrogatesr   sorted)r   r   parserunclosed_tagsrE   r   rH   s          r   parsez
HTML.parsew   s    vv0%>vv-ud;$E((./M!'!4!4!:!:!< DX$$qT#h-%BCD HH($))M*BCoo 	$F&#))"I"IJ{{./3{{/G/G/W)W OOF#	$ 5x@A ..v{{;x-?@HD
 	
 *X$ s=   D#G&4GF?	G$AG?G	G
GGGr   c                    d dt         dt         ffdt        j                  |       } g j                  d        d}|t	              k  r| |      z  }|t	              k  rrDd   d	   }t              D ].  \  }}| d | |z   t        j                  | ||       z   | |d  z   } |}0 t        j                  |       S )
Nc                    | j                   }| j                  }|| j                  z   }|t        j                  t        j
                  t        j                  t        j                  fv r+|j                  d   j                         }d| d}d| d}n1|t        j                  k(  rC|j                  j                         }t        | dd      xs d}|r	d| d| dnd| d}d| d}n|t        j                  t        j                  t        j                  fv r'|j                  j                         }d| d}d| d}n|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y||f||ffS )z_
            Parses a single entity and returns (start_tag, start), (end_tag, end)
            r   rj   >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   BOLDITALIC	UNDERLINESTRIKETHROUGHnamelowerPREgetattrCODE
BLOCKQUOTESPOILER	TEXT_LINKr)   TEXT_MENTIONuserr+   CUSTOM_EMOJIrJ   )rH   entity_typestartendr   	start_tagend_tagr$   r)   r   rJ   s              r   	parse_onezHTML.unparse.<locals>.parse_one   s    !++KMME&--'C!&&!((!++!//	  #''*002vQK	tfA, 1 5 55"''--/"6:r:@bAIav[
"=QRSWRXXY{	tfA,!&&!,,!))! 
 #''--/vQK	tfA, 1 ; ;;jj'uB/	  1 > >>{{4TWWIR@	  1 > >>"("8"8)/):"=	$u%~55r   entity_ireturnc                 .    	|          }|y|\  \  }}\  }}j                  ||f       | dz   }|t              k  r>|   j                  |k  r,| 
|      z  }|t              k  r|   j                  |k  r,j                  ||f       || z
  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.
            r   )rC   rD   r.   )r   thisr   r   r   r   
internal_ir   entities_offsetsr   	recursives          r   r   zHTML.unparse.<locals>.recursive   s     Xh/0D|15.Y###Y$67!AJs8},*1E1L1Ls1Ri
33
 s8},*1E1L1Ls1R##WcN3((r   c                 4    | j                   | j                   fS rM   r-   rp   s    r   rn   zHTML.unparse.<locals>.<lambda>   s    QXXy$9 r   rr   r   r   )	r?   r	   rv   sortrD   reversedrN   escaper   )	r   r   r   last_offsetrH   r.   r   r   r   s	    `    @@@r   unparsezHTML.unparse   s    -	6^	) 	) 	) 	)& ##D) 	9: #h-1A #h- *2.q1K"*+;"< %GV}v-D<T0UUX\]h]iXjj$% &&t,,r   N)
r`   ra   rb   r   r   strr   staticmethodr}   r   r0   r   r   rg   rg   s   sG    x(9: #
 #
J V-c V-T V- V-r   rg   )rN   loggingrc   html.parserr   typingr   pyrogramr   pyrogram.enumsr   pyrogram.errorsr   r   r	   	getLoggerr`   rX   r   rg   r0   r   r   <module>r      sR   &   	 "    , ) g!NZ Nb@- @-r   