o
    ì6Wjá4  ã                   @  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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" dvdd„Z#dwdd„Z$eed�dxdd„ƒZ%e&dd„ e '¡ D ƒƒZ(de)d< dd„ e(D ƒZ*de)d< dyd d!„Z+dwd"d#„Z,dwd$d%„Z-dwd&d'„Z.dwd(d)„Z/dwd*d+„Z0eed�dwd,d-„ƒZ1eed�dwd.d/„ƒZ2eed�dwd0d1„ƒZ3eed�dwd2d3„ƒZ4eed�dwd4d5„ƒZ5eed�dwd6d7„ƒZ6eed�dwd8d9„ƒZ7eed�dwd:d;„ƒZ8eed�dwd<d=„ƒZ9dzd?d@„Z:eed�dwdAdB„ƒZ;	Cd{d|dGdH„Z<edId�d}dKdL„ƒZ=d~dNdO„Z>ddQdR„Z?d€d�dVdW„Z@d‚d[d\„ZAdƒd]d^„ZBd_ejCd`fd„ddde„ZD		fd…d†dtdu„ZEdS )‡é    )Ú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Ú	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 r4|tO }d|v r<|tO }d|v rD|tO }d|v rT|t	O }d	|v rT|t
O }tD ]}||v rc|tO } |S qV|S )
zRCompute all name-based classification flags with a single unicodedata.name() call.r   ÚLATINÚCJKÚHANGULÚKATAKANAÚHIRAGANAÚTHAIÚARABICzISOLATED FORM)ÚunicodedataÚnameÚ
ValueErrorr   r   r   r   r   r   r   r   r   r   )r   ÚdescÚflagsÚkw© r,   úg/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/charset_normalizer/utils.pyÚ_character_flags"   s:   ÿür.   Úboolc                 C  ó   t t| ƒt@ ƒS ©N)r/   r.   r   ©r   r,   r,   r-   Úis_accentuatedD   ó   r3   )Úmaxsizec                 C  s.   t  | ¡}|s	| S | d¡}tt|d dƒƒS )Nú r   é   )r&   ÚdecompositionÚsplitÚchrr   )r   Ú
decomposedÚcodesr,   r,   r-   Úremove_accentH   s
   

r=   c                 c  s"   � | ]\}}|j |j|fV  qd S r1   )ÚstartÚstop)Ú.0r'   Ú	ord_ranger,   r,   r-   Ú	<genexpr>U   s
   € ÿ
ÿrB   zlist[tuple[int, int, str]]Ú_UNICODE_RANGES_SORTEDc                 C  s   g | ]}|d  ‘qS )r   r,   )r@   Úer,   r,   r-   Ú
<listcomp>Y   s    rE   z	list[int]Ú_UNICODE_RANGE_STARTSú
str | Nonec                 C  s<   t | ƒ}tt|ƒd }|dkrt| \}}}||k r|S dS )zK
    Retrieve the Unicode range official name from a single character.
    r	   r   N)Úordr   rF   rC   )r   Úcharacter_ordÚidxr>   r?   r'   r,   r,   r-   Úunicode_range\   s   rK   c                 C  r0   r1   )r/   r.   r   r2   r,   r,   r-   Úis_latinl   r4   rL   c                 C  s2   t  | ¡}d|v rdS t| ƒ}|d u rdS d|v S )NÚPTFÚPunctuation©r&   ÚcategoryrK   ©r   Úcharacter_categoryÚcharacter_ranger,   r,   r-   Úis_punctuationp   s   
rT   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ÚLorO   rQ   r,   r,   r-   Ú	is_symbol~   s   
rY   c                 C  s$   t | ƒ}|d u r
dS d|v pd|v S )NFÚ	EmoticonsÚPictographs)rK   )r   rS   r,   r,   r-   Úis_emoticonŒ   s   r\   c                 C  s.   |   ¡ s| dv r
dS t | ¡}d|v p|dv S )N>   õ   ï½œú+ú<ú>TÚZ>   ÚPcÚPdÚPo)Úisspacer&   rP   )r   rR   r,   r,   r-   Úis_separator•   s   
rf   c                 C  s   |   ¡ |  ¡ kS r1   )ÚislowerÚisupperr2   r,   r,   r-   Úis_case_variablež   ó   ri   c                 C  r0   r1   )r/   r.   r   r2   r,   r,   r-   Úis_cjk£   rj   rk   c                 C  r0   r1   )r/   r.   r   r2   r,   r,   r-   Úis_hiragana¨   rj   rl   c                 C  r0   r1   )r/   r.   r   r2   r,   r,   r-   Úis_katakana­   rj   rm   c                 C  r0   r1   )r/   r.   r   r2   r,   r,   r-   Ú	is_hangul²   rj   rn   c                 C  r0   r1   )r/   r.   r   r2   r,   r,   r-   Úis_thai·   rj   ro   c                 C  r0   r1   )r/   r.   r   r2   r,   r,   r-   Ú	is_arabic¼   rj   rp   c                 C  r0   r1   )r/   r.   r   r2   r,   r,   r-   Úis_arabic_isolated_formÁ   rj   rq   c                 C  s   | t vS r1   )r   r2   r,   r,   r-   Úis_cjk_uncommonÆ   s   rr   Ú
range_namec                 C  s   | t v S r1   )r   )rs   r,   r,   r-   Úis_unicode_range_secondaryË   ó   rt   c                 C  s$   |   ¡  o|  ¡  o| dko| dkS )Núu   ï»¿)re   Úisprintabler2   r,   r,   r-   Úis_unprintableÏ   s   
ÿþürx   é    Úsequenceúbytes | bytearrayÚsearch_zonec           	      C  sÄ   t | ttfƒs	t‚t| ƒ}| dt||ƒ… jddd�}| ¡ }d|vr)d|vr)dS tt	|ƒ}t|ƒdkr6dS |D ]'}| ¡  
dd	¡}t ¡ D ]\}}||krT|    S ||kr^|    S qFq8dS )
zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    NÚasciiÚignore©ÚerrorsÚcodingÚcharsetr   ú-Ú_)Ú
isinstanceÚbytesÚ	bytearrayÚ	TypeErrorÚlenÚminÚdecodeÚlowerr   r   Úreplacer   Úitems)	rz   r|   Úseq_lenÚdecoded_zoneÚlowered_zoneÚresultsÚspecified_encodingÚencoding_aliasÚencoding_ianar,   r,   r-   Úany_specified_encodingÚ   s2   ÿþÿýr–   é€   r'   c                 C  sJ   | dv rdS d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
    >	   Úutf_7Úutf_8Úutf_16Úutf_32Ú	utf_16_beÚ	utf_16_leÚ	utf_32_beÚ	utf_32_leÚ	utf_8_sigT)Ú
_codecs_cnÚ
_codecs_hkÚ_codecs_iso2022Ú
_codecs_jpÚ
_codecs_krÚ
_codecs_twF)Ú	importlibÚimport_moduleÚgetcodecÚImportErrorÚAttributeErrorÚLookupError)r'   Úproviderr,   r,   r-   Ú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)rz   Úiana_encodingÚmarksÚmarkr,   r,   r-   Úidentify_sig_or_bom/  s   

ÿÿrµ   r²   c                 C  s   | dvS )N>   rš   r›   r,   )r²   r,   r,   r-   Úshould_strip_sig_or_bomA  ru   r¶   TÚcp_nameÚstrictc                 C  sN   |   ¡  dd¡} t ¡ D ]\}}| ||fv r|  S q|r%td| › d�ƒ‚| S )zIReturns the Python normalized encoding name (Not the IANA official name).rƒ   r„   zUnable to retrieve IANA for 'ú')rŒ   r�   r   rŽ   r(   )r·   r¸   r”   r•   r,   r,   r-   Ú	iana_nameE  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_decodedr,   r,   r-   Úcp_similarityV  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¼   r,   r,   r-   Úis_cp_similarj  s   
þrÈ   Úcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sÚlevelÚformat_stringÚNonec                 C  s:   t  | ¡}| |¡ t  ¡ }| t  |¡¡ | |¡ d S r1   )ÚloggingÚ	getLoggerÚsetLevelÚStreamHandlerÚsetFormatterÚ	FormatterÚ
addHandler)r'   rÊ   rË   ÚloggerÚhandlerr,   r,   r-   Úset_logging_handleru  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  sj  � |r|s|D ]}
||
|
| … }|s d S |V  qd S |	rD|s"| n| t |ƒd … }|D ]}
||
|
| … }|s; d S t||ƒV  q,d S |D ]l}
|
| }|t | ƒd krUqF| |
|
| … }|re|se|| }|j||rldndd�}|r¯|
dkr¯t|dƒ}|r¯|d |… |vr¯t|
|
d dƒD ]!}| ||… }|r�|s�|| }|j|dd�}|d |… |v r® nq�|V  qFd S )	Né   r~   r¸   r   r   r7   é   éÿÿÿÿ)r‰   r   r‹   rŠ   r¿   )r×   r•   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rÅ   ÚchunkÚ
base_bytesÚcut_sequenceÚ	chunk_endÚchunk_partial_size_chkÚjr,   r,   r-   Úcut_sequence_chunks‚  sV   €üÿü
þ
ÿÿÝrê   )r   r   r   r   )r   r   r   r/   )r   r   r   r   )r   r   r   rG   )rs   r   r   r/   )ry   )rz   r{   r|   r   r   rG   )r'   r   r   r/   )rz   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/   )r'   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Þ   rG   rß   r/   r   rà   )FÚ
__future__r   r§   rÍ   r&   Úbisectr   Úcodecsr   Úencodings.aliasesr   Ú	functoolsr   Úrer   Útypingr   Úconstantr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r3   r=   ÚsortedrŽ   rC   Ú__annotations__rF   rK   rL   rT   rY   r\   rf   ri   rk   rl   rm   rn   ro   rp   rq   rr   rt   rx   r–   r®   rµ   r¶   rº   rÇ   rÈ   ÚINFOrÖ   rê   r,   r,   r,   r-   Ú<module>   s|    L

"þ





		
ÿ+
)


ýö