144 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var path = require('path');
 | |
| var inspect = require('util').inspect;
 | |
| 
 | |
| function assertPath(path) {
 | |
|   if (typeof path !== 'string') {
 | |
|     throw new TypeError('Path must be a string. Received ' + inspect(path));
 | |
|   }
 | |
| }
 | |
| 
 | |
| function posix(path) {
 | |
|   assertPath(path);
 | |
|   if (path.length === 0)
 | |
|     return '.';
 | |
|   var code = path.charCodeAt(0);
 | |
|   var hasRoot = (code === 47/*/*/);
 | |
|   var end = -1;
 | |
|   var matchedSlash = true;
 | |
|   for (var i = path.length - 1; i >= 1; --i) {
 | |
|     code = path.charCodeAt(i);
 | |
|     if (code === 47/*/*/) {
 | |
|       if (!matchedSlash) {
 | |
|         end = i;
 | |
|         break;
 | |
|       }
 | |
|     } else {
 | |
|       // We saw the first non-path separator
 | |
|       matchedSlash = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (end === -1)
 | |
|     return hasRoot ? '/' : '.';
 | |
|   if (hasRoot && end === 1)
 | |
|     return '//';
 | |
|   return path.slice(0, end);
 | |
| }
 | |
| 
 | |
| function win32(path) {
 | |
|   assertPath(path);
 | |
|   var len = path.length;
 | |
|   if (len === 0)
 | |
|     return '.';
 | |
|   var rootEnd = -1;
 | |
|   var end = -1;
 | |
|   var matchedSlash = true;
 | |
|   var offset = 0;
 | |
|   var code = path.charCodeAt(0);
 | |
| 
 | |
|   // Try to match a root
 | |
|   if (len > 1) {
 | |
|     if (code === 47/*/*/ || code === 92/*\*/) {
 | |
|       // Possible UNC root
 | |
| 
 | |
|       rootEnd = offset = 1;
 | |
| 
 | |
|       code = path.charCodeAt(1);
 | |
|       if (code === 47/*/*/ || code === 92/*\*/) {
 | |
|         // Matched double path separator at beginning
 | |
|         var j = 2;
 | |
|         var last = j;
 | |
|         // Match 1 or more non-path separators
 | |
|         for (; j < len; ++j) {
 | |
|           code = path.charCodeAt(j);
 | |
|           if (code === 47/*/*/ || code === 92/*\*/)
 | |
|             break;
 | |
|         }
 | |
|         if (j < len && j !== last) {
 | |
|           // Matched!
 | |
|           last = j;
 | |
|           // Match 1 or more path separators
 | |
|           for (; j < len; ++j) {
 | |
|             code = path.charCodeAt(j);
 | |
|             if (code !== 47/*/*/ && code !== 92/*\*/)
 | |
|               break;
 | |
|           }
 | |
|           if (j < len && j !== last) {
 | |
|             // Matched!
 | |
|             last = j;
 | |
|             // Match 1 or more non-path separators
 | |
|             for (; j < len; ++j) {
 | |
|               code = path.charCodeAt(j);
 | |
|               if (code === 47/*/*/ || code === 92/*\*/)
 | |
|                 break;
 | |
|             }
 | |
|             if (j === len) {
 | |
|               // We matched a UNC root only
 | |
|               return path;
 | |
|             }
 | |
|             if (j !== last) {
 | |
|               // We matched a UNC root with leftovers
 | |
| 
 | |
|               // Offset by 1 to include the separator after the UNC root to
 | |
|               // treat it as a "normal root" on top of a (UNC) root
 | |
|               rootEnd = offset = j + 1;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     } else if ((code >= 65/*A*/ && code <= 90/*Z*/) ||
 | |
|                (code >= 97/*a*/ && code <= 122/*z*/)) {
 | |
|       // Possible device root
 | |
| 
 | |
|       code = path.charCodeAt(1);
 | |
|       if (path.charCodeAt(1) === 58/*:*/) {
 | |
|         rootEnd = offset = 2;
 | |
|         if (len > 2) {
 | |
|           code = path.charCodeAt(2);
 | |
|           if (code === 47/*/*/ || code === 92/*\*/)
 | |
|             rootEnd = offset = 3;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   } else if (code === 47/*/*/ || code === 92/*\*/) {
 | |
|     return path[0];
 | |
|   }
 | |
| 
 | |
|   for (var i = len - 1; i >= offset; --i) {
 | |
|     code = path.charCodeAt(i);
 | |
|     if (code === 47/*/*/ || code === 92/*\*/) {
 | |
|       if (!matchedSlash) {
 | |
|         end = i;
 | |
|         break;
 | |
|       }
 | |
|     } else {
 | |
|       // We saw the first non-path separator
 | |
|       matchedSlash = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (end === -1) {
 | |
|     if (rootEnd === -1)
 | |
|       return '.';
 | |
|     else
 | |
|       end = rootEnd;
 | |
|   }
 | |
|   return path.slice(0, end);
 | |
| }
 | |
| 
 | |
| module.exports = process.platform === 'win32' ? win32 : posix;
 | |
| module.exports.posix = posix;
 | |
| module.exports.win32 = win32;
 |