U
    £�©j*7  ã                   @  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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m Z m!Z!m"Z"m#Z#m$Z$m%Z% d	d
dœdd„Z&d	ddœdd„Z'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!„Z0d	ddœd"d#„Z1d	ddœd$d%„Z2d	ddœd&d'„Z3d	ddœd(d)„Z4d	ddœd*d+„Z5d	ddœd,d-„Z6d	ddœd.d/„Z7d	ddœd0d1„Z8d	ddœd2d3„Z9d	ddœd4d5„Z:d	ddœd6d7„Z;d	ddœd8d9„Z<d	dd:œd;d<„Z=d	ddœd=d>„Z>dfd@d
ddAœdBdC„Z?e
ddD�d	ddEœdFdG„ƒZ@d@dHdIœdJdK„ZAd	ddLœdMdN„ZBdgd	dd	dPœdQdR„ZCd	d	dSdTœdUdV„ZDd	d	ddTœdWdX„ZEdYejFdZfd	d
d	d[d\œd]d^„ZGdhd@d	d`d
dddaddddbdcœddde„ZHdS )ié    )ÚannotationsN)Úbisect_right)ÚIncrementalDecoder)Ú	lru_cache)Ú	Generatoré   )ÚENCODING_MARKSÚIANA_SUPPORTED_SIMILARÚRE_POSSIBLE_ENCODING_INDICATIONÚUNICODE_RANGES_COMBINEDÚ_SECONDARY_RANGE_NAMESÚCOMMON_CJK_CHARACTERSÚ_LATINÚ_CJKÚ_HANGULÚ	_KATAKANAÚ	_HIRAGANAÚ_HALFWIDTH_KATAKANAÚ_THAIÚ_ARABICÚ_ARABIC_ISOLATED_FORMÚ	_LIGATUREÚ_SUPERSCRIPTÚ_SENTENCE_OPEN_PUNCTUATIONÚ_ACCENT_KEYWORDSÚ_ACCENTUATEDÚ_KNOWN_MB_DECODERSÚ_KNOWN_MB_CLASSESÚ_IANA_NAMESÚ_MULTIBYTE_SEARCH_RADIUSÚ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rz|tO }d|krz|tO }d|krŠ|tO }d|krš|t	O }d	|krº|t
O }d
|krº|tO }d|ksÌ| d¡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	HALFWIDTHZHIRAGANAZTHAIZARABICzISOLATED FORMZLIGATUREz	LETTER AEZSUPERSCRIPT>   úINVERTED EXCLAMATION MARKúINVERTED QUESTION MARK)ÚunicodedataÚnameÚ
ValueErrorr   r   r   r   r   r   r   r   r   Úendswithr   r   r   r   r   )r"   ÚdescÚflagsÚkw© r.   ú</tmp/pip-unpacked-wheel-bwd693va/charset_normalizer/utils.pyÚ_character_flags'   sD    r0   Úboolc                 C  s   t t| ƒt@ ƒS ©N)r1   r0   r   ©r"   r.   r.   r/   Úis_accentuatedQ   s    r4   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_accentU   s
    

r;   c                 c  s    | ]\}}|j |j|fV  qd S r2   )ÚstartÚstop)Ú.0r(   Z	ord_ranger.   r.   r/   Ú	<genexpr>a   s   ÿr?   zlist[tuple[int, int, str]]Ú_UNICODE_RANGES_SORTEDc                 C  s   g | ]}|d  ‘qS )r   r.   )r>   Úer.   r.   r/   Ú
<listcomp>e   s     rB   z	list[int]Ú_UNICODE_RANGE_STARTSz
str | Nonec                 C  sT   t | ƒ}|dk rdS |dk r dS tt|ƒd }|dkrPt| \}}}||k rP|S dS )zK
    Retrieve the Unicode range official name from a single character.
    é    zControl characteré€   zBasic Latinr   r   N)Úordr   rC   r@   )r"   Zcharacter_ordÚidxr<   r=   r(   r.   r.   r/   Úunicode_rangeh   s    rH   c                 C  s   t t| ƒt@ ƒS r2   )r1   r0   r   r3   r.   r.   r/   Úis_latin}   s    rI   c                 C  s2   t  | ¡}d|krdS t| ƒ}|d kr*dS d|kS )NÚPTFZPunctuation©r'   ÚcategoryrH   ©r"   Úcharacter_categoryÚcharacter_ranger.   r.   r/   Úis_punctuation�   s    
rP   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LorK   rM   r.   r.   r/   Ú	is_symbol�   s    
rS   c                 C  s$   t | ƒ}|d krdS d|kp"d|kS )NFZ	EmoticonsZPictographs)rH   )r"   rO   r.   r.   r/   Úis_emoticon�   s    rT   c                 C  s.   |   ¡ s| dkrdS t | ¡}d|kp,|dkS )N>   ú+ú<ú>õ   ï½œTÚZ>   ÚPcÚPoÚPd)Úisspacer'   rL   )r"   rN   r.   r.   r/   Úis_separator¦   s    
r^   c                 C  s   |   ¡ |  ¡ kS r2   )ÚislowerÚisupperr3   r.   r.   r/   Úis_case_variable¯   s    ra   c                 C  s   t t| ƒt@ ƒS r2   )r1   r0   r   r3   r.   r.   r/   Úis_cjk³   s    rb   c                 C  s   t t| ƒt@ ƒS r2   )r1   r0   r   r3   r.   r.   r/   Úis_hiragana·   s    rc   c                 C  s   t t| ƒt@ ƒS r2   )r1   r0   r   r3   r.   r.   r/   Úis_katakana»   s    rd   c                 C  s   t t| ƒt@ ƒS r2   )r1   r0   r   r3   r.   r.   r/   Ú	is_hangul¿   s    re   c                 C  s   t t| ƒt@ ƒS r2   )r1   r0   r   r3   r.   r.   r/   Úis_thaiÃ   s    rf   c                 C  s   t t| ƒt@ ƒS r2   )r1   r0   r   r3   r.   r.   r/   Ú	is_arabicÇ   s    rg   c                 C  s   t t| ƒt@ ƒS r2   )r1   r0   r   r3   r.   r.   r/   Úis_arabic_isolated_formË   s    rh   c                 C  s   | t kS r2   )r   r3   r.   r.   r/   Úis_cjk_uncommonÏ   s    ri   )Ú
range_namer#   c                 C  s   | t kS r2   )r   )rj   r.   r.   r/   Úis_unicode_range_secondaryÓ   s    rk   c                 C  s$   |   ¡  o"|  ¡  o"| dko"| dkS )Núu   ï»¿)r]   Úisprintabler3   r.   r.   r/   Úis_unprintable×   s    
ÿþürn   é    zbytes | bytearray)ÚsequenceÚsearch_zoner#   c           	      C  sš   t | ttfƒst‚t| ƒ}| dt||ƒ… }| ¡ }d|krHd|krHdS |jddd�}t 	|¡D ]4}| 
d¡ ¡  dd	¡}t |¡}|dk	r`|  S q`dS )
zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    Ns   codings   charsetÚasciiÚignore©Úerrorsr   ú-Ú_)Ú
isinstanceÚbytesÚ	bytearrayÚ	TypeErrorÚlenÚminÚlowerÚdecoder
   ÚfinditerÚgroupÚreplacer   Úget)	rp   rq   Zseq_lenZsearch_bytesZlowered_bytesZdecoded_zoneÚmatchZspecified_encodingÚencoding_ianar.   r.   r/   Úany_specified_encodingá   s    

r†   )Úmaxsize)r(   r#   c                 C  sR   | t krdS t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
    TF)r   r   Ú	importlibÚimport_moduleZgetcodecÚImportErrorÚAttributeErrorÚLookupError)r(   Zproviderr.   r.   r/   Úis_multi_byte_encodingý   s    	
r�   ztuple[str | None, bytes])rp   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   rx   ry   Ú
startswith)rp   Úiana_encodingZmarksÚmarkr.   r.   r/   Úidentify_sig_or_bom  s    

r’   )r�   r#   c                 C  s   | dkS )N>   Úutf_16Úutf_32r.   )r�   r.   r.   r/   Úshould_strip_sig_or_bom(  s    r•   T)Úcp_nameÚstrictr#   c                 C  s>   |   ¡  dd¡} t | ¡}|dk	r&|S |r:td| › d�ƒ‚| S )zIReturns the Python normalized encoding name (Not the IANA official name).rv   rw   NzUnable to retrieve IANA for 'ú')r~   r‚   r   rƒ   r)   )r–   r—   r…   r.   r.   r/   Ú	iana_name,  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.rs   rt   r   é   r   )r�   rˆ   r‰   r   Úrangery   r   )	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_similarN  s    
þr¡   Zcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sÚNone)r(   ÚlevelÚformat_stringr#   c                 C  s:   t  | ¡}| |¡ t  ¡ }| t  |¡¡ | |¡ d S r2   )ÚloggingÚ	getLoggerÚsetLevelÚStreamHandlerÚsetFormatterÚ	FormatterÚ
addHandler)r(   r£   r¤   ÚloggerÚhandlerr.   r.   r/   Úset_logging_handlerY  s
    

r®   Frž   ry   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  s.  |rV|  d¡rVt|ƒ}
t| ƒ}|D ].}||
 | }|||| … }|sJ qR|V  q"�nÔ|rŠ|sŠ|D ]"}|||| … }|s~ q†|V  qb�n |	rØ|s–| n| t|ƒd … }|D ](}|||| … }|sÆ qÔt||ƒV  qª�nR|D �]J}|| }|t| ƒd krüqÜ| ||| … }|�r |�s || }|j||�r0dndd�}|�r"|dk�r"t|dƒ}|d |… }d}|�r®t|ƒ}
||
 t| ƒ }td|t ƒ}t|
|t ƒ}| |||¡dk}|�r"|�s"||k�r"t||d	 d
ƒD ]L}| ||… }|�rø|�sø|| }|j|dd�}|d |… |k�rÔ �q"�qÔ|V  qÜd S )NZiso2022_é   rs   r—   rt   r   r6   Fé   éÿÿÿÿ)	r�   r|   r    r   r}   Úmaxr   Úfindrž   )r¯   r…   r°   r±   r²   r³   r´   rµ   r¶   r·   Zdecoded_lengthZsequence_lengthrŸ   Zdecoded_offsetÚchunkZ
base_bytesZcut_sequenceZ	chunk_endZchunk_partial_size_chkZchunk_prefixZfound_nearbyZexpected_offsetZsearch_startZ
search_endÚjr.   r.   r/   Úcut_sequence_chunksf  s€    ÿ
þ
 ÿÿÿÿþý
r¿   )ro   )T)NF)IÚ
__future__r   rˆ   r¥   r'   Úbisectr   Úcodecsr   Ú	functoolsr   Útypingr   Zconstantr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r4   r;   ÚsortedÚitemsr@   Ú__annotations__rC   rH   rI   rP   rS   rT   r^   ra   rb   rc   rd   re   rf   rg   rh   ri   rk   rn   r†   r�   r’   r•   r™   r    r¡   ÚINFOr®   r¿   r.   r.   r.   r/   Ú<module>   sb    h*þ		 ÿý  ö