tooling: fixes for variable font metadata
This commit is contained in:
parent
9ebede5a55
commit
dd2f374bfd
3 changed files with 85 additions and 31 deletions
4
Makefile
4
Makefile
|
|
@ -214,9 +214,9 @@ $(FONTDIR)/var/Inter-Italic.var.ttf: $(FONTDIR)/var/inter-roman-and-italic.stamp
|
|||
touch $@
|
||||
|
||||
$(FONTDIR)/var/InterV.var.ttf: $(FONTDIR)/var/Inter.var.ttf | venv
|
||||
. $(VENV) ; python misc/tools/rename.py --family "Inter Variable" -o $@ $<
|
||||
. $(VENV) ; python misc/tools/rename.py --scrub-display --family "Inter Variable" -o $@ $<
|
||||
$(FONTDIR)/var/InterV-Italic.var.ttf: $(FONTDIR)/var/Inter-Italic.var.ttf | venv
|
||||
. $(VENV) ; python misc/tools/rename.py --family "Inter Variable" -o $@ $<
|
||||
. $(VENV) ; python misc/tools/rename.py --scrub-display --family "Inter Variable" -o $@ $<
|
||||
|
||||
var: \
|
||||
$(FONTDIR)/var/Inter.var.ttf \
|
||||
|
|
|
|||
|
|
@ -9,27 +9,43 @@ def remove_whitespace(s):
|
|||
return WHITESPACE_RE.sub("", s)
|
||||
|
||||
|
||||
def fixup_instances_text(designspace):
|
||||
# makes the "text" (non-display) instances the default ones
|
||||
i = len(designspace.instances)
|
||||
while i > 0:
|
||||
i -= 1
|
||||
instance = designspace.instances[i]
|
||||
if instance.name.find('Inter Display') != -1:
|
||||
del designspace.instances[i]
|
||||
|
||||
|
||||
def fixup_instances_display(designspace):
|
||||
# makes the display instances the default ones
|
||||
i = len(designspace.instances)
|
||||
while i > 0:
|
||||
i -= 1
|
||||
instance = designspace.instances[i]
|
||||
if instance.name.find('Inter Display') != -1:
|
||||
if instance.styleName == 'Display':
|
||||
instance.styleName = 'Regular'
|
||||
def fixup_names(instance_or_source):
|
||||
instance_or_source.name = instance_or_source.name.replace(' Display', '')
|
||||
if instance_or_source.styleName == 'Display':
|
||||
instance_or_source.styleName = 'Regular'
|
||||
else:
|
||||
instance.styleName = instance.styleName.replace('Display ', '')
|
||||
instance_or_source.styleName = instance_or_source.styleName.replace('Display ', '')
|
||||
|
||||
|
||||
def fixup_source(designspace, source):
|
||||
fixup_names(source)
|
||||
|
||||
|
||||
def fixup_instance(designspace, instance):
|
||||
fixup_names(instance)
|
||||
|
||||
psFamilyName = 'Inter'
|
||||
instance.postScriptFontName = psFamilyName + remove_whitespace(instance.styleName)
|
||||
instance.styleMapFamilyName = instance.styleMapFamilyName.replace(' Display', '')
|
||||
|
||||
# remove WWSFamilyName and WWSSubfamilyName properties
|
||||
del instance.lib['com.schriftgestaltung.properties']
|
||||
|
||||
customParameters = instance.lib['com.schriftgestaltung.customParameters']
|
||||
i = len(customParameters)
|
||||
while i > 0:
|
||||
i -= 1
|
||||
if customParameters[i][0] == 'Has WWS Names':
|
||||
del customParameters[i]
|
||||
|
||||
|
||||
def fixup_instances(designspace):
|
||||
i = len(designspace.instances)
|
||||
while i > 0:
|
||||
i -= 1
|
||||
instance = designspace.instances[i]
|
||||
if instance.name.find('Inter Display') != -1:
|
||||
fixup_instance(designspace, instance)
|
||||
else:
|
||||
del designspace.instances[i]
|
||||
# change default opsz value
|
||||
|
|
@ -39,11 +55,15 @@ def fixup_instances_display(designspace):
|
|||
break
|
||||
|
||||
|
||||
def fixup_postscript_instance_names(designspace):
|
||||
# make sure there are PostScript names assigned (fontmake does not create these)
|
||||
psFamilyName = remove_whitespace(designspace.instances[0].familyName)
|
||||
for instance in designspace.instances:
|
||||
instance.postScriptFontName = psFamilyName + remove_whitespace(instance.styleName)
|
||||
def fixup_sources(designspace):
|
||||
i = len(designspace.sources)
|
||||
while i > 0:
|
||||
i -= 1
|
||||
source = designspace.sources[i]
|
||||
if source.name.find('Inter Display') != -1:
|
||||
fixup_source(designspace, source)
|
||||
else:
|
||||
del designspace.sources[i]
|
||||
|
||||
|
||||
def main(argv):
|
||||
|
|
@ -56,10 +76,8 @@ def main(argv):
|
|||
|
||||
designspace = DesignSpaceDocument.fromfile(args.input_designspace)
|
||||
|
||||
# fixup_instances_text(designspace)
|
||||
fixup_instances_display(designspace)
|
||||
|
||||
fixup_postscript_instance_names(designspace)
|
||||
fixup_instances(designspace)
|
||||
fixup_sources(designspace)
|
||||
|
||||
designspace.write(args.output_designspace)
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ POSTSCRIPT_NAME = 6
|
|||
PREFERRED_FAMILY = 16
|
||||
TYPO_SUBFAMILY_NAME = 17
|
||||
WWS_FAMILY = 21
|
||||
VAR_PS_NAME_PREFIX = 25
|
||||
|
||||
|
||||
FAMILY_RELATED_IDS = set([
|
||||
|
|
@ -23,6 +24,7 @@ FAMILY_RELATED_IDS = set([
|
|||
POSTSCRIPT_NAME,
|
||||
PREFERRED_FAMILY,
|
||||
WWS_FAMILY,
|
||||
VAR_PS_NAME_PREFIX,
|
||||
])
|
||||
|
||||
whitespace_re = re.compile(r'\s+')
|
||||
|
|
@ -131,7 +133,9 @@ def renameStylesGoogleFonts(font):
|
|||
|
||||
|
||||
def setStyleName(font, newStyleName):
|
||||
newFullName = getFamilyName(font).strip() + " " + newStyleName
|
||||
newFullName = getFamilyName(font).strip()
|
||||
if newStyleName != 'Regular':
|
||||
newFullName += " " + newStyleName
|
||||
newFullNamePs = remove_whitespace(newFullName)
|
||||
set_full_name(font, newFullName, newFullNamePs)
|
||||
|
||||
|
|
@ -162,9 +166,24 @@ def setFamilyName(font, nextFamilyName):
|
|||
return s, nextFamilyName
|
||||
|
||||
# postcript name can't contain spaces
|
||||
psPrevFamilyNames = [s.replace(" ", "") for s in prevFamilyNames]
|
||||
psPrevFamilyNames = []
|
||||
for s in prevFamilyNames:
|
||||
s = s.strip()
|
||||
if s.find(' ') == -1:
|
||||
psPrevFamilyNames.append(s)
|
||||
else:
|
||||
# Foo Bar Baz -> FooBarBaz
|
||||
psPrevFamilyNames.append(s.replace(" ", ""))
|
||||
# # Foo Bar Baz -> FooBar-Baz
|
||||
p = s.rfind(' ')
|
||||
s = s[:p] + '-' + s[p+1:]
|
||||
psPrevFamilyNames.append(s)
|
||||
|
||||
psNextFamilyName = nextFamilyName.replace(" ", "")
|
||||
for rec in font["name"].names:
|
||||
found_VAR_PS_NAME_PREFIX = False
|
||||
nameTable = font["name"]
|
||||
|
||||
for rec in nameTable.names:
|
||||
name_id = rec.nameID
|
||||
if name_id not in FAMILY_RELATED_IDS:
|
||||
# leave uninteresting records unmodified
|
||||
|
|
@ -186,9 +205,24 @@ def setFamilyName(font, nextFamilyName):
|
|||
old, new = renameRecord(rec, [prev_psname], psNextFamilyName)
|
||||
else:
|
||||
old, new = renameRecord(rec, prevFamilyNames, nextFamilyName)
|
||||
elif name_id == VAR_PS_NAME_PREFIX:
|
||||
# Variations PostScript Name Prefix.
|
||||
# If present in a variable font, it may be used as the family prefix in the
|
||||
# PostScript Name Generation for Variation Fonts algorithm.
|
||||
# The character set is restricted to ASCII-range uppercase Latin letters,
|
||||
# lowercase Latin letters, and digits.
|
||||
found_VAR_PS_NAME_PREFIX = True
|
||||
old, new = renameRecord(rec, prevFamilyNames, nextFamilyName)
|
||||
else:
|
||||
old, new = renameRecord(rec, prevFamilyNames, nextFamilyName)
|
||||
# print(" %r: '%s' -> '%s'" % (rec, old, new))
|
||||
print(" %r: '%s' -> '%s'" % (rec, old, new))
|
||||
|
||||
# HACK! FIXME!
|
||||
# add name ID 25 "Variations PostScript Name Prefix" if not found
|
||||
if not found_VAR_PS_NAME_PREFIX and nextFamilyName.find('Variable') != -1:
|
||||
varPSNamePrefix = remove_whitespace(nextFamilyName)
|
||||
nameTable.setName(varPSNamePrefix, VAR_PS_NAME_PREFIX, 1, 0, 0) # mac
|
||||
nameTable.setName(varPSNamePrefix, VAR_PS_NAME_PREFIX, 3, 1, 0x409) # windows
|
||||
|
||||
|
||||
def main():
|
||||
|
|
@ -220,6 +254,8 @@ def main():
|
|||
args.family = remove_substring(getFamilyName(font), "Display")
|
||||
if not args.style:
|
||||
args.style = remove_substring(getStyleName(font), "Display")
|
||||
if args.style == '':
|
||||
args.style = 'Regular'
|
||||
|
||||
editCount = 0
|
||||
try:
|
||||
|
|
|
|||
Reference in a new issue