o
    i e+                     @   s  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 d dlmZ dd	lmZmZmZmZmZmZ eed
dedefddZeed
dedefddZeed
dedee fddZeed
dedefddZ eed
dedefddZ!eed
dedefddZ"eed
dedefddZ#eed
dedefddZ$eed
dedefddZ%eed
dedefdd Z&eed
dedefd!d"Z'eed
dedefd#d$Z(eed
dedefd%d&Z)eed
dedefd'd(Z*ee+ed
d)edefd*d+Z,eed
dedefd,d-Z-d[d/e.d0e/dee fd1d2Z0ed3d
d4edefd5d6Z1d/e.deee e.f fd7d8Z2d9edefd:d;Z3d\d=ed>edefd?d@Z4dAedee fdBdCZ5dDedEede6fdFdGZ7dDedEedefdHdIZ8dJej9dKfd4edLe/dMeddfdNdOZ:	d]dPe.dQedRe;dSe/dTedUedVe.dWedXee deeddf fdYdZZ<dS )^    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   sT   zt | }W n
 ty   Y dS w d|v p)d|v p)d|v p)d|v p)d|v p)d|v S )NFz
WITH GRAVEz
WITH ACUTEzWITH CEDILLAzWITH DIAERESISzWITH CIRCUMFLEXz
WITH TILDEunicodedataname
ValueErrorr   description r   G/var/www/myenv/lib/python3.10/site-packages/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   
decomposedcodesr   r   r   remove_accent&   s
   

r(   c                 C   s.   t | }t D ]\}}||v r|  S qdS )zK
    Retrieve the Unicode range official name from a single character.
    N)ordr   items)r   character_ord
range_name	ord_ranger   r   r   unicode_range1   s   r.   c                 C   *   z
t | }W d|v S  ty   Y dS w )NFLATINr   r   r   r   r   is_latin?   s   r1   c                 C   s2   t | }d|v rdS t| }|d u rdS d|v S )NPTFPunctuationr   categoryr.   r   character_categorycharacter_ranger   r   r   is_punctuationH   s   
r9   c                 C   s:   t | }d|v sd|v rdS t| }|d u rdS d|v S )NSNTFFormsr4   r6   r   r   r   	is_symbolW   s   
r=   c                 C   s   t | }|d u r
dS d|v S )NF	Emoticons)r.   )r   r8   r   r   r   is_emoticonf   s   r?   c                 C   s.   |   s| dv r
dS t| }d|v p|dv S )N>      ｜+<>TZ>   PcPdPo)isspacer   r5   )r   r7   r   r   r   is_separatorp   s   
rI   c                 C   s   |   |  kS N)islowerisupperr   r   r   r   is_case_variablez   s   rN   c                 C   r/   )NFCJKr   r   character_namer   r   r   is_cjk      rR   c                 C   r/   )NFHIRAGANAr   rP   r   r   r   is_hiragana   rS   rU   c                 C   r/   )NFKATAKANAr   rP   r   r   r   is_katakana   rS   rW   c                 C   r/   )NFHANGULr   rP   r   r   r   	is_hangul   rS   rY   c                 C   r/   )NFTHAIr   rP   r   r   r   is_thai   rS   r[   r,   c                    s   t  fddtD S )Nc                 3   s    | ]}| v V  qd S rJ   r   ).0keywordr,   r   r   	<genexpr>   s    z-is_unicode_range_secondary.<locals>.<genexpr>)anyr   r^   r   r^   r   is_unicode_range_secondary   s   ra   c                 C   s(   |   du o|  du o| dko| dkS )NFu   ﻿)rH   isprintablerM   r   r   r   is_unprintable   s   
rd       sequencesearch_zonec                 C   s   t | tstt| }tt| dt|| jddd}t|dkr$dS |D ]'}| 	dd}t
 D ]\}}||krB|    S ||krL|    S q4q&dS )zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    Nasciiignoreerrorsr   -_)
isinstancebytes	TypeErrorlenr   r   mindecodelowerreplacer   r*   )rf   rg   seq_lenresultsspecified_encodingencoding_aliasencoding_ianar   r   r   any_specified_encoding   s&   
r{      r   c                 C   s    | dv pt td| jtS )zQ
    Verify is a specific encoding is a multi byte one based on it IANA name
    >	   utf_7utf_8utf_16utf_32	utf_16_be	utf_16_le	utf_32_be	utf_32_le	utf_8_sigencodings.{})
issubclass	importlibimport_moduleformatr   r   )r   r   r   r   is_multi_byte_encoding   s   
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   rn   ro   
startswith)rf   iana_encodingmarksmarkr   r   r   identify_sig_or_bom   s   

r   r   c                 C   s   | dvS )N>   r   r   r   )r   r   r   r   should_strip_sig_or_bom  s   r   Tcp_namestrictc                 C   sL   |   dd} t D ]\}}| ||fv r|  S q|r$td| | S )Nrl   rm   z Unable to retrieve IANA for '{}')rt   ru   r   r*   r   r   )r   r   ry   rz   r   r   r   	iana_name  s   r   decoded_sequencec                 C   s4   t  }| D ]}t|}|d u rq|| qt|S rJ   )setr.   addlist)r   rangesr   r8   r   r   r   
range_scan  s   r   iana_name_aiana_name_bc           	      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rA|d7 }q,|d S )	Ng        r   ri   rj   r      r      )r   r   r   r   r   rangero   rs   )	r   r   	decoder_a	decoder_bid_aid_bcharacter_match_countito_be_decodedr   r   r   cp_similarity*  s*   


r   c                 C   s   | t v o	|t |  v 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_similarB  s   
r   charset_normalizerz)%(asctime)s | %(levelname)s | %(message)slevelformat_stringc                 C   s:   t | }|| t  }|t | || d S rJ   )logging	getLoggersetLevelStreamHandlersetFormatter	Formatter
addHandler)r   r   r   loggerhandlerr   r   r   set_logging_handlerM  s
   

r   	sequencesrz   offsets
chunk_sizebom_or_sig_availablestrip_sig_or_bomsig_payloadis_multi_byte_decoderdecoded_payloadc	                 c   s&   |r|du r|D ]}	||	|	|  }
|
s d S |
V  q	d S |D ]p}	|	| }|t | d kr/q | |	|	|  }|rA|du rA|| }|j||rHdndd}
|r|	dkrt|d}|r|
d | |vrt|	|	d d	D ]#}| || }|r{|du r{|| }|j|dd}
|
d | |v r nqi|
V  q d S )
NF   ri   r   rj   r   r!      )rq   rs   rr   r   )r   rz   r   r   r   r   r   r   r   r   chunk	chunk_endcut_sequencechunk_partial_size_chkjr   r   r   cut_sequence_chunksZ  sD   

r   )re   )TrJ   )=r   r   r   codecsr   encodings.aliasesr   	functoolsr   rer   typingr   r   r   r	   r
   r   _multibytecodecr   constantr   r   r   r   r   r   strboolr   r(   r.   r1   r9   r=   r?   rI   rN   rR   rU   rW   rY   r[   rq   ra   rd   ro   r%   r{   r   r   r   r   r   floatr   r   INFOr   r   r   r   r   r   r   <module>   s      

							
 
	
