U
    Ä}ljá4  ã                   @  sh  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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" dddœdd„Z#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< dddœdd „Z+dddœd!d"„Z,dddœd#d$„Z-dddœd%d&„Z.dddœd'd(„Z/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/d0„ƒZ3eed�dddœd1d2„ƒZ4eed�dddœd3d4„ƒZ5eed�dddœd5d6„ƒZ6eed�dddœd7d8„ƒZ7eed�dddœd9d:„ƒZ8eed�dddœd;d<„ƒZ9ddd=œd>d?„Z:eed�dddœd@dA„ƒZ;didCdddDœdEdF„Z<edGd�dddHœdIdJ„ƒZ=dCdKdLœdMdN„Z>dddOœdPdQ„Z?djddddSœdTdU„Z@dddVdWœdXdY„ZAddddWœdZd[„ZBd\ejCd]fdddd^d_œd`da„ZDdkdCddcdddddddddedfœdgdh„ZEdS )lé    )ÚannotationsN)Úbisect_right)ÚIncrementalDecoder)Úaliases)Ú	lru_cache)Úfindall)Ú	Generatoré   )ÚENCODING_MARKSÚIANA_SUPPORTED_SIMILARÚRE_POSSIBLE_ENCODING_INDICATIONÚUNICODE_RANGES_COMBINEDÚ_SECONDARY_RANGE_NAMESÚUTF8_MAXIMAL_ALLOCATIONÚCOMMON_CJK_CHARACTERSÚ_LATINÚ_CJKÚ_HANGULÚ	_KATAKANAÚ	_HIRAGANAÚ_THAIÚ_ARABICÚ_ARABIC_ISOLATED_FORMÚ_ACCENT_KEYWORDSÚ_ACCENTUATEDÚ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-o3oa78c2/charset_normalizer/utils.pyÚ_character_flags"   s4    r(   Úboolc                 C  s   t t| ƒt@ ƒS ©N)r)   r(   r   ©r   r&   r&   r'   Úis_accentuatedD   s    r,   )Úmaxsizec                 C  s.   t  | ¡}|s| S | d¡}tt|d dƒƒS )Nú r   é   )r    ÚdecompositionÚsplitÚchrr   )r   Z
decomposedÚcodesr&   r&   r'   Úremove_accentH   s
    

r4   c                 c  s    | ]\}}|j |j|fV  qd S r*   )ÚstartÚstop)Ú.0r!   Z	ord_ranger&   r&   r'   Ú	<genexpr>U   s   ÿr8   zlist[tuple[int, int, str]]Ú_UNICODE_RANGES_SORTEDc                 C  s   g | ]}|d  ‘qS )r   r&   )r7   Úer&   r&   r'   Ú
<listcomp>Y   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<   r9   )r   Zcharacter_ordÚidxr5   r6   r!   r&   r&   r'   Úunicode_range\   s    r?   c                 C  s   t t| ƒt@ ƒS r*   )r)   r(   r   r+   r&   r&   r'   Úis_latinl   s    r@   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_punctuationp   s    
rG   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LorB   rD   r&   r&   r'   Ú	is_symbol~   s    
rJ   c                 C  s$   t | ƒ}|d krdS d|kp"d|kS )NFZ	EmoticonsZPictographs)r?   )r   rF   r&   r&   r'   Úis_emoticonŒ   s    rK   c                 C  s.   |   ¡ s| dkrdS t | ¡}d|kp,|dkS )N>   ú+õ   ï½œú>ú<TÚZ>   ÚPdÚPcÚPo)Úisspacer    rC   )r   rE   r&   r&   r'   Úis_separator•   s    
rU   c                 C  s   |   ¡ |  ¡ kS r*   )ÚislowerÚisupperr+   r&   r&   r'   Úis_case_variablež   s    rX   c                 C  s   t t| ƒt@ ƒS r*   )r)   r(   r   r+   r&   r&   r'   Úis_cjk£   s    rY   c                 C  s   t t| ƒt@ ƒS r*   )r)   r(   r   r+   r&   r&   r'   Úis_hiragana¨   s    rZ   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    r`   )Ú
range_namer   c                 C  s   | t kS r*   )r   )ra   r&   r&   r'   Úis_unicode_range_secondaryË   s    rb   c                 C  s$   |   ¡  o"|  ¡  o"| dko"| dkS )Núu   ï»¿)rT   Úisprintabler+   r&   r&   r'   Úis_unprintableÏ   s    
ÿþüre   é    zbytes | bytearray)ÚsequenceÚsearch_zoner   c           	      C  sÄ   t | ttfƒst‚t| ƒ}| dt||ƒ… jddd�}| ¡ }d|krRd|krRdS tt	|ƒ}t|ƒdkrldS |D ]N}| ¡  
dd	¡}t ¡ D ]0\}}||kr¨|    S ||krŒ|    S qŒqpdS )
zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    NÚasciiÚignore©ÚerrorsZcodingÚcharsetr   ú-Ú_)Ú
isinstanceÚbytesÚ	bytearrayÚ	TypeErrorÚlenÚminÚdecodeÚlowerr   r   Úreplacer   Úitems)	rg   rh   Zseq_lenZdecoded_zoneZlowered_zoneÚresultsZspecified_encodingÚencoding_aliasÚencoding_ianar&   r&   r'   Úany_specified_encodingÚ   s0     ÿþr}   é€   )r!   r   c                 C  sR   | dkrdS dD ]<}zt  |¡ | ¡ W n tttfk
rF   Y qY nX  dS dS )zQ
    Verify is a specific encoding is a multi byte one based on it IANA name
    >	   Ú	utf_16_beÚ	utf_32_leÚutf_32Ú	utf_16_leÚ	utf_8_sigÚ	utf_32_beÚutf_8Úutf_16Úutf_7T)Z
_codecs_cnZ
_codecs_hkZ_codecs_iso2022Z
_codecs_jpZ
_codecs_krZ
_codecs_twF)Ú	importlibÚimport_moduleZgetcodecÚImportErrorÚAttributeErrorÚLookupError)r!   Zproviderr&   r&   r'   Úis_multi_byte_encoding  s    	
r�   ztuple[str | None, bytes])rg   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
   rp   rq   Ú
startswith)rg   Ú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_bomA  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).rn   ro   zUnable to retrieve IANA for 'ú')rw   rx   r   ry   r"   )r”   r•   r{   r|   r&   r&   r'   Ú	iana_nameE  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        z
encodings.rj   rk   r   é   r	   )r�   rˆ   r‰   r   Úrangerq   rv   )	r™   rš   Z	decoder_aZ	decoder_bZid_aZid_bZcharacter_match_countÚiZto_be_decodedr&   r&   r'   Úcp_similarityV  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_similarj  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_handleru  s
    

r¬   Frœ   rq   zGenerator[str, None, None])Ú	sequencesr|   ÚoffsetsÚ
chunk_sizeÚbom_or_sig_availableÚstrip_sig_or_bomÚsig_payloadÚis_multi_byte_decoderÚdecoded_payloadÚdeferred_decodingr   c
                 c  st  |r4|s4|D ]"}
||
|
| … }|s( q0|V  q�n<|	r€|s@| n| t |ƒd … }|D ](}
||
|
| … }|sp q~t||ƒV  qTnð|D ]ê}
|
| }|t | ƒd kr¢q„| |
|
| … }|rÂ|sÂ|| }|j||rÐdndd�}|�rh|
dk�rht|dƒ}|�rh|d |… |k�rht|
|
d dƒD ]L}| ||… }|�r>|�s>|| }|j|dd�}|d |… |k�r �qh�q|V  q„d S )	Né   rj   r•   rk   r   r/   é   éÿÿÿÿ)rt   r   rv   ru   rœ   )r­   r|   r®   r¯   r°   r±   r²   r³   r´   rµ   r�   ÚchunkZ
base_bytesZcut_sequenceZ	chunk_endZchunk_partial_size_chkÚjr&   r&   r'   Úcut_sequence_chunks‚  sN    ÿ
þ
ÿþ
r»   )rf   )T)NF)FÚ
__future__r   rˆ   r£   r    Úbisectr   Úcodecsr   Zencodings.aliasesr   Ú	functoolsr   Úrer   Útypingr   Zconstantr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r,   r4   Úsortedry   r9   Ú__annotations__r<   r?   r@   rG   rJ   rK   rU   rX   rY   rZ   r[   r\   r]   r^   r_   r`   rb   re   r}   r�   r’   r“   r—   rž   rŸ   ÚINFOr¬   r»   r&   r&   r&   r'   Ú<module>   s|    L"þ		 ÿ+)ý  ö