3
ãdeOO  ã               @   sŠ  d dl Z d dlmZmZ d dlmZmZmZmZ yd dl	m
Z
 W n ek
rX   eZ
Y nX 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" e j#dƒZ$e j%ƒ Z&e&j'e j(dƒƒ de)e*e*e+ee ee e,e,edœ	dd„Z-dee*e*e+ee ee e,e,edœ	dd„Z.d e
e*e*e+ee ee e,e,edœ	dd„Z/d!e
e*e*e+ee ee e,edœdd„Z0dS )"é    N)ÚbasenameÚsplitext)ÚBinaryIOÚListÚOptionalÚSet)ÚPathLikeé   )Ú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Ú	iana_nameÚidentify_sig_or_bomÚis_cp_similarÚis_multi_byte_encodingÚshould_strip_sig_or_bomZcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sé   é   çš™™™™™É?TF)	Ú	sequencesÚstepsÚ
chunk_sizeÚ	thresholdÚcp_isolationÚcp_exclusionÚpreemptive_behaviourÚexplainÚreturnc       1   .   C   s¤	  t | ttfƒs tdjt| ƒƒƒ‚|r>tj}tjt	ƒ tj
tƒ t| ƒ}	|	dkrŽtjdƒ |rvtjt	ƒ tj
|prtjƒ tt| dddg dƒgƒS |dk	rºtjtd	d
j|ƒƒ dd„ |D ƒ}ng }|dk	rêtjtdd
j|ƒƒ dd„ |D ƒ}ng }|	|| k�rtjtd|||	ƒ d}|	}|dk�r:|	| |k �r:t|	| ƒ}t| ƒtk }
t| ƒtk}|
�rltjtdj|	ƒƒ n|�r„tjtdj|	ƒƒ g }|�r–t| ƒnd}|dk	�r¼|j|ƒ tjtd|ƒ tƒ }g }g }d}d}d}tƒ }t| ƒ\}}|dk	�r|j|ƒ tjtdt|ƒ|ƒ |jdƒ d|k�r.|jdƒ �xv|t D �]h}|�rT||k�rT�q:|�rh||k�rh�q:||k�rv�q:|j|ƒ d}||k}|�o˜t|ƒ}|d<k�r¾| �r¾tjtd|ƒ �q:yt|ƒ}W n, t t!fk
�rö   tjtd|ƒ �w:Y nX yr|�rB|dk�rBt"|dk�r&| dtdƒ… n| t|ƒtdƒ… |d� n&t"|dk�rR| n| t|ƒd… |d�}W nV t#t$fk
�rÀ } z4t |t$ƒ�s¢tjtd|t"|ƒƒ |j|ƒ �w:W Y dd}~X nX d}x |D ]}t%||ƒ�rÌd}P �qÌW |�rtjtd||ƒ �q:t&|�sdnt|ƒ|	t|	| ƒƒ}|�o>|dk	�o>t|ƒ|	k } | �rTtjtd|ƒ tt|ƒd  ƒ}!t'|!d!ƒ}!d}"d}#g }$g }%�x |D �]–}&|&| |	d" k�r¢�q†| |&|&| … }'|�rÊ|dk�rÊ||' }'y|'j(||�rÜd#nd$d%�}(W nB t#k
�r( } z$tjtd&|t"|ƒƒ |!}"d}#P W Y dd}~X nX |�rÐ|&dk�rÐ| |& d'k�rÐt)|d(ƒ})|�rÐ|(d|)… |k�rÐxdt&|&|&d  d=ƒD ]P}*| |*|&| … }'|�r¨|dk�r¨||' }'|'j(|d#d%�}(|(d|)… |k�r|P �q|W |$j|(ƒ |%jt*|(|ƒƒ |%d> |k�r |"d7 }"|"|!k�s|�r†|dk�r†P �q†W |# �rž|�rž| �ržy| td)ƒd… j(|d$d%� W nF t#k
�rœ } z(tjtd*|t"|ƒƒ |j|ƒ �w:W Y dd}~X nX |%�r´t+|%ƒt|%ƒ nd}+|+|k�sÌ|"|!k�rF|j|ƒ tjtd+||"t,|+d, d-d.�ƒ |dd|gk�r:|# �r:t| ||dg |ƒ},||k�r.|,}n|dk�r>|,}n|,}�q:tjtd/|t,|+d, d-d.�ƒ |�srt-|ƒ}-nt.|ƒ}-|-�r˜tjtd0j|t"|-ƒƒƒ g }.|dk�rÜx4|$D ],}(t/|(d1|-�rÆd2j|-ƒndƒ}/|.j|/ƒ �q¬W t0|.ƒ}0|0�rþtjtd3j|0|ƒƒ |jt| ||+||0|ƒƒ ||ddgk�rd|+d1k �rdtjd4|ƒ |�rVtjt	ƒ tj
|ƒ t|| gƒS ||k�r:tjd5|ƒ |�r”tjt	ƒ tj
|ƒ t|| gƒS �q:W t|ƒdk�	rX|�sÈ|�sÈ|�rÔtjtd6ƒ |�rôtjd7|j1ƒ |j|ƒ nd|�	r|dk�	s(|�	r|�	r|j2|j2k�	s(|dk	�	r>tjd8ƒ |j|ƒ n|�	rXtjd9ƒ |j|ƒ |�	r|tjd:|j3ƒ j1t|ƒd ƒ n
tjd;ƒ |�	r tjt	ƒ tj
|ƒ |S )?ae  
    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 blocs 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.
    z4Expected object of type bytes or bytearray, got: {0}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© r+   úM/var/www/agendate/envp3/lib/python3.6/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 )F)r   )r)   r*   r+   r+   r,   r-   h   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 wont be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.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.é   é   é   ÚignoreÚstrict)ÚerrorszaLazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %sé€   é   g     jè@z^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   é   )Úndigitsz=%s passed initial chaos probing. Mean measured chaos is %f %%z&{} should target any language(s) of {}gš™™™™™¹?ú,z We detected language {} using {}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.>   r0   r/   éÿÿÿÿr>   )4Ú
isinstanceÚ	bytearrayÚbytesÚ	TypeErrorÚformatÚtypeÚloggerÚlevelÚ
addHandlerÚexplain_handlerÚsetLevelr   ÚlenÚdebugÚremoveHandlerÚloggingÚWARNINGr   r   ÚlogÚjoinÚintr   r   r   ÚappendÚsetr   r   Úaddr   r   ÚModuleNotFoundErrorÚImportErrorÚstrÚUnicodeDecodeErrorÚLookupErrorr   ÚrangeÚmaxÚdecodeÚminr   ÚsumÚroundr   r   r
   r   r1   ÚfingerprintÚbest)1r   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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ÚiZcut_sequenceÚchunkZchunk_partial_size_chkÚjZmean_mess_ratioZfallback_entryZtarget_languagesZ	cd_ratiosZchunk_languagesZcd_ratios_mergedr+   r+   r,   Ú
from_bytes%   sZ   














































rh   )	Úfpr   r    r!   r"   r#   r$   r%   r&   c          	   C   s   t | jƒ |||||||ƒ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+   r,   Úfrom_fp  s    rk   )	Úpathr   r    r!   r"   r#   r$   r%   r&   c       	      C   s,   t | dƒ�}t||||||||ƒ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%   ri   r+   r+   r,   Ú	from_path  s    ro   )rl   r   r    r!   r"   r#   r$   r&   c          	   C   s    t | ||||||ƒ}t| ƒ}tt|ƒƒ}	t|ƒdkrBtdj|ƒƒ‚|jƒ }
|	d  d|
j 7  < t	djt
| ƒj|dj|	ƒƒƒdƒ�}|j|
jƒ ƒ W dQ R X |
S )zi
    Take a (text-based) file path and try to create another file next to it, this time using UTF-8.
    r   z;Unable to normalize "{}", no encoding charset seems to fit.ú-z{}r(   ÚwbN)ro   r   Úlistr   rJ   ÚIOErrorrC   ra   r1   rn   rW   ÚreplacerP   ÚwriteÚoutput)rl   r   r    r!   r"   r#   r$   rc   ÚfilenameZtarget_extensionsÚresultri   r+   r+   r,   Ú	normalize7  s*     ry   )r   r   r   NNTF)r   r   r   NNTF)r   r   r   NNTF)r   r   r   NNT)1rM   Úos.pathr   r   Útypingr   r   r   r   Úosr   rV   rW   Zcdr
   r   r   r   Zconstantr   r   r   r   Zmdr   Úmodelsr   r   Úutilsr   r   r   r   r   r   Ú	getLoggerrE   ÚStreamHandlerrH   ÚsetFormatterÚ	FormatterrA   rQ   ÚfloatÚboolrh   rk   ro   ry   r+   r+   r+   r,   Ú<module>   sb   
 
         Y                 