feat: add C# syntax highlighting (#1651)

Wire the @replit/codemirror-lang-csharp Lezer grammar into @getpaseo/highlight following the existing per-language pattern (Java/Rust/Swift). Map the cs extension to the parser and alias the csharp and c# markdown fence names so fenced code blocks highlight.

Register csharpLanguage.parser rather than the package's raw parser export: the highlight styleTags are applied only inside csharpLanguage (via parser.configure), so the raw parser would parse but render unstyled.

Closes #1527

Co-authored-by: Clemens Wagner <wagner.clemens@gmx.de>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
dev693-ai
2026-06-26 13:18:15 +00:00
committed by GitHub
co-authored by Clemens Wagner Claude Opus 4.8
parent 85322c5968
commit 6277ba1ff9
6 changed files with 37 additions and 0 deletions
+1
View File
@@ -44,6 +44,7 @@
"@lezer/rust": "^1.0.2",
"@lezer/xml": "^1.0.6",
"@lezer/yaml": "^1.0.4",
"@replit/codemirror-lang-csharp": "^6.2.0",
"lezer-elixir": "^1.1.2"
},
"devDependencies": {
@@ -62,6 +62,19 @@ describe("highlightCode", () => {
expect(stringToken?.style).toBe("string");
});
it("highlights C# code", () => {
const code = 'class Greeter {\n string message = "hello";\n}';
const result = highlightCode(code, "test.cs");
expect(result).toHaveLength(3);
const classToken = result[0].find((t) => t.text === "class");
expect(classToken?.style).toBe("keyword");
const stringToken = result[1].find((t) => t.text.includes("hello"));
expect(stringToken?.style).toBe("string");
});
it("highlights TSX code with correct dialect", () => {
const code = 'const el = <div className="test">hello</div>;';
const result = highlightCode(code, "test.tsx");
@@ -15,6 +15,7 @@ describe("isLanguageSupported", () => {
expect(isLanguageSupported("test.java")).toBe(true);
expect(isLanguageSupported("test.swift")).toBe(true);
expect(isLanguageSupported("test.dart")).toBe(true);
expect(isLanguageSupported("test.cs")).toBe(true);
expect(isLanguageSupported("test.ex")).toBe(true);
});
@@ -53,6 +54,7 @@ describe("getSupportedExtensions", () => {
expect(extensions).toContain("rs");
expect(extensions).toContain("swift");
expect(extensions).toContain("dart");
expect(extensions).toContain("cs");
expect(extensions).toContain("json");
});
});
+3
View File
@@ -14,6 +14,7 @@ import { parser as phpParser } from "@lezer/php";
import { parser as rustParser } from "@lezer/rust";
import { parser as xmlParser } from "@lezer/xml";
import { parser as yamlParser } from "@lezer/yaml";
import { csharpLanguage } from "@replit/codemirror-lang-csharp";
import { parser as elixirParser } from "lezer-elixir";
import type { Parser } from "@lezer/common";
@@ -62,6 +63,8 @@ const parsersByExtension: Record<string, Parser> = {
swift: StreamLanguage.define(swift).parser,
// Dart
dart: StreamLanguage.define(dart).parser,
// C#
cs: csharpLanguage.parser,
// Elixir
ex: elixirParser,
exs: elixirParser,