
Ë|j×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 Gd
 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               @   sµ   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 d d d d d d d i Z
 e j 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
iso-8859-1zWindows-1252z
iso-8859-2zWindows-1250z
iso-8859-5zWindows-1251z
iso-8859-6zWindows-1256z
iso-8859-7zWindows-1253z
iso-8859-8zWindows-1255z
iso-8859-9zWindows-1254ziso-8859-13zWindows-1257c             C   sq   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   ú</tmp/pip-build-1hwfuv5s/chardet/chardet/universaldetector.pyÚ__init__Q   s    									zUniversalDetector.__init__c             C   sƒ   d d d d d d i |  _  d |  _ d |  _ d |  _ t j |  _ d |  _ |  j ra |  j j	 ƒ  x |  j
 D] } | j	 ƒ  qk Wd 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.
        ÚencodingNÚ
confidenceg        ÚlanguageFó    )r   r   r   r   r   Ú
PURE_ASCIIr   r   r   r   r   )r   Úproberr   r   r   r   ^   s    					zUniversalDetector.resetc             C   sF  |  j  r d St | ƒ s d St | t ƒ s8 t | ƒ } |  j sc| j t j ƒ rq d d d d d d i |  _ nÉ | j t j	 t j
 f ƒ rª d d d d d d i |  _ n� | j d	 ƒ r× d d
 d d d d i |  _ nc | j d ƒ rd d d d d d i |  _ n6 | j t j t j f ƒ r:d d d d d d i |  _ d |  _ |  j d d k	 rcd |  _  d S|  j t j k rÍ|  j j | ƒ r–t j |  _ n7 |  j t j k rÍ|  j j |  j | ƒ rÍt j |  _ | d d … |  _ |  j t j k rd|  j st |  j ƒ |  _ |  j j | ƒ t j k rBd |  j j d |  j j ƒ  d |  j j i |  _ d |  _  nÞ |  j t j k rB|  j sÊt  |  j ƒ g |  _ |  j t! j" @r·|  j j# t$ ƒ  ƒ |  j j# t% ƒ  ƒ xZ |  j D]O } | j | ƒ t j k rÔd | j d | j ƒ  d | j i |  _ d |  _  PqÔW|  j& j | ƒ rB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``.
        Nr   z	UTF-8-SIGr   g      ð?r    Ú zUTF-32s   þÿ  zX-ISO-10646-UCS-4-3412s     ÿþzX-ISO-10646-UCS-4-2143zUTF-16Tr   éÿÿÿÿ)(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   Z	ESC_ASCIIr   r   r   Úfeedr   ZFOUND_ITÚcharset_nameÚget_confidencer    r   r	   r   ZNON_CJKÚappendr
   r   ÚWIN_BYTE_DETECTORr   )r   Zbyte_strr#   r   r   r   r4   o   s‚    									zUniversalDetector.feedc       	      C   s  |  j  r |  j Sd |  _  |  j s5 |  j j d ƒ n|  j t j k re d d d d d d i |  _ né |  j t j k rNd	 } d
 } d	 } x> |  j	 D]3 } | s¢ q“ | j
 ƒ  } | | k r“ | } | } q“ W| rN| |  j k rN| j } | j j ƒ  } | j
 ƒ  } | j d ƒ r0|  j r0|  j j | | ƒ } d | d | d | j i |  _ |  j j ƒ  t j k r|  j d d	 k r|  j j d ƒ xŠ |  j	 D] } | s¢q“t | t ƒ ríx^ | j D]+ } |  j j d | j | j | j
 ƒ  ƒ q»Wq“|  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!r   Úasciir   g      ð?r    r$   Ng        ziso-8859z no probers hit minimum thresholdz%s %s confidence = %s)r   r   r   r   Údebugr   r   r"   r2   r   r6   ÚMINIMUM_THRESHOLDr5   Úlowerr)   r   ÚISO_WIN_MAPÚgetr    ÚgetEffectiveLevelr   ÚDEBUGr'   r   Zprobers)	r   Zprober_confidenceZmax_prober_confidenceZ
max_proberr#   r5   Zlower_charset_namer   Zgroup_proberr   r   r   ÚcloseÜ   s`    				
			zUniversalDetector.closeN)r   Ú
__module__Ú__qualname__Ú__doc__r;   ÚreÚcompiler0   r3   r8   r=   r   ZALLr   r   r4   rA   r   r   r   r   r   3   s"   mr   )rD   r*   r   rE   Úcharsetgroupproberr   Zenumsr   r   r   Ú	escproberr   Úlatin1proberr   Úmbcsgroupproberr	   Úsbcsgroupproberr
   Úobjectr   r   r   r   r   Ú<module>$   s   