U
    d-                     @   s  zd dl ZW n ek
r(   d dlZY nX 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 d dlmZ dd	lmZmZmZmZmZmZ e
ed
eedddZe
ed
eedddZ e
ed
eee dddZ!e
ed
eedddZ"e
ed
eedddZ#e
ed
eedddZ$e
ed
eedddZ%e
ed
eedddZ&e
ed
eedddZ'e
ed
eedddZ(eedd d!Z)e
ed
eedd"d#Z*e
ed
eedd$d%Z+e
ed
eedd&d'Z,e
ed
eedd(d)Z-e
ed
eedd*d+Z.e
e/ed
eed,d-d.Z0e
ed
eedd/d0Z1dSe2e3ee d2d3d4Z4e
d5d
eed6d7d8Z5e2eee e2f d9d:d;Z6eed<d=d>Z7dTeeed@dAdBZ8eee dCdDdEZ9eee:dFdGdHZ;eeedFdIdJZ<dKej=dLfee3eddMdNdOZ>dUe2ee?e3eee2eee eeddf dP
dQdRZ@dS )V    N)IncrementalDecoder)aliases)	lru_cache)findall)	GeneratorListOptionalSetTupleUnion)MultibyteIncrementalDecoder   )ENCODING_MARKSIANA_SUPPORTED_SIMILARRE_POSSIBLE_ENCODING_INDICATIONUNICODE_RANGES_COMBINEDUNICODE_SECONDARY_RANGE_KEYWORDUTF8_MAXIMAL_ALLOCATION)maxsize)	characterreturnc                 C   sV   zt | }W n tk
r$   Y dS X d|kpTd|kpTd|kpTd|kpTd|kpTd|kS )NFz
WITH GRAVEz
WITH ACUTEzWITH CEDILLAzWITH DIAERESISzWITH CIRCUMFLEXz
WITH TILDEunicodedataname
ValueErrorr   description r   </tmp/pip-unpacked-wheel-b4wixufl/charset_normalizer/utils.pyis_accentuated   s    r   c                 C   s.   t | }|s| S |d}tt|d dS )N r      )r   decompositionsplitchrint)r   Z
decomposedcodesr   r   r   remove_accent,   s
    

r'   c                 C   s.   t | }t D ]\}}||kr|  S qdS )zK
    Retrieve the Unicode range official name from a single character.
    N)ordr   items)r   Zcharacter_ord
range_nameZ	ord_ranger   r   r   unicode_range7   s
    
r+   c                 C   s.   zt | }W n tk
r$   Y dS X d|kS )NFZLATINr   r   r   r   r   is_latinE   s
    r,   c                 C   s*   z|  d W n tk
r$   Y dS X dS )NasciiFT)encodeUnicodeEncodeErrorr   r   r   r   is_asciiN   s
    r1   c                 C   s2   t | }d|krdS t| }|d kr*dS d|kS )NPTFZPunctuationr   categoryr+   r   character_categorycharacter_ranger   r   r   is_punctuationW   s    
r8   c                 C   s:   t | }d|ksd|krdS t| }|d kr2dS d|kS )NSNTFZFormsr3   r5   r   r   r   	is_symbolf   s    
r;   c                 C   s   t | }|d krdS d|kS )NFZ	Emoticons)r+   )r   r7   r   r   r   is_emoticonu   s    r<   c                 C   s&   |   s| dkrdS t| }d|kS )N>   +   ｜;<,>TZ)isspacer   r4   r   r6   r   r   r   is_separator   s    
rF   c                 C   s   |   |  kS N)islowerisupperr0   r   r   r   is_case_variable   s    rJ   c                 C   s   t | }|dkS )NCo)r   r4   rE   r   r   r   is_private_use_only   s    
rL   c                 C   s.   zt | }W n tk
r$   Y dS X d|kS )NFCJKr   r   Zcharacter_namer   r   r   is_cjk   s
    rO   c                 C   s.   zt | }W n tk
r$   Y dS X d|kS )NFZHIRAGANAr   rN   r   r   r   is_hiragana   s
    rP   c                 C   s.   zt | }W n tk
r$   Y dS X d|kS )NFZKATAKANAr   rN   r   r   r   is_katakana   s
    rQ   c                 C   s.   zt | }W n tk
r$   Y dS X d|kS )NFZHANGULr   rN   r   r   r   	is_hangul   s
    rR   c                 C   s.   zt | }W n tk
r$   Y dS X d|kS )NFZTHAIr   rN   r   r   r   is_thai   s
    rS   )r*   r   c                    s   t  fddtD S )Nc                 3   s   | ]}| kV  qd S rG   r   ).0keywordr*   r   r   	<genexpr>   s     z-is_unicode_range_secondary.<locals>.<genexpr>)anyr   rV   r   rV   r   is_unicode_range_secondary   s    rY   c                 C   s(   |   dko&|  dko&| dko&| dkS )NFu   ﻿)rD   isprintabler0   r   r   r   is_unprintable   s    
r\      )sequencesearch_zoner   c                 C   s   t | tstt| }tt| dt|| jddd}t|dkrHdS |D ]N}| 	dd}t
 D ]0\}}||kr|    S ||krh|    S qhqLdS )zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    Nr-   ignoreerrorsr   -_)
isinstancebytes	TypeErrorlenr   r   mindecodelowerreplacer   r)   )r^   r_   Zseq_lenresultsZspecified_encodingencoding_aliasencoding_ianar   r   r   any_specified_encoding   s"    
rp      )r   r   c                 C   s    | dkpt td| jtS )zQ
    Verify is a specific encoding is a multi byte one based on it IANA name
    >	   utf_8	utf_8_sigutf_32utf_16utf_7	utf_32_le	utf_16_be	utf_16_le	utf_32_beencodings.{})
issubclass	importlibimport_moduleformatr   r   )r   r   r   r   is_multi_byte_encoding   s    
r   )r^   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   re   rf   
startswith)r^   iana_encodingZmarksmarkr   r   r   identify_sig_or_bom  s    

r   )r   r   c                 C   s   | dkS )N>   ru   rt   r   )r   r   r   r   should_strip_sig_or_bom  s    r   T)cp_namestrictr   c                 C   sL   |   dd} t D ]\}}| ||fkr|  S q|rHtd| | S )Nrc   rd   z Unable to retrieve IANA for '{}')rk   rl   r   r)   r   r   )r   r   rn   ro   r   r   r   	iana_name!  s    
r   )decoded_sequencer   c                 C   s4   t  }| D ] }t|}|d kr q
|| q
t|S rG   )setr+   addlist)r   rangesr   r7   r   r   r   
range_scan1  s    r   )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        r{   r`   ra   r      r      )r   r}   r~   r   r   rangerf   rj   )	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_similarX  s    
r   Zcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)s)r   levelformat_stringr   c                 C   s:   t | }|| t  }|t | || d S rG   )logging	getLoggersetLevelStreamHandlersetFormatter	Formatter
addHandler)r   r   r   loggerhandlerr   r   r   set_logging_handlerc  s
    

r   )
	sequencesro   offsets
chunk_sizebom_or_sig_availablestrip_sig_or_bomsig_payloadis_multi_byte_decoderdecoded_payloadr   c	                 c   s>  |r8|dkr8|D ]"}	||	|	|  }
|
s, q4|
V  qn|D ]}	|	| }|t | d krZq<| |	|	|  }|r~|dkr~|| }|j||rdndd}
|r2|	dkr2| |	 dkr2t|d}|r2|
d | |kr2t|	|	d	 d
D ]L}| || }|r|dkr|| }|j|dd}
|
d | |kr q2q|
V  q<d S )NF   r`   r   ra   r   rq   r!      )rh   rj   ri   r   )r   ro   r   r   r   r   r   r   r   r   chunkZ	chunk_endZcut_sequenceZchunk_partial_size_chkjr   r   r   cut_sequence_chunksq  s>    

r   )r]   )T)N)AZunicodedata2r   ImportErrorr}   r   codecsr   Zencodings.aliasesr   	functoolsr   rer   typingr   r   r   r	   r
   r   Z_multibytecodecr   Zconstantr   r   r   r   r   r   strboolr   r'   r+   r,   r1   r8   r;   r<   rF   rJ   rL   rO   rP   rQ   rR   rS   rh   rY   r\   rf   r%   rp   r   r   r   r   r   floatr   r   INFOr   r   r   r   r   r   r   <module>   s     

							
  