55 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			55 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @dgService parseArgString
							 | 
						||
| 
								 | 
							
								 * @description
							 | 
						||
| 
								 | 
							
								 * processes an arg string in 'almost' the same fashion that the command processor does
							 | 
						||
| 
								 | 
							
								 * and returns an args object in yargs format.
							 | 
						||
| 
								 | 
							
								 * @kind function
							 | 
						||
| 
								 | 
							
								 * @param  {String} str   The arg string to process
							 | 
						||
| 
								 | 
							
								 * @return {Object} The args parsed into a yargs format.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function parseArgString() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return function parseArgStringImpl(str) {
							 | 
						||
| 
								 | 
							
								    // regex from npm string-argv
							 | 
						||
| 
								 | 
							
								    //[^\s'"] Match if not a space ' or "
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //+|['] or Match '
							 | 
						||
| 
								 | 
							
								    //([^']*) Match anything that is not '
							 | 
						||
| 
								 | 
							
								    //['] Close match if '
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //+|["] or Match "
							 | 
						||
| 
								 | 
							
								    //([^"]*) Match anything that is not "
							 | 
						||
| 
								 | 
							
								    //["] Close match if "
							 | 
						||
| 
								 | 
							
								    var rx = /[^\s'"]+|[']([^']*?)[']|["]([^"]*?)["]/gi;
							 | 
						||
| 
								 | 
							
								    var value = str;
							 | 
						||
| 
								 | 
							
								    var unnammedArgs = [];
							 | 
						||
| 
								 | 
							
								    var args = {_: unnammedArgs};
							 | 
						||
| 
								 | 
							
								    var match, key;
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								      // Each call to exec returns the next regex match as an array
							 | 
						||
| 
								 | 
							
								      match = rx.exec(value);
							 | 
						||
| 
								 | 
							
								      if (match !== null) {
							 | 
						||
| 
								 | 
							
								        // Index 1 in the array is the captured group if it exists
							 | 
						||
| 
								 | 
							
								        // Index 0 is the matched text, which we use if no captured group exists
							 | 
						||
| 
								 | 
							
								        var arg = match[2] ? match[2] : (match[1] ? match[1] : match[0]);
							 | 
						||
| 
								 | 
							
								        if (key) {
							 | 
						||
| 
								 | 
							
								          args[key] = arg;
							 | 
						||
| 
								 | 
							
								          key = null;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          if (arg.substr(arg.length - 1) === '=') {
							 | 
						||
| 
								 | 
							
								            key = arg.substr(0, arg.length - 1);
							 | 
						||
| 
								 | 
							
								            // remove leading '-' if it exists.
							 | 
						||
| 
								 | 
							
								            if (key.substr(0, 1) == '-') {
							 | 
						||
| 
								 | 
							
								              key = key.substr(1);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          } else {
							 | 
						||
| 
								 | 
							
								            unnammedArgs.push(arg)
							 | 
						||
| 
								 | 
							
								            key = null;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } while (match !== null);
							 | 
						||
| 
								 | 
							
								    return args;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |