area-51/lib/font-logos/scripts/generate-font.py

70 lines
1.8 KiB
Python
Raw Normal View History

2025-01-30 04:21:55 +01:00
import os
import sys
import tempfile
import json
import fontforge
# Need to change working directory in case we run via AppImage
os.chdir(os.path.join(os.path.dirname(sys.argv[0]), '..'))
autowidth = False
font_em = 512
font_design_size = 16
jsonfile = os.environ['JSON_FILE']
fontname = os.environ['FONT_NAME']
outputdir = os.environ['OUTPUT_DIR']
vectorsdir = 'vectors'
start_codepoint = int(os.environ['START_CODEPOINT'], base=0)
design_px = font_em // font_design_size
outjsonfile = os.path.join(outputdir, fontname+'.out.json')
font = fontforge.font()
# font.encoding = 'UnicodeFull'
font.fontname = fontname
font.familyname = fontname
font.fullname = fontname
font.design_size = font_design_size
font.em = font_em
font.copyright = os.environ['COPYRIGHT']
# if autowidth:
# font.autoWidth(0, 0, font.em)
font.autoWidth(0, 0, font.em)
# Add valid space glyph to avoid "unknown character" box on IE11
glyph = font.createChar(32)
glyph.width = 200
outputInfo = {
'em': font.em,
'icons': {},
}
def addIcon(iconId, icon):
glyph = font.createChar(icon['codepoint'], icon['name'])
glyph.importOutlines(
os.path.join(vectorsdir, (iconId+'.svg')),
)
glyph.left_side_bearing = 0
glyph.right_side_bearing = 0
outputInfo['icons'][iconId] = {
'width': glyph.width,
}
with open(jsonfile) as f:
fontData = json.load(f)
for iconId, icon in fontData['icons'].items():
addIcon(iconId, icon)
font.appendSFNTName("English (US)", "Version", fontData['version']['string'])
font.appendSFNTName("English (US)", "Vendor URL", os.environ['VENDORURL'])
font.version = fontData['version']['string']
font.generate(os.path.join(outputdir, fontname + '.ttf'))
font.generate(os.path.join(outputdir, fontname + '.woff'))
font.generate(os.path.join(outputdir, fontname + '.woff2'))
with open(outjsonfile, 'w') as f:
json.dump(outputInfo, f, indent=2)