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.
143 lines
3.5 KiB
143 lines
3.5 KiB
'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;
|
|
|