o
    ja~                     @   s  d dl mZmZmZ d dlmZ d dlmZmZ d dl	Z	d dl
Z
d dlmZmZ d dlmZ ddlmZmZmZmZ dd	lmZ dd
lmZ edd eD Zedd eD Zedd eD ZeeddgB ZdZejred dkr{eddks}J e
 edd e!d d Z"ne
 eZ"h dZ#e
 dZ$i Z%G dd de&Z'dd Z(G dd de&Z)G dd de)Z*G dd  d e+Z,G d!d" d"e&Z-G d#d$ d$e&Z.d%d& Z/dS )'    )absolute_importdivisionunicode_literals)	text_type)http_clienturllibN)BytesIOStringIO)webencodings   )EOFspaceCharactersasciiLettersasciiUppercase)_ReparseException)_utilsc                 C      g | ]}| d qS asciiencode.0item r   [C:\Users\bbmin\dev\vps-for-web\.venv\Lib\site-packages\pip/_vendor/html5lib/_inputstream.py
<listcomp>       r   c                 C   r   r   r   r   r   r   r   r      r   c                 C   r   r   r   r   r   r   r   r      r      >   <u   [---﷐-﷯￾￿🿾🿿𯿾𯿿𿿾𿿿񏿾񏿿񟿾񟿿񯿾񯿿񿿾񿿿򏿾򏿿򟿾򟿿򯿾򯿿򿿾򿿿󏿾󏿿󟿾󟿿󯿾󯿿󿿾󿿿􏿾􏿿]]z"\uD800-\uDFFF">    i
 i i i i i i i i i i i i i	 i i i	 i i i i i i i i i i i
 i i i i z[	- -/:-@\[-`{-~]c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )BufferedStreamzBuffering for streams that do not have buffering of their own

    The buffer is implemented as a list of chunks on the assumption that
    joining many strings will be slow since it is O(n**2)
    c                 C   s   || _ g | _ddg| _d S )Nr    r   )streambufferposition)selfr#   r   r   r   __init__:   s   zBufferedStream.__init__c                 C   s<   d}| j d | jd  D ]}|t|7 }q|| jd 7 }|S Nr   r   )r$   r%   len)r&   poschunkr   r   r   tell?   s
   zBufferedStream.tellc                 C   sd   ||   ksJ |}d}t| j| |k r+|t| j| 8 }|d7 }t| j| |k s||g| _d S r(   )_bufferedBytesr)   r$   r%   )r&   r*   offsetir   r   r   seekF   s   zBufferedStream.seekc                 C   sP   | j s| |S | jd t| j kr#| jd t| j d kr#| |S | |S )Nr   r   r    )r$   _readStreamr%   r)   _readFromBufferr&   bytesr   r   r   readO   s   


zBufferedStream.readc                 C   s   t dd | jD S )Nc                 S   s   g | ]}t |qS r   )r)   r   r   r   r   r   Y   s    z1BufferedStream._bufferedBytes.<locals>.<listcomp>)sumr$   r&   r   r   r   r-   X      zBufferedStream._bufferedBytesc                 C   s<   | j |}| j| | jd  d7  < t|| jd< |S r(   )r#   r5   r$   appendr%   r)   )r&   r4   datar   r   r   r1   [   s
   zBufferedStream._readStreamc                 C   s   |}g }| j d }| j d }|t| jk rc|dkrc|dksJ | j| }|t|| kr6|}||| g| _ nt|| }|t|g| _ |d7 }|||||   ||8 }d}|t| jk rc|dks|rm|| | d|S )Nr   r       )r%   r)   r$   r9   r1   join)r&   r4   remainingBytesrvbufferIndexbufferOffsetbufferedDatabytesToReadr   r   r   r2   b   s(   



zBufferedStream._readFromBufferN)__name__
__module____qualname____doc__r'   r,   r0   r5   r-   r1   r2   r   r   r   r   r"   3   s    		r"   c                 K   s   t | tjst | tjjrt | jtjrd}nt| dr%t | dt	}nt | t	}|rCdd |D }|r;t
d| t| fi |S t| fi |S )NFr5   r   c                 S   s   g | ]	}| d r|qS )	_encoding)endswith)r   xr   r   r   r      s    z#HTMLInputStream.<locals>.<listcomp>z3Cannot set an encoding with a unicode input, set %r)
isinstancer   HTTPResponser   responseaddbasefphasattrr5   r   	TypeErrorHTMLUnicodeInputStreamHTMLBinaryInputStream)sourcekwargs	isUnicode	encodingsr   r   r   HTMLInputStream}   s   

rW   c                   @   sp   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dddZdd Zdd ZdddZdd ZdS )rQ   Provides a unicode stream of characters to the HTMLTokenizer.

    This class takes care of character encoding and removing or replacing
    incorrect byte-sequences and also provides column and line tracking.

    i (  c                 C   sZ   t jsd| _ntddkr| j| _n| j| _dg| _tddf| _| 	|| _
|   dS )  Initialises the HTMLInputStream.

        HTMLInputStream(source, [encoding]) -> Normalized stream from source
        for use by html5lib.

        source can be either a file-object, local filename or a string.

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)

        Nu   􏿿r   r   utf-8certain)r   supports_lone_surrogatesreportCharacterErrorsr)   characterErrorsUCS4characterErrorsUCS2newLineslookupEncodingcharEncoding
openStream
dataStreamreset)r&   rS   r   r   r   r'      s   
zHTMLUnicodeInputStream.__init__c                 C   s.   d| _ d| _d| _g | _d| _d| _d | _d S )N r   )r+   	chunkSizechunkOffseterrorsprevNumLinesprevNumCols_bufferedCharacterr7   r   r   r   re      s   
zHTMLUnicodeInputStream.resetc                 C   s   t |dr	|}|S t|}|S zvProduces a file object from source.

        source can be either a file object, local filename or a string.

        r5   )rO   r	   r&   rS   r#   r   r   r   rc      s
   
z!HTMLUnicodeInputStream.openStreamc                 C   sZ   | j }|dd|}| j| }|dd|}|dkr#| j| }||fS ||d  }||fS )N
r   r    r   )r+   countrj   rfindrk   )r&   r.   r+   nLinespositionLinelastLinePospositionColumnr   r   r   	_position   s   

z HTMLUnicodeInputStream._positionc                 C   s   |  | j\}}|d |fS )z:Returns (line, col) of the current position in the stream.r   )rv   rh   )r&   linecolr   r   r   r%      s   zHTMLUnicodeInputStream.positionc                 C   s6   | j | jkr|  stS | j }| j| }|d | _ |S )zo Read one character from the stream or queue if available. Return
            EOF when EOF is reached.
        r   )rh   rg   	readChunkr   r+   )r&   rh   charr   r   r   rz      s   

zHTMLUnicodeInputStream.charNc                 C   s   |d u r| j }| | j\| _| _d| _d| _d| _| j|}| j	r,| j	| }d | _	n|s0dS t
|dkrWt|d }|dksLd|  krJdkrWn n|d | _	|d d }| jr_| | |d	d
}|dd
}|| _t
|| _dS )Nrf   r   Fr   r          i  z
ro   T)_defaultChunkSizerv   rg   rj   rk   r+   rh   rd   r5   rl   r)   ordr]   replace)r&   rg   r:   lastvr   r   r   ry      s0   
 


z HTMLUnicodeInputStream.readChunkc                 C   s(   t tt|D ]}| jd q	d S )Ninvalid-codepoint)ranger)   invalid_unicode_refindallri   r9   )r&   r:   _r   r   r   r^     s   z*HTMLUnicodeInputStream.characterErrorsUCS4c                 C   s   d}t |D ]Q}|rqt| }| }t|||d  r9t|||d  }|tv r6| j	
d d}q|dkrP|dkrP|t|d krP| j	
d qd}| j	
d qd S )NF   r   Tr|   i  r   )r   finditerr   groupstartr   isSurrogatePairsurrogatePairToCodepointnon_bmp_invalid_codepointsri   r9   r)   )r&   r:   skipmatch	codepointr*   char_valr   r   r   r_   #  s$   z*HTMLUnicodeInputStream.characterErrorsUCS2Fc           
      C   s  zt ||f }W n4 ty<   	 |D ]
}t|dk sJ qddd |D }|s-d| }td|  }t ||f< Y nw g }	 || j| j}|du rT| j| j	krSn*n|
 }|| j	krl|| j| j|  || _n|| j| jd  |  s|nq@d|}	|	S )	z Returns a string of characters from the stream up to but not
        including any character in 'characters' or EOF. 'characters' must be
        a container that supports the 'in' method and iteration over its
        characters.
        T   rf   c                 S   s   g | ]}d t | qS )z\x%02x)r   )r   cr   r   r   r   H  s    z5HTMLUnicodeInputStream.charsUntil.<locals>.<listcomp>z^%sz[%s]+N)charsUntilRegExKeyErrorr   r<   recompiler   r+   rh   rg   endr9   ry   )
r&   
charactersoppositecharsr   regexr>   mr   rr   r   r   
charsUntil:  s:   	

z!HTMLUnicodeInputStream.charsUntilc                 C   sZ   |t ur)| jdkr|| j | _|  jd7  _d S |  jd8  _| j| j |ks+J d S d S r(   )r   rh   r+   rg   )r&   rz   r   r   r   ungeti  s   
zHTMLUnicodeInputStream.ungetN)F)rC   rD   rE   rF   r~   r'   re   rc   rv   r%   rz   ry   r^   r_   r   r   r   r   r   r   rQ      s     
&
/rQ   c                   @   sR   e Zd ZdZ			dddZdd Zd	d
 ZdddZdd Zdd Z	dd Z
dS )rR   rX   Nwindows-1252Tc                 C   sn   |  || _t| | j d| _d| _|| _|| _|| _|| _	|| _
| || _| jd dus1J |   dS )rY   i   d   r   N)rc   	rawStreamrQ   r'   numBytesMetanumBytesChardetoverride_encodingtransport_encodingsame_origin_parent_encodinglikely_encodingdefault_encodingdetermineEncodingrb   re   )r&   rS   r   r   r   r   r   
useChardetr   r   r   r'     s   zHTMLBinaryInputStream.__init__c                 C   s&   | j d j| jd| _t|  d S )Nr   r   )rb   
codec_infostreamreaderr   rd   rQ   re   r7   r   r   r   re     s   zHTMLBinaryInputStream.resetc                 C   sJ   t |dr|}nt|}z
||  W |S  ty$   t|}Y |S w rm   )rO   r   r0   r,   	Exceptionr"   rn   r   r   r   rc     s   

z HTMLBinaryInputStream.openStreamc                 C   s  |   df}|d d ur|S t| jdf}|d d ur|S t| jdf}|d d ur,|S |  df}|d d ur:|S t| jdf}|d d urQ|d jdsQ|S t| jdf}|d d ur`|S |rzddl	m
} W n	 tys   Y n@w g }| }|js| j| j}t|tsJ |sn|| || |jr||  t|jd }| jd |d ur|dfS t| jdf}|d d ur|S tddfS )Nr[   r   	tentativezutf-16)UniversalDetectorencodingr   )	detectBOMra   r   r   detectEncodingMetar   name
startswithr   %pip._vendor.chardet.universaldetectorr   ImportErrordoner   r5   r   rJ   r4   r9   feedcloseresultr0   r   )r&   chardetrb   r   buffersdetectorr$   r   r   r   r   r     sV   

z'HTMLBinaryInputStream.determineEncodingc                 C   s   | j d dks	J t|}|d u rd S |jdv r$td}|d us"J d S || j d kr5| j d df| _ d S | jd |df| _ |   td| j d |f )Nr   r[   utf-16beutf-16lerZ   r   zEncoding changed from %s to %s)rb   ra   r   r   r0   re   r   )r&   newEncodingr   r   r   changeEncoding  s   

z$HTMLBinaryInputStream.changeEncodingc              
   C   s   t jdt jdt jdt jdt jdi}| jd}t|t	sJ |
|dd }d}|s?|
|}d}|s?|
|dd	 }d	}|rK| j| t|S | jd
 dS )zAttempts to detect at BOM at the start of the stream. If
        an encoding can be determined from the BOM return the name of the
        encoding otherwise return NonerZ   r   r   zutf-32lezutf-32be   N   r   r   )codecsBOM_UTF8BOM_UTF16_LEBOM_UTF16_BEBOM_UTF32_LEBOM_UTF32_BEr   r5   rJ   r4   getr0   ra   )r&   bomDictstringr   r0   r   r   r   r     s&   
zHTMLBinaryInputStream.detectBOMc                 C   sV   | j | j}t|tsJ t|}| j d | }|dur)|jdv r)t	d}|S )z9Report the encoding declared by the meta element
        r   Nr   rZ   )
r   r5   r   rJ   r4   EncodingParserr0   getEncodingr   ra   )r&   r$   parserr   r   r   r   r   3  s   z(HTMLBinaryInputStream.detectEncodingMeta)NNNNr   T)T)rC   rD   rE   rF   r'   re   rc   r   r   r   r   r   r   r   r   rR   z  s    
*
>"rR   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zeee
Zdd ZeeZefddZdd Zdd Zdd ZdS )EncodingByteszString-like object with an associated position and various extra methods
    If the position is ever greater than the string length then an exception is
    raisedc                 C   s   t |tsJ t| | S r   )rJ   r4   __new__lowerr&   valuer   r   r   r   F  s   zEncodingBytes.__new__c                 C   s
   d| _ d S )Nr    )rv   r   r   r   r   r'   J  s   
zEncodingBytes.__init__c                 C   s   | S r   r   r7   r   r   r   __iter__N  s   zEncodingBytes.__iter__c                 C   s<   | j d  }| _ |t| krt|dk rt| ||d  S )Nr   r   rv   r)   StopIterationrP   r&   pr   r   r   __next__Q  s   zEncodingBytes.__next__c                 C   s   |   S r   )r   r7   r   r   r   nextY  s   zEncodingBytes.nextc                 C   s@   | j }|t| krt|dk rt|d  | _ }| ||d  S r(   r   r   r   r   r   previous]  s   zEncodingBytes.previousc                 C   s   | j t| kr	t|| _ d S r   rv   r)   r   )r&   r%   r   r   r   setPositionf  s   
zEncodingBytes.setPositionc                 C   s&   | j t| kr	t| j dkr| j S d S )Nr   r   r7   r   r   r   getPositionk  s
   
zEncodingBytes.getPositionc                 C   s   | | j | j d  S Nr   )r%   r7   r   r   r   getCurrentByteu  r8   zEncodingBytes.getCurrentBytec                 C   sR   | j }|t| k r$| ||d  }||vr|| _|S |d7 }|t| k s	|| _dS )zSkip past a list of charactersr   Nr%   r)   rv   r&   r   r   r   r   r   r   r   z  s   zEncodingBytes.skipc                 C   sR   | j }|t| k r$| ||d  }||v r|| _|S |d7 }|t| k s	|| _d S r   r   r   r   r   r   	skipUntil  s   zEncodingBytes.skipUntilc                 C   s(   |  || j}|r|  jt|7  _|S )zLook for a sequence of bytes at the start of a string. If the bytes
        are found return True and advance the position to the byte after the
        match. Otherwise return False and leave the position alone)r   r%   r)   )r&   r4   r>   r   r   r   
matchBytes  s   zEncodingBytes.matchBytesc                 C   s6   z|  || jt| d | _W dS  ty   tw )zLook for the next sequence of bytes matching a given sequence. If
        a match is found advance the position to the last byte of the matchr   T)indexr%   r)   rv   
ValueErrorr   r3   r   r   r   jumpTo  s   zEncodingBytes.jumpToN)rC   rD   rE   rF   r   r'   r   r   r   r   r   r   propertyr%   r   currentBytespaceCharactersBytesr   r   r   r   r   r   r   r   r   B  s"    	
	r   c                   @   sX   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdS )r   z?Mini parser for detecting character encoding from meta elementsc                 C   s   t || _d| _dS )z3string - the data to work on for encoding detectionN)r   r:   r   r&   r:   r   r   r   r'     s   

zEncodingParser.__init__c              
   C   s   d| j vrd S d| jfd| jfd| jfd| jfd| jfd| jff}| j D ]?}d}z| j d W n ty<   Y  | j	S w |D ]\}}| j |r\z| }W  n ty[   d}Y  nw q?|sc | j	S q$| j	S )	Ns   <metas   <!--s   </s   <!s   <?r   TF)
r:   handleComment
handleMetahandlePossibleEndTaghandleOtherhandlePossibleStartTagr   r   r   r   )r&   methodDispatchr   keepParsingkeymethodr   r   r   r     s@   

zEncodingParser.getEncodingc                 C      | j dS )zSkip over commentss   -->r:   r   r7   r   r   r   r     s   zEncodingParser.handleCommentc                 C   s   | j jtvrdS d}d }	 |  }|d u rdS |d dkr/|d dk}|r.|d ur.|| _dS n?|d dkrG|d }t|}|d urF|| _dS n'|d dkrntt|d }| }|d urnt|}|d urn|rl|| _dS |}q)	NTFr   s
   http-equivr   s   content-type   charsets   content)	r:   r   r   getAttributer   ra   ContentAttrParserr   parse)r&   	hasPragmapendingEncodingattrtentativeEncodingcodeccontentParserr   r   r   r     s@   zEncodingParser.handleMetac                 C   s
   |  dS )NF)handlePossibleTagr7   r   r   r   r     s   
z%EncodingParser.handlePossibleStartTagc                 C   s   t | j | dS )NT)r   r:   r  r7   r   r   r   r     s   

z#EncodingParser.handlePossibleEndTagc                 C   sj   | j }|jtvr|r|  |   dS |t}|dkr#|  dS |  }|d ur3|  }|d us+dS )NTr   )r:   r   asciiLettersBytesr   r   r   spacesAngleBracketsr   )r&   endTagr:   r   r  r   r   r   r    s   

z EncodingParser.handlePossibleTagc                 C   r   )Nr   r   r7   r   r   r   r     s   zEncodingParser.handleOtherc                 C   s  | j }|ttdgB }|du st|dksJ |dv rdS g }g }	 |dkr+|r+n0|tv r4| }n'|dv r?d|dfS |tv rK||  n|du rQdS || t	|}q$|dkrj|
  d|dfS t	| | }|d	v r|}	 t	|}||krt	| d|d|fS |tv r||  n|| qy|d
krd|dfS |tv r||  n|du rdS || 	 t	|}|tv rd|d|fS |tv r||  n|du rdS || q)z_Return a name,value pair for the next attribute in the stream,
        if one is found, or None   /Nr   )r   NT   =)r
  r   r;   )   '   "r   )r:   r   r   	frozensetr)   r<   asciiUppercaseBytesr9   r   r   r   r  )r&   r:   r   attrName	attrValue	quoteCharr   r   r   r     sn   



zEncodingParser.getAttributeN)rC   rD   rE   rF   r'   r   r   r   r   r   r  r   r   r   r   r   r   r     s    $r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   t |tsJ || _d S r   )rJ   r4   r:   r   r   r   r   r'   a  s   
zContentAttrParser.__init__c                 C   s  zy| j d | j  jd7  _| j   | j jdksW d S | j  jd7  _| j   | j jdv rS| j j}| j  jd7  _| j j}| j |rP| j || j j W S W d S | j j}z| j t | j || j j W W S  tyy   | j |d   Y W S w  ty   Y d S w )Nr   r   r  )r  r  )r:   r   r%   r   r   r   r   r   )r&   	quoteMarkoldPositionr   r   r   r   e  s2   

zContentAttrParser.parseN)rC   rD   rE   r'   r   r   r   r   r   r   `  s    r   c                 C   s\   t | trz| d} W n
 ty   Y dS w | dur,zt| W S  ty+   Y dS w dS )z{Return the python codec name corresponding to an encoding or None if the
    string doesn't correspond to a valid encoding.r   N)rJ   r4   decodeUnicodeDecodeErrorr
   lookupAttributeError)r   r   r   r   ra     s   
ra   )0
__future__r   r   r   pip._vendor.sixr   pip._vendor.six.movesr   r   r   r   ior   r	   pip._vendorr
   	constantsr   r   r   r   r   rf   r   r  r   r  r  r  invalid_unicode_no_surrogater\   rp   r   evalr   r   ascii_punctuation_rer   objectr"   rW   rQ   rR   r4   r   r   r   ra   r   r   r   r   <module>   sJ    

J g Ib ='