You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							66 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							66 lines
						
					
					
						
							1.7 KiB
						
					
					
				
 | 
						|
/** | 
						|
 * Module dependencies. | 
						|
 */ | 
						|
 | 
						|
var sep = require('path').sep || '/'; | 
						|
 | 
						|
/** | 
						|
 * Module exports. | 
						|
 */ | 
						|
 | 
						|
module.exports = fileUriToPath; | 
						|
 | 
						|
/** | 
						|
 * File URI to Path function. | 
						|
 * | 
						|
 * @param {String} uri | 
						|
 * @return {String} path | 
						|
 * @api public | 
						|
 */ | 
						|
 | 
						|
function fileUriToPath (uri) { | 
						|
  if ('string' != typeof uri || | 
						|
      uri.length <= 7 || | 
						|
      'file://' != uri.substring(0, 7)) { | 
						|
    throw new TypeError('must pass in a file:// URI to convert to a file path'); | 
						|
  } | 
						|
 | 
						|
  var rest = decodeURI(uri.substring(7)); | 
						|
  var firstSlash = rest.indexOf('/'); | 
						|
  var host = rest.substring(0, firstSlash); | 
						|
  var path = rest.substring(firstSlash + 1); | 
						|
 | 
						|
  // 2.  Scheme Definition | 
						|
  // As a special case, <host> can be the string "localhost" or the empty | 
						|
  // string; this is interpreted as "the machine from which the URL is | 
						|
  // being interpreted". | 
						|
  if ('localhost' == host) host = ''; | 
						|
 | 
						|
  if (host) { | 
						|
    host = sep + sep + host; | 
						|
  } | 
						|
 | 
						|
  // 3.2  Drives, drive letters, mount points, file system root | 
						|
  // Drive letters are mapped into the top of a file URI in various ways, | 
						|
  // depending on the implementation; some applications substitute | 
						|
  // vertical bar ("|") for the colon after the drive letter, yielding | 
						|
  // "file:///c|/tmp/test.txt".  In some cases, the colon is left | 
						|
  // unchanged, as in "file:///c:/tmp/test.txt".  In other cases, the | 
						|
  // colon is simply omitted, as in "file:///c/tmp/test.txt". | 
						|
  path = path.replace(/^(.+)\|/, '$1:'); | 
						|
 | 
						|
  // for Windows, we need to invert the path separators from what a URI uses | 
						|
  if (sep == '\\') { | 
						|
    path = path.replace(/\//g, '\\'); | 
						|
  } | 
						|
 | 
						|
  if (/^.+\:/.test(path)) { | 
						|
    // has Windows drive at beginning of path | 
						|
  } else { | 
						|
    // unix path… | 
						|
    path = sep + path; | 
						|
  } | 
						|
 | 
						|
  return host + path; | 
						|
}
 | 
						|
 |