1import "@t3tools/client-runtime/assembly-highlighting";
2import {
3 getFiletypeFromFileName,
4 setCustomExtension,
5} from "@pierre/diffs/utils/getFiletypeFromFileName";
6
7import { HIGHLIGHTS_LANGUAGE_IDS } from "./highlights.generated";
8
9// Highlights has no lexer for these dialects, so they use their base language's.
10setCustomExtension("luau", "lua");
11setCustomExtension("xsl", "xml");
12setCustomExtension("xslt", "xml");
13
14/** The native lexer ID for a @pierre/highlights language name, or 0 (plain text). */
15export function highlightLanguageId(language: string): number {
16 return Object.hasOwn(HIGHLIGHTS_LANGUAGE_IDS, language) ? HIGHLIGHTS_LANGUAGE_IDS[language]! : 0;
17}
18
19/** A @pierre/highlights language for a fence language or file path, or `text`. */
20export function resolveHighlightLanguage(input: {
21 readonly language?: string | null;
22 readonly path?: string;
23}): string {
24 const hinted = input.language?.trim().toLowerCase();
25 if (hinted && highlightLanguageId(hinted) !== 0) return hinted;
26 const detected = input.path ? getFiletypeFromFileName(input.path)?.toLowerCase() : undefined;
27 if (detected && highlightLanguageId(detected) !== 0) return detected;
28 return "text";
29}