Skip to content

Commit f1bd49b

Browse files
wooormremcohaszing
andauthored
Add improved syntax highlighting grammar (#317)
This now pulls in a grammar for from: <https://github.com/wooorm/markdown-tm-language>. It fixes a bunch of previous errors and adds real support for MDX. It also supports YAML frontmatter, TOML frontmatter, GFM (autolink literals, footnotes, strikethrough, tables, tasklists), GitHub (gemoji, mentions, references). There’s support for about 20 common embedded grammars in fenced code blocks. Embedded code (in fenced code blocks, or in ESM/expressions) is now marked as being the correct language, which makes comments and such work. Closes GH-183. Closes GH-191. Closes GH-209. Closes GH-221. Co-authored-by: Remco Haszing <[email protected]>
1 parent 7ae33ef commit f1bd49b

File tree

12 files changed

+6936
-131
lines changed

12 files changed

+6936
-131
lines changed

.changeset/small-tomatoes-act.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
'vscode-mdx': minor
3+
---
4+
5+
Add improved syntax highlighting grammar
6+
7+
This now pulls in a grammar for from:
8+
<https://github.com/wooorm/markdown-tm-language>.
9+
10+
It fixes a bunch of previous errors and adds real support for MDX.
11+
It also supports YAML frontmatter, TOML frontmatter, GFM (autolink
12+
literals, footnotes, strikethrough, tables, tasklists), GitHub (gemoji,
13+
mentions, references).
14+
There’s support for about 20 common embedded grammars in fenced code
15+
blocks.
16+
Embedded code (in fenced code blocks, or in ESM/expressions) is now
17+
marked as being the correct language, which makes comments and such
18+
work.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
*.d.ts
2+
*.d.mts
23
*.log
34
*.tgz
45
*.tsbuildinfo

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"packages/*"
77
],
88
"scripts": {
9+
"generate": "npm --workspace vscode-mdx run generate",
910
"build": "npm --workspaces run build",
1011
"format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix",
1112
"start": "npm --workspace @mdx-js/monaco-demo run start",

packages/language-server/tsconfig.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
2+
"include": ["**/**.js"],
3+
"exclude": ["coverage/", "node_modules/"],
24
"compilerOptions": {
35
"checkJs": true,
46
"module": "node16",

packages/language-service/tsconfig.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
2+
"include": ["**/**.js"],
3+
"exclude": ["coverage/", "node_modules/"],
24
"compilerOptions": {
35
"checkJs": true,
46
"declaration": true,

packages/monaco/tsconfig.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
2+
"include": ["**/**.js"],
3+
"exclude": ["coverage/", "node_modules/"],
24
"compilerOptions": {
35
"checkJs": true,
46
"declaration": true,

packages/vscode-mdx/.vscodeignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ demo/
88
fixtures/
99
node_modules/
1010
packages/
11+
script/

packages/vscode-mdx/package.json

Lines changed: 45 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,17 @@
4242
"build": "esbuild extension=./src/extension.js language-server=@mdx-js/language-server --bundle --platform=node --target=node16 --external:vscode --outdir=out",
4343
"build:debug": "npm run copy-libs && npm run build -- --sourcemap",
4444
"copy-libs": "cpy '../../node_modules/typescript/lib/lib.*.d.ts' out/",
45+
"generate": "node --conditions development ./script/build.mjs",
4546
"vscode:prepublish": "npm run copy-libs && npm run build -- --minify"
4647
},
4748
"devDependencies": {
49+
"@types/node": "^18.0.0",
4850
"@types/vscode": "^1.0.0",
4951
"@vscode/vsce": "^2.0.0",
5052
"cpy-cli": "^4.0.0",
5153
"esbuild": "^0.16.0",
5254
"ovsx": "^0.8.0",
55+
"undici": "^5.0.0",
5356
"vscode-languageclient": "^8.0.0"
5457
},
5558
"contributes": {
@@ -86,55 +89,49 @@
8689
"grammars": [
8790
{
8891
"language": "mdx",
89-
"scopeName": "text.html.markdown.jsx",
90-
"path": "./syntaxes/mdx.tmLanguage.json",
92+
"scopeName": "source.mdx",
93+
"path": "./syntaxes/source.mdx.tmLanguage",
94+
"#1": "note: the below list maps TextMate scopes to VS Code Language IDs (<https://code.visualstudio.com/docs/languages/identifiers>), which does not affect syntax highlighting, but affects for example how comments work.",
95+
"#2": "note: `graphql`, `kotlin`, `toml` have no names in that list, but do work with the most popular extension.",
96+
"#3": "note: we map to JSX-enabled flavors of `js` and `ts`",
97+
"#4": "note: I have no clue how to test `vbnet` (visual basic), I cannot find extensions",
9198
"embeddedLanguages": {
92-
"source.js": "javascript",
93-
"source.js.jsx": "javascriptreact",
94-
"meta.tag.js": "jsx-tags",
95-
"meta.tag.without-attributes.js": "jsx-tags",
96-
"meta.embedded.block.frontmatter": "yaml",
97-
"meta.embedded.block.css": "css",
98-
"meta.embedded.block.ini": "ini",
99-
"meta.embedded.block.java": "java",
100-
"meta.embedded.block.lua": "lua",
101-
"meta.embedded.block.makefile": "makefile",
102-
"meta.embedded.block.perl": "perl",
103-
"meta.embedded.block.r": "r",
104-
"meta.embedded.block.ruby": "ruby",
105-
"meta.embedded.block.php": "php",
106-
"meta.embedded.block.sql": "sql",
107-
"meta.embedded.block.vs_net": "vs_net",
108-
"meta.embedded.block.html": "html",
109-
"meta.embedded.block.xml": "xml",
110-
"meta.embedded.block.xsl": "xsl",
111-
"meta.embedded.block.yaml": "yaml",
112-
"meta.embedded.block.dosbatch": "dosbatch",
113-
"meta.embedded.block.clojure": "clojure",
114-
"meta.embedded.block.coffee": "coffee",
115-
"meta.embedded.block.c": "c",
116-
"meta.embedded.block.cpp": "cpp",
117-
"meta.embedded.block.diff": "diff",
118-
"meta.embedded.block.dockerfile": "dockerfile",
119-
"meta.embedded.block.go": "go",
120-
"meta.embedded.block.groovy": "groovy",
121-
"meta.embedded.block.pug": "jade",
122-
"meta.embedded.block.javascript": "javascript",
123-
"meta.embedded.block.javascriptreact": "javascriptreact",
124-
"meta.embedded.block.json": "json",
125-
"meta.embedded.block.less": "less",
126-
"meta.embedded.block.objc": "objc",
127-
"meta.embedded.block.scss": "scss",
128-
"meta.embedded.block.perl6": "perl6",
129-
"meta.embedded.block.powershell": "powershell",
130-
"meta.embedded.block.python": "python",
131-
"meta.embedded.block.rust": "rust",
132-
"meta.embedded.block.scala": "scala",
133-
"meta.embedded.block.shellscript": "shellscript",
134-
"meta.embedded.block.typescript": "typescript",
135-
"meta.embedded.block.typescriptreact": "typescriptreact",
136-
"meta.embedded.block.csharp": "csharp",
137-
"meta.embedded.block.fsharp": "fsharp"
99+
"meta.embedded.c": "c",
100+
"meta.embedded.cpp": "cpp",
101+
"meta.embedded.cs": "csharp",
102+
"meta.embedded.css": "css",
103+
"meta.embedded.diff": "diff",
104+
"meta.embedded.go": "go",
105+
"meta.embedded.graphql": "graphql",
106+
"meta.embedded.html": "html",
107+
"meta.embedded.ini": "ini",
108+
"meta.embedded.java": "java",
109+
"meta.embedded.js": "javascriptreact",
110+
"meta.embedded.json": "json",
111+
"meta.embedded.kotlin": "kotlin",
112+
"meta.embedded.less": "less",
113+
"meta.embedded.lua": "lua",
114+
"meta.embedded.makefile": "makefile",
115+
"meta.embedded.md": "markdown",
116+
"meta.embedded.mdx": "mdx",
117+
"meta.embedded.objc": "objective-c",
118+
"meta.embedded.perl": "perl",
119+
"meta.embedded.php": "php",
120+
"meta.embedded.python": "python",
121+
"meta.embedded.r": "r",
122+
"meta.embedded.ruby": "ruby",
123+
"meta.embedded.rust": "rust",
124+
"meta.embedded.scss": "scss",
125+
"meta.embedded.shell": "shellscript",
126+
"meta.embedded.sql": "sql",
127+
"meta.embedded.svg": "xml",
128+
"meta.embedded.swift": "swift",
129+
"meta.embedded.toml": "toml",
130+
"meta.embedded.ts": "typescriptreact",
131+
"meta.embedded.tsx": "typescriptreact",
132+
"meta.embedded.vbnet": "vb",
133+
"meta.embedded.xml": "xml",
134+
"meta.embedded.yaml": "yaml"
138135
}
139136
}
140137
]
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env node
2+
import assert from 'node:assert/strict'
3+
import fs from 'node:fs/promises'
4+
import {fetch} from 'undici'
5+
6+
const repo = 'wooorm/markdown-tm-language'
7+
const branch = 'main'
8+
const filename = 'source.mdx.tmLanguage'
9+
10+
const branchesResponse = await fetch(
11+
`https://api.github.com/repos/${repo}/branches`
12+
)
13+
14+
const branches =
15+
/** @type {Array<{name: string, commit: {sha: string, url: string}, protected: boolean}>} */ (
16+
await branchesResponse.json()
17+
)
18+
const main = branches.find((d) => d.name === branch)
19+
assert(main, 'expected `' + branch + '` branch')
20+
21+
const sha = main.commit.sha
22+
23+
const blobResponse = await fetch(
24+
`https://raw.githubusercontent.com/${repo}/${branch}/${filename}`
25+
)
26+
let blob = await blobResponse.text()
27+
28+
let injected = false
29+
30+
blob = blob.replace(/<dict>/, ($0) => {
31+
injected = true
32+
return `<!--
33+
This file is maintained at <https://github.com/${repo}/blob/${branch}/${filename}>.
34+
To improve it, please create a pull request to the original repository.
35+
Once accepted there, it can be pulled into this project (\`vscode-mdx\`) with
36+
\`script/build.js\`, and released.
37+
38+
Version from SHA: ${sha}.
39+
-->
40+
${$0}`
41+
})
42+
43+
assert(injected, 'expected to find a dict')
44+
45+
await fs.writeFile(
46+
new URL('../syntaxes/source.mdx.tmLanguage', import.meta.url),
47+
blob
48+
)
49+
50+
console.log('Wrote `source.mdx.tmLanguage` at `' + sha + '`')

packages/vscode-mdx/syntaxes/mdx.tmLanguage.json

Lines changed: 0 additions & 83 deletions
This file was deleted.

0 commit comments

Comments
 (0)