|
1 /** @namespace */ |
|
2 Opt = { |
|
3 /** |
|
4 * Get commandline option values. |
|
5 * @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"] |
|
6 * @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}. |
|
7 * @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true} |
|
8 */ |
|
9 get: function(args, optNames) { |
|
10 var opt = {"_": []}; // the unnamed option allows multiple values |
|
11 for (var i = 0; i < args.length; i++) { |
|
12 var arg = new String(args[i]); |
|
13 var name; |
|
14 var value; |
|
15 if (arg.charAt(0) == "-") { |
|
16 if (arg.charAt(1) == "-") { // it's a longname like --foo |
|
17 arg = arg.substring(2); |
|
18 var m = arg.split("="); |
|
19 name = m.shift(); |
|
20 value = m.shift(); |
|
21 if (typeof value == "undefined") value = true; |
|
22 |
|
23 for (var n in optNames) { // convert it to a shortname |
|
24 if (name == optNames[n]) { |
|
25 name = n; |
|
26 } |
|
27 } |
|
28 } |
|
29 else { // it's a shortname like -f |
|
30 arg = arg.substring(1); |
|
31 var m = arg.split("="); |
|
32 name = m.shift(); |
|
33 value = m.shift(); |
|
34 if (typeof value == "undefined") value = true; |
|
35 |
|
36 for (var n in optNames) { // find the matching key |
|
37 if (name == n || name+'[]' == n) { |
|
38 name = n; |
|
39 break; |
|
40 } |
|
41 } |
|
42 } |
|
43 if (name.match(/(.+)\[\]$/)) { // it's an array type like n[] |
|
44 name = RegExp.$1; |
|
45 if (!opt[name]) opt[name] = []; |
|
46 } |
|
47 |
|
48 if (opt[name] && opt[name].push) { |
|
49 opt[name].push(value); |
|
50 } |
|
51 else { |
|
52 opt[name] = value; |
|
53 } |
|
54 } |
|
55 else { // not associated with any optname |
|
56 opt._.push(args[i]); |
|
57 } |
|
58 } |
|
59 return opt; |
|
60 } |
|
61 } |
|
62 |
|
63 /*t: |
|
64 plan(11, "Testing Opt."); |
|
65 |
|
66 is( |
|
67 typeof Opt, |
|
68 "object", |
|
69 "Opt is an object." |
|
70 ); |
|
71 |
|
72 is( |
|
73 typeof Opt.get, |
|
74 "function", |
|
75 "Opt.get is a function." |
|
76 ); |
|
77 |
|
78 var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"}; |
|
79 var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames); |
|
80 |
|
81 is( |
|
82 t_options.a, |
|
83 "xml", |
|
84 "an option defined with a short name can be accessed by its short name." |
|
85 ); |
|
86 |
|
87 is( |
|
88 t_options.b, |
|
89 true, |
|
90 "an option defined with a short name and no value are true." |
|
91 ); |
|
92 |
|
93 is( |
|
94 t_options.c, |
|
95 "new", |
|
96 "an option defined with a long name can be accessed by its short name." |
|
97 ); |
|
98 |
|
99 is( |
|
100 t_options.d, |
|
101 true, |
|
102 "an option defined with a long name and no value are true." |
|
103 ); |
|
104 |
|
105 is( |
|
106 typeof t_options.e, |
|
107 "object", |
|
108 "an option that can accept multiple values is defined." |
|
109 ); |
|
110 |
|
111 is( |
|
112 t_options.e.length, |
|
113 2, |
|
114 "an option that can accept multiple values can have more than one value." |
|
115 ); |
|
116 |
|
117 is( |
|
118 t_options.e[1], |
|
119 "two", |
|
120 "an option that can accept multiple values can be accessed as an array." |
|
121 ); |
|
122 |
|
123 is( |
|
124 typeof t_options._, |
|
125 "object", |
|
126 "the property '_' is defined for unnamed options." |
|
127 ); |
|
128 |
|
129 is( |
|
130 t_options._[0], |
|
131 "foo", |
|
132 "the property '_' can be accessed as an array." |
|
133 ); |
|
134 */ |