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;
 | 
						|
  }
 | 
						|
} |