|
@ -1,40 +1,33 @@ |
|
|
function validPathPart(p, keepBlanks) { |
|
|
function validPathPart(p) { |
|
|
return typeof p === 'string' && (p || keepBlanks); |
|
|
return typeof p === 'string' && p; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.join = function() { |
|
|
exports.join = function() { |
|
|
var args = Array.prototype.slice.call(arguments); |
|
|
var args = Array.prototype.slice.call(arguments); |
|
|
// edge case flag to switch into url-resolve-mode
|
|
|
return exports.normalizeArray(args).join('/'); |
|
|
var keepBlanks = false; |
|
|
|
|
|
if (args[args.length - 1] === true) { |
|
|
|
|
|
keepBlanks = args.pop(); |
|
|
|
|
|
} |
|
|
|
|
|
// return exports.split(args.join("/"), keepBlanks).join("/");
|
|
|
|
|
|
var joined = exports.normalizeArray(args, keepBlanks).join('/'); |
|
|
|
|
|
return joined; |
|
|
|
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.split = function(path, keepBlanks) { |
|
|
exports.split = function(path) { |
|
|
// split based on / and \, but only if that / is not at the start or end.
|
|
|
// split based on / and \, but only if that / is not at the start or end.
|
|
|
return exports.normalizeArray(path.split(/^|[\\\/](?!$)/), keepBlanks); |
|
|
return exports.normalizeArray(path.split(/^|[\\\/](?!$)/)); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function cleanArray(parts, keepBlanks) { |
|
|
function cleanArray(parts) { |
|
|
var i = 0; |
|
|
var i = 0; |
|
|
var l = parts.length - 1; |
|
|
var l = parts.length - 1; |
|
|
var stripped = false; |
|
|
var stripped = false; |
|
|
|
|
|
|
|
|
// strip leading empty args
|
|
|
// strip leading empty args
|
|
|
while (i < l && !validPathPart(parts[i], keepBlanks)) { |
|
|
while (i < l && !validPathPart(parts[i])) { |
|
|
stripped = true; |
|
|
stripped = true; |
|
|
i++; |
|
|
i++; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// strip tailing empty args
|
|
|
// strip tailing empty args
|
|
|
while (l >= i && !validPathPart(parts[l], keepBlanks)) { |
|
|
while (l >= i && !validPathPart(parts[l])) { |
|
|
stripped = true; |
|
|
stripped = true; |
|
|
l--; |
|
|
l--; |
|
|
} |
|
|
} |
|
@ -44,14 +37,14 @@ function cleanArray(parts, keepBlanks) { |
|
|
parts = Array.prototype.slice.call(parts, i, l + 1); |
|
|
parts = Array.prototype.slice.call(parts, i, l + 1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return parts.filter(function(p) { return validPathPart(p, keepBlanks) }) |
|
|
return parts.filter(function(p) { return validPathPart(p) }) |
|
|
.join('/') |
|
|
.join('/') |
|
|
.split(/^|[\\\/](?!$)/); |
|
|
.split(/^|[\\\/](?!$)/); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.normalizeArray = function(original, keepBlanks) { |
|
|
exports.normalizeArray = function(original) { |
|
|
var parts = cleanArray(original, keepBlanks); |
|
|
var parts = cleanArray(original); |
|
|
if (!parts.length || (parts.length === 1 && !parts[0])) return ['.']; |
|
|
if (!parts.length || (parts.length === 1 && !parts[0])) return ['.']; |
|
|
|
|
|
|
|
|
// now we're fully ready to rock.
|
|
|
// now we're fully ready to rock.
|
|
@ -69,7 +62,7 @@ exports.normalizeArray = function(original, keepBlanks) { |
|
|
var directory = parts[i]; |
|
|
var directory = parts[i]; |
|
|
|
|
|
|
|
|
// if it's blank, and we're not keeping blanks, then skip it.
|
|
|
// if it's blank, and we're not keeping blanks, then skip it.
|
|
|
if (directory === '' && !keepBlanks) continue; |
|
|
if (directory === '') continue; |
|
|
|
|
|
|
|
|
// if it's a dot, then skip it
|
|
|
// if it's a dot, then skip it
|
|
|
if (directory === '.' && (directories.length || |
|
|
if (directory === '.' && (directories.length || |
|
@ -106,8 +99,8 @@ exports.normalizeArray = function(original, keepBlanks) { |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.normalize = function(path, keepBlanks) { |
|
|
exports.normalize = function(path) { |
|
|
return exports.join(path, keepBlanks || false); |
|
|
return exports.join(path); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|