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.
		
		
		
		
		
			
		
			
				
					
					
						
							86 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							86 lines
						
					
					
						
							2.0 KiB
						
					
					
				module.exports = function normalize(path) { | 
						|
	var parts = path.split(/(\\+|\/+)/); | 
						|
	if(parts.length === 1) | 
						|
		return path; | 
						|
	var result = []; | 
						|
	var absolutePathStart = 0; | 
						|
	for(var i = 0, sep = false; i < parts.length; i++, sep = !sep) { | 
						|
		var part = parts[i]; | 
						|
		if(i === 0 && /^([A-Z]:)?$/i.test(part)) { | 
						|
			result.push(part); | 
						|
			absolutePathStart = 2; | 
						|
		} else if(sep) { | 
						|
			result.push(part[0]); | 
						|
		} else if(part === "..") { | 
						|
			switch(result.length) { | 
						|
				case 0: | 
						|
					// i. e. ".." => ".." | 
						|
					// i. e. "../a/b/c" => "../a/b/c" | 
						|
					result.push(part); | 
						|
					break; | 
						|
				case 2: | 
						|
					// i. e. "a/.." => "" | 
						|
					// i. e. "/.." => "/" | 
						|
					// i. e. "C:\.." => "C:\" | 
						|
					// i. e. "a/../b/c" => "b/c" | 
						|
					// i. e. "/../b/c" => "/b/c" | 
						|
					// i. e. "C:\..\a\b\c" => "C:\a\b\c" | 
						|
					i++; | 
						|
					sep = !sep; | 
						|
					result.length = absolutePathStart; | 
						|
					break; | 
						|
				case 4: | 
						|
					// i. e. "a/b/.." => "a" | 
						|
					// i. e. "/a/.." => "/" | 
						|
					// i. e. "C:\a\.." => "C:\" | 
						|
					// i. e. "/a/../b/c" => "/b/c" | 
						|
					if(absolutePathStart === 0) { | 
						|
						result.length -= 3; | 
						|
					} else { | 
						|
						i++; | 
						|
						sep = !sep; | 
						|
						result.length = 2; | 
						|
					} | 
						|
					break; | 
						|
				default: | 
						|
					// i. e. "/a/b/.." => "/a" | 
						|
					// i. e. "/a/b/../c" => "/a/c" | 
						|
					result.length -= 3; | 
						|
					break; | 
						|
			} | 
						|
		} else if(part === ".") { | 
						|
			switch(result.length) { | 
						|
				case 0: | 
						|
					// i. e. "." => "." | 
						|
					// i. e. "./a/b/c" => "./a/b/c" | 
						|
					result.push(part); | 
						|
					break; | 
						|
				case 2: | 
						|
					// i. e. "a/." => "a" | 
						|
					// i. e. "/." => "/" | 
						|
					// i. e. "C:\." => "C:\" | 
						|
					// i. e. "C:\.\a\b\c" => "C:\a\b\c" | 
						|
					if(absolutePathStart === 0) { | 
						|
						result.length--; | 
						|
					} else { | 
						|
						i++; | 
						|
						sep = !sep; | 
						|
					} | 
						|
					break; | 
						|
				default: | 
						|
					// i. e. "a/b/." => "a/b" | 
						|
					// i. e. "/a/." => "/" | 
						|
					// i. e. "C:\a\." => "C:\" | 
						|
					// i. e. "a/./b/c" => "a/b/c" | 
						|
					// i. e. "/a/./b/c" => "/a/b/c" | 
						|
					result.length--; | 
						|
					break; | 
						|
			} | 
						|
		} else if(part) { | 
						|
			result.push(part); | 
						|
		} | 
						|
	} | 
						|
	if(result.length === 1 && /^[A-Za-z]:$/.test(result)) | 
						|
		return result[0] + "\\"; | 
						|
	return result.join(""); | 
						|
};
 | 
						|
 |