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." | |
| ); | |
| */ |