nhfs
Version:
NHFS — A sleek HTTP file server for the web built with Next.js and HeroUI. (Alpha)
80 lines (65 loc) • 2.36 kB
text/typescript
/**
* Trims a filename from the middle if it's too long.
* @param name - The full filename (e.g. "longFileName.ts")
* @param maxLength - Max total characters to display (default: 24)
* @returns A nicely trimmed filename with extension preserved
*/
export function shrtn(name: string, maxLength = 24): string {
if (name.length <= maxLength) return name;
const extIndex = name.lastIndexOf('.');
const hasExt = extIndex !== -1 && extIndex !== 0;
const extension = hasExt ? name.slice(extIndex) : '';
const baseName = hasExt ? name.slice(0, extIndex) : name;
const visibleLength = maxLength - extension.length - 3; // 3 for "..."
const front = Math.ceil(visibleLength / 2);
const back = Math.floor(visibleLength / 2);
return `${baseName.slice(0, front)}...${baseName.slice(-back)}${extension}`;
}
export function sanitizeUrlPath(urlPath: string) {
return (
decodeURIComponent(urlPath)
// .replace(/\+/g, ' ') // Replace + with space
// .replace(/[^a-zA-Z0-9 _\-]/g, '') // Strip anything not alphanum, space, underscore, hyphen, dot
// .replace(/\s+/g, ' ') // Collapse multiple spaces
.trim()
); // Remove leading/trailing whitespace
}
/**
* Format bytes as human-readable text.
*
* @param bytes Number of bytes.
* @param si True to use metric (SI) units, aka powers of 1000. False to use
* binary (IEC), aka powers of 1024.
* @param dp Number of decimal places to display.
*
* @return Formatted string.
*/
export function formatFileSize(bytes: number, si = false, dp = 1) {
const thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) {
return bytes + ' B';
}
const units = si
? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
let u = -1;
const r = 10 ** dp;
do {
bytes /= thresh;
++u;
} while (
Math.round(Math.abs(bytes) * r) / r >= thresh &&
u < units.length - 1
);
return bytes.toFixed(dp) + ' ' + units[u];
}
import { newFolderPlaceholderMap } from '@/lib/newFolerPlaceholders';
import { UploadFileEntry } from '@/types';
export function getRandomFolderPlaceholder() {
const all = [
...newFolderPlaceholderMap.ideas,
...newFolderPlaceholderMap.dev,
...newFolderPlaceholderMap.funny,
];
return all[Math.floor(Math.random() * all.length)];
}