U
    j*7                     @  s  U d dl mZ d dlZd dlZd dl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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 m!Z!m"Z"m#Z#m$Z$m%Z% d	d
dddZ&d	ddddZ'd	d	dddZ(e)dd e* D Z+de,d< dd e+D Z-de,d< d	ddddZ.d	ddddZ/d	ddd d!Z0d	ddd"d#Z1d	ddd$d%Z2d	ddd&d'Z3d	ddd(d)Z4d	ddd*d+Z5d	ddd,d-Z6d	ddd.d/Z7d	ddd0d1Z8d	ddd2d3Z9d	ddd4d5Z:d	ddd6d7Z;d	ddd8d9Z<d	dd:d;d<Z=d	ddd=d>Z>dfd@d
ddAdBdCZ?e
ddDd	ddEdFdGZ@d@dHdIdJdKZAd	ddLdMdNZBdgd	dd	dPdQdRZCd	d	dSdTdUdVZDd	d	ddTdWdXZEdYejFdZfd	d
d	d[d\d]d^ZGdhd@d	d`d
dddaddddbdcdddeZHdS )i    )annotationsN)bisect_right)IncrementalDecoder)	lru_cache)	Generator   )ENCODING_MARKSIANA_SUPPORTED_SIMILARRE_POSSIBLE_ENCODING_INDICATIONUNICODE_RANGES_COMBINED_SECONDARY_RANGE_NAMESCOMMON_CJK_CHARACTERS_LATIN_CJK_HANGUL	_KATAKANA	_HIRAGANA_HALFWIDTH_KATAKANA_THAI_ARABIC_ARABIC_ISOLATED_FORM	_LIGATURE_SUPERSCRIPT_SENTENCE_OPEN_PUNCTUATION_ACCENT_KEYWORDS_ACCENTUATED_KNOWN_MB_DECODERS_KNOWN_MB_CLASSES_IANA_NAMES_MULTIBYTE_SEARCH_RADIUSstrint)	characterreturnc                 C  s  zt | }W n tk
r$   Y dS X d}d|kr:|tO }d|krJ|tO }d|krZ|tO }d|krz|tO }d|krz|tO }d|kr|tO }d|kr|t	O }d	|kr|t
O }d
|kr|tO }d|ks|dr|tO }d|kr|tO }|dkr|tO }tD ]}||kr|tO } qq|S )zRCompute all name-based classification flags with a single unicodedata.name() call.r   ZLATINCJKZHANGULZKATAKANAZ	HALFWIDTHZHIRAGANAZTHAIZARABICzISOLATED FORMZLIGATUREz	LETTER AEZSUPERSCRIPT>   INVERTED EXCLAMATION MARKINVERTED QUESTION MARK)unicodedataname
ValueErrorr   r   r   r   r   r   r   r   r   endswithr   r   r   r   r   )r"   descflagskw r.   </tmp/pip-unpacked-wheel-bwd693va/charset_normalizer/utils.py_character_flags'   sD    r0   boolc                 C  s   t t| t@ S N)r1   r0   r   r"   r.   r.   r/   is_accentuatedQ   s    r4   c                 C  s.   t | }|s| S |d}tt|d dS )N r      )r'   decompositionsplitchrr!   )r"   Z
decomposedcodesr.   r.   r/   remove_accentU   s
    

r;   c                 c  s    | ]\}}|j |j|fV  qd S r2   )startstop).0r(   Z	ord_ranger.   r.   r/   	<genexpr>a   s   r?   zlist[tuple[int, int, str]]_UNICODE_RANGES_SORTEDc                 C  s   g | ]}|d  qS )r   r.   )r>   er.   r.   r/   
<listcomp>e   s     rB   z	list[int]_UNICODE_RANGE_STARTSz
str | Nonec                 C  sT   t | }|dk rdS |dk r dS tt|d }|dkrPt| \}}}||k rP|S dS )zK
    Retrieve the Unicode range official name from a single character.
        zControl character   zBasic Latinr   r   N)ordr   rC   r@   )r"   Zcharacter_ordidxr<   r=   r(   r.   r.   r/   unicode_rangeh   s    rH   c                 C  s   t t| t@ S r2   )r1   r0   r   r3   r.   r.   r/   is_latin}   s    rI   c                 C  s2   t | }d|krdS t| }|d kr*dS d|kS )NPTFZPunctuationr'   categoryrH   r"   character_categorycharacter_ranger.   r.   r/   is_punctuation   s    
rP   c                 C  sB   t | }d|ksd|krdS t| }|d kr2dS d|ko@|dkS )NSNTFZFormsZLorK   rM   r.   r.   r/   	is_symbol   s    
rS   c                 C  s$   t | }|d krdS d|kp"d|kS )NFZ	EmoticonsZPictographs)rH   )r"   rO   r.   r.   r/   is_emoticon   s    rT   c                 C  s.   |   s| dkrdS t| }d|kp,|dkS )N>   +<>   ｜TZ>   PcPoPd)isspacer'   rL   )r"   rN   r.   r.   r/   is_separator   s    
r^   c                 C  s   |   |  kS r2   )islowerisupperr3   r.   r.   r/   is_case_variable   s    ra   c                 C  s   t t| t@ S r2   )r1   r0   r   r3   r.   r.   r/   is_cjk   s    rb   c                 C  s   t t| t@ S r2   )r1   r0   r   r3   r.   r.   r/   is_hiragana   s    rc   c                 C  s   t t| t@ S r2   )r1   r0   r   r3   r.   r.   r/   is_katakana   s    rd   c                 C  s   t t| t@ S r2   )r1   r0   r   r3   r.   r.   r/   	is_hangul   s    re   c                 C  s   t t| t@ S r2   )r1   r0   r   r3   r.   r.   r/   is_thai   s    rf   c                 C  s   t t| t@ S r2   )r1   r0   r   r3   r.   r.   r/   	is_arabic   s    rg   c                 C  s   t t| t@ S r2   )r1   r0   r   r3   r.   r.   r/   is_arabic_isolated_form   s    rh   c                 C  s   | t kS r2   )r   r3   r.   r.   r/   is_cjk_uncommon   s    ri   )
range_namer#   c                 C  s   | t kS r2   )r   )rj   r.   r.   r/   is_unicode_range_secondary   s    rk   c                 C  s$   |    o"|   o"| dko"| dkS )Nu   ﻿)r]   isprintabler3   r.   r.   r/   is_unprintable   s    
rn       zbytes | bytearray)sequencesearch_zoner#   c           	      C  s   t | ttfstt| }| dt|| }| }d|krHd|krHdS |jddd}t	|D ]4}|
d dd	}t|}|dk	r`|  S q`dS )
zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    Ns   codings   charsetasciiignoreerrorsr   -_)
isinstancebytes	bytearray	TypeErrorlenminlowerdecoder
   finditergroupreplacer   get)	rp   rq   Zseq_lenZsearch_bytesZlowered_bytesZdecoded_zonematchZspecified_encodingencoding_ianar.   r.   r/   any_specified_encoding   s    

r   )maxsize)r(   r#   c                 C  sR   | t krdS tD ]<}zt||  W n tttfk
rF   Y qY nX  dS dS )zQ
    Verify is a specific encoding is a multi byte one based on it IANA name
    TF)r   r   	importlibimport_moduleZgetcodecImportErrorAttributeErrorLookupError)r(   Zproviderr.   r.   r/   is_multi_byte_encoding   s    	
r   ztuple[str | None, bytes])rp   r#   c                 C  sJ   t D ]@}t | }t|tr |g}|D ]}| |r$||f    S q$qdS )z9
    Identify and extract SIG/BOM in given sequence.
    )N    )r   rx   ry   
startswith)rp   iana_encodingZmarksmarkr.   r.   r/   identify_sig_or_bom  s    

r   )r   r#   c                 C  s   | dkS )N>   utf_16utf_32r.   )r   r.   r.   r/   should_strip_sig_or_bom(  s    r   T)cp_namestrictr#   c                 C  s>   |   dd} t| }|dk	r&|S |r:td|  d| S )zIReturns the Python normalized encoding name (Not the IANA official name).rv   rw   NzUnable to retrieve IANA for '')r~   r   r   r   r)   )r   r   r   r.   r.   r/   	iana_name,  s    
r   float)iana_name_aiana_name_br#   c           	      C  s   t | st |rdS td|  j}td| j}|dd}|dd}d}tdD ]*}t|g}||||krX|d7 }qX|d S )Ng        z
encodings.rs   rt   r      r   )r   r   r   r   rangery   r   )	r   r   Z	decoder_aZ	decoder_bZid_aZid_bZcharacter_match_countiZto_be_decodedr.   r.   r/   cp_similarity:  s    



r   c                 C  s   | t ko|t |  kS )z
    Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using
    the function cp_similarity.
    )r	   )r   r   r.   r.   r/   is_cp_similarN  s    
r   Zcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sNone)r(   levelformat_stringr#   c                 C  s:   t | }|| t  }|t | || d S r2   )logging	getLoggersetLevelStreamHandlersetFormatter	Formatter
addHandler)r(   r   r   loggerhandlerr.   r.   r/   set_logging_handlerY  s
    

r   Fr   ry   zGenerator[str, None, None])	sequencesr   offsets
chunk_sizebom_or_sig_availablestrip_sig_or_bomsig_payloadis_multi_byte_decoderdecoded_payloaddeferred_decodingr#   c
                 c  s.  |rV| drVt|}
t| }|D ].}||
 | }||||  }|sJ qR|V  q"n|r|s|D ]"}||||  }|s~ q|V  qbn|	r|s| n| t|d  }|D ](}||||  }|s qt||V  qnR|D ]J}|| }|t| d krq| |||  }|r |s || }|j||r0dndd}|r"|dkr"t|d}|d | }d}|rt|}
||
 t|  }td|t }t|
|t }||||dk}|r"|s"||kr"t||d	 d
D ]L}| || }|r|s|| }|j|dd}|d | |kr q"q|V  qd S )NZiso2022_   rs   r   rt   r   r6   F   )	r   r|   r    r   r}   maxr   findr   )r   r   r   r   r   r   r   r   r   r   Zdecoded_lengthZsequence_lengthr   Zdecoded_offsetchunkZ
base_bytesZcut_sequenceZ	chunk_endZchunk_partial_size_chkZchunk_prefixZfound_nearbyZexpected_offsetZsearch_startZ
search_endjr.   r.   r/   cut_sequence_chunksf  s    

 
r   )ro   )T)NF)I
__future__r   r   r   r'   bisectr   codecsr   	functoolsr   typingr   Zconstantr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r4   r;   sorteditemsr@   __annotations__rC   rH   rI   rP   rS   rT   r^   ra   rb   rc   rd   re   rf   rg   rh   ri   rk   rn   r   r   r   r   r   r   r   INFOr   r   r.   r.   r.   r/   <module>   sb    h*		   