summaryrefslogtreecommitdiff
path: root/misc/pylib/robofab/tools/glyphNameSchemes.py
blob: cb6172b9a31bb27ca4192cccb1ce41e07f425de7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""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