Skip to content

Commit 1ba4e82

Browse files
feat: Add support for codemirror mode languages (#125)
* feat: Add support for codemirror mode languages Codemirror 5 had a number of languages supported via modes instead of explicit language support * Add additional languages, remove comment
1 parent 4353d20 commit 1ba4e82

File tree

3 files changed

+384
-29
lines changed

3 files changed

+384
-29
lines changed

packages/web/package.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,18 @@
1818
"@codemirror/lang-java": "^6.0.1",
1919
"@codemirror/lang-javascript": "^6.2.2",
2020
"@codemirror/lang-json": "^6.0.1",
21+
"@codemirror/lang-less": "^6.0.2",
22+
"@codemirror/lang-liquid": "^6.2.2",
2123
"@codemirror/lang-markdown": "^6.2.5",
2224
"@codemirror/lang-php": "^6.0.1",
2325
"@codemirror/lang-python": "^6.1.6",
2426
"@codemirror/lang-rust": "^6.0.1",
27+
"@codemirror/lang-sass": "^6.0.2",
2528
"@codemirror/lang-sql": "^6.7.1",
29+
"@codemirror/lang-vue": "^0.1.3",
30+
"@codemirror/lang-xml": "^6.1.0",
31+
"@codemirror/lang-yaml": "^6.1.2",
32+
"@codemirror/legacy-modes": "^6.4.2",
2633
"@codemirror/search": "^6.5.6",
2734
"@codemirror/state": "^6.4.1",
2835
"@codemirror/view": "^6.33.0",

packages/web/src/hooks/useSyntaxHighlightingExtension.ts

Lines changed: 238 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,94 @@
22

33
import { EditorView } from "@codemirror/view";
44
import { useExtensionWithDependency } from "./useExtensionWithDependency";
5-
import { javascript } from "@codemirror/lang-javascript";
6-
import { python } from "@codemirror/lang-python";
7-
import { markdown } from "@codemirror/lang-markdown";
5+
import { StreamLanguage } from "@codemirror/language";
6+
7+
// CodeMirror 6 languages
8+
9+
import { css } from "@codemirror/lang-css";
810
import { cpp } from "@codemirror/lang-cpp";
911
import { csharp } from "@replit/codemirror-lang-csharp";
10-
import { json } from "@codemirror/lang-json";
12+
import { go } from "@codemirror/lang-go";
13+
import { html } from "@codemirror/lang-html";
1114
import { java } from "@codemirror/lang-java";
15+
import { javascript } from "@codemirror/lang-javascript";
16+
import { json } from "@codemirror/lang-json";
17+
import { less } from "@codemirror/lang-less";
18+
import { liquid } from "@codemirror/lang-liquid";
19+
import { markdown } from "@codemirror/lang-markdown";
20+
import { php } from "@codemirror/lang-php";
21+
import { python } from "@codemirror/lang-python";
1222
import { rust } from "@codemirror/lang-rust";
13-
import { go } from "@codemirror/lang-go";
23+
import { sass } from "@codemirror/lang-sass";
1424
import { sql } from "@codemirror/lang-sql";
15-
import { php } from "@codemirror/lang-php";
16-
import { html } from "@codemirror/lang-html";
17-
import { css } from "@codemirror/lang-css";
25+
import { vue } from "@codemirror/lang-vue";
26+
import { xml } from "@codemirror/lang-xml"
27+
import { yaml } from "@codemirror/lang-yaml";
1828

29+
// Legacy CodeMirror 5 modes
30+
// https://codemirror.net/5/mode/
31+
import { apl } from "@codemirror/legacy-modes/mode/apl";
32+
// import { asn1 } from "@codemirror/legacy-modes/mode/asn1"; // this seems to be broken
33+
import { ceylon } from "@codemirror/legacy-modes/mode/clike";
34+
import { clojure } from "@codemirror/legacy-modes/mode/clojure";
35+
import { cmake } from "@codemirror/legacy-modes/mode/cmake";
36+
import { cobol } from "@codemirror/legacy-modes/mode/cobol";
37+
import { coffeeScript } from "@codemirror/legacy-modes/mode/coffeescript";
38+
import { commonLisp } from "@codemirror/legacy-modes/mode/commonlisp";
39+
import { crystal } from "@codemirror/legacy-modes/mode/crystal";
40+
import { cypher } from "@codemirror/legacy-modes/mode/cypher";
41+
import { d } from "@codemirror/legacy-modes/mode/d";
42+
import { dart } from "@codemirror/legacy-modes/mode/clike";
43+
// import { django } from "@codemirror/legacy-modes/mode/django"; // not present anymore
44+
import { dockerFile } from "@codemirror/legacy-modes/mode/dockerfile";
45+
import { diff } from "@codemirror/legacy-modes/mode/diff";
46+
import { elm } from "@codemirror/legacy-modes/mode/elm";
47+
import { erlang } from "@codemirror/legacy-modes/mode/erlang";
48+
import { fortran } from "@codemirror/legacy-modes/mode/fortran";
49+
import { gherkin } from "@codemirror/legacy-modes/mode/gherkin";
50+
import { groovy } from "@codemirror/legacy-modes/mode/groovy";
51+
import { haskell } from "@codemirror/legacy-modes/mode/haskell";
52+
import { idl } from "@codemirror/legacy-modes/mode/idl";
53+
import { jinja2 } from "@codemirror/legacy-modes/mode/jinja2";
54+
import { julia } from "@codemirror/legacy-modes/mode/julia";
55+
import { kotlin } from "@codemirror/legacy-modes/mode/clike";
56+
import { liveScript } from "@codemirror/legacy-modes/mode/livescript";
57+
import { lua } from "@codemirror/legacy-modes/mode/lua";
58+
import { nesC } from "@codemirror/legacy-modes/mode/clike";
59+
import { nginx } from "@codemirror/legacy-modes/mode/nginx";
60+
import { objectiveC } from "@codemirror/legacy-modes/mode/clike";
61+
import { objectiveCpp } from "@codemirror/legacy-modes/mode/clike";
62+
import { octave } from "@codemirror/legacy-modes/mode/octave";
63+
import { pascal } from "@codemirror/legacy-modes/mode/pascal";
64+
import { perl } from "@codemirror/legacy-modes/mode/perl";
65+
import { powerShell } from "@codemirror/legacy-modes/mode/powershell";
66+
import { protobuf } from "@codemirror/legacy-modes/mode/protobuf";
67+
import { pug } from "@codemirror/legacy-modes/mode/pug";
68+
import { puppet } from "@codemirror/legacy-modes/mode/puppet";
69+
import { r } from "@codemirror/legacy-modes/mode/r";
70+
import { rpmSpec } from "@codemirror/legacy-modes/mode/rpm";
71+
import { ruby } from "@codemirror/legacy-modes/mode/ruby";
72+
import { scala } from "@codemirror/legacy-modes/mode/clike";
73+
import { scheme } from "@codemirror/legacy-modes/mode/scheme";
74+
import { shader } from "@codemirror/legacy-modes/mode/clike";
75+
import { shell } from "@codemirror/legacy-modes/mode/shell";
76+
import { squirrel } from "@codemirror/legacy-modes/mode/clike";
77+
import { swift } from "@codemirror/legacy-modes/mode/swift";
78+
import { tcl } from "@codemirror/legacy-modes/mode/tcl";
79+
import { textile } from "@codemirror/legacy-modes/mode/textile";
80+
import { stex } from "@codemirror/legacy-modes/mode/stex";
81+
import { toml } from "@codemirror/legacy-modes/mode/toml";
82+
import { turtle } from "@codemirror/legacy-modes/mode/turtle";
83+
// import { twig } from "@codemirror/legacy-modes/mode/twig"; // not present anymore
84+
import { vb } from "@codemirror/legacy-modes/mode/vb";
85+
import { vbScript } from "@codemirror/legacy-modes/mode/vbscript";
86+
import { velocity } from "@codemirror/legacy-modes/mode/velocity";
87+
// import { vue } from "@codemirror/legacy-modes/mode/vue"; // not present anymore
88+
import { verilog } from "@codemirror/legacy-modes/mode/verilog";
89+
import { vhdl } from "@codemirror/legacy-modes/mode/vhdl";
90+
import { wast } from "@codemirror/legacy-modes/mode/wast"; // webassembly
91+
import { yacas } from "@codemirror/legacy-modes/mode/yacas";
92+
import { xQuery } from "@codemirror/legacy-modes/mode/xquery";
1993

2094
export const useSyntaxHighlightingExtension = (language: string, view: EditorView | undefined) => {
2195
const extension = useExtensionWithDependency(
@@ -30,28 +104,23 @@ export const useSyntaxHighlightingExtension = (language: string, view: EditorVie
30104
}
31105

32106
export const getSyntaxHighlightingExtension = (language: string) => {
107+
// maps linguist language defs to CodeMirror 6 language extensions
108+
// and legacy CodeMirror 5 modes
33109
switch (language.toLowerCase()) {
110+
// CodeMirror 6 languages
111+
case "css":
112+
return css();
34113
case "c":
35114
case "c++":
36115
return cpp();
37116
case "c#":
38117
return csharp();
39-
case "json":
40-
return json();
41-
case "java":
42-
return java();
43-
case "rust":
44-
return rust();
45118
case "go":
46119
return go();
47-
case "sql":
48-
return sql();
49-
case "php":
50-
return php();
51120
case "html":
52121
return html();
53-
case "css":
54-
return css();
122+
case "java":
123+
return java();
55124
case "jsx":
56125
case "tsx":
57126
case "typescript":
@@ -60,11 +129,157 @@ export const getSyntaxHighlightingExtension = (language: string) => {
60129
jsx: true,
61130
typescript: true,
62131
});
63-
case "python":
64-
return python();
132+
case "json":
133+
case "oasv2-json":
134+
case "oasv3-json":
135+
case "jupyter notebook":
136+
return json();
137+
case "less":
138+
return less();
139+
case "liquid":
140+
return liquid();
65141
case "markdown":
66142
return markdown();
143+
case "php":
144+
return php();
145+
case "python":
146+
return python();
147+
case "rust":
148+
return rust();
149+
case "sass":
150+
return sass();
151+
case "sql":
152+
return sql();
153+
case "vue":
154+
return vue();
155+
case "xml":
156+
return xml();
157+
case "yaml":
158+
case "oasv2-yaml":
159+
case "oasv3-yaml":
160+
return yaml();
161+
162+
// Legacy CodeMirror 5 modes
163+
case "apl":
164+
return StreamLanguage.define(apl);
165+
// case "asn.1":
166+
// return StreamLanguage.define(asn1);
167+
case "ceylon":
168+
return StreamLanguage.define(ceylon);
169+
case "clojure":
170+
return StreamLanguage.define(clojure);
171+
case "cmake":
172+
return StreamLanguage.define(cmake);
173+
case "cobol":
174+
return StreamLanguage.define(cobol);
175+
case "coffeescript":
176+
return StreamLanguage.define(coffeeScript);
177+
case "common lisp":
178+
return StreamLanguage.define(commonLisp);
179+
case "crystal":
180+
return StreamLanguage.define(crystal);
181+
case "cypher":
182+
return StreamLanguage.define(cypher);
183+
case "d":
184+
return StreamLanguage.define(d);
185+
case "dart":
186+
return StreamLanguage.define(dart);
187+
case "dockerfile":
188+
return StreamLanguage.define(dockerFile);
189+
case "diff":
190+
return StreamLanguage.define(diff);
191+
case "elm":
192+
return StreamLanguage.define(elm);
193+
case "erlang":
194+
return StreamLanguage.define(erlang);
195+
case "fortran":
196+
return StreamLanguage.define(fortran);
197+
case "gherkin":
198+
return StreamLanguage.define(gherkin);
199+
case "groovy":
200+
return StreamLanguage.define(groovy);
201+
case "haskell":
202+
return StreamLanguage.define(haskell);
203+
case "idl":
204+
return StreamLanguage.define(idl);
205+
case "jinja":
206+
return StreamLanguage.define(jinja2);
207+
case "julia":
208+
return StreamLanguage.define(julia);
209+
case "kotlin":
210+
return StreamLanguage.define(kotlin);
211+
case "livescript":
212+
return StreamLanguage.define(liveScript);
213+
case "lua":
214+
return StreamLanguage.define(lua);
215+
case "nesc":
216+
return StreamLanguage.define(nesC);
217+
case "nginx":
218+
return StreamLanguage.define(nginx);
219+
case "objective-c":
220+
return StreamLanguage.define(objectiveC);
221+
case "objective-c++":
222+
return StreamLanguage.define(objectiveCpp);
223+
case "octave":
224+
return StreamLanguage.define(octave);
225+
case "pascal":
226+
return StreamLanguage.define(pascal);
227+
case "perl":
228+
return StreamLanguage.define(perl);
229+
case "powershell":
230+
return StreamLanguage.define(powerShell);
231+
case "protocol buffer":
232+
return StreamLanguage.define(protobuf);
233+
case "pug":
234+
return StreamLanguage.define(pug);
235+
case "puppet":
236+
return StreamLanguage.define(puppet);
237+
case "r":
238+
return StreamLanguage.define(r);
239+
case "rpm spec":
240+
return StreamLanguage.define(rpmSpec);
241+
case "ruby":
242+
return StreamLanguage.define(ruby);
243+
case "scala":
244+
return StreamLanguage.define(scala);
245+
case "scheme":
246+
return StreamLanguage.define(scheme);
247+
case "shader":
248+
return StreamLanguage.define(shader);
249+
case "shell":
250+
return StreamLanguage.define(shell);
251+
case "squirrel":
252+
return StreamLanguage.define(squirrel);
253+
case "swift":
254+
return StreamLanguage.define(swift);
255+
case "tcl":
256+
return StreamLanguage.define(tcl);
257+
case "textile":
258+
return StreamLanguage.define(textile);
259+
case "stex":
260+
return StreamLanguage.define(stex);
261+
case "toml":
262+
return StreamLanguage.define(toml);
263+
case "turtle":
264+
return StreamLanguage.define(turtle);
265+
case "vb":
266+
return StreamLanguage.define(vb);
267+
case "vbscript":
268+
return StreamLanguage.define(vbScript);
269+
case "velocity":
270+
return StreamLanguage.define(velocity);
271+
case "verilog":
272+
return StreamLanguage.define(verilog);
273+
case "vhdl":
274+
return StreamLanguage.define(vhdl);
275+
case "wast":
276+
return StreamLanguage.define(wast);
277+
case "yacas":
278+
return StreamLanguage.define(yacas);
279+
case "xquery":
280+
return StreamLanguage.define(xQuery);
281+
// plain text
67282
default:
68283
return [];
69284
}
70-
}
285+
}

0 commit comments

Comments
 (0)