diff --git a/exporter.py b/exporter.py index fe9bb7e..d85a29e 100755 --- a/exporter.py +++ b/exporter.py @@ -6,61 +6,74 @@ import sys import os import json -import argparse import traceback +import shlex -def parse_args(args, inputs): - i = 0 - options = [a for a in args if "options" in a] - values = [a for a in args if "name" in a] - # find options, like --port, or -f - while i < len(args): - arg = args[i].strip() - if arg == "--": - # after --, we only have positional arguments - break - if len(arg) and arg[0] == "-" - for o in options: - if arg in o["options"]: - num_values = 1 - if "num_values" in o and o["num_values"] != "*": - num_values = int(o["num_values"]) - if i == len(args) - num_values: - print "Not enough values for " + arg - vals = [] - while num_values > 0: - i += 1 - vals.append(args[i]) - num_values -= 1 - i += 1 +class ArgParser: + def __init__(self): + self.i = 0 + self.args = [] + def parse_type(self, make_type): + opt = self.args[self.i] + self.i += 1 + if self.i >= len(self.args): + return ("Not enough params to " + opt, None) + val = None + try: + val = self.args[self.i] if make_type is None else make_type(self.args[self.i]) + except Exception, e: + pass + if val is None: + return ("Bad argument to " + opt + ": " + self.args[self.i], None) + return (None, val) + + def possible(self, opts, make_type): + return lambda v: make_type(v) if v in opts else None + + def condition(self, make_type, condition): + return lambda v: make_type(v) if condition(make_type(v)) else None + + def parse_args(self, args): + self.args = args + self.i = 0 + ret = {"input":[]} + allow_opts = True + + while self.i < len(self.args): + arg = self.args[self.i].strip() + if arg == "--": + allow_opts = False + continue + + if arg == "--port" or arg == "-p": + (msg, p) = self.parse_type(int) + if msg is not None: + return (msg, None) + ret["port"] = p + elif arg == "--type" or arg == "-t": + (msg, t) = self.parse_type(self.possible(["1", "3"], int)) + if msg is not None: + return (msg, None) + ret["type"] = t + elif arg == "--scale" or arg == "-s": + (msg, s) = self.parse_type(self.condition(int, lambda s: s > 0.00001)) + if msg is not None: + return (msg, None) + ret["scale"] = s + else: + ret["input"].append(arg) + self.i += 1 + return (None, ret) + port = 7890 -job_parser = ArgumentParser(description="Specify an export job") -job_parser.add_argument("input_swf", help="location of a .swf file to export") -job_parser.add_argument("-t", "--type", default=1, help="export type: 1=spritesheet, 3=skeletal", choices=[1,3]) +(err, args) = ArgParser().parse_args(sys.argv[1:]) +if err is not None: + print err + sys.exit(2) -desc = "Export .swf files, either from the command line or piped from stdin" -cmd_parser_base = ArgumentParser(description=desc) -cmd_parser_base.add_argument("-p", "--port", default=port, help="port to use for the wrapper server", type=int) - -cmd_parser_single = ArgumentParser(description=desc, parents=[cmd_parser_base, job_parser], conflict_handler="resolve") -cmd_parser_stdin = ArgumentParser(description=desc, parents=[cmd_parser_base], conflict_handler="resolve") -cmd_parser_stdin.add_argument("use_stdin", choices=["-"], help="parse export jobs from stdin") - -#args_single = cmd_parser_single.parse_args_safe() -args_stdin = cmd_parser_stdin.parse_args_safe() -#if args_single is None: -# #if args_stdin is None: -# # cmd_parser_single.print_usage() -# # cmd_parser_stdin.print_usage() -# # sys.exit(2) -# #else: -# # print "read from stdin" -# cmd_parser_single.print_usage() -# pass -#else: -# print "do single command: " + str(args_single) +print args sys.exit(0)