
    <`?                        d Z d                    d          Zed  edd          D             z  Ze ed          gz  Zd                                                    d          Zed                                                    d          z  Zd	Z G d
 de          Z	g ddfde
fdZg ddfdZg ddfdZedk    rddlZ ej                     dS dS )zH
User name to file name conversion.
This was taken from the UFO 3 spec.
z\" * + / : < > ? [ \ ] | \0 c                 ,    g | ]}t          |          S  )chr).0is     :lib/python3.11/site-packages/fontTools/ufoLib/filenames.py
<listcomp>r	      s    333c!ff333              z!CON PRN AUX CLOCK$ NUL A:-Z: COM1zLPT1 LPT2 LPT3 COM2 COM3 COM4   c                       e Zd ZdS )NameTranslationErrorN)__name__
__module____qualname__r   r
   r   r   r      s        r
   r    userNamec                    t          | t                    st          d          t          |          }t          |          }|s| d         dk    rd| dd         z   } g }| D ]@}|t          v rd}n||                                k    r|dz  }|                    |           Ad                    |          } t          |z
  |z
  }| d|         } g }	| 	                    d          D ]7}
|
                                t          v rd|
z   }
|	                    |
           8d                    |	          } || z   |z   }|                                |v rt          | |||          }|S )a  
	existing should be a case-insensitive list
	of all existing file names.

	>>> 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.    ._r   Nr   )
isinstancestr
ValueErrorlenillegalCharacterslowerappendjoinmaxFileNameLengthsplitreservedFileNameshandleClash1)r   existingprefixsuffixprefixLengthsuffixLengthfilteredUserName	charactersliceLengthpartspartfullNames               r   userNameToFileNamer1      s   f 	8S!! ?=>>>FF 	  8A;#%%8ABB<( % %Y###99IOO%%%%9)$$$$GG$%% </,>\k\"	^^C    T	ZZ\\&&&
*4,,tHHUOOX&NN  (Hff==(r
   c                    t          |          }t          |          }|t          |           z   |z   dz   t          k    r,|t          |           z   |z   dz   }t          |z
  }| d|         } d}d}	|T| t          |	                              d          z   }
||
z   |z   }|                                |vr|}n|	dz  }	|	dk    rn|T|t          |||          }|S )a
  
	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   I5 )r   r"   r   zfillr   handleClash2)r   r&   r'   r(   r)   r*   lr-   	finalNamecounternamer0   s               r   r%   r%   j   s   > FF3x== </"47HHHc(mm#l2R7!!A%+l{l#(	CLL&&r**	*$d]V#(^^X%%9
a<7  8VV44)r
   c                    t           t          |          z
  t          |          z
  }t          d|z            }d}d}|<|t          |          z   |z   }|                                | vr|}n|dz  }||k    rn|<|t          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.)r"   r   intr   r   r   )r&   r'   r(   	maxLengthmaxValuer7   r8   r0   s           r   r5   r5      s    6 V,s6{{:i  c'll"V+(^^X%%9
a<7  =>>>r
   __main__r   N)__doc__r#   r   ranger   r   r$   r"   	Exceptionr   r   r1   r%   r5   r   doctesttestmodr   r
   r   <module>rE      st   
 388==  33eeArll333 3  cc$ii[   7==??EEcJJ  4::<<BB3GG G      9    02"R V V V V V Vp %'r" 6 6 6 6p R - - - -^ z r
   