o
    ‹¨Êhó~  ã                   @   sÖ  d dl mZmZmZ d dlmZmZ d dlmZm	Z	 d dl
Z
d dlZd dlZddlmZmZmZmZ ddlmZ ddlmZ d d	lmZ zd d
lmZ W n eyW   eZY nw 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rŸed dkr�e  d¡dks�J ‚e !edd… e"dƒ d ¡Z#ne !e¡Z#e$g 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(ƒZ0d%d&„ Z1dS )'é    )Úabsolute_importÚdivisionÚunicode_literals)Ú	text_typeÚbinary_type)Úhttp_clientÚurllibNé   )ÚEOFÚspaceCharactersÚasciiLettersÚasciiUppercase)Ú_ReparseException)Ú_utils)ÚStringIO)ÚBytesIOc                 C   ó   g | ]}|  d ¡‘qS ©Úascii©Úencode©Ú.0Úitem© r   úG/var/www/html/env/lib/python3.10/site-packages/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 )ÚBufferedStreamzÆBuffering 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   ÚtellE   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   ÚseekL   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   ÚreadU   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   _   s    z1BufferedStream._bufferedBytes.<locals>.<listcomp>)Úsumr$   ©r&   r   r   r   r-   ^   ó   zBufferedStream._bufferedBytesc                 C   s<   | j  |¡}| j |¡ | jd  d7  < t|ƒ| jd< |S r(   )r#   r4   r$   Úappendr%   r)   )r&   r3   Údatar   r   r   r1   a   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$   r8   r1   Újoin)r&   r3   ÚremainingBytesÚrvÚbufferIndexÚbufferOffsetÚbufferedDataÚbytesToReadr   r   r   r2   h   s(   


ò
zBufferedStream._readFromBufferN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   r,   r0   r4   r-   r1   r2   r   r   r   r   r"   9   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 )NFr4   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Úhasattrr4   r   Ú	TypeErrorÚHTMLUnicodeInputStreamÚHTMLBinaryInputStream)ÚsourceÚkwargsÚ	isUnicodeÚ	encodingsr   r   r   ÚHTMLInputStreamƒ   s   þý

rV   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 )rP   ú×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&   rR   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Ú_bufferedCharacterr6   r   r   r   rd   Ä   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.

        r4   )rN   r   ©r&   rR   r#   r   r   r   rb   Ò   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+   Úcountri   Úrfindrj   )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	   )ru   rg   )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	   )rg   rf   Ú	readChunkr
   r+   )r&   rg   Úcharr   r   r   ry   ð   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 )Nre   r   Fr	   r    é   é Ø  iÿÛ  z
rn   úT)Ú_defaultChunkSizeru   rf   ri   rj   r+   rg   rc   r4   rk   r)   Úordr\   Úreplace)r&   rf   r9   Úlastvr   r   r   rx   ÿ   s0   
 


z HTMLUnicodeInputStream.readChunkc                 C   s(   t tt |¡ƒƒD ]}| j d¡ q	d S )Núinvalid-codepoint)Úranger)   Úinvalid_unicode_reÚfindallrh   r8   )r&   r9   Ú_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_codepointsrh   r8   r)   )r&   r9   Ú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é€   re   c                 S   s   g | ]}d t |ƒ ‘qS )z\x%02x)r~   )r   Úcr   r   r   r   N  s    z5HTMLUnicodeInputStream.charsUntil.<locals>.<listcomp>z^%sz[%s]+N)ÚcharsUntilRegExÚKeyErrorr~   r;   ÚreÚcompilerŽ   r+   rg   rf   Úendr8   rx   )
r&   Ú
charactersÚoppositeÚcharsr’   Úregexr=   Úmr—   Úrr   r   r   Ú
charsUntil@  s:   ù	ÿ
ë
z!HTMLUnicodeInputStream.charsUntilc                 C   sZ   |d 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(   )rg   r+   rf   )r&   ry   r   r   r   Úungeto  s   
õzHTMLUnicodeInputStream.unget©N)F)rB   rC   rD   rE   r}   r'   rd   rb   ru   r%   ry   rx   r]   r^   rž   rŸ   r   r   r   r   rP   š   s     
&
/rP   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 )rQ   rW   Núwindows-1252Tc                 C   sn   |   |¡| _t | | j¡ d| _d| _|| _|| _|| _|| _	|| _
|  |¡| _| jd dus1J ‚|  ¡  dS )rX   i   éd   r   N)rb   Ú	rawStreamrP   r'   ÚnumBytesMetaÚnumBytesChardetÚoverride_encodingÚtransport_encodingÚsame_origin_parent_encodingÚlikely_encodingÚdefault_encodingÚdetermineEncodingra   rd   )r&   rR   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   )ra   Ú
codec_infoÚstreamreaderr£   rc   rP   rd   r6   r   r   r   rd   ²  s   zHTMLBinaryInputStream.resetc                 C   sB   t |dƒr|}nt|ƒ}z
| | ¡ ¡ W |S    t|ƒ}Y |S rl   )rN   r   r0   r,   r"   rm   r   r   r   rb   ¶  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 |r³zddl	m
} W n	 tys   Y n@w g }|ƒ }|jsš| j | j¡}t|tƒsŠJ ‚|s�n| |¡ | |¡ |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 )NrZ   r   Ú	tentativezutf-16)ÚUniversalDetectorÚencodingr¡   )Ú	detectBOMr`   r¦   r§   ÚdetectEncodingMetar¨   ÚnameÚ
startswithr©   Úchardet.universaldetectorr°   ÚImportErrorÚdoner£   r4   r¥   rI   r3   r8   ÚfeedÚcloseÚresultr0   rª   )r&   Úchardetra   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	   rZ   ©úutf-16beúutf-16lerY   r   zEncoding changed from %s to %s)ra   r`   r´   r£   r0   rd   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 )z©Attempts 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 NonerY   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£   r4   rI   r3   Úgetr0   r`   )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¿   rY   )
r£   r4   r¤   rI   r3   ÚEncodingParserr0   ÚgetEncodingr´   r`   )r&   r$   Úparserr±   r   r   r   r³   9  s   z(HTMLBinaryInputStream.detectEncodingMeta)NNNNr¡   T)T)rB   rC   rD   rE   r'   rd   rb   r«   rÃ   r²   r³   r   r   r   r   rQ   €  s    
þ*
>"rQ   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 )ÚEncodingBytesz£String-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    )rI   r3   Ú__new__Úlower©r&   Úvaluer   r   r   rÓ   L  s   zEncodingBytes.__new__c                 C   s
   d| _ d S )Nr    )ru   rÕ   r   r   r   r'   P  s   
zEncodingBytes.__init__c                 C   s   | S r    r   r6   r   r   r   Ú__iter__T  s   zEncodingBytes.__iter__c                 C   s<   | j d  }| _ |t| ƒkrt‚|dk rt‚| ||d … S )Nr	   r   ©ru   r)   ÚStopIterationrO   ©r&   Úpr   r   r   Ú__next__W  s   zEncodingBytes.__next__c                 C   s   |   ¡ S r    )rÜ   r6   r   r   r   Únext_  s   zEncodingBytes.nextc                 C   s@   | j }|t| ƒkrt‚|dk rt‚|d  | _ }| ||d … S r(   rØ   rÚ   r   r   r   Úpreviousc  s   zEncodingBytes.previousc                 C   s   | j t| ƒkr	t‚|| _ d S r    ©ru   r)   rÙ   )r&   r%   r   r   r   ÚsetPositionl  s   
zEncodingBytes.setPositionc                 C   s&   | j t| ƒkr	t‚| j dkr| j S d S )Nr   rß   r6   r   r   r   ÚgetPositionq  s
   
zEncodingBytes.getPositionc                 C   s   | | j | j d … S ©Nr	   )r%   r6   r   r   r   ÚgetCurrentByte{  r7   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)   ru   ©r&   rš   rÛ   r’   r   r   r   r�   €  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 }| ||t|ƒ … }| |¡}|r|  j t|ƒ7  _ |S )zÓLook 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&   r3   rÛ   r9   r=   r   r   r   Ú
matchBytes—  s   
zEncodingBytes.matchBytesc                 C   sN   | | j d…  |¡}|dkr%| jdkrd| _|  j|t|ƒ d 7  _dS t‚)z�Look for the next sequence of bytes matching a given sequence. If
        a match is found advance the position to the last byte of the matchNr    r   r	   T)r%   Úfindru   r)   rÙ   )r&   r3   ÚnewPositionr   r   r   ÚjumpTo¢  s   
zEncodingBytes.jumpToN)rB   rC   rD   rE   rÓ   r'   r×   rÜ   rÝ   rÞ   rà   rá   Úpropertyr%   rã   ÚcurrentByteÚspaceCharactersBytesr�   ræ   rç   rê   r   r   r   r   rÒ   H  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Ò   r9   r±   ©r&   r9   r   r   r   r'   ³  s   

zEncodingParser.__init__c              
   C   s–   d| j fd| jfd| jfd| jfd| jfd| jff}| jD ]*}d}|D ]\}}| j |¡r@z|ƒ }W  n ty?   d}Y  nw q#|sG | jS q| jS )	Ns   <!--s   <metas   </s   <!s   <?r   TF)	ÚhandleCommentÚ
handleMetaÚhandlePossibleEndTagÚhandleOtherÚhandlePossibleStartTagr9   rç   rÙ   r±   )r&   ÚmethodDispatchr…   ÚkeepParsingÚkeyÚmethodr   r   r   rÐ   ¸  s0   ú
þüýzEncodingParser.getEncodingc                 C   ó   | j  d¡S )zSkip over commentss   -->©r9   rê   r6   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)	r9   rì   rí   ÚgetAttributer±   r`   ÚContentAttrParserrÒ   Úparse)r&   Ú	hasPragmaÚpendingEncodingÚattrÚtentativeEncodingÚcodecÚcontentParserr   r   r   rð   Ó  s@   €þåzEncodingParser.handleMetac                 C   s
   |   d¡S )NF)ÚhandlePossibleTagr6   r   r   r   ró   ÷  s   
z%EncodingParser.handlePossibleStartTagc                 C   s   t | jƒ |  d¡S )NT)rÝ   r9   r  r6   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   )r9   rì   ÚasciiLettersBytesrÞ   rò   ræ   ÚspacesAngleBracketsrû   )r&   ÚendTagr9   r’   r   r   r   r   r  þ  s   

ýÿz EncodingParser.handlePossibleTagc                 C   rø   )Nr   rù   r6   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r�t	|ƒ d |¡d |¡fS |tv r›| | ¡ ¡ n| |¡ qy|d
kr¬d |¡dfS |tv r¸| | ¡ ¡ n|du r¾dS | |¡ 	 t	|ƒ}|tv rÖd |¡d |¡fS |tv râ| | ¡ ¡ n|du rèd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   )r9   r�   rí   Ú	frozensetr)   r;   ÚasciiUppercaseBytesr8   rÔ   rÝ   rÞ   r  )r&   r9   r’   ÚattrNameÚ	attrValueÚ	quoteCharr   r   r   rû     sn   
ð
ô

÷zEncodingParser.getAttributeN)rB   rC   rD   rE   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    )rI   r3   r9   rî   r   r   r   r'   f  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
  )r9   rê   r%   r�   rì   ræ   rí   rÙ   )r&   Ú	quoteMarkÚoldPositionr   r   r   rý   j  s2   

þÿzContentAttrParser.parseN)rB   rC   rD   r'   rý   r   r   r   r   rü   e  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)rI   r   ÚdecodeÚUnicodeDecodeErrorÚwebencodingsÚlookupÚAttributeError)r±   r   r   r   r`   Œ  s   
ÿÿr`   )2Ú
__future__r   r   r   Úsixr   r   Ú	six.movesr   r   rÆ   r•   r  Ú	constantsr
   r   r   r   r   re   r   Úior   r   r·   r  rí   r  r  r  Úinvalid_unicode_no_surrogater[   ro   r–   Úevalrƒ   ÚsetrŒ   Úascii_punctuation_rer“   Úobjectr"   rV   rP   rQ   r3   rÒ   rÏ   rü   r`   r   r   r   r   Ú<module>   sT    ÿÿþ

J g Ih 6'