42 lines
1.3 KiB
Python
Executable File
42 lines
1.3 KiB
Python
Executable File
"""A separate module for glyphname to filename functions.
|
|
|
|
glyphNameToShortFileName() generates a non-clashing filename for systems with
|
|
filename-length limitations.
|
|
"""
|
|
|
|
MAXLEN = 31
|
|
|
|
def glyphNameToShortFileName(glyphName, glyphSet):
|
|
"""Alternative glyphname to filename function.
|
|
|
|
Features a garuanteed maximum filename for really long glyphnames, and clash testing.
|
|
- all non-ascii characters are converted to "_" (underscore), including "."
|
|
- all glyphnames which are too long are truncated and a hash is added at the end
|
|
- the hash is generated from the whole glyphname
|
|
- finally, the candidate glyphname is checked against the contents.plist
|
|
and a incrementing number is added at the end if there is a clash.
|
|
"""
|
|
import binascii, struct, string
|
|
ext = ".glif"
|
|
ok = string.ascii_letters + string.digits + " _"
|
|
h = binascii.hexlify(struct.pack(">l", binascii.crc32(glyphName)))
|
|
n = ''
|
|
for c in glyphName:
|
|
if c in ok:
|
|
if c != c.lower():
|
|
n += c + "_"
|
|
else:
|
|
n += c
|
|
else:
|
|
n += "_"
|
|
if len(n + ext) < MAXLEN:
|
|
return n + ext
|
|
count = 0
|
|
candidate = n[:MAXLEN - len(h + ext)] + h + ext
|
|
if glyphSet is not None:
|
|
names = glyphSet.getReverseContents()
|
|
while candidate.lower() in names:
|
|
candidate = n[:MAXLEN - len(h + ext + str(count))] + h + str(count) + ext
|
|
count += 1
|
|
return candidate
|