-
Notifications
You must be signed in to change notification settings - Fork 258
Expand file tree
/
Copy pathlanguageDetection.ts
More file actions
63 lines (54 loc) · 2.24 KB
/
languageDetection.ts
File metadata and controls
63 lines (54 loc) · 2.24 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import * as linguistLanguages from 'linguist-languages';
import path from 'path';
// Override map for extensions that are ambiguous in linguist-languages.
// These are extensions where linguist maps to multiple languages, but one
// is overwhelmingly more common in practice.
const ambiguousExtensionOverrides: Record<string, string> = {
'.cs': 'C#', // Not Smalltalk
'.fs': 'F#', // Not Forth, GLSL, or Filterscript
'.html': 'HTML', // Not Ecmarkup
'.json': 'JSON', // Not OASv2-json, OASv3-json
'.md': 'Markdown', // Not GCC Machine Description
'.rs': 'Rust', // Not RenderScript (deprecated)
'.tsx': 'TSX', // Not XML
'.ts': 'TypeScript', // Not XML
'.txt': 'Text', // Not Adblock Filter List, Vim Help File
'.yaml': 'YAML', // Not MiniYAML, OASv2-yaml, OASv3-yaml
'.yml': 'YAML',
'.bas': 'BASIC'
};
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();
// Check override map first for ambiguous extensions
if (ext && ext in ambiguousExtensionOverrides) {
return ambiguousExtensionOverrides[ext];
}
if (ext && extensionToLanguage.has(ext)) {
return extensionToLanguage.get(ext)!;
}
return '';
};