o
    Í ŽiÒ1  ã                   @  sº   d dl mZ d dlmZ 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)Úsha256)Údumps)Úsub)ÚAnyÚIteratorÚListÚTupleé   )ÚRE_POSSIBLE_ENCODING_INDICATIONÚTOO_BIG_SEQUENCE)Ú	iana_nameÚis_multi_byte_encodingÚunicode_rangec                   @  sH  e Zd Z		dGdHdd„ZdIdd„ZdIdd„ZedJdd„ƒZdKdd„ZdKdd„Z	dLdd „Z
edKd!d"„ƒZedMd$d%„ƒZedNd&d'„ƒZedNd(d)„ƒZedMd*d+„ƒZedKd,d-„ƒZedJd.d/„ƒZedJd0d1„ƒZedJd2d3„ƒZedJd4d5„ƒZedOd6d7„ƒZedPd9d:„ƒZedNd;d<„ƒZedMd=d>„ƒZedMd?d@„ƒZdQdRdCdD„ZedKdEdF„ƒZdS )SÚCharsetMatchNÚpayloadÚbytesÚguessed_encodingÚstrÚmean_mess_ratioÚfloatÚhas_sig_or_bomÚboolÚ	languagesÚCoherenceMatchesÚdecoded_payloadú
str | NoneÚ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,   úcC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\charset_normalizer/models.pyÚ__init__   s   

zCharsetMatch.__init__ÚotherÚobjectÚreturnc                 C  s>   t |tƒst |tƒrt|ƒ| 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 r%|dkr%| j|jkS |dk r@|dkr@t| jƒtkr:| j|jk S | j	|j	kS | j|jk S )zQ
        Implemented to make sorted available upon CharsetMatches items.
        g{®Gáz„?g{®Gáz”?N)
r2   r   Ú
ValueErrorÚabsÚchaosÚ	coherenceÚlenr    r   Úmulti_byte_usage)r+   r/   Zchaos_differenceZcoherence_differencer,   r,   r-   Ú__lt__1   s   
zCharsetMatch.__lt__c                 C  s   dt t| ƒƒt | jƒ  S )Ng      ð?)r;   r   Úraw©r+   r,   r,   r-   r<   G   s   zCharsetMatch.multi_byte_usagec                 C  s"   | j d u rt| j| jdƒ| _ | j S )NÚstrict)r)   r   r    r!   r?   r,   r,   r-   Ú__str__K   s   
zCharsetMatch.__str__c                 C  s   d| j › d| j› d�S )Nz<CharsetMatch 'z' bytes(z)>)r3   r4   r?   r,   r,   r-   Ú__repr__Q   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)r2   r   r7   ÚformatÚ	__class__r)   r&   Úappendr5   r,   r,   r-   Úadd_submatchT   s   ÿÿzCharsetMatch.add_submatchc                 C  ó   | j S ©N)r!   r?   r,   r,   r-   r3   _   ó   zCharsetMatch.encodingú	list[str]c                 C  sD   g }t  ¡ D ]\}}| 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.
        N)r   Úitemsr3   rF   )r+   Zalso_known_asÚuÚpr,   r,   r-   Úencoding_aliasesc   s   


€zCharsetMatch.encoding_aliasesc                 C  rH   rI   ©r$   r?   r,   r,   r-   Úbomp   rJ   zCharsetMatch.bomc                 C  rH   rI   rP   r?   r,   r,   r-   Úbyte_order_markt   rJ   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>~   ó    z*CharsetMatch.languages.<locals>.<listcomp>N©r#   r?   r,   r,   r-   r   x   s   zCharsetMatch.languagesc                 C  sp   | j s1d| jv r
dS ddlm}m} t| jƒr|| jƒn|| jƒ}t|ƒdks+d|v r-d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ÚUnknownN)r#   Úcould_be_from_charsetZcharset_normalizer.cdrY   rZ   r   r3   r;   )r+   rY   rZ   r   r,   r,   r-   Úlanguage€   s   
ÿýzCharsetMatch.languagec                 C  rH   rI   )r"   r?   r,   r,   r-   r9   œ   rJ   zCharsetMatch.chaosc                 C  s   | j sdS | j d d S )Nr   r   r   rW   r?   r,   r,   r-   r:       s   zCharsetMatch.coherencec                 C  ó   t | jd dd�S ©Néd   é   )Úndigits)Úroundr9   r?   r,   r,   r-   Úpercent_chaos¦   ó   zCharsetMatch.percent_chaosc                 C  r^   r_   )rc   r:   r?   r,   r,   r-   Úpercent_coherenceª   re   zCharsetMatch.percent_coherencec                 C  rH   )z+
        Original untouched bytes.
        N)r    r?   r,   r,   r-   r>   ®   s   zCharsetMatch.rawúlist[CharsetMatch]c                 C  rH   rI   )r&   r?   r,   r,   r-   Úsubmatchµ   rJ   zCharsetMatch.submatchc                 C  ó   t | jƒdkS ©Nr   )r;   r&   r?   r,   r,   r-   Úhas_submatch¹   s   zCharsetMatch.has_submatchc                 C  s@   | j d ur| j S dd„ t| ƒD ƒ}ttdd„ |D ƒƒƒ| _ | j S )Nc                 S  s   g | ]}t |ƒ‘qS r,   )r   )rS   Úcharr,   r,   r-   rU   Â   rV   z*CharsetMatch.alphabets.<locals>.<listcomp>c                 S  s   h | ]}|r|’qS r,   r,   )rS   Úrr,   r,   r-   Ú	<setcomp>Ä   rV   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,   )r3   )rS   Úmr,   r,   r-   rU   Î   s    z6CharsetMatch.could_be_from_charset.<locals>.<listcomp>N)r!   r&   r?   r,   r,   r-   r\   Ç   s   z"CharsetMatch.could_be_from_charsetÚutf_8r3   c                   s~   ˆ j du s
ˆ j |kr<|ˆ _ tˆ ƒ}ˆ jdur5ˆ j ¡ dvr5t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Úutf8rs   c                   s<   | j |  ¡ d |  ¡ d …  |  ¡ d tˆ jƒ dd¡¡S )Nr   r   Ú_ú-)ÚstringÚspanÚreplaceÚgroupsr   r(   )rr   r?   r,   r-   Ú<lambda>ß   s    
þz%CharsetMatch.output.<locals>.<lambda>i    r   )Úcountry   )r(   r   r*   Úlowerr   r   Úencoder'   )r+   r3   Údecoded_stringZpatched_headerr,   r?   r-   ÚoutputÐ   s$   ÿÿþ

ù
zCharsetMatch.outputc                 C  s   t |  ¡ ƒ ¡ S )zw
        Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one.
        N)r   r€   Ú	hexdigestr?   r,   r,   r-   r4   í   s   zCharsetMatch.fingerprint)NN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r/   r0   r1   r   )r1   r   ©r1   r   )r/   r   r1   rC   )r1   rK   ©r1   r   )r1   r   )r1   rg   )rs   )r3   r   r1   r   )Ú__name__Ú
__module__Ú__qualname__r.   r6   r=   Úpropertyr<   rA   rB   rG   r3   rO   rQ   rR   r   r]   r9   r:   rd   rf   r>   rh   rk   rq   r\   r€   r4   r,   r,   r,   r-   r      sX    ø




	r   c                   @  sb   e Zd ZdZdddd„Zd d	d
„Zd!dd„Zd"dd„Zd#dd„Zd$dd„Z	d%dd„Z
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.
    NÚresultsúlist[CharsetMatch] | Nonec                 C  s   |r	t |ƒ| _d S g | _d S rI   )ro   Ú_results)r+   r‰   r,   r,   r-   r.   û   s   zCharsetMatches.__init__r1   úIterator[CharsetMatch]c                 c  s   � | j E d H  d S rI   ©r‹   r?   r,   r,   r-   Ú__iter__þ   s   €zCharsetMatches.__iter__Úitemú	int | strr   c                 C  sJ   t |tƒr
| j| S t |tƒr#t|dƒ}| jD ]}||jv r"|  S qt‚)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)r2   Úintr‹   r   r   r\   ÚKeyError)r+   r�   Úresultr,   r,   r-   Ú__getitem__  s   





ÿzCharsetMatches.__getitem__r‘   c                 C  s
   t | jƒS rI   ©r;   r‹   r?   r,   r,   r-   Ú__len__  s   
zCharsetMatches.__len__r   c                 C  ri   rj   r•   r?   r,   r,   r-   Ú__bool__  s   zCharsetMatches.__bool__rC   c                 C  s|   t |tƒstd t|jƒ¡ƒ‚t|jƒtk r0| j	D ]}|j
|j
kr/|j|jkr/| |¡  dS q| j	 |¡ t| j	ƒ| _	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 CharsetMatchesN)r2   r   r7   rD   r   rE   r;   r>   r   r‹   r4   r9   rG   rF   ro   )r+   r�   Úmatchr,   r,   r-   rF     s   
ÿÿ

€zCharsetMatches.appendú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-   Úbest)  s   
zCharsetMatches.bestc                 C  s   |   ¡ S )zP
        Redundant method, call the method best(). Kept for BC reasons.
        N)rš   r?   r,   r,   r-   Úfirst1  s   zCharsetMatches.firstrI   )r‰   rŠ   )r1   rŒ   )r�   r�   r1   r   )r1   r‘   rƒ   )r�   r   r1   rC   )r1   r™   )r„   r…   r†   Ú__doc__r.   rŽ   r”   r–   r—   rF   rš   r›   r,   r,   r,   r-   rˆ   õ   s    





rˆ   c                   @  s.   e Zd Zddd„Zeddd„ƒZddd„ZdS )ÚCliDetectionResultÚpathr   r3   r   rO   rK   Úalternative_encodingsr]   rq   r   r   r9   r   r:   Úunicode_pathÚis_preferredc                 C  sF   || _ |
| _|| _|| _|| _|| _|| _|| _|| _|	| _	|| _
d S rI   )rž   r    r3   rO   rŸ   r]   rq   r   r9   r:   r¡   )r+   rž   r3   rO   rŸ   r]   rq   r   r9   r:   r    r¡   r,   r,   r-   r.   =  s   
zCliDetectionResult.__init__r1   údict[str, Any]c                 C  s2   | j | j| j| j| j| j| j| j| j| j	| j
dœS )N©rž   r3   rO   rŸ   r]   rq   r   r9   r:   r    r¡   r£   r?   r,   r,   r-   Ú__dict__W  s   õzCliDetectionResult.__dict__c                 C  s   t | jddd�S )NTé   )Úensure_asciiÚindent)r   r¤   r?   r,   r,   r-   Úto_jsong  s   zCliDetectionResult.to_jsonN)rž   r   r3   r   rO   rK   rŸ   rK   r]   r   rq   rK   r   r   r9   r   r:   r   r    r   r¡   r   )r1   r¢   r‚   )r„   r…   r†   r.   r‡   r¤   r¨   r,   r,   r,   r-   r�   <  s
    
r�   N)Ú
__future__r   Zencodings.aliasesr   Úhashlibr   Újsonr   Úrer   Útypingr   r   r	   r
   Zconstantr   r   Úutilsr   r   r   r   rˆ   r   r   ZCoherenceMatchr   r�   r,   r,   r,   r-   Ú<module>   s     iC