clone

a browser-first diagram editor with live svg previews, local drafts and encrypted, accountless sharing

main
diagramzip / apps / editor / src / editors / monaco-languages.js
monaco-languages.js 3.7K
1import 'monaco-editor/languages/definitions/clojure/register.js'2import 'monaco-editor/languages/definitions/sql/register.js'3import 'monaco-editor/languages/definitions/xml/register.js'4import 'monaco-editor/languages/definitions/yaml/register.js'5import { jsonDefaults } from 'monaco-editor/language/json/monaco.contribution.js'6import {7 DETAILS_DOCUMENT_SCHEMA,8 DETAILS_MODEL_URI,9 DETAILS_SCHEMA_URI,10} from '../details-document.js'11import { GENERIC_LANGUAGE_ID, JSON5_LANGUAGE_ID } from '../editor-languages.js'1213const keywords = [14 'actor', 'alt', 'and', 'as', 'class', 'component', 'database', 'direction', 'else', 'end',15 'endnote', 'endif', 'endwhile', 'flowchart', 'graph', 'group', 'if', 'interface', 'loop',16 'namespace', 'node', 'note', 'package', 'participant', 'rectangle', 'return', 'skinparam',17 'start', 'state', 'stop', 'subgraph', 'then', 'title', 'while',18]1920let registered = false2122export function registerMonacoLanguages(monaco) {23 if (registered) return24 registered = true2526 jsonDefaults.setDiagnosticsOptions({27 validate: true,28 allowComments: false,29 schemas: [{30 uri: DETAILS_SCHEMA_URI,31 fileMatch: [DETAILS_MODEL_URI],32 schema: DETAILS_DOCUMENT_SCHEMA,33 }],34 enableSchemaRequest: false,35 schemaRequest: 'ignore',36 schemaValidation: 'error',37 comments: 'error',38 trailingCommas: 'error',39 })4041 monaco.languages.register({ id: GENERIC_LANGUAGE_ID })42 monaco.languages.setMonarchTokensProvider(GENERIC_LANGUAGE_ID, {43 defaultToken: '',44 ignoreCase: true,45 keywords,46 tokenizer: {47 root: [48 [/\/\*/, 'comment', '@blockComment'],49 [/^\s*(?:%%|\/\/|'|#).*$/, 'comment'],50 [/@(?:start|end)[a-z0-9_]*/i, 'keyword'],51 [/"/, 'string', '@doubleQuotedString'],52 [/(?:--?>|<--?|==>|<==|\.\.>|<\.\.|->|<-|=>|<=|--|\.\.)/, 'operator'],53 [/#[0-9a-f]{3,8}\b/i, 'number.hex'],54 [/\b\d+(?:\.\d+)?\b/, 'number'],55 [/[a-z_][\w-]*/i, { cases: { '@keywords': 'keyword', '@default': 'identifier' } }],56 ],57 blockComment: [58 [/[^/*]+/, 'comment'],59 [/\*\//, 'comment', '@pop'],60 [/[/*]/, 'comment'],61 ],62 doubleQuotedString: [63 [/[^\\"]+/, 'string'],64 [/\\./, 'string.escape'],65 [/"/, 'string', '@pop'],66 ],67 },68 })6970 monaco.languages.register({ id: JSON5_LANGUAGE_ID })71 monaco.languages.setLanguageConfiguration(JSON5_LANGUAGE_ID, {72 comments: { lineComment: '//', blockComment: ['/*', '*/'] },73 brackets: [['{', '}'], ['[', ']'], ['(', ')']],74 autoClosingPairs: [75 { open: '{', close: '}' },76 { open: '[', close: ']' },77 { open: '(', close: ')' },78 { open: '"', close: '"', notIn: ['string', 'comment'] },79 { open: "'", close: "'", notIn: ['string', 'comment'] },80 ],81 })82 monaco.languages.setMonarchTokensProvider(JSON5_LANGUAGE_ID, {83 defaultToken: '',84 keywords: ['true', 'false', 'null', 'Infinity', 'NaN'],85 tokenizer: {86 root: [87 [/\/\*/, 'comment', '@blockComment'],88 [/\/\/.*$/, 'comment'],89 [/"/, 'string', '@doubleQuotedString'],90 [/'/, 'string', '@singleQuotedString'],91 [/-?0[xX][0-9a-fA-F]+/, 'number.hex'],92 [/-?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/, 'number'],93 [/[a-z_$][\w$-]*/i, { cases: { '@keywords': 'keyword', '@default': 'key' } }],94 [/[{}\[\](),.:]/, 'delimiter'],95 ],96 blockComment: [97 [/[^/*]+/, 'comment'],98 [/\*\//, 'comment', '@pop'],99 [/[/*]/, 'comment'],100 ],101 doubleQuotedString: [102 [/[^\\"]+/, 'string'],103 [/\\./, 'string.escape'],104 [/"/, 'string', '@pop'],105 ],106 singleQuotedString: [107 [/[^\\']+/, 'string'],108 [/\\./, 'string.escape'],109 [/'/, 'string', '@pop'],110 ],111 },112 })113}