U
    ºmœdŠ  ã                /   @   sø   d Z ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/h/Zd0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFhZdGZG dHdI„ dIeƒZdVedLœdMdN„Zg dKdKfdOdP„Zg dKdKfdQdR„Z	e
dSkrôdTdUlZe ¡  dUS )WzH
User name to file name conversion.
This was taken from the UFO 3 spec.
ú úúúúúúúúú	Ú
úúúúúúúúúúúúúúúúúúúúúú"Ú*ú+ú/ú:ú<ú>ú?ú[ú\ú]ú(ú)ú|úZauxzclock$Zcom1Zcom2Zcom3Zcom4Zcom5Zcom6Zcom7Zcom8Zcom9ÚconZlpt1Zlpt2Zlpt3Zlpt4Zlpt5Zlpt6Zlpt7Zlpt8Zlpt9ÚnulZprnéÿ   c                   @   s   e Zd ZdS )ÚNameTranslationErrorN)Ú__name__Ú
__module__Ú__qualname__© r7   r7   úS/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/ufoLib/filenames.pyr3   [   s   r3   r7   Ú )ÚuserNamec                 C   s  t | tƒstdƒ‚t|ƒ}t|ƒ}|sB| d dkrBd| dd…  } g }| D ]0}|tkr\d}n|| ¡ krp|d7 }| |¡ qJd |¡} t| | }| d|… } g }	|  	d¡D ]"}
|
 ¡ t
krÄd|
 }
|	 |
¡ q¬d |	¡} ||  | }| ¡ |k�rt| |||ƒ}|S )aÿ  
    `existing` should be a set-like object.

    >>> userNameToFileName("a") == "a"
    True
    >>> userNameToFileName("A") == "A_"
    True
    >>> userNameToFileName("AE") == "A_E_"
    True
    >>> userNameToFileName("Ae") == "A_e"
    True
    >>> userNameToFileName("ae") == "ae"
    True
    >>> userNameToFileName("aE") == "aE_"
    True
    >>> userNameToFileName("a.alt") == "a.alt"
    True
    >>> userNameToFileName("A.alt") == "A_.alt"
    True
    >>> userNameToFileName("A.Alt") == "A_.A_lt"
    True
    >>> userNameToFileName("A.aLt") == "A_.aL_t"
    True
    >>> userNameToFileName(u"A.alT") == "A_.alT_"
    True
    >>> userNameToFileName("T_H") == "T__H_"
    True
    >>> userNameToFileName("T_h") == "T__h"
    True
    >>> userNameToFileName("t_h") == "t_h"
    True
    >>> userNameToFileName("F_F_I") == "F__F__I_"
    True
    >>> userNameToFileName("f_f_i") == "f_f_i"
    True
    >>> userNameToFileName("Aacute_V.swash") == "A_acute_V_.swash"
    True
    >>> userNameToFileName(".notdef") == "_notdef"
    True
    >>> userNameToFileName("con") == "_con"
    True
    >>> userNameToFileName("CON") == "C_O_N_"
    True
    >>> userNameToFileName("con.alt") == "_con.alt"
    True
    >>> userNameToFileName("alt.con") == "alt._con"
    True
    z(The value for userName must be a string.é    Ú.Ú_é   Nr9   )Ú
isinstanceÚstrÚ
ValueErrorÚlenÚillegalCharactersÚlowerÚappendÚjoinÚmaxFileNameLengthÚsplitÚreservedFileNamesÚhandleClash1)r:   ÚexistingÚprefixÚsuffixÚprefixLengthÚsuffixLengthZfilteredUserNameÚ	characterÚsliceLengthÚpartsÚpartÚfullNamer7   r7   r8   ÚuserNameToFileName_   s4    2


rU   c                 C   s¾   t |ƒ}t |ƒ}|t | ƒ | d tkrP|t | ƒ | d }t| }| d|… } d}d}	|dkr¦| t|	ƒ d¡ }
||
 | }| ¡ |kr’|}q¦n|	d7 }	|	dkrXq¦qX|dkrºt|||ƒ}|S )aO  
    existing should be a case-insensitive list
    of all existing file names.

    >>> prefix = ("0" * 5) + "."
    >>> suffix = "." + ("0" * 10)
    >>> existing = ["a" * 5]

    >>> e = list(existing)
    >>> handleClash1(userName="A" * 5, existing=e,
    ...		prefix=prefix, suffix=suffix) == (
    ... 	'00000.AAAAA000000000000001.0000000000')
    True

    >>> e = list(existing)
    >>> e.append(prefix + "aaaaa" + "1".zfill(15) + suffix)
    >>> handleClash1(userName="A" * 5, existing=e,
    ...		prefix=prefix, suffix=suffix) == (
    ... 	'00000.AAAAA000000000000002.0000000000')
    True

    >>> e = list(existing)
    >>> e.append(prefix + "AAAAA" + "2".zfill(15) + suffix)
    >>> handleClash1(userName="A" * 5, existing=e,
    ...		prefix=prefix, suffix=suffix) == (
    ... 	'00000.AAAAA000000000000001.0000000000')
    True
    é   Nr>   l   ÿŒIú5 )rB   rG   r@   ÚzfillrD   ÚhandleClash2)r:   rK   rL   rM   rN   rO   ÚlrQ   Ú	finalNameÚcounterÚnamerT   r7   r7   r8   rJ   ·   s(    rJ   c                 C   s|   t t|ƒ t|ƒ }td| ƒ}d}d}|dkrh|t|ƒ | }| ¡ | krT|}qhn|d7 }||kr(qhq(|dkrxtdƒ‚|S )aÄ  
    existing should be a case-insensitive list
    of all existing file names.

    >>> prefix = ("0" * 5) + "."
    >>> suffix = "." + ("0" * 10)
    >>> existing = [prefix + str(i) + suffix for i in range(100)]

    >>> e = list(existing)
    >>> handleClash2(existing=e, prefix=prefix, suffix=suffix) == (
    ... 	'00000.100.0000000000')
    True

    >>> e = list(existing)
    >>> e.remove(prefix + "1" + suffix)
    >>> handleClash2(existing=e, prefix=prefix, suffix=suffix) == (
    ... 	'00000.1.0000000000')
    True

    >>> e = list(existing)
    >>> e.remove(prefix + "2" + suffix)
    >>> handleClash2(existing=e, prefix=prefix, suffix=suffix) == (
    ... 	'00000.2.0000000000')
    True
    Ú9Nr>   zNo unique name could be found.)rG   rB   Úintr@   rD   r3   )rK   rL   rM   Z	maxLengthZmaxValuerZ   r[   rT   r7   r7   r8   rX   ð   s    rX   Ú__main__r;   N)r7   r9   r9   )Ú__doc__rC   rI   rG   Ú	Exceptionr3   r@   rU   rJ   rX   r4   ÚdoctestÚtestmodr7   r7   r7   r8   Ú<module>   s    Ñ2éX90