
    rbi)                        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e          Z		 dddZ
g ddfddZg ddfddZedk    rd dlZ ej                     dS dS )    )annotations)Iterable>/   * 	
"()+/:<>?[\]|zset[str]illegalCharacters>   clock$auxconnulprncom1com2com3com4com5com6com7com8com9lpt1lpt2lpt3lpt4lpt5lpt6lpt7lpt8lpt9reservedFileNames   intmaxFileNameLengthc                      e Zd ZdS )NameTranslationErrorN)__name__
__module____qualname__     j/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/fontTools/ufoLib/filenames.pyrQ   rQ   o   s        DrV   rQ   rU    userNamestrexistingIterable[str]prefixsuffixreturnc                   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  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   ._   NrX   )
isinstancerZ   
ValueErrorlenr4   lowerappendjoinrO   splitrL   handleClash1)rY   r[   r]   r^   prefixLengthsuffixLengthfilteredUserName	charactersliceLengthpartspartfullNames               rW   userNameToFileNamert   s   s   H h$$ ECDDDv;;Lv;;L  &hqkS((!""% + +	)))II)//++++I	****ww'((H#l2\AK%HEs##  ::<<,,,:DTxxH 6)H~~8##(FFCCOrV   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 )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
       Nrc   l   I5 )rf   rO   rZ   zfillrg   handleClash2)rY   r[   r]   r^   rl   rm   lrp   	finalNamecounternamers   s               rW   rk   rk      s   T v;;Lv;;Lc(mm#l2R7:KKK3x==(<7"<'!+L[L)IG

#g,,,,R000D=6)>>8++ IqLGo%% 
  66::	rV   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 )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
    9Nrc   zNo unique name could be found.)rO   rf   rN   rZ   rg   rQ   )r[   r]   r^   	maxLengthmaxValuerz   r{   rs   s           rW   rx   rx   !  s    V "CKK/#f++=I3?##HIG

CLL(61>>8++ IqLGh 
 "#CDDDrV   __main__N)rU   rX   rX   )
rY   rZ   r[   r\   r]   rZ   r^   rZ   r_   rZ   )r[   r\   r]   rZ   r^   rZ   r_   rZ   )
__future__r   collections.abcr   r4   __annotations__rL   rO   	ExceptionrQ   rt   rk   rx   rR   doctesttestmodrU   rV   rW   <module>r      sb   " " " " " " " $ $ $ $ $ $:0 0 0  0 0 0 0b       2      	 	 	 	 	9 	 	 	
 RTg g g g gV .0rQSA A A A AJ !"= = = = =@ zNNNGO rV   