playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
100 lines (99 loc) • 2.55 kB
JavaScript
const path = {
delimiter: "/",
join(...sections) {
let result = sections[0];
for (let i = 0; i < sections.length - 1; i++) {
const one = sections[i];
const two = sections[i + 1];
if (two[0] === path.delimiter) {
result = two;
continue;
}
if (one && two && one[one.length - 1] !== path.delimiter && two[0] !== path.delimiter) {
result += path.delimiter + two;
} else {
result += two;
}
}
return result;
},
normalize(pathname) {
const lead = pathname.startsWith(path.delimiter);
const trail = pathname.endsWith(path.delimiter);
const parts = pathname.split("/");
let result = "";
let cleaned = [];
for (let i = 0; i < parts.length; i++) {
if (parts[i] === "") continue;
if (parts[i] === ".") continue;
if (parts[i] === ".." && cleaned.length > 0) {
cleaned = cleaned.slice(0, cleaned.length - 2);
continue;
}
if (i > 0) cleaned.push(path.delimiter);
cleaned.push(parts[i]);
}
result = cleaned.join("");
if (!lead && result[0] === path.delimiter) {
result = result.slice(1);
}
if (trail && result[result.length - 1] !== path.delimiter) {
result += path.delimiter;
}
return result;
},
split(pathname) {
const lastDelimiterIndex = pathname.lastIndexOf(path.delimiter);
if (lastDelimiterIndex !== -1) {
return [pathname.substring(0, lastDelimiterIndex), pathname.substring(lastDelimiterIndex + 1)];
}
return ["", pathname];
},
getBasename(pathname) {
return path.split(pathname)[1];
},
getDirectory(pathname) {
return path.split(pathname)[0];
},
getExtension(pathname) {
const ext = pathname.split("?")[0].split(".").pop();
if (ext !== pathname) {
return `.${ext}`;
}
return "";
},
isRelativePath(pathname) {
return pathname.charAt(0) !== "/" && pathname.match(/:\/\//) === null;
},
extractPath(pathname) {
let result = "";
const parts = pathname.split("/");
let i = 0;
if (parts.length > 1) {
if (path.isRelativePath(pathname)) {
if (parts[0] === ".") {
for (i = 0; i < parts.length - 1; ++i) {
result += i === 0 ? parts[i] : `/${parts[i]}`;
}
} else if (parts[0] === "..") {
for (i = 0; i < parts.length - 1; ++i) {
result += i === 0 ? parts[i] : `/${parts[i]}`;
}
} else {
result = ".";
for (i = 0; i < parts.length - 1; ++i) {
result += `/${parts[i]}`;
}
}
} else {
for (i = 0; i < parts.length - 1; ++i) {
result += i === 0 ? parts[i] : `/${parts[i]}`;
}
}
}
return result;
}
};
export {
path
};