U
    Á½„bG  ã                   @   s<  d dl mZ d dlmZ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mZmZmZmZmZmZmZmZ G dd„ dƒZG dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ ee! ee! e"dœdd„Z#edd�d#e!e$e"e$dœd d!„ƒZ%d"S )$é    )Ú	lru_cache)ÚListÚOptionalé   )ÚCOMMON_SAFE_ASCII_CHARACTERSÚUNICODE_SECONDARY_RANGE_KEYWORD)Úis_accentuatedÚis_asciiÚis_case_variableÚis_cjkÚis_emoticonÚ	is_hangulÚis_hiraganaÚis_katakanaÚis_latinÚis_punctuationÚis_separatorÚ	is_symbolÚis_thaiÚremove_accentÚunicode_rangec                   @   sP   e Zd ZdZeedœdd„Zeddœdd„Zddœd	d
„Ze	e
dœdd„ƒZdS )ÚMessDetectorPluginzy
    Base abstract class used for mess detection plugins.
    All detectors MUST extend and implement given methods.
    ©Ú	characterÚreturnc                 C   s   t ‚dS )z@
        Determine if given character should be fed in.
        N©ÚNotImplementedError©Úselfr   © r   ú9/tmp/pip-unpacked-wheel-2ta4nrol/charset_normalizer/md.pyÚeligible   s    zMessDetectorPlugin.eligibleNc                 C   s   t ‚dS )z‰
        The main routine to be executed upon character.
        Insert the logic in witch the text would be considered chaotic.
        Nr   r   r   r   r    Úfeed$   s    zMessDetectorPlugin.feed©r   c                 C   s   t ‚dS )zB
        Permit to reset the plugin to the initial state.
        Nr   ©r   r   r   r    Úreset+   s    zMessDetectorPlugin.resetc                 C   s   t ‚dS )z…
        Compute the chaos ratio based on what your feed() has seen.
        Must NOT be lower than 0.; No restriction gt 0.
        Nr   r$   r   r   r    Úratio1   s    zMessDetectorPlugin.ratio)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚboolr!   r"   r%   ÚpropertyÚfloatr&   r   r   r   r    r      s   r   c                   @   sZ   e Zd Zddœdd„Zeedœdd„Zeddœdd	„Zddœd
d„Ze	e
dœdd„ƒZdS )Ú TooManySymbolOrPunctuationPluginNr#   c                 C   s"   d| _ d| _d| _d | _d| _d S )Nr   F)Ú_punctuation_countÚ_symbol_countÚ_character_countÚ_last_printable_charZ_frenzy_symbol_in_wordr$   r   r   r    Ú__init__;   s
    z)TooManySymbolOrPunctuationPlugin.__init__r   c                 C   s   |  ¡ S ©N©Úisprintabler   r   r   r    r!   C   s    z)TooManySymbolOrPunctuationPlugin.eligiblec                 C   sp   |  j d7  _ || jkrf|tkrft|ƒr8|  jd7  _n.| ¡ dkrft|ƒrft|ƒdkrf|  jd7  _|| _d S )Nr   Fé   )	r2   r3   r   r   r0   Úisdigitr   r   r1   r   r   r   r    r"   F   s    ÿþ
ÿþ
ýz%TooManySymbolOrPunctuationPlugin.feedc                 C   s   d| _ d| _d| _d S ©Nr   )r0   r2   r1   r$   r   r   r    r%   X   s    z&TooManySymbolOrPunctuationPlugin.resetc                 C   s0   | j dkrdS | j| j | j  }|dkr,|S dS )Nr   ç        g333333Ó?)r2   r0   r1   )r   Zratio_of_punctuationr   r   r    r&   ]   s    

þz&TooManySymbolOrPunctuationPlugin.ratio©r'   r(   r)   r4   r+   r,   r!   r"   r%   r-   r.   r&   r   r   r   r    r/   :   s   r/   c                   @   sZ   e Zd Zddœdd„Zeedœdd„Zeddœdd	„Zddœd
d„Ze	e
dœdd„ƒZdS )ÚTooManyAccentuatedPluginNr#   c                 C   s   d| _ d| _d S r:   ©r2   Ú_accentuated_countr$   r   r   r    r4   j   s    z!TooManyAccentuatedPlugin.__init__r   c                 C   s   |  ¡ S r5   )Úisalphar   r   r   r    r!   n   s    z!TooManyAccentuatedPlugin.eligiblec                 C   s(   |  j d7  _ t|ƒr$|  jd7  _d S ©Nr   )r2   r   r?   r   r   r   r    r"   q   s    zTooManyAccentuatedPlugin.feedc                 C   s   d| _ d| _d S r:   r>   r$   r   r   r    r%   w   s    zTooManyAccentuatedPlugin.resetc                 C   s*   | j dkrdS | j| j  }|dkr&|S dS )Nr   r;   gffffffÖ?r>   )r   Zratio_of_accentuationr   r   r    r&   {   s
    

ÿzTooManyAccentuatedPlugin.ratior<   r   r   r   r    r=   i   s   r=   c                   @   sZ   e Zd Zddœdd„Zeedœdd„Zeddœdd	„Zddœd
d„Ze	e
dœdd„ƒZdS )ÚUnprintablePluginNr#   c                 C   s   d| _ d| _d S r:   )Ú_unprintable_countr2   r$   r   r   r    r4   †   s    zUnprintablePlugin.__init__r   c                 C   s   dS ©NTr   r   r   r   r    r!   Š   s    zUnprintablePlugin.eligiblec                 C   s@   |  ¡ dkr.| ¡ dkr.|dkr.|  jd7  _|  jd7  _d S )NFúr   )Úisspacer7   rC   r2   r   r   r   r    r"   �   s    
ÿ
þýzUnprintablePlugin.feedc                 C   s
   d| _ d S r:   )rC   r$   r   r   r    r%   –   s    zUnprintablePlugin.resetc                 C   s   | j dkrdS | jd | j  S )Nr   r;   é   )r2   rC   r$   r   r   r    r&   ™   s    
zUnprintablePlugin.ratior<   r   r   r   r    rB   …   s   	rB   c                   @   sZ   e Zd Zddœdd„Zeedœdd„Zeddœdd	„Zddœd
d„Ze	e
dœdd„ƒZdS )ÚSuspiciousDuplicateAccentPluginNr#   c                 C   s   d| _ d| _d | _d S r:   ©Ú_successive_countr2   Ú_last_latin_characterr$   r   r   r    r4   ¢   s    z(SuspiciousDuplicateAccentPlugin.__init__r   c                 C   s   |  ¡ ot|ƒS r5   )r@   r   r   r   r   r    r!   ¨   s    z(SuspiciousDuplicateAccentPlugin.eligiblec                 C   st   |  j d7  _ | jd k	rjt|ƒrjt| jƒrj| ¡ rJ| j ¡ rJ|  jd7  _t|ƒt| jƒkrj|  jd7  _|| _d S rA   )r2   rK   r   ÚisupperrJ   r   r   r   r   r    r"   «   s    ÿþýz$SuspiciousDuplicateAccentPlugin.feedc                 C   s   d| _ d| _d | _d S r:   rI   r$   r   r   r    r%   ¹   s    z%SuspiciousDuplicateAccentPlugin.resetc                 C   s   | j dkrdS | jd | j  S )Nr   r;   r8   )r2   rJ   r$   r   r   r    r&   ¾   s    
z%SuspiciousDuplicateAccentPlugin.ratior<   r   r   r   r    rH   ¡   s   rH   c                   @   sZ   e Zd Zddœdd„Zeedœdd„Zeddœdd	„Zddœd
d„Ze	e
dœdd„ƒZdS )ÚSuspiciousRangeNr#   c                 C   s   d| _ d| _d | _d S r:   )Ú"_suspicious_successive_range_countr2   Ú_last_printable_seenr$   r   r   r    r4   Ç   s    zSuspiciousRange.__init__r   c                 C   s   |  ¡ S r5   r6   r   r   r   r    r!   Ì   s    zSuspiciousRange.eligiblec                 C   sx   |  j d7  _ | ¡ s&t|ƒs&|tkr0d | _d S | jd krD|| _d S t| jƒ}t|ƒ}t||ƒrn|  jd7  _|| _d S rA   )r2   rF   r   r   rO   r   Ú is_suspiciously_successive_rangerN   )r   r   Úunicode_range_aÚunicode_range_br   r   r    r"   Ï   s&    ÿþý
ÿ
zSuspiciousRange.feedc                 C   s   d| _ d| _d | _d S r:   )r2   rN   rO   r$   r   r   r    r%   è   s    zSuspiciousRange.resetc                 C   s.   | j dkrdS | jd | j  }|dk r*dS |S )Nr   r;   r8   gš™™™™™¹?)r2   rN   )r   Zratio_of_suspicious_range_usager   r   r    r&   í   s    
þzSuspiciousRange.ratior<   r   r   r   r    rM   Æ   s   rM   c                   @   sZ   e Zd Zddœdd„Zeedœdd„Zeddœdd	„Zddœd
d„Ze	e
dœdd„ƒZdS )ÚSuperWeirdWordPluginNr#   c                 C   s:   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d S )Nr   FÚ )	Ú_word_countÚ_bad_word_countÚ_foreign_long_countÚ_is_current_word_badÚ_foreign_long_watchr2   Ú_bad_character_countÚ_bufferÚ_buffer_accent_countr$   r   r   r    r4   ý   s    zSuperWeirdWordPlugin.__init__r   c                 C   s   dS rD   r   r   r   r   r    r!     s    zSuperWeirdWordPlugin.eligiblec                 C   sÞ  |  ¡ r”d | j|g¡| _t|ƒr0|  jd7  _| jdkr�t|ƒdksNt|ƒr�t|ƒdkr�t|ƒdkr�t	|ƒdkr�t
|ƒdkr�t|ƒdkr�d| _d S | jsžd S | ¡ s¸t|ƒs¸t|ƒ�r¤| j�r¤|  jd7  _t| jƒ}|  j|7  _|dk�r:| j| dk�rd| _t| jd ƒ�r:| jd  ¡ �r:|  jd7  _d| _|dk�r`| j�r`|  jd7  _d| _| j�r�|  jd7  _|  jt| jƒ7  _d| _d| _d| _d	| _n6|d
k�rÚ| ¡ dk�rÚt|ƒ�rÚd| _|  j|7  _d S )NrT   r   FTé   gÃõ(\�ÂÕ?éÿÿÿÿé   r   >   Ú_ú=ú>ú<ú|ú~ú-)r@   Újoinr[   r   r\   rY   r   r   r   r   r   r   rF   r   r   rU   Úlenr2   rX   rL   rW   rV   rZ   r9   r   )r   r   Zbuffer_lengthr   r   r    r"     sv    ÿ
þþ
ý
ü
û
ú
ù	ÿÿÿþ

 ÿ
þýzSuperWeirdWordPlugin.feedc                 C   s4   d| _ d| _d| _d| _d| _d| _d| _d| _d S )NrT   Fr   )r[   rX   rY   rV   rU   r2   rZ   rW   r$   r   r   r    r%   D  s    zSuperWeirdWordPlugin.resetc                 C   s$   | j dkr| jdkrdS | j| j S )Né
   r   r;   )rU   rW   rZ   r2   r$   r   r   r    r&   N  s    zSuperWeirdWordPlugin.ratior<   r   r   r   r    rS   ü   s   6
rS   c                   @   s^   e Zd ZdZddœdd„Zeedœdd„Zeddœd	d
„Zddœdd„Z	e
edœdd„ƒZdS )ÚCjkInvalidStopPluginu²   
    GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and
    can be easily detected. Searching for the overuse of 'ä¸…' and 'ä¸„'.
    Nr#   c                 C   s   d| _ d| _d S r:   ©Ú_wrong_stop_countÚ_cjk_character_countr$   r   r   r    r4   \  s    zCjkInvalidStopPlugin.__init__r   c                 C   s   dS rD   r   r   r   r   r    r!   `  s    zCjkInvalidStopPlugin.eligiblec                 C   s4   |dkr|  j d7  _ d S t|ƒr0|  jd7  _d S )N>   õ   ä¸„õ   ä¸…r   )rl   r   rm   r   r   r   r    r"   c  s
    zCjkInvalidStopPlugin.feedc                 C   s   d| _ d| _d S r:   rk   r$   r   r   r    r%   j  s    zCjkInvalidStopPlugin.resetc                 C   s   | j dk rdS | j| j  S )Né   r;   )rm   rl   r$   r   r   r    r&   n  s    
zCjkInvalidStopPlugin.ratio)r'   r(   r)   r*   r4   r+   r,   r!   r"   r%   r-   r.   r&   r   r   r   r    rj   V  s   rj   c                   @   sZ   e Zd Zddœdd„Zeedœdd„Zeddœdd	„Zddœd
d„Ze	e
dœdd„ƒZdS )ÚArchaicUpperLowerPluginNr#   c                 C   s.   d| _ d| _d| _d| _d| _d | _d| _d S )NFr   T)Ú_bufÚ_character_count_since_last_sepÚ_successive_upper_lower_countÚ#_successive_upper_lower_count_finalr2   Ú_last_alpha_seenÚ_current_ascii_onlyr$   r   r   r    r4   v  s    z ArchaicUpperLowerPlugin.__init__r   c                 C   s   dS rD   r   r   r   r   r    r!   ƒ  s    z ArchaicUpperLowerPlugin.eligiblec                 C   s$  |  ¡ ot|ƒ}|dk}|r†| jdkr†| jdkrV| ¡ dkrV| jdkrV|  j| j7  _d| _d| _d | _d| _|  j	d7  _	d| _d S | jdkr¢t
|ƒdkr¢d| _| jd k	rþ| ¡ r¾| j ¡ sÐ| ¡ rø| j ¡ rø| jdkrð|  jd7  _d| _qþd| _nd| _|  j	d7  _	|  jd7  _|| _d S )NFr   é@   r   Tr8   )r@   r
   rs   r9   rw   ru   rt   rv   rr   r2   r	   rL   Úislower)r   r   Zis_concernedZ	chunk_sepr   r   r    r"   †  sF    ÿ
þýÿ
ÿÿ
zArchaicUpperLowerPlugin.feedc                 C   s.   d| _ d| _d| _d| _d | _d| _d| _d S )Nr   FT)r2   rs   rt   ru   rv   rr   rw   r$   r   r   r    r%   °  s    zArchaicUpperLowerPlugin.resetc                 C   s   | j dkrdS | j| j  S )Nr   r;   )r2   ru   r$   r   r   r    r&   ¹  s    
zArchaicUpperLowerPlugin.ratior<   r   r   r   r    rq   u  s   *	rq   )rQ   rR   r   c                 C   s|  | dks|dkrdS | |kr dS d| kr4d|kr4dS d| ksDd|krHdS d| ksXd|krld| kshd|krldS |   d¡|  d¡ }}|D ]}|tkr”q†||kr† dS q†| dk|dk }}|s¾|rÒd	| ksÎd	|krÒdS |rÞ|rÞdS d
| ksðd
|k�r d	| k�sd	|k�rdS | dk�s|dk�r dS d	| k�sHd	|k�sH| dk�rx|dk�rxd| k�s\d|k�r`dS d| k�std|k�rxdS dS )za
    Determine if two Unicode range seen next to each other can be considered as suspicious.
    NTFZLatinZ	EmoticonsZ	Combiningú )ÚHiraganaÚKatakanaÚCJKZHangulzBasic Latin)r|   r{   ZPunctuationZForms)Úsplitr   )rQ   rR   Zkeywords_range_aZkeywords_range_bÚelZrange_a_jp_charsZrange_b_jp_charsr   r   r    rP   Á  sh    ÿÿÿþÿúÿÿÿþrP   i   )Úmaxsizeçš™™™™™É?F)Údecoded_sequenceÚmaximum_thresholdÚdebugr   c                 C   sà   dd„ t  ¡ D ƒ}t| ƒd }d}|dk r0d}n|dkr>d}nd	}t| d
 t|ƒƒD ]d\}}|D ]}	|	 |¡r`|	 |¡ q`|dkrŽ|| dksš||d krTtdd„ |D ƒƒ}||krT qºqT|rÖ|D ]}
t|
j	|
j
ƒ qÂt|dƒS )zw
    Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier.
    c                 S   s   g | ]
}|ƒ ‘qS r   r   )Ú.0Zmd_classr   r   r    Ú
<listcomp>  s    zmess_ratio.<locals>.<listcomp>r   r;   i   é    i   rx   é€   Ú
r   c                 s   s   | ]}|j V  qd S r5   )r&   )r…   Údtr   r   r    Ú	<genexpr>&  s     zmess_ratio.<locals>.<genexpr>é   )r   Ú__subclasses__rh   ÚzipÚranger!   r"   ÚsumÚprintÚ	__class__r&   Úround)r‚   rƒ   r„   Z	detectorsÚlengthZmean_mess_ratioZ!intermediary_mean_mess_ratio_calcr   ÚindexÚdetectorrŠ   r   r   r    Ú
mess_ratio  s6    ÿ
ÿ
ÿ
þr—   N)r�   F)&Ú	functoolsr   Útypingr   r   Zconstantr   r   Úutilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   r=   rB   rH   rM   rS   rj   rq   r+   r,   rP   r.   r—   r   r   r   r    Ú<module>   s2   D"/%6ZM þF   ÿ  þ