o
    ßý°j*7  ã                   @  s8  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% dsdd„Z&dtdd„Z'dudd„Z(e)dd„ e *¡ D ƒƒZ+de,d< dd„ e+D ƒZ-de,d< dvdd„Z.dtdd „Z/dtd!d"„Z0dtd#d$„Z1dtd%d&„Z2dtd'd(„Z3dtd)d*„Z4dtd+d,„Z5dtd-d.„Z6dtd/d0„Z7dtd1d2„Z8dtd3d4„Z9dtd5d6„Z:dtd7d8„Z;dtd9d:„Z<dwd<d=„Z=dtd>d?„Z>	@dxdydDdE„Z?e
ddF�dzdHdI„ƒZ@d{dKdL„ZAd|dNdO„ZBd}d~dSdT„ZCddXdY„ZDd€dZd[„ZEd\ejFd]fd�dadb„ZG		cd‚dƒdqdr„ZHdS )„é    )Ú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Ú	characterÚstrÚreturnÚintc                 C  s  zt  | ¡}W n
 ty   Y dS w d}d|v r|tO }d|v r$|tO }d|v r,|tO }d|v r<|tO }d|v r<|tO }d|v rD|tO }d|v rL|t	O }d	|v r\|t
O }d
|v r\|tO }d|v se| d¡ri|tO }d|v rq|tO }|dv ry|tO }tD ]}||v rˆ|tO } |S q{|S )zRCompute all name-based classification flags with a single unicodedata.name() call.r   ÚLATINÚCJKÚHANGULÚKATAKANAÚ	HALFWIDTHÚHIRAGANAÚTHAIÚARABICzISOLATED FORMÚLIGATUREz	LETTER AEÚSUPERSCRIPT>   úINVERTED QUESTION MARKúINVERTED EXCLAMATION MARK)ÚunicodedataÚnameÚ
ValueErrorr   r   r   r   r   r   r   r   r   Úendswithr   r   r   r   r   )r    ÚdescÚflagsÚkw© r7   ú‹/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/charset_normalizer/utils.pyÚ_character_flags'   sJ   ÿür9   Úboolc                 C  ó   t t| ƒt@ ƒS ©N)r:   r9   r   ©r    r7   r7   r8   Úis_accentuatedQ   ó   r>   c                 C  s.   t  | ¡}|s	| S | d¡}tt|d dƒƒS )Nú r   é   )r0   ÚdecompositionÚsplitÚchrr#   )r    Ú
decomposedÚcodesr7   r7   r8   Úremove_accentU   s
   

rG   c                 c  s"   � | ]\}}|j |j|fV  qd S r<   )ÚstartÚstop)Ú.0r1   Ú	ord_ranger7   r7   r8   Ú	<genexpr>a   s
   € ÿ
ÿrL   zlist[tuple[int, int, str]]Ú_UNICODE_RANGES_SORTEDc                 C  s   g | ]}|d  ‘qS )r   r7   )rJ   Úer7   r7   r8   Ú
<listcomp>e   s    rO   z	list[int]Ú_UNICODE_RANGE_STARTSú
str | Nonec                 C  sT   t | ƒ}|dk r
dS |dk rdS tt|ƒd }|dkr(t| \}}}||k r(|S dS )zK
    Retrieve the Unicode range official name from a single character.
    é    zControl characteré€   zBasic Latinr   r   N)Úordr   rP   rM   )r    Úcharacter_ordÚidxrH   rI   r1   r7   r7   r8   Úunicode_rangeh   s   rW   c                 C  r;   r<   )r:   r9   r   r=   r7   r7   r8   Úis_latin}   r?   rX   c                 C  s2   t  | ¡}d|v rdS t| ƒ}|d u rdS d|v S )NÚPTFÚPunctuation©r0   ÚcategoryrW   ©r    Úcharacter_categoryÚcharacter_ranger7   r7   r8   Úis_punctuation�   s   
r`   c                 C  sB   t  | ¡}d|v sd|v rdS t| ƒ}|d u rdS d|v o |dkS )NÚSÚNTFÚFormsÚLor[   r]   r7   r7   r8   Ú	is_symbol�   s   
re   c                 C  s$   t | ƒ}|d u r
dS d|v pd|v S )NFÚ	EmoticonsÚPictographs)rW   )r    r_   r7   r7   r8   Úis_emoticon�   s   rh   c                 C  s.   |   ¡ s| dv r
dS t | ¡}d|v p|dv S )N>   õ   ï½œú+ú<ú>TÚZ>   ÚPcÚPdÚPo)Úisspacer0   r\   )r    r^   r7   r7   r8   Úis_separator¦   s   
rr   c                 C  s   |   ¡ |  ¡ kS r<   )ÚislowerÚisupperr=   r7   r7   r8   Úis_case_variable¯   r?   ru   c                 C  r;   r<   )r:   r9   r   r=   r7   r7   r8   Úis_cjk³   r?   rv   c                 C  r;   r<   )r:   r9   r   r=   r7   r7   r8   Úis_hiragana·   r?   rw   c                 C  r;   r<   )r:   r9   r   r=   r7   r7   r8   Úis_katakana»   r?   rx   c                 C  r;   r<   )r:   r9   r   r=   r7   r7   r8   Ú	is_hangul¿   r?   ry   c                 C  r;   r<   )r:   r9   r   r=   r7   r7   r8   Úis_thaiÃ   r?   rz   c                 C  r;   r<   )r:   r9   r   r=   r7   r7   r8   Ú	is_arabicÇ   r?   r{   c                 C  r;   r<   )r:   r9   r   r=   r7   r7   r8   Úis_arabic_isolated_formË   r?   r|   c                 C  s   | t vS r<   )r   r=   r7   r7   r8   Úis_cjk_uncommonÏ   ó   r}   Ú
range_namec                 C  s   | t v S r<   )r   )r   r7   r7   r8   Úis_unicode_range_secondaryÓ   r~   r€   c                 C  s$   |   ¡  o|  ¡  o| dko| dkS )Núu   ï»¿)rq   Úisprintabler=   r7   r7   r8   Úis_unprintable×   s   
ÿþürƒ   é    Úsequenceúbytes | bytearrayÚsearch_zonec           	      C  sš   t | ttfƒs	t‚t| ƒ}| dt||ƒ… }| ¡ }d|vr$d|vr$dS |jddd�}t 	|¡D ]}| 
d¡ ¡  dd	¡}t |¡}|durJ|  S q0d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)	r…   r‡   Úseq_lenÚsearch_bytesÚlowered_bytesÚdecoded_zoneÚmatchÚspecified_encodingÚencoding_ianar7   r7   r8   Úany_specified_encodingá   s   
ÿr¡   )Úmaxsizer1   c                 C  sJ   | t v rdS tD ]}zt |¡ | ¡ W  dS  tttfy"   Y qw dS )zQ
    Verify is a specific encoding is a multi byte one based on it IANA name
    TF)r   r   Ú	importlibÚimport_moduleÚgetcodecÚImportErrorÚAttributeErrorÚLookupError)r1   Úproviderr7   r7   r8   Úis_multi_byte_encodingý   s   	þÿrª   útuple[str | None, bytes]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   rŽ   r�   Ú
startswith)r…   Úiana_encodingÚmarksÚmarkr7   r7   r8   Úidentify_sig_or_bom  s   

ÿÿr±   r®   c                 C  s   | dvS )N>   Úutf_16Úutf_32r7   )r®   r7   r7   r8   Úshould_strip_sig_or_bom(  r~   r´   TÚcp_nameÚstrictc                 C  s>   |   ¡  dd¡} t | ¡}|dur|S |rtd| › d�ƒ‚| S )zIReturns the Python normalized encoding name (Not the IANA official name).rŒ   r�   NzUnable to retrieve IANA for 'ú')r”   r˜   r   r™   r2   )rµ   r¶   r    r7   r7   r8   Ú	iana_name,  s   
r¸   Úiana_name_aÚiana_name_bÚfloatc           	      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rA|d7 }q,|d S )Ng        z
encodings.r‰   rŠ   r   é   r   )rª   r£   r¤   r   Úranger�   r•   )	r¹   rº   Ú	decoder_aÚ	decoder_bÚid_aÚid_bÚcharacter_match_countÚiÚto_be_decodedr7   r7   r8   Úcp_similarity:  s   


€rÅ   c                 C  s   | t v o	|t |  v 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º   r7   r7   r8   Úis_cp_similarN  s   
þrÆ   Úcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sÚlevelÚformat_stringÚNonec                 C  s:   t  | ¡}| |¡ t  ¡ }| t  |¡¡ | |¡ d S r<   )ÚloggingÚ	getLoggerÚsetLevelÚStreamHandlerÚsetFormatterÚ	FormatterÚ
addHandler)r1   rÈ   rÉ   ÚloggerÚhandlerr7   r7   r8   Úset_logging_handlerY  s
   

rÔ   FÚ	sequencesr    Úoffsetsr½   Ú
chunk_sizeÚbom_or_sig_availableÚstrip_sig_or_bomÚsig_payloadr�   Úis_multi_byte_decoderÚdecoded_payloadÚdeferred_decodingúGenerator[str, None, None]c
                 c  s$  � |r-|  d¡r-t|ƒ}
t| ƒ}|D ]}||
 | }|||| … }|s' d S |V  qd S |rH|sH|D ]}|||| … }|sB d S |V  q3d S |	rp|sN| n| t|ƒd … }|D ]}|||| … }|sg d S t||ƒV  qXd S |D ]�}|| }|t| ƒd kr�qr| ||| … }|r‘|s‘|| }|j||r˜dndd�}|�r|dk�rt|dƒ}|d |… }d}|rÖt|ƒ}
||
 t| ƒ }td|t ƒ}t|
|t ƒ}| |||¡dk}|�r|�s||v�rt||d	 d
ƒD ]"}| ||… }|rù|sù|| }|j|dd�}|d |… |v �r nqé|V  qrd S )NÚiso2022_é   r‰   r¶   rŠ   r   rA   Fé   éÿÿÿÿ)	r­   r’   r!   r•   r“   Úmaxr   Úfindr½   )rÕ   r    rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   Údecoded_lengthÚsequence_lengthrÃ   Údecoded_offsetÚchunkÚ
base_bytesÚcut_sequenceÚ	chunk_endÚchunk_partial_size_chkÚchunk_prefixÚfound_nearbyÚexpected_offsetÚsearch_startÚ
search_endÚjr7   r7   r8   Úcut_sequence_chunksf  sˆ   €ûüÿü
þ
ÿÿÿÿþ
ÿÎró   )r    r!   r"   r#   )r    r!   r"   r:   )r    r!   r"   r!   )r    r!   r"   rQ   )r   r!   r"   r:   )r„   )r…   r†   r‡   r#   r"   rQ   )r1   r!   r"   r:   )r…   r†   r"   r«   )r®   r!   r"   r:   )T)rµ   r!   r¶   r:   r"   r!   )r¹   r!   rº   r!   r"   r»   )r¹   r!   rº   r!   r"   r:   )r1   r!   rÈ   r#   rÉ   r!   r"   rÊ   )NF)rÕ   r†   r    r!   rÖ   r½   r×   r#   rØ   r:   rÙ   r:   rÚ   r�   rÛ   r:   rÜ   rQ   rÝ   r:   r"   rÞ   )IÚ
__future__r   r£   rË   r0   Úbisectr   Úcodecsr   Ú	functoolsr   Útypingr   Úconstantr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   r>   rG   ÚsortedÚitemsrM   Ú__annotations__rP   rW   rX   r`   re   rh   rr   ru   rv   rw   rx   ry   rz   r{   r|   r}   r€   rƒ   r¡   rª   r±   r´   r¸   rÅ   rÆ   ÚINFOrÔ   ró   r7   r7   r7   r8   Ú<module>   sb    h

*
þ





	
	









ÿ



ýö