diff --git a/src/basic-languages/mdx/mdx.contribution.ts b/src/basic-languages/mdx/mdx.contribution.ts new file mode 100644 index 00000000..c435bfcf --- /dev/null +++ b/src/basic-languages/mdx/mdx.contribution.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { registerLanguage } from '../_.contribution'; + +declare var AMD: any; +declare var require: any; + +registerLanguage({ + id: 'mdx', + extensions: ['.mdx'], + aliases: ['MDX', 'mdx'], + loader: () => { + if (AMD) { + return new Promise((resolve, reject) => { + require(['vs/basic-languages/mdx/mdx'], resolve, reject); + }); + } else { + return import('./mdx'); + } + } +}); diff --git a/src/basic-languages/mdx/mdx.test.ts b/src/basic-languages/mdx/mdx.test.ts new file mode 100644 index 00000000..7e64f0a2 --- /dev/null +++ b/src/basic-languages/mdx/mdx.test.ts @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { testTokenization } from '../test/testRunner'; + +testTokenization('mdx', []); diff --git a/src/basic-languages/mdx/mdx.ts b/src/basic-languages/mdx/mdx.ts new file mode 100644 index 00000000..d87e5244 --- /dev/null +++ b/src/basic-languages/mdx/mdx.ts @@ -0,0 +1,65 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { languages } from '../../fillers/monaco-editor-core'; + +export const conf: languages.LanguageConfiguration = { + comments: { + blockComment: ['{/*', '*/}'] + } +}; + +export const language = { + defaultToken: '', + tokenPostfix: '.mdx', + escapes: /\\(?:["'\\abfnrtv]|x[\dA-Fa-f]{1,4}|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/, + bracket_open: ['{'], + single_quote: ["'"], + double_quote: ['"'], + tokenizer: { + root: [ + [/^\s*import/, { token: 'keyword', next: '@import', nextEmbedded: 'js' }], + [/<\w+/, { token: 'keyword', next: '@jsx' }], + [/<\/?\w+>/, { token: 'keyword' }], + [/\*\*.+\*\*/, 'strong'], + [/{/, { token: 'delimiter.bracket', nextEmbedded: 'js' }], + { include: 'expression' } + ], + import: [[/'\s*(;|$)/, { token: 'string', next: '@pop', nextEmbedded: '@pop' }]], + expression: [[/}/, { token: 'delimiter.bracket', nextEmbedded: '@pop' }]], + jsx: [ + [/\w+=/, { token: 'delimiter.bracket', next: '@jsx_expression' }], + [/\/?>/, { token: 'keyword', next: '@pop' }] + ], + jsx_expression: [ + [ + /["'{]/, + { + cases: { + '@bracket_open': { + token: 'delimiter.bracket', + next: '@expression', + nextEmbedded: 'js' + }, + '@double_quote': { token: 'string', next: '@string_double' }, + '@single_quote': { token: 'string', next: '@string_single' } + } + } + ] + ], + string_double: [ + [/[^"\\]+/, 'string'], + [/@escapes/, 'string.escape'], + [/\\./, 'string.escape.invalid'], + [/"/, 'string', '@pop'] + ], + string_single: [ + [/[^'\\]+/, 'string'], + [/@escapes/, 'string.escape'], + [/\\./, 'string.escape.invalid'], + [/'/, 'string', '@pop'] + ] + } +};