1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #!/usr/bin/fontforge -script
- import sys
- import os.path
- import json
- import fontforge
- IMPORT_OPTIONS = ('removeoverlap', 'correctdir')
- try:
- unicode
- except NameError:
- unicode = str
- def loadConfig(filename='font.json'):
- with open(filename) as f:
- return json.load(f)
- def setProperties(font, config):
- props = config['props']
- lang = props.pop('lang', 'English (US)')
- family = props.pop('family', None)
- style = props.pop('style', 'Regular')
- props['encoding'] = props.get('encoding', 'UnicodeFull')
- if family is not None:
- font.familyname = family
- font.fontname = family + '-' + style
- font.fullname = family + ' ' + style
- for k, v in config['props'].items():
- if hasattr(font, k):
- if isinstance(v, list):
- v = tuple(v)
- setattr(font, k, v)
- else:
- font.appendSFNTName(lang, k, v)
- for t in config.get('sfnt_names', []):
- font.appendSFNTName(str(t[0]), str(t[1]), unicode(t[2]))
- def addGlyphs(font, config):
- for k, v in config['glyphs'].items():
- g = font.createMappedChar(int(k, 0))
- # Get outlines
- src = '%s.svg' % k
- if not isinstance(v, dict):
- v = {'src': v or src}
- src = '%s%s%s' % (config.get('input', '.'),
- os.path.sep, v.pop('src', src))
- g.importOutlines(src, IMPORT_OPTIONS)
- g.removeOverlap()
- # Copy attributes
- for k2, v2 in v.items():
- if hasattr(g, k2):
- if isinstance(v2, list):
- v2 = tuple(v2)
- setattr(g, k2, v2)
- def main(config_file):
- config = loadConfig(config_file)
- os.chdir(os.path.dirname(config_file) or '.')
- font = fontforge.font()
- setProperties(font, config)
- addGlyphs(font, config)
- for outfile in config['output']:
- sys.stderr.write('Generating %s...\n' % outfile)
- font.generate(outfile)
- if __name__ == '__main__':
- if len(sys.argv) > 1:
- main(sys.argv[1])
- else:
- sys.stderr.write("\nUsage: %s something.json\n" % sys.argv[0])
|