
¾|j¯.  ã               @   sß  d  d l  m Z d d l Z d d l Z d d l Z d d l Z d  d l m Z d Z d Z	 e j
 d ƒ Z e j d d k rŠ e Z e Z Gd	 d
 „  d
 e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ 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% „  Z d& d' „  Z  d d( d) „ Z! d* d+ „  Z" d, d- „  Z# d. d/ „  Z$ d0 d d1 d2 „ Z% d d d d d3 d4 „ Z& d d d d5 d6 „ Z' d S)7é   )Úidnadataé    N)Úintranges_containé	   s   xn--u   [.ã€‚ï¼Žï½¡]é   c               @   s   e  Z d  Z d Z d S)Ú	IDNAErrorz7 Base exception for all IDNA-encoding related problems N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú)/tmp/pip-build-1hwfuv5s/idna/idna/core.pyr      s   r   c               @   s   e  Z d  Z d Z d S)ÚIDNABidiErrorz= Exception when bidirectional requirements are not satisfied N)r   r	   r
   r   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d Z d S)ÚInvalidCodepointz> Exception when a disallowed or unallocated codepoint is used N)r   r	   r
   r   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d Z d S)ÚInvalidCodepointContextzE Exception when the codepoint is not valid in the context it is used N)r   r	   r
   r   r   r   r   r   r      s   r   c             C   sF   t  j t |  ƒ ƒ } | d k rB t  j t |  ƒ ƒ sB t d ƒ ‚ | S)Nr   z Unknown character in unicodedata)ÚunicodedataÚ	combiningÚunichrÚnameÚ
ValueError)ÚcpÚvr   r   r   Ú_combining_class$   s
    r   c             C   s   t  t |  ƒ t j | ƒ S)N)r   Úordr   Úscripts)r   Úscriptr   r   r   Ú
_is_script+   s    r   c             C   s   |  j  d ƒ S)NÚpunycode)Úencode)Úsr   r   r   Ú	_punycode.   s    r    c             C   s   d j  |  ƒ S)Nz	U+{0:04X})Úformat)r   r   r   r   Ú_unot1   s    r"   c             C   s   t  |  ƒ d k r d Sd S)Né?   FT)Úlen)Úlabelr   r   r   Úvalid_label_length5   s    r&   c             C   s&   t  |  ƒ | r d n d k r" d Sd S)Néþ   éý   FT)r$   )r%   Útrailing_dotr   r   r   Úvalid_string_length<   s    r*   Fc       	      C   sø  d } xh t  |  d ƒ D]W \ } } t j | ƒ } | d k r[ t d j t |  ƒ | ƒ ƒ ‚ | d k r d } q W| rƒ | rƒ d St j |  d	 ƒ } | d k r« d } n0 | d
 k rÀ d } n t d j t |  ƒ ƒ ƒ ‚ d } d } xø t  |  d ƒ D]ç \ } } t j | ƒ } | r–| d k r9t d j | ƒ ƒ ‚ | d k rNd } n | d k r`d } | d k rÞ| s{| } qÞ| | k rÞt d ƒ ‚ q÷ | d k r·t d j | ƒ ƒ ‚ | d k rÌd } q÷ | d k r÷ d } q÷ W| sôt d ƒ ‚ d S)NFr   Ú z3Unknown directionality in label {0} at position {1}ÚRÚALÚANTr   ÚLz>First codepoint in label {0} must be directionality L, R or ALÚENÚESÚCSÚETÚONÚBNÚNSMzHInvalid direction for codepoint at position {0} in a right-to-left labelz2Can not mix numeral types in a right-to-left labelzHInvalid direction for codepoint at position {0} in a left-to-right labelz0Label ends with illegal codepoint directionality)r,   r-   r.   )r,   r-   )
r,   r-   r.   r0   r1   r2   r3   r4   r5   r6   )r,   r-   r0   r.   )r.   r0   )r/   r0   r1   r2   r3   r4   r5   r6   )r/   r0   )Ú	enumerater   Úbidirectionalr   r!   Úrepr)	r%   Ú	check_ltrÚ
bidi_labelÚidxr   Ú	directionÚrtlÚvalid_endingÚnumber_typer   r   r   Ú
check_bidiC   sP    
					
rA   c             C   s-   t  j |  d ƒ d d k r) t d ƒ ‚ d S)Nr   ÚMz0Label begins with an illegal combining characterT)r   Úcategoryr   )r%   r   r   r   Úcheck_initial_combiner   s    rD   c             C   sR   |  d d … d k r" t  d ƒ ‚ |  d d k sB |  d
 d k rN t  d ƒ ‚ d	 S)Né   é   z--z4Label has disallowed hyphens in 3rd and 4th positionr   ú-r   z)Label must not start or end with a hyphenTéÿÿÿÿ)r   )r%   r   r   r   Úcheck_hyphen_ok†   s
     rI   c             C   s(   t  j d |  ƒ |  k r$ t d ƒ ‚ d  S)NÚNFCz%Label must be in Normalization Form C)r   Ú	normalizer   )r%   r   r   r   Ú	check_nfc�   s    rL   c             C   sŸ  t  |  | ƒ } | d k rW| d k rL t t  |  | d ƒ ƒ t k rL d Sd } xt t | d d d ƒ D]\ } t j j t  |  | ƒ ƒ } | t  d ƒ k r  qi | t  d ƒ t  d ƒ g k ri d } Pqi W| sÓ d Sd } xw t | d t |  ƒ ƒ D]\ } t j j t  |  | ƒ ƒ } | t  d ƒ k r*qó | t  d	 ƒ t  d ƒ g k ró d } Pqó W| S| d
 k r—| d k r“t t  |  | d ƒ ƒ t k r“d Sd Sd Sd  S)Ni   r   r   TFÚTr/   ÚDr,   i   rH   rH   )r   r   Ú_virama_combining_classÚranger   Újoining_typesÚgetr$   )r%   ÚposÚcp_valueÚokÚiÚjoining_typer   r   r   Úvalid_contextj•   s<       rX   c             C   s  t  |  | ƒ } | d k r~ d | k  o= t |  ƒ d k  n rz t  |  | d ƒ d k rz t  |  | d ƒ d k rz d Sd S| d k rË | t |  ƒ d k  rÇ t |  ƒ d k rÇ t |  | d d ƒ Sd S| d	 k sã | d
 k r| d k rt |  | d d ƒ Sd S| d k rixN |  D]F } | d k r0qt | d ƒ s]t | d ƒ s]t | d ƒ rd SqWd Sd | k o€d k n rÀx4 |  D], } d t  | ƒ k o¯d k n rŒd SqŒWd Sd | k o×d k n rx4 |  D], } d t  | ƒ k od k n rãd SqãWd Sd  S)Né·   r   r   él   TFiu  ÚGreekió  iô  ÚHebrewiû0  u   ãƒ»ÚHiraganaÚKatakanaÚHani`  ii  ið  iù  )r   r$   r   )r%   rS   Ú	exceptionrT   r   r   r   r   Úvalid_contextoÁ   s>    &4(-""ra   c             C   sÈ  t  |  t t f ƒ r$ |  j d ƒ }  t |  ƒ d k rB t d ƒ ‚ t |  ƒ t |  ƒ t |  ƒ xWt	 |  ƒ D]I\ } } t
 | ƒ } t | t j d ƒ r¡ qm qm t | t j d ƒ r8y> t |  | ƒ sô t d j t | ƒ | d t |  ƒ ƒ ƒ ‚ Wq¶t k
 r4t d j t | ƒ | d t |  ƒ ƒ ƒ ‚ Yq¶Xqm t | t j d	 ƒ r‹t |  | ƒ s¶t d
 j t | ƒ | d t |  ƒ ƒ ƒ ‚ qm t d j t | ƒ | d t |  ƒ ƒ ƒ ‚ qm Wt |  ƒ d  S)Nzutf-8r   zEmpty LabelÚPVALIDÚCONTEXTJz-Joiner {0} not allowed at position {1} in {2}r   z?Unknown codepoint adjacent to joiner {0} at position {1} in {2}ÚCONTEXTOz0Codepoint {0} not allowed at position {1} in {2}z0Codepoint {0} at position {1} of {2} not allowed)Ú
isinstanceÚbytesÚ	bytearrayÚdecoder$   r   rL   rI   rD   r7   r   r   r   Úcodepoint_classesrX   r   r!   r"   r9   r   ra   r   rA   )r%   rS   r   rT   r   r   r   Úcheck_labelê   s0    


	&	*./rj   c             C   s¨   y9 |  j  d ƒ }  t |  ƒ t |  ƒ s4 t d ƒ ‚ |  SWn t k
 rM Yn X|  s` t d ƒ ‚ t |  ƒ }  t |  ƒ t |  ƒ }  t |  }  t |  ƒ s¤ t d ƒ ‚ |  S)NÚasciizLabel too longzNo Input)	r   Úulabelr&   r   ÚUnicodeEncodeErrorÚunicoderj   r    Ú_alabel_prefix)r%   r   r   r   Úalabel
  s"    


rp   c             C   sê   t  |  t t f ƒ sK y |  j d ƒ }  Wn  t k
 rJ t |  ƒ |  SYn X|  j ƒ  }  |  j t ƒ r¶ |  t	 t ƒ d  … }  |  sŽ t
 d ƒ ‚ |  j d ƒ d d k rÍ t
 d ƒ ‚ n t |  ƒ |  j d ƒ S|  j d ƒ }  t |  ƒ |  S)Nrk   z5Malformed A-label, no Punycode eligible content foundr   rG   z"A-label must not end with a hyphenr   rH   )re   rf   rg   r   rm   rj   ÚlowerÚ
startswithro   r$   r   rh   )r%   r   r   r   rl   #  s$    
	

rl   Tc             C   sŸ  d d l  m  } d } yEx.t |  ƒ D] \ } } t | ƒ } | | d k  rS | n t j | | d f ƒ d } | d }	 t | ƒ d k r– | d n d }
 |	 d	 k sÚ |	 d
 k r» | sÚ |	 d k rç | rç |
 d k rç | | 7} q& |
 d k	 r1|	 d k s$|	 d k r| s$|	 d
 k r1| r1| |
 7} q& |	 d k r& t ƒ  ‚ q& Wt j d | ƒ SWn= t k
 ršt	 d j
 t | ƒ | d t |  ƒ ƒ ƒ ‚ Yn Xd S)zBRe-map the characters in the string according to UTS46 processing.r   )Ú	uts46datar+   é   ÚZr   rE   NÚVrN   Ú3rB   ÚIrJ   z0Codepoint {0} not allowed at position {1} in {2})rs   r7   r   ÚbisectÚbisect_leftr$   Ú
IndexErrorr   rK   r   r!   r"   r9   )ÚdomainÚ
std3_rulesÚtransitionalrs   ÚoutputrS   ÚcharÚ
code_pointÚuts46rowÚstatusÚreplacementr   r   r   Úuts46_remap<  s0    
"r…   c       	      C   s.  t  |  t t f ƒ r$ |  j d ƒ }  | r< t |  | | ƒ }  d } g  } | r` |  j d ƒ } n t j |  ƒ } | s… | d g k r‘ t d ƒ ‚ | d d k r® | d =d } x< | D]4 } t | ƒ }  |  rÝ | j	 |  ƒ qµ t d ƒ ‚ qµ W| r | j	 d	 ƒ d
 j
 | ƒ }  t |  | ƒ s*t d ƒ ‚ |  S)Nrk   FÚ.r+   zEmpty domainr   TzEmpty labeló    ó   .zDomain too longrH   rH   )re   rf   rg   rh   r…   ÚsplitÚ_unicode_dots_rer   rp   ÚappendÚjoinr*   )	r   ÚstrictÚuts46r}   r~   r)   ÚresultÚlabelsr%   r   r   r   r   X  s2    r   c             C   s  t  |  t t f ƒ r$ |  j d ƒ }  | r< t |  | d ƒ }  d } g  } | s` t j |  ƒ } n |  j d ƒ } | s… | d g k r‘ t d ƒ ‚ | d	 s¨ | d
 =d } x< | D]4 } t | ƒ }  |  r× | j	 |  ƒ q¯ t d ƒ ‚ q¯ W| rú | j	 d ƒ d j
 | ƒ S)Nrk   Fr†   r+   zEmpty domainr   TzEmpty labelrH   rH   )re   rf   rg   rh   r…   rŠ   r‰   r   rl   r‹   rŒ   )r   r�   rŽ   r}   r)   r�   r�   r%   r   r   r   rh   w  s,    
rh   )(r+   r   ry   r   ÚreÚsysÚ	intrangesr   rO   ro   ÚcompilerŠ   Úversion_infoÚstrrn   Úchrr   ÚUnicodeErrorr   r   r   r   r   r   r    r"   r&   r*   rA   rD   rI   rL   rX   ra   rj   rp   rl   r…   r   rh   r   r   r   r   Ú<module>   sB   <	,) 