1 import {StreamLanguage} from '@codemirror/language';
3 import {css} from '@codemirror/lang-css';
4 import {json} from '@codemirror/lang-json';
5 import {javascript} from '@codemirror/lang-javascript';
6 import {html} from '@codemirror/lang-html';
7 import {markdown} from '@codemirror/lang-markdown';
8 import {php} from '@codemirror/lang-php';
9 import {twig} from '@ssddanbrown/codemirror-lang-twig';
10 import {xml} from '@codemirror/lang-xml';
12 const legacyLoad = async mode => {
13 const modes = await window.importVersioned('legacy-modes');
14 return StreamLanguage.define(modes[mode]);
17 // Mapping of possible languages or formats from user input to their codemirror modes.
18 // Value can be a mode string or a function that will receive the code content & return the mode string.
19 // The function option is used in the event the exact mode could be dynamic depending on the code.
21 bash: () => legacyLoad('shell'),
22 c: () => legacyLoad('c'),
23 css: async () => css(),
24 'c++': () => legacyLoad('cpp'),
25 'c#': () => legacyLoad('csharp'),
26 csharp: () => legacyLoad('csharp'),
27 dart: () => legacyLoad('dart'),
28 diff: () => legacyLoad('diff'),
29 for: () => legacyLoad('fortran'),
30 fortran: () => legacyLoad('fortran'),
31 'f#': () => legacyLoad('fSharp'),
32 fsharp: () => legacyLoad('fSharp'),
33 go: () => legacyLoad('go'),
34 haskell: () => legacyLoad('haskell'),
35 hs: () => legacyLoad('haskell'),
36 html: async () => html(),
37 ini: () => legacyLoad('properties'),
38 java: () => legacyLoad('java'),
39 javascript: async () => javascript(),
40 json: async () => json(),
41 js: async () => javascript(),
42 jl: () => legacyLoad('julia'),
43 julia: () => legacyLoad('julia'),
44 kotlin: () => legacyLoad('kotlin'),
45 latex: () => legacyLoad('stex'),
46 lua: () => legacyLoad('lua'),
47 markdown: async () => markdown(),
48 matlab: () => legacyLoad('octave'),
49 md: async () => markdown(),
50 mdown: async () => markdown(),
51 ml: () => legacyLoad('sml'),
52 mssql: () => legacyLoad('msSQL'),
53 mysql: () => legacyLoad('mySQL'),
54 nginx: () => legacyLoad('nginx'),
55 octave: () => legacyLoad('octave'),
56 pas: () => legacyLoad('pascal'),
57 pascal: () => legacyLoad('pascal'),
58 perl: () => legacyLoad('perl'),
59 pgsql: () => legacyLoad('pgSQL'),
61 const hasTags = code.includes('<?php');
62 return php({plain: !hasTags});
64 pl: () => legacyLoad('perl'),
65 'pl/sql': () => legacyLoad('plSQL'),
66 postgresql: () => legacyLoad('pgSQL'),
67 powershell: () => legacyLoad('powerShell'),
68 properties: () => legacyLoad('properties'),
69 ocaml: () => legacyLoad('oCaml'),
70 py: () => legacyLoad('python'),
71 python: () => legacyLoad('python'),
72 rb: () => legacyLoad('ruby'),
73 rs: () => legacyLoad('rust'),
74 ruby: () => legacyLoad('ruby'),
75 rust: () => legacyLoad('rust'),
76 scala: () => legacyLoad('scala'),
77 scheme: () => legacyLoad('scheme'),
78 shell: () => legacyLoad('shell'),
79 sh: () => legacyLoad('shell'),
80 smarty: () => legacyLoad('smarty'),
81 stext: () => legacyLoad('stex'),
82 swift: () => legacyLoad('swift'),
83 toml: () => legacyLoad('toml'),
84 ts: async () => javascript({typescript: true}),
85 twig: async () => twig(),
86 typescript: async () => javascript({typescript: true}),
87 sql: () => legacyLoad('standardSQL'),
88 sqlite: () => legacyLoad('sqlite'),
89 vbs: () => legacyLoad('vbScript'),
90 vbscript: () => legacyLoad('vbScript'),
91 'vb.net': () => legacyLoad('vb'),
92 vbnet: () => legacyLoad('vb'),
93 xml: async () => xml(),
94 yaml: () => legacyLoad('yaml'),
95 yml: () => legacyLoad('yaml'),
99 * Get the relevant codemirror language extension based upon the given language
100 * suggestion and content.
101 * @param {String} langSuggestion
102 * @param {String} content
103 * @returns {Promise<StreamLanguage|LanguageSupport>}
105 export function getLanguageExtension(langSuggestion, content) {
106 const suggestion = langSuggestion.trim().replace(/^\./g, '').toLowerCase();
108 const language = modeMap[suggestion];
110 if (typeof language === 'undefined') {
114 return language(content);