
    h)                    
   % S SK Jr  S SKJr   1 SkrS\S'   1 SkrS\S'   SrS	\S
'    " S S\5      r	 S         SS jjr
/ SS4         SS jjr/ SS4       SS jjr\S:X  a  S SKr\R                  " 5         gg)    )annotations)Iterable>/    	
"()*+/:<>?[\]|zset[str]illegalCharacters>   auxconnulprncom1com2com3com4com5com6com7com8com9lpt1lpt2lpt3lpt4lpt5lpt6lpt7lpt8lpt9clock$reservedFileNames   intmaxFileNameLengthc                      \ rS rSrSrg)NameTranslationErroro    N)__name__
__module____qualname____firstlineno____static_attributes__rS       T/var/www/fran/franai/venv/lib/python3.13/site-packages/fontTools/ufoLib/filenames.pyrQ   rQ   o   s    rY   rQ    c                h   [        U [        5      (       d  [        S5      e[        U5      n[        U5      nU(       d  U S   S:X  a  SU SS -   n / nU  H9  nU[        ;   a  SnOXwR                  5       :w  a  US-  nUR                  U5        M;     SR                  U5      n [        U-
  U-
  nU SU n / n	U R                  S5       H1  n
U
R                  5       [        ;   a  SU
-   n
U	R                  U
5        M3     SR                  U	5      n X -   U-   nUR                  5       U;   a  [        XX#5      nU$ )a  Converts from a user name to a file name.

Takes care to avoid illegal characters, reserved file names, ambiguity between
upper- and lower-case characters, and clashes with existing files.

Args:
        userName (str): The input file name.
        existing: A case-insensitive list of all existing file names.
        prefix: Prefix to be prepended to the file name.
        suffix: Suffix to be appended to the file name.

Returns:
        A suitable filename.

Raises:
        NameTranslationError: If no suitable name could be generated.

Examples::

        >>> 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lenr4   lowerappendjoinrO   splitrL   handleClash1)userNameexistingprefixsuffixprefixLengthsuffixLengthfilteredUserName	charactersliceLengthpartspartfullNames               rZ   userNameToFileNameru   s   s7   H h$$CDDv;Lv;L hqkS(!"%	))I//++I	*  ww'(H#l2\AK%HEs#::<,,:DT $ xxH 6)H~~8#FCOrY   c                r   [        U5      n[        U5      nU[        U 5      -   U-   S-   [        :  a"  U[        U 5      -   U-   S-   n[        U-
  nU SU n SnSn	UcL  U [        U	5      R                  S5      -   n
X*-   U-   nUR	                  5       U;  a  UnOU	S-  n	U	S:  a  OUc  ML  Uc  [        XU5      nU$ )a  A helper function that resolves collisions with existing names when choosing a filename.

This function attempts to append an unused integer counter to the filename.

    Args:
            userName (str): The input file name.
            existing: A case-insensitive list of all existing file names.
            prefix: Prefix to be prepended to the file name.
            suffix: Suffix to be appended to the file name.

    Returns:
            A suitable filename.

    >>> 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 )rc   rO   ra   zfillrd   handleClash2)ri   rj   rk   rl   rm   rn   lrq   	finalNamecounternamert   s               rZ   rh   rh      s    T v;Lv;Lc(m#l2R7:KK3x=(<7"<'!+L[)IG

#g,,,R00=6)>>8+ IqLGo% 
  6:	rY   c                    [         [        U5      -
  [        U5      -
  n[        SU-  5      nSnSnUc8  U[        U5      -   U-   nUR	                  5       U ;  a  UnOUS-  nXd:  a  OUc  M8  Uc  [        S5      eU$ )a  A helper function that resolves collisions with existing names when choosing a filename.

This function is a fallback to :func:`handleClash1`. It attempts to append an unused integer counter to the filename.

    Args:
            userName (str): The input file name.
            existing: A case-insensitive list of all existing file names.
            prefix: Prefix to be prepended to the file name.
            suffix: Suffix to be appended to the file name.

    Returns:
            A suitable filename.

    Raises:
            NameTranslationError: If no suitable name could be generated.

    Examples::

      >>> 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.)rO   rc   rN   ra   rd   rQ   )rj   rk   rl   	maxLengthmaxValuer{   r|   rt   s           rZ   ry   ry   !  s    V "CK/#f+=I3?#HIG

CL(61>>8+ IqLG 
 "#CDDrY   __main__N)rS   r[   r[   )
ri   ra   rj   Iterable[str]rk   ra   rl   ra   returnra   )rj   r   rk   ra   rl   ra   r   ra   )
__future__r   collections.abcr   r4   __annotations__rL   rO   	ExceptionrQ   ru   rh   ry   rT   doctesttestmodrS   rY   rZ   <module>r      s   " $:0 8 0b 8 2  3 	9 	
 RTgg*g9<gKNggV .0rQSAA*A9<AKNAAJ !"==*-=<?==@ zOO rY   