aboutsummaryrefslogtreecommitdiff
path: root/Lib/fontTools/ufoLib/filenames.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/fontTools/ufoLib/filenames.py')
-rw-r--r--Lib/fontTools/ufoLib/filenames.py92
1 files changed, 84 insertions, 8 deletions
diff --git a/Lib/fontTools/ufoLib/filenames.py b/Lib/fontTools/ufoLib/filenames.py
index 2815469f..baf22076 100644
--- a/Lib/fontTools/ufoLib/filenames.py
+++ b/Lib/fontTools/ufoLib/filenames.py
@@ -3,11 +3,88 @@ User name to file name conversion.
This was taken from the UFO 3 spec.
"""
-illegalCharacters = r"\" * + / : < > ? [ \ ] | \0".split(" ")
-illegalCharacters += [chr(i) for i in range(1, 32)]
-illegalCharacters += [chr(0x7F)]
-reservedFileNames = "CON PRN AUX CLOCK$ NUL A:-Z: COM1".lower().split(" ")
-reservedFileNames += "LPT1 LPT2 LPT3 COM2 COM3 COM4".lower().split(" ")
+# Restrictions are taken mostly from
+# https://docs.microsoft.com/en-gb/windows/win32/fileio/naming-a-file#naming-conventions.
+#
+# 1. Integer value zero, sometimes referred to as the ASCII NUL character.
+# 2. Characters whose integer representations are in the range 1 to 31,
+# inclusive.
+# 3. Various characters that (mostly) Windows and POSIX-y filesystems don't
+# allow, plus "(" and ")", as per the specification.
+illegalCharacters = {
+ "\x00",
+ "\x01",
+ "\x02",
+ "\x03",
+ "\x04",
+ "\x05",
+ "\x06",
+ "\x07",
+ "\x08",
+ "\t",
+ "\n",
+ "\x0b",
+ "\x0c",
+ "\r",
+ "\x0e",
+ "\x0f",
+ "\x10",
+ "\x11",
+ "\x12",
+ "\x13",
+ "\x14",
+ "\x15",
+ "\x16",
+ "\x17",
+ "\x18",
+ "\x19",
+ "\x1a",
+ "\x1b",
+ "\x1c",
+ "\x1d",
+ "\x1e",
+ "\x1f",
+ '"',
+ "*",
+ "+",
+ "/",
+ ":",
+ "<",
+ ">",
+ "?",
+ "[",
+ "\\",
+ "]",
+ "(",
+ ")",
+ "|",
+ "\x7f",
+}
+reservedFileNames = {
+ "aux",
+ "clock$",
+ "com1",
+ "com2",
+ "com3",
+ "com4",
+ "com5",
+ "com6",
+ "com7",
+ "com8",
+ "com9",
+ "con",
+ "lpt1",
+ "lpt2",
+ "lpt3",
+ "lpt4",
+ "lpt5",
+ "lpt6",
+ "lpt7",
+ "lpt8",
+ "lpt9",
+ "nul",
+ "prn",
+}
maxFileNameLength = 255
@@ -15,10 +92,9 @@ class NameTranslationError(Exception):
pass
-def userNameToFileName(userName: str, existing=[], prefix="", suffix=""):
+def userNameToFileName(userName: str, existing=(), prefix="", suffix=""):
"""
- existing should be a case-insensitive list
- of all existing file names.
+ `existing` should be a set-like object.
>>> userNameToFileName("a") == "a"
True