can generate jsdoc; private methods marked as such
[dygraphs.git] / jsdoc-toolkit / app / frame / Opt.js
diff --git a/jsdoc-toolkit/app/frame/Opt.js b/jsdoc-toolkit/app/frame/Opt.js
new file mode 100644 (file)
index 0000000..352f159
--- /dev/null
@@ -0,0 +1,134 @@
+/** @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."
+       );
+ */
\ No newline at end of file