-
Notifications
You must be signed in to change notification settings - Fork 263
Expand file tree
/
Copy pathlanguageDetection.ts
More file actions
39 lines (33 loc) · 1.29 KB
/
languageDetection.ts
File metadata and controls
39 lines (33 loc) · 1.29 KB
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
import * as linguistLanguages from 'linguist-languages';
import path from 'path';
const extensionToLanguage = new Map<string, string>();
for (const [languageName, languageData] of Object.entries(linguistLanguages)) {
if ('extensions' in languageData && languageData.extensions) {
for (const ext of languageData.extensions) {
const normalizedExt = ext.toLowerCase();
if (!extensionToLanguage.has(normalizedExt)) {
extensionToLanguage.set(normalizedExt, languageName);
}
}
}
if ('filenames' in languageData && languageData.filenames) {
for (const filename of languageData.filenames) {
if (!extensionToLanguage.has(filename)) {
extensionToLanguage.set(filename, languageName);
}
}
}
}
export const detectLanguageFromFilename = (filename: string): string => {
const basename = path.basename(filename);
// Check for exact filename match (e.g., Makefile, Dockerfile)
if (extensionToLanguage.has(basename)) {
return extensionToLanguage.get(basename)!;
}
// Check for extension match
const ext = path.extname(filename).toLowerCase();
if (ext && extensionToLanguage.has(ext)) {
return extensionToLanguage.get(ext)!;
}
return '';
};