diff options
author | Rasmus Andersson <rasmus@notion.se> | 2023-05-30 23:56:16 +0300 |
---|---|---|
committer | Rasmus Andersson <rasmus@notion.se> | 2023-05-30 23:56:24 +0300 |
commit | dd2f374bfd4548268d7b9d941ac802587fcf992a (patch) | |
tree | 5265eb9e9880be0dc049a3b00e86c8f060277dd2 | |
parent | 9ebede5a554ad7ad1b8961a6dc0883db7f599271 (diff) | |
download | inter-dd2f374bfd4548268d7b9d941ac802587fcf992a.tar.xz |
tooling: fixes for variable font metadata
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | misc/tools/gen-var-designspace.py | 60 | ||||
-rw-r--r-- | misc/tools/rename.py | 44 |
3 files changed, 81 insertions, 27 deletions
@@ -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 \ diff --git a/misc/tools/gen-var-designspace.py b/misc/tools/gen-var-designspace.py index 7b3e4b757..7dd1e95b1 100644 --- a/misc/tools/gen-var-designspace.py +++ b/misc/tools/gen-var-designspace.py @@ -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) +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_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 - instance = designspace.instances[i] - if instance.name.find('Inter Display') != -1: - del designspace.instances[i] + if customParameters[i][0] == 'Has WWS Names': + del customParameters[i] -def fixup_instances_display(designspace): - # makes the display instances the default ones +def fixup_instances(designspace): 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' - else: - instance.styleName = instance.styleName.replace('Display ', '') + 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) diff --git a/misc/tools/rename.py b/misc/tools/rename.py index 57e866112..d34fcc125 100644 --- a/misc/tools/rename.py +++ b/misc/tools/rename.py @@ -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: |