U
    —ùiú/  ã                   @  sÐ  U d dl mZ 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	m
Z
 d dlm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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#m$Z$ eed�dddœdd„ƒZ%eed�dddœdd„ƒZ&eed�dddœdd„ƒZ'e(dd„ e )¡ D ƒƒZ*de+d< dd„ e*D ƒZ,de+d< eed�dddœd d!„ƒZ-eed�dddœd"d#„ƒZ.eed�dddœd$d%„ƒZ/eed�dddœd&d'„ƒZ0eed�dddœd(d)„ƒZ1eed�dddœd*d+„ƒZ2eed�dddœd,d-„ƒZ3eed�dddœd.d/„ƒZ4eed�dddœd0d1„ƒZ5eed�dddœd2d3„ƒZ6eed�dddœd4d5„ƒZ7eed�dddœd6d7„ƒZ8eed�dddœd8d9„ƒZ9eed�dddœd:d;„ƒZ:eed�dddœd<d=„ƒZ;ee<eƒd�ddd>œd?d@„ƒZ=eed�dddœdAdB„ƒZ>didDdddEœdFdG„Z?edHd�dddIœdJdK„ƒZ@dDdLdMœdNdO„ZAdddPœdQdR„ZBdjddddTœdUdV„ZCdddWdXœdYdZ„ZDddddXœd[d\„ZEd]ejFd^fdddd_d`œdadb„ZGdkdDddcddddddddedfœ
dgdh„ZHdS )lé    )ÚannotationsN)Úbisect_right)ÚIncrementalDecoder)Úaliases)Ú	lru_cache)Úfindall)Ú	Generator)ÚMultibyteIncrementalDecoderé   )ÚENCODING_MARKSÚIANA_SUPPORTED_SIMILARÚRE_POSSIBLE_ENCODING_INDICATIONÚUNICODE_RANGES_COMBINEDÚUNICODE_SECONDARY_RANGE_KEYWORDÚUTF8_MAXIMAL_ALLOCATIONÚCOMMON_CJK_CHARACTERSÚ_LATINÚ_CJKÚ_HANGULÚ	_KATAKANAÚ	_HIRAGANAÚ_THAIÚ_ARABICÚ_ARABIC_ISOLATED_FORMÚ_ACCENT_KEYWORDSÚ_ACCENTUATED)ÚmaxsizeÚstrÚint)Ú	characterÚreturnc                 C  sÌ   zt  | ¡}W n tk
r$   Y dS X d}d|kr:|tO }d|krJ|tO }d|krZ|tO }d|krj|tO }d|krz|tO }d|krŠ|tO }d|krª|t	O }d	|krª|t
O }tD ]}||kr®|tO } qÈq®|S )
zRCompute all name-based classification flags with a single unicodedata.name() call.r   ZLATINÚCJKZHANGULZKATAKANAZHIRAGANAZTHAIZARABICzISOLATED FORM)ÚunicodedataÚnameÚ
ValueErrorr   r   r   r   r   r   r   r   r   r   )r   ÚdescÚflagsÚkw© r(   ú</tmp/pip-unpacked-wheel-mwc9rwws/charset_normalizer/utils.pyÚ_character_flags&   s4    r*   Úboolc                 C  s   t t| ƒt@ ƒS ©N)r+   r*   r   ©r   r(   r(   r)   Úis_accentuatedI   s    r.   c                 C  s.   t  | ¡}|s| S | d¡}tt|d dƒƒS )Nú r   é   )r"   ÚdecompositionÚsplitÚchrr   )r   Z
decomposedÚcodesr(   r(   r)   Úremove_accentN   s
    

r5   c                 c  s    | ]\}}|j |j|fV  qd S r,   )ÚstartÚstop)Ú.0r#   Z	ord_ranger(   r(   r)   Ú	<genexpr>[   s   ÿr9   zlist[tuple[int, int, str]]Ú_UNICODE_RANGES_SORTEDc                 C  s   g | ]}|d  ‘qS )r   r(   )r8   Úer(   r(   r)   Ú
<listcomp>_   s     r<   z	list[int]Ú_UNICODE_RANGE_STARTSz
str | Nonec                 C  s<   t | ƒ}tt|ƒd }|dkr8t| \}}}||k r8|S dS )zK
    Retrieve the Unicode range official name from a single character.
    r
   r   N)Úordr   r=   r:   )r   Zcharacter_ordÚidxr6   r7   r#   r(   r(   r)   Úunicode_rangeb   s    r@   c                 C  s   t t| ƒt@ ƒS r,   )r+   r*   r   r-   r(   r(   r)   Úis_latins   s    rA   c                 C  s2   t  | ¡}d|krdS t| ƒ}|d kr*dS d|kS )NÚPTFZPunctuation©r"   Úcategoryr@   ©r   Úcharacter_categoryÚcharacter_ranger(   r(   r)   Úis_punctuationx   s    
rH   c                 C  sB   t  | ¡}d|ksd|krdS t| ƒ}|d kr2dS d|ko@|dkS )NÚSÚNTFZFormsZLorC   rE   r(   r(   r)   Ú	is_symbol‡   s    
rK   c                 C  s$   t | ƒ}|d krdS d|kp"d|kS )NFZ	EmoticonsZPictographs)r@   )r   rG   r(   r(   r)   Úis_emoticon–   s    rL   c                 C  s.   |   ¡ s| dkrdS t | ¡}d|kp,|dkS )N>   õ   ï½œú+ú>ú<TÚZ>   ÚPoÚPdÚPc)Úisspacer"   rD   )r   rF   r(   r(   r)   Úis_separator    s    
rV   c                 C  s   |   ¡ |  ¡ kS r,   )ÚislowerÚisupperr-   r(   r(   r)   Úis_case_variableª   s    rY   c                 C  s   t t| ƒt@ ƒS r,   )r+   r*   r   r-   r(   r(   r)   Úis_cjk¯   s    rZ   c                 C  s   t t| ƒt@ ƒS r,   )r+   r*   r   r-   r(   r(   r)   Úis_hiragana´   s    r[   c                 C  s   t t| ƒt@ ƒS r,   )r+   r*   r   r-   r(   r(   r)   Úis_katakana¹   s    r\   c                 C  s   t t| ƒt@ ƒS r,   )r+   r*   r   r-   r(   r(   r)   Ú	is_hangul¾   s    r]   c                 C  s   t t| ƒt@ ƒS r,   )r+   r*   r   r-   r(   r(   r)   Úis_thaiÃ   s    r^   c                 C  s   t t| ƒt@ ƒS r,   )r+   r*   r   r-   r(   r(   r)   Ú	is_arabicÈ   s    r_   c                 C  s   t t| ƒt@ ƒS r,   )r+   r*   r   r-   r(   r(   r)   Úis_arabic_isolated_formÍ   s    r`   c                 C  s   | t kS r,   )r   r-   r(   r(   r)   Úis_cjk_uncommonÒ   s    ra   )Ú
range_namer    c                   s   t ‡ fdd„tD ƒƒS )Nc                 3  s   | ]}|ˆ kV  qd S r,   r(   )r8   Úkeyword©rb   r(   r)   r9   Ù   s     z-is_unicode_range_secondary.<locals>.<genexpr>)Úanyr   rd   r(   rd   r)   Úis_unicode_range_secondary×   s    rf   c                 C  s(   |   ¡ dko&|  ¡ dko&| dko&| dkS )NFúu   ï»¿)rU   Úisprintabler-   r(   r(   r)   Úis_unprintableÜ   s    
ÿþüri   é    zbytes | bytearray)ÚsequenceÚsearch_zoner    c                 C  s¤   t | ttfƒst‚t| ƒ}tt| dt||ƒ… jddd�ƒ}t|ƒdkrLdS |D ]N}| 	¡  
dd¡}t ¡ D ]0\}}||krˆ|    S ||krl|    S qlqPdS )zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    NÚasciiÚignore©Úerrorsr   ú-Ú_)Ú
isinstanceÚbytesÚ	bytearrayÚ	TypeErrorÚlenr   r   ÚminÚdecodeÚlowerÚreplacer   Úitems)rk   rl   Zseq_lenÚresultsZspecified_encodingÚencoding_aliasÚencoding_ianar(   r(   r)   Úany_specified_encodingç   s"    þr€   é€   )r#   r    c                 C  s    | dkpt t d| › �¡jtƒS )zQ
    Verify is a specific encoding is a multi byte one based on it IANA name
    >	   Úutf_32Ú	utf_32_leÚutf_7Úutf_16Ú	utf_8_sigÚ	utf_32_beÚ	utf_16_beÚ	utf_16_leÚutf_8ú
encodings.)Ú
issubclassÚ	importlibÚimport_moduler   r	   )r#   r(   r(   r)   Úis_multi_byte_encoding	  s    
þör�   ztuple[str | None, bytes])rk   r    c                 C  sJ   t D ]@}t | }t|tƒr |g}|D ]}|  |¡r$||f    S q$qdS )z9
    Identify and extract SIG/BOM in given sequence.
    )Nó    )r   rs   rt   Ú
startswith)rk   Úiana_encodingZmarksÚmarkr(   r(   r)   Úidentify_sig_or_bom  s    

r”   )r’   r    c                 C  s   | dkS )N>   r‚   r…   r(   )r’   r(   r(   r)   Úshould_strip_sig_or_bom0  s    r•   T)Úcp_nameÚstrictr    c                 C  sN   |   ¡  dd¡} t ¡ D ]\}}| ||fkr|  S q|rJtd| › d�ƒ‚| S )zIReturns the Python normalized encoding name (Not the IANA official name).rq   rr   zUnable to retrieve IANA for 'ú')rz   r{   r   r|   r$   )r–   r—   r~   r   r(   r(   r)   Ú	iana_name4  s    
r™   Úfloat)Úiana_name_aÚiana_name_br    c           	      C  sŒ   t | ƒst |ƒrdS t d| › �¡j}t d|› �¡j}|dd�}|dd�}d}tdƒD ]*}t|gƒ}| |¡| |¡krX|d7 }qX|d S )Ng        r‹   rn   ro   r   é   r
   )r�   r�   rŽ   r   Úrangert   ry   )	r›   rœ   Z	decoder_aZ	decoder_bZid_aZid_bZcharacter_match_countÚiZto_be_decodedr(   r(   r)   Úcp_similarityE  s    



r    c                 C  s   | t ko|t |  kS )zŽ
    Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using
    the function cp_similarity.
    )r   )r›   rœ   r(   r(   r)   Úis_cp_similarY  s    
þr¡   Zcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sÚNone)r#   ÚlevelÚformat_stringr    c                 C  s:   t  | ¡}| |¡ t  ¡ }| t  |¡¡ | |¡ d S r,   )ÚloggingÚ	getLoggerÚsetLevelÚStreamHandlerÚsetFormatterÚ	FormatterÚ
addHandler)r#   r£   r¤   ÚloggerÚhandlerr(   r(   r)   Úset_logging_handlerd  s
    

r®   rž   rt   zGenerator[str, None, None])
Ú	sequencesr   ÚoffsetsÚ
chunk_sizeÚbom_or_sig_availableÚstrip_sig_or_bomÚsig_payloadÚis_multi_byte_decoderÚdecoded_payloadr    c	                 c  s*  |r6|dkr6|D ]"}	||	|	| … }
|
s, q4|
V  qnð|D ]ê}	|	| }|t | ƒd krXq:| |	|	| … }|r||dkr||| }|j||rŠdndd�}
|�r|	dk�rt|dƒ}|�r|
d |… |k�rt|	|	d d	ƒD ]H}| ||… }|rø|dkrø|| }|j|dd�}
|
d |… |krÔ �qqÔ|
V  q:d S )
NFé   rn   r—   ro   r   r0   é   éÿÿÿÿ)rw   ry   rx   rž   )r¯   r   r°   r±   r²   r³   r´   rµ   r¶   rŸ   ÚchunkZ	chunk_endZcut_sequenceZchunk_partial_size_chkÚjr(   r(   r)   Úcut_sequence_chunksq  s>    

þ
ÿþr¼   )rj   )T)N)IÚ
__future__r   r�   r¥   r"   Úbisectr   Úcodecsr   Zencodings.aliasesr   Ú	functoolsr   Úrer   Útypingr   Z_multibytecodecr	   Zconstantr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r.   r5   Úsortedr|   r:   Ú__annotations__r=   r@   rA   rH   rK   rL   rV   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rw   rf   ri   r€   r�   r”   r•   r™   r    r¡   ÚINFOr®   r¼   r(   r(   r(   r)   Ú<module>   sŽ    L"þ		 ÿ"ý ÷