| |
| |
| |
| |
| const EXT_OVERRIDE: Record<string, string> = { |
| py: 'python', |
| js: 'javascript', |
| ts: 'typescript', |
| jsx: 'jsx', |
| tsx: 'tsx', |
| rb: 'ruby', |
| rs: 'rust', |
| kt: 'kotlin', |
| cs: 'csharp', |
| fs: 'fsharp', |
| sh: 'bash', |
| bash: 'bash', |
| zsh: 'bash', |
| yml: 'yaml', |
| md: 'markdown', |
| mdx: 'mdx', |
| dockerfile: 'dockerfile', |
| tf: 'terraform', |
| hcl: 'hcl', |
| ex: 'elixir', |
| exs: 'elixir', |
| erl: 'erlang', |
| hs: 'haskell', |
| ml: 'ocaml', |
| mli: 'ocaml', |
| pl: 'perl', |
| pm: 'perl', |
| r: 'r', |
| m: 'objective-c', |
| mm: 'objective-cpp', |
| h: 'c', |
| hpp: 'cpp', |
| cc: 'cpp', |
| cxx: 'cpp', |
| proto: 'proto', |
| nim: 'nim', |
| zig: 'zig', |
| v: 'v', |
| svelte: 'svelte', |
| vue: 'vue', |
| astro: 'astro', |
| prisma: 'prisma', |
| graphql: 'graphql', |
| gql: 'graphql', |
| jsonc: 'jsonc', |
| jsonl: 'jsonl' |
| }; |
|
|
| |
| |
| |
| |
| const KNOWN_LANG_IDS = new Set([ |
| 'ada', |
| 'awk', |
| 'bat', |
| 'c', |
| 'cmake', |
| 'clojure', |
| 'cpp', |
| 'crystal', |
| 'css', |
| 'd', |
| 'dart', |
| 'diff', |
| 'elixir', |
| 'elm', |
| 'erlang', |
| 'fish', |
| 'gleam', |
| 'glsl', |
| 'go', |
| 'groovy', |
| 'haml', |
| 'haskell', |
| 'hlsl', |
| 'html', |
| 'ini', |
| 'java', |
| 'javascript', |
| 'json', |
| 'json5', |
| 'jsonc', |
| 'jsx', |
| 'julia', |
| 'kotlin', |
| 'latex', |
| 'less', |
| 'lisp', |
| 'log', |
| 'lua', |
| 'make', |
| 'markdown', |
| 'matlab', |
| 'mdx', |
| 'mojo', |
| 'nim', |
| 'nix', |
| 'nushell', |
| 'ocaml', |
| 'pascal', |
| 'perl', |
| 'php', |
| 'postcss', |
| 'powershell', |
| 'prisma', |
| 'prolog', |
| 'proto', |
| 'pug', |
| 'python', |
| 'r', |
| 'ruby', |
| 'rust', |
| 'sass', |
| 'scala', |
| 'scheme', |
| 'scss', |
| 'solidity', |
| 'sql', |
| 'svelte', |
| 'swift', |
| 'tcl', |
| 'terraform', |
| 'tex', |
| 'toml', |
| 'tsx', |
| 'typescript', |
| 'typst', |
| 'v', |
| 'vb', |
| 'verilog', |
| 'vhdl', |
| 'vue', |
| 'wasm', |
| 'wgsl', |
| 'xml', |
| 'yaml', |
| 'zig' |
| ]); |
|
|
| |
| |
| |
| export function extToLang(ext: string): string | null { |
| const lower = ext.toLowerCase(); |
| |
| if (EXT_OVERRIDE[lower]) return EXT_OVERRIDE[lower]; |
| |
| if (KNOWN_LANG_IDS.has(lower)) return lower; |
| return null; |
| } |
|
|
| |
| |
| |
| export function isCodeFile(path: string | null): boolean { |
| if (!path) return false; |
| const ext = path.split('.').pop()?.toLowerCase() ?? ''; |
| return extToLang(ext) !== null; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export async function highlightCode(code: string, filePath: string): Promise<string> { |
| const ext = filePath.split('.').pop()?.toLowerCase() ?? ''; |
| const lang = extToLang(ext) ?? 'text'; |
|
|
| const { codeToHtml } = await import('shiki'); |
| return await codeToHtml(code, { |
| lang, |
| themes: { |
| light: 'github-light', |
| dark: 'github-dark' |
| }, |
| defaultColor: 'light' |
| }); |
| } |
|
|