modularize build and file browser and add more precautions for downloading from file transfer.
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user