export function determineFileType(inputString: string): 'file' | 'folder' { if (inputString.includes('.') && !inputString.endsWith('.')) { return 'file' } else { return 'folder' } } export function formatSize(size: number) { if (size === 0) return 'empty' for (const unit of [null, 'kB', 'MB', 'GB', 'TB', 'PB', 'EB']) { if (size < 1e4) return ( size.toLocaleString().replace(',', '\u202F') + (unit ? `\u202F${unit}` : '') ) size = Math.round(size / 1000) } return 'huge' } export function formatUnixDate(t: number) { const date = new Date(t * 1000) const now = new Date() const diff = date.getTime() - now.getTime() const formatter = new Intl.RelativeTimeFormat('en', { numeric: 'auto' }) if (Math.abs(diff) <= 5000) { return 'now' } if (Math.abs(diff) <= 60000) { return formatter.format(Math.round(diff / 1000), 'second') } if (Math.abs(diff) <= 3600000) { return formatter.format(Math.round(diff / 60000), 'minute') } if (Math.abs(diff) <= 86400000) { return formatter.format(Math.round(diff / 3600000), 'hour') } if (Math.abs(diff) <= 604800000) { return formatter.format(Math.round(diff / 86400000), 'day') } const d = date.toLocaleDateString("us", { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' }).replace("Sept", "Sep") return (d.length === 16 ? d : d.replace(', ', ',\u202F\u2007')).replaceAll(' ', '\u202F') } export function getFileExtension(filename: string) { const parts = filename.split('.') if (parts.length > 1) { return parts[parts.length - 1] } else { return '' // No hay extensión } } export function getFileType(extension: string): string { const videoExtensions = ['mp4', 'avi', 'mkv', 'mov'] const imageExtensions = ['jpg', 'jpeg', 'png', 'gif'] const pdfExtensions = ['pdf'] if (videoExtensions.includes(extension)) { return 'video' } else if (imageExtensions.includes(extension)) { return 'image' } else if (pdfExtensions.includes(extension)) { return 'pdf' } else { return 'unknown' } } const collator = new Intl.Collator('en', { sensitivity: 'base', numeric: true, usage: 'search' }) export function haystackFormat(str: string) { const based = str.normalize('NFKD').replace(/[\u0300-\u036f]/g, '').toLowerCase() return '^' + based + '$' } export function localeIncludes(haystack: string, based: string, words: string[]) { return haystack.includes(based) || words && words.every(word => haystack.includes(word)) } export function buildCorpus(data: any[]) { return data.map(item => [haystackFormat(item.name), item]) } export function search(corpus: [string, any][], search: string) { const based = search.normalize('NFKD').replace(/[\u0300-\u036f]/g, '').toLowerCase() const words = based.split(/\W+/) const ret = [] for (const [haystack, item] of corpus) { if (localeIncludes(haystack, based, words)) ret.push(item) } return ret }