1/**
  2 * Maps file extensions to highlight.js language identifiers
  3 */
  4export function getLanguageFromFilename(filename: string): string {
  5	const extension = filename.toLowerCase().substring(filename.lastIndexOf('.'));
  6
  7	switch (extension) {
  8		// JavaScript / TypeScript
  9		case '.js':
 10		case '.mjs':
 11		case '.cjs':
 12			return 'javascript';
 13		case '.ts':
 14		case '.mts':
 15		case '.cts':
 16			return 'typescript';
 17		case '.jsx':
 18			return 'javascript';
 19		case '.tsx':
 20			return 'typescript';
 21
 22		// Web
 23		case '.html':
 24		case '.htm':
 25			return 'html';
 26		case '.css':
 27			return 'css';
 28		case '.scss':
 29			return 'scss';
 30		case '.less':
 31			return 'less';
 32		case '.vue':
 33			return 'html';
 34		case '.svelte':
 35			return 'html';
 36
 37		// Data formats
 38		case '.json':
 39			return 'json';
 40		case '.xml':
 41			return 'xml';
 42		case '.yaml':
 43		case '.yml':
 44			return 'yaml';
 45		case '.toml':
 46			return 'ini';
 47		case '.csv':
 48			return 'plaintext';
 49
 50		// Programming languages
 51		case '.py':
 52			return 'python';
 53		case '.java':
 54			return 'java';
 55		case '.kt':
 56		case '.kts':
 57			return 'kotlin';
 58		case '.scala':
 59			return 'scala';
 60		case '.cpp':
 61		case '.cc':
 62		case '.cxx':
 63		case '.c++':
 64			return 'cpp';
 65		case '.c':
 66			return 'c';
 67		case '.h':
 68		case '.hpp':
 69			return 'cpp';
 70		case '.cs':
 71			return 'csharp';
 72		case '.go':
 73			return 'go';
 74		case '.rs':
 75			return 'rust';
 76		case '.rb':
 77			return 'ruby';
 78		case '.php':
 79			return 'php';
 80		case '.swift':
 81			return 'swift';
 82		case '.dart':
 83			return 'dart';
 84		case '.r':
 85			return 'r';
 86		case '.lua':
 87			return 'lua';
 88		case '.pl':
 89		case '.pm':
 90			return 'perl';
 91
 92		// Shell
 93		case '.sh':
 94		case '.bash':
 95		case '.zsh':
 96			return 'bash';
 97		case '.bat':
 98		case '.cmd':
 99			return 'dos';
100		case '.ps1':
101			return 'powershell';
102
103		// Database
104		case '.sql':
105			return 'sql';
106
107		// Markup / Documentation
108		case '.md':
109		case '.markdown':
110			return 'markdown';
111		case '.tex':
112		case '.latex':
113			return 'latex';
114		case '.adoc':
115		case '.asciidoc':
116			return 'asciidoc';
117
118		// Config
119		case '.ini':
120		case '.cfg':
121		case '.conf':
122			return 'ini';
123		case '.dockerfile':
124			return 'dockerfile';
125		case '.nginx':
126			return 'nginx';
127
128		// Other
129		case '.graphql':
130		case '.gql':
131			return 'graphql';
132		case '.proto':
133			return 'protobuf';
134		case '.diff':
135		case '.patch':
136			return 'diff';
137		case '.log':
138			return 'plaintext';
139		case '.txt':
140			return 'plaintext';
141
142		default:
143			return 'plaintext';
144	}
145}