aboutsummaryrefslogtreecommitdiff
path: root/Lib/fontTools/merge/options.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/fontTools/merge/options.py')
-rw-r--r--Lib/fontTools/merge/options.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/Lib/fontTools/merge/options.py b/Lib/fontTools/merge/options.py
new file mode 100644
index 00000000..02dcf4b7
--- /dev/null
+++ b/Lib/fontTools/merge/options.py
@@ -0,0 +1,85 @@
+# Copyright 2013 Google, Inc. All Rights Reserved.
+#
+# Google Author(s): Behdad Esfahbod, Roozbeh Pournader
+
+
+class Options(object):
+
+ class UnknownOptionError(Exception):
+ pass
+
+ def __init__(self, **kwargs):
+
+ self.verbose = False
+ self.timing = False
+ self.drop_tables = []
+
+ self.set(**kwargs)
+
+ def set(self, **kwargs):
+ for k,v in kwargs.items():
+ if not hasattr(self, k):
+ raise self.UnknownOptionError("Unknown option '%s'" % k)
+ setattr(self, k, v)
+
+ def parse_opts(self, argv, ignore_unknown=[]):
+ ret = []
+ opts = {}
+ for a in argv:
+ orig_a = a
+ if not a.startswith('--'):
+ ret.append(a)
+ continue
+ a = a[2:]
+ i = a.find('=')
+ op = '='
+ if i == -1:
+ if a.startswith("no-"):
+ k = a[3:]
+ v = False
+ else:
+ k = a
+ v = True
+ else:
+ k = a[:i]
+ if k[-1] in "-+":
+ op = k[-1]+'=' # Ops is '-=' or '+=' now.
+ k = k[:-1]
+ v = a[i+1:]
+ ok = k
+ k = k.replace('-', '_')
+ if not hasattr(self, k):
+ if ignore_unknown is True or ok in ignore_unknown:
+ ret.append(orig_a)
+ continue
+ else:
+ raise self.UnknownOptionError("Unknown option '%s'" % a)
+
+ ov = getattr(self, k)
+ if isinstance(ov, bool):
+ v = bool(v)
+ elif isinstance(ov, int):
+ v = int(v)
+ elif isinstance(ov, list):
+ vv = v.split(',')
+ if vv == ['']:
+ vv = []
+ vv = [int(x, 0) if len(x) and x[0] in "0123456789" else x for x in vv]
+ if op == '=':
+ v = vv
+ elif op == '+=':
+ v = ov
+ v.extend(vv)
+ elif op == '-=':
+ v = ov
+ for x in vv:
+ if x in v:
+ v.remove(x)
+ else:
+ assert 0
+
+ opts[k] = v
+ self.set(**opts)
+
+ return ret
+