Skip to content

Commit 6a22cff

Browse files
authored
Merge pull request #7915 from jimeh/add-additional-syntax-highlight-languages
feat(shared/codeHighlight): add additional syntax highlight languages
2 parents e0c0c5b + f36b4be commit 6a22cff

File tree

3 files changed

+146
-57
lines changed

3 files changed

+146
-57
lines changed

packages/shared/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
"@reduxjs/toolkit": "catalog:redux",
6464
"@codemirror/lang-cpp": "^6.0.2",
6565
"@codemirror/lang-css": "^6.2.1",
66+
"@codemirror/lang-go": "^6.0.1",
6667
"@codemirror/lang-html": "^6.4.9",
6768
"@codemirror/lang-java": "^6.0.1",
6869
"@codemirror/lang-javascript": "^6.2.2",
@@ -74,6 +75,7 @@
7475
"@codemirror/lang-vue": "^0.1.3",
7576
"@codemirror/lang-wast": "^6.0.2",
7677
"@codemirror/lang-xml": "^6.1.0",
78+
"@codemirror/lang-yaml": "^6.1.2",
7779
"@codemirror/language": "^6.10.2",
7880
"@codemirror/legacy-modes": "^6.4.0",
7981
"@lezer/common": "^1.2.1",

packages/shared/src/lib/codeHighlight.ts

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import { cpp } from '@codemirror/lang-cpp';
66
import { css } from '@codemirror/lang-css';
7+
import { go } from '@codemirror/lang-go';
78
import { html } from '@codemirror/lang-html';
89
import { java } from '@codemirror/lang-java';
910
import { javascript } from '@codemirror/lang-javascript';
@@ -16,8 +17,16 @@ import { rust } from '@codemirror/lang-rust';
1617
import { vue } from '@codemirror/lang-vue';
1718
import { wast } from '@codemirror/lang-wast';
1819
import { xml } from '@codemirror/lang-xml';
20+
import { yaml } from '@codemirror/lang-yaml';
1921
import { HighlightStyle, StreamLanguage } from '@codemirror/language';
22+
import { commonLisp } from '@codemirror/legacy-modes/mode/commonlisp';
23+
import { dockerFile } from '@codemirror/legacy-modes/mode/dockerfile';
24+
import { jinja2 } from '@codemirror/legacy-modes/mode/jinja2';
25+
import { lua } from '@codemirror/legacy-modes/mode/lua';
2026
import { ruby } from '@codemirror/legacy-modes/mode/ruby';
27+
import { shell } from '@codemirror/legacy-modes/mode/shell';
28+
import { swift } from '@codemirror/legacy-modes/mode/swift';
29+
import { toml } from '@codemirror/legacy-modes/mode/toml';
2130
import { NodeType, Tree, Parser } from '@lezer/common';
2231
import { tags, highlightTree } from '@lezer/highlight';
2332

@@ -84,7 +93,14 @@ export function highlightNode(node: Element, mimeType: string): void {
8493
}
8594

8695
export function parserFromFilename(filename: string): Parser | null {
87-
const ext = filename.split('.').pop();
96+
const basename = filename.split('/').pop() || '';
97+
const ext = basename.split('.').pop()?.toLowerCase();
98+
99+
// Handle Dockerfiles (with common variations).
100+
if (basename === 'Dockerfile' || basename.startsWith('Dockerfile.') || ext === 'dockerfile') {
101+
return StreamLanguage.define(dockerFile).parser;
102+
}
103+
88104
switch (ext) {
89105
case 'jsx':
90106
case 'js':
@@ -116,8 +132,12 @@ export function parserFromFilename(filename: string): Parser | null {
116132
case 'h++':
117133
return cpp().language.parser;
118134

119-
// case 'text/x-go':
120-
// return new LanguageSupport(await CodeMirror.go());
135+
case 'go':
136+
return go().language.parser;
137+
138+
case 'j2':
139+
case 'jinja2':
140+
return StreamLanguage.define(jinja2).parser;
121141

122142
case 'java':
123143
return java().language.parser;
@@ -128,6 +148,14 @@ export function parserFromFilename(filename: string): Parser | null {
128148
case 'json':
129149
return json().language.parser;
130150

151+
case 'lisp':
152+
case 'cl':
153+
case 'el': // Also catches Emacs Lisp files
154+
return StreamLanguage.define(commonLisp).parser;
155+
156+
case 'lua':
157+
return StreamLanguage.define(lua).parser;
158+
131159
case 'php':
132160
return php().language.parser;
133161

@@ -172,6 +200,14 @@ export function parserFromFilename(filename: string): Parser | null {
172200
// highlighting svelte with js + jsx works much better than the above
173201
return javascript({ typescript: true, jsx: true }).language.parser;
174202

203+
case 'sh':
204+
case 'bash':
205+
case 'zsh':
206+
return StreamLanguage.define(shell).parser;
207+
208+
case 'swift':
209+
return StreamLanguage.define(swift).parser;
210+
175211
case 'vue':
176212
return vue().language.parser;
177213

@@ -181,6 +217,13 @@ export function parserFromFilename(filename: string): Parser | null {
181217
case 'rb':
182218
return StreamLanguage.define(ruby).parser;
183219

220+
case 'toml':
221+
return StreamLanguage.define(toml).parser;
222+
223+
case 'yml':
224+
case 'yaml':
225+
return yaml().language.parser;
226+
184227
default:
185228
return null;
186229
}

0 commit comments

Comments
 (0)