Spaces:
Paused
Paused
import type { IconPrefix, IconName } from '@fortawesome/fontawesome-svg-core' | |
const icons: { [key: string]: [IconPrefix, IconName] } = { | |
image: ['far', 'file-image'], | |
pdf: ['far', 'file-pdf'], | |
word: ['far', 'file-word'], | |
powerpoint: ['far', 'file-powerpoint'], | |
excel: ['far', 'file-excel'], | |
audio: ['far', 'file-audio'], | |
video: ['far', 'file-video'], | |
archive: ['far', 'file-archive'], | |
code: ['far', 'file-code'], | |
text: ['far', 'file-alt'], | |
file: ['far', 'file'], | |
markdown: ['fab', 'markdown'], | |
book: ['fas', 'book'], | |
link: ['fas', 'link'], | |
} | |
const extensions = { | |
gif: icons.image, | |
jpeg: icons.image, | |
jpg: icons.image, | |
png: icons.image, | |
heic: icons.image, | |
webp: icons.image, | |
pdf: icons.pdf, | |
doc: icons.word, | |
docx: icons.word, | |
ppt: icons.powerpoint, | |
pptx: icons.powerpoint, | |
xls: icons.excel, | |
xlsx: icons.excel, | |
aac: icons.audio, | |
mp3: icons.audio, | |
ogg: icons.audio, | |
flac: icons.audio, | |
oga: icons.audio, | |
opus: icons.audio, | |
m4a: icons.audio, | |
avi: icons.video, | |
flv: icons.video, | |
mkv: icons.video, | |
mp4: icons.video, | |
'7z': icons.archive, | |
bz2: icons.archive, | |
xz: icons.archive, | |
wim: icons.archive, | |
gz: icons.archive, | |
rar: icons.archive, | |
tar: icons.archive, | |
zip: icons.archive, | |
c: icons.code, | |
cpp: icons.code, | |
js: icons.code, | |
jsx: icons.code, | |
java: icons.code, | |
sh: icons.code, | |
cs: icons.code, | |
py: icons.code, | |
css: icons.code, | |
html: icons.code, | |
ts: icons.code, | |
tsx: icons.code, | |
rs: icons.code, | |
vue: icons.code, | |
json: icons.code, | |
yml: icons.code, | |
yaml: icons.code, | |
toml: icons.code, | |
txt: icons.text, | |
rtf: icons.text, | |
vtt: icons.text, | |
srt: icons.text, | |
log: icons.text, | |
diff: icons.text, | |
md: icons.markdown, | |
epub: icons.book, | |
mobi: icons.book, | |
azw3: icons.book, | |
url: icons.link, | |
} | |
/** | |
* To stop TypeScript complaining about indexing the object with a non-existent key | |
* https://dev.to/mapleleaf/indexing-objects-in-typescript-1cgi | |
* | |
* Fixed by ChatGPT with the upgrade of TypeScript 4.9 | |
* | |
* @param obj Object with keys to index | |
* @param key The index key | |
* @returns Whether or not the key exists inside the object | |
*/ | |
export function hasKey(obj: Record<string, any>, key: string): boolean { | |
return key in obj | |
} | |
export function getRawExtension(fileName: string): string { | |
return fileName.slice(((fileName.lastIndexOf('.') - 1) >>> 0) + 2) | |
} | |
export function getExtension(fileName: string): string { | |
return getRawExtension(fileName).toLowerCase() | |
} | |
export function getFileIcon(fileName: string, flags?: { video?: boolean }): [IconPrefix, IconName] { | |
const extension = getExtension(fileName) | |
let icon = hasKey(extensions, extension) ? extensions[extension] : icons.file | |
// Files with '.ts' extensions may be TypeScript files or TS Video files, we check for the flag 'video' | |
// to determine which icon to render for '.ts' files. | |
if (extension === 'ts') { | |
if (flags?.video) { | |
icon = icons.video | |
} | |
} | |
return icon | |
} | |