U
    Á½„b\$  ã                   @   s,  zd dl ZW n ek
r(   d dlZY nX 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mZmZmZmZ d dlmZ dd	lmZmZmZmZmZmZ e
ed
�eedœdd„ƒZe
ed
�eedœdd„ƒZe
ed
�eee dœdd„ƒZ e
ed
�eedœdd„ƒZ!eedœdd„Z"e
ed
�eedœdd„ƒZ#e
ed
�eedœdd„ƒZ$e
ed
�eedœdd„ƒZ%e
ed
�eedœdd„ƒZ&e
ed
�eedœdd„ƒZ'eedœd d!„Z(e
ed
�eedœd"d#„ƒZ)e
ed
�eedœd$d%„ƒZ*e
ed
�eedœd&d'„ƒZ+e
ed
�eedœd(d)„ƒZ,e
ed
�eedœd*d+„ƒZ-e
e.eƒd
�eed,œd-d.„ƒZ/dNe0e1ee d0œd1d2„Z2e
d3d
�eed4œd5d6„ƒZ3e0eee e0f d7œd8d9„Z4eed:œd;d<„Z5dOeeed>œd?d@„Z6eee dAœdBdC„Z7eee8dDœdEdF„Z9eeedDœdGdH„Z:dIej;dJfee1eddKœdLdM„Z<dS )Pé    N)ÚIncrementalDecoder)Úaliases)Ú	lru_cache)Úfindall)ÚListÚOptionalÚSetÚTupleÚUnion)ÚMultibyteIncrementalDecoderé   )ÚENCODING_MARKSÚIANA_SUPPORTED_SIMILARÚRE_POSSIBLE_ENCODING_INDICATIONÚUNICODE_RANGES_COMBINEDÚUNICODE_SECONDARY_RANGE_KEYWORDÚUTF8_MAXIMAL_ALLOCATION)Úmaxsize)Ú	characterÚreturnc                 C   sV   zt  | ¡}W n tk
r$   Y dS X d|kpTd|kpTd|kpTd|kpTd|kpTd|kS )NFz
WITH GRAVEz
WITH ACUTEzWITH CEDILLAzWITH DIAERESISzWITH CIRCUMFLEXz
WITH TILDE©ÚunicodedataÚnameÚ
ValueError©r   Údescription© r   ú</tmp/pip-unpacked-wheel-2ta4nrol/charset_normalizer/utils.pyÚis_accentuated   s    ÿþýüúr   c                 C   s.   t  | ¡}|s| S | d¡}tt|d dƒƒS )Nú r   é   )r   ÚdecompositionÚsplitÚchrÚint)r   Z
decomposedÚcodesr   r   r   Úremove_accent*   s
    

r&   c                 C   s.   t | ƒ}t ¡ D ]\}}||kr|  S qdS )zK
    Retrieve the Unicode range official name from a single character.
    N)Úordr   Úitems)r   Zcharacter_ordÚ
range_nameZ	ord_ranger   r   r   Úunicode_range5   s
    
r*   c                 C   s.   zt  | ¡}W n tk
r$   Y dS X d|kS )NFZLATINr   r   r   r   r   Úis_latinC   s
    r+   c                 C   s*   z|   d¡ W n tk
r$   Y dS X dS )NÚasciiFT)ÚencodeÚUnicodeEncodeError©r   r   r   r   Úis_asciiL   s
    r0   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_punctuationT   s    
r7   c                 C   s:   t  | ¡}d|ksd|krdS t| ƒ}|d kr2dS d|kS )NÚSÚNTFZFormsr2   r4   r   r   r   Ú	is_symbolc   s    
r:   c                 C   s   t | ƒ}|d krdS d|kS )NFZ	Emoticons)r*   )r   r6   r   r   r   Úis_emoticonr   s    r;   c                 C   s&   |   ¡ s| dkrdS t | ¡}d|kS )N>   ú;ú>ú+ú<õ   ï½œú,TÚZ)Úisspacer   r3   ©r   r5   r   r   r   Úis_separator|   s    
rE   c                 C   s   |   ¡ |  ¡ kS ©N)ÚislowerÚisupperr/   r   r   r   Úis_case_variable†   s    rI   c                 C   s   t  | ¡}|dkS )NÚCo)r   r3   rD   r   r   r   Úis_private_use_only‹   s    
rK   c                 C   s.   zt  | ¡}W n tk
r$   Y dS X d|kS )NFÚCJKr   ©r   Zcharacter_namer   r   r   Úis_cjk‘   s
    rN   c                 C   s.   zt  | ¡}W n tk
r$   Y dS X d|kS )NFZHIRAGANAr   rM   r   r   r   Úis_hiragana›   s
    rO   c                 C   s.   zt  | ¡}W n tk
r$   Y dS X d|kS )NFZKATAKANAr   rM   r   r   r   Úis_katakana¥   s
    rP   c                 C   s.   zt  | ¡}W n tk
r$   Y dS X d|kS )NFZHANGULr   rM   r   r   r   Ú	is_hangul¯   s
    rQ   c                 C   s.   zt  | ¡}W n tk
r$   Y dS X d|kS )NFZTHAIr   rM   r   r   r   Úis_thai¹   s
    rR   )r)   r   c                    s   t ‡ fdd„tD ƒƒS )Nc                 3   s   | ]}|ˆ kV  qd S rF   r   )Ú.0Úkeyword©r)   r   r   Ú	<genexpr>Å   s     z-is_unicode_range_secondary.<locals>.<genexpr>)Úanyr   rU   r   rU   r   Úis_unicode_range_secondaryÃ   s    rX   é   )ÚsequenceÚsearch_zoner   c                 C   s    t | tƒst‚t| ƒ}tt| dt||ƒ… jddd�ƒ}t|ƒdkrHdS |D ]N}| ¡  	dd¡}t
 ¡ D ]0\}}||kr„|    S ||krh|    S qhqLdS )zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    Nr,   Úignore©Úerrorsr   ú-Ú_)Ú
isinstanceÚbytesÚ	TypeErrorÚlenr   r   ÚminÚdecodeÚlowerÚreplacer   r(   )rZ   r[   Zseq_lenÚresultsZspecified_encodingÚencoding_aliasÚencoding_ianar   r   r   Úany_specified_encodingÈ   s"    
þrl   é€   )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_16Úutf_7Ú	utf_16_beÚ	utf_16_leÚ	utf_8_sigÚutf_8Ú	utf_32_beÚ	utf_32_leÚutf_32úencodings.{})Ú
issubclassÚ	importlibÚimport_moduleÚformatr   r   )r   r   r   r   Úis_multi_byte_encodingå   s    
þör|   )rZ   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   ra   rb   Ú
startswith)rZ   Úiana_encodingZmarksÚmarkr   r   r   Úidentify_sig_or_bomú   s    

r�   )r   r   c                 C   s   | dkS )N>   rv   rn   r   )r   r   r   r   Úshould_strip_sig_or_bom  s    r‚   T)Úcp_nameÚstrictr   c                 C   sL   |   ¡  dd¡} t ¡ D ]\}}| ||fkr|  S q|rHtd | ¡ƒ‚| S )Nr_   r`   z Unable to retrieve IANA for '{}')rg   rh   r   r(   r   r{   )rƒ   r„   rj   rk   r   r   r   Ú	iana_name  s    
r…   )Údecoded_sequencer   c                 C   s4   t ƒ }| D ] }t|ƒ}|d kr q
| |¡ q
t|ƒS rF   )Úsetr*   ÚaddÚlist)r†   Úrangesr   r6   r   r   r   Ú
range_scan  s    r‹   )Ú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        rw   r\   r]   r   éÿ   r   éþ   )r|   ry   rz   r{   r   Úrangerb   rf   )	rŒ   r�   Z	decoder_aZ	decoder_bZid_aZid_bZcharacter_match_countÚiZto_be_decodedr   r   r   Úcp_similarity+  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_similar@  s    
þr“   Zcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)s)r   ÚlevelÚformat_stringr   c                 C   s:   t  | ¡}| |¡ t  ¡ }| t  |¡¡ | |¡ d S rF   )ÚloggingÚ	getLoggerÚsetLevelÚStreamHandlerÚsetFormatterÚ	FormatterÚ
addHandler)r   r”   r•   ÚloggerÚhandlerr   r   r   Úset_logging_handlerK  s
    

rŸ   )rY   )T)=Zunicodedata2r   ÚImportErrorry   r–   Úcodecsr   Zencodings.aliasesr   Ú	functoolsr   Úrer   Útypingr   r   r   r	   r
   Z_multibytecodecr   Zconstantr   r   r   r   r   r   ÚstrÚboolr   r&   r*   r+   r0   r7   r:   r;   rE   rI   rK   rN   rO   rP   rQ   rR   rd   rX   rb   r$   rl   r|   r�   r‚   r…   r‹   Úfloatr’   r“   ÚINFOrŸ   r   r   r   r   Ú<module>   s|    

							ýü