|
| 1 | +interface CodeLanguage { |
| 2 | + aliases?: string[] |
| 3 | + extensions?: string[] |
| 4 | +} |
| 5 | + |
| 6 | +// Use Shiki names (including its aliases) as the common language identifiers. |
| 7 | +const codeLanguages: Record<string, CodeLanguage> = { |
| 8 | + bash: { |
| 9 | + aliases: ['sh', 'shell', 'shellscript', 'zsh'], |
| 10 | + extensions: ['.sh', '.bash', '.zsh'], |
| 11 | + }, |
| 12 | + bat: { aliases: ['batch', 'cmd', 'dos'], extensions: ['.bat', '.cmd'] }, |
| 13 | + c: { extensions: ['.c', '.h'] }, |
| 14 | + cmake: { extensions: ['.cmake'] }, |
| 15 | + cpp: { |
| 16 | + aliases: ['c++', 'cc', 'cxx', 'h++', 'hpp', 'hxx'], |
| 17 | + extensions: ['.cc', '.cpp', '.cxx', '.hh', '.hpp', '.hxx'], |
| 18 | + }, |
| 19 | + csharp: { aliases: ['c#', 'cs'], extensions: ['.cs', '.csx'] }, |
| 20 | + css: { extensions: ['.css'] }, |
| 21 | + dart: { extensions: ['.dart'] }, |
| 22 | + diff: { aliases: ['patch'], extensions: ['.diff', '.patch'] }, |
| 23 | + dockerfile: { aliases: ['docker'], extensions: ['.dockerfile'] }, |
| 24 | + elixir: { aliases: ['ex', 'exs'], extensions: ['.ex', '.exs'] }, |
| 25 | + erlang: { aliases: ['erl'], extensions: ['.erl', '.hrl'] }, |
| 26 | + fsharp: { aliases: ['f#', 'fs'], extensions: ['.fs', '.fsi', '.fsx'] }, |
| 27 | + go: { aliases: ['golang'], extensions: ['.go'] }, |
| 28 | + graphql: { aliases: ['gql'], extensions: ['.graphql', '.gql'] }, |
| 29 | + groovy: { extensions: ['.groovy', '.gradle'] }, |
| 30 | + html: { aliases: ['htm'], extensions: ['.html', '.htm'] }, |
| 31 | + http: { aliases: ['https'], extensions: ['.http', '.rest'] }, |
| 32 | + ini: { aliases: ['properties'], extensions: ['.ini', '.cfg', '.properties'] }, |
| 33 | + java: { extensions: ['.java'] }, |
| 34 | + javascript: { |
| 35 | + aliases: ['js', 'cjs', 'mjs'], |
| 36 | + extensions: ['.js', '.cjs', '.mjs'], |
| 37 | + }, |
| 38 | + json: { extensions: ['.json'] }, |
| 39 | + jsonc: { extensions: ['.jsonc'] }, |
| 40 | + jsx: { extensions: ['.jsx'] }, |
| 41 | + kotlin: { aliases: ['kt', 'kts'], extensions: ['.kt', '.kts'] }, |
| 42 | + less: { extensions: ['.less'] }, |
| 43 | + lua: { extensions: ['.lua'] }, |
| 44 | + makefile: { aliases: ['make', 'mk'], extensions: ['.mk', '.mak'] }, |
| 45 | + markdown: { |
| 46 | + aliases: ['md', 'mkd', 'mdown'], |
| 47 | + extensions: ['.md', '.markdown', '.mkd', '.mdown'], |
| 48 | + }, |
| 49 | + mdx: { aliases: ['rmdx'], extensions: ['.mdx', '.rmdx'] }, |
| 50 | + 'objective-c': { aliases: ['objc', 'objectivec'], extensions: ['.m'] }, |
| 51 | + perl: { aliases: ['pl', 'pm'], extensions: ['.pl', '.pm'] }, |
| 52 | + php: { extensions: ['.php', '.phtml'] }, |
| 53 | + powershell: { |
| 54 | + aliases: ['ps', 'ps1', 'pwsh'], |
| 55 | + extensions: ['.ps1', '.psm1', '.psd1'], |
| 56 | + }, |
| 57 | + python: { |
| 58 | + aliases: ['py', 'py3', 'python3'], |
| 59 | + extensions: ['.py', '.pyw', '.pyi'], |
| 60 | + }, |
| 61 | + r: { extensions: ['.r'] }, |
| 62 | + ruby: { |
| 63 | + aliases: ['rb', 'gemspec'], |
| 64 | + extensions: ['.rb', '.rake', '.gemspec'], |
| 65 | + }, |
| 66 | + rust: { aliases: ['rs'], extensions: ['.rs'] }, |
| 67 | + scala: { extensions: ['.scala', '.sc'] }, |
| 68 | + scss: { extensions: ['.scss'] }, |
| 69 | + sql: { extensions: ['.sql'] }, |
| 70 | + swift: { extensions: ['.swift'] }, |
| 71 | + text: { aliases: ['txt', 'plaintext'], extensions: ['.txt', '.text'] }, |
| 72 | + toml: { extensions: ['.toml'] }, |
| 73 | + 'ts-tags': { aliases: ['lit'] }, |
| 74 | + tsx: { extensions: ['.tsx'] }, |
| 75 | + typescript: { |
| 76 | + aliases: ['ts', 'cts', 'mts'], |
| 77 | + extensions: ['.ts', '.cts', '.mts'], |
| 78 | + }, |
| 79 | + xml: { |
| 80 | + aliases: ['svg', 'xhtml'], |
| 81 | + extensions: ['.xml', '.svg', '.xhtml', '.xsd', '.xsl', '.xslt'], |
| 82 | + }, |
| 83 | + yaml: { aliases: ['yml'], extensions: ['.yaml', '.yml'] }, |
| 84 | +} |
| 85 | + |
| 86 | +export const DEFAULT_CODE_LANGUAGES = Object.keys(codeLanguages) |
| 87 | + |
| 88 | +const languageAliases = new Map( |
| 89 | + Object.entries(codeLanguages).flatMap(([language, { aliases = [] }]) => |
| 90 | + aliases.map((alias) => [alias, language] as const), |
| 91 | + ), |
| 92 | +) |
| 93 | + |
| 94 | +export const LANGUAGE_BY_EXTENSION: Record<string, string> = Object.fromEntries( |
| 95 | + Object.entries(codeLanguages).flatMap(([language, { extensions = [] }]) => |
| 96 | + extensions.map((extension) => [extension, language]), |
| 97 | + ), |
| 98 | +) |
| 99 | + |
| 100 | +export function normalizeCodeLanguage(value: string): string { |
| 101 | + const normalized = value.trim().toLowerCase() |
| 102 | + return languageAliases.get(normalized) ?? normalized |
| 103 | +} |
0 commit comments