3
ûâde×0  ã               @   s€   d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ G d
d„ deƒZdS )a  
Module containing the UniversalDetector detector class, which is the primary
class a user of ``chardet`` should use.

:author: Mark Pilgrim (initial port to Python)
:author: Shy Shalom (original C code)
:author: Dan Blanchard (major refactoring for 3.0)
:author: Ian Cordasco
é    Né   )ÚCharSetGroupProber)Ú
InputStateÚLanguageFilterÚProbingState)ÚEscCharSetProber)ÚLatin1Prober)ÚMBCSGroupProber)ÚSBCSGroupProberc            	   @   sn   e Zd ZdZdZejdƒZejdƒZejdƒZ	dddd	d
ddddœZ
ejfdd„Zdd„ Zdd„ Zdd„ ZdS )ÚUniversalDetectoraq  
    The ``UniversalDetector`` class underlies the ``chardet.detect`` function
    and coordinates all of the different charset probers.

    To get a ``dict`` containing an encoding and its confidence, you can simply
    run:

    .. code::

            u = UniversalDetector()
            u.feed(some_bytes)
            u.close()
            detected = u.result

    gš™™™™™É?s   [€-ÿ]s   (|~{)s   [€-Ÿ]zWindows-1252zWindows-1250zWindows-1251zWindows-1256zWindows-1253zWindows-1255zWindows-1254zWindows-1257)z
iso-8859-1z
iso-8859-2z
iso-8859-5z
iso-8859-6z
iso-8859-7z
iso-8859-8z
iso-8859-9ziso-8859-13c             C   sN   d | _ g | _d | _d | _d | _d | _d | _|| _tj	t
ƒ| _d | _| jƒ  d S )N)Ú_esc_charset_proberÚ_charset_probersÚresultÚdoneÚ	_got_dataÚ_input_stateÚ
_last_charÚlang_filterÚloggingÚ	getLoggerÚ__name__ÚloggerÚ_has_win_bytesÚreset)Úselfr   © r   úD/tmp/pip-build-red6nood/pip/pip/_vendor/chardet/universaldetector.pyÚ__init__Q   s    zUniversalDetector.__init__c             C   sZ   ddddœ| _ d| _d| _d| _tj| _d| _| jr>| jj	ƒ  x| j
D ]}|j	ƒ  qFW dS )zæ
        Reset the UniversalDetector and all of its probers back to their
        initial states.  This is called by ``__init__``, so you only need to
        call this directly in between analyses of different documents.
        Ng        )ÚencodingÚ
confidenceÚlanguageFó    )r   r   r   r   r   Ú
PURE_ASCIIr   r   r   r   r   )r   Úproberr   r   r   r   ^   s    
zUniversalDetector.resetc             C   s>  | j r
dS t|ƒsdS t|tƒs(t|ƒ}| jsÞ|jtjƒrJddddœ| _nv|jtj	tj
fƒrlddddœ| _nT|jdƒr†ddddœ| _n:|jd	ƒr d
dddœ| _n |jtjtjfƒrÀddddœ| _d| _| jd dk	rÞd| _ dS | jtjk�r.| jj|ƒ�rtj| _n*| jtjk�r.| jj| j| ƒ�r.tj| _|dd… | _| jtjk�r–| j�s^t| jƒ| _| jj|ƒtjk�r:| jj| jjƒ | jjdœ| _d| _ n¤| jtjk�r:| j�sät | jƒg| _| jt!j"@ �rÖ| jj#t$ƒ ƒ | jj#t%ƒ ƒ x@| jD ]6}|j|ƒtjk�rì|j|jƒ |jdœ| _d| _ P �qìW | j&j|ƒ�r:d| _'dS )aý  
        Takes a chunk of a document and feeds it through all of the relevant
        charset probers.

        After calling ``feed``, you can check the value of the ``done``
        attribute to see if you need to continue feeding the
        ``UniversalDetector`` more data, or if it has made a prediction
        (in the ``result`` attribute).

        .. note::
           You should always call ``close`` when you're done feeding in your
           document if ``done`` is not already ``True``.
        Nz	UTF-8-SIGg      ð?Ú )r   r   r    zUTF-32s   þÿ  zX-ISO-10646-UCS-4-3412s     ÿþzX-ISO-10646-UCS-4-2143zUTF-16Tr   r   éÿÿÿÿ)(r   ÚlenÚ
isinstanceÚ	bytearrayr   Ú
startswithÚcodecsÚBOM_UTF8r   ÚBOM_UTF32_LEÚBOM_UTF32_BEÚBOM_LEÚBOM_BEr   r   r"   ÚHIGH_BYTE_DETECTORÚsearchÚ	HIGH_BYTEÚESC_DETECTORr   Ú	ESC_ASCIIr   r   r   Úfeedr   ÚFOUND_ITÚcharset_nameÚget_confidencer    r   r	   r   ÚNON_CJKÚappendr
   r   ÚWIN_BYTE_DETECTORr   )r   Úbyte_strr#   r   r   r   r5   o   s|    





zUniversalDetector.feedc       	      C   s€  | j r| jS d| _ | js&| jjdƒ n¶| jtjkrBddddœ| _nš| jtjkrÜd}d}d}x,| j	D ]"}|slqb|j
ƒ }||krb|}|}qbW |rÜ|| jkrÜ|j}|jjƒ }|j
ƒ }|jd	ƒrÌ| jrÌ| jj||ƒ}|||jdœ| _| jjƒ tjk�rz| jd
 dk�rz| jjdƒ xn| j	D ]d}|�s �qt|tƒ�rZxF|jD ] }| jjd|j|j|j
ƒ ƒ �q4W n| jjd|j|j|j
ƒ ƒ �qW | jS )zæ
        Stop analyzing the current document and come up with a final
        prediction.

        :returns:  The ``result`` attribute, a ``dict`` with the keys
                   `encoding`, `confidence`, and `language`.
        Tzno data received!Úasciig      ð?r$   )r   r   r    Ng        ziso-8859r   z no probers hit minimum thresholdz%s %s confidence = %s)r   r   r   r   Údebugr   r   r"   r2   r   r8   ÚMINIMUM_THRESHOLDr7   Úlowerr)   r   ÚISO_WIN_MAPÚgetr    ÚgetEffectiveLevelr   ÚDEBUGr'   r   Úprobers)	r   Úprober_confidenceÚmax_prober_confidenceÚ
max_proberr#   r7   Úlower_charset_namer   Úgroup_proberr   r   r   ÚcloseÜ   s`    	

zUniversalDetector.closeN)r   Ú
__module__Ú__qualname__Ú__doc__r?   ÚreÚcompiler0   r3   r;   rA   r   ÚALLr   r   r5   rK   r   r   r   r   r   3   s"   


mr   )rN   r*   r   rO   Úcharsetgroupproberr   Úenumsr   r   r   Ú	escproberr   Úlatin1proberr   Úmbcsgroupproberr	   Úsbcsgroupproberr
   Úobjectr   r   r   r   r   Ú<module>$   s   