wip instancer: update uniqueID

This commit is contained in:
Marc Foley 2020-10-12 18:14:27 +01:00
parent ce1d8a9955
commit b328475072
2 changed files with 46 additions and 8 deletions

View File

@ -1369,6 +1369,7 @@ def axisValuesFromAxisLimits(stat, axisLimits):
def sortedAxisValues(axisValues): def sortedAxisValues(axisValues):
# Sort and remove duplicates so format 4 axisValues are dominant # Sort and remove duplicates so format 4 axisValues are dominant
results, seenAxes = [], set() results, seenAxes = [], set()
# ensure format4 axes with the most AxisValueRecords are first
format4 = sorted( format4 = sorted(
[a for a in axisValues if a.Format == 4], [a for a in axisValues if a.Format == 4],
key=lambda k: len(k.AxisValueRecord), reverse=True key=lambda k: len(k.AxisValueRecord), reverse=True
@ -1392,14 +1393,15 @@ def updateNameTable(varfont, axisLimits):
if "STAT" not in varfont: if "STAT" not in varfont:
raise ValueError("Cannot update name table since there is no STAT table.") raise ValueError("Cannot update name table since there is no STAT table.")
stat = varfont['STAT'] stat = varfont['STAT']
fvar = varfont['fvar']
nametable = varfont["name"] nametable = varfont["name"]
# add default axis values if they are missing from axisLimits # add default axis values if they are missing from axisLimits
fvarDefaults = {a.axisTag: a.defaultValue for a in fvar.axes} if 'fvar' in varfont:
for k, v in fvarDefaults.items(): fvar = varfont['fvar']
if k not in axisLimits: fvarDefaults = {a.axisTag: a.defaultValue for a in fvar.axes}
axisLimits[k] = v for k, v in fvarDefaults.items():
if k not in axisLimits:
axisLimits[k] = v
selectedAxisValues = axisValuesFromAxisLimits(stat, axisLimits) selectedAxisValues = axisValuesFromAxisLimits(stat, axisLimits)
_updateNameRecords(varfont, nametable, selectedAxisValues) _updateNameRecords(varfont, nametable, selectedAxisValues)
@ -1419,6 +1421,7 @@ def _updateNameRecords(varfont, nametable, axisValues):
nametblLangs = set((r.platformID, r.platEncID, r.langID) for r in nametable.names) nametblLangs = set((r.platformID, r.platEncID, r.langID) for r in nametable.names)
for lang in nametblLangs: for lang in nametblLangs:
_updateStyleRecords( _updateStyleRecords(
varfont,
nametable, nametable,
ribbiAxisValues, ribbiAxisValues,
nonRibbiAxisValues, nonRibbiAxisValues,
@ -1437,6 +1440,7 @@ def _ribbiAxisValues(nametable, axisValues):
def _updateStyleRecords( def _updateStyleRecords(
varfont,
nametable, nametable,
ribbiAxisValues, ribbiAxisValues,
nonRibbiAxisValues, nonRibbiAxisValues,
@ -1480,13 +1484,39 @@ def _updateStyleRecords(
nameIDs[NameID.FULL_FONT_NAME] = f"{newFamilyName} {newStyleName}" nameIDs[NameID.FULL_FONT_NAME] = f"{newFamilyName} {newStyleName}"
nameIDs[NameID.POSTSCRIPT_NAME] = f"{newFamilyName.replace(' ', '')}-{newStyleName.replace(' ', '')}" nameIDs[NameID.POSTSCRIPT_NAME] = f"{newFamilyName.replace(' ', '')}-{newStyleName.replace(' ', '')}"
# Update uniqueID nameIDs[NameID.UNIQUE_FONT_IDENTIFIER] = _uniqueIdRecord(varfont, lang, nameIDs)
# TODO
# versionRecord = nametable.getName(5, 3, 1, 0x409)
for nameID, string in nameIDs.items(): for nameID, string in nameIDs.items():
if not string:
continue
nametable.setName(string, nameID, *lang) nametable.setName(string, nameID, *lang)
def _uniqueIdRecord(varfont, lang, nameIDs):
name = varfont['name']
record = name.getName(NameID.UNIQUE_FONT_IDENTIFIER, *lang)
if not record:
return None
def isSubString(string1, string2):
if string2 in string1:
return True
return False
# Check if full name and postscript name are a substring
for nameID in (4, 6):
nameRecord = name.getName(nameID, *lang)
if not nameRecord:
continue
if isSubString(record.toUnicode(), nameRecord.toUnicode()):
return record.toUnicode().replace(
nameRecord.toUnicode(),
nameIDs[nameRecord.nameID]
)
# TODO (M Foley) Construct new uniqueID if full name or postscript names are not subsets
return None
def splitAxisLocationAndRanges(axisLimits, rangeType=AxisRange): def splitAxisLocationAndRanges(axisLimits, rangeType=AxisRange):
location, axisRanges = {}, {} location, axisRanges = {}, {}
for axisTag, value in axisLimits.items(): for axisTag, value in axisLimits.items():

View File

@ -1930,6 +1930,7 @@ def test_updateNameTable_with_registered_axes(varfont):
names = _get_name_records(varfont) names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x409)] == "Test Variable Font" assert names[(1, 3, 1, 0x409)] == "Test Variable Font"
assert names[(2, 3, 1, 0x0409)] == "Regular" assert names[(2, 3, 1, 0x0409)] == "Regular"
assert names[(3, 3, 1, 0x0409)] == "2.001;GOOG;TestVariableFont-Regular"
assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Regular" assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Regular"
assert (16, 3, 1, 0x409) not in names assert (16, 3, 1, 0x409) not in names
assert (17, 3, 1, 0x409) not in names assert (17, 3, 1, 0x409) not in names
@ -1939,6 +1940,7 @@ def test_updateNameTable_with_registered_axes(varfont):
names = _get_name_records(varfont) names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x409)] == "Test Variable Font Black" assert names[(1, 3, 1, 0x409)] == "Test Variable Font Black"
assert names[(2, 3, 1, 0x409)] == "Regular" assert names[(2, 3, 1, 0x409)] == "Regular"
assert names[(3, 3, 1, 0x0409)] == "2.001;GOOG;TestVariableFont-Black"
assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Black" assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Black"
assert names[(16, 3, 1, 0x409)] == "Test Variable Font" assert names[(16, 3, 1, 0x409)] == "Test Variable Font"
assert names[(17, 3, 1, 0x409)] == "Black" assert names[(17, 3, 1, 0x409)] == "Black"
@ -1948,6 +1950,7 @@ def test_updateNameTable_with_registered_axes(varfont):
names = _get_name_records(varfont) names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x409)] == "Test Variable Font Thin" assert names[(1, 3, 1, 0x409)] == "Test Variable Font Thin"
assert names[(2, 3, 1, 0x409)] == "Regular" assert names[(2, 3, 1, 0x409)] == "Regular"
assert names[(3, 3, 1, 0x0409)] == "2.001;GOOG;TestVariableFont-Thin"
assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Thin" assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Thin"
assert names[(16, 3, 1, 0x409)] == "Test Variable Font" assert names[(16, 3, 1, 0x409)] == "Test Variable Font"
assert names[(17, 3, 1, 0x409)] == "Thin" assert names[(17, 3, 1, 0x409)] == "Thin"
@ -1957,6 +1960,7 @@ def test_updateNameTable_with_registered_axes(varfont):
names = _get_name_records(varfont) names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x409)] == "Test Variable Font Thin Condensed" assert names[(1, 3, 1, 0x409)] == "Test Variable Font Thin Condensed"
assert names[(2, 3, 1, 0x409)] == "Regular" assert names[(2, 3, 1, 0x409)] == "Regular"
assert names[(3, 3, 1, 0x0409)] == "2.001;GOOG;TestVariableFont-ThinCondensed"
assert names[(6, 3, 1, 0x409)] == "TestVariableFont-ThinCondensed" assert names[(6, 3, 1, 0x409)] == "TestVariableFont-ThinCondensed"
assert names[(16, 3, 1, 0x409)] == "Test Variable Font" assert names[(16, 3, 1, 0x409)] == "Test Variable Font"
assert names[(17, 3, 1, 0x409)] == "Thin Condensed" assert names[(17, 3, 1, 0x409)] == "Thin Condensed"
@ -1975,6 +1979,7 @@ def test_updateNameTable_with_multilingual_names(varfont):
names = _get_name_records(varfont) names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x405)] == "Test Variable Font" assert names[(1, 3, 1, 0x405)] == "Test Variable Font"
assert names[(2, 3, 1, 0x405)] == "Normal" assert names[(2, 3, 1, 0x405)] == "Normal"
assert (3, 3, 1, 0x405) not in names
assert (16, 3, 1, 0x405) not in names assert (16, 3, 1, 0x405) not in names
assert (17, 3, 1, 0x405) not in names assert (17, 3, 1, 0x405) not in names
@ -1983,6 +1988,7 @@ def test_updateNameTable_with_multilingual_names(varfont):
names = _get_name_records(varfont) names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x405)] == "Test Variable Font Negreta" assert names[(1, 3, 1, 0x405)] == "Test Variable Font Negreta"
assert names[(2, 3, 1, 0x405)] == "Normal" assert names[(2, 3, 1, 0x405)] == "Normal"
assert (3, 3, 1, 0x405) not in names
assert names[(16, 3, 1, 0x405)] == "Test Variable Font" assert names[(16, 3, 1, 0x405)] == "Test Variable Font"
assert names[(17, 3, 1, 0x405)] == "Negreta" assert names[(17, 3, 1, 0x405)] == "Negreta"
@ -1991,6 +1997,7 @@ def test_updateNameTable_with_multilingual_names(varfont):
names = _get_name_records(varfont) names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x405)] == "Test Variable Font Negreta Zhuštěné" assert names[(1, 3, 1, 0x405)] == "Test Variable Font Negreta Zhuštěné"
assert names[(2, 3, 1, 0x405)] == "Normal" assert names[(2, 3, 1, 0x405)] == "Normal"
assert (3, 3, 1, 0x405) not in names
assert names[(16, 3, 1, 0x405)] == "Test Variable Font" assert names[(16, 3, 1, 0x405)] == "Test Variable Font"
assert names[(17, 3, 1, 0x405)] == "Negreta Zhuštěné" assert names[(17, 3, 1, 0x405)] == "Negreta Zhuštěné"
@ -2000,6 +2007,7 @@ def test_updateNametable_partial(varfont):
names = _get_name_records(varfont) names = _get_name_records(varfont)
assert names[(1, 3, 1, 0x409)] == "Test Variable Font Condensed" assert names[(1, 3, 1, 0x409)] == "Test Variable Font Condensed"
assert names[(2, 3, 1, 0x409)] == "Regular" assert names[(2, 3, 1, 0x409)] == "Regular"
assert (3, 3, 1, 0x405) not in names
assert names[(16, 3, 1, 0x409)] == "Test Variable Font" assert names[(16, 3, 1, 0x409)] == "Test Variable Font"
assert names[(17, 3, 1, 0x409)] == "Condensed" #? maybe Condensed Regular? assert names[(17, 3, 1, 0x409)] == "Condensed" #? maybe Condensed Regular?