Commit | Line | Data |
---|---|---|
629a09ae DV |
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 | */ |