86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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.input_file = None
 | |
|         self.output_file = "merged.ttf"
 | |
|         self.import_file = None
 | |
| 
 | |
|         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
 |