summaryrefslogtreecommitdiffstats
path: root/src/silfont/scripts/psfufo2glyphs.py
blob: 3e82d86a4f751bd1d92c54e34a323209328efb25 (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
#!/usr/bin/env python3
__doc__ = '''Reads a designSpace file and create a Glyphs file from its linked ufos'''
__url__ = 'https://github.com/silnrsi/pysilfont'
__copyright__ = 'Copyright (c) 2018 SIL International (https://www.sil.org)'
__license__ = 'Released under the MIT License (https://opensource.org/licenses/MIT)'
__author__ = 'David Raymond'

from silfont.core import execute, splitfn

from glyphsLib import to_glyphs
from fontTools.designspaceLib import DesignSpaceDocument
import os

argspec = [
    ('designspace', {'help': 'Input designSpace file'}, {'type': 'filename'}),
    ('glyphsfile', {'help': 'Output glyphs file name', 'nargs': '?' }, {'type': 'filename', 'def': None}),
    ('--glyphsformat', {'help': "Format for glyphs file (2 or 3)", 'default': "2"}, {}),
    ('--nofea', {'help': 'Do not process features.fea', 'action': 'store_true', 'default': False}, {}),
    #    ('--nofixes', {'help': 'Bypass code fixing data', 'action': 'store_true', 'default': False}, {}),
    ('-l', '--log', {'help': 'Log file'}, {'type': 'outfile', 'def': '_ufo2glyphs.log'})]

# This is just bare-bones code at present so does the same as glyphsLib's ufo2glyphs!
# It is designed so that data could be massaged, if necessary, on the way.  No such need has been found so far

def doit(args):
    glyphsfile = args.glyphsfile
    logger = args.logger
    gformat = args.glyphsformat
    if gformat in ("2","3"):
        gformat = int(gformat)
    else:
        logger.log("--glyphsformat must be 2 or 3", 'S')
    if glyphsfile is None:
        (path,base,ext) = splitfn(args.designspace)
        glyphsfile = os.path.join(path, base + ".glyphs" )
    else:
        (path, base, ext) = splitfn(glyphsfile)
    backupname = os.path.join(path, base + "-backup.glyphs" )
    logger.log("Opening designSpace file", "I")
    ds = DesignSpaceDocument()
    ds.read(args.designspace)
    if args.nofea: # Need to rename the features.fea files so they are not processed
        origfeas = []; hiddenfeas = []
        for source in ds.sources:
            origfea = os.path.join(source.path, "features.fea")
            hiddenfea = os.path.join(source.path, "features.tmp")
            if os.path.exists(origfea):
                logger.log(f'Renaming {origfea} to {hiddenfea}', "I")
                os.rename(origfea, hiddenfea)
                origfeas.append(origfea)
                hiddenfeas.append(hiddenfea)
            else:
                logger.log(f'No features.fea found in {source.path}')
    logger.log("Now creating glyphs object", "I")
    glyphsfont = to_glyphs(ds)
    if args.nofea: # Now need to reverse renamimg of features.fea files
        for i, origfea in enumerate(origfeas):
            logger.log(f'Renaming {hiddenfeas[i]} back to {origfea}', "I")
            os.rename(hiddenfeas[i], origfea)
    glyphsfont.format_version = gformat

    if os.path.exists(glyphsfile): # Create a backup
        logger.log("Renaming existing glyphs file to " + backupname, "I")
        os.renames(glyphsfile, backupname)
    logger.log("Writing glyphs file: " + glyphsfile, "I")
    glyphsfont.save(glyphsfile)

def cmd(): execute(None, doit, argspec)
if __name__ == "__main__": cmd()