�
��g � �� � d Z d� d� � Zed� edd� � D � � z
Ze ed� � gz
Zd� � � � d� � Zed� � � � d� � z
Zd Z G d
� de� � Z g ddfd
�Z
g ddfd�Zg ddfd�Ze
dk r,ddlZddlZ ej ej � � j � � dS dS )a
This module implements the algorithm for converting between a "user name" -
something that a user can choose arbitrarily inside a font editor - and a file
name suitable for use in a wide range of operating systems and filesystems.
The `UFO 3 specification <http://unifiedfontobject.org/versions/ufo3/conventions/>`_
provides an example of an algorithm for such conversion, which avoids illegal
characters, reserved file names, ambiguity between upper- and lower-case
characters, and clashes with existing files.
This code was originally copied from
`ufoLib <https://github.com/unified-font-object/ufoLib/blob/8747da7/Lib/ufoLib/filenames.py>`_
by Tal Leming and is copyright (c) 2005-2016, The RoboFab Developers:
- Erik van Blokland
- Tal Leming
- Just van Rossum
z\" * + / : < > ? [ \ ] | \0� c �, � g | ]}t |� � ��S � )�chr)�.0�is �h/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/fontTools/misc/filenames.py�
<listcomp>r s � �3�3�3��c�!�f�f�3�3�3� � � � z!CON PRN AUX CLOCK$ NUL A:-Z: COM1zLPT1 LPT2 LPT3 COM2 COM3 COM4�� c � � e Zd ZdS )�NameTranslationErrorN)�__name__�
__module__�__qualname__r r
r r r s � � � � � ��Dr
r � c �� � t | t � � st d� � �t |� � }t |� � }|s| d dk r
d| dd� z } g }| D ]@}|t v rd}n||� � � k r|dz
}|� |� � �Ad� |� � } t |z
|z
}| d|� } g } | � d� � D ]7}
|
� � � t v rd|
z }
| � |
� � �8d� | � � } || z |z }|� � � |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 )�
isinstance�str�
ValueError�len�illegalCharacters�lower�append�join�maxFileNameLength�split�reservedFileNames�handleClash1)�userName�existing�prefix�suffix�prefixLength�suffixLength�filteredUserName� character�sliceLength�parts�part�fullNames r �userNameToFileNamer1 s� � �D �h��$�$� E��C�D�D�D��v�;�;�L��v�;�;�L� � &�h�q�k�S�(�(���!�"�"��%����� +� +� ��)�)�)��I�I�
�)�/�/�+�+�
+�
+����I���� �*�*�*�*��w�w�'�(�(�H�#�l�2�\�A�K�����%�H��E����s�#�#� � ���:�:�<�<�,�,�,���:�D�
���T������x�x����H��� �6�)�H��~�~���8�#�#���(�F�F�C�C���Or
c � � t |� � }t |� � }|t | � � z |z dz t k r,|t | � � z |z dz }t |z
}| d|� } d}d} |�T| t | � � � d� � z }
||
z |z }|� � � |vr|}n| dz
} | dk rn|�T|�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 )r r! r �zfillr �handleClash2)r% r&