o
    õ·i 1  ã                   @  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 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$ eed�dudd„ƒZ%eed�dvdd„ƒZ&eed�dwdd„ƒZ'e(dd„ e )¡ D ƒƒZ*de+d< dd„ e*D ƒZ,de+d< eed�dxd!d"„ƒZ-eed�dvd#d$„ƒZ.eed�dvd%d&„ƒZ/eed�dvd'd(„ƒZ0eed�dvd)d*„ƒZ1eed�dvd+d,„ƒZ2eed�dvd-d.„ƒZ3eed�dvd/d0„ƒZ4eed�dvd1d2„ƒZ5eed�dvd3d4„ƒZ6eed�dvd5d6„ƒZ7eed�dvd7d8„ƒZ8eed�dvd9d:„ƒZ9eed�dvd;d<„ƒZ:eed�dvd=d>„ƒZ;ee<eƒd�dyd@dA„ƒZ=eed�dvdBdC„ƒZ>	Ddzd{dHdI„Z?edJd�d|dLdM„ƒZ@d}dOdP„ZAd~dRdS„ZBdd€dWdX„ZCd�d\d]„ZDd‚d^d_„ZEd`ejFdafdƒdedf„ZG	d„d…dsdt„ZHdS )†é    )ÚannotationsN)Úbisect_right)ÚIncrementalDecoder)Úaliases)Ú	lru_cache)Úfindall)Ú	Generator)ÚMultibyteIncrementalDecoderé   )ÚENCODING_MARKSÚIANA_SUPPORTED_SIMILARÚRE_POSSIBLE_ENCODING_INDICATIONÚUNICODE_RANGES_COMBINEDÚUNICODE_SECONDARY_RANGE_KEYWORDÚUTF8_MAXIMAL_ALLOCATIONÚCOMMON_CJK_CHARACTERSÚ_LATINÚ_CJKÚ_HANGULÚ	_KATAKANAÚ	_HIRAGANAÚ_THAIÚ_ARABICÚ_ARABIC_ISOLATED_FORMÚ_ACCENT_KEYWORDSÚ_ACCENTUATED)ÚmaxsizeÚ	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   ZLATINÚCJKZHANGULZKATAKANAZHIRAGANAZTHAIZARABICzISOLATED FORMN)ÚunicodedataÚnameÚ
ValueErrorr   r   r   r   r   r   r   r   r   r   )r   ÚdescÚflagsÚkw© r(   ú^C:\Users\psant\Downloads\PAF backend\school\venv\Lib\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_accentuatedI   ó   r/   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_accentN   s
   

r7   c                 c  s"   � | ]\}}|j |j|fV  qd S r-   )ÚstartÚstop)Ú.0r#   Z	ord_ranger(   r(   r)   Ú	<genexpr>[   s
   € ÿ
ÿr;   zlist[tuple[int, int, str]]Ú_UNICODE_RANGES_SORTEDc                 C  s   g | ]}|d  ‘qS )r   r(   )r:   Úer(   r(   r)   Ú
<listcomp>_   s    r>   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   r?   r<   )r   Zcharacter_ordÚidxr8   r9   r#   r(   r(   r)   Úunicode_rangeb   s   rC   c                 C  r,   r-   )r+   r*   r   r.   r(   r(   r)   Úis_latins   r0   rD   c                 C  s2   t  | ¡}d|v rdS t| ƒ}|d u rdS d|v S )NÚPTFZPunctuation©r"   ÚcategoryrC   ©r   Úcharacter_categoryÚcharacter_ranger(   r(   r)   Úis_punctuationx   s   
rK   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ÚNTFZFormsZLorF   rH   r(   r(   r)   Ú	is_symbol‡   s   
rN   c                 C  s$   t | ƒ}|d u r
dS d|v pd|v S )NFZ	EmoticonsZPictographs)rC   )r   rJ   r(   r(   r)   Úis_emoticon–   s   rO   c                 C  s.   |   ¡ s| dv r
dS t | ¡}d|v p|dv S )N>   ú>ú<u   ï½œú+TÚZ>   ZPdZPcZPo)Úisspacer"   rG   )r   rI   r(   r(   r)   Úis_separator    s   
rU   c                 C  s   |   ¡ |  ¡ kS r-   )ÚislowerÚisupperr.   r(   r(   r)   Úis_case_variableª   r0   rX   c                 C  r,   r-   )r+   r*   r   r.   r(   r(   r)   Úis_cjk¯   r0   rY   c                 C  r,   r-   )r+   r*   r   r.   r(   r(   r)   Úis_hiragana´   r0   rZ   c                 C  r,   r-   )r+   r*   r   r.   r(   r(   r)   Úis_katakana¹   r0   r[   c                 C  r,   r-   )r+   r*   r   r.   r(   r(   r)   Ú	is_hangul¾   r0   r\   c                 C  r,   r-   )r+   r*   r   r.   r(   r(   r)   Úis_thaiÃ   r0   r]   c                 C  r,   r-   )r+   r*   r   r.   r(   r(   r)   Ú	is_arabicÈ   r0   r^   c                 C  r,   r-   )r+   r*   r   r.   r(   r(   r)   Úis_arabic_isolated_formÍ   r0   r_   c                 C  s   | t vS r-   )r   r.   r(   r(   r)   Úis_cjk_uncommonÒ   s   r`   Ú
range_namec                   s   t ‡ fdd„tD ƒƒS )Nc                 3  s   � | ]}|ˆ v V  qd S r-   r(   )r:   Úkeyword©ra   r(   r)   r;   Ù   s   € z-is_unicode_range_secondary.<locals>.<genexpr>)Úanyr   rc   r(   rc   r)   Úis_unicode_range_secondary×   s   re   c                 C  s(   |   ¡ du o|  ¡ du o| dko| dkS )NFúu   ï»¿)rT   Úisprintabler.   r(   r(   r)   Úis_unprintableÜ   s   
ÿþürh   é    Úsequenceúbytes | bytearrayÚsearch_zonec                 C  s¤   t | ttfƒs	t‚t| ƒ}tt| dt||ƒ… jddd�ƒ}t|ƒdkr&dS |D ]'}| 	¡  
dd¡}t ¡ D ]\}}||krD|    S ||krN|    S q6q(dS )zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    NÚasciiÚignore©Úerrorsr   ú-Ú_)Ú
isinstanceÚbytesÚ	bytearrayÚ	TypeErrorÚlenr   r   ÚminÚdecodeÚlowerÚreplacer   Úitems)rj   rl   Zseq_lenÚresultsZspecified_encodingÚencoding_aliasÚencoding_ianar(   r(   r)   Úany_specified_encodingç   s&   þÿýr€   é€   r#   c                 C  s    | dv 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_beÚutf_8Úutf_32Ú	utf_32_leÚutf_16Ú	utf_16_leZ	utf_8_sigÚutf_7Ú	utf_32_beú
encodings.N)Ú
issubclassÚ	importlibÚimport_moduler   r	   )r#   r(   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ó    N)r   rs   rt   Ú
startswith)rj   Úiana_encodingZ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_bom0  s   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).rq   rr   zUnable to retrieve IANA for 'ú'N)rz   r{   r   r|   r$   )r–   r—   r~   r   r(   r(   r)   Ú	iana_name4  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        rŠ   rn   ro   r   é   r
   )rŽ   rŒ   r�   r   Úrangert   ry   )	rš   r›   Z	decoder_aZ	decoder_bZid_aZid_bZcharacter_match_countÚiZto_be_decodedr(   r(   r)   Úcp_similarityE  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.
    N)r   )rš   r›   r(   r(   r)   Úis_cp_similarY  s   
þr¡   Z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)r#   r¢   r£   ÚloggerÚhandlerr(   r(   r)   Úset_logging_handlerd  s
   

r®   Ú	sequencesr   Úoffsetsrž   Ú
chunk_sizeÚbom_or_sig_availableÚstrip_sig_or_bomÚsig_payloadrt   Úis_multi_byte_decoderÚdecoded_payloadúGenerator[str, None, None]c	                 c  s&  � |r|du r|D ]}	||	|	| … }
|
s d S |
V  q	d S |D ]p}	|	| }|t | ƒd kr/q | |	|	| … }|rA|du rA|| }|j||rHdndd�}
|r�|	dkr�t|dƒ}|r�|
d |… |vr�t|	|	d d	ƒD ]#}| ||… }|r{|du r{|| }|j|dd�}
|
d |… |v rŒ q�qi|
V  q d S )
NFé   rn   r—   ro   r   r2   é   éÿÿÿÿ)rw   ry   rx   rž   )r¯   r   r°   r±   r²   r³   r´   rµ   r¶   rŸ   ÚchunkZ	chunk_endZcut_sequenceZchunk_partial_size_chkÚjr(   r(   r)   Úcut_sequence_chunksq  sF   €ü
þ
ÿþÿÝr½   )r   r   r   r    )r   r   r   r+   )r   r   r   r   )r   r   r   r@   )ra   r   r   r+   )ri   )rj   rk   rl   r    r   r@   )r#   r   r   r+   )rj   rk   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¤   r-   )r¯   rk   r   r   r°   rž   r±   r    r²   r+   r³   r+   r´   rt   rµ   r+   r¶   r@   r   r·   )IÚ
__future__r   rŒ   r¥   r"   Úbisectr   Úcodecsr   Zencodings.aliasesr   Ú	functoolsr   Úrer   Útypingr   Z_multibytecodecr	   Zconstantr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r/   r7   Úsortedr|   r<   Ú__annotations__r?   rC   rD   rK   rN   rO   rU   rX   rY   rZ   r[   r\   r]   r^   r_   r`   rw   re   rh   r€   rŽ   r”   r•   r™   r    r¡   ÚINFOr®   r½   r(   r(   r(   r)   Ú<module>   sŽ    L"þ		ÿ"



ý÷