U
    ©AcjU¥  ã                   @  sx  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 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¡¡ e&edd„ d�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*d0d&ddddddddddd'œd(d)„Z+d1d*ddddddddddd+œd,d-„Z,dS )2é    )ÚannotationsN)Ú	lru_cache)Ú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)sc                 C  s
   t | ƒ S ©N)r   ©Úencoding© r   ú:/tmp/pip-unpacked-wheel-k0k9q145/charset_normalizer/api.pyÚ<lambda>.   ó    r   )Úkeyz	list[str]Ú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
           D      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 }tdd�tƒ}tdd�tƒ}d}tƒ }d}d}d}d}d}d}tƒ } tƒ }!t| ƒ\}"}#|"dk	�rR| |"¡ t tdt|#ƒ|"¡ | d¡ d|k�rp| d¡ |t D �]®}$|�r’|$|k�r’�qx|�r¦|$|k�r¦�qx|$|k�r´�qx| |$¡ d}%|"|$k}&|&�oÖt|$ƒ}'|$dk�rú|&�sút td|$¡ �qx|$dk�r|&�st td|$¡ �qx|$|k�r8t td|$¡ �qx|$|k�rTt td|$¡ �qxzt |$ƒ}(W n. t!t"fk
�rŽ   t td|$¡ Y �qxY nX |�rØ|(�sªtt#|$ƒƒ})ntt$|$ƒƒ})|) %|¡�sØt td|$|)|¡ �qx|�r|(�s||k�rt td |$||¡ �qx|�r"|(�s"t td!|$¡ �qx|( �o.| }*zª|�rr|(�srt&|'�sV| dtd"ƒ… n| t|#ƒtd"ƒ… |$d#� nf|*�sØ|$d$k�r¶|&�r¶t&| |$d#�}%|%�rØ|%d d%k�rØ|%dd… }%n"t&|'�sÂ| n| t|#ƒd… |$d#�}%W n\ t't(fk
�r6 }+ z8t |+t(ƒ�st td&|$t&|+ƒ¡ | |$¡ W Y ¢�qxW 5 d}+~+X Y nX t)|&�sDdnt|#ƒ|t|| ƒƒ},|(�ot|%dk	�ott|%ƒ|k }-|-�rŠt td'|$¡ tt|,ƒd( ƒ}.t*|.d)ƒ}.d}/d}0g }1g }2z”t+| |$|,||&|'|#|(|%|*ƒ
D ]t}3|1 |3¡ |2 ||3||�o
dt|ƒ  k�od)kn  ƒ¡ |2d* |k�r&|/d7 }/|/|.k�s<|&�rÐ|'�sÐ �qF�qÐW nr t't(fk
�rº }+ zN|*�rŽt td&|$t&|+ƒ¡ | |$¡ W Y ¢$�qxt td+|$t&|+ƒ¡ |.}/d,}0W 5 d}+~+X Y nX |0�s:|�r:|(�s:z| td-ƒd… j,|$d.d/� W nL t'k
�r8 }+ z,t td0|$t&|+ƒ¡ | |$¡ W Y ¢�qxW 5 d}+~+X Y nX |2�rPt-|2ƒt|2ƒ nd}4|4|k�sh|/|.k�r–| |$¡ |$t.k�rŠ| /t.|$ ¡ |%dk	�r°|(�s°| 0t1|%ƒ|4g df¡ t td1|$|/t2|4d2 d3d4�¡ |	�rx|$dd|d5d6fk�rx|0�sx|%dk�rXz&t&|'�s| n| t|#ƒd… |$d#�}%W n. t't(fk
�rL   t td7|$¡ Y �qxY nX |�rXd}%t| |$||&g |%|d8�}5|$|k�r~|5}n|$dk�rŽ|5}n|5}�qx|*�	rz&t&|'�sª| n| t|#ƒd… |$d#�}%W nP t't(fk
�	r }+ z,t td&|$t&|+ƒ¡ | |$¡ W Y ¢�qxW 5 d}+~+X Y nX |%dk	�
rú|(�
sút1|%ƒ}6| 3|6¡}7|7dk	�
rú|7\}8}9}:|:�
rŠt| |$|8|&|9|�	rr|$|ddfk�	rv|%nd|d8�};|  |;¡ | |$¡ t td9|$t2|8d2 d3d4�¡ |$|ddfk�
r|8d:k �
r|8dk�
r
t d;|;j4¡ |�	rüt t	¡ t 
|
¡ t|;gƒ  S |! |;¡ t|!ƒ�rx|dk�
s2||k�rxd|k�rxd|k�rx|! 5¡ }<t d;|<j4¡ |�
rvt t	¡ t 
|
¡ t|<gƒ  S �qxnp| |$¡ t td<|$¡ |	�rx|$dd|d5d6fk�rxt| |$||&g |%|d8�}5|$|k�
râ|5}n|$dk�
rò|5}n|5}�qxt td=|$t2|4d2 d3d4�¡ |(�s&t#|$ƒ}=nt$|$ƒ}=|=�rLt td> |$t&|=ƒ¡¡ g }>|$dk�r�|=�rjd? |=¡nd}?|1D ]}3||3||?ƒ}@|> |@¡ �qrt6|>ƒ}A|A�r²t td@ |A|$¡¡ t| |$|4|&|A|�rÔ|$|ddfk�rØ|%nd|d8�}B|  |B¡ |%dk	�r|(�s| 0t1|%ƒ|4|Ad,f¡ |�r0|(�s0|4dAk �r0|d7 }|$|ddfk�r”|4d:k �r”|4dk�rŠt d;|Bj4¡ |�r|t t	¡ t 
|
¡ t|Bgƒ  S |! |B¡ t|!ƒ�r|dk�s²||k�rd|k�rd|k�r|! 5¡ }<t d;|<j4¡ |�röt t	¡ t 
|
¡ t|<gƒ  S |�sn|(�sn|A�r,t*dBdC„ |AD ƒddD�nd}C|CdEk�rnd|k�rnd|k�rnd,}| /|=¡ t tdF|$|4|C¡ |�sä|(�rä|-�rä|%dk	�rät|%ƒ|dG k �rä|$dHk�räd|k�räd|k�räd,}t tdI|$|4t|%ƒ|t|%ƒ| d2 ¡ |$|"k�rxt dJ|$¡ |�rt t	¡ t 
|
¡ t| |$ gƒ  S �qxt| ƒdk�rÚ|�sJ|�sJ|�rVt tdK¡ |�rvt dL|j4¡ |  |¡ nd|�r†|dk�sª|�r |�r |j7|j7k�sª|dk	�rÀt dM¡ |  |¡ n|�rÚt dN¡ |  |¡ | �rþt dO|  5¡ j4t| ƒd ¡ n
t dP¡ |�r"t t	¡ t 
|
¡ | S )Qaf  
    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Úcpr   r   r   Ú
<listcomp>l   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 r6   r7   r8   r   r   r   r;   w   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.)Úmaxsizeé   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    €„Ar   rA   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.é   é   éÿÿÿÿzaLazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %sTg     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 %%.éd   é   )Úndigitsr@   r?   z>%s does not decode the whole payload: fallback entry withheld.)Zpreemptive_declarationzM%s fast-tracked (identical decoded payload to a prior encoding, chaos=%f %%).r%   z.Encoding detection: %s is most likely the one.zZ%s fast-skipped (identical decoded payload to a prior encoding that failed chaos probing).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 r   r   )r9   Ú_Úvr   r   r   Ú	<genexpr>C  s     zfrom_bytes.<locals>.<genexpr>)Údefaultg      à?zyDefinitive match found: %s (chaos=%.3f, coherence=%.2f). Encodings targeting different language families will be skipped.g\�Âõ(\ï?>	   Ú	utf_16_ler?   r4   r@   Ú	utf_16_berA   Ú	utf_8_sigÚ	utf_32_beÚ	utf_32_lezjMulti-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.)8Ú
isinstanceÚ	bytearrayÚbytesÚ	TypeErrorÚformatÚtypeÚloggerÚlevelÚ
addHandlerÚexplain_handlerÚsetLevelr   ÚlenÚdebugÚremoveHandlerr   r   ÚlogÚjoinr&   r   r   r   ÚappendÚsetr   r   r   r   r!   Úaddr   r   ÚModuleNotFoundErrorÚImportErrorr   r	   ÚintersectionÚstrÚUnicodeDecodeErrorÚLookupErrorÚrangeÚmaxr   ÚdecodeÚsumr   ÚupdateÚ
setdefaultÚhashÚroundÚgetr   Úbestr
   Úfingerprint)Dr)   r*   r+   r,   r-   r.   r/   r0   r1   r2   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cached_mess_ratioZcached_coherence_ratioZ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_languagesZdeferred_decodingÚeZr_Zmulti_byte_bonusZmax_chunk_gave_upZearly_stop_countZlazy_str_hard_failureZ	md_chunksZ	md_ratiosÚchunkZmean_mess_ratioZfallback_entryZpayload_hashÚcachedZcached_messZ	cached_cdZcached_passedZ
fast_matchZprobable_resultZtarget_languagesZ	cd_ratiosZlg_inclusionZchunk_languagesZcd_ratios_mergedZcurrent_matchZbest_coherencer   r   r   Ú
from_bytes2   s*   ÿÿ




üüûÿþÿþÿ

ý	


ü




ÿýý
ý
ýýûÿþýûý	ÿÿúþÿú
ü

ýÿ
ýü
ö
"ýÿ
ÿÿþü

üÿþýü


 ÿú
ÿÿþü

ÿú
ýù	

ÿú
ü



þÿýñ

üÿþ
þ


ÿþþýüþ


ýûù	

ü
 ÿþ
ÿý ÿþþýò
þÿþýÿþ
þ


ÿþþýüþ

	ÿý
ûÿþýüûÿúîíù

ý

þþÿÿýü
ûù	



ý


r}   r   )Úfpr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   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.
    )r}   Úread)
r~   r*   r+   r,   r-   r.   r/   r0   r1   r2   r   r   r   Úfrom_fp­  s    ör€   zstr | bytes | PathLike)Úpathr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   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/   r0   r1   r2   r~   r   r   r   Ú	from_pathË  s    ör„   z!PathLike | str | BinaryIO | bytes)Úfp_or_path_or_payloadr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   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/   r0   r1   r2   )rT   rj   r   r„   rV   rU   r}   r€   )r…   r*   r+   r,   r-   r.   r/   r0   r1   r2   Zguessesr   r   r   Ú	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Ú	functoolsr   Úosr   Útypingr   Zcdr   r   r	   r
   Zconstantr   r   r   r   r   Zmdr   Úmodelsr   r   Úutilsr   r   r   r   r   r   Ú	getLoggerrZ   ÚStreamHandlerr]   ÚsetFormatterÚ	FormatterÚsortedr!   Ú__annotations__r}   r€   r„   r†   r   r   r   r   Ú<module>   s„     	
ÿ ÿ         ö$                ö$          ö$!         ö