clean-nametable added
This commit is contained in:
parent
44cfe35b37
commit
552525dc84
94
Snippets/clean-nametable.py
Normal file
94
Snippets/clean-nametable.py
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Script to remove redundant font name table records."""
|
||||||
|
from fontTools.ttLib.ttVisitor import TTVisitor
|
||||||
|
from fontTools import ttLib
|
||||||
|
from fontTools.ttLib import TTFont
|
||||||
|
import fontTools.ttLib.tables.otTables as otTables
|
||||||
|
from fontTools.ttLib.tables import C_P_A_L_
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
|
class NameRecordVisitor(TTVisitor):
|
||||||
|
def __init__(self):
|
||||||
|
self.seen = set()
|
||||||
|
|
||||||
|
def removeUnusedNameRecords(self, font):
|
||||||
|
self.visit(font)
|
||||||
|
toDelete = set()
|
||||||
|
for record in font["name"].names:
|
||||||
|
# Name IDs 26 to 255, inclusive, are reserved for future standard names.
|
||||||
|
# https://learn.microsoft.com/en-us/typography/opentype/spec/name#name-ids
|
||||||
|
if record.nameID < 256:
|
||||||
|
continue
|
||||||
|
if record.nameID not in self.seen:
|
||||||
|
toDelete.add(record.nameID)
|
||||||
|
|
||||||
|
if not toDelete:
|
||||||
|
logger.info("Name table has no redundant records, skipping")
|
||||||
|
return
|
||||||
|
logger.info(f"Deleting name records with NameIDs {toDelete}")
|
||||||
|
for nameID in toDelete:
|
||||||
|
font["name"].removeNames(nameID)
|
||||||
|
|
||||||
|
|
||||||
|
@NameRecordVisitor.register_attrs(
|
||||||
|
(
|
||||||
|
(otTables.FeatureParamsSize, ("SubfamilyID", "SubfamilyNameID")),
|
||||||
|
(otTables.FeatureParamsStylisticSet, ("UINameID",)),
|
||||||
|
(
|
||||||
|
otTables.FeatureParamsCharacterVariants,
|
||||||
|
(
|
||||||
|
"FeatUILabelNameID",
|
||||||
|
"FeatUITooltipTextNameID",
|
||||||
|
"SampleTextNameID",
|
||||||
|
"FirstParamUILabelNameID",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(otTables.STAT, ("ElidedFallbackNameID",)),
|
||||||
|
(otTables.AxisRecord, ("AxisNameID",)),
|
||||||
|
(otTables.AxisValue, ("ValueNameID",)),
|
||||||
|
(otTables.FeatureName, ("FeatureNameID",)),
|
||||||
|
(otTables.Setting, ("SettingNameID",)),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
def visit(visitor, obj, attr, value):
|
||||||
|
visitor.seen.add(value)
|
||||||
|
|
||||||
|
|
||||||
|
@NameRecordVisitor.register(ttLib.getTableClass("fvar"))
|
||||||
|
def visit(visitor, obj):
|
||||||
|
for inst in obj.instances:
|
||||||
|
visitor.seen.add(inst.postscriptNameID)
|
||||||
|
visitor.seen.add(inst.subfamilyNameID)
|
||||||
|
|
||||||
|
for axis in obj.axes:
|
||||||
|
visitor.seen.add(axis.axisNameID)
|
||||||
|
|
||||||
|
|
||||||
|
@NameRecordVisitor.register(ttLib.getTableClass("CPAL"))
|
||||||
|
def visit(visitor, obj):
|
||||||
|
for nameID in obj.paletteLabels:
|
||||||
|
if nameID != C_P_A_L_.table_C_P_A_L_.NO_NAME_ID:
|
||||||
|
visitor.seen.add(nameID)
|
||||||
|
|
||||||
|
|
||||||
|
def removeUnusedNameRecords(ttFont):
|
||||||
|
visitor = NameRecordVisitor()
|
||||||
|
visitor.removeUnusedNameRecords(ttFont)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
print("Usage: python nameClean.py font.ttf out.ttf")
|
||||||
|
sys.exit()
|
||||||
|
font = TTFont(sys.argv[1])
|
||||||
|
removeUnusedNameRecords(font)
|
||||||
|
font.save(sys.argv[2])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
x
Reference in New Issue
Block a user