// Generated by CoffeeScript 1.10.0 (function() { var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments, repeat; repeat = require('./helpers').repeat; exports.OptionParser = OptionParser = (function() { function OptionParser(rules, banner) { this.banner = banner; this.rules = buildRules(rules); } OptionParser.prototype.parse = function(args) { var arg, i, isOption, j, k, len, len1, matchedRule, options, originalArgs, pos, ref, rule, seenNonOptionArg, skippingArgument, value; options = { "arguments": [] }; skippingArgument = false; originalArgs = args; args = normalizeArguments(args); for (i = j = 0, len = args.length; j < len; i = ++j) { arg = args[i]; if (skippingArgument) { skippingArgument = false; continue; } if (arg === '--') { pos = originalArgs.indexOf('--'); options["arguments"] = options["arguments"].concat(originalArgs.slice(pos + 1)); break; } isOption = !!(arg.match(LONG_FLAG) || arg.match(SHORT_FLAG)); seenNonOptionArg = options["arguments"].length > 0; if (!seenNonOptionArg) { matchedRule = false; ref = this.rules; for (k = 0, len1 = ref.length; k < len1; k++) { rule = ref[k]; if (rule.shortFlag === arg || rule.longFlag === arg) { value = true; if (rule.hasArgument) { skippingArgument = true; value = args[i + 1]; } options[rule.name] = rule.isList ? (options[rule.name] || []).concat(value) : value; matchedRule = true; break; } } if (isOption && !matchedRule) { throw new Error("unrecognized option: " + arg); } } if (seenNonOptionArg || !isOption) { options["arguments"].push(arg); } } return options; }; OptionParser.prototype.help = function() { var j, len, letPart, lines, ref, rule, spaces; lines = []; if (this.banner) { lines.unshift(this.banner + "\n"); } ref = this.rules; for (j = 0, len = ref.length; j < len; j++) { rule = ref[j]; spaces = 15 - rule.longFlag.length; spaces = spaces > 0 ? repeat(' ', spaces) : ''; letPart = rule.shortFlag ? rule.shortFlag + ', ' : ' '; lines.push(' ' + letPart + rule.longFlag + spaces + rule.description); } return "\n" + (lines.join('\n')) + "\n"; }; return OptionParser; })(); LONG_FLAG = /^(--\w[\w\-]*)/; SHORT_FLAG = /^(-\w)$/; MULTI_FLAG = /^-(\w{2,})/; OPTIONAL = /\[(\w+(\*?))\]/; buildRules = function(rules) { var j, len, results, tuple; results = []; for (j = 0, len = rules.length; j < len; j++) { tuple = rules[j]; if (tuple.length < 3) { tuple.unshift(null); } results.push(buildRule.apply(null, tuple)); } return results; }; buildRule = function(shortFlag, longFlag, description, options) { var match; if (options == null) { options = {}; } match = longFlag.match(OPTIONAL); longFlag = longFlag.match(LONG_FLAG)[1]; return { name: longFlag.substr(2), shortFlag: shortFlag, longFlag: longFlag, description: description, hasArgument: !!(match && match[1]), isList: !!(match && match[2]) }; }; normalizeArguments = function(args) { var arg, j, k, l, len, len1, match, ref, result; args = args.slice(0); result = []; for (j = 0, len = args.length; j < len; j++) { arg = args[j]; if (match = arg.match(MULTI_FLAG)) { ref = match[1].split(''); for (k = 0, len1 = ref.length; k < len1; k++) { l = ref[k]; result.push('-' + l); } } else { result.push(arg); } } return result; }; }).call(this);