B
    CVvgÉ$  ã               @   sN  d dl 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 G dd„ deƒZd4dd„ZedƒeeeejejejfZdd„ Zd5dd„Zd6dd„Zd7dd„Zd8dd„Zd9dd„Zdd„ Zddddgedd ƒed!d"ƒgZd#d$„ eD ƒZd%Ze  d&d$„ ed'd… D ƒ¡ d(d)„ Z!d*d+„ Z"d,d-„ Z#d.d/„ Z$d0d1„ Z%d2d3„ Z&e&ƒ Z'dS ):é    N)ÚDecimal)Úquote)ÚRemovedInDjango40Warning)ÚPromisec                   s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚDjangoUnicodeDecodeErrorc                s   || _ tƒ j|Ž  d S )N)ÚobjÚsuperÚ__init__)Úselfr   Úargs)Ú	__class__© ú9/tmp/pip-install-o3oxmrkh/Django/django/utils/encoding.pyr	      s    z!DjangoUnicodeDecodeError.__init__c                s   dt ƒ  ¡ | jt| jƒf S )Nz%s. You passed in %r (%s))r   Ú__str__r   Útype)r
   )r   r   r   r      s    z DjangoUnicodeDecodeError.__str__)Ú__name__Ú
__module__Ú__qualname__r	   r   Ú__classcell__r   r   )r   r   r      s   r   úutf-8FÚstrictc             C   s   t | tƒr| S t| |||ƒS )z©
    Return a string representing 's'. Treat bytestrings using the 'encoding'
    codec.

    If strings_only is True, don't convert (some) non-string-like objects.
    )Ú
isinstancer   Ú	force_str)ÚsÚencodingÚstrings_onlyÚerrorsr   r   r   Ú	smart_str   s    
r   c             C   s
   t | tƒS )z¢Determine if the object instance is of a protected type.

    Objects of protected types are preserved as-is when passed to
    force_str(strings_only=True).
    )r   Ú_PROTECTED_TYPES)r   r   r   r   Úis_protected_type'   s    r   c          
   C   s~   t t| ƒtƒr| S |r"t| ƒr"| S y$t| tƒr<t| ||ƒ} nt| ƒ} W n2 tk
rx } zt| f|jžŽ ‚W dd}~X Y nX | S )zÇ
    Similar to smart_str(), except that lazy instances are resolved to
    strings, rather than kept as lazy objects.

    If strings_only is True, don't convert (some) non-string-like objects.
    N)	Ú
issubclassr   Ústrr   r   ÚbytesÚUnicodeDecodeErrorr   r   )r   r   r   r   Úer   r   r   r   0   s    
"r   c             C   s   t | tƒr| S t| |||ƒS )z�
    Return a bytestring version of 's', encoded as specified in 'encoding'.

    If strings_only is True, don't convert (some) non-string-like objects.
    )r   r   Úforce_bytes)r   r   r   r   r   r   r   Úsmart_bytesF   s    
r&   c             C   s\   t | tƒr*|dkr| S |  d|¡ ||¡S |r:t| ƒr:| S t | tƒrLt| ƒS t| ƒ ||¡S )zÇ
    Similar to smart_bytes, except that lazy instances are resolved to
    strings, rather than kept as lazy objects.

    If strings_only is True, don't convert (some) non-string-like objects.
    zutf-8)r   r"   ÚdecodeÚencoder   Ú
memoryviewr!   )r   r   r   r   r   r   r   r%   R   s    

r%   c             C   s   t jdtdd� t| |||ƒS )Nz3smart_text() is deprecated in favor of smart_str().é   )Ú
stacklevel)ÚwarningsÚwarnr   r   )r   r   r   r   r   r   r   Ú
smart_textf   s    
r.   c             C   s   t jdtdd� t| |||ƒS )Nz3force_text() is deprecated in favor of force_str().r*   )r+   )r,   r-   r   r   )r   r   r   r   r   r   r   Ú
force_textn   s    
r/   c             C   s*   | dkr| S t | tƒrt| ƒ} t| dd�S )uö  
    Convert an Internationalized Resource Identifier (IRI) portion to a URI
    portion that is suitable for inclusion in a URL.

    This is the algorithm from section 3.1 of RFC 3987, slightly simplified
    since the input is assumed to be a string rather than an arbitrary byte
    stream.

    Take an IRI (string or UTF-8 bytes, e.g. '/I â™¥ Django/' or
    b'/I Ã¢Â™Â¥ Django/') and return a string containing the encoded
    result with ASCII chars only (e.g. '/I%20%E2%99%A5%20Django/').
    Nz/#%[]=:;$&()+,!?*@'~)Úsafe)r   r   r!   r   )Úirir   r   r   Ú
iri_to_uriv   s
    
r2   é-   é.   é_   é~   éA   é[   éa   é{   c             C   s4   i | ],}|D ]"}d D ]}t |fƒ||  ¡ “qqqS ))z%02xz%02X)r"   r(   )Ú.0Zascii_rangeÚcharÚfmtr   r   r   ú
<dictcomp>™   s   r>   Ú0123456789ABCDEFabcdefc             C   s.   i | ]&}t D ]}t || ¡||  ¡ “qqS r   )Ú_hexdigr"   Úfromhexr(   )r;   ÚaÚbr   r   r   r>   ¢   s   é   c             C   sº   | dkr| S t | ƒ} |  d¡}t|ƒdkr0| }n~|d g}|j}t}x^|dd… D ]N}|dd… }||kr�|||dd…  ƒ ||dd… ƒ qR|dƒ ||ƒ qRW d |¡}t|ƒ ¡ S )uL  
    Convert a Uniform Resource Identifier(URI) into an Internationalized
    Resource Identifier(IRI).

    This is the algorithm from section 3.2 of RFC 3987, excluding step 4.

    Take an URI in ASCII bytes (e.g. '/I%20%E2%99%A5%20Django/') and return
    a string containing the encoded result (e.g. '/I%20â™¥%20Django/').
    Nó   %é   r   r*   ó    )r%   ÚsplitÚlenÚappendÚ
_hextobyteÚjoinÚrepercent_broken_unicoder'   )ÚuriÚbitsr1   ÚpartsrJ   Z	hextobyteÚitemÚhexr   r   r   Ú
uri_to_iri¨   s$    



rS   c             C   s   t | dd�S )zh
    Escape the unsafe characters from the path portion of a Uniform Resource
    Identifier (URI).
    z/:@&+$,-_.!~*'())r0   )r   )Úpathr   r   r   Úescape_uri_pathÌ   s    rU   c             C   s   |   d¡ d¡S )z:Return the Punycode of the given domain if it's non-ASCII.ÚidnaÚascii)r(   r'   )Údomainr   r   r   ÚpunycodeÝ   s    rY   c          
   C   sŽ   g }x„y|   ¡  W nd tk
rv } zFt| |j|j… dd�}| | d|j… | ¡  ¡ | |jd… } W dd}~X Y qX d |¡|  S qW dS )z¼
    As per section 3.2 of RFC 3987, step three of converting a URI into an IRI,
    repercent-encode any octet produced that is not part of a strictly legal
    UTF-8 octet sequence.
    s   /#%[]=:;$&()+,!?*@'~)r0   NrG   )r'   r#   r   ÚstartÚendrJ   r(   rL   )rT   Zchanged_partsr$   Z	repercentr   r   r   rM   â   s     rM   c             C   s$   | dkr| S t t| ƒ dd¡dd�S )aA  Convert a file system path to a URI portion that is suitable for
    inclusion in a URL.

    Encode certain chars that would normally be recognized as special chars
    for URIs. Do not encode the ' character, as it is a valid character
    within URIs. See the encodeURIComponent() JavaScript function for details.
    Nú\ú/z/~!*()')r0   )r   r!   Úreplace)rT   r   r   r   Úfilepath_to_uriö   s    r_   c              C   s<   yt  ¡ d pd} t | ¡ W n tk
r6   d} Y nX | S )z´
    The encoding of the default system locale. Fallback to 'ascii' if the
    #encoding is unsupported by Python or could not be determined. See tickets
    #10335 and #5846.
    rF   rW   )ÚlocaleÚgetdefaultlocaleÚcodecsÚlookupÚ	Exception)r   r   r   r   Úget_system_encoding  s    
re   )r   Fr   )r   Fr   )r   Fr   )r   Fr   )r   Fr   )r   Fr   )(rb   Údatetimer`   r,   Údecimalr   Úurllib.parser   Zdjango.utils.deprecationr   Zdjango.utils.functionalr   r#   r   r   r   ÚintÚfloatÚdateÚtimer   r   r   r&   r%   r.   r/   r2   ÚrangeZ_ascii_rangesrK   r@   ÚupdaterS   rU   rY   rM   r_   re   ZDEFAULT_LOCALE_ENCODINGr   r   r   r   Ú<module>   s<   	
	




"
$