U
    j4                     @  s   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 ddlmZmZ ddlmZmZmZ G dd	 d	ZG d
d dZe
eef Ze	e ZG dd dZdS )    )annotations)aliases)sub)AnyIteratorListTuple   )RE_POSSIBLE_ENCODING_INDICATIONTOO_BIG_SEQUENCE)	iana_nameis_multi_byte_encodingunicode_rangec                	   @  s  e Zd ZdCddddddddd	d
ZdddddZdddddZeddddZddddZddddZ	d ddddZ
eddddZeddddZeddd d!Zeddd"d#Zeddd$d%Zeddd&d'Zeddd(d)Zeddd*d+Zeddd,d-Zeddd.d/Zeddd0d1Zed2dd3d4Zeddd5d6Zeddd7d8Zeddd9d:ZdDdd<d=d>d?Zed@ddAdBZdS )ECharsetMatchNzbytes | bytearraystrfloatboolCoherenceMatches
str | None)payloadguessed_encodingmean_mess_ratiohas_sig_or_bom	languagesdecoded_payloadpreemptive_declarationc                 C  sL   || _ || _|| _|| _|| _d | _g | _d| _d | _d | _	|| _
|| _d S )N        )_payload	_encoding_mean_mess_ratio
_languages_has_sig_or_bom_unicode_ranges_leavesZ_mean_coherence_ratio_output_payload_output_encoding_string_preemptive_declaration)selfr   r   r   r   r   r   r    r)   =/tmp/pip-unpacked-wheel-bwd693va/charset_normalizer/models.py__init__   s    
zCharsetMatch.__init__object)otherreturnc                 C  s@   t |ts(t |tr$t|d| jkS dS | j|jko>| j|jkS )NF)
isinstancer   r   r   encodingfingerprintr(   r-   r)   r)   r*   __eq__(   s
    

zCharsetMatch.__eq__c                 C  s   t |tstt| j|j }t| j|j }|dk rJ|dkrJ| j|jkS |dk r|dkrt| jtkrt| j|jk S | j	|j	kS | j|jk S )zQ
        Implemented to make sorted available upon CharsetMatches items.
        g{Gzt?g{Gz?)
r/   r   
ValueErrorabschaos	coherencelenr   r   multi_byte_usage)r(   r-   Zchaos_differenceZcoherence_differencer)   r)   r*   __lt__3   s    
zCharsetMatch.__lt__r.   c                 C  s*   t | j}|dkrdS dt t| |  S )Nr   r   g      ?)r8   rawr   )r(   Zraw_lenr)   r)   r*   r9   I   s    
zCharsetMatch.multi_byte_usagec                 C  sV   | j d krPt| j| jd| _ | jrP| jdkrP| j rP| j d dkrP| j dd  | _ | j S )Nstrictutf_7r   u   ﻿r	   )r&   r   r   r   r!   r(   r)   r)   r*   __str__Q   s    
zCharsetMatch.__str__c                 C  s   d| j  d| j dS )Nz<CharsetMatch 'z' fp(z)>)r0   r1   r?   r)   r)   r*   __repr__a   s    zCharsetMatch.__repr__Nonec                 C  s8   t |tr|| kr"td|jd |_| j| d S )Nz;Unable to add instance <{}> as a submatch of a CharsetMatch)r/   r   r4   format	__class__r&   r#   appendr2   r)   r)   r*   add_submatchd   s    zCharsetMatch.add_submatchc                 C  s   | j S N)r   r?   r)   r)   r*   r0   o   s    zCharsetMatch.encoding	list[str]c                 C  sD   g }t  D ]2\}}| j|kr*|| q| j|kr|| q|S )z
        Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855.
        )r   itemsr0   rE   )r(   Zalso_known_asupr)   r)   r*   encoding_aliasess   s    

zCharsetMatch.encoding_aliasesc                 C  s   | j S rG   r!   r?   r)   r)   r*   bom   s    zCharsetMatch.bomc                 C  s   | j S rG   rM   r?   r)   r)   r*   byte_order_mark   s    zCharsetMatch.byte_order_markc                 C  s   dd | j D S )z
        Return the complete list of possible languages found in decoded sequence.
        Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'.
        c                 S  s   g | ]}|d  qS )r   r)   ).0er)   r)   r*   
<listcomp>   s     z*CharsetMatch.languages.<locals>.<listcomp>r    r?   r)   r)   r*   r      s    zCharsetMatch.languagesc                 C  sp   | j sbd| jkrdS ddlm}m} t| jr8|| jn|| j}t|dksVd|krZdS |d S | j d d S )z
        Most probable language found in decoded sequence. If none were detected or inferred, the property will return
        "Unknown".
        asciiZEnglishr   )encoding_languagesmb_encoding_languageszLatin BasedUnknown)r    could_be_from_charsetZcharset_normalizer.cdrU   rV   r   r0   r8   )r(   rU   rV   r   r)   r)   r*   language   s    
zCharsetMatch.languagec                 C  s   | j S rG   )r   r?   r)   r)   r*   r6      s    zCharsetMatch.chaosc                 C  s   | j s
dS | j d d S )Nr   r   r	   rS   r?   r)   r)   r*   r7      s    zCharsetMatch.coherencec                 C  s   t | jd ddS Nd      )ndigits)roundr6   r?   r)   r)   r*   percent_chaos   s    zCharsetMatch.percent_chaosc                 C  s   t | jd ddS rZ   )r^   r7   r?   r)   r)   r*   percent_coherence   s    zCharsetMatch.percent_coherencec                 C  s   | j S )z+
        Original untouched bytes.
        )r   r?   r)   r)   r*   r<      s    zCharsetMatch.rawzlist[CharsetMatch]c                 C  s   | j S rG   )r#   r?   r)   r)   r*   submatch   s    zCharsetMatch.submatchc                 C  s   t | jdkS Nr   )r8   r#   r?   r)   r)   r*   has_submatch   s    zCharsetMatch.has_submatchc                 C  s@   | j d k	r| j S dd t| D }ttdd |D | _ | j S )Nc                 S  s   g | ]}t |qS r)   )r   )rP   charr)   r)   r*   rR      s     z*CharsetMatch.alphabets.<locals>.<listcomp>c                 S  s   h | ]}|r|qS r)   r)   )rP   rr)   r)   r*   	<setcomp>   s      z)CharsetMatch.alphabets.<locals>.<setcomp>)r"   r   sortedlist)r(   Zdetected_rangesr)   r)   r*   	alphabets   s
    
zCharsetMatch.alphabetsc                 C  s   | j gdd | jD  S )z
        The complete list of encoding that output the exact SAME str result and therefore could be the originating
        encoding.
        This list does include the encoding available in property 'encoding'.
        c                 S  s   g | ]
}|j qS r)   )r0   )rP   mr)   r)   r*   rR      s     z6CharsetMatch.could_be_from_charset.<locals>.<listcomp>)r   r#   r?   r)   r)   r*   rX      s    z"CharsetMatch.could_be_from_charsetutf_8bytes)r0   r.   c                   s~    j dks j |krx| _ t } jdk	rj j dkrjtt fdd|dd dd}||dd  }||d _ jS )	z
        Method to get re-encoded bytes payload using given target encoding. Default to UTF-8.
        Any errors will be simply ignored by the encoder NOT replaced.
        N)zutf-8utf8rk   c                   s<   | j |  d |  d  |  d t jddS )Nr   r	   _-)stringspanreplacegroupsr   r%   )rj   r?   r)   r*   <lambda>   s   
z%CharsetMatch.output.<locals>.<lambda>i    r	   )countrr   )r%   r   r'   lowerr   r
   encoder$   )r(   r0   decoded_stringZpatched_headerr)   r?   r*   output   s$    


zCharsetMatch.outputintc                 C  s   t t| S )z]
        Retrieve a hash fingerprint of the decoded payload, used for deduplication.
        )hashr   r?   r)   r)   r*   r1      s    zCharsetMatch.fingerprint)NN)rk   )__name__
__module____qualname__r+   r3   r:   propertyr9   r@   rA   rF   r0   rL   rN   rO   r   rY   r6   r7   r_   r`   r<   ra   rc   ri   rX   ry   r1   r)   r)   r)   r*   r      sV     	r   c                   @  s   e Zd ZdZd ddddZddd	d
ZddddZdddddZddddZddddZ	dddddZ
ddddZddddZdS )!CharsetMatchesz
    Container with every CharsetMatch items ordered by default from most probable to the less one.
    Act like a list(iterable) but does not implements all related methods.
    Nzlist[CharsetMatch] | None)resultsc                 C  s   |rt |ng | _d| _d S NT)rg   _results
_is_sorted)r(   r   r)   r)   r*   r+     s    zCharsetMatches.__init__rB   r;   c                 C  s   | j s| j  d| _ d S r   )r   r   sortr?   r)   r)   r*   _ensure_sorted  s    
zCharsetMatches._ensure_sortedzIterator[CharsetMatch]c                 c  s   |    | jE d H  d S rG   )r   r   r?   r)   r)   r*   __iter__  s    zCharsetMatches.__iter__z	int | strr   )itemr.   c                 C  sV   t |tr|   | j| S t |trNt|d}| jD ]}||jkr6|  S q6tdS )z
        Retrieve a single item either by its position or encoding name (alias may be used here).
        Raise KeyError upon invalid index or encoding not present in results.
        FN)r/   rz   r   r   r   r   rX   KeyError)r(   r   resultr)   r)   r*   __getitem__  s    






zCharsetMatches.__getitem__rz   c                 C  s
   t | jS rG   r8   r   r?   r)   r)   r*   __len__'  s    zCharsetMatches.__len__r   c                 C  s   t | jdkS rb   r   r?   r)   r)   r*   __bool__*  s    zCharsetMatches.__bool__c                 C  sv   t |tstdt|jt|jtk r`| j	D ],}|j
|j
kr2|j|jkr2||  dS q2| j	| d| _dS )z~
        Insert a single match. Will be inserted accordingly to preserve sort.
        Can be inserted as a submatch.
        z-Cannot append instance '{}' to CharsetMatchesNF)r/   r   r4   rC   r   rD   r8   r<   r   r   r1   r6   rF   rE   r   )r(   r   matchr)   r)   r*   rE   -  s    


zCharsetMatches.appendzCharsetMatch | Nonec                 C  s   | j s
dS |   | j d S )zQ
        Simply return the first match. Strict equivalent to matches[0].
        Nr   )r   r   r?   r)   r)   r*   bestA  s    zCharsetMatches.bestc                 C  s   |   S )zP
        Redundant method, call the method best(). Kept for BC reasons.
        )r   r?   r)   r)   r*   firstJ  s    zCharsetMatches.first)N)r|   r}   r~   __doc__r+   r   r   r   r   r   rE   r   r   r)   r)   r)   r*   r     s   	r   c                   @  sN   e Zd ZddddddddddddddZed	d
ddZdd
ddZdS )CliDetectionResultr   r   rH   r   r   pathr0   rL   alternative_encodingsrY   ri   r   r6   r7   unicode_pathis_preferredc                 C  sF   || _ |
| _|| _|| _|| _|| _|| _|| _|| _|	| _	|| _
d S rG   )r   r   r0   rL   r   rY   ri   r   r6   r7   r   )r(   r   r0   rL   r   rY   ri   r   r6   r7   r   r   r)   r)   r*   r+   V  s    zCliDetectionResult.__init__zdict[str, Any]r;   c                 C  s2   | j | j| j| j| j| j| j| j| j| j	| j
dS )Nr   r   r?   r)   r)   r*   __dict__p  s    zCliDetectionResult.__dict__c                 C  s   ddl m} || jdddS )Nr   )dumpsT   )ensure_asciiindent)jsonr   r   )r(   r   r)   r)   r*   to_json  s    zCliDetectionResult.to_jsonN)r|   r}   r~   r+   r   r   r   r)   r)   r)   r*   r   U  s   "r   N)
__future__r   Zencodings.aliasesr   rer   typingr   r   r   r   Zconstantr
   r   utilsr   r   r   r   r   r   r   ZCoherenceMatchr   r   r)   r)   r)   r*   <module>   s    {L