Make the file name safe function less restrictive
This commit is contained in:
@@ -523,12 +523,11 @@ def readTextFile(path: str | Path) -> str:
|
|||||||
|
|
||||||
|
|
||||||
def makeFileNameSafe(text: str) -> str:
|
def makeFileNameSafe(text: str) -> str:
|
||||||
"""Return a filename safe string.
|
"""Return a filename-safe string.
|
||||||
See: https://unicode.org/reports/tr15/#Norm_Forms
|
See: https://unicode.org/reports/tr15/#Norm_Forms
|
||||||
"""
|
"""
|
||||||
text = unicodedata.normalize("NFKC", text).strip()
|
text = unicodedata.normalize("NFKC", text).strip()
|
||||||
allowed = (" ", ".", "-", "_")
|
return "".join(c for c in text if c.isprintable() and c not in r'\/:*?"<>|')
|
||||||
return "".join(c for c in text if c.isalnum() or c in allowed)
|
|
||||||
|
|
||||||
|
|
||||||
def getFileSize(path: Path) -> int:
|
def getFileSize(path: Path) -> int:
|
||||||
|
|||||||
@@ -621,13 +621,40 @@ def testBaseCommon_readTextFile(monkeypatch, fncPath, ipsumText):
|
|||||||
@pytest.mark.base
|
@pytest.mark.base
|
||||||
def testBaseCommon_makeFileNameSafe():
|
def testBaseCommon_makeFileNameSafe():
|
||||||
"""Test the makeFileNameSafe function."""
|
"""Test the makeFileNameSafe function."""
|
||||||
assert makeFileNameSafe(" aaaa ") == "aaaa"
|
# Trim edges
|
||||||
assert makeFileNameSafe("aaaa,bbbb") == "aaaabbbb"
|
assert makeFileNameSafe(" Name ") == "Name"
|
||||||
assert makeFileNameSafe("aaaa\tbbbb") == "aaaabbbb"
|
|
||||||
assert makeFileNameSafe("aaaa bbbb") == "aaaa bbbb"
|
# Normalise Unicode
|
||||||
assert makeFileNameSafe("æøå") == "æøå"
|
|
||||||
assert makeFileNameSafe("Stuff œfi2⁵") == "Stuff œfi25"
|
assert makeFileNameSafe("Stuff œfi2⁵") == "Stuff œfi25"
|
||||||
|
|
||||||
|
# No control characters
|
||||||
|
assert makeFileNameSafe("One\tTwo") == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One\nTwo") == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One\rTwo") == "OneTwo"
|
||||||
|
|
||||||
|
# Invalid special characters
|
||||||
|
assert makeFileNameSafe("One\\Two") == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One/Two") == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One:Two") == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One*Two") == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One?Two") == "OneTwo"
|
||||||
|
assert makeFileNameSafe('One"Two') == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One<Two") == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One>Two") == "OneTwo"
|
||||||
|
assert makeFileNameSafe("One|Two") == "OneTwo"
|
||||||
|
|
||||||
|
# Names that are valid
|
||||||
|
assert makeFileNameSafe("One Two") == "One Two"
|
||||||
|
assert makeFileNameSafe("One,Two") == "One,Two"
|
||||||
|
assert makeFileNameSafe("One-Two") == "One-Two"
|
||||||
|
assert makeFileNameSafe("One–Two") == "One–Two"
|
||||||
|
assert makeFileNameSafe("One—Two") == "One—Two"
|
||||||
|
assert makeFileNameSafe("Bob's Story") == "Bob's Story"
|
||||||
|
|
||||||
|
# Unicode
|
||||||
|
assert makeFileNameSafe("æøå") == "æøå"
|
||||||
|
assert makeFileNameSafe("ßÜ") == "ßÜ"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.base
|
@pytest.mark.base
|
||||||
def testBaseCommon_getFileSize(fncPath):
|
def testBaseCommon_getFileSize(fncPath):
|
||||||
|
|||||||
Reference in New Issue
Block a user