thirdparty/jsdoctoolkit/app/frame/Opt.js
changeset 3041 c8f47f0b6697
equal deleted inserted replaced
3040:8f9580309846 3041:c8f47f0b6697
       
     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  */