import type { Extension } from "@codemirror/state"; import { StreamLanguage } from "@codemirror/language"; const possible_langs = [ "python", "markdown", "json", "html", "css", "javascript", "typescript", "yaml", "dockerfile", "shell", "r" ]; const lang_map: Record Promise) | undefined> = { python: () => import("@codemirror/lang-python").then((m) => m.python()), markdown: async () => { const [md, frontmatter] = await Promise.all([ import("@codemirror/lang-markdown"), import("./frontmatter") ]); return md.markdown({ extensions: [frontmatter.frontmatter] }); }, json: () => import("@codemirror/lang-json").then((m) => m.json()), html: () => import("@codemirror/lang-html").then((m) => m.html()), css: () => import("@codemirror/lang-css").then((m) => m.css()), javascript: () => import("@codemirror/lang-javascript").then((m) => m.javascript()), typescript: () => import("@codemirror/lang-javascript").then((m) => m.javascript({ typescript: true }) ), yaml: () => import("@codemirror/legacy-modes/mode/yaml").then((m) => StreamLanguage.define(m.yaml) ), dockerfile: () => import("@codemirror/legacy-modes/mode/dockerfile").then((m) => StreamLanguage.define(m.dockerFile) ), shell: () => import("@codemirror/legacy-modes/mode/shell").then((m) => StreamLanguage.define(m.shell) ), r: () => import("@codemirror/legacy-modes/mode/r").then((m) => StreamLanguage.define(m.r) ) } as const; const alias_map: Record = { py: "python", md: "markdown", js: "javascript", ts: "typescript", sh: "shell" }; export async function getLanguageExtension( lang: string ): Promise { const _lang = lang_map[lang] || lang_map[alias_map[lang]] || undefined; if (_lang) { return _lang(); } return undefined; }