diff --git a/src/cm/supportedModes.ts b/src/cm/supportedModes.ts index 31a34ff1d..959386be9 100644 --- a/src/cm/supportedModes.ts +++ b/src/cm/supportedModes.ts @@ -72,6 +72,14 @@ function createLanguageLoader(name: string, lang: LanguageDescription) { return javascript({ jsx: true }); }; + case "markdown": + return async () => { + const { markdown, markdownLanguage } = await import( + "@codemirror/lang-markdown" + ); + return markdown({ base: markdownLanguage }); + }; + case "html": return async () => { const { html } = await import("@codemirror/lang-html"); diff --git a/tests/unit/modelist.test.js b/tests/unit/modelist.test.js index beab91278..30fece635 100644 --- a/tests/unit/modelist.test.js +++ b/tests/unit/modelist.test.js @@ -147,6 +147,30 @@ function registerTestMode(name, extensions, options) { } describe("getModeForPath", () => { + it("loads Markdown with extended GFM syntax", async () => { + const markdownMode = getModeForPath("README.md"); + const loadMarkdown = markdownMode.getExtension(); + expect(loadMarkdown).toEqual(expect.any(Function)); + + const support = await loadMarkdown(); + const tree = support.language.parser.parse( + [ + "~~Strikethrough~~", + "", + "- [x] Completed task", + "", + "| Column 1 | Column 2 |", + "|----------|----------|", + "| A | B |", + ].join("\n"), + ); + const syntax = tree.toString(); + + expect(syntax).toContain("Strikethrough"); + expect(syntax).toContain("TaskMarker"); + expect(syntax).toContain("Table"); + }); + it("matches the previous sort-and-scan result for built-in modes", () => { const paths = collectParityPaths(); expect(paths.length).toBeGreaterThan(100);