U
    —ùi¼—  ã                   @  sÊ  U d dl mZ d dlZd dlmZ d dlmZ ddlmZm	Z	m
Z
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 dd
lmZmZmZmZmZmZ e d¡Ze  ¡ Z!e! "e #d¡¡ g Z$de%d< g Z&de%d< eD ]HZ'z"ee'ƒröe$ (e'¡ n
e& (e'¡ W qÜ e)k
�r"   e& (e'¡ Y qÜX qÜe$e& Z*de%d< d,ddddddddddddœdd„Z+d-d ddddddddddd!œd"d#„Z,d.d$ddddddddddd%œd&d'„Z-d/d(ddddddddddd)œd*d+„Z.dS )0é    )ÚannotationsN)ÚPathLike)ÚBinaryIOé   )Úcoherence_ratioÚencoding_languagesÚmb_encoding_languagesÚmerge_coherence_ratios)ÚIANA_SUPPORTEDÚIANA_SUPPORTED_SIMILARÚTOO_BIG_SEQUENCEÚTOO_SMALL_SEQUENCEÚTRACE)Ú
mess_ratio)ÚCharsetMatchÚCharsetMatches)Úany_specified_encodingÚcut_sequence_chunksÚ	iana_nameÚidentify_sig_or_bomÚis_multi_byte_encodingÚshould_strip_sig_or_bomZcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sz	list[str]Ú_mb_supportedÚ_sb_supportedÚIANA_SUPPORTED_MB_FIRSTé   é   çš™™™™™É?TFçš™™™™™¹?zbytes | bytearrayÚintÚfloatzlist[str] | NoneÚboolr   )Ú	sequencesÚstepsÚ
chunk_sizeÚ	thresholdÚcp_isolationÚcp_exclusionÚpreemptive_behaviourÚexplainÚlanguage_thresholdÚenable_fallbackÚreturnc
           @      C  sü  t | ttfƒs td t| ƒ¡ƒ‚|r>tj}
t t	¡ t 
t¡ t| ƒ}|dkrˆt d¡ |rpt t	¡ t 
|
¡ tt| dddg dƒgƒS |dk	r´t td	d
 |¡¡ dd„ |D ƒ}ng }|dk	rät tdd
 |¡¡ dd„ |D ƒ}ng }||| k�rt td|||¡ d}|}|dk�r4|| |k �r4t|| ƒ}t| ƒtk }t| ƒtk}|�rft td |¡¡ n|�r~t td |¡¡ g }|�r�t| ƒnd}|dk	�r¶| |¡ t td|¡ tƒ }g }g }tƒ }tƒ }i }d}tƒ }d}d}d}d}d}d}tƒ }tƒ }t| ƒ\} }!| dk	�r6| | ¡ t tdt|!ƒ| ¡ | d¡ d|k�rT| d¡ |t D �
] }"|�rv|"|k�rv�q\|�rŠ|"|k�rŠ�q\|"|k�r˜�q\| |"¡ d}#| |"k}$|$�oºt|"ƒ}%|"dk�rÞ|$�sÞt td|"¡ �q\|"dk�r |$�s t td|"¡ �q\|"|k�rt td|"¡ �q\|"|k�r8t td|"¡ �q\zt|"ƒ}&W n. ttfk
�rr   t td|"¡ Y �q\Y nX |�r¼|&�sŽtt |"ƒƒ}'ntt!|"ƒƒ}'|' "|¡�s¼t td|"|'|¡ �q\|�rè|&�sè||k�rèt td|"||¡ �q\|�r|&�st td |"¡ �q\z°|�rP|&dk�rPt#|%dk�r4| dtd!ƒ… n| t|!ƒtd!ƒ… |"d"� nd|"d#k�rŽ|$�rŽt#| |"d"�}#|#�r´|#d d$k�r´|#dd… }#n&t#|%dk�rž| n| t|!ƒd… |"d"�}#W n\ t$t%fk
�r }( z8t |(t%ƒ�sît td%|"t#|(ƒ¡ | |"¡ W Y ¢�q\W 5 d}(~(X Y nX t&|$�s dnt|!ƒ|t|| ƒƒ})|&�oP|#dk	�oPt|#ƒ|k }*|*�rft td&|"¡ |#dk	�rP|&�sPt'|#ƒ}+| (|+¡},|,dk	�rP|,\}-}.}/|/�ràt| |"|-|$|.|dk�sÈ|"|ddfk�rÌ|#nd|d'�}0| |0¡ | |"¡ t td(|"t)|-d) d*d+�¡ |"|ddfk�rj|-d,k �rj|-dk�r`t d-|0j*¡ |�rRt t	¡ t 
|
¡ t|0gƒ  S | |0¡ t|ƒ�r\|dk�sˆ||k�r\d|k�r\d|k�r\| +¡ }1t d-|1j*¡ |�rÌt t	¡ t 
|
¡ t|1gƒ  S �q\np| |"¡ t td.|"¡ |	�r\|"dd|d/d0fk�r\t| |"||$g |#|d'�}2|"|k�r8|2}n|"dk�rH|2}n|2}�q\tt|)ƒd1 ƒ}3t,|3d2ƒ}3d}4d}5g }6g }7zšt-| |"|)||$|%|!|&|#ƒ	D ]|}8|6 |8¡ |7 t.|8||d3k�oÒdt|ƒ  k�oÎd2kn  ƒ¡ |7d4 |k�rî|4d7 }4|4|3k�s|$�r”|%dk�r” �q�q”W n@ t$k
�rT }( z t td5|"t#|(ƒ¡ |3}4d3}5W 5 d}(~(X Y nX |5�sÔ|�rÔ|&�sÔz| td6ƒd… j/|"d7d8� W nL t$k
�rÒ }( z,t td9|"t#|(ƒ¡ | |"¡ W Y ¢�q\W 5 d}(~(X Y nX |7�rêt0|7ƒt|7ƒ nd}9|9|k�	s|4|3k�	rÆ| |"¡ |"t1k�	r$| 2t1|" ¡ |#dk	�	rJ|&�	sJ| 3t'|#ƒ|9g df¡ t td:|"|4t)|9d) d*d+�¡ |	�r\|"dd|d/d0fk�r\|5�s\t| |"||$g |#|d'�}2|"|k�	r®|2}n|"dk�	r¾|2}n|2}�q\t td;|"t)|9d) d*d+�¡ |&�	sòt |"ƒ}:nt!|"ƒ}:|:�
rt td< |"t#|:ƒ¡¡ g };|"dk�
rb|6D ],}8t4|8||:�
rDd= |:¡ndƒ}<|; |<¡ �
q*t5|;ƒ}=nt5|;ƒ}=|=�
r„t td> |=|"¡¡ t| |"|9|$|=|dk�
sª|"|ddfk�
r®|#nd|d'�}>| |>¡ |#dk	�
rè|&�
sè| 3t'|#ƒ|9|=d3f¡ |�r|&�s|9d?k �r|d7 }|"|ddfk�rj|9d,k �rj|9dk�r`t d-|>j*¡ |�rRt t	¡ t 
|
¡ t|>gƒ  S | |>¡ t|ƒ�rÚ|dk�sˆ||k�rÚd|k�rÚd|k�rÚ| +¡ }1t d-|1j*¡ |�rÌt t	¡ t 
|
¡ t|1gƒ  S |�sD|&�sD|=�rt,d@dA„ |=D ƒddB�nd}?|?dCk�rDd|k�rDd|k�rDd3}| 2|:¡ t tdD|"|9|?¡ |�sº|&�rº|*�rº|#dk	�rºt|#ƒ|dE k �rº|"dFk�rºd|k�rºd|k�rºd3}t tdG|"|9t|#ƒ|t|#ƒ| d) ¡ |"| k�r\t dH|"¡ |�rêt t	¡ t 
|
¡ t||" gƒ  S �q\t|ƒdk�r°|�s |�s |�r,t tdI¡ |�rLt dJ|j*¡ | |¡ nd|�r\|dk�s€|�rv|�rv|j6|j6k�s€|dk	�r–t dK¡ | |¡ n|�r°t dL¡ | |¡ |�rÔt dM| +¡ j*t|ƒd ¡ n
t dN¡ |�røt t	¡ t 
|
¡ |S )Oaf  
    Given a raw bytes sequence, return the best possibles charset usable to render str objects.
    If there is no results, it is a strong indicator that the source is binary/not text.
    By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence.
    And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will.

    The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page
    but never take it for granted. Can improve the performance.

    You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that
    purpose.

    This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32.
    By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain'
    toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging.
    Custom logging format and handler can be set manually.
    z3Expected object of type bytes or bytearray, got: {}r   z<Encoding detection on empty bytes, assuming utf_8 intention.Úutf_8g        FÚ Nz`cp_isolation is set. use this flag for debugging purpose. limited list of encoding allowed : %s.z, c                 S  s   g | ]}t |d ƒ‘qS ©F©r   ©Ú.0Úcp© r4   ú:/tmp/pip-unpacked-wheel-mwc9rwws/charset_normalizer/api.pyÚ
<listcomp>s   s     zfrom_bytes.<locals>.<listcomp>zacp_exclusion is set. use this flag for debugging purpose. limited list of encoding excluded : %s.c                 S  s   g | ]}t |d ƒ‘qS r/   r0   r1   r4   r4   r5   r6   ~   s     z^override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.r   z>Trying to detect encoding from a tiny portion of ({}) byte(s).zIUsing lazy str decoding because the payload is quite large, ({}) byte(s).z@Detected declarative mark in sequence. Priority +1 given for %s.é   zIDetected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.Úascii>   Úutf_32Úutf_16z\Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.>   Úutf_7zREncoding %s won't be tested as-is because detection is unreliable without BOM/SIG.zY%s is deemed too similar to a code page that was already considered unsuited. Continuing!zESkipping %s: already fast-tracked from a similar successful encoding.z2Encoding %s does not provide an IncrementalDecoderzbSkipping %s: definitive match already found, this encoding targets different languages (%s vs %s).zXSkipping %s: already accumulated %d same-family results after definitive match (cap=%d).zCSkipping single-byte %s: multi-byte definitive match already found.g    €„A)Úencodingr;   u   ï»¿z9Code page %s does not fit given bytes sequence at ALL. %szpCode page %s is a multi byte encoding table and it appear that at least one character was encoded using n-bytes.)Zpreemptive_declarationzM%s fast-tracked (identical decoded payload to a prior encoding, chaos=%f %%).éd   é   )Úndigitsr   z.Encoding detection: %s is most likely the one.zZ%s fast-skipped (identical decoded payload to a prior encoding that failed chaos probing).r:   r9   é   é   TéÿÿÿÿzaLazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %sg     jè@Ústrict)Úerrorsz^LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %szc%s was excluded because of initial chaos probing. Gave up %i time(s). Computed mean chaos is %f %%.z=%s passed initial chaos probing. Mean measured chaos is %f %%z&{} should target any language(s) of {}ú,z We detected language {} using {}g{®Gáz”?c                 s  s   | ]\}}|V  qd S )Nr4   )r2   Ú_Úvr4   r4   r5   Ú	<genexpr>ö  s     zfrom_bytes.<locals>.<genexpr>)Údefaultg      à?zyDefinitive match found: %s (chaos=%.3f, coherence=%.2f). Encodings targeting different language families will be skipped.g\�Âõ(\ï?>	   r9   Ú	utf_32_ler;   r:   Ú	utf_8_sigÚ	utf_32_beÚ	utf_16_beÚ	utf_16_ler-   zjMulti-byte definitive match: %s (chaos=%.3f, decoded=%d/%d=%.1f%%). Single-byte encodings will be skipped.zoEncoding detection: %s is most likely the one as we detected a BOM or SIG within the beginning of the sequence.zONothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.z7Encoding detection: %s will be used as a fallback matchz:Encoding detection: utf_8 will be used as a fallback matchz:Encoding detection: ascii will be used as a fallback matchz]Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.z=Encoding detection: Unable to determine any suitable charset.)7Ú
isinstanceÚ	bytearrayÚbytesÚ	TypeErrorÚformatÚtypeÚloggerÚlevelÚ
addHandlerÚexplain_handlerÚsetLevelr   ÚlenÚdebugÚremoveHandlerr   r   ÚlogÚjoinr   r   r   r   ÚappendÚsetr   r   Úaddr   r   ÚModuleNotFoundErrorÚImportErrorr   r   ÚintersectionÚstrÚUnicodeDecodeErrorÚLookupErrorÚrangeÚhashÚgetÚroundr<   ÚbestÚmaxr   r   ÚdecodeÚsumr   ÚupdateÚ
setdefaultr   r	   Úfingerprint)@r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Zprevious_logger_levelÚlengthZis_too_small_sequenceZis_too_large_sequenceZprioritized_encodingsZspecified_encodingZtestedZtested_but_hard_failureZtested_but_soft_failureZsoft_failure_skipZsuccess_fast_trackedZpayload_result_cacheZdefinitive_match_foundZdefinitive_target_languagesZ post_definitive_sb_success_countZPOST_DEFINITIVE_SB_CAPZmb_definitive_match_foundZfallback_asciiZfallback_u8Zfallback_specifiedÚresultsZearly_stop_resultsZsig_encodingZsig_payloadZencoding_ianaZdecoded_payloadZbom_or_sig_availableZstrip_sig_or_bomZis_multi_byte_decoderZenc_languagesÚeZr_Zmulti_byte_bonusZpayload_hashÚcachedZcached_messZ	cached_cdZcached_passedZ
fast_matchZprobable_resultZfallback_entryZmax_chunk_gave_upZearly_stop_countZlazy_str_hard_failureZ	md_chunksZ	md_ratiosÚchunkZmean_mess_ratioZtarget_languagesZ	cd_ratiosZchunk_languagesZcd_ratios_mergedZcurrent_matchZbest_coherencer4   r4   r5   Ú
from_bytes9   sÄ   ÿÿ




üüûÿþÿþÿ

ý	


ü




ÿýý
ý
ýýûÿþýûýÿúþÿú
ü

ýÿ
ýü


þÿýñ

üÿþ
þ


ÿþþýüþ


ýûù	


÷
&ýÿ
ÿÿÿüÿþýü


 ÿú
ÿÿþüù	

ü
 ÿþ
ý
 ÿþþýò
þÿþýÿþ
þ


ÿþþýüþ

	ÿý
ûÿþýüûÿúîíù

ý

þþÿÿýü
ûù	



ý


rx   r   )Úfpr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   c
           
      C  s   t |  ¡ |||||||||	ƒ
S )z†
    Same thing than the function from_bytes but using a file pointer that is already ready.
    Will not close the file pointer.
    )rx   Úread)
ry   r#   r$   r%   r&   r'   r(   r)   r*   r+   r4   r4   r5   Úfrom_fp`  s    ör{   zstr | bytes | PathLike)Úpathr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   c
                 C  s<   t | dƒ�(}
t|
|||||||||	ƒ
W  5 Q R £ S Q R X dS )z•
    Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode.
    Can raise IOError.
    ÚrbN)Úopenr{   )r|   r#   r$   r%   r&   r'   r(   r)   r*   r+   ry   r4   r4   r5   Ú	from_path~  s    ör   z!PathLike | str | BinaryIO | bytes)Úfp_or_path_or_payloadr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   c
                 C  sz   t | ttfƒr,t| |||||||||	d�
}
nHt | ttfƒrXt| |||||||||	d�
}
nt| |||||||||	d�
}
|
 S )a)  
    Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string.
    Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match
    are disabled to be stricter around ASCII-compatible but unlikely to be a string.
    )	r#   r$   r%   r&   r'   r(   r)   r*   r+   )rO   re   r   r   rQ   rP   rx   r{   )r€   r#   r$   r%   r&   r'   r(   r)   r*   r+   Zguessesr4   r4   r5   Ú	is_binary�  sX    öþþöör�   )	r   r   r   NNTFr   T)	r   r   r   NNTFr   T)	r   r   r   NNTFr   T)	r   r   r   NNTFr   F)/Ú
__future__r   ÚloggingÚosr   Útypingr   Zcdr   r   r   r	   Zconstantr
   r   r   r   r   Zmdr   Úmodelsr   r   Úutilsr   r   r   r   r   r   Ú	getLoggerrU   ÚStreamHandlerrX   ÚsetFormatterÚ	Formatterr   Ú__annotations__r   Z_supported_encr_   rc   r   rx   r{   r   r�   r4   r4   r4   r5   Ú<module>   sŒ     	
ÿ	         ö$      /         ö$          ö$!         ö