xref: /aosp_15_r20/external/fonttools/Lib/fontTools/merge/options.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1# Copyright 2013 Google, Inc. All Rights Reserved.
2#
3# Google Author(s): Behdad Esfahbod, Roozbeh Pournader
4
5
6class Options(object):
7    class UnknownOptionError(Exception):
8        pass
9
10    def __init__(self, **kwargs):
11        self.verbose = False
12        self.timing = False
13        self.drop_tables = []
14        self.input_file = None
15        self.output_file = "merged.ttf"
16        self.import_file = None
17
18        self.set(**kwargs)
19
20    def set(self, **kwargs):
21        for k, v in kwargs.items():
22            if not hasattr(self, k):
23                raise self.UnknownOptionError("Unknown option '%s'" % k)
24            setattr(self, k, v)
25
26    def parse_opts(self, argv, ignore_unknown=[]):
27        ret = []
28        opts = {}
29        for a in argv:
30            orig_a = a
31            if not a.startswith("--"):
32                ret.append(a)
33                continue
34            a = a[2:]
35            i = a.find("=")
36            op = "="
37            if i == -1:
38                if a.startswith("no-"):
39                    k = a[3:]
40                    v = False
41                else:
42                    k = a
43                    v = True
44            else:
45                k = a[:i]
46                if k[-1] in "-+":
47                    op = k[-1] + "="  # Ops is '-=' or '+=' now.
48                    k = k[:-1]
49                v = a[i + 1 :]
50            ok = k
51            k = k.replace("-", "_")
52            if not hasattr(self, k):
53                if ignore_unknown is True or ok in ignore_unknown:
54                    ret.append(orig_a)
55                    continue
56                else:
57                    raise self.UnknownOptionError("Unknown option '%s'" % a)
58
59            ov = getattr(self, k)
60            if isinstance(ov, bool):
61                v = bool(v)
62            elif isinstance(ov, int):
63                v = int(v)
64            elif isinstance(ov, list):
65                vv = v.split(",")
66                if vv == [""]:
67                    vv = []
68                vv = [int(x, 0) if len(x) and x[0] in "0123456789" else x for x in vv]
69                if op == "=":
70                    v = vv
71                elif op == "+=":
72                    v = ov
73                    v.extend(vv)
74                elif op == "-=":
75                    v = ov
76                    for x in vv:
77                        if x in v:
78                            v.remove(x)
79                else:
80                    assert 0
81
82            opts[k] = v
83        self.set(**opts)
84
85        return ret
86