summaryrefslogtreecommitdiff
path: root/misc/tools/postprocess-vf.py
blob: 7e2bf785c66dc7ec5fbb713b5c2fa4ac892d43f0 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import sys, os, os.path, argparse, re
from fontTools.ttLib import TTFont

# Adoptation of fonttools/blob/master/Snippets/rename-fonts.py

WINDOWS_ENGLISH_IDS = 3, 1, 0x409
MAC_ROMAN_IDS = 1, 0, 0

LEGACY_FAMILY       = 1
SUBFAMILY_NAME      = 2
TRUETYPE_UNIQUE_ID  = 3
FULL_NAME           = 4
POSTSCRIPT_NAME     = 6
PREFERRED_FAMILY    = 16
TYPO_SUBFAMILY_NAME = 17
WWS_FAMILY          = 21


FAMILY_RELATED_IDS = set([
  LEGACY_FAMILY,
  TRUETYPE_UNIQUE_ID,
  FULL_NAME,
  POSTSCRIPT_NAME,
  PREFERRED_FAMILY,
  WWS_FAMILY,
])

whitespace_re = re.compile(r'\s+')


def remove_whitespace(s):
  return whitespace_re.sub("", s)


def set_full_name(font, fullName, fullNamePs):
  nameTable = font["name"]
  nameTable.setName(fullName, FULL_NAME, 1, 0, 0)     # mac
  nameTable.setName(fullName, FULL_NAME, 3, 1, 0x409) # windows
  nameTable.setName(fullNamePs, POSTSCRIPT_NAME, 1, 0, 0)     # mac
  nameTable.setName(fullNamePs, POSTSCRIPT_NAME, 3, 1, 0x409) # windows


def get_family_name(font):
  nameTable = font["name"]
  r = None
  for plat_id, enc_id, lang_id in (WINDOWS_ENGLISH_IDS, MAC_ROMAN_IDS):
    for name_id in (PREFERRED_FAMILY, LEGACY_FAMILY):
      r = nameTable.getName(nameID=name_id, platformID=plat_id, platEncID=enc_id, langID=lang_id)
      if r is not None:
        break
    if r is not None:
      break
  if not r:
    raise ValueError("family name not found")
  return r.toUnicode()


def fix_fullname(font):
  fullName = get_family_name(font)
  fullNamePs = remove_whitespace(fullName)
  set_full_name(font, fullName, fullNamePs)
  return fullName


# def clear_subfamily_name(font):
#   nameTable = font["name"]
#   rmrecs = []
#   for rec in nameTable.names:
#     if rec.nameID == SUBFAMILY_NAME or rec.nameID == TYPO_SUBFAMILY_NAME:
#       rmrecs.append(rec)
#   for rec in rmrecs:
#     nameTable.removeNames(rec.nameID, rec.platformID, rec.platEncID, rec.langID)


def fix_unique_id(font, fullName):
  fontIdRecs = []
  newId = ''
  nameTable = font["name"]
  for rec in nameTable.names:
    if rec.nameID == TRUETYPE_UNIQUE_ID:
      if newId == '':
        oldId = rec.toUnicode()
        newId = remove_whitespace(fullName)
        p = oldId.find(':')
        if p > -1:
          newId += oldId[p:]
      fontIdRecs.append(rec)
  for rec in fontIdRecs:
    nameTable.setName(newId, rec.nameID, rec.platformID, rec.platEncID, rec.langID)


def main():
  argparser = argparse.ArgumentParser(description='Fix names in variable font')
  a = lambda *args, **kwargs: argparser.add_argument(*args, **kwargs)
  a('-o', '--output', metavar='<file>',
    help='Output font file. Defaults to input file (overwrite)')
  a('input', metavar='<file>',
    help='Input font file')
  args = argparser.parse_args()

  infile = args.input
  outfile = args.output or infile

  font = TTFont(infile, recalcBBoxes=False, recalcTimestamp=False)

  fullName = fix_fullname(font)
  fix_unique_id(font, fullName)
  #clear_subfamily_name(font)

  font.save(outfile)
  font.close()


if __name__ == '__main__':
  main()