95 lines
2.4 KiB
JavaScript
95 lines
2.4 KiB
JavaScript
export function getFileExt(name = "") {
|
|||
|
|
const idx = name.lastIndexOf(".");
|
||
|
|
if (idx < 0 || idx === name.length - 1) return "";
|
||
|
|
return name.slice(idx + 1).toLowerCase();
|
||
|
|
}
|
||
|
|
|
||
|
|
export const PREVIEW_IMAGE_EXTS = new Set(["jpg", "jpeg", "png", "gif", "webp", "bmp"]);
|
||
|
|
export const PREVIEW_PDF_EXTS = new Set(["pdf"]);
|
||
|
|
export const PREVIEW_MAX_BYTES = 50 * 1024 * 1024;
|
||
|
|
|
||
|
|
export const KNOWN_BINARY_EXTS = new Set([
|
||
|
|
"mp4", "avi", "mkv", "mov", "wmv", "flv", "webm", "m4v",
|
||
|
|
"mp3", "wav", "flac", "ogg", "aac", "wma", "m4a",
|
||
|
|
"exe", "msi", "com", "app", "appimage",
|
||
|
|
"dll", "so", "dylib", "lib",
|
||
|
|
"zip", "rar", "7z", "tar", "gz", "bz2", "xz", "tgz",
|
||
|
|
"db", "sqlite", "sqlite3", "mdb",
|
||
|
|
"ttf", "otf", "woff", "woff2", "eot",
|
||
|
|
"iso", "img", "vhd", "vmdk",
|
||
|
|
]);
|
||
|
|
|
||
|
|
const IMAGE_MIME_MAP = {
|
||
|
|
jpg: "image/jpeg",
|
||
|
|
jpeg: "image/jpeg",
|
||
|
|
png: "image/png",
|
||
|
|
gif: "image/gif",
|
||
|
|
webp: "image/webp",
|
||
|
|
bmp: "image/bmp",
|
||
|
|
};
|
||
|
|
|
||
|
|
export function isPreviewable(name) {
|
||
|
|
const ext = getFileExt(name);
|
||
|
|
return PREVIEW_IMAGE_EXTS.has(ext) || PREVIEW_PDF_EXTS.has(ext);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getPreviewMimeType(name) {
|
||
|
|
const ext = getFileExt(name);
|
||
|
|
if (PREVIEW_PDF_EXTS.has(ext)) return "application/pdf";
|
||
|
|
return IMAGE_MIME_MAP[ext] || null;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function shouldShowParentDirectory(path) {
|
||
|
|
if (!path || path === ".") {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getParentPath(path) {
|
||
|
|
const normalized = path.replace(/\\/g, "/");
|
||
|
|
const parts = normalized.split("/").filter((p) => p);
|
||
|
|
|
||
|
|
if (parts.length === 1 && parts[0].match(/^[A-Za-z]:$/)) {
|
||
|
|
return ".";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (parts.length <= 1) {
|
||
|
|
return ".";
|
||
|
|
}
|
||
|
|
|
||
|
|
parts.pop();
|
||
|
|
let parentPath = parts.join("/");
|
||
|
|
|
||
|
|
if (parentPath.match(/^[A-Za-z]:?$/)) {
|
||
|
|
return parentPath.replace(/^([A-Za-z]):?$/, "$1:\\");
|
||
|
|
}
|
||
|
|
|
||
|
|
return parentPath || ".";
|
||
|
|
}
|
||
|
|
|
||
|
|
export function formatBytes(bytes) {
|
||
|
|
if (bytes === 0 || bytes === 0n) return "0 B";
|
||
|
|
const sizes = ["B", "KB", "MB", "GB", "TB"];
|
||
|
|
if (typeof bytes === "bigint") {
|
||
|
|
const k = 1024n;
|
||
|
|
let i = 0;
|
||
|
|
let value = bytes;
|
||
|
|
while (value >= k && i < sizes.length - 1) {
|
||
|
|
value /= k;
|
||
|
|
i += 1;
|
||
|
|
}
|
||
|
|
return `${value.toString()} ${sizes[i]}`;
|
||
|
|
}
|
||
|
|
const k = 1024;
|
||
|
|
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||
|
|
return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + " " + sizes[i];
|
||
|
|
}
|
||
|
|
|
||
|
|
export function escapeHtml(text) {
|
||
|
|
const div = document.createElement("div");
|
||
|
|
div.textContent = text;
|
||
|
|
return div.innerHTML;
|
||
|
|
}
|