3
ãde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   úL/var/www/agendate/envp3/lib/python3.6/site-packages/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.
        N)r   )r   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.
        N)r   )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.
        N)r   )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 )Ú TooManySymbolOrPunctuationPluginN)r   c             C   s"   d| _ d| _d| _d | _d| _d S )Nr   F)Ú_punctuation_countÚ_symbol_countÚ_character_countÚ_last_printable_charZ_frenzy_symbol_in_word)r   r   r   r   Ú__init__;   s
    z)TooManySymbolOrPunctuationPlugin.__init__)r   r   c             C   s   |j ƒ S )N)Úisprintable)r   r   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.|jƒ dkrft|ƒrft|ƒdkrf|  jd7  _|| _d S )Nr   Fé   )	r-   r.   r   r   r+   Úisdigitr   r   r,   )r   r   r   r   r   r   F   s    
z%TooManySymbolOrPunctuationPlugin.feedc             C   s   d| _ d| _d| _d S )Nr   )r+   r-   r,   )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   g        g333333Ó?)r-   r+   r,   )r   Zratio_of_punctuationr   r   r   r!   ]   s
    

z&TooManySymbolOrPunctuationPlugin.ratio)r"   r#   r$   r/   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 )ÚTooManyAccentuatedPluginN)r   c             C   s   d| _ d| _d S )Nr   )r-   Ú_accentuated_count)r   r   r   r   r/   j   s    z!TooManyAccentuatedPlugin.__init__)r   r   c             C   s   |j ƒ S )N)Úisalpha)r   r   r   r   r   r   n   s    z!TooManyAccentuatedPlugin.eligiblec             C   s(   |  j d7  _ t|ƒr$|  jd7  _d S )Nr   )r-   r   r4   )r   r   r   r   r   r   q   s    zTooManyAccentuatedPlugin.feedc             C   s   d| _ d| _d S )Nr   )r-   r4   )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   g        gffffffÖ?)r-   r4   )r   Zratio_of_accentuationr   r   r   r!   {   s    
zTooManyAccentuatedPlugin.ratio)r"   r#   r$   r/   r&   r'   r   r   r    r(   r)   r!   r   r   r   r   r3   i   s   r3   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 )ÚUnprintablePluginN)r   c             C   s   d| _ d| _d S )Nr   )Ú_unprintable_countr-   )r   r   r   r   r/   †   s    zUnprintablePlugin.__init__)r   r   c             C   s   dS )NTr   )r   r   r   r   r   r   Š   s    zUnprintablePlugin.eligiblec             C   s@   |j ƒ dkr.|jƒ dkr.|dkr.|  jd7  _|  jd7  _d S )NFúr   )Úisspacer0   r7   r-   )r   r   r   r   r   r   �   s
    zUnprintablePlugin.feedc             C   s
   d| _ d S )Nr   )r7   )r   r   r   r   r    –   s    zUnprintablePlugin.resetc             C   s   | j dkrdS | jd | j  S )Nr   g        é   )r-   r7   )r   r   r   r   r!   ™   s    
zUnprintablePlugin.ratio)r"   r#   r$   r/   r&   r'   r   r   r    r(   r)   r!   r   r   r   r   r6   …   s   	r6   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 )ÚSuspiciousDuplicateAccentPluginN)r   c             C   s   d| _ d| _d | _d S )Nr   )Ú_successive_countr-   Ú_last_latin_character)r   r   r   r   r/   ¢   s    z(SuspiciousDuplicateAccentPlugin.__init__)r   r   c             C   s   |j ƒ ot|ƒS )N)r5   r   )r   r   r   r   r   r   ¨   s    z(SuspiciousDuplicateAccentPlugin.eligiblec             C   st   |  j d7  _ | jd k	rjt|ƒrjt| jƒrj|jƒ rJ| jjƒ rJ|  jd7  _t|ƒt| jƒkrj|  jd7  _|| _d S )Nr   )r-   r=   r   Úisupperr<   r   )r   r   r   r   r   r   «   s    

z$SuspiciousDuplicateAccentPlugin.feedc             C   s   d| _ d| _d | _d S )Nr   )r<   r-   r=   )r   r   r   r   r    ¹   s    z%SuspiciousDuplicateAccentPlugin.resetc             C   s   | j dkrdS | jd | j  S )Nr   g        r1   )r-   r<   )r   r   r   r   r!   ¾   s    
z%SuspiciousDuplicateAccentPlugin.ratio)r"   r#   r$   r/   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 )ÚSuspiciousRangeN)r   c             C   s   d| _ d| _d | _d S )Nr   )Ú"_suspicious_successive_range_countr-   Ú_last_printable_seen)r   r   r   r   r/   Ç   s    zSuspiciousRange.__init__)r   r   c             C   s   |j ƒ S )N)r0   )r   r   r   r   r   r   Ì   s    zSuspiciousRange.eligiblec             C   sx   |  j d7  _ |jƒ s&t|ƒs&|tkr0d | _d S | jd krD|| _d S t| jƒ}t|ƒ}t||ƒrn|  jd7  _|| _d S )Nr   )r-   r9   r   r   rA   r   Ú is_suspiciously_successive_ranger@   )r   r   Úunicode_range_aÚunicode_range_br   r   r   r   Ï   s    

zSuspiciousRange.feedc             C   s   d| _ d| _d | _d S )Nr   )r-   r@   rA   )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   g        r1   gš™™™™™¹?)r-   r@   )r   Zratio_of_suspicious_range_usager   r   r   r!   í   s    
zSuspiciousRange.ratio)r"   r#   r$   r/   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 )ÚSuperWeirdWordPluginN)r   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_watchr-   Ú_bad_character_countÚ_bufferÚ_buffer_accent_count)r   r   r   r   r/   ý   s    zSuperWeirdWordPlugin.__init__)r   r   c             C   s   dS )NTr   )r   r   r   r   r   r     s    zSuperWeirdWordPlugin.eligiblec             C   sÜ  |j ƒ r”dj| 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 |jƒ s¶t|ƒs¶t|ƒoº| j�r¢|  jd7  _t| jƒ}|  j|7  _|dk�r8| j| dk�rd| _t| jd ƒ�r8| jd jƒ �r8|  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Ø|jƒ dk�rØt|ƒ�rØd| _|  j|7  _d S )NrF   r   FTé   gÃõ(\�ÂÕ?é   r   ú<ú>ú-ú=ú~ú|Ú_éÿÿÿÿrX   >   rQ   rT   rS   rW   rU   rR   rV   )r5   ÚjoinrM   r   rN   rK   r   r   r   r   r   r   r9   r   r   rG   Úlenr-   rJ   r>   rI   rH   rL   r2   r   )r   r   Zbuffer_lengthr   r   r   r     sR    


 

zSuperWeirdWordPlugin.feedc             C   s4   d| _ d| _d| _d| _d| _d| _d| _d| _d S )NrF   Fr   )rM   rJ   rK   rH   rG   r-   rL   rI   )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   g        )rG   rI   rL   r-   )r   r   r   r   r!   N  s    zSuperWeirdWordPlugin.ratio)r"   r#   r$   r/   r&   r'   r   r   r    r(   r)   r!   r   r   r   r   rE   ü   s   6
rE   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 'ä¸„'.
    N)r   c             C   s   d| _ d| _d S )Nr   )Ú_wrong_stop_countÚ_cjk_character_count)r   r   r   r   r/   \  s    zCjkInvalidStopPlugin.__init__)r   r   c             C   s   dS )NTr   )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   >   r_   r`   )r]   r   r^   )r   r   r   r   r   r   c  s
    zCjkInvalidStopPlugin.feedc             C   s   d| _ d| _d S )Nr   )r]   r^   )r   r   r   r   r    j  s    zCjkInvalidStopPlugin.resetc             C   s   | j dk rdS | j| j  S )Né   g        )r^   r]   )r   r   r   r   r!   n  s    
zCjkInvalidStopPlugin.ratio)r"   r#   r$   r%   r/   r&   r'   r   r   r    r(   r)   r!   r   r   r   r   r\   V  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 )ÚArchaicUpperLowerPluginN)r   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_finalr-   Ú_last_alpha_seenÚ_current_ascii_only)r   r   r   r   r/   v  s    z ArchaicUpperLowerPlugin.__init__)r   r   c             C   s   dS )NTr   )r   r   r   r   r   r   ƒ  s    z ArchaicUpperLowerPlugin.eligiblec             C   s$  |j ƒ ot|ƒ}|dk}|r†| jdkr†| jdkrV|jƒ 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þ|jƒ r¾| jjƒ sÐ|jƒ rø| jjƒ rø| jdkrð|  jd7  _d| _qþd| _nd| _|  j	d7  _	|  jd7  _|| _d S )NFr   é@   r   Tr1   )r5   r
   rd   r2   rh   rf   re   rg   rc   r-   r	   r>   Úislower)r   r   Zis_concernedZ	chunk_sepr   r   r   r   †  s8    




zArchaicUpperLowerPlugin.feedc             C   s.   d| _ d| _d| _d| _d | _d| _d| _d S )Nr   FT)r-   rd   re   rf   rg   rc   rh   )r   r   r   r   r    °  s    zArchaicUpperLowerPlugin.resetc             C   s   | j dkrdS | j| j  S )Nr   g        )r-   rf   )r   r   r   r   r!   ¹  s    
zArchaicUpperLowerPlugin.ratio)r"   r#   r$   r/   r&   r'   r   r   r    r(   r)   r!   r   r   r   r   rb   u  s   *	rb   )rC   rD   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 | j dƒ|j dƒ }}x"|D ]}|tkr–qˆ||krˆdS qˆW | 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�sJd
|k�sJ| dk�rz|dk�rzd| k�s^d|k�rbdS d| k�svd|k�rzd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 LatinZPunctuationZForms)rl   rm   )rl   rm   )rm   rl   )rm   rl   )Úsplitr   )rC   rD   Zkeywords_range_aZkeywords_range_bÚelZrange_a_jp_charsZrange_b_jp_charsr   r   r   rB   Á  sR    
 

rB   i   )Úmaxsizeçš™™™™™É?F)Údecoded_sequenceÚmaximum_thresholdÚdebugr   c             C   sê   dd„ t jƒ D ƒ}t| ƒd }d}|dk r0d}n|dkr>d}nd	}x|t| d
 t|ƒƒD ]f\}}x |D ]}	|	j|ƒrd|	j|ƒ qdW |dkr”|| dks ||d krVtdd„ |D ƒƒ}||krVP qVW |ràx|D ]}
t|
j	|
j
ƒ qÊW 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   g        i   é    i   ri   é€   Ú
r   c             s   s   | ]}|j V  qd S )N)r!   )rv   Údtr   r   r   ú	<genexpr>&  s    zmess_ratio.<locals>.<genexpr>é   )r   Ú__subclasses__rZ   ÚzipÚranger   r   ÚsumÚprintÚ	__class__r!   Úround)rs   rt   ru   Z	detectorsÚlengthZmean_mess_ratioZ!intermediary_mean_mess_ratio_calcr   ÚindexÚdetectorr{   r   r   r   Ú
mess_ratio  s*    	


rˆ   N)rr   F)&Ú	functoolsr   Útypingr   r   Zconstantr   r   Úutilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r3   r6   r;   r?   rE   r\   rb   r&   r'   rB   r)   rˆ   r   r   r   r   Ú<module>   s"   D"/%6ZMD