docopt
Version:
a command line option parser that will make you smile
1,203 lines (1,095 loc) • 36.1 kB
JavaScript
// Generated by CoffeeScript 1.9.1
(function() {
var Argument, BranchPattern, Command, Dict, DocoptExit, DocoptLanguageError, Either, LeafPattern, OneOrMore, Option, Optional, OptionsShortcut, Pattern, Required, Tokens, any, docopt, enumerate, extras, formal_usage, parse_argv, parse_atom, parse_defaults, parse_expr, parse_long, parse_pattern, parse_section, parse_seq, parse_shorts, print, transform, zip,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
slice = [].slice,
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty;
print = function() {
return console.log([].join.call(arguments, ' '));
};
enumerate = function(array) {
var i, item, j, len, results;
i = 0;
results = [];
for (j = 0, len = array.length; j < len; j++) {
item = array[j];
results.push([i++, item]);
}
return results;
};
any = function(array) {
return indexOf.call(array, true) >= 0;
};
zip = function() {
var args, arr, i, j, length, lengthArray, ref, results;
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
lengthArray = (function() {
var j, len, results;
results = [];
for (j = 0, len = args.length; j < len; j++) {
arr = args[j];
results.push(arr.length);
}
return results;
})();
length = Math.min.apply(Math, lengthArray);
results = [];
for (i = j = 0, ref = length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
results.push((function() {
var len, q, results1;
results1 = [];
for (q = 0, len = args.length; q < len; q++) {
arr = args[q];
results1.push(arr[i]);
}
return results1;
})());
}
return results;
};
String.prototype.partition = function(separator) {
var parts, self;
self = this;
if (self.indexOf(separator) >= 0) {
parts = self.split(separator);
return [parts[0], separator, parts.slice(1).join(separator)];
} else {
return [String(self), '', ''];
}
};
String.prototype.startsWith = function(searchString, position) {
position = position || 0;
return this.lastIndexOf(searchString, position) === position;
};
String.prototype.endsWith = function(searchString, position) {
var lastIndex, subjectString;
subjectString = this.toString();
if (position === void 0 || position > subjectString.length) {
position = subjectString.length;
}
position -= searchString.length;
lastIndex = subjectString.indexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
String.prototype._split = function() {
return this.trim().split(/\s+/).filter(function(i) {
return i !== '';
});
};
String.prototype.isUpper = function() {
return /^[A-Z]+$/g.exec(this);
};
Number.isInteger = Number.isInteger || function(value) {
return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
};
DocoptLanguageError = (function(superClass) {
extend(DocoptLanguageError, superClass);
function DocoptLanguageError(message) {
this.message = message;
DocoptLanguageError.__super__.constructor.call(this, this.message);
}
return DocoptLanguageError;
})(Error);
DocoptExit = (function(superClass) {
extend(DocoptExit, superClass);
function DocoptExit(message) {
this.message = message;
DocoptExit.__super__.constructor.call(this, this.message);
}
return DocoptExit;
})(Error);
Pattern = (function(superClass) {
extend(Pattern, superClass);
function Pattern() {
return Pattern.__super__.constructor.apply(this, arguments);
}
Pattern.prototype.fix = function() {
this.fix_identities();
this.fix_repeating_arguments();
return this;
};
Pattern.prototype.fix_identities = function(uniq) {
var c, flat, i, j, k, len, len1, q, ref, ref1, ref2;
if (uniq == null) {
uniq = null;
}
"Make pattern-tree tips point to same object if they are equal.";
if (!this.hasOwnProperty('children')) {
return this;
}
if (uniq === null) {
ref = [{}, this.flat()], uniq = ref[0], flat = ref[1];
for (j = 0, len = flat.length; j < len; j++) {
k = flat[j];
uniq[k] = k;
}
}
ref1 = enumerate(this.children);
for (q = 0, len1 = ref1.length; q < len1; q++) {
ref2 = ref1[q], i = ref2[0], c = ref2[1];
if (!c.hasOwnProperty('children')) {
console.assert(uniq.hasOwnProperty(c));
this.children[i] = uniq[c];
} else {
c.fix_identities(uniq);
}
}
return this;
};
Pattern.prototype.fix_repeating_arguments = function() {
"Fix elements that should accumulate/increment values.";
var c, child, counts, e, either, j, len, len1, len2, mycase, q, r, ref;
either = (function() {
var j, len, ref, results;
ref = transform(this).children;
results = [];
for (j = 0, len = ref.length; j < len; j++) {
child = ref[j];
results.push(child.children);
}
return results;
}).call(this);
for (j = 0, len = either.length; j < len; j++) {
mycase = either[j];
counts = {};
for (q = 0, len1 = mycase.length; q < len1; q++) {
c = mycase[q];
counts[c] = (counts[c] ? counts[c] : 0) + 1;
}
ref = (function() {
var len2, results, u;
results = [];
for (u = 0, len2 = mycase.length; u < len2; u++) {
child = mycase[u];
if (counts[child] > 1) {
results.push(child);
}
}
return results;
})();
for (r = 0, len2 = ref.length; r < len2; r++) {
e = ref[r];
if (e.constructor === Argument || e.constructor === Option && e.argcount) {
if (e.value === null) {
e.value = [];
} else if (e.value.constructor !== Array) {
e.value = e.value._split();
}
}
if (e.constructor === Command || e.constructor === Option && e.argcount === 0) {
e.value = 0;
}
}
}
return this;
};
return Pattern;
})(Object);
transform = function(pattern) {
"Expand pattern into an (almost) equivalent one, but with single Either.\n\nExample: ((-a | -b) (-c | -d)) => (-a -c | -a -d | -b -c | -b -d)\nQuirks: [-a] => (-a), (-a...) => (-a -a)\n";
var c, child, children, e, groups, index, j, len, parents, ref, result, t;
result = [];
groups = [[pattern]];
while (groups.length) {
children = groups.shift();
parents = [Required, Optional, OptionsShortcut, Either, OneOrMore];
if (any((function() {
var j, len, results;
results = [];
for (j = 0, len = parents.length; j < len; j++) {
t = parents[j];
results.push(indexOf.call(children.map(function(c) {
return c.constructor;
}), t) >= 0);
}
return results;
})())) {
child = ((function() {
var j, len, ref, results;
results = [];
for (j = 0, len = children.length; j < len; j++) {
c = children[j];
if (ref = c.constructor, indexOf.call(parents, ref) >= 0) {
results.push(c);
}
}
return results;
})())[0];
index = children.indexOf(child);
if (index >= 0) {
children.splice(index, 1);
}
if (child.constructor === Either) {
ref = child.children;
for (j = 0, len = ref.length; j < len; j++) {
c = ref[j];
groups.push([c].concat(children));
}
} else if (child.constructor === OneOrMore) {
groups.push((child.children.concat(child.children)).concat(children));
} else {
groups.push(child.children.concat(children));
}
} else {
result.push(children);
}
}
return new Either((function() {
var len1, q, results;
results = [];
for (q = 0, len1 = result.length; q < len1; q++) {
e = result[q];
results.push(new Required(e));
}
return results;
})());
};
LeafPattern = (function(superClass) {
"Leaf/terminal node of a pattern tree.";
extend(LeafPattern, superClass);
function LeafPattern(name1, value1) {
this.name = name1;
this.value = value1 != null ? value1 : null;
}
LeafPattern.prototype.toString = function() {
return this.constructor.name + "(" + this.name + ", " + this.value + ")";
};
LeafPattern.prototype.flat = function(types) {
var ref;
if (types == null) {
types = [];
}
types = types instanceof Array ? types : [types];
if (!types.length || (ref = this.constructor, indexOf.call(types, ref) >= 0)) {
return [this];
} else {
return [];
}
};
LeafPattern.prototype.match = function(left, collected) {
var a, increment, left_, match, pos, ref, same_name;
if (collected == null) {
collected = null;
}
if (collected === null) {
collected = [];
}
ref = this.singleMatch(left), pos = ref[0], match = ref[1];
if (match === null) {
return [false, left, collected];
}
left_ = left.slice(0, pos).concat(left.slice(pos + 1));
same_name = (function() {
var j, len, results;
results = [];
for (j = 0, len = collected.length; j < len; j++) {
a = collected[j];
if (a.name === this.name) {
results.push(a);
}
}
return results;
}).call(this);
if (Number.isInteger(this.value) || this.value instanceof Array) {
if (Number.isInteger(this.value)) {
increment = 1;
} else {
increment = typeof match.value === 'string' ? [match.value] : match.value;
}
if (!same_name.length) {
match.value = increment;
return [true, left_, collected.concat(match)];
}
if (Number.isInteger(this.value)) {
same_name[0].value += increment;
} else {
same_name[0].value = [].concat(same_name[0].value, increment);
}
return [true, left_, collected];
}
return [true, left_, collected.concat(match)];
};
return LeafPattern;
})(Pattern);
BranchPattern = (function(superClass) {
"Branch/inner node of a pattern tree.";
extend(BranchPattern, superClass);
function BranchPattern(children) {
this.children = children instanceof Array ? children : [children];
}
BranchPattern.prototype.toString = function() {
var a;
return this.constructor.name + "(" + (((function() {
var j, len, ref, results;
ref = this.children;
results = [];
for (j = 0, len = ref.length; j < len; j++) {
a = ref[j];
results.push(a);
}
return results;
}).call(this)).join(', ')) + ")";
};
BranchPattern.prototype.flat = function(types) {
var child, ref;
if (types == null) {
types = [];
}
types = types instanceof Array ? types : [types];
if (ref = this.constructor, indexOf.call(types, ref) >= 0) {
return [this];
}
return ((function() {
var j, len, ref1, results;
ref1 = this.children;
results = [];
for (j = 0, len = ref1.length; j < len; j++) {
child = ref1[j];
if (child instanceof Pattern) {
results.push(child.flat(types));
}
}
return results;
}).call(this)).reduce((function(pv, cv) {
return [].concat(pv, cv);
}), []);
};
return BranchPattern;
})(Pattern);
Argument = (function(superClass) {
extend(Argument, superClass);
function Argument() {
return Argument.__super__.constructor.apply(this, arguments);
}
Argument.prototype.singleMatch = function(left) {
var j, len, n, pattern, ref, ref1;
ref = enumerate(left);
for (j = 0, len = ref.length; j < len; j++) {
ref1 = ref[j], n = ref1[0], pattern = ref1[1];
if (pattern.constructor === Argument) {
return [n, new Argument(this.name, pattern.value)];
}
}
return [null, null];
};
Argument.parse = function(source) {
var name, value;
name = /(<\S*?>)/ig.exec(source)[1];
value = /\[default:\s+(.*)\]/ig.exec(source);
return new Argument(name, value ? value[1] : null);
};
return Argument;
})(LeafPattern);
Command = (function(superClass) {
extend(Command, superClass);
function Command(name1, value1) {
this.name = name1;
this.value = value1 != null ? value1 : false;
}
Command.prototype.singleMatch = function(left) {
var j, len, n, pattern, ref, ref1;
ref = enumerate(left);
for (j = 0, len = ref.length; j < len; j++) {
ref1 = ref[j], n = ref1[0], pattern = ref1[1];
if (pattern.constructor === Argument) {
if (pattern.value === this.name) {
return [n, new Command(this.name, true)];
} else {
break;
}
}
}
return [null, null];
};
return Command;
})(Argument);
Option = (function(superClass) {
extend(Option, superClass);
function Option(short1, long1, argcount1, value) {
var ref;
this.short = short1 != null ? short1 : null;
this.long = long1 != null ? long1 : null;
this.argcount = argcount1 != null ? argcount1 : 0;
if (value == null) {
value = false;
}
console.assert((ref = this.argcount) === 0 || ref === 1);
this.value = value === false && this.argcount > 0 ? null : value;
this.name = this.long || this.short;
}
Option.prototype.toString = function() {
return "Option(" + this.short + ", " + this.long + ", " + this.argcount + ", " + this.value + ")";
};
Option.parse = function(option_description) {
var _, argcount, description, j, len, long, matched, options, ref, ref1, ref2, s, short, value;
ref = [null, null, 0, false], short = ref[0], long = ref[1], argcount = ref[2], value = ref[3];
ref1 = option_description.trim().partition(' '), options = ref1[0], _ = ref1[1], description = ref1[2];
options = options.replace(/,|=/g, ' ');
ref2 = options._split();
for (j = 0, len = ref2.length; j < len; j++) {
s = ref2[j];
if (s.startsWith('--')) {
long = s;
} else if (s.startsWith('-')) {
short = s;
} else {
argcount = 1;
}
}
if (argcount > 0) {
matched = /\[default:\s+(.*)\]/ig.exec(description);
value = matched ? matched[1] : null;
}
return new Option(short, long, argcount, value);
};
Option.prototype.singleMatch = function(left) {
var j, len, n, pattern, ref, ref1;
ref = enumerate(left);
for (j = 0, len = ref.length; j < len; j++) {
ref1 = ref[j], n = ref1[0], pattern = ref1[1];
if (this.name === pattern.name) {
return [n, pattern];
}
}
return [null, null];
};
return Option;
})(LeafPattern);
Required = (function(superClass) {
extend(Required, superClass);
function Required() {
return Required.__super__.constructor.apply(this, arguments);
}
Required.prototype.match = function(left, collected) {
var c, j, l, len, matched, p, ref, ref1;
if (collected == null) {
collected = null;
}
if (collected === null) {
collected = [];
}
l = left;
c = collected;
ref = this.children;
for (j = 0, len = ref.length; j < len; j++) {
p = ref[j];
ref1 = p.match(l, c), matched = ref1[0], l = ref1[1], c = ref1[2];
if (!matched) {
return [false, left, collected];
}
}
return [true, l, c];
};
return Required;
})(BranchPattern);
Optional = (function(superClass) {
extend(Optional, superClass);
function Optional() {
return Optional.__super__.constructor.apply(this, arguments);
}
Optional.prototype.match = function(left, collected) {
var j, len, m, p, ref, ref1;
if (collected == null) {
collected = null;
}
if (collected === null) {
collected = [];
}
ref = this.children;
for (j = 0, len = ref.length; j < len; j++) {
p = ref[j];
ref1 = p.match(left, collected), m = ref1[0], left = ref1[1], collected = ref1[2];
}
return [true, left, collected];
};
return Optional;
})(BranchPattern);
OptionsShortcut = (function(superClass) {
"Marker/placeholder for [options] shortcut.";
extend(OptionsShortcut, superClass);
function OptionsShortcut() {
return OptionsShortcut.__super__.constructor.apply(this, arguments);
}
return OptionsShortcut;
})(Optional);
OneOrMore = (function(superClass) {
extend(OneOrMore, superClass);
function OneOrMore() {
return OneOrMore.__super__.constructor.apply(this, arguments);
}
OneOrMore.prototype.match = function(left, collected) {
var c, l, l_, matched, ref, times;
if (collected == null) {
collected = null;
}
console.assert(this.children.length === 1);
if (collected === null) {
collected = [];
}
l = left;
c = collected;
l_ = [];
matched = true;
times = 0;
while (matched) {
ref = this.children[0].match(l, c), matched = ref[0], l = ref[1], c = ref[2];
times += matched ? 1 : 0;
if (l_.join(', ') === l.join(', ')) {
break;
}
l_ = l;
}
if (times >= 1) {
return [true, l, c];
}
return [false, left, collected];
};
return OneOrMore;
})(BranchPattern);
Either = (function(superClass) {
extend(Either, superClass);
function Either() {
return Either.__super__.constructor.apply(this, arguments);
}
Either.prototype.match = function(left, collected) {
var j, len, outcome, outcomes, p, ref;
if (collected == null) {
collected = null;
}
if (collected === null) {
collected = [];
}
outcomes = [];
ref = this.children;
for (j = 0, len = ref.length; j < len; j++) {
p = ref[j];
outcome = p.match(left, collected);
if (outcome[0]) {
outcomes.push(outcome);
}
}
if (outcomes.length > 0) {
outcomes.sort(function(a, b) {
if (a[1].length > b[1].length) {
return 1;
} else if (a[1].length < b[1].length) {
return -1;
} else {
return 0;
}
});
return outcomes[0];
}
return [false, left, collected];
};
return Either;
})(BranchPattern);
Tokens = (function(superClass) {
extend(Tokens, superClass);
function Tokens(source, error) {
var stream;
this.error = error != null ? error : DocoptExit;
stream = source.constructor === String ? source._split() : source;
this.push.apply(this, stream);
}
Tokens.prototype.move = function() {
if (this.length) {
return [].shift.apply(this);
} else {
return null;
}
};
Tokens.prototype.current = function() {
if (this.length) {
return this[0];
} else {
return null;
}
};
Tokens.from_pattern = function(source) {
var s;
source = source.replace(/([\[\]\(\)\|]|\.\.\.)/g, ' $1 ');
source = (function() {
var j, len, ref, results;
ref = source.split(/\s+|(\S*<.*?>)/);
results = [];
for (j = 0, len = ref.length; j < len; j++) {
s = ref[j];
if (s) {
results.push(s);
}
}
return results;
})();
return new Tokens(source, DocoptLanguageError);
};
return Tokens;
})(Array);
parse_section = function(name, source) {
var matches, s;
matches = source.match(new RegExp('^([^\n]*' + name + '[^\n]*\n?(?:[ \t].*?(?:\n|$))*)', 'igm'));
if (matches) {
return (function() {
var j, len, results;
results = [];
for (j = 0, len = matches.length; j < len; j++) {
s = matches[j];
results.push(s.trim());
}
return results;
})();
}
return [];
};
parse_shorts = function(tokens, options) {
"shorts ::= '-' ( chars )* [ [ ' ' ] chars ] ;";
var left, o, parsed, ref, ref1, short, similar, token, value;
token = tokens.move();
console.assert(token.startsWith('-') && !token.startsWith('--'));
left = token.replace(/^-+/g, '');
parsed = [];
while (left !== '') {
ref = ['-' + left[0], left.slice(1)], short = ref[0], left = ref[1];
similar = (function() {
var j, len, results;
results = [];
for (j = 0, len = options.length; j < len; j++) {
o = options[j];
if (o.short === short) {
results.push(o);
}
}
return results;
})();
if (similar.length > 1) {
throw new tokens.error(short + " is specified ambiguously " + similar.length + " times");
} else if (similar.length < 1) {
o = new Option(short, null, 0);
options.push(o);
if (tokens.error === DocoptExit) {
o = new Option(short, null, 0, true);
}
} else {
o = new Option(short, similar[0].long, similar[0].argcount, similar[0].value);
value = null;
if (o.argcount !== 0) {
if (left === '') {
if ((ref1 = tokens.current()) === null || ref1 === '--') {
throw new tokens.error(short + " requires argument");
}
value = tokens.move();
} else {
value = left;
left = '';
}
}
if (tokens.error === DocoptExit) {
o.value = value !== null ? value : true;
}
}
parsed.push(o);
}
return parsed;
};
parse_long = function(tokens, options) {
"long ::= '--' chars [ ( ' ' | '=' ) chars ] ;";
var argcount, eq, long, longs, o, ref, ref1, similar, value;
ref = tokens.move().partition('='), long = ref[0], eq = ref[1], value = ref[2];
console.assert(long.startsWith('--'));
if (eq === value && value === '') {
value = null;
}
similar = (function() {
var j, len, results;
results = [];
for (j = 0, len = options.length; j < len; j++) {
o = options[j];
if (o.long === long) {
results.push(o);
}
}
return results;
})();
if (tokens.error === DocoptExit && similar.length === 0) {
similar = (function() {
var j, len, results;
results = [];
for (j = 0, len = options.length; j < len; j++) {
o = options[j];
if (o.long && o.long.startsWith(long)) {
results.push(o);
}
}
return results;
})();
}
if (similar.length > 1) {
longs = ((function() {
var j, len, results;
results = [];
for (j = 0, len = similar.length; j < len; j++) {
o = similar[j];
results.push(o.long);
}
return results;
})()).join(', ');
throw new tokens.error(long + " is not a unique prefix: " + longs + "?");
} else if (similar.length < 1) {
argcount = eq === '=' ? 1 : 0;
o = new Option(null, long, argcount);
options.push(o);
if (tokens.error === DocoptExit) {
o = new Option(null, long, argcount, argcount > 0 ? value : true);
}
} else {
o = new Option(similar[0].short, similar[0].long, similar[0].argcount, similar[0].value);
if (o.argcount === 0) {
if (value !== null) {
throw new tokens.error(o.long + " must not have an argument");
}
} else {
if (value === null) {
if ((ref1 = tokens.current()) === null || ref1 === '--') {
throw new tokens.error(o.long + " requires argument");
}
value = tokens.move();
}
}
if (tokens.error === DocoptExit) {
o.value = value !== null ? value : true;
}
}
return [o];
};
parse_pattern = function(source, options) {
var result, tokens;
tokens = Tokens.from_pattern(source);
result = parse_expr(tokens, options);
if (tokens.current() !== null) {
throw new tokens.error('unexpected ending: ' + (tokens.join(' ')));
}
return new Required(result);
};
parse_expr = function(tokens, options) {
"expr ::= seq ( '|' seq )* ;";
var result, seq;
seq = parse_seq(tokens, options);
if (tokens.current() !== '|') {
return seq;
}
result = seq.length > 1 ? [new Required(seq)] : seq;
while (tokens.current() === '|') {
tokens.move();
seq = parse_seq(tokens, options);
result = result.concat(seq.length > 1 ? [new Required(seq)] : seq);
}
if (result.length > 1) {
return [new Either(result)];
} else {
return result;
}
};
parse_seq = function(tokens, options) {
"seq ::= ( atom [ '...' ] )* ;";
var atom, ref, result;
result = [];
while ((ref = tokens.current()) !== null && ref !== ']' && ref !== ')' && ref !== '|') {
atom = parse_atom(tokens, options);
if (tokens.current() === '...') {
atom = [new OneOrMore(atom)];
tokens.move();
}
result = result.concat(atom);
}
return result;
};
parse_atom = function(tokens, options) {
"atom ::= '(' expr ')' | '[' expr ']' | 'options'\n| long | shorts | argument | command ;";
var matching, patternType, ref, result, token;
token = tokens.current();
result = [];
if (indexOf.call('([', token) >= 0) {
tokens.move();
ref = {
'(': [')', Required],
'[': [']', Optional]
}[token], matching = ref[0], patternType = ref[1];
result = new patternType(parse_expr(tokens, options));
if (tokens.move() !== matching) {
throw new tokens.error("Unmatched '" + token + "'");
}
return [result];
} else if (token === 'options') {
tokens.move();
return [new OptionsShortcut];
} else if (token.startsWith('--') && token !== '--') {
return parse_long(tokens, options);
} else if (token.startsWith('-') && (token !== '-' && token !== '--')) {
return parse_shorts(tokens, options);
} else if (token.startsWith('<') && token.endsWith('>') || token.isUpper()) {
return [new Argument(tokens.move())];
} else {
return [new Command(tokens.move())];
}
};
parse_argv = function(tokens, options, options_first) {
var parsed, v;
if (options_first == null) {
options_first = false;
}
"Parse command-line argument vector.\nIf options_first:\n argv ::= [ long | shorts ]* [ argument ]* [ '--' [ argument ]* ] ;\nelse:\n argv ::= [ long | shorts | argument ]* [ '--' [ argument ]* ] ;";
parsed = [];
while (tokens.current() !== null) {
if (tokens.current() === '--') {
return parsed.concat((function() {
var j, len, results;
results = [];
for (j = 0, len = tokens.length; j < len; j++) {
v = tokens[j];
results.push(new Argument(null, v));
}
return results;
})());
} else if (tokens.current().startsWith('--')) {
parsed = parsed.concat(parse_long(tokens, options));
} else if (tokens.current().startsWith('-') && tokens.current() !== '-') {
parsed = parsed.concat(parse_shorts(tokens, options));
} else if (options_first) {
return parsed.concat((function() {
var j, len, results;
results = [];
for (j = 0, len = tokens.length; j < len; j++) {
v = tokens[j];
results.push(new Argument(null, v));
}
return results;
})());
} else {
parsed.push(new Argument(null, tokens.move()));
}
}
return parsed;
};
parse_defaults = function(doc) {
var _, defaults, even, j, len, odd, options, ref, ref1, s, s1, s2, split, v;
defaults = [];
ref = parse_section('options:', doc);
for (j = 0, len = ref.length; j < len; j++) {
s = ref[j];
ref1 = s.partition(':'), _ = ref1[0], _ = ref1[1], s = ref1[2];
split = ('\n' + s).split(new RegExp('\\n[ \\t]*(-\\S+?)')).slice(1);
odd = (function() {
var len1, q, results;
results = [];
for (q = 0, len1 = split.length; q < len1; q += 2) {
v = split[q];
results.push(v);
}
return results;
})();
even = (function() {
var len1, q, ref2, results;
ref2 = split.slice(1);
results = [];
for (q = 0, len1 = ref2.length; q < len1; q += 2) {
v = ref2[q];
results.push(v);
}
return results;
})();
split = (function() {
var len1, q, ref2, ref3, results;
ref2 = zip(odd, even);
results = [];
for (q = 0, len1 = ref2.length; q < len1; q++) {
ref3 = ref2[q], s1 = ref3[0], s2 = ref3[1];
results.push(s1 + s2);
}
return results;
})();
options = (function() {
var len1, q, results;
results = [];
for (q = 0, len1 = split.length; q < len1; q++) {
s = split[q];
if (s.startsWith('-')) {
results.push(Option.parse(s));
}
}
return results;
})();
defaults.push.apply(defaults, options);
}
return defaults;
};
formal_usage = function(section) {
var _, pu, ref, s;
ref = section.partition(':'), _ = ref[0], _ = ref[1], section = ref[2];
pu = section._split();
return '( ' + ((function() {
var j, len, ref1, results;
ref1 = pu.slice(1);
results = [];
for (j = 0, len = ref1.length; j < len; j++) {
s = ref1[j];
results.push(s === pu[0] ? ') | (' : s);
}
return results;
})()).join(' ') + ' )';
};
extras = function(help, version, options, doc) {
var o;
if (help && any((function() {
var j, len, ref, results;
results = [];
for (j = 0, len = options.length; j < len; j++) {
o = options[j];
results.push(((ref = o.name) === '--help' || ref === '-h') && o.value);
}
return results;
})())) {
return doc.replace(/^\s*|\s*$/, '');
}
if (version && any((function() {
var j, len, results;
results = [];
for (j = 0, len = options.length; j < len; j++) {
o = options[j];
results.push((o.name === '--version') && o.value);
}
return results;
})())) {
return version;
}
return "";
};
Dict = (function(superClass) {
extend(Dict, superClass);
function Dict(pairs) {
var j, key, len, ref, value;
for (j = 0, len = pairs.length; j < len; j++) {
ref = pairs[j], key = ref[0], value = ref[1];
this[key] = value;
}
}
Dict.prototype.toObject = function() {
var dict, j, len, name, ref;
dict = {};
ref = Object.keys(this).sort();
for (j = 0, len = ref.length; j < len; j++) {
name = ref[j];
dict[name] = this[name];
}
return dict;
};
return Dict;
})(Object);
docopt = function(doc, kwargs) {
var a, allowedargs, arg, argv, collected, doc_options, e, exit, help, i, j, left, len, matched, name, options, options_first, options_shortcut, output, pattern, pattern_options, pattern_options_strings, ref, ref1, usage_sections, version;
if (kwargs == null) {
kwargs = {};
}
allowedargs = ['argv', 'name', 'help', 'version', 'options_first', 'exit'];
for (arg in kwargs) {
if (indexOf.call(allowedargs, arg) < 0) {
throw new Error("unrecognized argument to docopt: ");
}
}
argv = kwargs.argv === void 0 ? process.argv.slice(2) : kwargs.argv;
name = kwargs.name === void 0 ? null : kwargs.name;
help = kwargs.help === void 0 ? true : kwargs.help;
version = kwargs.version === void 0 ? null : kwargs.version;
options_first = kwargs.options_first === void 0 ? false : kwargs.options_first;
exit = kwargs.exit === void 0 ? true : kwargs.exit;
try {
usage_sections = parse_section('usage:', doc);
if (usage_sections.length === 0) {
throw new DocoptLanguageError('"usage:" (case-insensitive) not found.');
}
if (usage_sections.length > 1) {
throw new DocoptLanguageError('More than one "usage:" (case-insensitive).');
}
DocoptExit.usage = usage_sections[0];
options = parse_defaults(doc);
pattern = parse_pattern(formal_usage(DocoptExit.usage), options);
argv = parse_argv(new Tokens(argv), options, options_first);
pattern_options = pattern.flat(Option);
ref = pattern.flat(OptionsShortcut);
for (j = 0, len = ref.length; j < len; j++) {
options_shortcut = ref[j];
doc_options = parse_defaults(doc);
pattern_options_strings = (function() {
var len1, q, results;
results = [];
for (q = 0, len1 = pattern_options.length; q < len1; q++) {
i = pattern_options[q];
results.push(i.toString());
}
return results;
})();
options_shortcut.children = doc_options.filter(function(item) {
var ref1;
return ref1 = item.toString(), indexOf.call(pattern_options_strings, ref1) < 0;
});
}
output = extras(help, version, argv, doc);
if (output) {
if (exit) {
print(output);
process.exit();
} else {
throw new Error(output);
}
}
ref1 = pattern.fix().match(argv), matched = ref1[0], left = ref1[1], collected = ref1[2];
if (matched && left.length === 0) {
return new Dict((function() {
var len1, q, ref2, results;
ref2 = [].concat(pattern.flat(), collected);
results = [];
for (q = 0, len1 = ref2.length; q < len1; q++) {
a = ref2[q];
results.push([a.name, a.value]);
}
return results;
})()).toObject();
}
throw new DocoptExit(DocoptExit.usage);
} catch (_error) {
e = _error;
if (!exit) {
throw e;
} else {
if (e.message) {
print(e.message);
}
return process.exit(1);
}
}
};
module.exports = {
docopt: docopt,
DocoptLanguageError: DocoptLanguageError,
DocoptExit: DocoptExit,
Option: Option,
Argument: Argument,
Command: Command,
Required: Required,
OptionsShortcut: OptionsShortcut,
Either: Either,
Optional: Optional,
Pattern: Pattern,
OneOrMore: OneOrMore,
Tokens: Tokens,
Dict: Dict,
transform: transform,
formal_usage: formal_usage,
parse_section: parse_section,
parse_defaults: parse_defaults,
parse_pattern: parse_pattern,
parse_long: parse_long,
parse_shorts: parse_shorts,
parse_argv: parse_argv
};
}).call(this);