o
    i)                     @  s   U d dl mZ d dlmZ 	 h dZded< h dZded< dZd	ed
< G dd deZ		ddddZ
g ddfdddZg ddfd ddZedkrSd dlZe  dS dS )!    )annotations)Iterable>/   (/?<>]+*"
: \)	[|zset[str]illegalCharacters>   conZlpt4Zlpt7Zlpt8Zcom4Zcom3Zcom6Zcom1Zcom7Zcom8Zcom5zclock$ZprnZauxZlpt1Zlpt2Zlpt9Zcom2Zcom9Zlpt6nulZlpt5Zlpt3reservedFileNames   intmaxFileNameLengthc                   @  s   e Zd ZdS )NameTranslationErrorN)__name__
__module____qualname__ r>   r>   i/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/fontTools/ufoLib/filenames.pyr:   o   s    r:   r>    userNamestrexistingIterable[str]prefixsuffixreturnc                 C  s  t | ts	tdt|}t|}|s!| d dkr!d| dd  } g }| D ]}|tv r.d}n
|| kr8|d7 }|| q%d|} t| | }| d| } g }	| 	dD ]}
|
 t
v rbd|
 }
|	|
 qVd|	} ||  | }| |v rt| |||}|S )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@   )
isinstancerB   
ValueErrorlenr3   lowerappendjoinr9   splitr6   handleClash1)rA   rC   rE   rF   prefixLengthsuffixLengthZfilteredUserName	charactersliceLengthpartspartfullNamer>   r>   r?   userNameToFileNames   s4   
D

rZ   c                 C  s   t |}t |}|t |  | d tkr(|t |  | d }t| }| d| } d}d}	|du rU| t|	d }
||
 | }| |vrH|}n|	d7 }	|	dkrQn|du s0|du r_t|||}|S )aC  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
       NrJ   l   I5 )rM   r9   rB   zfillrN   handleClash2)rA   rC   rE   rF   rS   rT   lrV   	finalNamecounternamerY   r>   r>   r?   rR      s*   *rR   c                 C  s   t t| t| }td| }d}d}|du r6|t| | }| | vr)|}n|d7 }||kr2n|du s|du r>td|S )ak  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
    9NrJ   zNo unique name could be found.)r9   rM   r8   rB   rN   r:   )rC   rE   rF   Z	maxLengthZmaxValuer_   r`   rY   r>   r>   r?   r]   !  s    +
r]   __main__N)r>   r@   r@   )
rA   rB   rC   rD   rE   rB   rF   rB   rG   rB   )rC   rD   rE   rB   rF   rB   rG   rB   )
__future__r   collections.abcr   r3   __annotations__r6   r9   	Exceptionr:   rZ   rR   r]   r;   doctesttestmodr>   r>   r>   r?   <module>   s"    1kE@