U
    ˆ=iŒX  ã                   @  sR  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 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mZ e d¡Ze  ¡ Z!e! "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 ),é    )ÚannotationsN)ÚPathLike)ÚBinaryIOé   )Úcoherence_ratioÚencoding_languagesÚmb_encoding_languagesÚmerge_coherence_ratios)ÚIANA_SUPPORTEDÚTOO_BIG_SEQUENCEÚTOO_SMALL_SEQUENCEÚTRACE)Ú
mess_ratio)ÚCharsetMatchÚCharsetMatches)Úany_specified_encodingÚcut_sequence_chunksÚ	iana_nameÚidentify_sig_or_bomÚis_cp_similarÚis_multi_byte_encodingÚshould_strip_sig_or_bomÚcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sé   é   çš™™™™™É?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
           2      C  s¾	  t | ttfƒs td t| ƒ¡ƒ‚|r>tj}
t t	¡ t 
t¡ t| ƒ}|dkrŽt d¡ |rvt t	¡ t 
|
prtj¡ 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�r:|| |k �r:t|| ƒ}t| ƒtk }t| ƒtk}|�rlt td |¡¡ n|�r„t td |¡¡ g }|�r–t| ƒnd}|dk	�r¼| |¡ t td|¡ tƒ }g }g }d}d}d}tƒ }tƒ }t| ƒ\}}|dk	�r| |¡ t tdt|ƒ|¡ | d¡ d|k�r4| d¡ |t D �]‚}|�rV||k�rV�q<|�rj||k�rj�q<||k�rx�q<| |¡ d}||k}|�ošt|ƒ}|dk�r¾|�s¾t td|¡ �q<|dk�rà|�sàt td|¡ �q<zt|ƒ}W n. t t!fk
�r   t td|¡ Y �q<Y nX zr|�rf|dk�rft"|dk�rJ| dtdƒ… n| t|ƒtdƒ… |d� n&t"|dk�rv| 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 d} |D ]}!t%||!ƒ�rôd}  �q�qô| �r,t td||!¡ �q<t&|�s8dnt|ƒ|t|| ƒƒ}"|�oh|dk	�oht|ƒ|k }#|#�r~t td |¡ tt|"ƒd! ƒ}$t'|$d"ƒ}$d}%d}&g }'g }(zšt(| ||"||||||ƒ	D ]|})|' |)¡ |( t)|)||dk�o dt|ƒ  k�oüd"kn  ƒ¡ |(d# |k�r|%d7 }%|%|$k�s6|�rÂ|dk�rÂ �q@�qÂW n@ t#k
�r‚ } z t td$|t"|ƒ¡ |$}%d}&W 5 d}~X Y nX |&�s|�r|�sz| td%ƒd… j*|d&d'� W nL t#k
�r  } z,t td(|t"|ƒ¡ | |¡ W Y ¢�q<W 5 d}~X Y nX |(�rt+|(ƒt|(ƒ nd}*|*|k�s0|%|$k�r¶| |¡ t td)||%t,|*d* d+d,�¡ |	�r<|dd|d-d.fk�r<|&�s<t| |||g ||d/�}+||k�rž|+}n|dk�r®|+}n|+}�q<t td0|t,|*d* d+d,�¡ |�sât-|ƒ},nt.|ƒ},|,�rt td1 |t"|,ƒ¡¡ g }-|dk�rH|'D ],})t/|)||,�r4d2 |,¡ndƒ}.|- |.¡ �qt0|-ƒ}/|/�rjt td3 |/|¡¡ t| ||*||/|dk�s�||ddfk�r”|nd|d/�}0| |0¡ ||ddfk�r|*d4k �r|*dk�rt d5|0j1¡ |�rôt t	¡ t 
|
¡ t|0gƒ  S | |0¡ t|ƒ�r||dk�s*||k�r|d|k�r|d|k�r|| 2¡ }1t d5|1j1¡ |�rnt t	¡ t 
|
¡ t|1gƒ  S ||k�r<t d6|¡ |�r¬t t	¡ t 
|
¡ t|| gƒ  S �q<t|ƒdk�	rr|�sâ|�sâ|�rît td7¡ |�	rt d8|j1¡ | |¡ nd|�	r|dk�	sB|�	r8|�	r8|j3|j3k�	sB|dk	�	rXt d9¡ | |¡ n|�	rrt d:¡ | |¡ |�	r–t d;| 2¡ j1t|ƒd ¡ n
t d<¡ |�	rºt t	¡ t 
|
¡ |S )=af  
    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© r2   úV/var/www/html/mysite/school/venv/lib/python3.8/site-packages/charset_normalizer/api.pyÚ
<listcomp>[   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-   r.   r/   r2   r2   r3   r4   f   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_16Úutf_32z\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.z2Encoding %s does not provide an IncrementalDecoderg    €„A)Úencodingz9Code page %s does not fit given bytes sequence at ALL. %sTzW%s is deemed too similar to code page %s and was consider unsuited already. Continuing!zpCode 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. %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 %%.éd   é   )Úndigitsr6   r7   )Zpreemptive_declarationz=%s passed initial chaos probing. Mean measured chaos is %f %%z&{} should target any language(s) of {}ú,z We detected language {} using {}r   z.Encoding detection: %s is most likely the one.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.)4Ú
isinstanceÚ	bytearrayÚbytesÚ	TypeErrorÚformatÚtypeÚloggerÚlevelÚ
addHandlerÚexplain_handlerÚsetLevelr   ÚlenÚdebugÚremoveHandlerÚloggingÚWARNINGr   r   ÚlogÚjoinr   r   r   r   ÚappendÚsetr   r
   Úaddr   r   ÚModuleNotFoundErrorÚImportErrorÚstrÚUnicodeDecodeErrorÚLookupErrorr   ÚrangeÚmaxr   r   ÚdecodeÚsumÚroundr   r   r   r	   r9   ÚbestÚfingerprint)2r    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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_decoderÚeZsimilar_soft_failure_testZencoding_soft_failedZ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target_languagesZ	cd_ratiosZchunk_languagesZcd_ratios_mergedZcurrent_matchZprobable_resultr2   r2   r3   Ú
from_bytes!   s,   ÿÿ



üüûÿþÿþÿ

ý

ü




ÿýýýÿú	ÿú
ü

ü
ýÿ
ýü
÷
&ýÿ
ÿÿÿüÿþýü

ú
ÿÿþüù	

ü
 ÿþ
ý ÿþþýò
ÿþ
þ


ÿþþýüþ


ý

þþÿÿýü
ûù	



ý


rh   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.
    )rh   Úread)
ri   r!   r"   r#   r$   r%   r&   r'   r(   r)   r2   r2   r3   Úfrom_fp!  s    örk   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)Úopenrk   )rl   r!   r"   r#   r$   r%   r&   r'   r(   r)   ri   r2   r2   r3   Ú	from_path?  s    öro   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)   )rC   rZ   r   ro   rE   rD   rh   rk   )rp   r!   r"   r#   r$   r%   r&   r'   r(   r)   Zguessesr2   r2   r3   Ú	is_binary^  sX    öþþöörq   )	r   r   r   NNTFr   T)	r   r   r   NNTFr   T)	r   r   r   NNTFr   T)	r   r   r   NNTFr   F)(Ú
__future__r   rQ   Úosr   Útypingr   Úcdr   r   r   r	   Úconstantr
   r   r   r   Úmdr   Úmodelsr   r   Úutilsr   r   r   r   r   r   r   Ú	getLoggerrI   ÚStreamHandlerrL   ÚsetFormatterÚ	Formatterrh   rk   ro   rq   r2   r2   r2   r3   Ú<module>   sr   $

ÿ         ö$             ö$          ö$!         ö