-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmime.js
115 lines (111 loc) · 3.13 KB
/
mime.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { config } from '../config.js'
import { EXT_FOR_UNKNOWN_MIME } from '../ApiConstants.js'
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
// m = {};
// for (const row of tbody.children)
// m[row.children[0].querySelector('code').innerText] = row.children[2].querySelector('code').innerText
const mimes = {
'3g2': 'video/3gpp2',
'3gp': 'video/3gpp',
'7z': 'application/x-7z-compressed',
aac: 'audio/aac',
abw: 'application/x-abiword',
apng: 'image/apng',
arc: 'application/x-freearc',
avi: 'video/x-msvideo',
avif: 'image/avif',
azw: 'application/vnd.amazon.ebook',
bin: 'application/octet-stream',
bmp: 'image/bmp',
bz2: 'application/x-bzip2',
bz: 'application/x-bzip',
cda: 'application/x-cdf',
cjs: 'text/javascript',
csh: 'application/x-csh',
css: 'text/css',
csv: 'text/csv',
doc: 'application/msword',
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
eot: 'application/vnd.ms-fontobject',
epub: 'application/epub+zip',
gif: 'image/gif',
gz: 'application/gzip',
htm: 'text/html',
html: 'text/html',
ico: 'image/vnd.microsoft.icon',
ics: 'text/calendar',
jar: 'application/java-archive',
jpeg: 'image/jpeg',
jpg: 'image/jpeg',
js: 'text/javascript',
json: 'application/json',
jsonld: 'application/ld+json',
mid: 'audio/midi',
midi: 'audio/midi',
mjs: 'text/javascript',
mp3: 'audio/mpeg',
mp4: 'video/mp4',
mpeg: 'video/mpeg',
mpkg: 'application/vnd.apple.installer+xml',
odp: 'application/vnd.oasis.opendocument.presentation',
ods: 'application/vnd.oasis.opendocument.spreadsheet',
odt: 'application/vnd.oasis.opendocument.text',
oga: 'audio/ogg',
ogv: 'video/ogg',
ogx: 'application/ogg',
opus: 'audio/ogg',
otf: 'font/otf',
pdf: 'application/pdf',
php: 'application/x-httpd-php',
png: 'image/png',
ppt: 'application/vnd.ms-powerpoint',
pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
rar: 'application/vnd.rar',
rtf: 'application/rtf',
sh: 'application/x-sh',
svg: 'image/svg+xml',
tar: 'application/x-tar',
tif: 'image/tiff',
ts: 'video/mp2t',
ttf: 'font/ttf',
txt: 'text/plain',
vsd: 'application/vnd.visio',
wav: 'audio/wav',
weba: 'audio/webm',
webm: 'video/webm',
webp: 'image/webp',
woff2: 'font/woff2',
woff: 'font/woff',
xhtml: 'application/xhtml+xml',
xls: 'application/vnd.ms-excel',
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
xml: 'application/xml',
xul: 'application/vnd.mozilla.xul+xml',
yaml: 'application/yaml',
yml: 'application/yaml',
zip: 'application/zip'
}
export function mimeFor(filename) {
const ext = extname(filename).toLowerCase()
return config.extraMimes[ext] || mimes[ext] || ''
}
function extname(filename) {
const i = filename.lastIndexOf('.')
return i >= 0
? filename.substring(i + 1)
: ''
}
export function extFor(mime) {
return mime
? findExt(mime)
: 'empty'
}
function findExt(targetMime) {
for (const [ext, mime] of Object.entries(config.extraMimes))
if (targetMime === mime)
return ext
for (const [ext, mime] of Object.entries(mimes))
if (targetMime === mime)
return ext
return EXT_FOR_UNKNOWN_MIME
}