Spaces:
Sleeping
Sleeping
/** @namespace */ | |
Opt = { | |
/** | |
* Get commandline option values. | |
* @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"] | |
* @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}. | |
* @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true} | |
*/ | |
get: function(args, optNames) { | |
var opt = {"_": []}; // the unnamed option allows multiple values | |
for (var i = 0; i < args.length; i++) { | |
var arg = new String(args[i]); | |
var name; | |
var value; | |
if (arg.charAt(0) == "-") { | |
if (arg.charAt(1) == "-") { // it's a longname like --foo | |
arg = arg.substring(2); | |
var m = arg.split("="); | |
name = m.shift(); | |
value = m.shift(); | |
if (typeof value == "undefined") value = true; | |
for (var n in optNames) { // convert it to a shortname | |
if (name == optNames[n]) { | |
name = n; | |
} | |
} | |
} | |
else { // it's a shortname like -f | |
arg = arg.substring(1); | |
var m = arg.split("="); | |
name = m.shift(); | |
value = m.shift(); | |
if (typeof value == "undefined") value = true; | |
for (var n in optNames) { // find the matching key | |
if (name == n || name+'[]' == n) { | |
name = n; | |
break; | |
} | |
} | |
} | |
if (name.match(/(.+)\[\]$/)) { // it's an array type like n[] | |
name = RegExp.$1; | |
if (!opt[name]) opt[name] = []; | |
} | |
if (opt[name] && opt[name].push) { | |
opt[name].push(value); | |
} | |
else { | |
opt[name] = value; | |
} | |
} | |
else { // not associated with any optname | |
opt._.push(args[i]); | |
} | |
} | |
return opt; | |
} | |
} | |
/*t: | |
plan(11, "Testing Opt."); | |
is( | |
typeof Opt, | |
"object", | |
"Opt is an object." | |
); | |
is( | |
typeof Opt.get, | |
"function", | |
"Opt.get is a function." | |
); | |
var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"}; | |
var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames); | |
is( | |
t_options.a, | |
"xml", | |
"an option defined with a short name can be accessed by its short name." | |
); | |
is( | |
t_options.b, | |
true, | |
"an option defined with a short name and no value are true." | |
); | |
is( | |
t_options.c, | |
"new", | |
"an option defined with a long name can be accessed by its short name." | |
); | |
is( | |
t_options.d, | |
true, | |
"an option defined with a long name and no value are true." | |
); | |
is( | |
typeof t_options.e, | |
"object", | |
"an option that can accept multiple values is defined." | |
); | |
is( | |
t_options.e.length, | |
2, | |
"an option that can accept multiple values can have more than one value." | |
); | |
is( | |
t_options.e[1], | |
"two", | |
"an option that can accept multiple values can be accessed as an array." | |
); | |
is( | |
typeof t_options._, | |
"object", | |
"the property '_' is defined for unnamed options." | |
); | |
is( | |
t_options._[0], | |
"foo", | |
"the property '_' can be accessed as an array." | |
); | |
*/ |